* 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://svn.code.sf.net/p/rathena/svn/trunk@11984 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
FlavioJS 2007-12-27 05:47:50 +00:00
parent 4dcf5bb0b9
commit b6c11a8282
6 changed files with 65 additions and 40 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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;

View File

@ -365,7 +365,7 @@ struct script_reg {
};
struct script_regstr {
int index;
char data[256];
char* data;
};
struct status_change_entry {

View File

@ -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

View File

@ -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;