Jelajahi Sumber

Cleaned up set_reg and the surrounding code

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@9869 54d463be-8e91-2dee-dedb-b68131a5f0ec
ultramage 18 tahun lalu
induk
melakukan
d47a72bf9f
2 mengubah file dengan 61 tambahan dan 72 penghapusan
  1. 3 0
      Changelog-Trunk.txt
  2. 58 72
      src/map/script.c

+ 3 - 0
Changelog-Trunk.txt

@@ -4,6 +4,7 @@ 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/02/15
+	* Cleaned up set_reg (the same procedure as get_val) [ultramage]
 	* The default packet version is now 8. Clients from November2006 and before
 	  can no longer get past the char-server unless you change it back to 7.
 	* Fixed Storm Gust counter freezing on fourth hit instead of third.
@@ -11,6 +12,8 @@ IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 	  decimals get discarded on level up (so the real minimum/maximum displayed
 	  was off).
 2007/02/13
+	* Reverted some mobdb lines
+	* Cleaned up clif_party_info's interface a bit [ultramage]
 	* Applied Rayce's dangling pointer fix when returning a temporary npc
 	  string variable (those starting with .@)
 	* Required Weapon, ammo, and skill state are now only checked on begin

+ 58 - 72
src/map/script.c

@@ -1973,96 +1973,82 @@ int get_val(struct script_state* st, struct script_data* data)
 	return 0;
 }
 /*==========================================
- * 変数の読み取り2
- *------------------------------------------
- */
-void* get_val2(struct script_state*st,int num,struct linkdb_node **ref)
+ * Retrieves the value of a script variable
+ *------------------------------------------*/
+void* get_val2(struct script_state* st, int num, struct linkdb_node** ref)
 {
 	struct script_data dat;
-	dat.type=C_NAME;
-	dat.u.num=num;
-	dat.ref=ref;
-	get_val(st,&dat);
-	if( dat.type==C_INT ) return (void*)dat.u.num;
-	else return (void*)dat.u.str;
+	dat.type = C_NAME;
+	dat.u.num = num;
+	dat.ref = ref;
+	get_val(st, &dat);
+	return (dat.type == C_INT) ? (void*)dat.u.num : (void*)dat.u.str;
 }
 
 /*==========================================
- * 変数設定用
- *------------------------------------------
- */
-static int set_reg(struct script_state*st,struct map_session_data *sd,int num,char *name,void *v,struct linkdb_node** ref)
+ * Stores the value of a script variable
+ *------------------------------------------*/
+static int set_reg(struct script_state* st, struct map_session_data* sd, int num, char* name, void* value, struct linkdb_node** ref)
 {
-	char prefix=*name;
-	char postfix=name[strlen(name)-1];
+	char prefix = name[0]; char postfix = name[strlen(name)-1];
 
-	if( postfix=='$' ){
-		char *str=(char*)v;
-		if( prefix=='@'){
-			pc_setregstr(sd,num,str);
-		}else if(prefix=='$') {
-			mapreg_setregstr(num,str);
-		}else if(prefix=='#') {
-			if( name[1]=='#' )
-				pc_setaccountreg2str(sd,name,str);
-			else
-				pc_setaccountregstr(sd,name,str);
- 		}else if(prefix=='.') {
-			char *p;
-			struct linkdb_node **n;
-			if( ref ) {
-				n = ref;
-			} else if( name[1] == '@' ) {
-				n = st->stack->var_function;
-			} else {
-				n = &st->script->script_vars;
-			}
+	if (postfix == '$') { // string variable
+
+		char* str = (char*)value;
+		switch (prefix) {
+		case '@':
+			pc_setregstr(sd, num, str); break;
+		case '$':
+			mapreg_setregstr(num, str); break;
+		case '#':
+			(name[1] == '#') ? pc_setaccountreg2str(sd, name, str) : pc_setaccountregstr(sd, name, str); break;
+		case '.': {
+			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) {
+			if (p) {
 				linkdb_erase(n, (void*)num);
 				aFree(p);
 			}
-			if( ((char*)v)[0] )
-				linkdb_insert(n, (void*)num, aStrdup(v));
-		}else{
-			pc_setglobalreg_str(sd,name,str);
- 		} // [zBuffer]
-	}else{
-		// 数値
-		int val = (int)v;
-		if(str_data[num&0x00ffffff].type==C_PARAM){
-			pc_setparam(sd,str_data[num&0x00ffffff].val,val);
-		}else if(prefix=='@') {
-			pc_setreg(sd,num,val);
-		}else if(prefix=='$') {
-			mapreg_setreg(num,val);
-		}else if(prefix=='#') {
-			if( name[1]=='#' )
-				pc_setaccountreg2(sd,name,val);
-			else
-				pc_setaccountreg(sd,name,val);
-		}else if(prefix == '.') {
-			struct linkdb_node **n;
-			if( ref ) {
-				n = ref;
-			} else if( name[1] == '@' ) {
-				n = st->stack->var_function;
-			} else {
-				n = &st->script->script_vars;
+			if (str[0]) linkdb_insert(n, (void*)num, aStrdup(str));
 			}
-			if( val == 0 ) {
+			break;
+		default:
+			pc_setglobalreg_str(sd, name, str); break;
+		}
+
+	} else { // integer variable
+
+		int val = (int)value;
+		if(str_data[num&0x00ffffff].type == C_PARAM)
+			pc_setparam(sd, str_data[num&0x00ffffff].val, val);
+		else
+		switch (prefix) {
+		case '@':
+			pc_setreg(sd, num, val); break;
+		case '$':
+			mapreg_setreg(num, val); break;
+		case '#':
+			(name[1] == '#') ? pc_setaccountreg2(sd, name, val) : pc_setaccountreg(sd, name, val); break;
+		case '.': {
+			struct linkdb_node** n;
+			n = (ref) ? ref : (name[1] == '@') ? st->stack->var_function : &st->script->script_vars;
+			if (val == 0)
 				linkdb_erase(n, (void*)num);
-			} else {
+			else 
 				linkdb_replace(n, (void*)num, (void*)val);
 			}
-		}else{
-			pc_setglobalreg(sd,name,val);
+			break;
+		default:
+			pc_setglobalreg(sd, name, val); break;
 		}
 	}
+
 	return 0;
 }
 
-int set_var(struct map_session_data *sd, char *name, void *val)
+int set_var(struct map_session_data* sd, char* name, void* val)
 {
     return set_reg(NULL, sd, add_str(name), name, val, NULL);
 }
@@ -6015,13 +6001,13 @@ BUILDIN_FUNC(getpartyleader)
 			push_val(st->stack,C_INT,p->party.member[i].class_);
 		break;
 		case 4:
-			push_str(st->stack,C_CONSTSTR,(char*)mapindex_id2name(p->party.member[i].map));
+			push_str(st->stack,C_STR,aStrdup(mapindex_id2name(p->party.member[i].map)));
 		break;
 		case 5:
 			push_val(st->stack,C_INT,p->party.member[i].lv);
 		break;
 		default:
-			push_str(st->stack,C_CONSTSTR,p->party.member[i].name);
+			push_str(st->stack,C_STR,aStrdup(p->party.member[i].name));
 		break;
 	}
 	return 0;