diff options
-rw-r--r-- | console.c | 29 | ||||
-rw-r--r-- | console.h | 2 | ||||
-rw-r--r-- | console_cmds.c | 11 | ||||
-rw-r--r-- | scripts/readme.txt | 1 | ||||
-rw-r--r-- | ttd.c | 2 |
5 files changed, 43 insertions, 2 deletions
@@ -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); @@ -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 3e2dcb07f..7aaf3999c 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 d8dafaaaa..8c126a3a2 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. @@ -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 |