darkvater@222: /* -------------------- dont cross this line --------------------- */ darkvater@222: #include "stdafx.h" darkvater@222: #include "ttd.h" darkvater@222: #include "console.h" darkvater@222: #include "engine.h" darkvater@222: #include "functions.h" darkvater@222: #include "variables.h" darkvater@222: darkvater@222: #if defined(WIN32) darkvater@289: # define ENABLE_NETWORK darkvater@222: #endif darkvater@222: darkvater@247: darkvater@247: // ** scriptfile handling ** // darkvater@247: static FILE * _script_file; darkvater@247: static bool _script_running; darkvater@247: darkvater@222: // ** console command / variable defines ** // darkvater@247: darkvater@289: #define DEF_CONSOLE_CMD(yyyy) static _iconsole_var * yyyy(byte argc, char* argv[], byte argt[]) darkvater@222: #define DEF_CONSOLE_CMD_HOOK(yyyy) static bool yyyy(_iconsole_cmd * hookcmd) darkvater@222: #define DEF_CONSOLE_VAR_HOOK(yyyy) static bool yyyy(_iconsole_var * hookvar) darkvater@222: darkvater@247: darkvater@247: // ** supporting functions ** // darkvater@247: darkvater@289: static uint32 GetArgumentInteger(const char* arg) darkvater@222: { darkvater@289: uint32 result; darkvater@289: sscanf(arg, "%u", &result); darkvater@222: darkvater@222: if (result == 0 && arg[0] == '0' && arg[1] == 'x') darkvater@289: sscanf(arg, "%x", &result); darkvater@222: darkvater@222: return result; darkvater@222: } darkvater@222: darkvater@222: /* **************************** */ darkvater@222: /* variable and command hooks */ darkvater@222: /* **************************** */ darkvater@222: darkvater@222: DEF_CONSOLE_CMD_HOOK(ConCmdHookNoNetwork) darkvater@222: { darkvater@222: if (_networking) { darkvater@301: IConsoleError("This command is forbidden in multiplayer."); darkvater@222: return false; darkvater@289: } darkvater@222: return true; darkvater@222: } darkvater@222: darkvater@222: #if 0 /* Not used atm */ darkvater@222: DEF_CONSOLE_VAR_HOOK(ConVarHookNoNetwork) darkvater@222: { darkvater@222: if (_networking) { darkvater@301: IConsoleError("This variable is forbidden in multiplayer."); darkvater@222: return false; darkvater@289: } darkvater@222: return true; darkvater@222: } darkvater@222: #endif darkvater@222: darkvater@222: DEF_CONSOLE_VAR_HOOK(ConVarHookNoNetClient) darkvater@222: { darkvater@222: if (!_networking_server) { darkvater@301: IConsoleError("This variable only makes sense for a network server."); darkvater@222: return false; darkvater@289: } darkvater@222: return true; darkvater@222: } darkvater@222: darkvater@222: /* **************************** */ darkvater@222: /* reset commands */ darkvater@222: /* **************************** */ darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConResetEngines) darkvater@222: { darkvater@222: StartupEngines(); darkvater@222: return 0; darkvater@222: } darkvater@222: darkvater@289: #ifdef _DEBUG darkvater@222: DEF_CONSOLE_CMD(ConResetTile) darkvater@222: { darkvater@222: if (argc == 2) { darkvater@222: TileIndex tile = (TileIndex)GetArgumentInteger(argv[1]); darkvater@222: DoClearSquare(tile); darkvater@222: } darkvater@222: darkvater@222: return 0; darkvater@222: } darkvater@289: #endif darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConScrollToTile) darkvater@222: { darkvater@222: if (argc == 2) { darkvater@222: TileIndex tile = (TileIndex)GetArgumentInteger(argv[1]); darkvater@222: ScrollMainWindowToTile(tile); darkvater@222: } darkvater@222: darkvater@222: return 0; darkvater@222: } darkvater@222: darkvater@222: // ********************************* // darkvater@222: // * Network Core Console Commands * // darkvater@222: // ********************************* // darkvater@222: #ifdef ENABLE_NETWORK darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConNetworkConnect) darkvater@222: { darkvater@289: char* ip; darkvater@289: const char *port = NULL; darkvater@289: const char *player = NULL; darkvater@222: uint16 rport; darkvater@222: darkvater@222: if (argc<2) return NULL; darkvater@222: darkvater@228: ip = argv[1]; darkvater@222: rport = _network_server_port; darkvater@222: darkvater@228: ParseConnectionString(&player, &port, ip); darkvater@222: darkvater@289: IConsolePrintF(_iconsole_color_default, "Connecting to %s...", ip); darkvater@222: if (player!=NULL) { darkvater@222: _network_playas = atoi(player); darkvater@289: IConsolePrintF(_iconsole_color_default, " player-no: %s", player); darkvater@222: } darkvater@222: if (port!=NULL) { darkvater@222: rport = atoi(port); darkvater@289: IConsolePrintF(_iconsole_color_default, " port: %s", port); darkvater@222: } darkvater@222: darkvater@228: NetworkCoreConnectGame(ip, rport); darkvater@222: darkvater@222: return NULL; darkvater@222: } darkvater@222: darkvater@222: #endif darkvater@222: darkvater@247: /* ******************************** */ darkvater@247: /* script file console commands */ darkvater@247: /* ******************************** */ darkvater@247: darkvater@247: DEF_CONSOLE_CMD(ConExec) darkvater@247: { darkvater@247: char cmd[1024]; darkvater@247: bool doerror; darkvater@247: darkvater@247: if (argc<2) return NULL; darkvater@247: darkvater@247: doerror = true; darkvater@289: _script_file = fopen(argv[1], "rb"); darkvater@247: darkvater@247: if (_script_file == NULL) { darkvater@247: if (argc>2) if (atoi(argv[2])==0) doerror=false; darkvater@247: if (doerror) IConsoleError("script file not found"); darkvater@247: return NULL; darkvater@247: } darkvater@247: darkvater@247: _script_running = true; darkvater@247: darkvater@247: while (!feof(_script_file) && _script_running) { darkvater@289: fgets(cmd, sizeof(cmd), _script_file); darkvater@289: IConsoleCmdExec(cmd); darkvater@247: } darkvater@247: darkvater@247: _script_running = false; darkvater@247: fclose(_script_file); darkvater@247: return NULL; darkvater@247: } darkvater@247: darkvater@247: DEF_CONSOLE_CMD(ConReturn) darkvater@247: { darkvater@247: _script_running = false; darkvater@247: return NULL; darkvater@247: } darkvater@247: darkvater@222: /* **************************** */ darkvater@222: /* default console commands */ darkvater@222: /* **************************** */ darkvater@222: darkvater@247: DEF_CONSOLE_CMD(ConScript) darkvater@247: { darkvater@247: extern FILE* _iconsole_output_file; darkvater@289: if (_iconsole_output_file != NULL) { darkvater@289: IConsolePrintF(_iconsole_color_default, "file output complete"); darkvater@247: fclose(_iconsole_output_file); darkvater@247: } else { darkvater@289: if (argc < 2) return NULL; darkvater@289: IConsolePrintF(_iconsole_color_default, "file output started to: %s", darkvater@289: argv[1]); darkvater@289: _iconsole_output_file = fopen(argv[1], "ab"); darkvater@247: if (_iconsole_output_file == NULL) IConsoleError("could not open file"); darkvater@247: } darkvater@247: return NULL; darkvater@247: } darkvater@247: darkvater@247: darkvater@222: DEF_CONSOLE_CMD(ConEcho) darkvater@222: { darkvater@289: if (argc < 2) return NULL; darkvater@222: IConsolePrint(_iconsole_color_default, argv[1]); darkvater@222: return NULL; darkvater@222: } darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConEchoC) darkvater@222: { darkvater@289: if (argc < 3) return NULL; darkvater@222: IConsolePrint(atoi(argv[1]), argv[2]); darkvater@222: return NULL; darkvater@222: } darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConPrintF) darkvater@222: { darkvater@289: if (argc < 3) return NULL; darkvater@289: IConsolePrintF(_iconsole_color_default, argv[1] , argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14], argv[15], argv[16], argv[17], argv[18], argv[19]); /* XXX ugh... */ darkvater@222: return NULL; darkvater@222: } darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConPrintFC) darkvater@222: { darkvater@289: if (argc < 3) return NULL; darkvater@289: IConsolePrintF(atoi(argv[1]), argv[2] , argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14], argv[15], argv[16], argv[17], argv[18], argv[19]); /* XXX ugh... */ darkvater@222: return NULL; darkvater@222: } darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConScreenShot) darkvater@222: { darkvater@289: if (argc < 2) { darkvater@289: _make_screenshot = 1; darkvater@222: } else { darkvater@289: if (strcmp(argv[1], "big") == 0) darkvater@222: _make_screenshot=2; darkvater@289: if (strcmp(argv[1], "no_con") == 0) { darkvater@222: IConsoleClose(); darkvater@289: _make_screenshot = 1; darkvater@222: } darkvater@289: } darkvater@222: return NULL; darkvater@222: } darkvater@222: signde@229: DEF_CONSOLE_CMD(ConInfoVar) darkvater@222: { darkvater@289: if (argc < 2) return NULL; darkvater@289: if (argt[1] != ICONSOLE_VAR_REFERENCE) { signde@232: IConsoleError("first argument has to be a variable reference"); darkvater@289: } else { darkvater@289: _iconsole_var* item; darkvater@289: item = (_iconsole_var*)argv[1]; darkvater@289: IConsolePrintF(_iconsole_color_default, "var_name: %s", item->name); darkvater@289: IConsolePrintF(_iconsole_color_default, "var_type: %i", item->type); darkvater@289: IConsolePrintF(_iconsole_color_default, "var_addr: %i", item->data.addr); darkvater@289: if (item->_malloc) darkvater@289: IConsolePrintF(_iconsole_color_default, "var_malloc: internal"); darkvater@289: else darkvater@289: IConsolePrintF(_iconsole_color_default, "var_malloc: external"); darkvater@247: if (item->hook_access) IConsoleWarning("var_access hooked"); darkvater@247: if (item->hook_before_change) IConsoleWarning("var_before_change hooked"); signde@229: if (item->hook_after_change) IConsoleWarning("var_after_change hooked"); darkvater@289: } darkvater@222: return NULL; darkvater@247: } darkvater@247: darkvater@247: darkvater@247: DEF_CONSOLE_CMD(ConInfoCmd) darkvater@247: { darkvater@289: if (argc < 2) return NULL; darkvater@289: if (argt[1] != ICONSOLE_VAR_UNKNOWN) { darkvater@247: IConsoleError("first argument has to be a command name"); darkvater@289: } else { darkvater@289: _iconsole_cmd* item; darkvater@247: item = IConsoleCmdGet(argv[1]); darkvater@289: if (item == NULL) { darkvater@247: IConsoleError("the given command was not found"); darkvater@247: return NULL; darkvater@247: } darkvater@289: IConsolePrintF(_iconsole_color_default, "cmd_name: %s", item->name); darkvater@289: IConsolePrintF(_iconsole_color_default, "cmd_addr: %i", item->addr); darkvater@247: if (item->hook_access) IConsoleWarning("cmd_access hooked"); darkvater@247: if (item->hook_before_exec) IConsoleWarning("cmd_before_exec hooked"); darkvater@247: if (item->hook_after_exec) IConsoleWarning("cmd_after_exec hooked"); darkvater@289: } darkvater@247: return NULL; darkvater@222: } darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConDebugLevel) darkvater@222: { darkvater@289: if (argc < 2) return NULL; darkvater@222: SetDebugString(argv[1]); darkvater@222: return NULL; darkvater@222: } darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConExit) darkvater@222: { darkvater@222: _exit_game = true; darkvater@222: return NULL; darkvater@222: } darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConHelp) darkvater@222: { darkvater@289: IConsolePrint(13, " -- console help -- "); darkvater@289: IConsolePrint( 1, " variables: [command to list them: list_vars]"); darkvater@289: IConsolePrint( 1, " *temp_string = \"my little \""); darkvater@289: IConsolePrint( 1, ""); darkvater@289: IConsolePrint( 1, " commands: [command to list them: list_cmds]"); darkvater@289: IConsolePrint( 1, " [command] [\"string argument with spaces\"] [argument 2] ..."); darkvater@289: IConsolePrint( 1, " printf \"%s world\" *temp_string"); darkvater@289: IConsolePrint( 1, ""); darkvater@289: IConsolePrint( 1, " command/variable returning a value into an variable:"); darkvater@289: IConsolePrint( 1, " *temp_uint16 << random"); darkvater@289: IConsolePrint( 1, " *temp_uint16 << *temp_uint16_2"); darkvater@289: IConsolePrint( 1, ""); darkvater@222: return NULL; darkvater@222: } darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConRandom) darkvater@222: { darkvater@289: _iconsole_var* result; darkvater@222: result = IConsoleVarAlloc(ICONSOLE_VAR_UINT16); darkvater@289: IConsoleVarSetValue(result, rand()); darkvater@222: return result; darkvater@222: } darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConListCommands) darkvater@222: { darkvater@289: const _iconsole_cmd* item; darkvater@289: size_t l = 0; darkvater@222: darkvater@289: if (argv[1] != NULL) l = strlen(argv[1]); darkvater@222: darkvater@289: for (item = _iconsole_cmds; item != NULL; item = item->_next) darkvater@289: if (argv[1] == NULL || strncmp(item->name, argv[1], l) == 0) darkvater@289: IConsolePrintF(_iconsole_color_default, "%s", item->name); darkvater@222: darkvater@222: return NULL; darkvater@222: } darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConListVariables) darkvater@222: { darkvater@289: const _iconsole_var* item; darkvater@289: size_t l = 0; darkvater@222: darkvater@289: if (argv[1] != NULL) l = strlen(argv[1]); darkvater@222: darkvater@289: for (item = _iconsole_vars; item != NULL; item = item->_next) darkvater@289: if (argv[1] == NULL || strncmp(item->name, argv[1], l) == 0) darkvater@289: IConsolePrintF(_iconsole_color_default, "%s", item->name); darkvater@222: darkvater@222: return NULL; darkvater@222: } darkvater@222: darkvater@222: DEF_CONSOLE_CMD(ConListDumpVariables) darkvater@222: { darkvater@289: const _iconsole_var* item; darkvater@289: size_t l = 0; darkvater@222: darkvater@289: if (argv[1] != NULL) l = strlen(argv[1]); darkvater@222: darkvater@289: for (item = _iconsole_vars; item != NULL; item = item->_next) darkvater@289: if (argv[1] == NULL || strncmp(item->name, argv[1], l) == 0) darkvater@289: IConsoleVarDump(item, NULL); darkvater@222: darkvater@222: return NULL; darkvater@222: } darkvater@222: darkvater@222: #ifdef _DEBUG darkvater@222: /* ****************************************** */ darkvater@222: /* debug commands and variables */ darkvater@222: /* ****************************************** */ darkvater@222: darkvater@222: void IConsoleDebugLibRegister() darkvater@222: { darkvater@247: // stdlib darkvater@289: extern bool _stdlib_con_developer; /* XXX extern in .c */ darkvater@247: darkvater@289: IConsoleVarRegister("con_developer", &_stdlib_con_developer, ICONSOLE_VAR_BOOLEAN); darkvater@289: IConsoleVarMemRegister("temp_bool", ICONSOLE_VAR_BOOLEAN); darkvater@289: IConsoleVarMemRegister("temp_int16", ICONSOLE_VAR_INT16); darkvater@289: IConsoleVarMemRegister("temp_int32", ICONSOLE_VAR_INT32); darkvater@289: IConsoleVarMemRegister("temp_pointer", ICONSOLE_VAR_POINTER); darkvater@289: IConsoleVarMemRegister("temp_uint16", ICONSOLE_VAR_UINT16); darkvater@289: IConsoleVarMemRegister("temp_uint16_2", ICONSOLE_VAR_UINT16); darkvater@289: IConsoleVarMemRegister("temp_uint32", ICONSOLE_VAR_UINT32); darkvater@289: IConsoleVarMemRegister("temp_string", ICONSOLE_VAR_STRING); darkvater@289: IConsoleVarMemRegister("temp_string2", ICONSOLE_VAR_STRING); darkvater@289: IConsoleCmdRegister("resettile", ConResetTile); darkvater@222: } darkvater@222: #endif darkvater@222: darkvater@222: /* ****************************************** */ darkvater@222: /* console command and variable registration */ darkvater@222: /* ****************************************** */ darkvater@222: darkvater@222: void IConsoleStdLibRegister() darkvater@222: { darkvater@222: // stdlib darkvater@289: extern byte _stdlib_developer; /* XXX extern in .c */ darkvater@222: darkvater@222: #ifdef _DEBUG darkvater@222: IConsoleDebugLibRegister(); darkvater@222: #endif darkvater@222: darkvater@289: // functions [please add them alphabetically] darkvater@222: #ifdef ENABLE_NETWORK darkvater@289: IConsoleCmdRegister("connect", ConNetworkConnect); darkvater@289: IConsoleCmdHook("connect", ICONSOLE_HOOK_ACCESS, ConCmdHookNoNetwork); darkvater@247: #endif darkvater@289: IConsoleCmdRegister("debug_level", ConDebugLevel); darkvater@289: IConsoleCmdRegister("dump_vars", ConListDumpVariables); darkvater@289: IConsoleCmdRegister("echo", ConEcho); darkvater@289: IConsoleCmdRegister("echoc", ConEchoC); darkvater@289: IConsoleCmdRegister("exec", ConExec); darkvater@289: IConsoleCmdRegister("exit", ConExit); darkvater@289: IConsoleCmdRegister("help", ConHelp); darkvater@289: IConsoleCmdRegister("info_cmd", ConInfoCmd); darkvater@289: IConsoleCmdRegister("info_var", ConInfoVar); darkvater@289: IConsoleCmdRegister("list_cmds", ConListCommands); darkvater@289: IConsoleCmdRegister("list_vars", ConListVariables); darkvater@289: IConsoleCmdRegister("printf", ConPrintF); darkvater@289: IConsoleCmdRegister("printfc", ConPrintFC); darkvater@289: IConsoleCmdRegister("quit", ConExit); darkvater@289: IConsoleCmdRegister("random", ConRandom); darkvater@289: IConsoleCmdRegister("resetengines", ConResetEngines); darkvater@289: IConsoleCmdHook("resetengines", ICONSOLE_HOOK_ACCESS, ConCmdHookNoNetwork); darkvater@289: IConsoleCmdRegister("return", ConReturn); darkvater@289: IConsoleCmdRegister("screenshot", ConScreenShot); darkvater@289: IConsoleCmdRegister("script", ConScript); darkvater@289: IConsoleCmdRegister("scrollto", ConScrollToTile); darkvater@222: darkvater@222: // variables [please add them alphabeticaly] darkvater@289: IConsoleVarRegister("developer", &_stdlib_developer, ICONSOLE_VAR_BYTE); darkvater@222: #ifdef ENABLE_NETWORK darkvater@289: IConsoleVarRegister("net_client_timeout", &_network_client_timeout, ICONSOLE_VAR_UINT16); darkvater@289: IConsoleVarHook("*net_client_timeout", ICONSOLE_HOOK_ACCESS, ConVarHookNoNetClient); darkvater@289: IConsoleVarRegister("net_ready_ahead", &_network_ready_ahead, ICONSOLE_VAR_UINT16); darkvater@289: IConsoleVarRegister("net_sync_freq", &_network_sync_freq, ICONSOLE_VAR_UINT16); darkvater@289: IConsoleVarHook("*net_sync_freq", ICONSOLE_HOOK_ACCESS, ConVarHookNoNetClient); darkvater@222: #endif darkvater@222: darkvater@222: darkvater@222: } darkvater@289: /* -------------------- don't cross this line --------------------- */