diff options
Diffstat (limited to 'src/map/script.c')
-rw-r--r-- | src/map/script.c | 102 |
1 files changed, 46 insertions, 56 deletions
diff --git a/src/map/script.c b/src/map/script.c index 9aa292e63..339afb495 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -30,6 +30,7 @@ #include "mercenary.h" //[orn] #include "intif.h" #include "skill.h" +#include "status.h" #include "chat.h" #include "battle.h" #include "party.h" @@ -251,14 +252,16 @@ char mapregsql_db_index[32] = "index"; char mapregsql_db_value[32] = "value"; #endif -int get_com(unsigned char *script,int *pos); +c_op get_com(unsigned char *script,int *pos); int get_num(unsigned char *script,int *pos); -struct script_function { +typedef struct script_function { int (*func)(struct script_state *st); const char *name; const char *arg; -} buildin_func[]; +} script_function; + +extern script_function buildin_func[]; static struct linkdb_node *sleep_db; #define not_server_variable(prefix) ( (prefix) != '$' && (prefix) != '.') @@ -1851,7 +1854,7 @@ void script_error(const char *src,const char *file,int start_line, const char *e const char *linestart[5] = { NULL, NULL, NULL, NULL, NULL }; for(p=src;p && *p;line++){ - char *lineend=strchr(p,'\n'); + const char *lineend=strchr(p,'\n'); if(lineend==NULL || error_pos<lineend){ break; } @@ -2167,7 +2170,7 @@ void get_val(struct script_state* st, struct script_data* data) data->ref ? data->ref: name[1] == '@' ? st->stack->var_function:// instance/scope variable &st->script->script_vars;// npc variable - data->u.str = linkdb_search(n, (void*)reference_getuid(data)); + data->u.str = (char*)linkdb_search(n, (void*)reference_getuid(data)); } break; default: @@ -2234,7 +2237,7 @@ void get_val(struct script_state* st, struct script_data* data) return; } -void push_val2(struct script_stack* stack, int type, int val, struct linkdb_node** ref); +void push_val2(struct script_stack* stack, enum c_op type, int val, struct linkdb_node** ref); /// Retrieves the value of a reference identified by uid (variable, constant, param) /// The value is left in the top of the stack and needs to be removed manually. @@ -2271,7 +2274,7 @@ static int set_reg(struct script_state* st, TBL_PC* sd, int num, char* name, con char* p; struct linkdb_node** n; n = (ref) ? ref : (name[1] == '@') ? st->stack->var_function : &st->script->script_vars; - p = linkdb_erase(n, (void*)num); + p = (char*)linkdb_erase(n, (void*)num); if (p) aFree(p); if (str[0]) linkdb_insert(n, (void*)num, aStrdup(str)); } @@ -2423,7 +2426,7 @@ void stack_expand(struct script_stack* stack) #define push_val(stack,type,val) push_val2(stack, type, val, NULL) /// Pushes a value into the stack (with reference) -void push_val2(struct script_stack* stack, int type, int val, struct linkdb_node** ref) +void push_val2(struct script_stack* stack, enum c_op type, int val, struct linkdb_node** ref) { if( stack->sp >= stack->sp_max ) stack_expand(stack); @@ -2434,7 +2437,7 @@ void push_val2(struct script_stack* stack, int type, int val, struct linkdb_node } /// Pushes a string into the stack -void push_str(struct script_stack* stack, int type, char* str) +void push_str(struct script_stack* stack, enum c_op type, char* str) { if( stack->sp >= stack->sp_max ) stack_expand(stack); @@ -2549,35 +2552,18 @@ void script_free_code(struct script_code* code) /*========================================== * コマンドの読み取り *------------------------------------------*/ -static int unget_com_data=-1; -int get_com(unsigned char *script,int *pos) +c_op get_com(unsigned char *script,int *pos) { - int i,j; - if(unget_com_data>=0){ - i=unget_com_data; - unget_com_data=-1; - return i; - } + int i = 0, j = 0; + if(script[*pos]>=0x80){ return C_INT; } - i=0; j=0; while(script[*pos]>=0x40){ i=script[(*pos)++]<<j; j+=6; } - return i+(script[(*pos)++]<<j); -} - -/*========================================== - * コマンドのプッシュバック - *------------------------------------------*/ -void unget_com(int c) -{ - if(unget_com_data!=-1) - ShowError("unget_com can back only 1 data\n"); - - unget_com_data=c; + return (c_op)(i+(script[(*pos)++]<<j)); } /*========================================== @@ -2970,14 +2956,14 @@ void run_script(struct script_code *rootscript,int pos,int rid,int oid) //Resume script. st = sd->st; } else { - st = aCalloc(sizeof(struct script_state), 1); + st = (struct script_state*)aCalloc(sizeof(struct script_state), 1); // the script is different, make new script_state and stack - st->stack = aMalloc (sizeof(struct script_stack)); + st->stack = (struct script_stack*)aMalloc (sizeof(struct script_stack)); st->stack->sp=0; st->stack->sp_max=64; st->stack->stack_data = (struct script_data *)aCalloc(st->stack->sp_max,sizeof(st->stack->stack_data[0])); st->stack->defsp = st->stack->sp; - st->stack->var_function = aCalloc(1, sizeof(struct linkdb_node*)); + st->stack->var_function = (struct linkdb_node**)aCalloc(1, sizeof(struct linkdb_node*)); st->state = RUN; st->script = rootscript; } @@ -3056,7 +3042,6 @@ int run_script_timer(int tid, unsigned int tick, int id, int data) *------------------------------------------*/ void run_script_main(struct script_state *st) { - int c; int cmdcount=script_config.check_cmdcount; int gotocount=script_config.check_gotocount; TBL_PC *sd; @@ -3084,8 +3069,9 @@ void run_script_main(struct script_state *st) } else if(st->state != END) st->state = RUN; - while(st->state == RUN){ - c= get_com(st->script->script_buf,&st->pos); + while(st->state == RUN) + { + enum c_op c = get_com(st->script->script_buf,&st->pos); switch(c){ case C_EOL: if( stack->sp != stack->defsp ) @@ -3623,7 +3609,7 @@ int do_init_script() mapreg_db= idb_alloc(DB_OPT_BASE); mapregstr_db=idb_alloc(DB_OPT_RELEASE_DATA); userfunc_db=strdb_alloc(DB_OPT_DUP_KEY,0); - scriptlabel_db=strdb_alloc(DB_OPT_DUP_KEY|DB_OPT_ALLOW_NULL_DATA,50); + scriptlabel_db=strdb_alloc((DBOptions)(DB_OPT_DUP_KEY|DB_OPT_ALLOW_NULL_DATA),50); script_load_mapreg(); @@ -4039,7 +4025,7 @@ BUILDIN_FUNC(callfunc) struct script_code *scr, *oldscr; const char* str = script_getstr(st,2); - scr = strdb_get(userfunc_db, str); + scr = (struct script_code*)strdb_get(userfunc_db, str); if( !scr ) { ShowError("script:callfunc: function not found! [%s]\n", str); @@ -8097,12 +8083,12 @@ BUILDIN_FUNC(hideonnpc) BUILDIN_FUNC(sc_start) { struct block_list* bl; - int type; + enum sc_type type; int tick; int val1; int val4 = 0; - type = script_getnum(st,2); + type = (sc_type)script_getnum(st,2); tick = script_getnum(st,3); val1 = script_getnum(st,4); if( script_hasdata(st,5) ) @@ -8110,7 +8096,7 @@ BUILDIN_FUNC(sc_start) else bl = map_id2bl(st->rid); - if( tick == 0 && val1 > 0 && type >= 0 && type < SC_MAX && status_sc2skill(type) != 0 ) + if( tick == 0 && val1 > 0 && type > SC_NONE && type < SC_MAX && status_sc2skill(type) != 0 ) {// When there isn't a duration specified, try to get it from the skill_db tick = skill_get_time(status_sc2skill(type), val1); } @@ -8124,6 +8110,7 @@ BUILDIN_FUNC(sc_start) if( bl ) status_change_start(bl, type, 10000, val1, 0, 0, val4, tick, 2); + return 0; } @@ -8133,13 +8120,13 @@ BUILDIN_FUNC(sc_start) BUILDIN_FUNC(sc_start2) { struct block_list* bl; - int type; + enum sc_type type; int tick; int val1; int val4 = 0; int rate; - type = script_getnum(st,2); + type = (sc_type)script_getnum(st,2); tick = script_getnum(st,3); val1 = script_getnum(st,4); rate = script_getnum(st,5); @@ -8148,7 +8135,7 @@ BUILDIN_FUNC(sc_start2) else bl = map_id2bl(st->rid); - if( tick == 0 && val1 > 0 && type >= 0 && type < SC_MAX && status_sc2skill(type) != 0 ) + if( tick == 0 && val1 > 0 && type > SC_NONE && type < SC_MAX && status_sc2skill(type) != 0 ) {// When there isn't a duration specified, try to get it from the skill_db tick = skill_get_time(status_sc2skill(type), val1); } @@ -8172,14 +8159,14 @@ BUILDIN_FUNC(sc_start2) BUILDIN_FUNC(sc_start4) { struct block_list* bl; - int type; + enum sc_type type; int tick; int val1; int val2; int val3; int val4; - type = script_getnum(st,2); + type = (sc_type)script_getnum(st,2); tick = script_getnum(st,3); val1 = script_getnum(st,4); val2 = script_getnum(st,5); @@ -8190,7 +8177,7 @@ BUILDIN_FUNC(sc_start4) else bl = map_id2bl(st->rid); - if( tick == 0 && val1 > 0 && type >= 0 && type < SC_MAX && status_sc2skill(type) != 0 ) + if( tick == 0 && val1 > 0 && type > SC_NONE && type < SC_MAX && status_sc2skill(type) != 0 ) {// When there isn't a duration specified, try to get it from the skill_db tick = skill_get_time(status_sc2skill(type), val1); } @@ -8235,7 +8222,7 @@ BUILDIN_FUNC(sc_end) if (!sce) return 0; //This should help status_change_end force disabling the SC in case it has no limit. sce->val1 = sce->val2 = sce->val3 = sce->val4 = 0; - status_change_end(bl, type, INVALID_TIMER); + status_change_end(bl, (sc_type)type, INVALID_TIMER); } else status_change_clear(bl, 2);// remove all effects return 0; @@ -8257,7 +8244,7 @@ BUILDIN_FUNC(getscrate) bl = map_id2bl(st->rid); if (bl) - rate = status_get_sc_def(bl,type, 10000, 10000, 0); + rate = status_get_sc_def(bl, (sc_type)type, 10000, 10000, 0); script_pushint(st,rate); return 0; @@ -9193,7 +9180,7 @@ BUILDIN_FUNC(getcastlename) { const char* mapname = mapindex_getmapname(script_getstr(st,2),NULL); struct guild_castle* gc = guild_mapname2gc(mapname); - char* name = (gc) ? gc->castle_name : ""; + const char* name = (gc) ? gc->castle_name : ""; script_pushstrcopy(st,name); return 0; } @@ -10309,9 +10296,8 @@ BUILDIN_FUNC(petrecovery) } else //Init pd->recovery = (struct pet_recovery *)aMalloc(sizeof(struct pet_recovery)); - pd->recovery->type=script_getnum(st,2); + pd->recovery->type=(sc_type)script_getnum(st,2); pd->recovery->delay=script_getnum(st,3); - pd->recovery->timer=-1; return 0; @@ -10484,11 +10470,13 @@ BUILDIN_FUNC(npcskilleffect) BUILDIN_FUNC(specialeffect) { struct block_list *bl=map_id2bl(st->oid); + int type = script_getnum(st,2); + enum send_target target = script_hasdata(st,3) ? (send_target)script_getnum(st,3) : AREA; if(bl==NULL) return 0; - clif_specialeffect(bl,script_getnum(st,2), (script_hasdata(st,3)?script_getnum(st,3):AREA)); + clif_specialeffect(bl, type, target); return 0; } @@ -10496,11 +10484,13 @@ BUILDIN_FUNC(specialeffect) BUILDIN_FUNC(specialeffect2) { TBL_PC *sd=script_rid2sd(st); + int type = script_getnum(st,2); + enum send_target target = script_hasdata(st,3) ? (send_target)script_getnum(st,3) : AREA; if(sd==NULL) return 0; - clif_specialeffect(&sd->bl,script_getnum(st,2), (script_hasdata(st,3)?script_getnum(st,3):AREA)); + clif_specialeffect(&sd->bl, type, target); return 0; } @@ -11651,7 +11641,7 @@ BUILDIN_FUNC(checkcell) const char *map = script_getstr(st, 2); m = mapindex_name2id(map); if(m){ - script_pushint(st,map_getcell(m, script_getnum(st,3), script_getnum(st,4),script_getnum(st,5))); + script_pushint(st,map_getcell(m, script_getnum(st,3), script_getnum(st,4),(cell_chk)script_getnum(st,5))); } else { script_pushint(st,0); } @@ -11831,7 +11821,7 @@ BUILDIN_FUNC(escape_sql) str = script_getstr(st,2); len = strlen(str); - esc_str = aMallocA(len*2+1); + esc_str = (char*)aMallocA(len*2+1); #if defined(TXT_ONLY) jstrescapecpy(esc_str, str); #else |