From a9972399c52f0d91f089ba3ab928edf9442fd10f Mon Sep 17 00:00:00 2001 From: dominik Date: Mon, 13 Dec 2004 22:13:02 +0000 Subject: [PATCH] (svn r1077) Implements scripts/autoexec.scr to get executed on game starting (sign_de) - %! allows to merge alias parameters - \% allows to use % in alias strings - "alias" command now overwrites the old alias list entry --- console.c | 29 ++++++++++++++++++++++++++++- console.h | 2 ++ console_cmds.c | 11 ++++++++++- scripts/readme.txt | 1 + ttd.c | 2 ++ 5 files changed, 43 insertions(+), 2 deletions(-) diff --git a/console.c b/console.c index 626c062cfe..bcaddbdc2e 100644 --- a/console.c +++ b/console.c @@ -602,6 +602,7 @@ void IConsoleAliasExec(const char* cmdline, char* tokens[20], byte tokentypes[20 if (cmdline[i] == '%') { i++; if (cmdline[i] == '+') { + // all params seperated: "[param 1]" "[param 2]" t=1; while ((tokens[t]!=NULL) && (t<20) && ((tokentypes[t] == ICONSOLE_VAR_STRING) || (tokentypes[t] == ICONSOLE_VAR_UNKNOWN))) { @@ -617,10 +618,30 @@ void IConsoleAliasExec(const char* cmdline, char* tokens[20], byte tokentypes[20 x += l2+3; t++; } + } else if (cmdline[i] == '!') { + // merge the params to one: "[param 1] [param 2] [param 3...]" + t=1; + *linestream = '"'; + linestream++; + while ((tokens[t]!=NULL) && (t<20) && + ((tokentypes[t] == ICONSOLE_VAR_STRING) || (tokentypes[t] == ICONSOLE_VAR_UNKNOWN))) { + int l2 = strlen(tokens[t]); + memcpy(linestream,tokens[t],l2); + linestream += l2; + *linestream = ' '; + linestream++; + x += l2+1; + t++; + } + *linestream = '"'; + linestream++; + x += 2; } else { + // one specific parameter: %A = [param 1] %B = [param 2] ... int l2; t = ((byte)cmdline[i]) - 64; - if ((t<20) && (tokens[t]!=NULL)) { + if ((t<20) && (tokens[t]!=NULL) && + ((tokentypes[t] == ICONSOLE_VAR_STRING) || (tokentypes[t] == ICONSOLE_VAR_UNKNOWN))) { l2 = strlen(tokens[t]); *linestream = '"'; linestream++; @@ -632,6 +653,7 @@ void IConsoleAliasExec(const char* cmdline, char* tokens[20], byte tokentypes[20 } } } else if (cmdline[i] == '\\') { + // \\ = \ \' = ' \% = % i++; if (cmdline[i] == '\\') { *linestream = '\\'; @@ -639,11 +661,16 @@ void IConsoleAliasExec(const char* cmdline, char* tokens[20], byte tokentypes[20 } else if (cmdline[i] == '\'') { *linestream = '\''; linestream++; + } else if (cmdline[i] == '%') { + *linestream = '%'; + linestream++; } } else if (cmdline[i] == '\'') { + // ' = " *linestream = '"'; linestream++; } else if (cmdline[i] == ';') { + // ; = start a new line c++; *linestream = '\0'; linestream += 1024 - (x % 1024); diff --git a/console.h b/console.h index 6565032c59..fd4c45ea15 100644 --- a/console.h +++ b/console.h @@ -85,6 +85,8 @@ typedef struct _iconsole_alias { void* _next; } _iconsole_alias; +_iconsole_alias* IConsoleAliasGet(const char* name); + // ** console parser ** // _iconsole_cmd* _iconsole_cmds; // list of registred commands diff --git a/console_cmds.c b/console_cmds.c index 3e2dcb07f7..7aaf3999c3 100644 --- a/console_cmds.c +++ b/console_cmds.c @@ -367,8 +367,17 @@ DEF_CONSOLE_CMD(ConPrintFC) DEF_CONSOLE_CMD(ConAlias) { + _iconsole_alias* alias; + if (argc < 3) return NULL; - IConsoleAliasRegister(argv[1],argv[2]); + + alias = IConsoleAliasGet(argv[1]); + if (alias == NULL) { + IConsoleAliasRegister(argv[1],argv[2]); + } else { + free(alias->cmdline); + alias->cmdline = strdup(argv[2]); + } return NULL; } diff --git a/scripts/readme.txt b/scripts/readme.txt index d8dafaaaa9..8c126a3a2e 100644 --- a/scripts/readme.txt +++ b/scripts/readme.txt @@ -8,6 +8,7 @@ OpenTTD supports scripts. - 'on_dedicated.scr' is additionally executed when you start a dedicated server - 'pre_server.scr' is executed before the server is started - 'pre_dedicated.scr' is additionally executed when you start a dedicated server + - 'autoexec.scr' is executed on gamestart [use this for custom aliases per ex.] For examples how a script can look, check the .example examples. diff --git a/ttd.c b/ttd.c index cd17859995..ea2bffc338 100644 --- a/ttd.c +++ b/ttd.c @@ -644,6 +644,8 @@ int ttd_main(int argc, char* argv[]) // initialize the ingame console IConsoleInit(); + IConsoleCmdExec("exec scripts/autoexec.scr 0"); + InitPlayerRandoms(); #ifdef ENABLE_NETWORK