diff options
-rw-r--r-- | doc/script_commands.txt | 5 | ||||
-rw-r--r-- | src/map/script.c | 306 |
2 files changed, 98 insertions, 213 deletions
diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 77b361498..ca7ebacca 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -1371,11 +1371,10 @@ Examples: --------------------------------------- -*getd("<variable name>"{, <GID>{, <default value>}}) +*getd("<variable name>") Returns a reference to a variable, the name can be constructed dynamically. -If <GID> is present, it can be used to get a variable from another player or -npc. If the target player or npc is not found, <default value> is returned. +Refer to setd() for usage. This can also be used to set an array dynamically: setarray(getd(".array[0]"), 1, 2, 3, 4, 5); diff --git a/src/map/script.c b/src/map/script.c index a1886d043..30295b8dc 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -2861,44 +2861,32 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) { const char *str = NULL; switch (prefix) { - case '@': - if (data->ref) { - str = script->get_val_ref_str(st, data->ref, data); - } else { + case '@': str = pc->readregstr(sd, data->u.num); - } - break; - case '$': - str = mapreg->readregstr(data->u.num); - break; - case '#': - if (data->ref) { - str = script->get_val_ref_str(st, data->ref, data); - } else if (name[1] == '#') { - str = pc_readaccountreg2str(sd, data->u.num);// global - } else { - str = pc_readaccountregstr(sd, data->u.num);// local - } - break; - case '.': - if (data->ref) { - str = script->get_val_ref_str(st, data->ref, data); - } else if (name[1] == '@') { - str = script->get_val_scope_str(st, &st->stack->scope, data); - } else { - str = script->get_val_npc_str(st, &st->script->local, data); - } - break; - case '\'': - str = script->get_val_instance_str(st, name, data); - break; - default: - if (data->ref) { - str = script->get_val_ref_str(st, data->ref, data); - } else { + break; + case '$': + str = mapreg->readregstr(data->u.num); + break; + case '#': + if (name[1] == '#') + str = pc_readaccountreg2str(sd, data->u.num);// global + else + str = pc_readaccountregstr(sd, data->u.num);// local + break; + case '.': + if (data->ref) + str = script->get_val_ref_str(st, data->ref, data); + else if (name[1] == '@') + str = script->get_val_scope_str(st, &st->stack->scope, data); + else + str = script->get_val_npc_str(st, &st->script->local, data); + break; + case '\'': + str = script->get_val_instance_str(st, name, data); + break; + default: str = pc_readglobalreg_str(sd, data->u.num); - } - break; + break; } if (str == NULL || str[0] == '\0') { @@ -2918,48 +2906,35 @@ struct script_data *get_val(struct script_state* st, struct script_data* data) { data->u.num = reference_getconstant(data); } else if( reference_toparam(data) ) { data->u.num = pc->readparam(sd, reference_getparamtype(data)); - } else { - switch(prefix) { - case '@': - if (data->ref) { - data->u.num = script->get_val_ref_num(st, data->ref, data); - } else { + } else + switch( prefix ) { + case '@': data->u.num = pc->readreg(sd, data->u.num); - } - break; - case '$': - data->u.num = mapreg->readreg(data->u.num); - break; - case '#': - if (data->ref) { - data->u.num = script->get_val_ref_num(st, data->ref, data); - } else if(name[1] == '#') { - data->u.num = pc_readaccountreg2(sd, data->u.num);// global - } else { - data->u.num = pc_readaccountreg(sd, data->u.num);// local - } - break; - case '.': - if (data->ref) { - data->u.num = script->get_val_ref_num(st, data->ref, data); - } else if (name[1] == '@') { - data->u.num = script->get_val_scope_num(st, &st->stack->scope, data); - } else { - data->u.num = script->get_val_npc_num(st, &st->script->local, data); - } - break; - case '\'': - data->u.num = script->get_val_instance_num(st, name, data); - break; - default: - if (data->ref) { - data->u.num = script->get_val_ref_num(st, data->ref, data); - } else { + break; + case '$': + data->u.num = mapreg->readreg(data->u.num); + break; + case '#': + if( name[1] == '#' ) + data->u.num = pc_readaccountreg2(sd, data->u.num);// global + else + data->u.num = pc_readaccountreg(sd, data->u.num);// local + break; + case '.': + if (data->ref) + data->u.num = script->get_val_ref_num(st, data->ref, data); + else if (name[1] == '@') + data->u.num = script->get_val_scope_num(st, &st->stack->scope, data); + else + data->u.num = script->get_val_npc_num(st, &st->script->local, data); + break; + case '\'': + data->u.num = script->get_val_instance_num(st, name, data); + break; + default: data->u.num = pc_readglobalreg(sd, data->u.num); - } - break; + break; } - } } data->ref = NULL; @@ -3317,47 +3292,32 @@ int set_reg(struct script_state *st, struct map_session_data *sd, int64 num, con return 0; } - if(is_string_variable(name)) {// string variable + if( is_string_variable(name) ) {// string variable const char *str = (const char*)value; switch (prefix) { - case '@': - if (ref) { - script->set_reg_ref_str(st, ref, num, name, str); - } else { + case '@': pc->setregstr(sd, num, str); - } - return 1; - case '$': - return mapreg->setregstr(num, str); - case '#': - if (ref) { - script->set_reg_ref_str(st, ref, num, name, str); - } else if (name[1] == '#') { - pc_setaccountreg2str(sd, num, str); - } else { - pc_setaccountregstr(sd, num, str); - } - return 1; - case '.': - if (ref) { - script->set_reg_ref_str(st, ref, num, name, str); - } else if (name[1] == '@') { - script->set_reg_scope_str(st, &st->stack->scope, num, name, str); - } else { - script->set_reg_npc_str(st, &st->script->local, num, name, str); - } - return 1; - case '\'': - set_reg_instance_str(st, num, name, str); - return 1; - default: - if (ref) { - script->set_reg_ref_str(st, ref, num, name, str); - } else { - pc_setglobalreg_str(sd, num, str); - } - return 1; + return 1; + case '$': + return mapreg->setregstr(num, str); + case '#': + return (name[1] == '#') ? + pc_setaccountreg2str(sd, num, str) : + pc_setaccountregstr(sd, num, str); + case '.': + if (ref) + script->set_reg_ref_str(st, ref, num, name, str); + else if (name[1] == '@') + script->set_reg_scope_str(st, &st->stack->scope, num, name, str); + else + script->set_reg_npc_str(st, &st->script->local, num, name, str); + return 1; + case '\'': + set_reg_instance_str(st, num, name, str); + return 1; + default: + return pc_setglobalreg_str(sd, num, str); } } else {// integer variable // FIXME: This isn't safe, in 32bits systems we're converting a 64bit pointer @@ -3381,43 +3341,28 @@ int set_reg(struct script_state *st, struct map_session_data *sd, int64 num, con } switch (prefix) { - case '@': - if (ref) { - script->set_reg_ref_num(st, ref, num, name, val); - } else { + case '@': pc->setreg(sd, num, val); - } - return 1; - case '$': - return mapreg->setreg(num, val); - case '#': - if (ref) { - script->set_reg_ref_num(st, ref, num, name, val); - } else if (name[1] == '#') { - pc_setaccountreg2(sd, num, val); - } else { - pc_setaccountreg(sd, num, val); - } - return 1; - case '.': - if (ref) { - script->set_reg_ref_num(st, ref, num, name, val); - } else if (name[1] == '@') { - script->set_reg_scope_num(st, &st->stack->scope, num, name, val); - } else { - script->set_reg_npc_num(st, &st->script->local, num, name, val); - } - return 1; - case '\'': - set_reg_instance_num(st, num, name, val); - return 1; - default: - if (ref) { - script->set_reg_ref_num(st, ref, num, name, val); - } else { - pc_setglobalreg(sd, num, val); - } - return 1; + return 1; + case '$': + return mapreg->setreg(num, val); + case '#': + return (name[1] == '#') ? + pc_setaccountreg2(sd, num, val) : + pc_setaccountreg(sd, num, val); + case '.': + if (ref) + script->set_reg_ref_num(st, ref, num, name, val); + else if (name[1] == '@') + script->set_reg_scope_num(st, &st->stack->scope, num, name, val); + else + script->set_reg_npc_num(st, &st->script->local, num, name, val); + return 1; + case '\'': + set_reg_instance_num(st, num, name, val); + return 1; + default: + return pc_setglobalreg(sd, num, val); } } } @@ -16549,11 +16494,7 @@ BUILDIN(escape_sql) return true; } -BUILDIN(getd) -{ - struct block_list *bl = NULL; - struct map_session_data *sd; - struct npc_data *nd; +BUILDIN(getd) { char varname[100]; const char *buffer; int elem; @@ -16563,63 +16504,8 @@ BUILDIN(getd) if (sscanf(buffer, "%99[^[][%d]", varname, &elem) < 2) elem = 0; - if (strlen(varname) < 1) { - ShowError("script:getd: variable cannot be empty\n"); - script->reportdata(script_getdata(st, 2)); - script_pushnil(st); - st->state = END; - return false; - } - - if (script_hasdata(st, 3)) { - bl = map->id2bl(script_getnum(st, 3)); - - if (bl == NULL) { - // being not found, push default value - if (script_hasdata(st, 4)) { - script_pushcopy(st, 4); - } else if (varname[strlen(varname) - 1] == '$') { - script_pushconststr(st, ""); - } else { - script_pushint(st, 0); - } - return false; - } else if (bl->type == BL_NPC && (varname[0] != '.' || varname[1] == '@')) { - ShowError("script:getd: invalid scope (not npc variable)\n"); - script->reportdata(script_getdata(st, 2)); - script_pushnil(st); - st->state = END; - return false; - } else if (bl->type == BL_PC && (varname[0] == '.' || varname[0] == '$' || varname[0] == '\'')) { - ShowError("script:getd: invalid scope (not pc variable)\n"); - script->reportdata(script_getdata(st, 2)); - script_pushnil(st); - st->state = END; - return false; - } - } - // Push the 'pointer' so it's more flexible [Lance] - - if (bl != NULL) { - switch (bl->type) { - case BL_PC: - sd = map->id2sd(bl->id); - script->push_val(st->stack, C_NAME, reference_uid(script->add_str(varname), elem), &sd->regs); - break; - case BL_NPC: - nd = map->id2nd(bl->id); - script->push_val(st->stack, C_NAME, reference_uid(script->add_str(varname), elem), &nd->u.scr.script->local); - break; - default: - ShowError("script:getd: invalid being type (not npc or pc)\n"); - script_pushnil(st); - st->state = END; - return false; - } - } else { - script->push_val(st->stack, C_NAME, reference_uid(script->add_str(varname), elem), NULL); - } + script->push_val(st->stack, C_NAME, reference_uid(script->add_str(varname), elem),NULL); return true; } @@ -21257,7 +21143,7 @@ void script_parse_builtin(void) { BUILDIN_DEF(md5,"s"), BUILDIN_DEF(swap,"rr"), // [zBuffer] List of dynamic var commands ---> - BUILDIN_DEF(getd,"s??"), + BUILDIN_DEF(getd,"s"), BUILDIN_DEF(setd,"sv"), // <--- [zBuffer] List of dynamic var commands BUILDIN_DEF(petstat,"i"), |