mirror of https://github.com/OpenTTD/OpenTTD
(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]release/0.4.5
parent
7cb5b1954d
commit
d6cab2e06d
424
console.c
424
console.c
|
@ -9,7 +9,6 @@
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include "console.h"
|
#include "console.h"
|
||||||
|
|
||||||
|
|
||||||
// ** main console ** //
|
// ** main console ** //
|
||||||
static bool _iconsole_inited;
|
static bool _iconsole_inited;
|
||||||
static byte* _iconsole_buffer[80];
|
static byte* _iconsole_buffer[80];
|
||||||
|
@ -20,15 +19,19 @@ static byte _iconsole_mode = ICONSOLE_CLOSED;
|
||||||
static Window *_iconsole_win = NULL;
|
static Window *_iconsole_win = NULL;
|
||||||
static byte _iconsole_scroll;
|
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 ** //
|
// ** console cursor ** //
|
||||||
static bool _icursor_state;
|
static bool _icursor_state;
|
||||||
static byte _icursor_rate;
|
static byte _icursor_rate;
|
||||||
static byte _icursor_counter;
|
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 ** //
|
// ** console window ** //
|
||||||
static void IConsoleWndProc(Window *w, WindowEvent *e);
|
static void IConsoleWndProc(Window *w, WindowEvent *e);
|
||||||
static const Widget _iconsole_window_widgets[] = {{WIDGETS_END}};
|
static const Widget _iconsole_window_widgets[] = {{WIDGETS_END}};
|
||||||
|
@ -40,15 +43,6 @@ static const WindowDesc _iconsole_window_desc = {
|
||||||
IConsoleWndProc,
|
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 */
|
/* end of header */
|
||||||
/* *************** */
|
/* *************** */
|
||||||
|
@ -238,7 +232,8 @@ _iconsole_inited=false;
|
||||||
IConsoleClear();
|
IConsoleClear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void IConsoleResize() {
|
void IConsoleResize()
|
||||||
|
{
|
||||||
if (_iconsole_win!=NULL) {
|
if (_iconsole_win!=NULL) {
|
||||||
_iconsole_win->height = _screen.height / 3;
|
_iconsole_win->height = _screen.height / 3;
|
||||||
_iconsole_win->width= _screen.width;
|
_iconsole_win->width= _screen.width;
|
||||||
|
@ -263,16 +258,19 @@ void IConsoleSwitch()
|
||||||
_video_driver->make_dirty(0,0,_screen.width,_screen.height);
|
_video_driver->make_dirty(0,0,_screen.width,_screen.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IConsoleClose() {
|
void IConsoleClose()
|
||||||
|
{
|
||||||
if (_iconsole_mode==ICONSOLE_OPENED) IConsoleSwitch();
|
if (_iconsole_mode==ICONSOLE_OPENED) IConsoleSwitch();
|
||||||
_iconsole_mode=ICONSOLE_CLOSED;
|
_iconsole_mode=ICONSOLE_CLOSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IConsoleOpen() {
|
void IConsoleOpen()
|
||||||
|
{
|
||||||
if (_iconsole_mode==ICONSOLE_CLOSED) IConsoleSwitch();
|
if (_iconsole_mode==ICONSOLE_CLOSED) IConsoleSwitch();
|
||||||
}
|
}
|
||||||
|
|
||||||
void IConsoleCmdBufferAdd(byte * cmd) {
|
void IConsoleCmdBufferAdd(byte * cmd)
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
if (_iconsole_cmdbufferpos != 19) return;
|
if (_iconsole_cmdbufferpos != 19) return;
|
||||||
if (_iconsole_cmdbuffer[18]!=NULL) free(_iconsole_cmdbuffer[18]);
|
if (_iconsole_cmdbuffer[18]!=NULL) free(_iconsole_cmdbuffer[18]);
|
||||||
|
@ -285,7 +283,8 @@ _iconsole_cmdbuffer[0][i]=0;
|
||||||
_iconsole_cmdbufferpos = 19;
|
_iconsole_cmdbufferpos = 19;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IConsoleCmdBufferNavigate(signed char direction) {
|
void IConsoleCmdBufferNavigate(signed char direction)
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
i=_iconsole_cmdbufferpos + direction;
|
i=_iconsole_cmdbufferpos + direction;
|
||||||
if (i<0) i=19;
|
if (i<0) i=19;
|
||||||
|
@ -350,15 +349,18 @@ void CDECL IConsolePrintF(byte color_code, const char *s, ...)
|
||||||
IConsolePrint(color_code, (byte *) &buf);
|
IConsolePrint(color_code, (byte *) &buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IConsoleDebug(byte* string) {
|
void IConsoleDebug(byte* string)
|
||||||
|
{
|
||||||
if (_stdlib_developer>1) IConsolePrintF(_iconsole_color_debug, "DEBUG: %s", string);
|
if (_stdlib_developer>1) IConsolePrintF(_iconsole_color_debug, "DEBUG: %s", string);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IConsoleError(byte* string) {
|
void IConsoleError(byte* string)
|
||||||
|
{
|
||||||
if (_stdlib_developer>0) IConsolePrintF(_iconsole_color_error, "ERROR: %s", string);
|
if (_stdlib_developer>0) IConsolePrintF(_iconsole_color_error, "ERROR: %s", string);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IConsoleCmdRegister(byte * name, void * addr) {
|
void IConsoleCmdRegister(byte * name, void * addr)
|
||||||
|
{
|
||||||
byte * _new;
|
byte * _new;
|
||||||
_iconsole_cmd * item;
|
_iconsole_cmd * item;
|
||||||
_iconsole_cmd * item_new;
|
_iconsole_cmd * item_new;
|
||||||
|
@ -375,6 +377,10 @@ item_new->_next = NULL;
|
||||||
item_new->addr = addr;
|
item_new->addr = addr;
|
||||||
item_new->name = _new;
|
item_new->name = _new;
|
||||||
|
|
||||||
|
item_new->hook_access = NULL;
|
||||||
|
item_new->hook_after_exec = NULL;
|
||||||
|
item_new->hook_before_exec = NULL;
|
||||||
|
|
||||||
item = _iconsole_cmds;
|
item = _iconsole_cmds;
|
||||||
if (item == NULL) {
|
if (item == NULL) {
|
||||||
_iconsole_cmds = item_new;
|
_iconsole_cmds = item_new;
|
||||||
|
@ -384,18 +390,20 @@ if (item == NULL) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void* IConsoleCmdGetAddr(byte * name) {
|
void* IConsoleCmdGet(byte * name)
|
||||||
|
{
|
||||||
_iconsole_cmd * item;
|
_iconsole_cmd * item;
|
||||||
|
|
||||||
item = _iconsole_cmds;
|
item = _iconsole_cmds;
|
||||||
while (item != NULL) {
|
while (item != NULL) {
|
||||||
if (strcmp(item->name,name)==0) return item->addr;
|
if (strcmp(item->name,name)==0) return item;
|
||||||
item = item->_next;
|
item = item->_next;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IConsoleVarRegister(byte * name, void * addr, byte type) {
|
void IConsoleVarRegister(byte * name, void * addr, byte type)
|
||||||
|
{
|
||||||
byte * _new;
|
byte * _new;
|
||||||
_iconsole_var * item;
|
_iconsole_var * item;
|
||||||
_iconsole_var * item_new;
|
_iconsole_var * item_new;
|
||||||
|
@ -415,6 +423,10 @@ item_new->name = _new;
|
||||||
item_new->type = type;
|
item_new->type = type;
|
||||||
item_new->_malloc = false;
|
item_new->_malloc = false;
|
||||||
|
|
||||||
|
item_new->hook_access = NULL;
|
||||||
|
item_new->hook_after_change = NULL;
|
||||||
|
item_new->hook_before_change = NULL;
|
||||||
|
|
||||||
item = _iconsole_vars;
|
item = _iconsole_vars;
|
||||||
if (item == NULL) {
|
if (item == NULL) {
|
||||||
_iconsole_vars = item_new;
|
_iconsole_vars = item_new;
|
||||||
|
@ -424,7 +436,16 @@ if (item == NULL) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IConsoleVarInsert(_iconsole_var * var, byte * name) {
|
void IConsoleVarMemRegister(byte * name, byte type)
|
||||||
|
{
|
||||||
|
_iconsole_var * item;
|
||||||
|
item = IConsoleVarAlloc(type);
|
||||||
|
IConsoleVarInsert(item,name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void IConsoleVarInsert(_iconsole_var * var, byte * name)
|
||||||
|
{
|
||||||
byte * _new;
|
byte * _new;
|
||||||
_iconsole_var * item;
|
_iconsole_var * item;
|
||||||
_iconsole_var * item_new;
|
_iconsole_var * item_new;
|
||||||
|
@ -453,7 +474,8 @@ if (item == NULL) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
_iconsole_var * IConsoleVarGet(byte * name) {
|
_iconsole_var * IConsoleVarGet(byte * name)
|
||||||
|
{
|
||||||
_iconsole_var * item;
|
_iconsole_var * item;
|
||||||
|
|
||||||
item = _iconsole_vars;
|
item = _iconsole_vars;
|
||||||
|
@ -464,7 +486,8 @@ while (item != NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
_iconsole_var * IConsoleVarAlloc(byte type) {
|
_iconsole_var * IConsoleVarAlloc(byte type)
|
||||||
|
{
|
||||||
_iconsole_var * item;
|
_iconsole_var * item;
|
||||||
item=malloc(sizeof(_iconsole_var));
|
item=malloc(sizeof(_iconsole_var));
|
||||||
item->_next = NULL;
|
item->_next = NULL;
|
||||||
|
@ -518,18 +541,24 @@ switch (item->type) {
|
||||||
item->_malloc = false;
|
item->_malloc = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
item->hook_access = NULL;
|
||||||
|
item->hook_after_change = NULL;
|
||||||
|
item->hook_before_change = NULL;
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void IConsoleVarFree(_iconsole_var * var) {
|
void IConsoleVarFree(_iconsole_var * var)
|
||||||
|
{
|
||||||
if (var ->_malloc) {
|
if (var ->_malloc) {
|
||||||
free(var ->addr);
|
free(var ->addr);
|
||||||
}
|
}
|
||||||
free(var);
|
free(var);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IConsoleVarSetString(_iconsole_var * var, byte * string) {
|
void IConsoleVarSetString(_iconsole_var * var, byte * string)
|
||||||
|
{
|
||||||
int l;
|
int l;
|
||||||
|
|
||||||
if (string == NULL) return;
|
if (string == NULL) return;
|
||||||
|
@ -583,8 +612,8 @@ switch (var->type) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IConsoleVarDump(_iconsole_var * var, byte * dump_desc) {
|
void IConsoleVarDump(_iconsole_var * var, byte * dump_desc)
|
||||||
|
{
|
||||||
byte var_b; // TYPE BYTE
|
byte var_b; // TYPE BYTE
|
||||||
unsigned short var_ui16; // TYPE UINT16
|
unsigned short var_ui16; // TYPE UINT16
|
||||||
unsigned int var_ui32; // TYPE UINT32
|
unsigned int var_ui32; // TYPE UINT32
|
||||||
|
@ -651,10 +680,86 @@ byte * var_s; // TYPE STRING
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void IConsoleCmdExec(byte * cmdstr) {
|
// * ************************* * //
|
||||||
|
// * 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
void IConsoleCmdExec(byte * cmdstr)
|
||||||
|
{
|
||||||
_iconsole_var * (*function)(byte argc, byte* argv[], byte argt[]);
|
_iconsole_var * (*function)(byte argc, byte* argv[], byte argt[]);
|
||||||
byte * tokens[20];
|
byte * tokens[20];
|
||||||
byte tokentypes[20];
|
byte tokentypes[20];
|
||||||
|
@ -663,6 +768,7 @@ byte * tokenstream_s;
|
||||||
byte execution_mode;
|
byte execution_mode;
|
||||||
_iconsole_var * var = NULL;
|
_iconsole_var * var = NULL;
|
||||||
_iconsole_var * result = NULL;
|
_iconsole_var * result = NULL;
|
||||||
|
_iconsole_cmd * cmd = NULL;
|
||||||
|
|
||||||
bool longtoken;
|
bool longtoken;
|
||||||
bool valid_token;
|
bool valid_token;
|
||||||
|
@ -767,7 +873,10 @@ for (i=0; i<c; i++) {
|
||||||
|
|
||||||
execution_mode=0;
|
execution_mode=0;
|
||||||
|
|
||||||
function = IConsoleCmdGetAddr(tokens[0]);
|
function = NULL;
|
||||||
|
cmd = IConsoleCmdGet(tokens[0]);
|
||||||
|
if (cmd != NULL) function = cmd->addr;
|
||||||
|
|
||||||
if (function != NULL) {
|
if (function != NULL) {
|
||||||
execution_mode=1; // this is a command
|
execution_mode=1; // this is a command
|
||||||
} else {
|
} else {
|
||||||
|
@ -776,7 +885,11 @@ if (function != NULL) {
|
||||||
execution_mode=2; // this is a variable
|
execution_mode=2; // this is a variable
|
||||||
if (c>2) if (strcmp(tokens[1],"<<")==0) {
|
if (c>2) if (strcmp(tokens[1],"<<")==0) {
|
||||||
// this is command to variable mode [normal]
|
// this is command to variable mode [normal]
|
||||||
function = IConsoleCmdGetAddr(tokens[2]);
|
|
||||||
|
function = NULL;
|
||||||
|
cmd = IConsoleCmdGet(tokens[2]);
|
||||||
|
if (cmd != NULL) function = cmd->addr;
|
||||||
|
|
||||||
if (function != NULL) {
|
if (function != NULL) {
|
||||||
execution_mode=3;
|
execution_mode=3;
|
||||||
} else {
|
} else {
|
||||||
|
@ -799,20 +912,23 @@ case 0:
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
{
|
if (IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_ACCESS)) {
|
||||||
// execution with command syntax
|
// execution with command syntax
|
||||||
|
IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_BEFORE_EXEC);
|
||||||
result = function(c,tokens,tokentypes);
|
result = function(c,tokens,tokentypes);
|
||||||
if (result!=NULL) {
|
if (result!=NULL) {
|
||||||
IConsoleVarDump(result,"result");
|
IConsoleVarDump(result,"result");
|
||||||
IConsoleVarFree(result);
|
IConsoleVarFree(result);
|
||||||
}
|
}
|
||||||
|
IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_AFTER_EXEC);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
{
|
{
|
||||||
// execution with variable syntax
|
// execution with variable syntax
|
||||||
if ((c==2) || (c==3)) {
|
if (IConsoleVarHookHandle(var,ICONSOLE_HOOK_ACCESS)) if ((c==2) || (c==3)) {
|
||||||
// ** variable modifications ** //
|
// ** variable modifications ** //
|
||||||
|
IConsoleVarHookHandle(var,ICONSOLE_HOOK_BEFORE_CHANGE);
|
||||||
switch (var->type) {
|
switch (var->type) {
|
||||||
case ICONSOLE_VAR_BOOLEAN:
|
case ICONSOLE_VAR_BOOLEAN:
|
||||||
{
|
{
|
||||||
|
@ -987,6 +1103,7 @@ case 2:
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
IConsoleVarHookHandle(var,ICONSOLE_HOOK_AFTER_CHANGE);
|
||||||
}
|
}
|
||||||
if (c==1) {
|
if (c==1) {
|
||||||
// ** variable output ** //
|
// ** variable output ** //
|
||||||
|
@ -998,7 +1115,7 @@ case 3:
|
||||||
case 4:
|
case 4:
|
||||||
{
|
{
|
||||||
// execute command with result or assign a variable
|
// execute command with result or assign a variable
|
||||||
if (execution_mode==3) {
|
if (execution_mode==3) if (IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_ACCESS)) {
|
||||||
int i;
|
int i;
|
||||||
int diff;
|
int diff;
|
||||||
void * temp;
|
void * temp;
|
||||||
|
@ -1015,14 +1132,18 @@ case 4:
|
||||||
tokens[19]=temp;
|
tokens[19]=temp;
|
||||||
tokentypes[19]=temp2;
|
tokentypes[19]=temp2;
|
||||||
}
|
}
|
||||||
|
IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_BEFORE_EXEC);
|
||||||
result = function(c,tokens,tokentypes);
|
result = function(c,tokens,tokentypes);
|
||||||
|
IConsoleCmdHookHandle(cmd,ICONSOLE_HOOK_AFTER_EXEC);
|
||||||
|
} else {
|
||||||
|
execution_mode=255;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result!=NULL) {
|
if (IConsoleVarHookHandle(var,ICONSOLE_HOOK_ACCESS)) if (result!=NULL) {
|
||||||
if (result ->type != var -> type) {
|
if (result ->type != var -> type) {
|
||||||
IConsoleError("variable type missmatch");
|
IConsoleError("variable type missmatch");
|
||||||
} else {
|
} else {
|
||||||
|
IConsoleVarHookHandle(var,ICONSOLE_HOOK_BEFORE_CHANGE);
|
||||||
switch (result->type) {
|
switch (result->type) {
|
||||||
case ICONSOLE_VAR_BOOLEAN:
|
case ICONSOLE_VAR_BOOLEAN:
|
||||||
{
|
{
|
||||||
|
@ -1078,6 +1199,7 @@ case 4:
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
IConsoleVarHookHandle(var,ICONSOLE_HOOK_AFTER_CHANGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (execution_mode==3) {
|
if (execution_mode==3) {
|
||||||
|
@ -1100,223 +1222,3 @@ for (i=0;i<20;i++) tokens[i]=NULL;
|
||||||
free(tokenstream_s);
|
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
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
36
console.h
36
console.h
|
@ -1,5 +1,6 @@
|
||||||
#ifndef CONSOLE_H
|
#ifndef CONSOLE_H
|
||||||
#define CONSOLE_H
|
#define CONSOLE_H
|
||||||
|
|
||||||
// ** console ** //
|
// ** console ** //
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -20,14 +21,26 @@ enum {
|
||||||
ICONSOLE_VAR_STRING,
|
ICONSOLE_VAR_STRING,
|
||||||
ICONSOLE_VAR_POINTER,
|
ICONSOLE_VAR_POINTER,
|
||||||
ICONSOLE_VAR_REFERENCE,
|
ICONSOLE_VAR_REFERENCE,
|
||||||
ICONSOLE_VAR_UNKNOWN
|
ICONSOLE_VAR_UNKNOWN,
|
||||||
} _iconsole_var_types;
|
} _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 {
|
typedef struct {
|
||||||
// -------------- //
|
// -------------- //
|
||||||
void * addr;
|
void * addr;
|
||||||
byte * name;
|
byte * name;
|
||||||
// -------------- //
|
// -------------- //
|
||||||
|
void * hook_access;
|
||||||
|
void * hook_before_exec;
|
||||||
|
void * hook_after_exec;
|
||||||
|
// -------------- //
|
||||||
void * _next;
|
void * _next;
|
||||||
} _iconsole_cmd;
|
} _iconsole_cmd;
|
||||||
|
|
||||||
|
@ -37,10 +50,19 @@ typedef struct {
|
||||||
byte * name;
|
byte * name;
|
||||||
byte type;
|
byte type;
|
||||||
// -------------- //
|
// -------------- //
|
||||||
|
void * hook_access;
|
||||||
|
void * hook_before_change;
|
||||||
|
void * hook_after_change;
|
||||||
|
// -------------- //
|
||||||
void * _next;
|
void * _next;
|
||||||
bool _malloc;
|
bool _malloc;
|
||||||
} _iconsole_var;
|
} _iconsole_var;
|
||||||
|
|
||||||
|
// ** console parser ** //
|
||||||
|
|
||||||
|
_iconsole_cmd * _iconsole_cmds; // list of registred commands
|
||||||
|
_iconsole_var * _iconsole_vars; // list of registred vars
|
||||||
|
|
||||||
// ** console colors ** //
|
// ** console colors ** //
|
||||||
VARDEF byte _iconsole_color_default;
|
VARDEF byte _iconsole_color_default;
|
||||||
VARDEF byte _iconsole_color_error;
|
VARDEF byte _iconsole_color_error;
|
||||||
|
@ -48,6 +70,7 @@ VARDEF byte _iconsole_color_debug;
|
||||||
VARDEF byte _iconsole_color_commands;
|
VARDEF byte _iconsole_color_commands;
|
||||||
|
|
||||||
// ** ttd.c functions ** //
|
// ** ttd.c functions ** //
|
||||||
|
|
||||||
void SetDebugString(const char *s);
|
void SetDebugString(const char *s);
|
||||||
|
|
||||||
// ** console functions ** //
|
// ** console functions ** //
|
||||||
|
@ -79,6 +102,7 @@ void* IConsoleCmdGetAddr(byte * name);
|
||||||
// *** Variables *** //
|
// *** Variables *** //
|
||||||
|
|
||||||
void IConsoleVarRegister(byte * name, void * addr, byte type);
|
void IConsoleVarRegister(byte * name, void * addr, byte type);
|
||||||
|
void IConsoleVarMemRegister(byte * name, byte type);
|
||||||
void IConsoleVarInsert(_iconsole_var * var, byte * name);
|
void IConsoleVarInsert(_iconsole_var * var, byte * name);
|
||||||
_iconsole_var * IConsoleVarGet(byte * name);
|
_iconsole_var * IConsoleVarGet(byte * name);
|
||||||
_iconsole_var * IConsoleVarAlloc(byte type);
|
_iconsole_var * IConsoleVarAlloc(byte type);
|
||||||
|
@ -91,6 +115,14 @@ void IConsoleVarDump(_iconsole_var * var, byte * dump_desc);
|
||||||
|
|
||||||
void IConsoleCmdExec(byte * cmdstr);
|
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 */
|
#endif /* CONSOLE_H */
|
||||||
|
|
|
@ -0,0 +1,387 @@
|
||||||
|
/* -------------------- 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 --------------------- */
|
|
@ -1,13 +0,0 @@
|
||||||
#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 */
|
|
3
engine.c
3
engine.c
|
@ -7,7 +7,6 @@
|
||||||
#include "vehicle.h"
|
#include "vehicle.h"
|
||||||
#include "news.h"
|
#include "news.h"
|
||||||
#include "saveload.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;
|
#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();
|
AdjustAvailAircraft();
|
||||||
}
|
}
|
||||||
|
|
||||||
_iconsole_var * IConsoleResetEngines(byte argc, byte* argv[], byte argt[]) {StartupEngines(); return 0;}
|
|
||||||
|
|
||||||
uint32 _engine_refit_masks[256];
|
uint32 _engine_refit_masks[256];
|
||||||
|
|
||||||
|
|
||||||
|
|
30
network.c
30
network.c
|
@ -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.
|
// 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 uint32 _my_seed_list[16][2];
|
||||||
static bool _network_ready_sent;
|
static bool _network_ready_sent;
|
||||||
static uint16 _network_ready_ahead = 1;
|
|
||||||
static uint16 _network_client_timeout;
|
|
||||||
static uint32 _frame_fsync_last;
|
static uint32 _frame_fsync_last;
|
||||||
|
|
||||||
typedef struct FutureSeeds {
|
typedef struct FutureSeeds {
|
||||||
|
@ -1348,28 +1346,6 @@ void NetworkStartSync(bool fcreset)
|
||||||
memset(_my_seed_list, 0, sizeof(_my_seed_list));
|
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 * //
|
// * UDP Network Extensions * //
|
||||||
// ************************** //
|
// ************************** //
|
||||||
|
@ -1589,6 +1565,7 @@ void NetworkCoreInit()
|
||||||
DEBUG(net, 3) ("[NET][Core] init()");
|
DEBUG(net, 3) ("[NET][Core] init()");
|
||||||
_network_available = true;
|
_network_available = true;
|
||||||
_network_client_timeout = 300;
|
_network_client_timeout = 300;
|
||||||
|
_network_ready_ahead = 1;
|
||||||
|
|
||||||
// [win32] winsock startup
|
// [win32] winsock startup
|
||||||
|
|
||||||
|
@ -1644,10 +1621,6 @@ void NetworkCoreInit()
|
||||||
DEBUG(net, 3) ("[NET][Core] OK: multiplayer available");
|
DEBUG(net, 3) ("[NET][Core] OK: multiplayer available");
|
||||||
// initiate network ip list
|
// initiate network ip list
|
||||||
NetworkIPListInit();
|
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
|
} else
|
||||||
DEBUG(net, 3) ("[NET][Core] FAILED: multiplayer not available");
|
DEBUG(net, 3) ("[NET][Core] FAILED: multiplayer not available");
|
||||||
}
|
}
|
||||||
|
@ -1938,6 +1911,7 @@ void NetworkGameListFromLAN() {};
|
||||||
void NetworkGameListFromInternet() {};
|
void NetworkGameListFromInternet() {};
|
||||||
void NetworkGameFillDefaults() {};
|
void NetworkGameFillDefaults() {};
|
||||||
NetworkGameList * NetworkGameListItem(uint16 index) {return NULL;};
|
NetworkGameList * NetworkGameListItem(uint16 index) {return NULL;};
|
||||||
|
bool NetworkCoreConnectGameStruct(NetworkGameList * item) {return false;};
|
||||||
void NetworkGameChangeDate(uint16 newdate) {};
|
void NetworkGameChangeDate(uint16 newdate) {};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -295,6 +295,9 @@
|
||||||
<File
|
<File
|
||||||
RelativePath=".\console.c">
|
RelativePath=".\console.c">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\console_cmds.c">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="economy.c">
|
RelativePath="economy.c">
|
||||||
<FileConfiguration
|
<FileConfiguration
|
||||||
|
@ -1104,9 +1107,6 @@
|
||||||
<File
|
<File
|
||||||
RelativePath="console.h">
|
RelativePath="console.h">
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath=".\console_cmds.h">
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="economy.h">
|
RelativePath="economy.h">
|
||||||
</File>
|
</File>
|
||||||
|
|
|
@ -231,6 +231,8 @@ VARDEF uint _network_server_port;
|
||||||
|
|
||||||
VARDEF uint16 _network_sync_freq;
|
VARDEF uint16 _network_sync_freq;
|
||||||
VARDEF uint16 _network_ahead_frames;
|
VARDEF uint16 _network_ahead_frames;
|
||||||
|
VARDEF uint16 _network_ready_ahead;
|
||||||
|
VARDEF uint16 _network_client_timeout;
|
||||||
|
|
||||||
VARDEF uint32 _sync_seed_1, _sync_seed_2;
|
VARDEF uint32 _sync_seed_1, _sync_seed_2;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue