2005-07-24 14:12:37 +00:00
/* $Id$ */
2009-08-21 20:21:05 +00:00
/*
* This file is part of OpenTTD .
* OpenTTD is free software ; you can redistribute it and / or modify it under the terms of the GNU General Public License as published by the Free Software Foundation , version 2.
* OpenTTD is distributed in the hope that it will be useful , but WITHOUT ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE .
* See the GNU General Public License for more details . You should have received a copy of the GNU General Public License along with OpenTTD . If not , see < http : //www.gnu.org/licenses/>.
*/
2008-05-06 15:11:33 +00:00
/** @file console_cmds.cpp Implementation of the console hooks. */
2007-02-23 11:50:43 +00:00
2004-09-12 21:49:38 +00:00
# include "stdafx.h"
2008-05-24 10:15:06 +00:00
# include "console_internal.h"
2012-01-03 21:47:01 +00:00
# include "debug.h"
2008-03-31 00:17:39 +00:00
# include "engine_func.h"
2007-04-12 13:07:15 +00:00
# include "landscape.h"
2009-01-04 15:32:25 +00:00
# include "saveload/saveload.h"
2012-01-03 21:47:01 +00:00
# include "network/network.h"
# include "network/network_func.h"
2008-12-23 11:06:52 +00:00
# include "network/network_base.h"
2010-10-17 17:41:52 +00:00
# include "network/network_admin.h"
2011-02-11 22:10:10 +00:00
# include "network/network_client.h"
2007-12-21 21:50:46 +00:00
# include "command_func.h"
2008-01-07 00:19:09 +00:00
# include "settings_func.h"
2006-08-05 00:59:45 +00:00
# include "fios.h"
2008-08-31 10:50:05 +00:00
# include "fileio_func.h"
2006-07-28 21:51:00 +00:00
# include "screenshot.h"
(svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
- New optional landscape generator (TerraGenesis Perlin)
- Load heightmaps (either BMP or PNG)
- Progress dialog while generating worlds (no longer a 'hanging' screen)
- New dialogs for NewGame, Create Scenario and Play Heightmap
- Easier to configure your landscape
- More things to configure (tree-placer, ..)
- Speedup of world generation
- New console command 'restart': restart the map EXACTLY as it was when you
first started it (needs a game made after or with this commit)
- New console command 'getseed': get the seed of your map and share it with
others (of course only works with generated maps)
- Many new, world generation related, things
- Many internal cleanups and rewrites
Many tnx to those people who helped making this:
Belugas, DaleStan, glx, KUDr, RichK67, Rubidium, and TrueLight (alfabetic)
Many tnx to those who helped testing:
Arnau, Bjarni, and tokai (alfabetic)
And to all other people who helped testing and sending comments / bugs
Stats: 673 lines changed, 3534 new lines, 79 new strings
2006-08-19 10:00:30 +00:00
# include "genworld.h"
2007-12-21 19:49:27 +00:00
# include "strings_func.h"
2008-01-09 09:57:48 +00:00
# include "viewport_func.h"
2007-12-25 11:26:07 +00:00
# include "window_func.h"
2007-12-26 13:50:40 +00:00
# include "date_func.h"
2008-09-30 20:51:04 +00:00
# include "company_func.h"
2008-06-03 18:35:58 +00:00
# include "gamelog.h"
2009-01-12 17:11:45 +00:00
# include "ai/ai.hpp"
# include "ai/ai_config.hpp"
2010-03-24 20:47:03 +00:00
# include "newgrf.h"
2010-01-15 16:41:15 +00:00
# include "console_func.h"
2011-02-05 16:07:23 +00:00
# include "engine_base.h"
2011-12-19 20:55:56 +00:00
# include "game/game.hpp"
2012-12-09 16:53:41 +00:00
# include "table/strings.h"
2008-01-13 01:21:35 +00:00
2009-03-15 00:32:18 +00:00
/* scriptfile handling */
2010-06-26 15:22:10 +00:00
static bool _script_running ; ///< Script is running (used to abort execution when #ConReturn is encountered).
2004-09-14 16:10:20 +00:00
2010-02-10 17:32:39 +00:00
/* console command defines */
2005-05-02 15:52:19 +00:00
# define DEF_CONSOLE_CMD(function) static bool function(byte argc, char *argv[])
2010-03-24 20:43:31 +00:00
# define DEF_CONSOLE_HOOK(function) static ConsoleHookResult function(bool echo)
2004-09-12 21:49:38 +00:00
2004-09-14 16:10:20 +00:00
2010-02-10 17:32:39 +00:00
/****************
* command hooks
* * * * * * * * * * * * * * * */
2004-09-12 21:49:38 +00:00
2004-12-04 17:54:56 +00:00
# ifdef ENABLE_NETWORK
2011-02-14 19:52:26 +00:00
/**
* Check network availability and inform in console about failure of detection .
* @ return Network availability .
*/
2010-03-24 20:43:31 +00:00
static inline bool NetworkAvailable ( bool echo )
2004-09-12 21:49:38 +00:00
{
2005-05-02 15:52:19 +00:00
if ( ! _network_available ) {
2010-03-24 20:43:31 +00:00
if ( echo ) IConsoleError ( " You cannot use this command because there is no network available. " ) ;
2004-09-12 21:49:38 +00:00
return false ;
2004-09-19 15:24:45 +00:00
}
2004-09-12 21:49:38 +00:00
return true ;
}
2011-02-14 19:52:26 +00:00
/**
* Check whether we are a server .
* @ return Are we a server ? True when yes , false otherwise .
*/
2005-05-02 15:52:19 +00:00
DEF_CONSOLE_HOOK ( ConHookServerOnly )
2004-09-12 21:49:38 +00:00
{
2010-03-24 20:43:31 +00:00
if ( ! NetworkAvailable ( echo ) ) return CHR_DISALLOW ;
2005-05-02 15:52:19 +00:00
2004-12-04 17:54:56 +00:00
if ( ! _network_server ) {
2010-03-24 20:43:31 +00:00
if ( echo ) IConsoleError ( " This command is only available to a network server. " ) ;
return CHR_DISALLOW ;
2004-09-19 15:24:45 +00:00
}
2010-03-24 20:43:31 +00:00
return CHR_ALLOW ;
2004-09-12 21:49:38 +00:00
}
2011-02-14 19:52:26 +00:00
/**
* Check whether we are a client in a network game .
* @ return Are we a client in a network game ? True when yes , false otherwise .
*/
2005-05-02 15:52:19 +00:00
DEF_CONSOLE_HOOK ( ConHookClientOnly )
2004-09-12 21:49:38 +00:00
{
2010-03-24 20:43:31 +00:00
if ( ! NetworkAvailable ( echo ) ) return CHR_DISALLOW ;
2005-05-02 15:52:19 +00:00
if ( _network_server ) {
2010-03-24 20:43:31 +00:00
if ( echo ) IConsoleError ( " This command is not available to a network server. " ) ;
return CHR_DISALLOW ;
2004-12-04 17:54:56 +00:00
}
2010-03-24 20:43:31 +00:00
return CHR_ALLOW ;
2004-12-04 17:54:56 +00:00
}
2011-02-14 19:52:26 +00:00
/**
* Check whether we are in a multiplayer game .
* @ return True when we are client or server in a network game .
*/
2005-05-02 15:52:19 +00:00
DEF_CONSOLE_HOOK ( ConHookNeedNetwork )
2004-12-04 17:54:56 +00:00
{
2010-03-24 20:43:31 +00:00
if ( ! NetworkAvailable ( echo ) ) return CHR_DISALLOW ;
2005-05-02 15:52:19 +00:00
2011-02-11 22:10:10 +00:00
if ( ! _networking | | ( ! _network_server & & ! MyClient : : IsConnected ( ) ) ) {
2010-03-24 20:43:31 +00:00
if ( echo ) IConsoleError ( " Not connected. This command is only available in multiplayer. " ) ;
return CHR_DISALLOW ;
2004-09-19 15:24:45 +00:00
}
2010-03-24 20:43:31 +00:00
return CHR_ALLOW ;
2004-09-12 21:49:38 +00:00
}
2011-02-14 19:52:26 +00:00
/**
* Check whether we are in single player mode .
* @ return True when no network is active .
*/
2005-05-02 15:52:19 +00:00
DEF_CONSOLE_HOOK ( ConHookNoNetwork )
2004-12-04 17:54:56 +00:00
{
2005-05-02 15:52:19 +00:00
if ( _networking ) {
2010-03-24 20:43:31 +00:00
if ( echo ) IConsoleError ( " This command is forbidden in multiplayer. " ) ;
return CHR_DISALLOW ;
2004-12-04 17:54:56 +00:00
}
2010-03-24 20:43:31 +00:00
return CHR_ALLOW ;
2004-12-04 17:54:56 +00:00
}
2010-02-10 18:18:08 +00:00
# else
# define ConHookNoNetwork NULL
2004-12-04 17:54:56 +00:00
# endif /* ENABLE_NETWORK */
2010-03-24 20:47:03 +00:00
DEF_CONSOLE_HOOK ( ConHookNewGRFDeveloperTool )
{
if ( _settings_client . gui . newgrf_developer_tools ) {
if ( _game_mode = = GM_MENU ) {
if ( echo ) IConsoleError ( " This command is only available in game and editor. " ) ;
return CHR_DISALLOW ;
}
# ifdef ENABLE_NETWORK
return ConHookNoNetwork ( echo ) ;
# else
return CHR_ALLOW ;
# endif
}
return CHR_HIDE ;
}
2011-02-14 19:52:26 +00:00
/**
* Show help for the console .
* @ param str String to print in the console .
*/
2005-05-02 15:52:19 +00:00
static void IConsoleHelp ( const char * str )
{
2008-05-24 10:35:15 +00:00
IConsolePrintF ( CC_WARNING , " - %s " , str ) ;
2005-05-02 15:52:19 +00:00
}
2004-09-12 21:49:38 +00:00
2011-02-14 19:52:26 +00:00
/**
* Reset status of all engines .
* @ return Will always succeed .
*/
2004-09-12 21:49:38 +00:00
DEF_CONSOLE_CMD ( ConResetEngines )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
IConsoleHelp ( " Reset status data of all engines. This might solve some issues with 'lost' engines. Usage: 'resetengines' " ) ;
return true ;
}
2004-09-12 21:49:38 +00:00
StartupEngines ( ) ;
2005-05-02 15:52:19 +00:00
return true ;
2004-09-12 21:49:38 +00:00
}
2011-02-14 19:52:26 +00:00
/**
* Reset status of the engine pool .
* @ return Will always return true .
* @ note Resetting the pool only succeeds when there are no vehicles ingame .
*/
2011-02-05 16:07:23 +00:00
DEF_CONSOLE_CMD ( ConResetEnginePool )
{
if ( argc = = 0 ) {
IConsoleHelp ( " Reset NewGRF allocations of engine slots. This will remove invalid engine definitions, and might make default engines available again. " ) ;
return true ;
}
if ( _game_mode = = GM_MENU ) {
IConsoleError ( " This command is only available in game and editor. " ) ;
return true ;
}
if ( ! EngineOverrideManager : : ResetToCurrentNewGRFConfig ( ) ) {
IConsoleError ( " This can only be done when there are no vehicles in the game. " ) ;
return true ;
}
return true ;
}
2004-09-19 15:24:45 +00:00
# ifdef _DEBUG
2011-02-14 19:52:26 +00:00
/**
* Reset a tile to bare land in debug mode .
* param tile number .
* @ return True when the tile is reset or the help on usage was printed ( 0 or two parameters ) .
*/
2004-09-12 21:49:38 +00:00
DEF_CONSOLE_CMD ( ConResetTile )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
IConsoleHelp ( " Reset a tile to bare land. Usage: 'resettile <tile>' " ) ;
IConsoleHelp ( " Tile can be either decimal (34161) or hexadecimal (0x4a5B) " ) ;
return true ;
}
2004-09-12 21:49:38 +00:00
if ( argc = = 2 ) {
2005-05-02 15:52:19 +00:00
uint32 result ;
if ( GetArgumentInteger ( & result , argv [ 1 ] ) ) {
DoClearSquare ( ( TileIndex ) result ) ;
return true ;
}
2004-09-12 21:49:38 +00:00
}
2005-05-02 15:52:19 +00:00
return false ;
2004-09-12 21:49:38 +00:00
}
2005-05-02 16:00:49 +00:00
# endif /* _DEBUG */
2004-09-12 21:49:38 +00:00
2011-02-14 19:52:26 +00:00
/**
* Scroll to a tile on the map .
* @ param arg1 tile tile number or tile x coordinate .
* @ param arg2 optionally tile y coordinate .
* @ note When only one argument is given it is intepreted as the tile number .
* When two arguments are given , they are interpreted as the tile ' s x
* and y coordinates .
* @ return True when either console help was shown or a proper amount of parameters given .
*/
2004-09-12 21:49:38 +00:00
DEF_CONSOLE_CMD ( ConScrollToTile )
{
2009-05-26 13:16:58 +00:00
switch ( argc ) {
case 0 :
IConsoleHelp ( " Center the screen on a given tile. " ) ;
IConsoleHelp ( " Usage: 'scrollto <tile>' or 'scrollto <x> <y>' " ) ;
IConsoleHelp ( " Numbers can be either decimal (34161) or hexadecimal (0x4a5B). " ) ;
return true ;
2005-05-02 15:52:19 +00:00
2009-05-26 13:16:58 +00:00
case 2 : {
uint32 result ;
if ( GetArgumentInteger ( & result , argv [ 1 ] ) ) {
if ( result > = MapSize ( ) ) {
IConsolePrint ( CC_ERROR , " Tile does not exist " ) ;
return true ;
}
ScrollMainWindowToTile ( ( TileIndex ) result ) ;
2006-09-09 22:15:19 +00:00
return true ;
}
2009-05-26 13:16:58 +00:00
break ;
}
case 3 : {
uint32 x , y ;
if ( GetArgumentInteger ( & x , argv [ 1 ] ) & & GetArgumentInteger ( & y , argv [ 2 ] ) ) {
if ( x > = MapSizeX ( ) | | y > = MapSizeY ( ) ) {
IConsolePrint ( CC_ERROR , " Tile does not exist " ) ;
return true ;
}
ScrollMainWindowToTile ( TileXY ( x , y ) ) ;
return true ;
}
break ;
2005-05-02 15:52:19 +00:00
}
2004-09-12 21:49:38 +00:00
}
2005-05-02 15:52:19 +00:00
return false ;
2004-09-12 21:49:38 +00:00
}
2011-02-14 19:52:26 +00:00
/**
* Save the map to a file .
* @ param filename the filename to save the map to .
* @ return True when help was displayed or the file attempted to be saved .
*/
2005-03-25 18:26:49 +00:00
DEF_CONSOLE_CMD ( ConSave )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
IConsoleHelp ( " Save the current game. Usage: 'save <filename>' " ) ;
return true ;
}
2005-03-25 18:26:49 +00:00
if ( argc = = 2 ) {
2007-06-17 15:48:57 +00:00
char * filename = str_fmt ( " %s.sav " , argv [ 1 ] ) ;
2008-05-24 10:35:15 +00:00
IConsolePrint ( CC_DEFAULT , " Saving map... " ) ;
2005-05-02 15:52:19 +00:00
2007-06-17 15:48:57 +00:00
if ( SaveOrLoad ( filename , SL_SAVE , SAVE_DIR ) ! = SL_OK ) {
2008-05-24 10:35:15 +00:00
IConsolePrint ( CC_ERROR , " Saving map failed " ) ;
2006-06-27 21:25:53 +00:00
} else {
2010-02-01 12:29:49 +00:00
IConsolePrintF ( CC_DEFAULT , " Map successfully saved to %s " , filename ) ;
2006-06-27 21:25:53 +00:00
}
2007-06-17 15:48:57 +00:00
free ( filename ) ;
2005-05-02 15:52:19 +00:00
return true ;
2005-03-25 18:26:49 +00:00
}
2005-05-02 15:52:19 +00:00
return false ;
2005-03-25 18:26:49 +00:00
}
2011-02-14 19:52:26 +00:00
/**
* Explicitly save the configuration .
* @ return True .
*/
2007-01-03 18:06:50 +00:00
DEF_CONSOLE_CMD ( ConSaveConfig )
{
if ( argc = = 0 ) {
2010-07-15 20:43:47 +00:00
IConsoleHelp ( " Saves the configuration for new games to the configuration file, typically 'openttd.cfg'. " ) ;
IConsoleHelp ( " It does not save the configuration of the current game to the configuration file. " ) ;
2007-01-03 18:06:50 +00:00
return true ;
}
SaveToConfig ( ) ;
2008-05-24 10:35:15 +00:00
IConsolePrint ( CC_DEFAULT , " Saved config. " ) ;
2007-01-03 18:06:50 +00:00
return true ;
}
2011-02-14 19:52:26 +00:00
/**
* Get savegame file informations .
* @ param file The savegame filename to return information about . Can be the actual name
* or a numbered entry into the filename list .
* @ return FiosItem The information on the file .
*/
2009-01-10 00:31:47 +00:00
static const FiosItem * GetFiosItem ( const char * file )
2005-01-04 15:06:08 +00:00
{
2005-05-13 17:05:03 +00:00
_saveload_mode = SLD_LOAD_GAME ;
2005-03-27 12:48:25 +00:00
BuildFileList ( ) ;
2005-01-04 15:06:08 +00:00
2008-06-02 14:19:27 +00:00
for ( const FiosItem * item = _fios_items . Begin ( ) ; item ! = _fios_items . End ( ) ; item + + ) {
if ( strcmp ( file , item - > name ) = = 0 ) return item ;
if ( strcmp ( file , item - > title ) = = 0 ) return item ;
2005-03-27 12:48:25 +00:00
}
2005-01-04 15:06:08 +00:00
2008-06-02 14:19:27 +00:00
/* If no name matches, try to parse it as number */
char * endptr ;
int i = strtol ( file , & endptr , 10 ) ;
if ( file = = endptr | | * endptr ! = ' \0 ' ) i = - 1 ;
2005-01-04 15:06:08 +00:00
2010-05-23 12:21:22 +00:00
if ( IsInsideMM ( i , 0 , _fios_items . Length ( ) ) ) return _fios_items . Get ( i ) ;
/* As a last effort assume it is an OpenTTD savegame and
* that the " .sav " part was not given . */
char long_file [ MAX_PATH ] ;
seprintf ( long_file , lastof ( long_file ) , " %s.sav " , file ) ;
for ( const FiosItem * item = _fios_items . Begin ( ) ; item ! = _fios_items . End ( ) ; item + + ) {
if ( strcmp ( long_file , item - > name ) = = 0 ) return item ;
if ( strcmp ( long_file , item - > title ) = = 0 ) return item ;
}
return NULL ;
2005-01-04 15:06:08 +00:00
}
2005-03-27 12:48:25 +00:00
2005-01-04 15:06:08 +00:00
DEF_CONSOLE_CMD ( ConLoad )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
2005-10-19 19:44:01 +00:00
IConsoleHelp ( " Load a game by name or index. Usage: 'load <file | number>' " ) ;
2005-05-02 15:52:19 +00:00
return true ;
2005-01-04 15:06:08 +00:00
}
2005-05-02 15:52:19 +00:00
if ( argc ! = 2 ) return false ;
2008-06-02 14:19:27 +00:00
const char * file = argv [ 1 ] ;
const FiosItem * item = GetFiosItem ( file ) ;
2005-03-27 12:48:25 +00:00
if ( item ! = NULL ) {
switch ( item - > type ) {
2005-07-17 15:58:47 +00:00
case FIOS_TYPE_FILE : case FIOS_TYPE_OLDFILE : {
2011-05-28 13:55:34 +00:00
_switch_mode = SM_LOAD_GAME ;
2005-03-27 12:48:25 +00:00
SetFiosType ( item - > type ) ;
2005-07-17 15:58:47 +00:00
2008-11-02 11:20:15 +00:00
strecpy ( _file_to_saveload . name , FiosBrowseTo ( item ) , lastof ( _file_to_saveload . name ) ) ;
strecpy ( _file_to_saveload . title , item - > title , lastof ( _file_to_saveload . title ) ) ;
2010-08-01 18:53:30 +00:00
break ;
}
2008-05-24 10:35:15 +00:00
default : IConsolePrintF ( CC_ERROR , " %s: Not a savegame. " , file ) ;
2005-03-27 12:48:25 +00:00
}
2006-06-27 21:25:53 +00:00
} else {
2008-05-24 10:35:15 +00:00
IConsolePrintF ( CC_ERROR , " %s: No such file or directory. " , file ) ;
2006-06-27 21:25:53 +00:00
}
2005-01-04 15:06:08 +00:00
FiosFreeSavegameList ( ) ;
2005-05-02 15:52:19 +00:00
return true ;
2005-01-04 15:06:08 +00:00
}
2005-09-11 14:57:56 +00:00
DEF_CONSOLE_CMD ( ConRemove )
{
if ( argc = = 0 ) {
IConsoleHelp ( " Remove a savegame by name or index. Usage: 'rm <file | number>' " ) ;
return true ;
}
if ( argc ! = 2 ) return false ;
2008-06-02 14:19:27 +00:00
const char * file = argv [ 1 ] ;
const FiosItem * item = GetFiosItem ( file ) ;
2005-09-11 14:57:56 +00:00
if ( item ! = NULL ) {
2010-07-24 10:14:39 +00:00
if ( ! FiosDelete ( item - > name ) ) {
2008-05-24 10:35:15 +00:00
IConsolePrintF ( CC_ERROR , " %s: Failed to delete file " , file ) ;
2010-07-24 10:14:39 +00:00
}
2006-06-27 21:25:53 +00:00
} else {
2008-05-24 10:35:15 +00:00
IConsolePrintF ( CC_ERROR , " %s: No such file or directory. " , file ) ;
2006-06-27 21:25:53 +00:00
}
2005-09-11 14:57:56 +00:00
FiosFreeSavegameList ( ) ;
return true ;
}
2005-03-27 12:48:25 +00:00
/* List all the files in the current dir via console */
DEF_CONSOLE_CMD ( ConListFiles )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
2005-10-19 19:44:01 +00:00
IConsoleHelp ( " List all loadable savegames and directories in the current dir via console. Usage: 'ls | dir' " ) ;
2005-05-02 15:52:19 +00:00
return true ;
}
2005-01-08 00:48:10 +00:00
BuildFileList ( ) ;
2008-06-02 14:19:27 +00:00
for ( uint i = 0 ; i < _fios_items . Length ( ) ; i + + ) {
IConsolePrintF ( CC_DEFAULT , " %d) %s " , i , _fios_items [ i ] . title ) ;
2005-01-08 00:48:10 +00:00
}
FiosFreeSavegameList ( ) ;
2005-05-02 15:52:19 +00:00
return true ;
2005-01-08 00:48:10 +00:00
}
2005-01-04 15:06:08 +00:00
/* Change the dir via console */
2005-03-27 12:48:25 +00:00
DEF_CONSOLE_CMD ( ConChangeDirectory )
2005-01-04 15:06:08 +00:00
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
2005-10-19 19:44:01 +00:00
IConsoleHelp ( " Change the dir via console. Usage: 'cd <directory | number>' " ) ;
2005-05-02 15:52:19 +00:00
return true ;
2005-01-04 15:06:08 +00:00
}
2005-05-02 15:52:19 +00:00
if ( argc ! = 2 ) return false ;
2008-06-02 14:19:27 +00:00
const char * file = argv [ 1 ] ;
const FiosItem * item = GetFiosItem ( file ) ;
2005-03-27 12:48:25 +00:00
if ( item ! = NULL ) {
switch ( item - > type ) {
2005-05-02 15:52:19 +00:00
case FIOS_TYPE_DIR : case FIOS_TYPE_DRIVE : case FIOS_TYPE_PARENT :
2005-03-27 12:48:25 +00:00
FiosBrowseTo ( item ) ;
break ;
2008-05-24 10:35:15 +00:00
default : IConsolePrintF ( CC_ERROR , " %s: Not a directory. " , file ) ;
2005-01-04 15:06:08 +00:00
}
2006-06-27 21:25:53 +00:00
} else {
2008-05-24 10:35:15 +00:00
IConsolePrintF ( CC_ERROR , " %s: No such file or directory. " , file ) ;
2006-06-27 21:25:53 +00:00
}
2005-01-04 15:06:08 +00:00
2005-03-27 12:48:25 +00:00
FiosFreeSavegameList ( ) ;
2005-05-02 15:52:19 +00:00
return true ;
2005-03-27 12:48:25 +00:00
}
DEF_CONSOLE_CMD ( ConPrintWorkingDirectory )
{
2005-05-02 15:52:19 +00:00
const char * path ;
if ( argc = = 0 ) {
IConsoleHelp ( " Print out the current working directory. Usage: 'pwd' " ) ;
return true ;
}
2005-03-27 12:48:25 +00:00
2009-03-15 00:32:18 +00:00
/* XXX - Workaround for broken file handling */
2006-08-05 00:59:45 +00:00
FiosGetSavegameList ( SLD_LOAD_GAME ) ;
2005-01-04 15:06:08 +00:00
FiosFreeSavegameList ( ) ;
2005-03-28 13:30:51 +00:00
FiosGetDescText ( & path , NULL ) ;
2008-05-24 10:35:15 +00:00
IConsolePrint ( CC_DEFAULT , path ) ;
2005-05-02 15:52:19 +00:00
return true ;
2005-01-04 15:06:08 +00:00
}
2005-05-16 13:46:26 +00:00
DEF_CONSOLE_CMD ( ConClearBuffer )
{
if ( argc = = 0 ) {
IConsoleHelp ( " Clear the console buffer. Usage: 'clear' " ) ;
return true ;
}
IConsoleClearBuffer ( ) ;
2009-09-13 19:15:59 +00:00
SetWindowDirty ( WC_CONSOLE , 0 ) ;
2005-05-16 13:46:26 +00:00
return true ;
}
2004-12-04 17:54:56 +00:00
2009-03-15 00:32:18 +00:00
/**********************************
* Network Core Console Commands
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2004-09-12 21:49:38 +00:00
# ifdef ENABLE_NETWORK
2010-05-13 16:00:50 +00:00
static bool ConKickOrBan ( const char * argv , bool ban )
2005-01-02 12:03:43 +00:00
{
2011-04-22 15:59:32 +00:00
uint n ;
2005-01-02 12:03:43 +00:00
2010-05-13 16:00:50 +00:00
if ( strchr ( argv , ' . ' ) = = NULL & & strchr ( argv , ' : ' ) = = NULL ) { // banning with ID
ClientID client_id = ( ClientID ) atoi ( argv ) ;
2005-01-02 12:03:43 +00:00
2011-05-03 15:05:15 +00:00
/* Don't kill the server, or the client doing the rcon. The latter can't be kicked because
* kicking frees closes and subsequently free the connection related instances , which we
* would be reading from and writing to after returning . So we would read or write data
* from freed memory up till the segfault triggers . */
if ( client_id = = CLIENT_ID_SERVER | | client_id = = _redirect_console_to_client ) {
2010-05-13 16:00:50 +00:00
IConsolePrintF ( CC_ERROR , " ERROR: Silly boy, you can not %s yourself! " , ban ? " ban " : " kick " ) ;
return true ;
}
2005-01-02 12:03:43 +00:00
2011-04-22 15:54:16 +00:00
NetworkClientInfo * ci = NetworkClientInfo : : GetByClientID ( client_id ) ;
2006-01-29 18:04:52 +00:00
if ( ci = = NULL ) {
2010-05-13 16:00:50 +00:00
IConsoleError ( " Invalid client " ) ;
return true ;
2006-01-29 18:04:52 +00:00
}
2010-05-13 16:00:50 +00:00
if ( ! ban ) {
/* Kick only this client, not all clients with that IP */
NetworkServerKickClient ( client_id ) ;
return true ;
}
/* When banning, kick+ban all clients with that IP */
2011-04-22 15:59:32 +00:00
n = NetworkServerKickOrBanIP ( client_id , ban ) ;
} else {
n = NetworkServerKickOrBanIP ( argv , ban ) ;
2006-01-19 15:58:57 +00:00
}
2005-01-02 12:03:43 +00:00
2010-05-13 16:00:50 +00:00
if ( n = = 0 ) {
IConsolePrint ( CC_DEFAULT , ban ? " Client not online, address added to banlist " : " Client not found " ) ;
} else {
IConsolePrintF ( CC_DEFAULT , " %sed %u client(s) " , ban ? " Bann " : " Kick " , n ) ;
2005-05-02 15:52:19 +00:00
}
2006-01-19 15:58:57 +00:00
2010-05-13 16:00:50 +00:00
return true ;
}
DEF_CONSOLE_CMD ( ConKick )
{
if ( argc = = 0 ) {
IConsoleHelp ( " Kick a client from a network game. Usage: 'kick <ip | client-id>' " ) ;
IConsoleHelp ( " For client-id's, see the command 'clients' " ) ;
2005-05-02 15:52:19 +00:00
return true ;
2005-01-02 12:03:43 +00:00
}
2010-05-13 16:00:50 +00:00
if ( argc ! = 2 ) return false ;
return ConKickOrBan ( argv [ 1 ] , false ) ;
}
DEF_CONSOLE_CMD ( ConBan )
{
if ( argc = = 0 ) {
IConsoleHelp ( " Ban a client from a network game. Usage: 'ban <ip | client-id>' " ) ;
IConsoleHelp ( " For client-id's, see the command 'clients' " ) ;
IConsoleHelp ( " If the client is no longer online, you can still ban his/her IP " ) ;
return true ;
2006-06-27 21:25:53 +00:00
}
2006-01-29 18:04:52 +00:00
2010-05-13 16:00:50 +00:00
if ( argc ! = 2 ) return false ;
2005-01-02 12:03:43 +00:00
2010-05-13 16:00:50 +00:00
return ConKickOrBan ( argv [ 1 ] , true ) ;
2005-05-02 15:52:19 +00:00
}
DEF_CONSOLE_CMD ( ConUnBan )
{
if ( argc = = 0 ) {
2008-09-30 20:39:50 +00:00
IConsoleHelp ( " Unban a client from a network game. Usage: 'unban <ip | client-id>' " ) ;
2005-10-19 19:38:35 +00:00
IConsoleHelp ( " For a list of banned IP's, see the command 'banlist' " ) ;
2005-05-02 15:52:19 +00:00
return true ;
2005-01-02 12:03:43 +00:00
}
2005-05-02 15:52:19 +00:00
if ( argc ! = 2 ) return false ;
2009-04-03 12:49:58 +00:00
uint index = ( strchr ( argv [ 1 ] , ' . ' ) = = NULL ) ? atoi ( argv [ 1 ] ) : 0 ;
2005-10-19 19:38:35 +00:00
index - - ;
2009-04-03 12:49:58 +00:00
uint i = 0 ;
2005-10-19 19:38:35 +00:00
2009-04-03 12:49:58 +00:00
for ( char * * iter = _network_ban_list . Begin ( ) ; iter ! = _network_ban_list . End ( ) ; iter + + , i + + ) {
2006-06-14 12:30:31 +00:00
if ( strcmp ( _network_ban_list [ i ] , argv [ 1 ] ) = = 0 | | index = = i ) {
2006-01-29 18:04:52 +00:00
free ( _network_ban_list [ i ] ) ;
2009-04-03 12:49:58 +00:00
_network_ban_list . Erase ( iter ) ;
2008-05-24 10:35:15 +00:00
IConsolePrint ( CC_DEFAULT , " IP unbanned. " ) ;
2005-05-02 15:52:19 +00:00
return true ;
}
}
2005-01-02 12:03:43 +00:00
2008-05-24 10:35:15 +00:00
IConsolePrint ( CC_DEFAULT , " IP not in ban-list. " ) ;
2005-05-02 15:52:19 +00:00
return true ;
2005-01-02 12:03:43 +00:00
}
DEF_CONSOLE_CMD ( ConBanList )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
IConsoleHelp ( " List the IP's of banned clients: Usage 'banlist' " ) ;
return true ;
}
2008-05-24 10:35:15 +00:00
IConsolePrint ( CC_DEFAULT , " Banlist: " ) ;
2005-01-02 12:03:43 +00:00
2009-04-03 12:49:58 +00:00
uint i = 1 ;
for ( char * * iter = _network_ban_list . Begin ( ) ; iter ! = _network_ban_list . End ( ) ; iter + + , i + + ) {
IConsolePrintF ( CC_DEFAULT , " %d) %s " , i , * iter ) ;
2005-01-02 12:03:43 +00:00
}
2005-05-02 15:52:19 +00:00
return true ;
2005-01-02 12:03:43 +00:00
}
2005-01-24 21:33:44 +00:00
DEF_CONSOLE_CMD ( ConPauseGame )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
IConsoleHelp ( " Pause a network game. Usage: 'pause' " ) ;
return true ;
}
2009-11-12 20:38:52 +00:00
if ( ( _pause_mode & PM_PAUSED_NORMAL ) = = PM_UNPAUSED ) {
2009-05-06 15:06:57 +00:00
DoCommandP ( 0 , PM_PAUSED_NORMAL , 1 , CMD_PAUSE ) ;
2009-11-12 20:38:52 +00:00
if ( ! _networking ) IConsolePrint ( CC_DEFAULT , " Game paused. " ) ;
2006-06-27 21:25:53 +00:00
} else {
2008-05-24 10:35:15 +00:00
IConsolePrint ( CC_DEFAULT , " Game is already paused. " ) ;
2006-06-27 21:25:53 +00:00
}
2005-01-24 21:33:44 +00:00
2005-05-02 15:52:19 +00:00
return true ;
2005-01-24 21:33:44 +00:00
}
2011-11-15 19:40:42 +00:00
DEF_CONSOLE_CMD ( ConUnpauseGame )
2005-01-24 21:33:44 +00:00
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
IConsoleHelp ( " Unpause a network game. Usage: 'unpause' " ) ;
return true ;
}
2009-11-12 20:38:52 +00:00
if ( ( _pause_mode & PM_PAUSED_NORMAL ) ! = PM_UNPAUSED ) {
2009-05-06 15:06:57 +00:00
DoCommandP ( 0 , PM_PAUSED_NORMAL , 0 , CMD_PAUSE ) ;
2009-11-12 20:38:52 +00:00
if ( ! _networking ) IConsolePrint ( CC_DEFAULT , " Game unpaused. " ) ;
} else if ( ( _pause_mode & PM_PAUSED_ERROR ) ! = PM_UNPAUSED ) {
IConsolePrint ( CC_DEFAULT , " Game is in error state and cannot be unpaused via console. " ) ;
} else if ( _pause_mode ! = PM_UNPAUSED ) {
IConsolePrint ( CC_DEFAULT , " Game cannot be unpaused manually; disable pause_on_join/min_active_clients. " ) ;
2006-06-27 21:25:53 +00:00
} else {
2008-05-24 10:35:15 +00:00
IConsolePrint ( CC_DEFAULT , " Game is already unpaused. " ) ;
2006-06-27 21:25:53 +00:00
}
2005-01-24 21:33:44 +00:00
2005-05-02 15:52:19 +00:00
return true ;
2005-01-24 21:33:44 +00:00
}
2005-01-15 20:09:16 +00:00
DEF_CONSOLE_CMD ( ConRcon )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
IConsoleHelp ( " Remote control the server from another client. Usage: 'rcon <password> <command>' " ) ;
IConsoleHelp ( " Remember to enclose the command in quotes, otherwise only the first parameter is sent " ) ;
return true ;
2005-01-15 20:09:16 +00:00
}
2005-05-02 15:52:19 +00:00
if ( argc < 3 ) return false ;
2005-01-15 20:09:16 +00:00
2008-05-17 11:46:35 +00:00
if ( _network_server ) {
IConsoleCmdExec ( argv [ 2 ] ) ;
} else {
2008-05-30 18:20:26 +00:00
NetworkClientSendRcon ( argv [ 1 ] , argv [ 2 ] ) ;
2008-05-17 11:46:35 +00:00
}
2005-05-02 15:52:19 +00:00
return true ;
2005-01-15 20:09:16 +00:00
}
2004-12-04 17:54:56 +00:00
DEF_CONSOLE_CMD ( ConStatus )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
2006-01-25 18:11:06 +00:00
IConsoleHelp ( " List the status of all clients connected to the server. Usage 'status' " ) ;
2005-05-02 15:52:19 +00:00
return true ;
}
2008-05-30 18:20:26 +00:00
NetworkServerShowStatusToConsole ( ) ;
2005-05-02 15:52:19 +00:00
return true ;
2004-12-04 17:54:56 +00:00
}
2006-01-25 18:11:06 +00:00
DEF_CONSOLE_CMD ( ConServerInfo )
{
if ( argc = = 0 ) {
2008-09-30 20:39:50 +00:00
IConsoleHelp ( " List current and maximum client/company limits. Usage 'server_info' " ) ;
2010-02-10 17:32:39 +00:00
IConsoleHelp ( " You can change these values by modifying settings 'network.max_clients', 'network.max_companies' and 'network.max_spectators' " ) ;
2006-01-25 18:11:06 +00:00
return true ;
}
2008-06-03 08:04:35 +00:00
IConsolePrintF ( CC_DEFAULT , " Current/maximum clients: %2d/%2d " , _network_game_info . clients_on , _settings_client . network . max_clients ) ;
2009-05-22 15:23:47 +00:00
IConsolePrintF ( CC_DEFAULT , " Current/maximum companies: %2d/%2d " , ( int ) Company : : GetNumItems ( ) , _settings_client . network . max_companies ) ;
2008-06-03 08:04:35 +00:00
IConsolePrintF ( CC_DEFAULT , " Current/maximum spectators: %2d/%2d " , NetworkSpectatorCount ( ) , _settings_client . network . max_spectators ) ;
2006-01-25 18:11:06 +00:00
return true ;
}
2009-01-21 23:07:11 +00:00
DEF_CONSOLE_CMD ( ConClientNickChange )
{
if ( argc ! = 3 ) {
IConsoleHelp ( " Change the nickname of a connected client. Usage: 'client_name <client-id> <new-name>' " ) ;
IConsoleHelp ( " For client-id's, see the command 'clients' " ) ;
return true ;
}
ClientID client_id = ( ClientID ) atoi ( argv [ 1 ] ) ;
if ( client_id = = CLIENT_ID_SERVER ) {
IConsoleError ( " Please use the command 'name' to change your own name! " ) ;
return true ;
}
2011-04-22 15:54:16 +00:00
if ( NetworkClientInfo : : GetByClientID ( client_id ) = = NULL ) {
2009-01-21 23:07:11 +00:00
IConsoleError ( " Invalid client " ) ;
return true ;
}
if ( ! NetworkServerChangeClientName ( client_id , argv [ 2 ] ) ) {
IConsoleError ( " Cannot give a client a duplicate name " ) ;
}
return true ;
}
2009-01-23 22:18:06 +00:00
DEF_CONSOLE_CMD ( ConJoinCompany )
{
if ( argc < 2 ) {
IConsoleHelp ( " Request joining another company. Usage: join <company-id> [<password>] " ) ;
IConsoleHelp ( " For valid company-id see company list, use 255 for spectator " ) ;
return true ;
}
CompanyID company_id = ( CompanyID ) ( atoi ( argv [ 1 ] ) < = MAX_COMPANIES ? atoi ( argv [ 1 ] ) - 1 : atoi ( argv [ 1 ] ) ) ;
/* Check we have a valid company id! */
2009-05-17 01:00:56 +00:00
if ( ! Company : : IsValidID ( company_id ) & & company_id ! = COMPANY_SPECTATOR ) {
2009-01-23 22:18:06 +00:00
IConsolePrintF ( CC_ERROR , " Company does not exist. Company-id must be between 1 and %d. " , MAX_COMPANIES ) ;
return true ;
}
2011-04-22 15:54:16 +00:00
if ( NetworkClientInfo : : GetByClientID ( _network_own_client_id ) - > client_playas = = company_id ) {
2009-01-23 22:18:06 +00:00
IConsoleError ( " You are already there! " ) ;
return true ;
}
if ( company_id = = COMPANY_SPECTATOR & & NetworkMaxSpectatorsReached ( ) ) {
IConsoleError ( " Cannot join spectators, maximum number of spectators reached. " ) ;
return true ;
}
2009-06-23 12:11:35 +00:00
if ( company_id ! = COMPANY_SPECTATOR & & ! Company : : IsHumanID ( company_id ) ) {
2009-04-26 20:01:14 +00:00
IConsoleError ( " Cannot join AI company. " ) ;
return true ;
}
2009-01-23 22:18:06 +00:00
/* Check if the company requires a password */
if ( NetworkCompanyIsPassworded ( company_id ) & & argc < 3 ) {
IConsolePrintF ( CC_ERROR , " Company %d requires a password to join. " , company_id + 1 ) ;
return true ;
}
/* non-dedicated server may just do the move! */
if ( _network_server ) {
NetworkServerDoMove ( CLIENT_ID_SERVER , company_id ) ;
} else {
NetworkClientRequestMove ( company_id , NetworkCompanyIsPassworded ( company_id ) ? argv [ 2 ] : " " ) ;
}
return true ;
}
DEF_CONSOLE_CMD ( ConMoveClient )
{
if ( argc < 3 ) {
IConsoleHelp ( " Move a client to another company. Usage: move <client-id> <company-id> " ) ;
IConsoleHelp ( " For valid client-id see 'clients', for valid company-id see 'companies', use 255 for moving to spectators " ) ;
return true ;
}
2011-04-22 15:54:16 +00:00
const NetworkClientInfo * ci = NetworkClientInfo : : GetByClientID ( ( ClientID ) atoi ( argv [ 1 ] ) ) ;
2009-01-23 22:18:06 +00:00
CompanyID company_id = ( CompanyID ) ( atoi ( argv [ 2 ] ) < = MAX_COMPANIES ? atoi ( argv [ 2 ] ) - 1 : atoi ( argv [ 2 ] ) ) ;
/* check the client exists */
if ( ci = = NULL ) {
IConsoleError ( " Invalid client-id, check the command 'clients' for valid client-id's. " ) ;
return true ;
}
2009-05-17 01:00:56 +00:00
if ( ! Company : : IsValidID ( company_id ) & & company_id ! = COMPANY_SPECTATOR ) {
2009-01-23 22:18:06 +00:00
IConsolePrintF ( CC_ERROR , " Company does not exist. Company-id must be between 1 and %d. " , MAX_COMPANIES ) ;
return true ;
}
2009-06-23 12:11:35 +00:00
if ( company_id ! = COMPANY_SPECTATOR & & ! Company : : IsHumanID ( company_id ) ) {
2009-04-26 20:01:14 +00:00
IConsoleError ( " You cannot move clients to AI companies. " ) ;
return true ;
}
2009-01-23 22:18:06 +00:00
if ( ci - > client_id = = CLIENT_ID_SERVER & & _network_dedicated ) {
IConsoleError ( " Silly boy, you cannot move the server! " ) ;
return true ;
}
if ( ci - > client_playas = = company_id ) {
IConsoleError ( " You cannot move someone to where he/she already is! " ) ;
return true ;
}
/* we are the server, so force the update */
NetworkServerDoMove ( ci - > client_id , company_id ) ;
return true ;
}
2004-12-16 11:36:57 +00:00
DEF_CONSOLE_CMD ( ConResetCompany )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
2005-05-04 10:17:00 +00:00
IConsoleHelp ( " Remove an idle company from the game. Usage: 'reset_company <company-id>' " ) ;
2008-09-30 20:39:50 +00:00
IConsoleHelp ( " For company-id's, see the list of companies from the dropdown menu. Company 1 is 1, etc. " ) ;
2005-05-02 15:52:19 +00:00
return true ;
}
2004-12-16 11:36:57 +00:00
2005-05-02 15:52:19 +00:00
if ( argc ! = 2 ) return false ;
2004-12-16 11:36:57 +00:00
2009-05-18 16:21:28 +00:00
CompanyID index = ( CompanyID ) ( atoi ( argv [ 1 ] ) - 1 ) ;
2004-12-16 11:36:57 +00:00
2005-05-02 15:52:19 +00:00
/* Check valid range */
2009-06-23 12:11:35 +00:00
if ( ! Company : : IsValidID ( index ) ) {
2008-09-30 20:39:50 +00:00
IConsolePrintF ( CC_ERROR , " Company does not exist. Company-id must be between 1 and %d. " , MAX_COMPANIES ) ;
2005-05-02 15:52:19 +00:00
return true ;
}
2004-12-16 11:36:57 +00:00
2009-06-23 12:11:35 +00:00
if ( ! Company : : IsHumanID ( index ) ) {
2005-05-04 10:17:00 +00:00
IConsoleError ( " Company is owned by an AI. " ) ;
2005-05-02 15:52:19 +00:00
return true ;
}
2008-09-30 20:39:50 +00:00
if ( NetworkCompanyHasClients ( index ) ) {
2008-05-30 18:20:26 +00:00
IConsoleError ( " Cannot remove company: a client is connected to that company. " ) ;
return false ;
2005-05-02 15:52:19 +00:00
}
2011-04-22 15:54:16 +00:00
const NetworkClientInfo * ci = NetworkClientInfo : : GetByClientID ( CLIENT_ID_SERVER ) ;
2006-10-17 22:16:46 +00:00
if ( ci - > client_playas = = index ) {
2005-05-04 10:17:00 +00:00
IConsoleError ( " Cannot remove company: the server is connected to that company. " ) ;
2005-05-02 15:52:19 +00:00
return true ;
2004-12-16 11:36:57 +00:00
}
2005-05-02 15:52:19 +00:00
/* It is safe to remove this company */
2011-10-15 20:42:32 +00:00
DoCommandP ( 0 , 2 | index < < 16 , CRR_MANUAL , CMD_COMPANY_CTRL ) ;
2008-05-24 10:35:15 +00:00
IConsolePrint ( CC_DEFAULT , " Company deleted. " ) ;
2004-12-16 11:36:57 +00:00
2005-05-02 15:52:19 +00:00
return true ;
2004-12-16 11:36:57 +00:00
}
2004-12-04 17:54:56 +00:00
DEF_CONSOLE_CMD ( ConNetworkClients )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
2005-10-19 19:38:35 +00:00
IConsoleHelp ( " Get a list of connected clients including their ID, name, company-id, and IP. Usage: 'clients' " ) ;
2005-05-02 15:52:19 +00:00
return true ;
}
2008-12-22 21:26:26 +00:00
NetworkPrintClients ( ) ;
2004-12-04 17:54:56 +00:00
2005-05-02 15:52:19 +00:00
return true ;
2004-12-04 17:54:56 +00:00
}
2009-09-07 21:03:41 +00:00
DEF_CONSOLE_CMD ( ConNetworkReconnect )
{
if ( argc = = 0 ) {
IConsoleHelp ( " Reconnect to server to which you were connected last time. Usage: 'reconnect [<company>]' " ) ;
IConsoleHelp ( " Company 255 is spectator (default, if not specified), 0 means creating new company. " ) ;
IConsoleHelp ( " All others are a certain company with Company 1 being #1 " ) ;
return true ;
}
CompanyID playas = ( argc > = 2 ) ? ( CompanyID ) atoi ( argv [ 1 ] ) : COMPANY_SPECTATOR ;
switch ( playas ) {
case 0 : playas = COMPANY_NEW_COMPANY ; break ;
case COMPANY_SPECTATOR : /* nothing to do */ break ;
default :
/* From a user pov 0 is a new company, internally it's different and all
* companies are offset by one to ease up on users ( eg companies 1 - 8 not 0 - 7 ) */
playas - - ;
if ( playas < COMPANY_FIRST | | playas > = MAX_COMPANIES ) return false ;
break ;
}
if ( StrEmpty ( _settings_client . network . last_host ) ) {
IConsolePrint ( CC_DEFAULT , " No server for reconnecting. " ) ;
return true ;
}
/* Don't resolve the address first, just print it directly as it comes from the config file. */
IConsolePrintF ( CC_DEFAULT , " Reconnecting to %s:%d... " , _settings_client . network . last_host , _settings_client . network . last_port ) ;
NetworkClientConnectGame ( NetworkAddress ( _settings_client . network . last_host , _settings_client . network . last_port ) , playas ) ;
return true ;
2010-03-23 22:37:18 +00:00
}
2009-09-07 21:03:41 +00:00
2004-09-12 21:49:38 +00:00
DEF_CONSOLE_CMD ( ConNetworkConnect )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
IConsoleHelp ( " Connect to a remote OTTD server and join the game. Usage: 'connect <ip>' " ) ;
2010-03-08 11:51:23 +00:00
IConsoleHelp ( " IP can contain port and company: 'IP[:Port][#Company]', eg: 'server.ottd.org:443#2' " ) ;
2008-09-30 20:39:50 +00:00
IConsoleHelp ( " Company #255 is spectator all others are a certain company with Company 1 being #1 " ) ;
2005-05-02 15:52:19 +00:00
return true ;
}
2004-09-12 21:49:38 +00:00
2005-05-02 15:52:19 +00:00
if ( argc < 2 ) return false ;
2006-10-18 13:17:46 +00:00
if ( _networking ) NetworkDisconnect ( ) ; // we are in network-mode, first close it!
2004-12-04 17:54:56 +00:00
2009-05-19 21:20:14 +00:00
const char * port = NULL ;
const char * company = NULL ;
char * ip = argv [ 1 ] ;
2006-10-15 23:48:34 +00:00
/* Default settings: default port and new company */
2009-05-19 21:20:14 +00:00
uint16 rport = NETWORK_DEFAULT_PORT ;
CompanyID join_as = COMPANY_NEW_COMPANY ;
2004-09-12 21:49:38 +00:00
2008-09-30 20:39:50 +00:00
ParseConnectionString ( & company , & port , ip ) ;
2004-09-12 23:35:01 +00:00
2008-05-24 10:35:15 +00:00
IConsolePrintF ( CC_DEFAULT , " Connecting to %s... " , ip ) ;
2008-09-30 20:39:50 +00:00
if ( company ! = NULL ) {
2009-05-19 21:20:14 +00:00
join_as = ( CompanyID ) atoi ( company ) ;
IConsolePrintF ( CC_DEFAULT , " company-no: %d " , join_as ) ;
2006-10-15 23:48:34 +00:00
2008-09-30 20:39:50 +00:00
/* From a user pov 0 is a new company, internally it's different and all
* companies are offset by one to ease up on users ( eg companies 1 - 8 not 0 - 7 ) */
2009-05-19 21:20:14 +00:00
if ( join_as ! = COMPANY_SPECTATOR ) {
if ( join_as > MAX_COMPANIES ) return false ;
join_as - - ;
2006-10-15 23:48:34 +00:00
}
2004-09-12 21:49:38 +00:00
}
2004-12-04 17:54:56 +00:00
if ( port ! = NULL ) {
2004-09-12 21:49:38 +00:00
rport = atoi ( port ) ;
2008-05-24 10:35:15 +00:00
IConsolePrintF ( CC_DEFAULT , " port: %s " , port ) ;
2004-09-12 21:49:38 +00:00
}
2009-05-19 21:20:14 +00:00
NetworkClientConnectGame ( NetworkAddress ( ip , rport ) , join_as ) ;
2004-09-12 21:49:38 +00:00
2005-05-02 15:52:19 +00:00
return true ;
2004-09-12 21:49:38 +00:00
}
2004-12-04 17:54:56 +00:00
# endif /* ENABLE_NETWORK */
2004-09-12 21:49:38 +00:00
2009-03-15 00:32:18 +00:00
/*********************************
* script file console commands
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2004-09-14 16:10:20 +00:00
DEF_CONSOLE_CMD ( ConExec )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
IConsoleHelp ( " Execute a local script file. Usage: 'exec <script> <?>' " ) ;
return true ;
}
if ( argc < 2 ) return false ;
2004-09-14 16:10:20 +00:00
2010-06-26 15:04:57 +00:00
FILE * script_file = FioFOpenFile ( argv [ 1 ] , " r " , BASE_DIR ) ;
2004-09-14 16:10:20 +00:00
2010-06-26 15:04:57 +00:00
if ( script_file = = NULL ) {
2005-05-02 15:52:19 +00:00
if ( argc = = 2 | | atoi ( argv [ 2 ] ) ! = 0 ) IConsoleError ( " script file not found " ) ;
return true ;
2005-02-18 08:49:04 +00:00
}
2004-09-14 16:10:20 +00:00
_script_running = true ;
2010-06-26 15:12:51 +00:00
char cmdline [ ICON_CMDLN_SIZE ] ;
2010-06-26 15:04:57 +00:00
while ( _script_running & & fgets ( cmdline , sizeof ( cmdline ) , script_file ) ! = NULL ) {
2005-05-02 17:05:59 +00:00
/* Remove newline characters from the executing script */
2010-06-26 15:12:51 +00:00
for ( char * cmdptr = cmdline ; * cmdptr ! = ' \0 ' ; cmdptr + + ) {
2005-05-02 17:05:59 +00:00
if ( * cmdptr = = ' \n ' | | * cmdptr = = ' \r ' ) {
* cmdptr = ' \0 ' ;
break ;
}
}
2005-05-02 15:52:19 +00:00
IConsoleCmdExec ( cmdline ) ;
2005-05-02 17:05:59 +00:00
}
2005-02-18 08:36:11 +00:00
2010-07-24 10:14:39 +00:00
if ( ferror ( script_file ) ) {
2005-02-18 08:36:11 +00:00
IConsoleError ( " Encountered errror while trying to read from script file " ) ;
2010-07-24 10:14:39 +00:00
}
2004-09-14 16:10:20 +00:00
_script_running = false ;
2010-06-26 15:04:57 +00:00
FioFCloseFile ( script_file ) ;
2005-05-02 15:52:19 +00:00
return true ;
2004-09-14 16:10:20 +00:00
}
DEF_CONSOLE_CMD ( ConReturn )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
IConsoleHelp ( " Stop executing a running script. Usage: 'return' " ) ;
return true ;
}
2004-09-14 16:10:20 +00:00
_script_running = false ;
2005-05-02 15:52:19 +00:00
return true ;
2004-09-14 16:10:20 +00:00
}
2009-03-15 00:32:18 +00:00
/*****************************
* default console commands
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-03-07 11:47:46 +00:00
extern bool CloseConsoleLogIfActive ( ) ;
2005-01-15 16:38:10 +00:00
DEF_CONSOLE_CMD ( ConScript )
{
2009-01-10 00:31:47 +00:00
extern FILE * _iconsole_output_file ;
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
IConsoleHelp ( " Start or stop logging console output to a file. Usage: 'script <filename>' " ) ;
IConsoleHelp ( " If filename is omitted, a running log is stopped if it is active " ) ;
return true ;
}
2005-01-15 16:38:10 +00:00
if ( ! CloseConsoleLogIfActive ( ) ) {
2005-05-02 15:52:19 +00:00
if ( argc < 2 ) return false ;
2008-05-24 10:35:15 +00:00
IConsolePrintF ( CC_DEFAULT , " file output started to: %s " , argv [ 1 ] ) ;
2004-09-19 15:24:45 +00:00
_iconsole_output_file = fopen ( argv [ 1 ] , " ab " ) ;
2004-09-14 16:10:20 +00:00
if ( _iconsole_output_file = = NULL ) IConsoleError ( " could not open file " ) ;
}
2005-01-15 16:38:10 +00:00
2005-05-02 15:52:19 +00:00
return true ;
2004-09-14 16:10:20 +00:00
}
2004-09-12 21:49:38 +00:00
DEF_CONSOLE_CMD ( ConEcho )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
IConsoleHelp ( " Print back the first argument to the console. Usage: 'echo <arg>' " ) ;
return true ;
}
if ( argc < 2 ) return false ;
2008-05-24 10:35:15 +00:00
IConsolePrint ( CC_DEFAULT , argv [ 1 ] ) ;
2005-05-02 15:52:19 +00:00
return true ;
2004-09-12 21:49:38 +00:00
}
DEF_CONSOLE_CMD ( ConEchoC )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
IConsoleHelp ( " Print back the first argument to the console in a given colour. Usage: 'echoc <colour> <arg2>' " ) ;
return true ;
}
if ( argc < 3 ) return false ;
2011-01-03 12:04:53 +00:00
IConsolePrint ( ( TextColour ) Clamp ( atoi ( argv [ 1 ] ) , TC_BEGIN , TC_END - 1 ) , argv [ 2 ] ) ;
2005-05-02 15:52:19 +00:00
return true ;
2004-09-12 21:49:38 +00:00
}
(svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
- New optional landscape generator (TerraGenesis Perlin)
- Load heightmaps (either BMP or PNG)
- Progress dialog while generating worlds (no longer a 'hanging' screen)
- New dialogs for NewGame, Create Scenario and Play Heightmap
- Easier to configure your landscape
- More things to configure (tree-placer, ..)
- Speedup of world generation
- New console command 'restart': restart the map EXACTLY as it was when you
first started it (needs a game made after or with this commit)
- New console command 'getseed': get the seed of your map and share it with
others (of course only works with generated maps)
- Many new, world generation related, things
- Many internal cleanups and rewrites
Many tnx to those people who helped making this:
Belugas, DaleStan, glx, KUDr, RichK67, Rubidium, and TrueLight (alfabetic)
Many tnx to those who helped testing:
Arnau, Bjarni, and tokai (alfabetic)
And to all other people who helped testing and sending comments / bugs
Stats: 673 lines changed, 3534 new lines, 79 new strings
2006-08-19 10:00:30 +00:00
DEF_CONSOLE_CMD ( ConNewGame )
{
if ( argc = = 0 ) {
IConsoleHelp ( " Start a new game. Usage: 'newgame [seed]' " ) ;
IConsoleHelp ( " The server can force a new game using 'newgame'; any client joined will rejoin after the server is done generating the new game. " ) ;
return true ;
}
2010-08-16 09:44:05 +00:00
StartNewGameWithoutGUI ( ( argc = = 2 ) ? strtoul ( argv [ 1 ] , NULL , 10 ) : GENERATE_NEW_SEED ) ;
(svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
- New optional landscape generator (TerraGenesis Perlin)
- Load heightmaps (either BMP or PNG)
- Progress dialog while generating worlds (no longer a 'hanging' screen)
- New dialogs for NewGame, Create Scenario and Play Heightmap
- Easier to configure your landscape
- More things to configure (tree-placer, ..)
- Speedup of world generation
- New console command 'restart': restart the map EXACTLY as it was when you
first started it (needs a game made after or with this commit)
- New console command 'getseed': get the seed of your map and share it with
others (of course only works with generated maps)
- Many new, world generation related, things
- Many internal cleanups and rewrites
Many tnx to those people who helped making this:
Belugas, DaleStan, glx, KUDr, RichK67, Rubidium, and TrueLight (alfabetic)
Many tnx to those who helped testing:
Arnau, Bjarni, and tokai (alfabetic)
And to all other people who helped testing and sending comments / bugs
Stats: 673 lines changed, 3534 new lines, 79 new strings
2006-08-19 10:00:30 +00:00
return true ;
}
DEF_CONSOLE_CMD ( ConRestart )
{
if ( argc = = 0 ) {
IConsoleHelp ( " Restart game. Usage: 'restart' " ) ;
IConsoleHelp ( " Restarts a game. It tries to reproduce the exact same map as the game started with. " ) ;
2009-08-06 22:00:32 +00:00
IConsoleHelp ( " However: " ) ;
IConsoleHelp ( " * restarting games started in another version might create another map due to difference in map generation " ) ;
IConsoleHelp ( " * restarting games based on scenarios, loaded games or heightmaps will start a new game based on the settings stored in the scenario/savegame " ) ;
(svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
- New optional landscape generator (TerraGenesis Perlin)
- Load heightmaps (either BMP or PNG)
- Progress dialog while generating worlds (no longer a 'hanging' screen)
- New dialogs for NewGame, Create Scenario and Play Heightmap
- Easier to configure your landscape
- More things to configure (tree-placer, ..)
- Speedup of world generation
- New console command 'restart': restart the map EXACTLY as it was when you
first started it (needs a game made after or with this commit)
- New console command 'getseed': get the seed of your map and share it with
others (of course only works with generated maps)
- Many new, world generation related, things
- Many internal cleanups and rewrites
Many tnx to those people who helped making this:
Belugas, DaleStan, glx, KUDr, RichK67, Rubidium, and TrueLight (alfabetic)
Many tnx to those who helped testing:
Arnau, Bjarni, and tokai (alfabetic)
And to all other people who helped testing and sending comments / bugs
Stats: 673 lines changed, 3534 new lines, 79 new strings
2006-08-19 10:00:30 +00:00
return true ;
}
2009-02-25 00:45:52 +00:00
/* Don't copy the _newgame pointers to the real pointers, so call SwitchToMode directly */
2008-05-29 15:13:28 +00:00
_settings_game . game_creation . map_x = MapLogX ( ) ;
_settings_game . game_creation . map_y = FindFirstBit ( MapSizeY ( ) ) ;
2010-04-25 16:12:03 +00:00
_switch_mode = SM_RESTARTGAME ;
(svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
- New optional landscape generator (TerraGenesis Perlin)
- Load heightmaps (either BMP or PNG)
- Progress dialog while generating worlds (no longer a 'hanging' screen)
- New dialogs for NewGame, Create Scenario and Play Heightmap
- Easier to configure your landscape
- More things to configure (tree-placer, ..)
- Speedup of world generation
- New console command 'restart': restart the map EXACTLY as it was when you
first started it (needs a game made after or with this commit)
- New console command 'getseed': get the seed of your map and share it with
others (of course only works with generated maps)
- Many new, world generation related, things
- Many internal cleanups and rewrites
Many tnx to those people who helped making this:
Belugas, DaleStan, glx, KUDr, RichK67, Rubidium, and TrueLight (alfabetic)
Many tnx to those who helped testing:
Arnau, Bjarni, and tokai (alfabetic)
And to all other people who helped testing and sending comments / bugs
Stats: 673 lines changed, 3534 new lines, 79 new strings
2006-08-19 10:00:30 +00:00
return true ;
}
2011-01-03 14:52:30 +00:00
/**
2013-01-08 22:46:42 +00:00
* Print a text buffer line by line to the console . Lines are separated by ' \n ' .
2011-01-03 14:52:30 +00:00
* @ param buf The buffer to print .
* @ note All newlines are replace by ' \0 ' characters .
*/
static void PrintLineByLine ( char * buf )
2009-01-12 17:11:45 +00:00
{
2011-01-03 14:52:30 +00:00
char * p = buf ;
2009-01-12 17:11:45 +00:00
/* Print output line by line */
2011-01-03 14:52:30 +00:00
for ( char * p2 = buf ; * p2 ! = ' \0 ' ; p2 + + ) {
2009-01-12 17:11:45 +00:00
if ( * p2 = = ' \n ' ) {
* p2 = ' \0 ' ;
IConsolePrintF ( CC_DEFAULT , " %s " , p ) ;
p = p2 + 1 ;
}
}
2011-01-03 14:52:30 +00:00
}
DEF_CONSOLE_CMD ( ConListAILibs )
{
char buf [ 4096 ] ;
AI : : GetConsoleLibraryList ( buf , lastof ( buf ) ) ;
PrintLineByLine ( buf ) ;
return true ;
}
DEF_CONSOLE_CMD ( ConListAI )
{
char buf [ 4096 ] ;
AI : : GetConsoleList ( buf , lastof ( buf ) ) ;
PrintLineByLine ( buf ) ;
2009-01-12 17:11:45 +00:00
return true ;
}
2011-12-19 20:56:59 +00:00
DEF_CONSOLE_CMD ( ConListGameLibs )
{
char buf [ 4096 ] ;
Game : : GetConsoleLibraryList ( buf , lastof ( buf ) ) ;
PrintLineByLine ( buf ) ;
return true ;
}
2011-12-19 20:55:56 +00:00
DEF_CONSOLE_CMD ( ConListGame )
{
char buf [ 4096 ] ;
Game : : GetConsoleList ( buf , lastof ( buf ) ) ;
PrintLineByLine ( buf ) ;
return true ;
}
2009-01-12 17:11:45 +00:00
DEF_CONSOLE_CMD ( ConStartAI )
{
if ( argc = = 0 | | argc > 3 ) {
IConsoleHelp ( " Start a new AI. Usage: 'start_ai [<AI>] [<settings>]' " ) ;
IConsoleHelp ( " Start a new AI. If <AI> is given, it starts that specific AI (if found). " ) ;
IConsoleHelp ( " If <settings> is given, it is parsed and the AI settings are set to that. " ) ;
return true ;
}
2009-01-13 11:06:21 +00:00
if ( _game_mode ! = GM_NORMAL ) {
IConsoleWarning ( " AIs can only be managed in a game. " ) ;
return true ;
}
2009-05-22 15:23:47 +00:00
if ( Company : : GetNumItems ( ) = = CompanyPool : : MAX_SIZE ) {
2009-01-12 17:11:45 +00:00
IConsoleWarning ( " Can't start a new AI (no more free slots). " ) ;
return true ;
}
if ( _networking & & ! _network_server ) {
IConsoleWarning ( " Only the server can start a new AI. " ) ;
return true ;
}
if ( _networking & & ! _settings_game . ai . ai_in_multiplayer ) {
IConsoleWarning ( " AIs are not allowed in multiplayer by configuration. " ) ;
IConsoleWarning ( " Switch AI -> AI in multiplayer to True. " ) ;
return true ;
}
if ( ! AI : : CanStartNew ( ) ) {
IConsoleWarning ( " Can't start a new AI. " ) ;
return true ;
}
int n = 0 ;
Company * c ;
/* Find the next free slot */
FOR_ALL_COMPANIES ( c ) {
if ( c - > index ! = n ) break ;
n + + ;
}
AIConfig * config = AIConfig : : GetConfig ( ( CompanyID ) n ) ;
if ( argc > = 2 ) {
2011-11-29 23:26:35 +00:00
config - > Change ( argv [ 1 ] , - 1 , true ) ;
if ( ! config - > HasScript ( ) ) {
2009-01-12 17:11:45 +00:00
IConsoleWarning ( " Failed to load the specified AI " ) ;
return true ;
}
if ( argc = = 3 ) {
config - > StringToSettings ( argv [ 2 ] ) ;
}
}
/* Start a new AI company */
2010-08-18 17:06:45 +00:00
DoCommandP ( 0 , 1 | INVALID_COMPANY < < 16 , 0 , CMD_COMPANY_CTRL ) ;
2009-01-12 17:11:45 +00:00
return true ;
}
2009-01-14 15:39:05 +00:00
DEF_CONSOLE_CMD ( ConReloadAI )
{
if ( argc ! = 2 ) {
IConsoleHelp ( " Reload an AI. Usage: 'reload_ai <company-id>' " ) ;
IConsoleHelp ( " Reload the AI with the given company id. For company-id's, see the list of companies from the dropdown menu. Company 1 is 1, etc. " ) ;
return true ;
}
if ( _game_mode ! = GM_NORMAL ) {
IConsoleWarning ( " AIs can only be managed in a game. " ) ;
return true ;
}
if ( _networking & & ! _network_server ) {
IConsoleWarning ( " Only the server can reload an AI. " ) ;
return true ;
}
CompanyID company_id = ( CompanyID ) ( atoi ( argv [ 1 ] ) - 1 ) ;
2009-05-17 01:00:56 +00:00
if ( ! Company : : IsValidID ( company_id ) ) {
2009-01-14 15:39:05 +00:00
IConsolePrintF ( CC_DEFAULT , " Unknown company. Company range is between 1 and %d. " , MAX_COMPANIES ) ;
return true ;
}
2009-06-23 12:11:35 +00:00
if ( Company : : IsHumanID ( company_id ) ) {
2009-01-14 15:39:05 +00:00
IConsoleWarning ( " Company is not controlled by an AI. " ) ;
return true ;
}
/* First kill the company of the AI, then start a new one. This should start the current AI again */
2011-10-15 20:42:32 +00:00
DoCommandP ( 0 , 2 | company_id < < 16 , CRR_MANUAL , CMD_COMPANY_CTRL ) ;
2010-08-18 17:06:45 +00:00
DoCommandP ( 0 , 1 | company_id < < 16 , 0 , CMD_COMPANY_CTRL ) ;
2009-01-14 15:39:05 +00:00
IConsolePrint ( CC_DEFAULT , " AI reloaded. " ) ;
return true ;
}
2009-01-12 17:11:45 +00:00
DEF_CONSOLE_CMD ( ConStopAI )
{
if ( argc ! = 2 ) {
IConsoleHelp ( " Stop an AI. Usage: 'stop_ai <company-id>' " ) ;
IConsoleHelp ( " Stop the AI with the given company id. For company-id's, see the list of companies from the dropdown menu. Company 1 is 1, etc. " ) ;
return true ;
}
2009-01-13 11:06:21 +00:00
if ( _game_mode ! = GM_NORMAL ) {
IConsoleWarning ( " AIs can only be managed in a game. " ) ;
return true ;
}
2009-01-12 17:11:45 +00:00
if ( _networking & & ! _network_server ) {
IConsoleWarning ( " Only the server can stop an AI. " ) ;
return true ;
}
CompanyID company_id = ( CompanyID ) ( atoi ( argv [ 1 ] ) - 1 ) ;
2009-05-17 01:00:56 +00:00
if ( ! Company : : IsValidID ( company_id ) ) {
2009-01-12 17:11:45 +00:00
IConsolePrintF ( CC_DEFAULT , " Unknown company. Company range is between 1 and %d. " , MAX_COMPANIES ) ;
return true ;
}
2011-12-28 17:33:12 +00:00
if ( Company : : IsHumanID ( company_id ) | | company_id = = _local_company ) {
2009-01-12 17:11:45 +00:00
IConsoleWarning ( " Company is not controlled by an AI. " ) ;
return true ;
}
/* Now kill the company of the AI. */
2011-10-15 20:42:32 +00:00
DoCommandP ( 0 , 2 | company_id < < 16 , CRR_MANUAL , CMD_COMPANY_CTRL ) ;
2009-01-12 17:11:45 +00:00
IConsolePrint ( CC_DEFAULT , " AI stopped, company deleted. " ) ;
return true ;
}
DEF_CONSOLE_CMD ( ConRescanAI )
{
if ( argc = = 0 ) {
IConsoleHelp ( " Rescan the AI dir for scripts. Usage: 'rescan_ai' " ) ;
return true ;
}
if ( _networking & & ! _network_server ) {
IConsoleWarning ( " Only the server can rescan the AI dir for scripts. " ) ;
return true ;
}
AI : : Rescan ( ) ;
return true ;
}
2011-12-21 12:25:17 +00:00
DEF_CONSOLE_CMD ( ConRescanGame )
{
if ( argc = = 0 ) {
IConsoleHelp ( " Rescan the Game Script dir for scripts. Usage: 'rescan_game' " ) ;
return true ;
}
if ( _networking & & ! _network_server ) {
IConsoleWarning ( " Only the server can rescan the Game Script dir for scripts. " ) ;
return true ;
}
Game : : Rescan ( ) ;
return true ;
}
2010-08-03 12:54:19 +00:00
DEF_CONSOLE_CMD ( ConRescanNewGRF )
{
if ( argc = = 0 ) {
IConsoleHelp ( " Rescan the data dir for NewGRFs. Usage: 'rescan_newgrf' " ) ;
return true ;
}
2011-08-21 12:51:18 +00:00
ScanNewGRFFiles ( NULL ) ;
2010-08-03 12:54:19 +00:00
return true ;
}
(svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
- New optional landscape generator (TerraGenesis Perlin)
- Load heightmaps (either BMP or PNG)
- Progress dialog while generating worlds (no longer a 'hanging' screen)
- New dialogs for NewGame, Create Scenario and Play Heightmap
- Easier to configure your landscape
- More things to configure (tree-placer, ..)
- Speedup of world generation
- New console command 'restart': restart the map EXACTLY as it was when you
first started it (needs a game made after or with this commit)
- New console command 'getseed': get the seed of your map and share it with
others (of course only works with generated maps)
- Many new, world generation related, things
- Many internal cleanups and rewrites
Many tnx to those people who helped making this:
Belugas, DaleStan, glx, KUDr, RichK67, Rubidium, and TrueLight (alfabetic)
Many tnx to those who helped testing:
Arnau, Bjarni, and tokai (alfabetic)
And to all other people who helped testing and sending comments / bugs
Stats: 673 lines changed, 3534 new lines, 79 new strings
2006-08-19 10:00:30 +00:00
DEF_CONSOLE_CMD ( ConGetSeed )
2004-12-04 17:54:56 +00:00
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
(svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
- New optional landscape generator (TerraGenesis Perlin)
- Load heightmaps (either BMP or PNG)
- Progress dialog while generating worlds (no longer a 'hanging' screen)
- New dialogs for NewGame, Create Scenario and Play Heightmap
- Easier to configure your landscape
- More things to configure (tree-placer, ..)
- Speedup of world generation
- New console command 'restart': restart the map EXACTLY as it was when you
first started it (needs a game made after or with this commit)
- New console command 'getseed': get the seed of your map and share it with
others (of course only works with generated maps)
- Many new, world generation related, things
- Many internal cleanups and rewrites
Many tnx to those people who helped making this:
Belugas, DaleStan, glx, KUDr, RichK67, Rubidium, and TrueLight (alfabetic)
Many tnx to those who helped testing:
Arnau, Bjarni, and tokai (alfabetic)
And to all other people who helped testing and sending comments / bugs
Stats: 673 lines changed, 3534 new lines, 79 new strings
2006-08-19 10:00:30 +00:00
IConsoleHelp ( " Returns the seed used to create this game. Usage: 'getseed' " ) ;
IConsoleHelp ( " The seed can be used to reproduce the exact same map as the game started with. " ) ;
2005-05-02 15:52:19 +00:00
return true ;
}
2008-05-29 15:13:28 +00:00
IConsolePrintF ( CC_DEFAULT , " Generation Seed: %u " , _settings_game . game_creation . generation_seed ) ;
2005-05-02 15:52:19 +00:00
return true ;
2004-09-12 21:49:38 +00:00
}
2007-06-13 14:52:41 +00:00
DEF_CONSOLE_CMD ( ConGetDate )
{
if ( argc = = 0 ) {
IConsoleHelp ( " Returns the current date (day-month-year) of the game. Usage: 'getdate' " ) ;
return true ;
}
YearMonthDay ymd ;
ConvertDateToYMD ( _date , & ymd ) ;
2008-05-24 10:35:15 +00:00
IConsolePrintF ( CC_DEFAULT , " Date: %d-%d-%d " , ymd . day , ymd . month + 1 , ymd . year ) ;
2007-06-13 14:52:41 +00:00
return true ;
}
2004-12-13 18:51:08 +00:00
DEF_CONSOLE_CMD ( ConAlias )
{
2005-05-02 15:52:19 +00:00
IConsoleAlias * alias ;
2004-12-13 22:13:02 +00:00
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
IConsoleHelp ( " Add a new alias, or redefine the behaviour of an existing alias . Usage: 'alias <name> <command>' " ) ;
return true ;
}
if ( argc < 3 ) return false ;
2004-12-13 22:13:02 +00:00
alias = IConsoleAliasGet ( argv [ 1 ] ) ;
if ( alias = = NULL ) {
2005-05-02 15:52:19 +00:00
IConsoleAliasRegister ( argv [ 1 ] , argv [ 2 ] ) ;
2004-12-13 22:13:02 +00:00
} else {
free ( alias - > cmdline ) ;
alias - > cmdline = strdup ( argv [ 2 ] ) ;
}
2005-05-02 15:52:19 +00:00
return true ;
2004-12-13 18:51:08 +00:00
}
2004-09-12 21:49:38 +00:00
DEF_CONSOLE_CMD ( ConScreenShot )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
2010-08-15 23:32:36 +00:00
IConsoleHelp ( " Create a screenshot of the game. Usage: 'screenshot [big | giant | no_con] [file name]' " ) ;
IConsoleHelp ( " 'big' makes a zoomed-in screenshot of the visible area, 'giant' makes a screenshot of the "
" whole map, 'no_con' hides the console to create the screenshot. 'big' or 'giant' "
" screenshots are always drawn without console " ) ;
2005-05-02 15:52:19 +00:00
return true ;
}
2005-10-19 19:41:38 +00:00
if ( argc > 3 ) return false ;
2009-11-01 18:15:35 +00:00
ScreenshotType type = SC_VIEWPORT ;
const char * name = NULL ;
2005-05-02 15:52:19 +00:00
2009-11-01 18:15:35 +00:00
if ( argc > 1 ) {
if ( strcmp ( argv [ 1 ] , " big " ) = = 0 ) {
/* screenshot big [filename] */
2010-08-15 23:32:36 +00:00
type = SC_ZOOMEDIN ;
if ( argc > 2 ) name = argv [ 2 ] ;
} else if ( strcmp ( argv [ 1 ] , " giant " ) = = 0 ) {
/* screenshot giant [filename] */
2009-11-01 18:15:35 +00:00
type = SC_WORLD ;
if ( argc > 2 ) name = argv [ 2 ] ;
} else if ( strcmp ( argv [ 1 ] , " no_con " ) = = 0 ) {
/* screenshot no_con [filename] */
2004-09-12 21:49:38 +00:00
IConsoleClose ( ) ;
2009-11-01 18:15:35 +00:00
if ( argc > 2 ) name = argv [ 2 ] ;
} else if ( argc = = 2 ) {
/* screenshot filename */
name = argv [ 1 ] ;
} else {
2009-11-17 23:08:55 +00:00
/* screenshot argv[1] argv[2] - invalid */
2009-11-01 18:15:35 +00:00
return false ;
}
2004-09-19 15:24:45 +00:00
}
2005-10-19 19:41:38 +00:00
2009-12-19 19:21:37 +00:00
MakeScreenshot ( type , name ) ;
2005-05-02 15:52:19 +00:00
return true ;
2004-09-12 21:49:38 +00:00
}
2004-09-14 16:10:20 +00:00
DEF_CONSOLE_CMD ( ConInfoCmd )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
IConsoleHelp ( " Print out debugging information about a command. Usage: 'info_cmd <cmd>' " ) ;
return true ;
}
if ( argc < 2 ) return false ;
2010-06-26 15:12:51 +00:00
const IConsoleCmd * cmd = IConsoleCmdGet ( argv [ 1 ] ) ;
2005-05-02 15:52:19 +00:00
if ( cmd = = NULL ) {
IConsoleError ( " the given command was not found " ) ;
return true ;
2004-09-19 15:24:45 +00:00
}
2005-05-02 15:52:19 +00:00
2008-05-24 10:35:15 +00:00
IConsolePrintF ( CC_DEFAULT , " command name: %s " , cmd - > name ) ;
2009-05-10 17:27:25 +00:00
IConsolePrintF ( CC_DEFAULT , " command proc: %p " , cmd - > proc ) ;
2005-05-02 15:52:19 +00:00
2010-02-10 18:18:08 +00:00
if ( cmd - > hook ! = NULL ) IConsoleWarning ( " command is hooked " ) ;
2005-05-02 15:52:19 +00:00
return true ;
2004-09-12 21:49:38 +00:00
}
DEF_CONSOLE_CMD ( ConDebugLevel )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
2005-05-20 17:59:24 +00:00
IConsoleHelp ( " Get/set the default debugging level for the game. Usage: 'debug_level [<level>]' " ) ;
2005-05-02 15:52:19 +00:00
IConsoleHelp ( " Level can be any combination of names, levels. Eg 'net=5 ms=4'. Remember to enclose it in \" 's " ) ;
return true ;
}
2005-05-20 17:59:24 +00:00
if ( argc > 2 ) return false ;
if ( argc = = 1 ) {
2008-05-24 10:35:15 +00:00
IConsolePrintF ( CC_DEFAULT , " Current debug-level: '%s' " , GetDebugString ( ) ) ;
2006-06-27 21:25:53 +00:00
} else {
SetDebugString ( argv [ 1 ] ) ;
}
2005-05-20 17:59:24 +00:00
2005-05-02 15:52:19 +00:00
return true ;
2004-09-12 21:49:38 +00:00
}
DEF_CONSOLE_CMD ( ConExit )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
IConsoleHelp ( " Exit the game. Usage: 'exit' " ) ;
return true ;
}
2008-05-29 15:13:28 +00:00
if ( _game_mode = = GM_NORMAL & & _settings_client . gui . autosave_on_exit ) DoExitSave ( ) ;
2007-07-23 15:28:02 +00:00
2004-09-12 21:49:38 +00:00
_exit_game = true ;
2005-05-02 15:52:19 +00:00
return true ;
2004-09-12 21:49:38 +00:00
}
2005-05-15 10:40:53 +00:00
DEF_CONSOLE_CMD ( ConPart )
{
if ( argc = = 0 ) {
IConsoleHelp ( " Leave the currently joined/running game (only ingame). Usage: 'part' " ) ;
return true ;
}
if ( _game_mode ! = GM_NORMAL ) return false ;
_switch_mode = SM_MENU ;
return true ;
}
2004-09-12 21:49:38 +00:00
DEF_CONSOLE_CMD ( ConHelp )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 2 ) {
2005-05-02 17:05:59 +00:00
const IConsoleCmd * cmd ;
const IConsoleAlias * alias ;
2005-05-02 15:52:19 +00:00
2010-10-27 20:52:43 +00:00
RemoveUnderscores ( argv [ 1 ] ) ;
2005-05-02 15:52:19 +00:00
cmd = IConsoleCmdGet ( argv [ 1 ] ) ;
2005-07-08 22:25:24 +00:00
if ( cmd ! = NULL ) {
cmd - > proc ( 0 , NULL ) ;
return true ;
}
alias = IConsoleAliasGet ( argv [ 1 ] ) ;
if ( alias ! = NULL ) {
cmd = IConsoleCmdGet ( alias - > cmdline ) ;
if ( cmd ! = NULL ) {
cmd - > proc ( 0 , NULL ) ;
return true ;
}
2008-05-24 10:35:15 +00:00
IConsolePrintF ( CC_ERROR , " ERROR: alias is of special type, please see its execution-line: '%s' " , alias - > cmdline ) ;
2005-07-08 22:25:24 +00:00
return true ;
}
2010-02-10 17:32:39 +00:00
IConsoleError ( " command not found " ) ;
2005-07-08 22:25:24 +00:00
return true ;
}
2005-05-02 15:52:19 +00:00
2008-05-24 10:35:15 +00:00
IConsolePrint ( CC_WARNING , " ---- OpenTTD Console Help ---- " ) ;
IConsolePrint ( CC_DEFAULT , " - commands: [command to list all commands: list_cmds] " ) ;
IConsolePrint ( CC_DEFAULT , " call commands with '<command> <arg2> <arg3>...' " ) ;
IConsolePrint ( CC_DEFAULT , " - to assign strings, or use them as arguments, enclose it within quotes " ) ;
IConsolePrint ( CC_DEFAULT , " like this: '<command> \" string argument with spaces \" ' " ) ;
2010-02-10 17:32:39 +00:00
IConsolePrint ( CC_DEFAULT , " - use 'help <command>' to get specific information " ) ;
2011-04-15 06:20:01 +00:00
IConsolePrint ( CC_DEFAULT , " - scroll console output with shift + (up | down | pageup | pagedown) " ) ;
IConsolePrint ( CC_DEFAULT , " - scroll console input history with the up or down arrows " ) ;
2008-05-24 10:35:15 +00:00
IConsolePrint ( CC_DEFAULT , " " ) ;
2005-05-02 15:52:19 +00:00
return true ;
2004-09-12 21:49:38 +00:00
}
DEF_CONSOLE_CMD ( ConListCommands )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
IConsoleHelp ( " List all registered commands. Usage: 'list_cmds [<pre-filter>]' " ) ;
return true ;
}
2010-06-26 15:12:51 +00:00
for ( const IConsoleCmd * cmd = _iconsole_cmds ; cmd ! = NULL ; cmd = cmd - > next ) {
2010-02-10 13:52:10 +00:00
if ( argv [ 1 ] = = NULL | | strstr ( cmd - > name , argv [ 1 ] ) ! = NULL ) {
2010-03-24 20:43:31 +00:00
if ( cmd - > hook = = NULL | | cmd - > hook ( false ) ! = CHR_HIDE ) IConsolePrintF ( CC_DEFAULT , " %s " , cmd - > name ) ;
2005-05-02 15:52:19 +00:00
}
}
2004-09-12 21:49:38 +00:00
2005-05-02 15:52:19 +00:00
return true ;
2004-09-12 21:49:38 +00:00
}
2004-12-13 18:51:08 +00:00
DEF_CONSOLE_CMD ( ConListAliases )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
IConsoleHelp ( " List all registered aliases. Usage: 'list_aliases [<pre-filter>]' " ) ;
return true ;
}
2004-09-12 21:49:38 +00:00
2010-06-26 15:12:51 +00:00
for ( const IConsoleAlias * alias = _iconsole_aliases ; alias ! = NULL ; alias = alias - > next ) {
2010-02-10 13:52:10 +00:00
if ( argv [ 1 ] = = NULL | | strstr ( alias - > name , argv [ 1 ] ) ! = NULL ) {
2008-05-24 10:35:15 +00:00
IConsolePrintF ( CC_DEFAULT , " %s => %s " , alias - > name , alias - > cmdline ) ;
2010-02-10 13:52:10 +00:00
}
2005-05-02 15:52:19 +00:00
}
2004-09-12 21:49:38 +00:00
2005-05-02 15:52:19 +00:00
return true ;
2004-09-12 21:49:38 +00:00
}
2012-12-09 16:53:41 +00:00
DEF_CONSOLE_CMD ( ConCompanies )
2004-12-04 17:54:56 +00:00
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
2012-12-09 16:53:41 +00:00
IConsoleHelp ( " List the details of all companies in the game. Usage 'companies' " ) ;
2005-05-02 15:52:19 +00:00
return true ;
}
2012-12-09 16:53:41 +00:00
Company * c ;
FOR_ALL_COMPANIES ( c ) {
/* Grab the company name */
char company_name [ 512 ] ;
SetDParam ( 0 , c - > index ) ;
GetString ( company_name , STR_COMPANY_NAME , lastof ( company_name ) ) ;
2005-05-02 15:52:19 +00:00
2012-12-09 16:53:41 +00:00
const char * password_state = " " ;
if ( c - > is_ai ) {
password_state = " AI " ;
}
# ifdef ENABLE_NETWORK
else if ( _network_server ) {
password_state = StrEmpty ( _network_company_states [ c - > index ] . password ) ? " unprotected " : " protected " ;
}
# endif
char colour [ 512 ] ;
GetString ( colour , STR_COLOUR_DARK_BLUE + _company_colours [ c - > index ] , lastof ( colour ) ) ;
IConsolePrintF ( CC_INFO , " #:%d(%s) Company Name: '%s' Year Founded: %d Money: " OTTD_PRINTF64 " Loan: " OTTD_PRINTF64 " Value: " OTTD_PRINTF64 " (T:%d, R:%d, P:%d, S:%d) %s " ,
c - > index + 1 , colour , company_name ,
c - > inaugurated_year , ( int64 ) c - > money , ( int64 ) c - > current_loan , ( int64 ) CalculateCompanyValue ( c ) ,
c - > group_all [ VEH_TRAIN ] . num_vehicle ,
c - > group_all [ VEH_ROAD ] . num_vehicle ,
c - > group_all [ VEH_AIRCRAFT ] . num_vehicle ,
c - > group_all [ VEH_SHIP ] . num_vehicle ,
password_state ) ;
2006-06-27 21:25:53 +00:00
}
2005-05-02 15:52:19 +00:00
return true ;
2004-12-04 17:54:56 +00:00
}
2012-12-09 16:53:41 +00:00
# ifdef ENABLE_NETWORK
DEF_CONSOLE_CMD ( ConSay )
2006-05-11 14:08:03 +00:00
{
if ( argc = = 0 ) {
2012-12-09 16:53:41 +00:00
IConsoleHelp ( " Chat to your fellow players in a multiplayer game. Usage: 'say \" <msg> \" ' " ) ;
2006-05-11 14:08:03 +00:00
return true ;
}
2006-05-14 23:01:11 +00:00
2012-12-09 16:53:41 +00:00
if ( argc ! = 2 ) return false ;
2007-05-02 19:00:59 +00:00
2012-12-09 16:53:41 +00:00
if ( ! _network_server ) {
NetworkClientSendChat ( NETWORK_ACTION_CHAT , DESTTYPE_BROADCAST , 0 /* param does not matter */ , argv [ 1 ] ) ;
} else {
bool from_admin = ( _redirect_console_to_admin < INVALID_ADMIN_ID ) ;
NetworkServerSendChat ( NETWORK_ACTION_CHAT , DESTTYPE_BROADCAST , 0 , argv [ 1 ] , CLIENT_ID_SERVER , from_admin ) ;
2006-05-11 14:08:03 +00:00
}
return true ;
}
2008-09-30 20:39:50 +00:00
DEF_CONSOLE_CMD ( ConSayCompany )
2004-12-04 17:54:56 +00:00
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
2008-09-30 20:39:50 +00:00
IConsoleHelp ( " Chat to a certain company in a multiplayer game. Usage: 'say_company <company-no> \" <msg> \" ' " ) ;
IConsoleHelp ( " CompanyNo is the company that plays as company <companyno>, 1 through max_companies " ) ;
2005-05-02 15:52:19 +00:00
return true ;
}
if ( argc ! = 3 ) return false ;
2004-12-04 17:54:56 +00:00
2008-09-30 20:39:50 +00:00
CompanyID company_id = ( CompanyID ) ( atoi ( argv [ 1 ] ) - 1 ) ;
2009-05-17 01:00:56 +00:00
if ( ! Company : : IsValidID ( company_id ) ) {
2008-09-30 20:39:50 +00:00
IConsolePrintF ( CC_DEFAULT , " Unknown company. Company range is between 1 and %d. " , MAX_COMPANIES ) ;
2005-05-02 15:52:19 +00:00
return true ;
}
if ( ! _network_server ) {
2008-09-30 20:39:50 +00:00
NetworkClientSendChat ( NETWORK_ACTION_CHAT_COMPANY , DESTTYPE_TEAM , company_id , argv [ 2 ] ) ;
2006-06-27 21:25:53 +00:00
} else {
2010-10-17 17:41:52 +00:00
bool from_admin = ( _redirect_console_to_admin < INVALID_ADMIN_ID ) ;
NetworkServerSendChat ( NETWORK_ACTION_CHAT_COMPANY , DESTTYPE_TEAM , company_id , argv [ 2 ] , CLIENT_ID_SERVER , from_admin ) ;
2006-06-27 21:25:53 +00:00
}
2005-05-02 15:52:19 +00:00
return true ;
2004-12-04 17:54:56 +00:00
}
DEF_CONSOLE_CMD ( ConSayClient )
{
2005-05-02 15:52:19 +00:00
if ( argc = = 0 ) {
2008-09-30 20:39:50 +00:00
IConsoleHelp ( " Chat to a certain client in a multiplayer game. Usage: 'say_client <client-no> \" <msg> \" ' " ) ;
2005-07-08 22:25:24 +00:00
IConsoleHelp ( " For client-id's, see the command 'clients' " ) ;
2005-05-02 15:52:19 +00:00
return true ;
}
if ( argc ! = 3 ) return false ;
if ( ! _network_server ) {
2008-05-30 18:20:26 +00:00
NetworkClientSendChat ( NETWORK_ACTION_CHAT_CLIENT , DESTTYPE_CLIENT , atoi ( argv [ 1 ] ) , argv [ 2 ] ) ;
2006-06-27 21:25:53 +00:00
} else {
2010-10-17 17:41:52 +00:00
bool from_admin = ( _redirect_console_to_admin < INVALID_ADMIN_ID ) ;
NetworkServerSendChat ( NETWORK_ACTION_CHAT_CLIENT , DESTTYPE_CLIENT , atoi ( argv [ 1 ] ) , argv [ 2 ] , CLIENT_ID_SERVER , from_admin ) ;
2006-06-27 21:25:53 +00:00
}
2005-05-02 15:52:19 +00:00
return true ;
2004-12-04 17:54:56 +00:00
}
2010-02-10 15:17:27 +00:00
DEF_CONSOLE_CMD ( ConCompanyPassword )
2005-05-02 15:52:19 +00:00
{
if ( argc = = 0 ) {
2011-01-19 16:52:57 +00:00
const char * helpmsg ;
if ( _network_dedicated ) {
helpmsg = " Change the password of a company. Usage: 'company_pw <company-no> \" <password> \" " ;
} else if ( _network_server ) {
helpmsg = " Change the password of your or any other company. Usage: 'company_pw [<company-no>] \" <password> \" ' " ;
} else {
helpmsg = " Change the password of your company. Usage: 'company_pw \" <password> \" ' " ;
}
IConsoleHelp ( helpmsg ) ;
2008-12-22 18:20:28 +00:00
IConsoleHelp ( " Use \" * \" to disable the password. " ) ;
2005-05-02 15:52:19 +00:00
return true ;
2004-12-04 17:54:56 +00:00
}
2011-01-19 16:52:57 +00:00
CompanyID company_id ;
const char * password ;
const char * errormsg ;
if ( argc = = 2 ) {
company_id = _local_company ;
password = argv [ 1 ] ;
errormsg = " You have to own a company to make use of this command. " ;
} else if ( argc = = 3 & & _network_server ) {
company_id = ( CompanyID ) ( atoi ( argv [ 1 ] ) - 1 ) ;
password = argv [ 2 ] ;
errormsg = " You have to specify the ID of a valid human controlled company. " ;
} else {
return false ;
}
2010-02-10 15:17:27 +00:00
2011-01-19 16:52:57 +00:00
if ( ! Company : : IsValidHumanID ( company_id ) ) {
IConsoleError ( errormsg ) ;
2005-05-02 15:52:19 +00:00
return false ;
2005-01-15 20:09:16 +00:00
}
2011-08-13 08:32:55 +00:00
password = NetworkChangeCompanyPassword ( company_id , password ) ;
2004-12-13 15:07:33 +00:00
2010-02-10 15:17:27 +00:00
if ( StrEmpty ( password ) ) {
IConsolePrintF ( CC_WARNING , " Company password cleared " ) ;
2007-12-02 15:12:19 +00:00
} else {
2010-02-10 15:17:27 +00:00
IConsolePrintF ( CC_WARNING , " Company password changed to: %s " , password ) ;
2007-12-02 15:12:19 +00:00
}
2005-05-02 15:52:19 +00:00
return true ;
}
2004-12-04 17:54:56 +00:00
2009-05-24 17:49:08 +00:00
/* Content downloading only is available with ZLIB */
# if defined(WITH_ZLIB)
2009-01-21 09:22:49 +00:00
# include "network/network_content.h"
/** Resolve a string to a content type. */
static ContentType StringToContentType ( const char * str )
{
2009-09-20 23:11:01 +00:00
static const char * const inv_lookup [ ] = { " " , " base " , " newgrf " , " ai " , " ailib " , " scenario " , " heightmap " } ;
2009-01-21 09:22:49 +00:00
for ( uint i = 1 /* there is no type 0 */ ; i < lengthof ( inv_lookup ) ; i + + ) {
if ( strcasecmp ( str , inv_lookup [ i ] ) = = 0 ) return ( ContentType ) i ;
}
return CONTENT_TYPE_END ;
}
/** Asynchronous callback */
struct ConsoleContentCallback : public ContentCallback {
void OnConnect ( bool success )
{
IConsolePrintF ( CC_DEFAULT , " Content server connection %s " , success ? " established " : " failed " ) ;
}
void OnDisconnect ( )
{
IConsolePrintF ( CC_DEFAULT , " Content server connection closed " ) ;
}
void OnDownloadComplete ( ContentID cid )
{
IConsolePrintF ( CC_DEFAULT , " Completed download of %d " , cid ) ;
}
} ;
DEF_CONSOLE_CMD ( ConContent )
{
static ContentCallback * cb = NULL ;
if ( cb = = NULL ) {
cb = new ConsoleContentCallback ( ) ;
_network_content_client . AddCallback ( cb ) ;
}
if ( argc < = 1 ) {
IConsoleHelp ( " Query, select and download content. Usage: 'content update|upgrade|select [all|id]|unselect [all|id]|state|download' " ) ;
IConsoleHelp ( " update: get a new list of downloadable content; must be run first " ) ;
IConsoleHelp ( " upgrade: select all items that are upgrades " ) ;
2009-01-24 14:02:21 +00:00
IConsoleHelp ( " select: select a specific item given by its id or 'all' to select all " ) ;
IConsoleHelp ( " unselect: unselect a specific item given by its id or 'all' to unselect all " ) ;
2009-01-21 09:22:49 +00:00
IConsoleHelp ( " state: show the download/select state of all downloadable content " ) ;
IConsoleHelp ( " download: download all content you've selected " ) ;
return true ;
}
if ( strcasecmp ( argv [ 1 ] , " update " ) = = 0 ) {
_network_content_client . RequestContentList ( ( argc > 2 ) ? StringToContentType ( argv [ 2 ] ) : CONTENT_TYPE_END ) ;
return true ;
}
if ( strcasecmp ( argv [ 1 ] , " upgrade " ) = = 0 ) {
_network_content_client . SelectUpgrade ( ) ;
return true ;
}
if ( strcasecmp ( argv [ 1 ] , " select " ) = = 0 ) {
if ( argc < = 2 ) {
IConsoleError ( " You must enter the id. " ) ;
return false ;
}
if ( strcasecmp ( argv [ 2 ] , " all " ) = = 0 ) {
_network_content_client . SelectAll ( ) ;
} else {
_network_content_client . Select ( ( ContentID ) atoi ( argv [ 2 ] ) ) ;
}
return true ;
}
if ( strcasecmp ( argv [ 1 ] , " unselect " ) = = 0 ) {
if ( argc < = 2 ) {
IConsoleError ( " You must enter the id. " ) ;
return false ;
}
if ( strcasecmp ( argv [ 2 ] , " all " ) = = 0 ) {
_network_content_client . UnselectAll ( ) ;
} else {
_network_content_client . Unselect ( ( ContentID ) atoi ( argv [ 2 ] ) ) ;
}
return true ;
}
if ( strcasecmp ( argv [ 1 ] , " state " ) = = 0 ) {
IConsolePrintF ( CC_WHITE , " id, type, state, name " ) ;
for ( ConstContentIterator iter = _network_content_client . Begin ( ) ; iter ! = _network_content_client . End ( ) ; iter + + ) {
2011-12-19 20:56:59 +00:00
static const char * const types [ ] = { " Base graphics " , " NewGRF " , " AI " , " AI library " , " Scenario " , " Heightmap " , " Base sound " , " Base music " , " Game script " , " GS library " } ;
2009-12-12 21:56:13 +00:00
assert_compile ( lengthof ( types ) = = CONTENT_TYPE_END - CONTENT_TYPE_BEGIN ) ;
2009-10-02 15:13:15 +00:00
static const char * const states [ ] = { " Not selected " , " Selected " , " Dep Selected " , " Installed " , " Unknown " } ;
2011-01-03 12:01:41 +00:00
static const TextColour state_to_colour [ ] = { CC_COMMAND , CC_INFO , CC_INFO , CC_WHITE , CC_ERROR } ;
2009-01-21 09:22:49 +00:00
const ContentInfo * ci = * iter ;
2012-11-13 21:46:09 +00:00
char buf [ sizeof ( ci - > md5sum ) * 2 + 1 ] ;
md5sumToString ( buf , lastof ( buf ) , ci - > md5sum ) ;
IConsolePrintF ( state_to_colour [ ci - > state ] , " %d, %s, %s, %s, %08X, %s " , ci - > id , types [ ci - > type - 1 ] , states [ ci - > state ] , ci - > name , ci - > unique_id , buf ) ;
2009-01-21 09:22:49 +00:00
}
return true ;
}
if ( strcasecmp ( argv [ 1 ] , " download " ) = = 0 ) {
uint files ;
uint bytes ;
_network_content_client . DownloadSelectedContent ( files , bytes ) ;
IConsolePrintF ( CC_DEFAULT , " Downloading %d file(s) (%d bytes) " , files , bytes ) ;
return true ;
}
return false ;
}
2009-05-24 17:49:08 +00:00
# endif /* defined(WITH_ZLIB) */
2006-09-17 11:33:19 +00:00
# endif /* ENABLE_NETWORK */
2004-12-16 13:59:23 +00:00
2009-02-08 12:25:13 +00:00
DEF_CONSOLE_CMD ( ConSetting )
2005-05-02 15:52:19 +00:00
{
if ( argc = = 0 ) {
2009-02-08 12:25:13 +00:00
IConsoleHelp ( " Change setting for all clients. Usage: 'setting <name> [<value>]' " ) ;
IConsoleHelp ( " Omitting <value> will print out the current value of the setting. " ) ;
2005-05-02 15:52:19 +00:00
return true ;
2004-12-16 13:59:23 +00:00
}
2005-05-02 15:52:19 +00:00
if ( argc = = 1 | | argc > 3 ) return false ;
2004-12-16 13:59:23 +00:00
2005-05-02 15:52:19 +00:00
if ( argc = = 2 ) {
2009-02-08 12:25:13 +00:00
IConsoleGetSetting ( argv [ 1 ] ) ;
2006-06-27 21:25:53 +00:00
} else {
2009-02-08 12:25:13 +00:00
IConsoleSetSetting ( argv [ 1 ] , argv [ 2 ] ) ;
2006-06-27 21:25:53 +00:00
}
2004-12-23 17:37:26 +00:00
2005-05-02 15:52:19 +00:00
return true ;
}
2004-12-13 15:07:33 +00:00
2010-01-28 23:17:28 +00:00
DEF_CONSOLE_CMD ( ConSettingNewgame )
{
if ( argc = = 0 ) {
IConsoleHelp ( " Change setting for the next game. Usage: 'setting_newgame <name> [<value>]' " ) ;
IConsoleHelp ( " Omitting <value> will print out the current value of the setting. " ) ;
return true ;
}
if ( argc = = 1 | | argc > 3 ) return false ;
if ( argc = = 2 ) {
IConsoleGetSetting ( argv [ 1 ] , true ) ;
} else {
IConsoleSetSetting ( argv [ 1 ] , argv [ 2 ] , true ) ;
}
return true ;
}
2009-02-08 12:25:13 +00:00
DEF_CONSOLE_CMD ( ConListSettings )
2007-04-05 12:59:57 +00:00
{
if ( argc = = 0 ) {
2009-02-08 12:25:13 +00:00
IConsoleHelp ( " List settings. Usage: 'list_settings [<pre-filter>]' " ) ;
2007-04-05 12:59:57 +00:00
return true ;
}
2008-08-11 17:15:31 +00:00
if ( argc > 2 ) return false ;
2007-04-05 12:59:57 +00:00
2009-02-08 12:25:13 +00:00
IConsoleListSettings ( ( argc = = 2 ) ? argv [ 1 ] : NULL ) ;
2007-04-05 12:59:57 +00:00
return true ;
}
2008-06-03 18:35:58 +00:00
DEF_CONSOLE_CMD ( ConGamelogPrint )
{
GamelogPrintConsole ( ) ;
return true ;
}
2004-12-04 17:54:56 +00:00
2010-03-24 20:47:03 +00:00
DEF_CONSOLE_CMD ( ConNewGRFReload )
{
if ( argc = = 0 ) {
IConsoleHelp ( " Reloads all active NewGRFs from disk. Equivalent to reapplying NewGRFs via the settings, but without asking for confirmation. This might crash OpenTTD! " ) ;
return true ;
}
ReloadNewGRFData ( ) ;
return true ;
}
2004-09-12 21:49:38 +00:00
# ifdef _DEBUG
2010-02-10 17:32:39 +00:00
/******************
* debug commands
* * * * * * * * * * * * * * * * * */
2004-09-12 21:49:38 +00:00
2007-03-07 11:47:46 +00:00
static void IConsoleDebugLibRegister ( )
2004-09-12 21:49:38 +00:00
{
2005-05-02 15:52:19 +00:00
IConsoleCmdRegister ( " resettile " , ConResetTile ) ;
IConsoleAliasRegister ( " dbg_echo " , " echo %A; echo %B " ) ;
IConsoleAliasRegister ( " dbg_echo2 " , " echo %! " ) ;
2004-09-12 21:49:38 +00:00
}
# endif
2010-02-10 17:32:39 +00:00
/*******************************
* console command registration
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2004-09-12 21:49:38 +00:00
2007-03-07 11:47:46 +00:00
void IConsoleStdLibRegister ( )
2004-09-12 21:49:38 +00:00
{
2004-09-19 15:24:45 +00:00
IConsoleCmdRegister ( " debug_level " , ConDebugLevel ) ;
IConsoleCmdRegister ( " echo " , ConEcho ) ;
IConsoleCmdRegister ( " echoc " , ConEchoC ) ;
IConsoleCmdRegister ( " exec " , ConExec ) ;
IConsoleCmdRegister ( " exit " , ConExit ) ;
2005-05-15 10:40:53 +00:00
IConsoleCmdRegister ( " part " , ConPart ) ;
2004-09-19 15:24:45 +00:00
IConsoleCmdRegister ( " help " , ConHelp ) ;
IConsoleCmdRegister ( " info_cmd " , ConInfoCmd ) ;
IConsoleCmdRegister ( " list_cmds " , ConListCommands ) ;
2005-05-02 15:52:19 +00:00
IConsoleCmdRegister ( " list_aliases " , ConListAliases ) ;
IConsoleCmdRegister ( " newgame " , ConNewGame ) ;
(svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
- New optional landscape generator (TerraGenesis Perlin)
- Load heightmaps (either BMP or PNG)
- Progress dialog while generating worlds (no longer a 'hanging' screen)
- New dialogs for NewGame, Create Scenario and Play Heightmap
- Easier to configure your landscape
- More things to configure (tree-placer, ..)
- Speedup of world generation
- New console command 'restart': restart the map EXACTLY as it was when you
first started it (needs a game made after or with this commit)
- New console command 'getseed': get the seed of your map and share it with
others (of course only works with generated maps)
- Many new, world generation related, things
- Many internal cleanups and rewrites
Many tnx to those people who helped making this:
Belugas, DaleStan, glx, KUDr, RichK67, Rubidium, and TrueLight (alfabetic)
Many tnx to those who helped testing:
Arnau, Bjarni, and tokai (alfabetic)
And to all other people who helped testing and sending comments / bugs
Stats: 673 lines changed, 3534 new lines, 79 new strings
2006-08-19 10:00:30 +00:00
IConsoleCmdRegister ( " restart " , ConRestart ) ;
IConsoleCmdRegister ( " getseed " , ConGetSeed ) ;
2007-06-13 14:52:41 +00:00
IConsoleCmdRegister ( " getdate " , ConGetDate ) ;
2004-09-19 15:24:45 +00:00
IConsoleCmdRegister ( " quit " , ConExit ) ;
2010-02-10 18:18:08 +00:00
IConsoleCmdRegister ( " resetengines " , ConResetEngines , ConHookNoNetwork ) ;
2011-02-05 16:07:23 +00:00
IConsoleCmdRegister ( " reset_enginepool " , ConResetEnginePool , ConHookNoNetwork ) ;
2005-05-02 15:52:19 +00:00
IConsoleCmdRegister ( " return " , ConReturn ) ;
IConsoleCmdRegister ( " screenshot " , ConScreenShot ) ;
IConsoleCmdRegister ( " script " , ConScript ) ;
IConsoleCmdRegister ( " scrollto " , ConScrollToTile ) ;
2005-07-08 22:25:24 +00:00
IConsoleCmdRegister ( " alias " , ConAlias ) ;
IConsoleCmdRegister ( " load " , ConLoad ) ;
2005-09-11 14:57:56 +00:00
IConsoleCmdRegister ( " rm " , ConRemove ) ;
2005-07-08 22:25:24 +00:00
IConsoleCmdRegister ( " save " , ConSave ) ;
2007-01-03 18:06:50 +00:00
IConsoleCmdRegister ( " saveconfig " , ConSaveConfig ) ;
2005-05-02 15:52:19 +00:00
IConsoleCmdRegister ( " ls " , ConListFiles ) ;
IConsoleCmdRegister ( " cd " , ConChangeDirectory ) ;
IConsoleCmdRegister ( " pwd " , ConPrintWorkingDirectory ) ;
2005-05-16 13:46:26 +00:00
IConsoleCmdRegister ( " clear " , ConClearBuffer ) ;
2009-02-08 12:25:13 +00:00
IConsoleCmdRegister ( " setting " , ConSetting ) ;
2010-01-28 23:17:28 +00:00
IConsoleCmdRegister ( " setting_newgame " , ConSettingNewgame ) ;
2009-02-08 12:25:13 +00:00
IConsoleCmdRegister ( " list_settings " , ConListSettings ) ;
2008-06-03 18:35:58 +00:00
IConsoleCmdRegister ( " gamelog " , ConGamelogPrint ) ;
2010-08-03 12:54:19 +00:00
IConsoleCmdRegister ( " rescan_newgrf " , ConRescanNewGRF ) ;
2005-05-02 15:52:19 +00:00
2009-02-08 12:25:13 +00:00
IConsoleAliasRegister ( " dir " , " ls " ) ;
IConsoleAliasRegister ( " del " , " rm %+ " ) ;
IConsoleAliasRegister ( " newmap " , " newgame " ) ;
IConsoleAliasRegister ( " patch " , " setting %+ " ) ;
2009-02-08 12:42:45 +00:00
IConsoleAliasRegister ( " set " , " setting %+ " ) ;
2010-01-28 23:17:28 +00:00
IConsoleAliasRegister ( " set_newgame " , " setting_newgame %+ " ) ;
2009-02-08 12:25:13 +00:00
IConsoleAliasRegister ( " list_patches " , " list_settings %+ " ) ;
2010-02-10 17:01:03 +00:00
IConsoleAliasRegister ( " developer " , " setting developer %+ " ) ;
2009-02-08 12:25:13 +00:00
2011-01-03 14:52:30 +00:00
IConsoleCmdRegister ( " list_ai_libs " , ConListAILibs ) ;
2010-02-10 16:24:05 +00:00
IConsoleCmdRegister ( " list_ai " , ConListAI ) ;
IConsoleCmdRegister ( " reload_ai " , ConReloadAI ) ;
IConsoleCmdRegister ( " rescan_ai " , ConRescanAI ) ;
IConsoleCmdRegister ( " start_ai " , ConStartAI ) ;
IConsoleCmdRegister ( " stop_ai " , ConStopAI ) ;
2004-12-05 12:25:25 +00:00
2011-12-19 20:55:56 +00:00
IConsoleCmdRegister ( " list_game " , ConListGame ) ;
2011-12-19 20:56:59 +00:00
IConsoleCmdRegister ( " list_game_libs " , ConListGameLibs ) ;
2011-12-21 12:25:17 +00:00
IConsoleCmdRegister ( " rescan_game " , ConRescanGame ) ;
2011-12-19 20:55:56 +00:00
2012-12-09 16:53:41 +00:00
IConsoleCmdRegister ( " companies " , ConCompanies ) ;
IConsoleAliasRegister ( " players " , " companies " ) ;
2010-02-10 17:32:39 +00:00
/* networking functions */
2004-12-04 17:54:56 +00:00
# ifdef ENABLE_NETWORK
2009-05-24 17:49:08 +00:00
/* Content downloading is only available with ZLIB */
# if defined(WITH_ZLIB)
2009-01-21 09:22:49 +00:00
IConsoleCmdRegister ( " content " , ConContent ) ;
2009-05-24 17:49:08 +00:00
# endif /* defined(WITH_ZLIB) */
2006-01-25 18:40:12 +00:00
2005-05-02 15:52:19 +00:00
/*** Networking commands ***/
2010-02-10 18:18:08 +00:00
IConsoleCmdRegister ( " say " , ConSay , ConHookNeedNetwork ) ;
IConsoleCmdRegister ( " say_company " , ConSayCompany , ConHookNeedNetwork ) ;
2008-09-30 20:39:50 +00:00
IConsoleAliasRegister ( " say_player " , " say_company %+ " ) ;
2010-02-10 18:18:08 +00:00
IConsoleCmdRegister ( " say_client " , ConSayClient , ConHookNeedNetwork ) ;
IConsoleCmdRegister ( " connect " , ConNetworkConnect , ConHookClientOnly ) ;
IConsoleCmdRegister ( " clients " , ConNetworkClients , ConHookNeedNetwork ) ;
IConsoleCmdRegister ( " status " , ConStatus , ConHookServerOnly ) ;
IConsoleCmdRegister ( " server_info " , ConServerInfo , ConHookServerOnly ) ;
2006-01-25 18:40:12 +00:00
IConsoleAliasRegister ( " info " , " server_info " ) ;
2010-02-10 18:18:08 +00:00
IConsoleCmdRegister ( " reconnect " , ConNetworkReconnect , ConHookClientOnly ) ;
IConsoleCmdRegister ( " rcon " , ConRcon , ConHookNeedNetwork ) ;
2005-05-02 15:52:19 +00:00
2010-02-10 18:18:08 +00:00
IConsoleCmdRegister ( " join " , ConJoinCompany , ConHookNeedNetwork ) ;
2009-01-23 22:18:06 +00:00
IConsoleAliasRegister ( " spectate " , " join 255 " ) ;
2010-02-10 18:18:08 +00:00
IConsoleCmdRegister ( " move " , ConMoveClient , ConHookServerOnly ) ;
IConsoleCmdRegister ( " reset_company " , ConResetCompany , ConHookServerOnly ) ;
2006-01-25 18:40:12 +00:00
IConsoleAliasRegister ( " clean_company " , " reset_company %A " ) ;
2010-02-10 18:18:08 +00:00
IConsoleCmdRegister ( " client_name " , ConClientNickChange , ConHookServerOnly ) ;
IConsoleCmdRegister ( " kick " , ConKick , ConHookServerOnly ) ;
IConsoleCmdRegister ( " ban " , ConBan , ConHookServerOnly ) ;
IConsoleCmdRegister ( " unban " , ConUnBan , ConHookServerOnly ) ;
IConsoleCmdRegister ( " banlist " , ConBanList , ConHookServerOnly ) ;
IConsoleCmdRegister ( " pause " , ConPauseGame , ConHookServerOnly ) ;
2011-11-15 19:40:42 +00:00
IConsoleCmdRegister ( " unpause " , ConUnpauseGame , ConHookServerOnly ) ;
2010-02-10 18:18:08 +00:00
IConsoleCmdRegister ( " company_pw " , ConCompanyPassword , ConHookNeedNetwork ) ;
2010-02-10 15:26:47 +00:00
IConsoleAliasRegister ( " company_password " , " company_pw %+ " ) ;
2005-05-02 15:52:19 +00:00
2009-02-08 12:25:13 +00:00
IConsoleAliasRegister ( " net_frame_freq " , " setting frame_freq %+ " ) ;
IConsoleAliasRegister ( " net_sync_freq " , " setting sync_freq %+ " ) ;
IConsoleAliasRegister ( " server_pw " , " setting server_password %+ " ) ;
IConsoleAliasRegister ( " server_password " , " setting server_password %+ " ) ;
IConsoleAliasRegister ( " rcon_pw " , " setting rcon_password %+ " ) ;
IConsoleAliasRegister ( " rcon_password " , " setting rcon_password %+ " ) ;
IConsoleAliasRegister ( " name " , " setting client_name %+ " ) ;
IConsoleAliasRegister ( " server_name " , " setting server_name %+ " ) ;
IConsoleAliasRegister ( " server_port " , " setting server_port %+ " ) ;
IConsoleAliasRegister ( " server_advertise " , " setting server_advertise %+ " ) ;
IConsoleAliasRegister ( " max_clients " , " setting max_clients %+ " ) ;
IConsoleAliasRegister ( " max_companies " , " setting max_companies %+ " ) ;
IConsoleAliasRegister ( " max_spectators " , " setting max_spectators %+ " ) ;
IConsoleAliasRegister ( " max_join_time " , " setting max_join_time %+ " ) ;
IConsoleAliasRegister ( " pause_on_join " , " setting pause_on_join %+ " ) ;
IConsoleAliasRegister ( " autoclean_companies " , " setting autoclean_companies %+ " ) ;
IConsoleAliasRegister ( " autoclean_protected " , " setting autoclean_protected %+ " ) ;
IConsoleAliasRegister ( " autoclean_unprotected " , " setting autoclean_unprotected %+ " ) ;
IConsoleAliasRegister ( " restart_game_year " , " setting restart_game_year %+ " ) ;
IConsoleAliasRegister ( " min_players " , " setting min_active_clients %+ " ) ;
IConsoleAliasRegister ( " reload_cfg " , " setting reload_cfg %+ " ) ;
2004-12-04 17:54:56 +00:00
# endif /* ENABLE_NETWORK */
2004-09-12 21:49:38 +00:00
2009-03-15 00:32:18 +00:00
/* debugging stuff */
2004-12-05 12:25:25 +00:00
# ifdef _DEBUG
IConsoleDebugLibRegister ( ) ;
# endif
2010-03-24 20:47:03 +00:00
/* NewGRF development stuff */
IConsoleCmdRegister ( " reload_newgrfs " , ConNewGRFReload , ConHookNewGRFDeveloperTool ) ;
2004-09-12 21:49:38 +00:00
}