From 957ecdfbb008733cded26a6dab20c7ac13814f58 Mon Sep 17 00:00:00 2001 From: FlavioJS Date: Thu, 27 Dec 2007 05:47:50 +0000 Subject: * Corrected description of scope and npc variables in script_commands.txt. * Made temporary character string variables not have a limited length. (now all temporary string variables don't have limited length) * Made temporary character variables reuse free positions. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@11984 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 4 ++++ doc/script_commands.txt | 34 ++++++++++++++++++------------- src/map/map.c | 4 ++++ src/map/map.h | 2 +- src/map/pc.c | 54 +++++++++++++++++++++++++++++++------------------ src/map/script.c | 7 ++----- 6 files changed, 65 insertions(+), 40 deletions(-) diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index d56f3c333..6e0fb2558 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -4,6 +4,10 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. 2007/12/27 + * Corrected description of scope and npc variables in script_commands.txt. + * Made temporary character string variables not have a limited length. + (now all temporary string variables don't have limited length) + * Made temporary character variables reuse free positions. * Tweeked the declaration and initialization defines for vectors. * Made do_sockets leave the for loop as soon as the readable number of sockets returned by select is found. diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 925f20842..a7564b672 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -4,7 +4,7 @@ //= A reference manual for the eAthena scripting language. //= Commands are sorted depending on their functionality. //===== Version =========================================== -//= 3.10.20071122 +//= 3.12.20071227 //========================================================= //= 1.0 - First release, filled will as much info as I could //= remember or figure out, most likely there are errors, @@ -93,6 +93,8 @@ //= Updated guardianinfo and get-/setcastledata [ultramage] //= 3.12.20071218 //= Corrected various mistakes mentioned in bugreport:373 [ultramage] +//= 3.12.20071227 +//= Corrected description of scope and npc variables. [FlavioJS] //========================================================= This document is a reference manual for all the scripting commands and functions @@ -495,12 +497,11 @@ local - local to the server account - attached to the account of the character identified by RID character - attached to the character identified by RID npc - attached to the NPC +scope - attached to the scope of the instance Extent can be: -permanent - Permanent NPC variables exist while the server is running. - Others still exist when the server resets. -temporary - Temporary NPC variables exist while the script instance is running. - Others cease to exist when the server resets. +permanent - They still exist when the server resets. +temporary - They cease to exist when the server resets. Prefix: scope and extent nothing - A permanent variable attached to the character, the default @@ -515,11 +516,16 @@ nothing - A permanent variable attached to the character, the default "$@" - A global temporary variable. This is important for scripts which are called with no RID attached, that is, not triggered by a specific character object. -"." - A variable that exists on the NPC as long as the server is running. - They are only accessible from inside the NPC or by calling +"." - A NPC variable. + They exist in the NPC and dissapear when the server restarts or the + npc is reloaded. Can be accessed from inside the NPC or by calling 'getvariableofnpc'. -".@" - A temporary variable that exists until the script instance ends. - They are only accessible in that NPC instance. +".@" - A scope variable. + They are unique to the instance and scope. Each instance has it's + own scope that ends when the script ends. Calling a function with + callsub/callfunc starts a new scope, returning from the function + ends it. When a scope ends, it's variables are converted to values + ('return .@var;' returns a value, not a reference). "#" - A permanent local account variable. They are stored with all the account data in "save\accreg.txt" in TXT versions and in the SQL versions in the 'global_reg_value' @@ -546,10 +552,10 @@ Examples: $name$ - permanent global string variable $@name - temporary global integer variable $@name$ - temporary global string variable - .name - permanent npc integer variable - .name$ - permanent npc string variable -.@name - temporary npc integer variable -.@name$ - temporary npc string variable + .name - npc integer variable + .name$ - npc string variable +.@name - scope integer variable +.@name$ - scope string variable #name - permanent local account integer variable #name$ - permanent local account string variable ##name - permanent global account integer variable @@ -1473,7 +1479,7 @@ You can pass multiple arguments in a function call: getarg(0) would be 5, getarg(1) would be 4 and getarg(2) would be 3. -Getarg has an optional argument since trunk r10773. +Getarg has an optional argument since trunk r10773 and stable r10958. If the target argument exists, it is returned. Otherwise, if is present it is returned instead, if not the script terminates immediately. diff --git a/src/map/map.c b/src/map/map.c index 6e8bf4775..4f8984041 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -1671,6 +1671,10 @@ int map_quit(struct map_session_data *sd) } if(sd->regstr) { + int i; + for( i = 0; i < sd->regstr_num; ++i ) + if( sd->regstr[i].data ) + aFree(sd->regstr[i].data); aFree(sd->regstr); sd->regstr = NULL; sd->regstr_num = 0; diff --git a/src/map/map.h b/src/map/map.h index ecdc72c4f..24b6eb052 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -365,7 +365,7 @@ struct script_reg { }; struct script_regstr { int index; - char data[256]; + char* data; }; struct status_change_entry { diff --git a/src/map/pc.c b/src/map/pc.c index 959503654..5c5b08a49 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -5898,15 +5898,19 @@ int pc_setreg(struct map_session_data* sd, int reg, int val) ARR_FIND( 0, sd->reg_num, i, sd->reg[i].index == reg ); if( i < sd->reg_num ) - // overwrite existing entry + {// overwrite existing entry sd->reg[i].data = val; - else { - // insert new entry + return 1; + } + + ARR_FIND( 0, sd->reg_num, i, sd->reg[i].data == 0 ); + if( i == sd->regstr_num ) + {// nothing free, increase size sd->reg_num++; RECREATE(sd->reg, struct script_reg, sd->reg_num); - sd->reg[i].index = reg; - sd->reg[i].data = val; } + sd->reg[i].index = reg; + sd->reg[i].data = val; return 1; } @@ -5939,27 +5943,37 @@ int pc_setregstr(struct map_session_data* sd, int reg, char* str) ARR_FIND( 0, sd->regstr_num, i, sd->regstr[i].index == reg ); if( i < sd->regstr_num ) - { - if (str && strcmp(str,"")!=0) - safestrncpy(sd->regstr[i].data, str, sizeof(sd->regstr[i].data)); - else { - sd->regstr_num--; - memcpy(&sd->regstr[i], &sd->regstr[sd->regstr_num], sizeof(sd->regstr[0])); - RECREATE(sd->regstr, struct script_regstr, sd->regstr_num); + {// found entry, update + if( str == NULL || *str == '\0' ) + {// empty string + if( sd->regstr[i].data != NULL ) + aFree(sd->regstr[i].data); + sd->regstr[i].data = NULL; + } + else if( sd->regstr[i].data ) + {// recreate + size_t len = strlen(str)+1; + RECREATE(sd->regstr[i].data, char, len); + memcpy(sd->regstr[i].data, str, len*sizeof(char)); + } + else + {// create + sd->regstr[i].data = aStrdup(str); } return 1; } - if (!str) return 1; + if( str == NULL || *str == '\0' ) + return 1;// nothing to add, empty string - sd->regstr_num++; - RECREATE(sd->regstr, struct script_regstr, sd->regstr_num); - if(sd->regstr==NULL){ - ShowFatalError("out of memory : pc_setreg\n"); - exit(EXIT_FAILURE); + ARR_FIND( 0, sd->regstr_num, i, sd->regstr[i].data == NULL ); + if( i == sd->regstr_num ) + {// nothing free, increase size + sd->regstr_num++; + RECREATE(sd->regstr, struct script_regstr, sd->regstr_num); } sd->regstr[i].index = reg; - safestrncpy(sd->regstr[i].data, str, sizeof(sd->regstr[i].data)); + sd->regstr[i].data = aStrdup(str); return 1; } @@ -5968,7 +5982,7 @@ int pc_readregistry(struct map_session_data *sd,const char *reg,int type) { struct global_reg *sd_reg; int i,max; - + nullpo_retr(0, sd); switch (type) { case 3: //Char reg diff --git a/src/map/script.c b/src/map/script.c index b0621aa40..12f9b9313 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -2268,11 +2268,8 @@ static int set_reg(struct script_state* st, TBL_PC* sd, int num, char* name, voi char* p; struct linkdb_node** n; n = (ref) ? ref : (name[1] == '@') ? st->stack->var_function : &st->script->script_vars; - p = linkdb_search(n, (void*)num); - if (p) { - linkdb_erase(n, (void*)num); - aFree(p); - } + p = linkdb_erase(n, (void*)num); + if (p) aFree(p); if (str[0]) linkdb_insert(n, (void*)num, aStrdup(str)); } return 1; -- cgit v1.2.3-70-g09d2