Changeset - r220:dbd559d29b3c
[Not reviewed]
master
0 7 1
signde - 20 years ago 2004-09-12 20:15:18
signde@openttd.org
(svn r221) -Feature: console command and variable hooking
-Fix: added another network.c stub
-Consolecommand: "scrollto <tile>" center main view on <tile> [Darkvater]
-Consolecommand: "resettile <tile>" force bulldoze <tile> without any checks (DEBUG only) [Darkvater]
-Fix: resetengines is hooked to be not available in network games
-Codechange: "connect <connectstr>": the connect command now uses a connectionstring like the network-gui
-Fix: Direct Connect editbox can handle up to max ~35 characters [Darkvater]
8 files changed with 1252 insertions and 971 deletions:
0 comments (0 inline, 0 general)
console.c
Show inline comments
 
@@ -9,7 +9,6 @@
 
#include <stdarg.h>
 
#include "console.h"
 

	
 

	
 
// ** main console ** //
 
static bool _iconsole_inited;
 
static byte* _iconsole_buffer[80];
 
@@ -20,15 +19,19 @@ static byte _iconsole_mode = ICONSOLE_CL
 
static Window *_iconsole_win = NULL;
 
static byte _iconsole_scroll;
 

	
 
// ** main console cmd buffer ** // sign_de: especialy for Celestar :D
 
static byte* _iconsole_cmdbuffer[20];
 
static byte _iconsole_cmdbufferpos;
 

	
 
// ** console cursor ** //
 
static bool _icursor_state;
 
static byte _icursor_rate;
 
static byte _icursor_counter;
 

	
 
// ** stdlib ** //
 
byte _stdlib_developer=1;
 
bool _stdlib_con_developer=false;
 

	
 
// ** main console cmd buffer ** // sign_de: especialy for Celestar :D
 
static byte* _iconsole_cmdbuffer[20];
 
static byte _iconsole_cmdbufferpos;
 

	
 
// ** console window ** //
 
static void IConsoleWndProc(Window *w, WindowEvent *e);
 
static const Widget _iconsole_window_widgets[] = {{WIDGETS_END}};
 
@@ -40,15 +43,6 @@ static const WindowDesc _iconsole_window
 
	IConsoleWndProc,
 
};
 

	
 
// ** console parser ** //
 
static _iconsole_cmd * _iconsole_cmds; // list of registred commands
 
static _iconsole_var * _iconsole_vars; // list of registred vars
 

	
 
// ** console std lib ** //
 
static byte _stdlib_developer=1;
 
static bool _stdlib_con_developer=false;
 
static void IConsoleStdLibRegister();
 

	
 
/* *************** */
 
/*  end of header  */
 
/* *************** */
 
@@ -188,57 +182,58 @@ static void IConsoleWndProc(Window *w, W
 

	
 
void IConsoleInit()
 
{
 
int i;
 
#if defined(WITH_REV)
 
extern char _openttd_revision[];
 
#endif
 
_iconsole_color_default = 1;
 
_iconsole_color_error = 3;
 
_iconsole_color_debug = 5;
 
_iconsole_color_commands = 2;
 
_iconsole_scroll=79;
 
_iconsole_cmdbufferpos=19;
 
_iconsole_inited=true;
 
_iconsole_mode=ICONSOLE_CLOSED;
 
_iconsole_win=NULL;
 
_icursor_state=false;
 
_icursor_rate=5;
 
_icursor_counter=0;
 
for (i=0;i<20;i++) {
 
	_iconsole_cmdbuffer[i]=NULL;
 
	}
 
for (i=0;i<80;i++) {
 
	_iconsole_buffer[i]=NULL;
 
	_iconsole_cbuffer[i]=0;
 
	}
 
IConsoleStdLibRegister();
 
#if defined(WITH_REV)
 
IConsolePrintF(13,"OpenTTD Game Console Revision 3 - %s",_openttd_revision);
 
#else
 
IConsolePrint(13,"OpenTTD Game Console Revision 3");
 
#endif
 
IConsolePrint(12,"---------------------------------");
 
IConsolePrint(12,"use \"help\" for more info");
 
IConsolePrint(12,"");
 
IConsoleClearCommand();
 
IConsoleCmdBufferAdd("");
 
	int i;
 
	#if defined(WITH_REV)
 
	extern char _openttd_revision[];
 
	#endif
 
	_iconsole_color_default = 1;
 
	_iconsole_color_error = 3;
 
	_iconsole_color_debug = 5;
 
	_iconsole_color_commands = 2;
 
	_iconsole_scroll=79;
 
	_iconsole_cmdbufferpos=19;
 
	_iconsole_inited=true;
 
	_iconsole_mode=ICONSOLE_CLOSED;
 
	_iconsole_win=NULL;
 
	_icursor_state=false;
 
	_icursor_rate=5;
 
	_icursor_counter=0;
 
	for (i=0;i<20;i++) {
 
		_iconsole_cmdbuffer[i]=NULL;
 
		}
 
	for (i=0;i<80;i++) {
 
		_iconsole_buffer[i]=NULL;
 
		_iconsole_cbuffer[i]=0;
 
		}
 
	IConsoleStdLibRegister();
 
	#if defined(WITH_REV)
 
	IConsolePrintF(13,"OpenTTD Game Console Revision 3 - %s",_openttd_revision);
 
	#else
 
	IConsolePrint(13,"OpenTTD Game Console Revision 3");
 
	#endif
 
	IConsolePrint(12,"---------------------------------");
 
	IConsolePrint(12,"use \"help\" for more info");
 
	IConsolePrint(12,"");
 
	IConsoleClearCommand();
 
	IConsoleCmdBufferAdd("");
 
}
 

	
 
void IConsoleClear()
 
{
 
int i;
 
for (i=0;i<80;i++) if (_iconsole_buffer[i]!=NULL) {
 
	free(_iconsole_buffer[i]);
 
	}
 
	int i;
 
	for (i=0;i<80;i++) if (_iconsole_buffer[i]!=NULL) {
 
		free(_iconsole_buffer[i]);
 
		}
 
}
 

	
 
void IConsoleFree()
 
{
 
_iconsole_inited=false;
 
IConsoleClear();
 
	_iconsole_inited=false;
 
	IConsoleClear();
 
}
 

	
 
void IConsoleResize() {
 
void IConsoleResize()
 
{
 
	if (_iconsole_win!=NULL) {
 
		_iconsole_win->height = _screen.height / 3;
 
		_iconsole_win->width= _screen.width;
 
@@ -263,80 +258,84 @@ void IConsoleSwitch()
 
	_video_driver->make_dirty(0,0,_screen.width,_screen.height);
 
}
 

	
 
void IConsoleClose() {
 
if (_iconsole_mode==ICONSOLE_OPENED)  IConsoleSwitch();
 
_iconsole_mode=ICONSOLE_CLOSED;
 
void IConsoleClose()
 
{
 
	if (_iconsole_mode==ICONSOLE_OPENED)  IConsoleSwitch();
 
	_iconsole_mode=ICONSOLE_CLOSED;
 
}
 

	
 
void IConsoleOpen() {
 
if (_iconsole_mode==ICONSOLE_CLOSED) IConsoleSwitch();
 
void IConsoleOpen()
 
{
 
	if (_iconsole_mode==ICONSOLE_CLOSED) IConsoleSwitch();
 
}
 

	
 
void IConsoleCmdBufferAdd(byte * cmd) {
 
int i;
 
if (_iconsole_cmdbufferpos != 19) return;
 
if (_iconsole_cmdbuffer[18]!=NULL) free(_iconsole_cmdbuffer[18]);
 
for (i=18; i>0; i--) _iconsole_cmdbuffer[i]=_iconsole_cmdbuffer[i-1];
 
i=strlen((char *)cmd);
 
_iconsole_cmdbuffer[0]=malloc(i+1);
 
memset(((void *)_iconsole_cmdbuffer[0]),0,i+1);
 
memcpy(((void *)_iconsole_cmdbuffer[0]),(void *)cmd,i);
 
_iconsole_cmdbuffer[0][i]=0;
 
_iconsole_cmdbufferpos = 19;
 
void IConsoleCmdBufferAdd(byte * cmd)
 
{
 
	int i;
 
	if (_iconsole_cmdbufferpos != 19) return;
 
	if (_iconsole_cmdbuffer[18]!=NULL) free(_iconsole_cmdbuffer[18]);
 
	for (i=18; i>0; i--) _iconsole_cmdbuffer[i]=_iconsole_cmdbuffer[i-1];
 
	i=strlen((char *)cmd);
 
	_iconsole_cmdbuffer[0]=malloc(i+1);
 
	memset(((void *)_iconsole_cmdbuffer[0]),0,i+1);
 
	memcpy(((void *)_iconsole_cmdbuffer[0]),(void *)cmd,i);
 
	_iconsole_cmdbuffer[0][i]=0;
 
	_iconsole_cmdbufferpos = 19;
 
}
 

	
 
void IConsoleCmdBufferNavigate(signed char direction) {
 
int i;
 
i=_iconsole_cmdbufferpos + direction;
 
if (i<0) i=19;
 
if (i>19) i=0;
 
if (direction>0) while (_iconsole_cmdbuffer[i]==NULL) {
 
	i++;
 
void IConsoleCmdBufferNavigate(signed char direction)
 
{
 
	int i;
 
	i=_iconsole_cmdbufferpos + direction;
 
	if (i<0) i=19;
 
	if (i>19) i=0;
 
	}
 
if (direction<0) while (_iconsole_cmdbuffer[i]==NULL) {
 
	i--;
 
	if (i<0) i=19;
 
	}
 
_iconsole_cmdbufferpos = i;
 
IConsoleClearCommand();
 
memcpy((void *)_iconsole_cmdline,(void *)_iconsole_cmdbuffer[i],strlen(_iconsole_cmdbuffer[i]));
 
_iconsole_cmdpos =strlen(_iconsole_cmdbuffer[i]);
 
	if (direction>0) while (_iconsole_cmdbuffer[i]==NULL) {
 
		i++;
 
		if (i>19) i=0;
 
		}
 
	if (direction<0) while (_iconsole_cmdbuffer[i]==NULL) {
 
		i--;
 
		if (i<0) i=19;
 
		}
 
	_iconsole_cmdbufferpos = i;
 
	IConsoleClearCommand();
 
	memcpy((void *)_iconsole_cmdline,(void *)_iconsole_cmdbuffer[i],strlen(_iconsole_cmdbuffer[i]));
 
	_iconsole_cmdpos =strlen(_iconsole_cmdbuffer[i]);
 
}
 

	
 
void IConsolePrint(byte color_code, byte* string)
 
{
 
byte * _ex;
 
byte * _new;
 
byte _exc;
 
byte _newc;
 
int i,j;
 
	byte * _ex;
 
	byte * _new;
 
	byte _exc;
 
	byte _newc;
 
	int i,j;
 

	
 
if (!_iconsole_inited) return;
 
	if (!_iconsole_inited) return;
 

	
 
_newc=color_code;
 
i=strlen((char *)string);
 
_new=malloc(i+1);
 
memset(_new,0,i+1);
 
memcpy(_new,string,i);
 
	_newc=color_code;
 
	i=strlen((char *)string);
 
	_new=malloc(i+1);
 
	memset(_new,0,i+1);
 
	memcpy(_new,string,i);
 

	
 
for (j=0;j<i;j++) {
 
	if (_new[j]<0x1F) _new[j]=0x20;
 
	}
 
	for (j=0;j<i;j++) {
 
		if (_new[j]<0x1F) _new[j]=0x20;
 
		}
 

	
 
i=79;
 
while (i>=0) {
 
	_ex=_iconsole_buffer[i];
 
	_exc=_iconsole_cbuffer[i];
 
	_iconsole_buffer[i]=_new;
 
	_iconsole_cbuffer[i]=_newc;
 
	_new=_ex;
 
	_newc=_exc;
 
	i--;
 
	}
 
if (_ex!=NULL) free(_ex);
 
	i=79;
 
	while (i>=0) {
 
		_ex=_iconsole_buffer[i];
 
		_exc=_iconsole_cbuffer[i];
 
		_iconsole_buffer[i]=_new;
 
		_iconsole_cbuffer[i]=_newc;
 
		_new=_ex;
 
		_newc=_exc;
 
		i--;
 
		}
 
	if (_ex!=NULL) free(_ex);
 

	
 
if (_iconsole_win!=NULL) SetWindowDirty(_iconsole_win);
 
	if (_iconsole_win!=NULL) SetWindowDirty(_iconsole_win);
 
}
 

	
 

	
 
@@ -350,247 +349,277 @@ void CDECL IConsolePrintF(byte color_cod
 
	IConsolePrint(color_code, (byte *) &buf);
 
}
 

	
 
void IConsoleDebug(byte* string) {
 
if (_stdlib_developer>1) IConsolePrintF(_iconsole_color_debug, "DEBUG: %s", string);
 
void IConsoleDebug(byte* string)
 
{
 
	if (_stdlib_developer>1) IConsolePrintF(_iconsole_color_debug, "DEBUG: %s", string);
 
}
 

	
 
void IConsoleError(byte* string) {
 
if (_stdlib_developer>0) IConsolePrintF(_iconsole_color_error, "ERROR: %s", string);
 
void IConsoleError(byte* string)
 
{
 
	if (_stdlib_developer>0) IConsolePrintF(_iconsole_color_error, "ERROR: %s", string);
 
}
 

	
 
void IConsoleCmdRegister(byte * name, void * addr) {
 
byte * _new;
 
_iconsole_cmd * item;
 
_iconsole_cmd * item_new;
 
int i;
 
void IConsoleCmdRegister(byte * name, void * addr)
 
{
 
	byte * _new;
 
	_iconsole_cmd * item;
 
	_iconsole_cmd * item_new;
 
	int i;
 

	
 
	i=strlen((char *)name);
 
	_new=malloc(i+1);
 
	memset(_new,0,i+1);
 
	memcpy(_new,name,i);
 
		i=strlen((char *)name);
 
		_new=malloc(i+1);
 
		memset(_new,0,i+1);
 
		memcpy(_new,name,i);
 

	
 
	item_new = malloc(sizeof(_iconsole_cmd));
 

	
 
item_new = malloc(sizeof(_iconsole_cmd));
 
	item_new->_next = NULL;
 
	item_new->addr  = addr;
 
	item_new->name  = _new;
 

	
 
item_new->_next = NULL;
 
item_new->addr  = addr;
 
item_new->name  = _new;
 
	item_new->hook_access = NULL;
 
	item_new->hook_after_exec = NULL;
 
	item_new->hook_before_exec = NULL;
 

	
 
item = _iconsole_cmds;
 
if (item == NULL) {
 
	_iconsole_cmds = item_new;
 
	} else {
 
	while (item->_next != NULL) { item = item->_next; };
 
	item->_next = item_new;
 
	}
 
	item = _iconsole_cmds;
 
	if (item == NULL) {
 
		_iconsole_cmds = item_new;
 
		} else {
 
		while (item->_next != NULL) { item = item->_next; };
 
		item->_next = item_new;
 
		}
 
}
 

	
 
void* IConsoleCmdGetAddr(byte * name) {
 
_iconsole_cmd * item;
 
void* IConsoleCmdGet(byte * name)
 
{
 
	_iconsole_cmd * item;
 

	
 
item = _iconsole_cmds;
 
while (item != NULL) {
 
	if (strcmp(item->name,name)==0) return item->addr;
 
	item = item->_next;
 
	}
 
return NULL;
 
	item = _iconsole_cmds;
 
	while (item != NULL) {
 
		if (strcmp(item->name,name)==0) return item;
 
		item = item->_next;
 
		}
 
	return NULL;
 
}
 

	
 
void IConsoleVarRegister(byte * name, void * addr, byte type) {
 
byte * _new;
 
_iconsole_var * item;
 
_iconsole_var * item_new;
 
int i;
 
void IConsoleVarRegister(byte * name, void * addr, byte type)
 
{
 
	byte * _new;
 
	_iconsole_var * item;
 
	_iconsole_var * item_new;
 
	int i;
 

	
 
	i=strlen((char *)name)+1;
 
	_new=malloc(i+1);
 
	memset(_new,0,i+1);
 
	_new[0]='*';
 
	memcpy(_new+1,name,i);
 
		i=strlen((char *)name)+1;
 
		_new=malloc(i+1);
 
		memset(_new,0,i+1);
 
		_new[0]='*';
 
		memcpy(_new+1,name,i);
 

	
 
item_new = malloc(sizeof(_iconsole_var));
 
	item_new = malloc(sizeof(_iconsole_var));
 

	
 
item_new->_next = NULL;
 
item_new->addr  = addr;
 
item_new->name  = _new;
 
item_new->type  = type;
 
item_new->_malloc = false;
 
	item_new->_next = NULL;
 
	item_new->addr  = addr;
 
	item_new->name  = _new;
 
	item_new->type  = type;
 
	item_new->_malloc = false;
 

	
 
item = _iconsole_vars;
 
if (item == NULL) {
 
	_iconsole_vars = item_new;
 
	} else {
 
	while (item->_next != NULL) { item = item->_next; };
 
	item->_next = item_new;
 
	}
 
	item_new->hook_access = NULL;
 
	item_new->hook_after_change = NULL;
 
	item_new->hook_before_change = NULL;
 

	
 
	item = _iconsole_vars;
 
	if (item == NULL) {
 
		_iconsole_vars = item_new;
 
		} else {
 
		while (item->_next != NULL) { item = item->_next; };
 
		item->_next = item_new;
 
		}
 
}
 

	
 
void IConsoleVarInsert(_iconsole_var * var, byte * name) {
 
byte * _new;
 
_iconsole_var * item;
 
_iconsole_var * item_new;
 
int i;
 
void IConsoleVarMemRegister(byte * name, byte type)
 
{
 
	_iconsole_var * item;
 
	item = IConsoleVarAlloc(type);
 
	IConsoleVarInsert(item,name);
 
}
 

	
 

	
 
item_new = var;
 
void IConsoleVarInsert(_iconsole_var * var, byte * name)
 
{
 
	byte * _new;
 
	_iconsole_var * item;
 
	_iconsole_var * item_new;
 
	int i;
 

	
 
// dont allow to build variable rings
 
if (item_new->_next != NULL) return;
 
	item_new = var;
 

	
 
	i=strlen((char *)name)+1;
 
	_new=malloc(i+1);
 
	memset(_new,0,i+1);
 
	_new[0]='*';
 
	memcpy(_new+1,name,i);
 
	// dont allow to build variable rings
 
	if (item_new->_next != NULL) return;
 

	
 
		i=strlen((char *)name)+1;
 
		_new=malloc(i+1);
 
		memset(_new,0,i+1);
 
		_new[0]='*';
 
		memcpy(_new+1,name,i);
 

	
 
item_new->name  = _new;
 
	item_new->name  = _new;
 

	
 
item = _iconsole_vars;
 
if (item == NULL) {
 
	_iconsole_vars = item_new;
 
	item = _iconsole_vars;
 
	if (item == NULL) {
 
		_iconsole_vars = item_new;
 
	} else {
 
	while (item->_next != NULL) { item = item->_next; };
 
	item->_next = item_new;
 
		while (item->_next != NULL) { item = item->_next; };
 
		item->_next = item_new;
 
	}
 
}
 

	
 

	
 
_iconsole_var * IConsoleVarGet(byte * name) {
 
_iconsole_var * item;
 
_iconsole_var * IConsoleVarGet(byte * name)
 
{
 
	_iconsole_var * item;
 

	
 
item = _iconsole_vars;
 
while (item != NULL) {
 
	if (strcmp(item->name,name)==0) return item;
 
	item = item->_next;
 
	}
 
return NULL;
 
	item = _iconsole_vars;
 
	while (item != NULL) {
 
		if (strcmp(item->name,name)==0) return item;
 
		item = item->_next;
 
		}
 
	return NULL;
 
}
 

	
 
_iconsole_var * IConsoleVarAlloc(byte type) {
 
_iconsole_var * item;
 
item=malloc(sizeof(_iconsole_var));
 
item->_next = NULL;
 
item->name  = "";
 
item->type  = type;
 
switch (item->type) {
 
		case ICONSOLE_VAR_BOOLEAN:
 
				{
 
				item->addr=malloc(sizeof(bool));
 
				memset(item->addr,0,sizeof(bool));
 
				item->_malloc=true;
 
				}
 
				break;
 
		case ICONSOLE_VAR_BYTE:
 
				{
 
				item->addr=malloc(sizeof(byte));
 
				memset(item->addr,0,sizeof(byte));
 
				item->_malloc=true;
 
				}
 
				break;
 
		case ICONSOLE_VAR_UINT16:
 
				{
 
				item->addr=malloc(sizeof(unsigned short));
 
				memset(item->addr,0,sizeof(unsigned short));
 
				item->_malloc=true;
 
				}
 
				break;
 
		case ICONSOLE_VAR_UINT32:
 
				{
 
				item->addr=malloc(sizeof(unsigned int));
 
				memset(item->addr,0,sizeof(unsigned int));
 
				item->_malloc=true;
 
				}
 
				break;
 
		case ICONSOLE_VAR_INT16:
 
				{
 
				item->addr=malloc(sizeof(signed short));
 
				memset(item->addr,0,sizeof(signed short));
 
				item->_malloc=true;
 
				}
 
				break;
 
		case ICONSOLE_VAR_INT32:
 
				{
 
				item->addr=malloc(sizeof(signed int));
 
				memset(item->addr,0,sizeof(signed int));
 
				item->_malloc=true;
 
				}
 
				break;
 
		default:
 
				item->addr  = NULL;
 
				item->_malloc = false;
 
				break;
 
		}
 
return item;
 
_iconsole_var * IConsoleVarAlloc(byte type)
 
{
 
	_iconsole_var * item;
 
	item=malloc(sizeof(_iconsole_var));
 
	item->_next = NULL;
 
	item->name  = "";
 
	item->type  = type;
 
	switch (item->type) {
 
			case ICONSOLE_VAR_BOOLEAN:
 
					{
 
					item->addr=malloc(sizeof(bool));
 
					memset(item->addr,0,sizeof(bool));
 
					item->_malloc=true;
 
					}
 
					break;
 
			case ICONSOLE_VAR_BYTE:
 
					{
 
					item->addr=malloc(sizeof(byte));
 
					memset(item->addr,0,sizeof(byte));
 
					item->_malloc=true;
 
					}
 
					break;
 
			case ICONSOLE_VAR_UINT16:
 
					{
 
					item->addr=malloc(sizeof(unsigned short));
 
					memset(item->addr,0,sizeof(unsigned short));
 
					item->_malloc=true;
 
					}
 
					break;
 
			case ICONSOLE_VAR_UINT32:
 
					{
 
					item->addr=malloc(sizeof(unsigned int));
 
					memset(item->addr,0,sizeof(unsigned int));
 
					item->_malloc=true;
 
					}
 
					break;
 
			case ICONSOLE_VAR_INT16:
 
					{
 
					item->addr=malloc(sizeof(signed short));
 
					memset(item->addr,0,sizeof(signed short));
 
					item->_malloc=true;
 
					}
 
					break;
 
			case ICONSOLE_VAR_INT32:
 
					{
 
					item->addr=malloc(sizeof(signed int));
 
					memset(item->addr,0,sizeof(signed int));
 
					item->_malloc=true;
 
					}
 
					break;
 
			default:
 
					item->addr  = NULL;
 
					item->_malloc = false;
 
					break;
 
			}
 

	
 
	item->hook_access = NULL;
 
	item->hook_after_change = NULL;
 
	item->hook_before_change = NULL;
 
	return item;
 
}
 

	
 

	
 
void IConsoleVarFree(_iconsole_var * var) {
 
if (var ->_malloc) {
 
	free(var ->addr);
 
	}
 
free(var);
 
}
 

	
 
void IConsoleVarSetString(_iconsole_var * var, byte * string) {
 
int l;
 

	
 
if (string == NULL) return;
 

	
 
if (var->_malloc) {
 
	free(var->addr);
 
	}
 

	
 
l=strlen((char *) string);
 
var->addr=malloc(l+1);
 
var->_malloc=true;
 
memset(var->addr,0,l);
 
memcpy((void *) var->addr,(void *) string, l);
 
((byte *)var->addr)[l]=0;
 
void IConsoleVarFree(_iconsole_var * var)
 
{
 
	if (var ->_malloc) {
 
		free(var ->addr);
 
		}
 
	free(var);
 
}
 

	
 
void IConsoleVarSetValue(_iconsole_var * var, int value) {
 
switch (var->type) {
 
		case ICONSOLE_VAR_BOOLEAN:
 
				{
 
				(*(bool *)var->addr)=(value!=0);
 
				}
 
				break;
 
		case ICONSOLE_VAR_BYTE:
 
				{
 
				(*(byte *)var->addr)=value;
 
				}
 
				break;
 
		case ICONSOLE_VAR_UINT16:
 
				{
 
				(*(unsigned short *)var->addr)=value;
 
				}
 
				break;
 
		case ICONSOLE_VAR_UINT32:
 
				{
 
				(*(unsigned int *)var->addr)=value;
 
				}
 
				break;
 
		case ICONSOLE_VAR_INT16:
 
				{
 
				(*(signed short *)var->addr)=value;
 
				}
 
				break;
 
		case ICONSOLE_VAR_INT32:
 
				{
 
				(*(signed int *)var->addr)=value;
 
				}
 
				break;
 
		default:
 
				break;
 
void IConsoleVarSetString(_iconsole_var * var, byte * string)
 
{
 
	int l;
 

	
 
	if (string == NULL) return;
 

	
 
	if (var->_malloc) {
 
		free(var->addr);
 
		}
 

	
 
	l=strlen((char *) string);
 
	var->addr=malloc(l+1);
 
	var->_malloc=true;
 
	memset(var->addr,0,l);
 
	memcpy((void *) var->addr,(void *) string, l);
 
	((byte *)var->addr)[l]=0;
 
	}
 

	
 
	void IConsoleVarSetValue(_iconsole_var * var, int value) {
 
	switch (var->type) {
 
			case ICONSOLE_VAR_BOOLEAN:
 
					{
 
					(*(bool *)var->addr)=(value!=0);
 
					}
 
					break;
 
			case ICONSOLE_VAR_BYTE:
 
					{
 
					(*(byte *)var->addr)=value;
 
					}
 
					break;
 
			case ICONSOLE_VAR_UINT16:
 
					{
 
					(*(unsigned short *)var->addr)=value;
 
					}
 
					break;
 
			case ICONSOLE_VAR_UINT32:
 
					{
 
					(*(unsigned int *)var->addr)=value;
 
					}
 
					break;
 
			case ICONSOLE_VAR_INT16:
 
					{
 
					(*(signed short *)var->addr)=value;
 
					}
 
					break;
 
			case ICONSOLE_VAR_INT32:
 
					{
 
					(*(signed int *)var->addr)=value;
 
					}
 
					break;
 
			default:
 
					break;
 
			}
 
}
 

	
 
void IConsoleVarDump(_iconsole_var * var, byte * dump_desc) {
 

	
 
byte var_b; // TYPE BYTE
 
unsigned short var_ui16; // TYPE UINT16
 
unsigned int var_ui32; // TYPE UINT32
 
signed short var_i16; // TYPE INT16
 
signed int var_i32; // TYPE INT32
 
byte * var_s; // TYPE STRING
 
void IConsoleVarDump(_iconsole_var * var, byte * dump_desc)
 
{
 
	byte var_b; // TYPE BYTE
 
	unsigned short var_ui16; // TYPE UINT16
 
	unsigned int var_ui32; // TYPE UINT32
 
	signed short var_i16; // TYPE INT16
 
	signed int var_i32; // TYPE INT32
 
	byte * var_s; // TYPE STRING
 

	
 
	if (dump_desc==NULL) dump_desc = var->name;
 

	
 
@@ -651,672 +680,545 @@ byte * var_s; // TYPE STRING
 
				}
 
				break;
 
		}
 
}
 

	
 
// * ************************* * //
 
// * hooking code              * //
 
// * ************************* * //
 

	
 
void IConsoleVarHook(byte * name, byte type, void * proc)
 
{
 
	_iconsole_var * hook_var;
 
	hook_var = IConsoleVarGet(name);
 
	if (hook_var == NULL) return;
 
	switch (type) {
 
	case ICONSOLE_HOOK_BEFORE_CHANGE:
 
		hook_var->hook_after_change = proc;
 
		break;
 
	case ICONSOLE_HOOK_AFTER_CHANGE:
 
		hook_var->hook_after_change = proc;
 
		break;
 
	case ICONSOLE_HOOK_ACCESS:
 
		hook_var->hook_access = proc;
 
		break;
 
	}
 
}
 

	
 
bool IConsoleVarHookHandle(_iconsole_var * hook_var, byte type)
 
{
 
	bool (*proc)(_iconsole_var * hook_var);
 
	switch (type) {
 
	case ICONSOLE_HOOK_BEFORE_CHANGE:
 
		proc = hook_var->hook_before_change;
 
		break;
 
	case ICONSOLE_HOOK_AFTER_CHANGE:
 
		proc = hook_var->hook_after_change;
 
		break;
 
	case ICONSOLE_HOOK_ACCESS:
 
		proc = hook_var->hook_access;
 
		break;
 
	}
 
	if (proc == NULL) return true;
 
	return proc(hook_var);
 
}
 

	
 
void IConsoleCmdHook(byte * name, byte type, void * proc)
 
{
 
	_iconsole_cmd * hook_cmd;
 
	hook_cmd = IConsoleCmdGet(name);
 
	if (hook_cmd == NULL) return;
 
	switch (type) {
 
	case ICONSOLE_HOOK_AFTER_EXEC:
 
		hook_cmd->hook_after_exec = proc;
 
		break;
 
	case ICONSOLE_HOOK_BEFORE_EXEC:
 
		hook_cmd->hook_before_exec = proc;
 
		break;
 
	case ICONSOLE_HOOK_ACCESS:
 
		hook_cmd->hook_access = proc;
 
		break;
 
	}
 
}
 

	
 
void IConsoleCmdExec(byte * cmdstr) {
 
_iconsole_var * (*function)(byte argc, byte* argv[], byte argt[]);
 
byte * tokens[20];
 
byte tokentypes[20];
 
byte * tokenstream;
 
byte * tokenstream_s;
 
byte execution_mode;
 
_iconsole_var * var = NULL;
 
_iconsole_var * result = NULL;
 
bool IConsoleCmdHookHandle(_iconsole_cmd * hook_cmd, byte type)
 
{
 
	bool (*proc)(_iconsole_cmd * hook_cmd);
 
	switch (type) {
 
	case ICONSOLE_HOOK_AFTER_EXEC:
 
		proc = hook_cmd->hook_after_exec;
 
		break;
 
	case ICONSOLE_HOOK_BEFORE_EXEC:
 
		proc = hook_cmd->hook_before_exec;
 
		break;
 
	case ICONSOLE_HOOK_ACCESS:
 
		proc = hook_cmd->hook_access;
 
		break;
 
	}
 
	if (proc == NULL) return true;
 
	return proc(hook_cmd);
 
}
 

	
 
bool longtoken;
 
bool valid_token;
 
bool skip_lt_change;
 

	
 
int c;
 
int i;
 
int l;
 

	
 
//** clearing buffer **//
 
void IConsoleCmdExec(byte * cmdstr)
 
{
 
	_iconsole_var * (*function)(byte argc, byte* argv[], byte argt[]);
 
	byte * tokens[20];
 
	byte tokentypes[20];
 
	byte * tokenstream;
 
	byte * tokenstream_s;
 
	byte execution_mode;
 
	_iconsole_var * var = NULL;
 
	_iconsole_var * result = NULL;
 
	_iconsole_cmd * cmd = NULL;
 

	
 
for (i=0;i<20;i++) { tokens[i]=NULL; tokentypes[i]=ICONSOLE_VAR_NONE; };
 
tokenstream_s=tokenstream=malloc(1024);
 
memset(tokenstream,0,1024);
 
	bool longtoken;
 
	bool valid_token;
 
	bool skip_lt_change;
 

	
 
	int c;
 
	int i;
 
	int l;
 

	
 
//** parsing **//
 
	//** clearing buffer **//
 

	
 
	for (i=0;i<20;i++) { tokens[i]=NULL; tokentypes[i]=ICONSOLE_VAR_NONE; };
 
	tokenstream_s=tokenstream=malloc(1024);
 
	memset(tokenstream,0,1024);
 

	
 
	//** parsing **//
 

	
 
longtoken=false;
 
valid_token=false;
 
skip_lt_change=false;
 
l=strlen((char *) cmdstr);
 
i=0;
 
c=0;
 
tokens[c] = tokenstream;
 
while (i<l) {
 
	if (cmdstr[i]=='"') {
 
		if (longtoken) {
 
			if (cmdstr[i+1]=='"') {
 
				i++;
 
				*tokenstream = '"';
 
				tokenstream++;
 
				skip_lt_change=true;
 
	longtoken=false;
 
	valid_token=false;
 
	skip_lt_change=false;
 
	l=strlen((char *) cmdstr);
 
	i=0;
 
	c=0;
 
	tokens[c] = tokenstream;
 
	while (i<l) {
 
		if (cmdstr[i]=='"') {
 
			if (longtoken) {
 
				if (cmdstr[i+1]=='"') {
 
					i++;
 
					*tokenstream = '"';
 
					tokenstream++;
 
					skip_lt_change=true;
 
					} else {
 
					longtoken=!longtoken;
 
					}
 
				} else {
 
				longtoken=!longtoken;
 
				}
 
			} else {
 
			longtoken=!longtoken;
 
			if (!skip_lt_change) {
 
				if (!longtoken) {
 
					if (valid_token) {
 
						c++;
 
						*tokenstream = 0;
 
						tokenstream++;
 
						tokens[c] = tokenstream;
 
						valid_token = false;
 
						}
 
					}
 
				skip_lt_change=false;
 
				}
 
			}
 
		else if ((!longtoken) && (cmdstr[i]==' ')) {
 
			if (valid_token) {
 
				c++;
 
				*tokenstream = 0;
 
				tokenstream++;
 
				tokens[c] = tokenstream;
 
				valid_token = false;
 
				}
 
			}
 
		if (!skip_lt_change) {
 
			if (!longtoken) {
 
				if (valid_token) {
 
					c++;
 
					*tokenstream = 0;
 
					tokenstream++;
 
					tokens[c] = tokenstream;
 
					valid_token = false;
 
		else {
 
			valid_token=true;
 
			*tokenstream = cmdstr[i];
 
			tokenstream++;
 
			}
 
		i++;
 
		}
 

	
 
	tokenstream--;
 
	if (!(*tokenstream==0)) {
 
		c++;
 
		tokenstream++;
 
		*tokenstream = 0;
 
		}
 

	
 
	//** interpreting **//
 

	
 
	for (i=0; i<c; i++) {
 
		tokentypes[i]=ICONSOLE_VAR_UNKNOWN;
 
		if (tokens[i]!=NULL) if (i>0) if (strlen((char *) tokens[i])>0) {
 
			if (tokens[i][0]=='*') {
 
				if ((i==2) && (tokentypes[1]==ICONSOLE_VAR_UNKNOWN) && (strcmp(tokens[1],"<<")==0)) {
 
					// dont change the variable to an pointer if execution_mode 4 is being prepared
 
					// this is used to assign one variable the value of the other one [token 0 and 2]
 
					} else {
 
					var = IConsoleVarGet(tokens[i]);
 
					if (var!=NULL) {
 
						tokens[i]=(byte *)var->addr;
 
						tokentypes[i]=var->type;
 
						}
 
					}
 
				}
 
			skip_lt_change=false;
 
			}
 
		}
 
	else if ((!longtoken) && (cmdstr[i]==' ')) {
 
		if (valid_token) {
 
			c++;
 
			*tokenstream = 0;
 
			tokenstream++;
 
			tokens[c] = tokenstream;
 
			valid_token = false;
 
			}
 
		}
 
	else {
 
		valid_token=true;
 
		*tokenstream = cmdstr[i];
 
		tokenstream++;
 
		}
 
	i++;
 
	}
 

	
 
tokenstream--;
 
if (!(*tokenstream==0)) {
 
	c++;
 
	tokenstream++;
 
	*tokenstream = 0;
 
	}
 

	
 
//** interpreting **//
 

	
 
for (i=0; i<c; i++) {
 
	tokentypes[i]=ICONSOLE_VAR_UNKNOWN;
 
	if (tokens[i]!=NULL) if (i>0) if (strlen((char *) tokens[i])>0) {
 
		if (tokens[i][0]=='*') {
 
			if ((i==2) && (tokentypes[1]==ICONSOLE_VAR_UNKNOWN) && (strcmp(tokens[1],"<<")==0)) {
 
				// dont change the variable to an pointer if execution_mode 4 is being prepared
 
				// this is used to assign one variable the value of the other one [token 0 and 2]
 
				} else {
 
				var = IConsoleVarGet(tokens[i]);
 
			if (tokens[i]!=NULL) if (tokens[i][0]=='@') if (tokens[i][1]=='*') {
 
				var = IConsoleVarGet(tokens[i]+1);
 
				if (var!=NULL) {
 
					tokens[i]=(byte *)var->addr;
 
					tokentypes[i]=var->type;
 
					tokens[i]=(byte *)var;
 
					tokentypes[i]=ICONSOLE_VAR_REFERENCE;
 
					}
 
				}
 
			}
 
		if (tokens[i]!=NULL) if (tokens[i][0]=='@') if (tokens[i][1]=='*') {
 
			var = IConsoleVarGet(tokens[i]+1);
 
			if (var!=NULL) {
 
				tokens[i]=(byte *)var;
 
				tokentypes[i]=ICONSOLE_VAR_REFERENCE;
 
				}
 
			}
 
		}
 
	}
 

	
 
	execution_mode=0;
 

	
 
execution_mode=0;
 
	function = NULL;
 
	cmd = IConsoleCmdGet(tokens[0]);
 
	if (cmd != NULL) function = cmd->addr;
 

	
 
function = IConsoleCmdGetAddr(tokens[0]);
 
if (function != NULL) {
 
	execution_mode=1; // this is a command
 
	} else {
 
	var = IConsoleVarGet(tokens[0]);
 
	if (var != NULL) {
 
		execution_mode=2; // this is a variable
 
		if (c>2) if (strcmp(tokens[1],"<<")==0) {
 
			// this is command to variable mode [normal]
 
			function = IConsoleCmdGetAddr(tokens[2]);
 
			if (function != NULL) {
 
				execution_mode=3;
 
				} else {
 
				result = IConsoleVarGet(tokens[2]);
 
				if (result != NULL) {
 
					execution_mode=4;
 
	if (function != NULL) {
 
		execution_mode=1; // this is a command
 
		} else {
 
		var = IConsoleVarGet(tokens[0]);
 
		if (var != NULL) {
 
			execution_mode=2; // this is a variable
 
			if (c>2) if (strcmp(tokens[1],"<<")==0) {
 
				// this is command to variable mode [normal]
 
				
 
				function = NULL;
 
				cmd = IConsoleCmdGet(tokens[2]);
 
				if (cmd != NULL) function = cmd->addr;
 

	
 
				if (function != NULL) {
 
					execution_mode=3;
 
					} else {
 
					result = IConsoleVarGet(tokens[2]);
 
					if (result != NULL) {
 
						execution_mode=4;
 
						}
 
					}
 
				}
 
			}
 
		}
 
	}
 

	
 
//** executing **//
 
if (_stdlib_con_developer) IConsolePrintF(_iconsole_color_debug,"CONDEBUG: execution_mode: %i",execution_mode);
 
switch (execution_mode) {
 
case 0:
 
	{
 
	// not found
 
	IConsoleError("command or variable not found");
 
	}
 
	break;
 
case 1:
 
	{
 
	// execution with command syntax
 
	result = function(c,tokens,tokentypes);
 
	if (result!=NULL) {
 
		IConsoleVarDump(result,"result");
 
		IConsoleVarFree(result);
 
	//** executing **//
 
	if (_stdlib_con_developer) IConsolePrintF(_iconsole_color_debug,"CONDEBUG: execution_mode: %i",execution_mode);
 
	switch (execution_mode) {
 
	case 0:
 
		{
 
		// not found
 
		IConsoleError("command or variable not found");
 
		}
 
		break;
 
	case 1:
 
		if (IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_ACCESS)) {
 
		// execution with command syntax
 
		IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_BEFORE_EXEC);
 
		result = function(c,tokens,tokentypes);
 
		if (result!=NULL) {
 
			IConsoleVarDump(result,"result");
 
			IConsoleVarFree(result);
 
			}
 
		IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_AFTER_EXEC);
 
		}
 
	}
 
	break;
 
case 2:
 
	{
 
	// execution with variable syntax
 
	if ((c==2) || (c==3)) {
 
		// ** variable modifications ** //
 
		switch (var->type) {
 
		case ICONSOLE_VAR_BOOLEAN:
 
				{
 
				if (strcmp(tokens[1],"=")==0) {
 
					if (c==3) {
 
						*(bool *)var->addr=(atoi((char *) tokens[2])!=0);
 
		break;
 
	case 2:
 
		{
 
		// execution with variable syntax
 
		if (IConsoleVarHookHandle(var,ICONSOLE_HOOK_ACCESS)) if ((c==2) || (c==3)) {
 
			// ** variable modifications ** //
 
			IConsoleVarHookHandle(var,ICONSOLE_HOOK_BEFORE_CHANGE);
 
			switch (var->type) {
 
			case ICONSOLE_VAR_BOOLEAN:
 
					{
 
					if (strcmp(tokens[1],"=")==0) {
 
						if (c==3) {
 
							*(bool *)var->addr=(atoi((char *) tokens[2])!=0);
 
							IConsoleVarDump(var,NULL);
 
							} else {
 
							*(bool *)var->addr=false;
 
							IConsoleVarDump(var,NULL);
 
							}
 
						}
 
					else if (strcmp(tokens[1],"++")==0) {
 
						*(bool *)var->addr=!*(bool *)var->addr;
 
						IConsoleVarDump(var,NULL);
 
						} else {
 
						*(bool *)var->addr=false;
 
						}
 
					else if (strcmp(tokens[1],"--")==0) {
 
						*(bool *)var->addr=!*(bool *)var->addr;
 
						IConsoleVarDump(var,NULL);
 
						}
 
					else { IConsoleError("operation not supported"); }
 
					}
 
				else if (strcmp(tokens[1],"++")==0) {
 
					*(bool *)var->addr=!*(bool *)var->addr;
 
					IConsoleVarDump(var,NULL);
 
					}
 
				else if (strcmp(tokens[1],"--")==0) {
 
					*(bool *)var->addr=!*(bool *)var->addr;
 
					IConsoleVarDump(var,NULL);
 
					break;
 
			case ICONSOLE_VAR_BYTE:
 
					{
 
					if (strcmp(tokens[1],"=")==0) {
 
						if (c==3) {
 
							*(byte *)var->addr=atoi((char *) tokens[2]);
 
							IConsoleVarDump(var,NULL);
 
							} else {
 
							*(byte *)var->addr=0;
 
							IConsoleVarDump(var,NULL);
 
							}
 
						}
 
					else if (strcmp(tokens[1],"++")==0) {
 
						(*(byte *)var->addr)++;
 
						IConsoleVarDump(var,NULL);
 
						}
 
					else if (strcmp(tokens[1],"--")==0) {
 
						(*(byte *)var->addr)--;
 
						IConsoleVarDump(var,NULL);
 
						}
 
					else { IConsoleError("operation not supported"); }
 
					}
 
				else { IConsoleError("operation not supported"); }
 
				}
 
				break;
 
		case ICONSOLE_VAR_BYTE:
 
				{
 
				if (strcmp(tokens[1],"=")==0) {
 
					if (c==3) {
 
						*(byte *)var->addr=atoi((char *) tokens[2]);
 
					break;
 
			case ICONSOLE_VAR_UINT16:
 
					{
 
					if (strcmp(tokens[1],"=")==0) {
 
						if (c==3) {
 
							*(unsigned short *)var->addr=atoi((char *) tokens[2]);
 
							IConsoleVarDump(var,NULL);
 
							} else {
 
							*(unsigned short *)var->addr=0;
 
							IConsoleVarDump(var,NULL);
 
							}
 
						}
 
					else if (strcmp(tokens[1],"++")==0) {
 
						(*(unsigned short *)var->addr)++;
 
						IConsoleVarDump(var,NULL);
 
						}
 
					else if (strcmp(tokens[1],"--")==0) {
 
						(*(unsigned short *)var->addr)--;
 
						IConsoleVarDump(var,NULL);
 
						} else {
 
						*(byte *)var->addr=0;
 
						}
 
					else { IConsoleError("operation not supported"); }
 
					}
 
					break;
 
			case ICONSOLE_VAR_UINT32:
 
					{
 
					if (strcmp(tokens[1],"=")==0) {
 
						if (c==3) {
 
							*(unsigned int *)var->addr=atoi((char *) tokens[2]);
 
							IConsoleVarDump(var,NULL);
 
							} else {
 
							*(unsigned int *)var->addr=0;
 
							IConsoleVarDump(var,NULL);
 
							}
 
						}
 
					else if (strcmp(tokens[1],"++")==0) {
 
						(*(unsigned int *)var->addr)++;
 
						IConsoleVarDump(var,NULL);
 
						}
 
					else if (strcmp(tokens[1],"--")==0) {
 
						(*(unsigned int *)var->addr)--;
 
						IConsoleVarDump(var,NULL);
 
						}
 
					}
 
				else if (strcmp(tokens[1],"++")==0) {
 
					(*(byte *)var->addr)++;
 
					IConsoleVarDump(var,NULL);
 
					}
 
				else if (strcmp(tokens[1],"--")==0) {
 
					(*(byte *)var->addr)--;
 
					IConsoleVarDump(var,NULL);
 
					else { IConsoleError("operation not supported"); }
 
					}
 
				else { IConsoleError("operation not supported"); }
 
				}
 
				break;
 
		case ICONSOLE_VAR_UINT16:
 
				{
 
				if (strcmp(tokens[1],"=")==0) {
 
					if (c==3) {
 
						*(unsigned short *)var->addr=atoi((char *) tokens[2]);
 
					break;
 
			case ICONSOLE_VAR_INT16:
 
					{
 
					if (strcmp(tokens[1],"=")==0) {
 
						if (c==3) {
 
							*(signed short *)var->addr=atoi((char *) tokens[2]);
 
							IConsoleVarDump(var,NULL);
 
							} else {
 
							*(signed short *)var->addr=0;
 
							IConsoleVarDump(var,NULL);
 
							}
 
						}
 
					else if (strcmp(tokens[1],"++")==0) {
 
						(*(signed short *)var->addr)++;
 
						IConsoleVarDump(var,NULL);
 
						}
 
					else if (strcmp(tokens[1],"--")==0) {
 
						(*(signed short *)var->addr)--;
 
						IConsoleVarDump(var,NULL);
 
						} else {
 
						*(unsigned short *)var->addr=0;
 
						}
 
					else { IConsoleError("operation not supported"); }
 
					}
 
					break;
 
			case ICONSOLE_VAR_INT32:
 
					{
 
					if (strcmp(tokens[1],"=")==0) {
 
						if (c==3) {
 
							*(signed int *)var->addr=atoi((char *) tokens[2]);
 
							IConsoleVarDump(var,NULL);
 
							} else {
 
							*(signed int *)var->addr=0;
 
							IConsoleVarDump(var,NULL);
 
							}
 
						}
 
					else if (strcmp(tokens[1],"++")==0) {
 
						(*(signed int *)var->addr)++;
 
						IConsoleVarDump(var,NULL);
 
						}
 
					else if (strcmp(tokens[1],"--")==0) {
 
						(*(signed int *)var->addr)--;
 
						IConsoleVarDump(var,NULL);
 
						}
 
					else { IConsoleError("operation not supported"); }
 
					}
 
				else if (strcmp(tokens[1],"++")==0) {
 
					(*(unsigned short *)var->addr)++;
 
					IConsoleVarDump(var,NULL);
 
					}
 
				else if (strcmp(tokens[1],"--")==0) {
 
					(*(unsigned short *)var->addr)--;
 
					IConsoleVarDump(var,NULL);
 
					break;
 
			case ICONSOLE_VAR_STRING:
 
					{
 
					if (strcmp(tokens[1],"=")==0) {
 
						if (c==3) {
 
							IConsoleVarSetString(var, tokens[2]);
 
							IConsoleVarDump(var,NULL);
 
							} else {
 
							IConsoleVarSetString(var, "");
 
							IConsoleVarDump(var,NULL);
 
							}
 
						}
 
					else { IConsoleError("operation not supported"); }
 
					}
 
				else { IConsoleError("operation not supported"); }
 
				}
 
				break;
 
		case ICONSOLE_VAR_UINT32:
 
				{
 
				if (strcmp(tokens[1],"=")==0) {
 
					if (c==3) {
 
						*(unsigned int *)var->addr=atoi((char *) tokens[2]);
 
					break;
 
			case ICONSOLE_VAR_POINTER:
 
					{
 
					if (strcmp(tokens[1],"=")==0) {
 
						if (c==3) {
 
							if (tokentypes[2]==ICONSOLE_VAR_UNKNOWN) {
 
								var->addr = (void *)atoi(tokens[2]);
 
								} else {
 
								var->addr = (void *)tokens[2];
 
								}
 
							IConsoleVarDump(var,NULL);
 
							} else {
 
							var->addr = NULL;
 
							IConsoleVarDump(var,NULL);
 
							}
 
						}
 
					else if (strcmp(tokens[1],"++")==0) {
 
						var->addr = ((char *)var->addr)+1;
 
						IConsoleVarDump(var,NULL);
 
						} else {
 
						*(unsigned int *)var->addr=0;
 
						}
 
					else if (strcmp(tokens[1],"--")==0) {
 
						var->addr = ((char *)var->addr)-1;;
 
						IConsoleVarDump(var,NULL);
 
						}
 
					}
 
				else if (strcmp(tokens[1],"++")==0) {
 
					(*(unsigned int *)var->addr)++;
 
					IConsoleVarDump(var,NULL);
 
					else { IConsoleError("operation not supported"); }
 
					}
 
				else if (strcmp(tokens[1],"--")==0) {
 
					(*(unsigned int *)var->addr)--;
 
					IConsoleVarDump(var,NULL);
 
					}
 
				else { IConsoleError("operation not supported"); }
 
					break;
 
				}
 
				break;
 
		case ICONSOLE_VAR_INT16:
 
				{
 
				if (strcmp(tokens[1],"=")==0) {
 
					if (c==3) {
 
						*(signed short *)var->addr=atoi((char *) tokens[2]);
 
						IConsoleVarDump(var,NULL);
 
						} else {
 
						*(signed short *)var->addr=0;
 
						IConsoleVarDump(var,NULL);
 
						}
 
				IConsoleVarHookHandle(var,ICONSOLE_HOOK_AFTER_CHANGE);
 
		}
 
		if (c==1) {
 
			// ** variable output ** //
 
			IConsoleVarDump(var,NULL);
 
			}
 
		}
 
		break;
 
	case 3:
 
	case 4:
 
		{
 
		// execute command with result or assign a variable
 
			if (execution_mode==3) if (IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_ACCESS)) {
 
			int i;
 
			int diff;
 
			void * temp;
 
			byte temp2;
 

	
 
			// tokenshifting
 
			for (diff=0; diff<2; diff++) {
 
				temp=tokens[0];
 
				temp2=tokentypes[0];
 
				for (i=1; i<20; i++) {
 
					tokens[i-1]=tokens[i];
 
					tokentypes[i-1]=tokentypes[i];
 
					}
 
				else if (strcmp(tokens[1],"++")==0) {
 
					(*(signed short *)var->addr)++;
 
					IConsoleVarDump(var,NULL);
 
					}
 
				else if (strcmp(tokens[1],"--")==0) {
 
					(*(signed short *)var->addr)--;
 
				tokens[19]=temp;
 
				tokentypes[19]=temp2;
 
				}
 
			IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_BEFORE_EXEC);
 
			result = function(c,tokens,tokentypes);
 
			IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_AFTER_EXEC);
 
			} else {
 
				execution_mode=255;
 
			}
 

	
 
		if (IConsoleVarHookHandle(var,ICONSOLE_HOOK_ACCESS)) if (result!=NULL) {
 
			if (result ->type != var -> type) {
 
				IConsoleError("variable type missmatch");
 
				} else {
 
				IConsoleVarHookHandle(var,ICONSOLE_HOOK_BEFORE_CHANGE);
 
				switch (result->type) {
 
				case ICONSOLE_VAR_BOOLEAN:
 
					{
 
					(*(bool *)var->addr)=(*(bool *)result->addr);
 
					IConsoleVarDump(var,NULL);
 
					}
 
				else { IConsoleError("operation not supported"); }
 
				}
 
				break;
 
		case ICONSOLE_VAR_INT32:
 
				{
 
				if (strcmp(tokens[1],"=")==0) {
 
					if (c==3) {
 
						*(signed int *)var->addr=atoi((char *) tokens[2]);
 
						IConsoleVarDump(var,NULL);
 
						} else {
 
						*(signed int *)var->addr=0;
 
						IConsoleVarDump(var,NULL);
 
						}
 
					}
 
				else if (strcmp(tokens[1],"++")==0) {
 
					(*(signed int *)var->addr)++;
 
					IConsoleVarDump(var,NULL);
 
					}
 
				else if (strcmp(tokens[1],"--")==0) {
 
					(*(signed int *)var->addr)--;
 
					break;
 
				case ICONSOLE_VAR_BYTE:
 
					{
 
					(*(byte *)var->addr)=(*(byte *)result->addr);
 
					IConsoleVarDump(var,NULL);
 
					}
 
				else { IConsoleError("operation not supported"); }
 
				}
 
				break;
 
		case ICONSOLE_VAR_STRING:
 
				{
 
				if (strcmp(tokens[1],"=")==0) {
 
					if (c==3) {
 
						IConsoleVarSetString(var, tokens[2]);
 
						IConsoleVarDump(var,NULL);
 
						} else {
 
						IConsoleVarSetString(var, "");
 
						IConsoleVarDump(var,NULL);
 
						}
 
					}
 
				else { IConsoleError("operation not supported"); }
 
				}
 
				break;
 
		case ICONSOLE_VAR_POINTER:
 
				{
 
				if (strcmp(tokens[1],"=")==0) {
 
					if (c==3) {
 
						if (tokentypes[2]==ICONSOLE_VAR_UNKNOWN) {
 
							var->addr = (void *)atoi(tokens[2]);
 
							} else {
 
							var->addr = (void *)tokens[2];
 
							}
 
						IConsoleVarDump(var,NULL);
 
						} else {
 
						var->addr = NULL;
 
						IConsoleVarDump(var,NULL);
 
						}
 
					}
 
				else if (strcmp(tokens[1],"++")==0) {
 
					var->addr = ((char *)var->addr)+1;
 
					break;
 
				case ICONSOLE_VAR_UINT16:
 
					{
 
					(*(unsigned short *)var->addr)=(*(unsigned short *)result->addr);
 
					IConsoleVarDump(var,NULL);
 
					}
 
				else if (strcmp(tokens[1],"--")==0) {
 
					var->addr = ((char *)var->addr)-1;;
 
					break;
 
				case ICONSOLE_VAR_UINT32:
 
					{
 
					(*(unsigned int *)var->addr)=(*(unsigned int *)result->addr);
 
					IConsoleVarDump(var,NULL);
 
					}
 
					break;
 
				case ICONSOLE_VAR_INT16:
 
					{
 
					(*(signed short *)var->addr)=(*(signed short *)result->addr);
 
					IConsoleVarDump(var,NULL);
 
					}
 
				else { IConsoleError("operation not supported"); }
 
				}
 
				break;
 
			}
 
	}
 
	if (c==1) {
 
		// ** variable output ** //
 
		IConsoleVarDump(var,NULL);
 
		}
 
	}
 
	break;
 
case 3:
 
case 4:
 
	{
 
	// execute command with result or assign a variable
 
	if (execution_mode==3) {
 
		int i;
 
		int diff;
 
		void * temp;
 
		byte temp2;
 

	
 
		// tokenshifting
 
		for (diff=0; diff<2; diff++) {
 
			temp=tokens[0];
 
			temp2=tokentypes[0];
 
			for (i=1; i<20; i++) {
 
				tokens[i-1]=tokens[i];
 
				tokentypes[i-1]=tokentypes[i];
 
				}
 
			tokens[19]=temp;
 
			tokentypes[19]=temp2;
 
			}
 

	
 
		result = function(c,tokens,tokentypes);
 
		}
 

	
 
	if (result!=NULL) {
 
		if (result ->type != var -> type) {
 
			IConsoleError("variable type missmatch");
 
			} else {
 
			switch (result->type) {
 
			case ICONSOLE_VAR_BOOLEAN:
 
				{
 
				(*(bool *)var->addr)=(*(bool *)result->addr);
 
				IConsoleVarDump(var,NULL);
 
					break;
 
				case ICONSOLE_VAR_INT32:
 
					{
 
					(*(signed int *)var->addr)=(*(signed int *)result->addr);
 
					IConsoleVarDump(var,NULL);
 
					}
 
					break;
 
				case ICONSOLE_VAR_POINTER:
 
					{
 
					var->addr=result->addr;
 
					IConsoleVarDump(var,NULL);
 
					}
 
					break;
 
				case ICONSOLE_VAR_STRING:
 
					{
 
					IConsoleVarSetString(var,result->addr);
 
					IConsoleVarDump(var,NULL);
 
					}
 
					break;
 
				default:
 
					{
 
					IConsoleError("variable type missmatch");
 
					}
 
					break;
 
					}
 
				IConsoleVarHookHandle(var,ICONSOLE_HOOK_AFTER_CHANGE);
 
				}
 
				break;
 
			case ICONSOLE_VAR_BYTE:
 
				{
 
				(*(byte *)var->addr)=(*(byte *)result->addr);
 
				IConsoleVarDump(var,NULL);
 
				}
 
				break;
 
			case ICONSOLE_VAR_UINT16:
 
				{
 
				(*(unsigned short *)var->addr)=(*(unsigned short *)result->addr);
 
				IConsoleVarDump(var,NULL);
 
				}
 
				break;
 
			case ICONSOLE_VAR_UINT32:
 
				{
 
				(*(unsigned int *)var->addr)=(*(unsigned int *)result->addr);
 
				IConsoleVarDump(var,NULL);
 
				}
 
				break;
 
			case ICONSOLE_VAR_INT16:
 
				{
 
				(*(signed short *)var->addr)=(*(signed short *)result->addr);
 
				IConsoleVarDump(var,NULL);
 
				}
 
				break;
 
			case ICONSOLE_VAR_INT32:
 
				{
 
				(*(signed int *)var->addr)=(*(signed int *)result->addr);
 
				IConsoleVarDump(var,NULL);
 
				}
 
				break;
 
			case ICONSOLE_VAR_POINTER:
 
				{
 
				var->addr=result->addr;
 
				IConsoleVarDump(var,NULL);
 
				}
 
				break;
 
			case ICONSOLE_VAR_STRING:
 
				{
 
				IConsoleVarSetString(var,result->addr);
 
				IConsoleVarDump(var,NULL);
 
				}
 
				break;
 
			default:
 
				{
 
				IConsoleError("variable type missmatch");
 
				}
 
				break;
 

	
 
			if (execution_mode==3) {
 
				IConsoleVarFree(result);
 
				result = NULL;
 
				}
 
			}
 

	
 
		if (execution_mode==3) {
 
			IConsoleVarFree(result);
 
			result = NULL;
 
			}
 
		}
 

	
 
		break;
 
	default:
 
		{
 
		// execution mode invalid
 
		IConsoleError("invalid execution mode");
 
		}
 
	}
 
	break;
 
default:
 
	{
 
	// execution mode invalid
 
	IConsoleError("invalid execution mode");
 
	}
 
}
 

	
 
//** freeing the tokens **//
 
for (i=0;i<20;i++) tokens[i]=NULL;
 
free(tokenstream_s);
 
	//** freeing the tokens **//
 
	for (i=0;i<20;i++) tokens[i]=NULL;
 
	free(tokenstream_s);
 

	
 
}
 

	
 
/* **************************** */
 
/*   default console commands   */
 
/* **************************** */
 

	
 

	
 
static _iconsole_var * IConsoleStdLibEcho(byte argc, byte* argv[], byte argt[]) {
 
	if (argc<2) return NULL;
 
	IConsolePrint(_iconsole_color_default, argv[1]);
 
	return NULL;
 
}
 

	
 
static _iconsole_var * IConsoleStdLibEchoC(byte argc, byte* argv[], byte argt[]) {
 
	if (argc<3) return NULL;
 
	IConsolePrint(atoi(argv[1]), argv[2]);
 
	return NULL;
 
}
 

	
 
static _iconsole_var * IConsoleStdLibPrintF(byte argc, byte* argv[], byte argt[]) {
 
	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]);
 
	return NULL;
 
}
 

	
 
static _iconsole_var * IConsoleStdLibPrintFC(byte argc, byte* argv[], byte argt[]) {
 
	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]);
 
	return NULL;
 
}
 

	
 
static _iconsole_var * IConsoleStdLibScreenShot(byte argc, byte* argv[], byte argt[]) {
 

	
 
	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;
 
}
 

	
 
static _iconsole_var * IConsoleStdLibVarInfo(byte argc, byte* argv[], byte argt[]) {
 
if (argc<2) return NULL;
 
if (argt[1]!=ICONSOLE_VAR_REFERENCE) {
 
	IConsoleError("variable must be an variable reference");
 
	} else {
 
    _iconsole_var * item;
 
    item = (_iconsole_var *) argv[1];
 
	IConsolePrintF(_iconsole_color_default,"variable_name: %s",item->name);
 
	IConsolePrintF(_iconsole_color_default,"variable_type: %i",item->type);
 
	IConsolePrintF(_iconsole_color_default,"variable_addr: %i",item->addr);
 
	if (item->_malloc) IConsolePrintF(_iconsole_color_default,"variable_malloc: internal allocated"); else IConsolePrintF(_iconsole_color_default, "variable_malloc: external allocated");
 
	}
 
return NULL;
 
}
 

	
 
static _iconsole_var * IConsoleStdLibDebugLevel(byte argc, byte* argv[], byte argt[]) {
 
	if (argc<2) return NULL;
 
	SetDebugString(argv[1]);
 
	return NULL;
 
}
 

	
 
static _iconsole_var * IConsoleStdLibExit(byte argc, byte* argv[], byte argt[]) {
 
	_exit_game = true;
 
	return NULL;
 
}
 

	
 
static _iconsole_var * IConsoleStdLibHelp(byte argc, byte* argv[], byte argt[]) {
 
	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;
 
}
 

	
 
static _iconsole_var * IConsoleStdLibRandom(byte argc, byte* argv[], byte argt[]) {
 
_iconsole_var * result;
 
result = IConsoleVarAlloc(ICONSOLE_VAR_UINT16);
 
IConsoleVarSetValue(result,rand());
 
return result;
 
}
 

	
 
static _iconsole_var * IConsoleStdLibListCommands(byte argc, byte* argv[], byte argt[]) {
 
_iconsole_cmd * item;
 
int l = 0;
 

	
 
if (argv[1]!=NULL) l = strlen((char *) argv[1]);
 

	
 
item = _iconsole_cmds;
 
while (item != NULL) {
 
	if (argv[1]!=NULL) {
 

	
 
		if (memcmp((void *) item->name, (void *) argv[1],l)==0)
 
				IConsolePrintF(_iconsole_color_default,"%s",item->name);
 

	
 
		} else {
 

	
 
		IConsolePrintF(_iconsole_color_default,"%s",item->name);
 

	
 
		}
 
	item = item->_next;
 
	}
 

	
 
return NULL;
 
}
 

	
 
static _iconsole_var * IConsoleStdLibListVariables(byte argc, byte* argv[], byte argt[]) {
 
_iconsole_var * item;
 
int l = 0;
 

	
 
if (argv[1]!=NULL) l = strlen((char *) argv[1]);
 

	
 
item = _iconsole_vars;
 
while (item != NULL) {
 
	if (argv[1]!=NULL) {
 

	
 
		if (memcmp((void *) item->name, (void *) argv[1],l)==0)
 
				IConsolePrintF(_iconsole_color_default,"%s",item->name);
 

	
 
		} else {
 

	
 
		IConsolePrintF(_iconsole_color_default,"%s",item->name);
 

	
 
		}
 
	item = item->_next;
 
	}
 

	
 
return NULL;
 
}
 

	
 
static _iconsole_var * IConsoleStdLibListDumpVariables(byte argc, byte* argv[], byte argt[]) {
 
_iconsole_var * item;
 
int l = 0;
 

	
 
if (argv[1]!=NULL) l = strlen((char *) argv[1]);
 

	
 
item = _iconsole_vars;
 
while (item != NULL) {
 
	if (argv[1]!=NULL) {
 

	
 
		if (memcmp((void *) item->name, (void *) argv[1],l)==0)
 
				IConsoleVarDump(item,NULL);
 

	
 
		} else {
 

	
 
		IConsoleVarDump(item,NULL);
 

	
 
		}
 
	item = item->_next;
 
	}
 

	
 
return NULL;
 
}
 

	
 
static void IConsoleStdLibRegister() {
 
	// functions
 
	IConsoleCmdRegister("debug_level",IConsoleStdLibDebugLevel);
 
	IConsoleCmdRegister("dump_vars",IConsoleStdLibListDumpVariables);
 
	IConsoleCmdRegister("echo",IConsoleStdLibEcho);
 
	IConsoleCmdRegister("echoc",IConsoleStdLibEchoC);
 
	IConsoleCmdRegister("exit",IConsoleStdLibExit);
 
	IConsoleCmdRegister("help",IConsoleStdLibHelp);
 
	IConsoleCmdRegister("printf",IConsoleStdLibPrintF);
 
	IConsoleCmdRegister("printfc",IConsoleStdLibPrintFC);
 
	IConsoleCmdRegister("quit",IConsoleStdLibExit);
 
	IConsoleCmdRegister("random",IConsoleStdLibRandom);
 
	IConsoleCmdRegister("list_cmds",IConsoleStdLibListCommands);
 
	IConsoleCmdRegister("list_vars",IConsoleStdLibListVariables);
 
	IConsoleCmdRegister("screenshot",IConsoleStdLibScreenShot);
 
	IConsoleCmdRegister("varinfo",IConsoleStdLibVarInfo);
 
	IConsoleCmdRegister("resetengines",IConsoleResetEngines);
 

	
 
	// variables
 
	IConsoleVarRegister("cursor_rate",(void *) &_icursor_rate,ICONSOLE_VAR_BYTE);
 
	IConsoleVarRegister("con_developer",(void *) &_stdlib_con_developer,ICONSOLE_VAR_BOOLEAN);
 
	IConsoleVarRegister("developer",(void *) &_stdlib_developer,ICONSOLE_VAR_BYTE);
 
#if defined(_DEBUG)
 
	{
 
	_iconsole_var * var;
 
	var = IConsoleVarAlloc(ICONSOLE_VAR_BOOLEAN);
 
	IConsoleVarInsert(var,"temp_bool");
 

	
 
	var = IConsoleVarAlloc(ICONSOLE_VAR_INT16);
 
	IConsoleVarInsert(var,"temp_int16");
 
	var = IConsoleVarAlloc(ICONSOLE_VAR_INT32);
 
	IConsoleVarInsert(var,"temp_int32");
 

	
 
	var = IConsoleVarAlloc(ICONSOLE_VAR_POINTER);
 
	IConsoleVarInsert(var,"temp_pointer");
 

	
 
	var = IConsoleVarAlloc(ICONSOLE_VAR_UINT16);
 
	IConsoleVarInsert(var,"temp_uint16");
 
	var = IConsoleVarAlloc(ICONSOLE_VAR_UINT16);
 
	IConsoleVarInsert(var,"temp_uint16_2");
 
	var = IConsoleVarAlloc(ICONSOLE_VAR_UINT32);
 
	IConsoleVarInsert(var,"temp_uint32");
 

	
 
	var = IConsoleVarAlloc(ICONSOLE_VAR_STRING);
 
	IConsoleVarInsert(var,"temp_string");
 
	var = IConsoleVarAlloc(ICONSOLE_VAR_STRING);
 
	IConsoleVarInsert(var,"temp_string2");
 
	}
 
#endif
 
}
 

	
 

	
console.h
Show inline comments
 
#ifndef CONSOLE_H
 
#define CONSOLE_H
 

	
 
// ** console ** //
 

	
 
enum {
 
@@ -20,14 +21,26 @@ enum {
 
	ICONSOLE_VAR_STRING,
 
	ICONSOLE_VAR_POINTER,
 
	ICONSOLE_VAR_REFERENCE,
 
	ICONSOLE_VAR_UNKNOWN
 
	ICONSOLE_VAR_UNKNOWN,
 
} _iconsole_var_types;
 

	
 
enum {
 
	ICONSOLE_HOOK_ACCESS,
 
	ICONSOLE_HOOK_BEFORE_CHANGE,
 
	ICONSOLE_HOOK_BEFORE_EXEC,
 
	ICONSOLE_HOOK_AFTER_CHANGE,
 
	ICONSOLE_HOOK_AFTER_EXEC,
 
} _iconsole_hook_types;
 

	
 
typedef struct {
 
	// -------------- //
 
	void * addr;
 
	byte * name;
 
	// -------------- //
 
	void * hook_access;
 
	void * hook_before_exec;
 
	void * hook_after_exec;
 
	// -------------- //
 
	void * _next;
 
	} _iconsole_cmd;
 

	
 
@@ -37,10 +50,19 @@ typedef struct {
 
	byte * name;
 
	byte type;
 
	// -------------- //
 
	void * hook_access;
 
	void * hook_before_change;
 
	void * hook_after_change;
 
	// -------------- //
 
	void * _next;
 
	bool _malloc;
 
	} _iconsole_var;
 

	
 
// ** console parser ** //
 

	
 
_iconsole_cmd * _iconsole_cmds; // list of registred commands
 
_iconsole_var * _iconsole_vars; // list of registred vars
 

	
 
// ** console colors ** //
 
VARDEF byte _iconsole_color_default;
 
VARDEF byte _iconsole_color_error;
 
@@ -48,6 +70,7 @@ VARDEF byte _iconsole_color_debug;
 
VARDEF byte _iconsole_color_commands;
 

	
 
// ** ttd.c functions ** //
 

	
 
void SetDebugString(const char *s);
 

	
 
// ** console functions ** //
 
@@ -79,6 +102,7 @@ void* IConsoleCmdGetAddr(byte * name);
 
// *** Variables *** //
 

	
 
void IConsoleVarRegister(byte * name, void * addr, byte type);
 
void IConsoleVarMemRegister(byte * name, byte type);
 
void IConsoleVarInsert(_iconsole_var * var, byte * name);
 
_iconsole_var * IConsoleVarGet(byte * name);
 
_iconsole_var * IConsoleVarAlloc(byte type);
 
@@ -91,6 +115,14 @@ void IConsoleVarDump(_iconsole_var * var
 

	
 
void IConsoleCmdExec(byte * cmdstr);
 

	
 
#include "console_cmds.h"
 
// ** console std lib ** //
 
void IConsoleStdLibRegister();
 

	
 
// ** hook code ** //
 
void IConsoleVarHook(byte * name, byte type, void * proc);
 
void IConsoleCmdHook(byte * name, byte type, void * proc);
 
bool IConsoleVarHookHandle(_iconsole_var * hook_var, byte type);
 
bool IConsoleCmdHookHandle(_iconsole_cmd * hook_cmd, byte type);
 

	
 

	
 
#endif /* CONSOLE_H */
console_cmds.c
Show inline comments
 
new file 100644
 
/* -------------------- 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
 
 
// ** console command / variable defines ** //
 
#define DEF_CONSOLE_CMD(yyyy) static _iconsole_var * yyyy(byte argc, byte* 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)
 
 
static int32 GetArgumentInteger(byte *arg)
 
{
 
	int32 result;
 
	sscanf((char *)arg, "%u", &result);
 
 
	if (result == 0 && arg[0] == '0' && arg[1] == 'x')
 
		sscanf((char *)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;
 
}
 
 
DEF_CONSOLE_VAR_HOOK(ConVarHookNoNetwork)
 
{
 
	if (_networking) {
 
		IConsoleError("this variable is forbidden in multiplayer");
 
		return false;
 
		}
 
	return true;
 
}
 
 
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;
 
}
 
 
DEF_CONSOLE_CMD(ConResetTile)
 
{
 
	if (argc == 2) {
 
		TileIndex tile = (TileIndex)GetArgumentInteger(argv[1]);
 
		DoClearSquare(tile);
 
	}
 
 
	return 0;
 
}
 
 
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)
 
{
 
	byte * b;
 
	byte * ip = NULL;
 
	byte * port = NULL;
 
	byte * player = NULL;
 
	byte c;
 
	uint16 rport;
 
 
	if (argc<2) return NULL;
 
 
	b = argv[1];
 
	rport = _network_server_port;
 
	c = 0;
 
	ip = b;
 
	
 
	while (b[c] != 0) {
 
		if (((char)b[c]) == '#') {
 
			player = &b[c+1];
 
			b[c] = 0;
 
			}
 
		if (((char)b[c]) == ':') {
 
			port = &b[c+1];
 
			b[c] = 0;
 
			}
 
		c++;
 
		}
 
 
	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(b, rport);
 
 
	return NULL;
 
}
 
 
#endif
 
 
/* **************************** */
 
/*   default console commands   */
 
/* **************************** */
 
 
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]);
 
	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]);
 
	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(ConVarInfo)
 
{
 
	if (argc<2) return NULL;
 
	if (argt[1]!=ICONSOLE_VAR_REFERENCE) {
 
		IConsoleError("variable must be an variable reference");
 
		} else {
 
		_iconsole_var * item;
 
		item = (_iconsole_var *) argv[1];
 
		IConsolePrintF(_iconsole_color_default,"variable_name: %s",item->name);
 
		IConsolePrintF(_iconsole_color_default,"variable_type: %i",item->type);
 
		IConsolePrintF(_iconsole_color_default,"variable_addr: %i",item->addr);
 
		if (item->_malloc) IConsolePrintF(_iconsole_color_default,"variable_malloc: internal allocated"); else IConsolePrintF(_iconsole_color_default, "variable_malloc: external allocated");
 
		}
 
	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) 
 
{
 
	_iconsole_cmd * item;
 
	int l = 0;
 
 
	if (argv[1]!=NULL) l = strlen((char *) argv[1]);
 
 
	item = _iconsole_cmds;
 
	while (item != NULL) {
 
		if (argv[1]!=NULL) {
 
 
			if (memcmp((void *) item->name, (void *) argv[1],l)==0)
 
					IConsolePrintF(_iconsole_color_default,"%s",item->name);
 
 
			} else {
 
 
			IConsolePrintF(_iconsole_color_default,"%s",item->name);
 
 
			}
 
		item = item->_next;
 
		}
 
 
	return NULL;
 
}
 
 
DEF_CONSOLE_CMD(ConListVariables) 
 
{
 
	_iconsole_var * item;
 
	int l = 0;
 
 
	if (argv[1]!=NULL) l = strlen((char *) argv[1]);
 
 
	item = _iconsole_vars;
 
	while (item != NULL) {
 
		if (argv[1]!=NULL) {
 
 
			if (memcmp((void *) item->name, (void *) argv[1],l)==0)
 
					IConsolePrintF(_iconsole_color_default,"%s",item->name);
 
 
			} else {
 
 
			IConsolePrintF(_iconsole_color_default,"%s",item->name);
 
 
			}
 
		item = item->_next;
 
		}
 
 
	return NULL;
 
}
 
 
DEF_CONSOLE_CMD(ConListDumpVariables)
 
{
 
	_iconsole_var * item;
 
	int l = 0;
 
 
	if (argv[1]!=NULL) l = strlen((char *) argv[1]);
 
 
	item = _iconsole_vars;
 
	while (item != NULL) {
 
		if (argv[1]!=NULL) {
 
 
			if (memcmp((void *) item->name, (void *) argv[1],l)==0)
 
					IConsoleVarDump(item,NULL);
 
 
			} else {
 
 
			IConsoleVarDump(item,NULL);
 
 
			}
 
		item = item->_next;
 
		}
 
 
	return NULL;
 
}
 
 
#ifdef _DEBUG
 
/* ****************************************** */
 
/*  debug commands and variables */
 
/* ****************************************** */
 
 
void IConsoleDebugLibRegister() 
 
{
 
	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;
 
	extern bool _stdlib_con_developer;
 
 
#ifdef _DEBUG
 
	IConsoleDebugLibRegister();
 
#endif
 
 
	// functions [please add them alphabeticaly]
 
#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("exit",ConExit);
 
	IConsoleCmdRegister("help",ConHelp);
 
	IConsoleCmdRegister("printf",ConPrintF);
 
	IConsoleCmdRegister("printfc",ConPrintFC);
 
	IConsoleCmdRegister("quit",ConExit);
 
	IConsoleCmdRegister("random",ConRandom);
 
	IConsoleCmdRegister("list_cmds",ConListCommands);
 
	IConsoleCmdRegister("list_vars",ConListVariables);
 
	IConsoleCmdRegister("resetengines",ConResetEngines);
 
	IConsoleCmdHook("resetengines",ICONSOLE_HOOK_ACCESS,ConCmdHookNoNetwork);
 
	IConsoleCmdRegister("screenshot",ConScreenShot);
 
	IConsoleCmdRegister("scrollto",ConScrollToTile);
 
	IConsoleCmdRegister("varinfo",ConVarInfo);
 
 
	// variables [please add them alphabeticaly]
 
	IConsoleVarRegister("con_developer",(void *) &_stdlib_con_developer,ICONSOLE_VAR_BOOLEAN);
 
	IConsoleVarRegister("developer",(void *) &_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
 
 
 
}
 
/* -------------------- dont cross this line --------------------- */
console_cmds.h
Show inline comments
 
#ifndef CONSOLE_CMDS_H
 
#define CONSOLE_CMDS_H
 

	
 
/* Console_CMDS.h is the placeholder of all the console commands
 
 * that will be added to the game. Register the command in
 
 * * console.c IConsoleStdLibRegister;
 
 * then put the command in the appropiate place (eg. where it belongs, stations
 
 * stuff in station_cmd.c, etc.), and add the function decleration here.
 
 */
 

	
 
_iconsole_var * IConsoleResetEngines(byte argc, byte* argv[], byte argt[]);
 

	
 
#endif /* CONSOLE_CMDS_H */
engine.c
Show inline comments
 
@@ -7,7 +7,6 @@
 
#include "vehicle.h"
 
#include "news.h"
 
#include "saveload.h"
 
#include "console.h"
 

	
 
#define UPDATE_PLAYER_RAILTYPE(e,p) if ((byte)(e->railtype + 1) > p->max_railtype) p->max_railtype = e->railtype + 1;
 

	
 
@@ -165,8 +164,6 @@ void StartupEngines()
 
	AdjustAvailAircraft();
 
}
 

	
 
_iconsole_var * IConsoleResetEngines(byte argc, byte* argv[], byte argt[]) {StartupEngines(); return 0;}
 

	
 
uint32 _engine_refit_masks[256];
 

	
 

	
network.c
Show inline comments
 
@@ -202,8 +202,6 @@ static int _num_clients;
 
// keep a history of the 16 most recent seeds to be able to capture out of sync errors.
 
static uint32 _my_seed_list[16][2];
 
static bool _network_ready_sent;
 
static uint16 _network_ready_ahead = 1;
 
static uint16 _network_client_timeout;
 
static uint32 _frame_fsync_last;
 

	
 
typedef struct FutureSeeds {
 
@@ -1348,28 +1346,6 @@ void NetworkStartSync(bool fcreset)
 
	memset(_my_seed_list, 0, sizeof(_my_seed_list));
 
}
 

	
 
// ********************************* //
 
// * Network Core Console Commands * //
 
// ********************************* //
 

	
 
static _iconsole_var * NetworkConsoleCmdConnect(byte argc, byte* argv[], byte argt[])
 
{
 
	if (argc<2) return NULL;
 

	
 
	if (argc == 2) {
 
		IConsolePrintF(_iconsole_color_default, "connecting to %s",argv[1]);
 
		NetworkCoreConnectGame(argv[1],_network_server_port);
 
	} else if (argc == 3) {
 
		IConsolePrintF(_iconsole_color_default, "connecting to %s on port %s",argv[1],argv[2]);
 
		NetworkCoreConnectGame(argv[1],atoi(argv[2]));
 
	} else if (argc == 4) {
 
		IConsolePrintF(_iconsole_color_default, "connecting to %s on port %s as player %s",argv[1],argv[2],argv[3]);
 
		_network_playas = atoi(argv[3]);
 
		NetworkCoreConnectGame(argv[1],atoi(argv[2]));
 
		}
 
	return NULL;
 
}
 

	
 
// ************************** //
 
// * UDP Network Extensions * //
 
// ************************** //
 
@@ -1587,8 +1563,9 @@ void NetworkIPListInit()
 
void NetworkCoreInit()
 
{
 
	DEBUG(net, 3) ("[NET][Core] init()");
 
	_network_available=true;
 
	_network_client_timeout=300;
 
	_network_available = true;
 
	_network_client_timeout = 300;
 
	_network_ready_ahead = 1;
 

	
 
	// [win32] winsock startup
 

	
 
@@ -1644,10 +1621,6 @@ void NetworkCoreInit()
 
		DEBUG(net, 3) ("[NET][Core] OK: multiplayer available");
 
		// initiate network ip list
 
		NetworkIPListInit();
 
		IConsoleCmdRegister("connect",NetworkConsoleCmdConnect);
 
		IConsoleVarRegister("net_client_timeout",&_network_client_timeout,ICONSOLE_VAR_UINT16);
 
		IConsoleVarRegister("net_ready_ahead",&_network_ready_ahead,ICONSOLE_VAR_UINT16);
 
		IConsoleVarRegister("net_sync_freq",&_network_sync_freq,ICONSOLE_VAR_UINT16);
 
	} else
 
		DEBUG(net, 3) ("[NET][Core] FAILED: multiplayer not available");
 
}
 
@@ -1938,6 +1911,7 @@ void NetworkGameListFromLAN() {};
 
void NetworkGameListFromInternet() {};
 
void NetworkGameFillDefaults() {};
 
NetworkGameList * NetworkGameListItem(uint16 index) {return NULL;};
 
bool NetworkCoreConnectGameStruct(NetworkGameList * item) {return false;};
 
void NetworkGameChangeDate(uint16 newdate) {};
 

	
 
#endif
ttd.vcproj
Show inline comments
 
@@ -296,6 +296,9 @@
 
				RelativePath=".\console.c">
 
			</File>
 
			<File
 
				RelativePath=".\console_cmds.c">
 
			</File>
 
			<File
 
				RelativePath="economy.c">
 
				<FileConfiguration
 
					Name="Release|Win32">
 
@@ -1105,9 +1108,6 @@
 
				RelativePath="console.h">
 
			</File>
 
			<File
 
				RelativePath=".\console_cmds.h">
 
			</File>
 
			<File
 
				RelativePath="economy.h">
 
			</File>
 
			<File
variables.h
Show inline comments
 
@@ -231,6 +231,8 @@ VARDEF uint _network_server_port;
 

	
 
VARDEF uint16 _network_sync_freq;
 
VARDEF uint16 _network_ahead_frames;
 
VARDEF uint16 _network_ready_ahead;
 
VARDEF uint16 _network_client_timeout;
 

	
 
VARDEF uint32 _sync_seed_1, _sync_seed_2;
 

	
0 comments (0 inline, 0 general)