summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt4
-rw-r--r--doc/script_commands.txt34
-rw-r--r--src/map/map.c4
-rw-r--r--src/map/map.h2
-rw-r--r--src/map/pc.c54
-rw-r--r--src/map/script.c7
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 <default_value> 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;