summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt3
-rw-r--r--src/map/script.c25
2 files changed, 20 insertions, 8 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index c120c17e4..ced81ce07 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -3,6 +3,9 @@ Date Added
AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
+2007/12/26
+ * Fixed string variables dereferencing directly to the value instead of
+ dereferencing to a copy of the value. (fixes bugreport:684 bugreport:641) [FlavioJS]
2007/12/23
* Added a generic vector implementation (dynamic array) based on defines. [FlavioJS]
* Fixed horrible handling of skill_abra_db which leads to memory corruption
diff --git a/src/map/script.c b/src/map/script.c
index b66197bb5..249d4c321 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -2102,8 +2102,11 @@ TBL_PC *script_rid2sd(struct script_state *st)
return sd;
}
-/// Retrieves the value of a script data
-int get_val(struct script_state* st, struct script_data* data)
+/// Dereferences a variable/constant, replacing it with a copy of the value.
+///
+/// @param st Script state
+/// @param data Variable/constant
+void get_val(struct script_state* st, struct script_data* data)
{
char* name;
char prefix;
@@ -2111,7 +2114,7 @@ int get_val(struct script_state* st, struct script_data* data)
TBL_PC* sd = NULL;
if( !data_isreference(data) )
- return 0;// not a variable
+ return;// not a variable/constant
name = reference_getname(data);
prefix = name[0];
@@ -2135,15 +2138,13 @@ int get_val(struct script_state* st, struct script_data* data)
data->type = C_INT;
data->u.num = 0;
}
- return 0;
+ return;
}
}
if( postfix == '$' )
{// string variable
- data->type = C_CONSTSTR;
-
switch( prefix )
{
case '@':
@@ -2172,8 +2173,16 @@ int get_val(struct script_state* st, struct script_data* data)
break;
}
- if( data->u.str == NULL )
+ if( data->u.str == NULL || data->u.str[0] == '\0' )
+ {// empty string
+ data->type = C_CONSTSTR;
data->u.str = "";
+ }
+ else
+ {// duplicate string
+ data->type = C_STR;
+ data->u.str = aStrdup(data->u.str);
+ }
}
else
@@ -2220,7 +2229,7 @@ int get_val(struct script_state* st, struct script_data* data)
}
- return 0;
+ return;
}
/// Retrieves the value of a reference identified by uid (variable, constant, param)