diff options
Diffstat (limited to 'src/map/script.c')
-rw-r--r-- | src/map/script.c | 154 |
1 files changed, 93 insertions, 61 deletions
diff --git a/src/map/script.c b/src/map/script.c index f369dc031..832647b7f 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -52,9 +52,10 @@ #include <time.h> #include <setjmp.h> +// +// struct script_state* st; +// - -/////////////////////////////////////////////////////////////////////////////// /// Returns the stack_data at the target index #define script_getdata(st,i) &((st)->stack->stack_data[(st)->start+(i)]) /// Returns if the stack contains data at the target index @@ -63,10 +64,17 @@ #define script_lastdata(st) ( (st)->end - (st)->start - 1 ) /// Pushes an int into the stack #define script_pushint(st,val) push_val((st)->stack, C_INT, (val)) -/// Returns if the stack data is a string -#define script_isstring(data) ( (data)->type == C_STR || (data)->type == C_CONSTSTR ) -/// Returns if the stack data is an int -#define script_isint(data) ( (data)->type == C_INT ) + +// +// struct script_data* data; +// + +/// Returns if the script data is a string +#define data_isstring(data) ( (data)->type == C_STR || (data)->type == C_CONSTSTR ) +/// Returns if the script data is an int +#define data_isint(data) ( (data)->type == C_INT ) +/// Returns if the script data is a reference +#define data_isreference(data) ( (data)->type == C_NAME ) #define FETCH(n, t) \ if( script_hasdata(st,n) ) \ @@ -1567,15 +1575,16 @@ static void add_buildin_func(void) int i,n; const char* p; for( i=0; buildin_func[i].func; i++ ){ - /// arg must follow the pattern: (v|s|i|l)*\?*\*? - /// 'v' - value (either string or int) - /// 's' - string - /// 'i' - int - /// 'l' - label - /// '?' - one optional parameter - /// '*' - unknown number of optional parameters + // arg must follow the pattern: (v|s|i|r|l)*\?*\*? + // 'v' - value (either string or int or reference) + // 's' - string + // 'i' - int + // 'r' - reference (of a variable) + // 'l' - label + // '?' - one optional parameter + // '*' - unknown number of optional parameters p=buildin_func[i].arg; - while( *p == 'v' || *p == 's' || *p == 'i' || *p == 'l' ) ++p; + while( *p == 'v' || *p == 's' || *p == 'i' || *p == 'r' || *p == 'l' ) ++p; while( *p == '?' ) ++p; if( *p == '*' ) ++p; if( *p != 0){ @@ -3355,6 +3364,7 @@ static int do_final_userfunc_sub (DBKey key,void *data,va_list ap) */ int do_final_script() { +#ifdef DEBUG_RUN if (battle_config.etc_log) { FILE *fp = fopen("hash_dump.txt","wt"); @@ -3408,6 +3418,7 @@ int do_final_script() fclose(fp); } } +#endif if(mapreg_dirty>=0) script_save_mapreg(); @@ -4138,7 +4149,7 @@ struct script_function buildin_func[] = { BUILDIN_DEF(sleep,"i"), BUILDIN_DEF(sleep2,"i"), BUILDIN_DEF(awake,"s"), - BUILDIN_DEF(getvariableofnpc,"is"), + BUILDIN_DEF(getvariableofnpc,"rs"), // [blackhole89] --> BUILDIN_DEF(warpportal,"iisii"), // <--- [blackhole89] @@ -5346,7 +5357,7 @@ BUILDIN_FUNC(getitem) data=script_getdata(st,2); get_val(st,data); - if( script_isstring(data) ) + if( data_isstring(data) ) {// "<item name>" const char *name=conv_str(st,data); struct item_data *item_data = itemdb_searchname(name); @@ -5356,7 +5367,7 @@ BUILDIN_FUNC(getitem) return 1; //No item created. } nameid=item_data->nameid; - } else if( script_isint(data) ) + } else if( data_isint(data) ) {// <item id> nameid=conv_num(st,data); //Violet Box, Blue Box, etc - random item pick @@ -9665,10 +9676,10 @@ BUILDIN_FUNC(guardian) } else if( script_hasdata(st,8) ){ data=script_getdata(st,8); get_val(st,data); - if( script_isstring(data) ) + if( data_isstring(data) ) {// "<event label>" evt=conv_str(st,script_getdata(st,8)); - } else if( script_isint(data) ) + } else if( data_isint(data) ) {// <guardian index> guardian=conv_num(st,script_getdata(st,8)); } else { @@ -12860,63 +12871,84 @@ BUILDIN_FUNC(awake) return 0; } -// getvariableofnpc(<param>, <npc name>); +/// Returns a reference to a variable of the target NPC. +/// Returns 0 if an error occurs. +/// +/// getvariableofnpc(<variable>, "<npc name>") -> <reference> BUILDIN_FUNC(getvariableofnpc) { - if( st->stack->stack_data[st->start+2].type != C_NAME ) { - // 第一引数が変数名じゃない - printf("getvariableofnpc: param not name\n"); - push_val(st->stack,C_INT,0); - } else { - int num = st->stack->stack_data[st->start+2].u.num; - char *var_name = str_buf+str_data[num&0x00ffffff].str; - char *npc_name = conv_str(st,& (st->stack->stack_data[st->start+3])); - struct npc_data *nd = npc_name2id(npc_name); - if( var_name[0] != '.' || var_name[1] == '@' ) { - // ' 変数以外はダメ - printf("getvariableofnpc: invalid scope %s\n", var_name); - push_val(st->stack,C_INT,0); - } else if( nd == NULL || nd->bl.subtype != SCRIPT || !nd->u.scr.script) { - // NPC が見つからない or SCRIPT以外のNPC - printf("getvariableofnpc: can't find npc %s\n", npc_name); - push_val(st->stack,C_INT,0); - } else { - push_val2(st->stack,C_NAME,num, &nd->u.scr.script->script_vars ); + struct script_data* data; + + data = script_getdata(st,2); + if( !data_isreference(data) ) + {// Not a reference (aka varaible name) + ShowError("script: getvariableofnpc: first argument is not a variable name\n"); + st->state = END; + return 1; + } + else + { + int num = data->u.num; + char* var_name = str_buf + str_data[num&0x00ffffff].str; + char* npc_name = conv_str(st, script_getdata(st,3)); + struct npc_data* nd = npc_name2id(npc_name); + if( var_name[0] != '.' || var_name[1] == '@' ) + {// not a npc variable + ShowError("script: getvariableofnpc: invalid scope %s (not npc variable)\n", var_name); + st->state = END; + return 1; + } + else if( nd == NULL || nd->bl.subtype != SCRIPT || nd->u.scr.script == NULL ) + {// NPC not found or has no script + ShowError("script: getvariableofnpc: can't find npc %s\n", npc_name); + st->state = END; + return 1; + } + else + {// push variable reference + push_val2(st->stack, C_NAME, num, &nd->u.scr.script->script_vars ); } } return 0; } -// [blackhole89] ---> - -// Set a warp portal. +/// Opens a warp portal. +/// Has no "portal opening" effect/sound, it opens the portal immediately. +/// +/// warpportal(<src x>,<src y>,"<target map>",<target x>,<target y>); +/// +/// @author blackhole89 BUILDIN_FUNC(warpportal) { - struct skill_unit_group *group; + int spx; + int spy; unsigned short mapindex; - long spx,spy,tpx,tpy; - struct block_list *bl=map_id2bl(st->oid); - - nullpo_retr(0,bl); + int tpx; + int tpy; + struct skill_unit_group* group; + struct block_list* bl; - spx=conv_num(st, & (st->stack->stack_data[st->start+2])); - spy=conv_num(st, & (st->stack->stack_data[st->start+3])); - mapindex = mapindex_name2id((char*)conv_str(st,& (st->stack->stack_data[st->start+4]))); - printf("mapindex: %d\n",mapindex); - tpx=conv_num(st, & (st->stack->stack_data[st->start+5])); - tpy=conv_num(st, & (st->stack->stack_data[st->start+6])); + bl = map_id2bl(st->oid); + if( bl == NULL ) + { + ShowError("script: warpportal: npc is needed"); + return 1; + } - if(!mapindex) return 0; + spx = conv_num(st, script_getdata(st,2)); + spy = conv_num(st, script_getdata(st,3)); + mapindex = mapindex_name2id(conv_str(st, script_getdata(st,4))); + tpx = conv_num(st, script_getdata(st,5)); + tpy = conv_num(st, script_getdata(st,6)); - if((group=skill_unitsetting(bl,AL_WARP,4,spx,spy,1))==NULL) { - return 0; - } + if( mapindex == 0 ) + return 0;// map not found - group->val2=(tpx<<16)|tpy; + group = skill_unitsetting(bl, AL_WARP, 4, spx, spy, 1); + if( group == NULL ) + return 0;// failed + group->val2 = (tpx<<16) | tpy; group->val3 = mapindex; return 0; } - -// <-- [blackhole89] - |