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