diff options
author | FlavioJS <FlavioJS@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2007-02-05 17:42:55 +0000 |
---|---|---|
committer | FlavioJS <FlavioJS@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2007-02-05 17:42:55 +0000 |
commit | 75530b149dc1272d17c2c22faefe2e6c3e762c5b (patch) | |
tree | 606f792ca7d72c87c803f64b049b2c68735e020b /src/map | |
parent | 18b911c57a786135cf29fdca1c6e79093cd58945 (diff) | |
download | hercules-75530b149dc1272d17c2c22faefe2e6c3e762c5b.tar.gz hercules-75530b149dc1272d17c2c22faefe2e6c3e762c5b.tar.bz2 hercules-75530b149dc1272d17c2c22faefe2e6c3e762c5b.tar.xz hercules-75530b149dc1272d17c2c22faefe2e6c3e762c5b.zip |
- Continuing the checking of script buildin functions and stop the script execution when an attached player is required but not found.
This task will be referenced as Ticket #41 from now on.
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@9790 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/map')
-rw-r--r-- | src/map/script.c | 103 |
1 files changed, 48 insertions, 55 deletions
diff --git a/src/map/script.c b/src/map/script.c index a8b68db03..b5cc1d55d 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -1872,18 +1872,14 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o // enum {RUN = 0,STOP,END,RERUNLINE,GOTO,RETFUNC}; -/*========================================== - * ridからsdへの解決 - *------------------------------------------ - */ +/// Returns the player attached to this script, identified by the rid. +/// If there is no player attached, the script is terminated. struct map_session_data *script_rid2sd(struct script_state *st) { struct map_session_data *sd=map_id2sd(st->rid); if(!sd){ ShowError("script_rid2sd: fatal error ! player not attached!\n"); - report_src(st); - //## I would also terminate script execution. [FlavioJS] - //st->state = END; + st->state = END; } return sd; } @@ -3869,7 +3865,7 @@ struct script_function buildin_func[] = { {buildin_heal,"heal","ii"}, {buildin_itemheal,"itemheal","ii"}, {buildin_percentheal,"percentheal","ii"}, - {buildin_rand,"rand","i*"}, + {buildin_rand,"rand","i?"}, {buildin_countitem,"countitem","i"}, {buildin_countitem2,"countitem2","iiiiiiii"}, {buildin_checkweight,"checkweight","ii"}, @@ -4435,34 +4431,35 @@ int buildin_menu(struct script_state *st) return 0; } -/*========================================== - * - *------------------------------------------ - */ -int buildin_rand(struct script_state *st) +/// Returns a random number from 0 to <range>-1. +/// Or returns a random number from <min> to <max>. +/// If <min> is greater than <max>, their numbers are switched. +/// rand(<range>) -> <int> +/// rand(<min>,<max>) -> <int> +int buildin_rand(struct script_state* st) { - int range,min,max; + int range; + int min; + int max; - if (st->end > st->start+3){ - min = conv_num(st,& (st->stack->stack_data[st->start+2])); - max = conv_num(st,& (st->stack->stack_data[st->start+3])); - if (max == min){ //Why would someone do this? - push_val(st->stack,C_INT,min); - return 0; - } - if(max<min){ - int tmp = min; - min = max; - max = tmp; - } + if( script_hasdata(st,3) ) + {// min,max + min = conv_num(st, script_getdata(st,2)); + max = conv_num(st, script_getdata(st,3)); + if( max < min ) + swap(min, max); range = max - min + 1; - if (range == 0) range = 1; - push_val(st->stack,C_INT,rand()%range+min); - } else { - range = conv_num(st,& (st->stack->stack_data[st->start+2])); - if (range == 0) range = 1; - push_val(st->stack,C_INT,rand()%range); } + else + {// range + min = 0; + range = conv_num(st, script_getdata(st,2)); + } + if( range <= 1 ) + script_pushint(st, min); + else + script_pushint(st, rand()%range + min); + return 0; } @@ -6516,7 +6513,7 @@ int buildin_bonus(struct script_state* st) sd = script_rid2sd(st); if( sd == NULL ) - return 0; // no player attached + return 1; // no player attached type = conv_num(st, script_getdata(st,2)); switch( script_lastdata(st) ){ @@ -6561,7 +6558,7 @@ int buildin_skill(struct script_state* st) sd = script_rid2sd(st); if( sd == NULL ) - return 0; // no player attached + return 1;// no player attached, report source id = conv_num(st, script_getdata(st,2)); level = conv_num(st, script_getdata(st,3)); @@ -6584,7 +6581,7 @@ int buildin_addtoskill(struct script_state* st) sd = script_rid2sd(st); if( sd == NULL ) - return 0; // no player attached + return 1;// no player attached, report source id = conv_num(st, script_getdata(st,2)); level = conv_num(st, script_getdata(st,3)); @@ -6606,7 +6603,7 @@ int buildin_guildskill(struct script_state* st) sd = script_rid2sd(st); if( sd == NULL ) - return 0; // needs player attached + return 1;// no player attached, report source id = conv_num(st, script_getdata(st,2)); level = conv_num(st, script_getdata(st,3)); @@ -6624,10 +6621,8 @@ int buildin_getskilllv(struct script_state* st) TBL_PC* sd; sd = script_rid2sd(st); - if( sd == NULL ){ - script_pushint(st, 0); - return 0; // needs player attached - } + if( sd == NULL ) + return 1;// no player attached, report source id = conv_num(st, script_getdata(st,2)); script_pushint(st, pc_checkskill(sd,id)); @@ -6688,10 +6683,8 @@ int buildin_getgmlevel(struct script_state* st) TBL_PC* sd; sd = script_rid2sd(st); - if( sd == NULL ){ - script_pushint(st, 0); - return 0; // needs player attached - } + if( sd == NULL ) + return 1;// no player attached, report source script_pushint(st, pc_isGM(sd)); @@ -6715,7 +6708,7 @@ int buildin_checkoption(struct script_state* st) sd = script_rid2sd(st); if( sd == NULL ) - return buildin_end(st);// needs player attached + return 1;// no player attached, report source option = conv_num(st, script_getdata(st,2)); if( sd->sc.option&option ) @@ -6735,7 +6728,7 @@ int buildin_checkoption1(struct script_state* st) sd = script_rid2sd(st); if( sd == NULL ) - return buildin_end(st);// needs player attached + return 1;// no player attached, report source opt1 = conv_num(st, script_getdata(st,2)); if( sd->sc.opt1 == opt1 ) @@ -6755,7 +6748,7 @@ int buildin_checkoption2(struct script_state* st) sd = script_rid2sd(st); if( sd == NULL ) - return buildin_end(st);// needs player attached + return 1;// no player attached, report source opt2 = conv_num(st, script_getdata(st,2)); if( sd->sc.opt2&opt2 ) @@ -6776,7 +6769,7 @@ int buildin_setoption(struct script_state* st) sd = script_rid2sd(st); if( sd == NULL ) - return 0;// needs player attached + return 1;// no player attached, report source option = conv_num(st, script_getdata(st,2)); if( script_hasdata(st,3) ) @@ -6804,7 +6797,7 @@ int buildin_checkcart(struct script_state* st) sd = script_rid2sd(st); if( sd == NULL ) - return buildin_end(st);// needs player attached + return 1;// no player attached, report source if( pc_iscarton(sd) ) script_pushint(st, 1); @@ -6823,7 +6816,7 @@ int buildin_setcart(struct script_state* st) sd = script_rid2sd(st); if( sd == NULL ) - return 0;// needs player attached + return 1;// no player attached, report source if( script_hasdata(st,2) ) type = conv_num(st, script_getdata(st,2)); @@ -6841,7 +6834,7 @@ int buildin_checkfalcon(struct script_state* st) sd = script_rid2sd(st); if( sd == NULL ) - return buildin_end(st);// needs player attached + return 1;// no player attached, report source if( pc_isfalcon(sd) ) script_pushint(st, 1); @@ -6860,7 +6853,7 @@ int buildin_setfalcon(struct script_state* st) sd = script_rid2sd(st); if( sd == NULL ) - return 0;// needs player attached + return 1;// no player attached, report source if( script_hasdata(st,2) ) flag = conv_num(st, script_getdata(st,2)); @@ -6879,7 +6872,7 @@ int buildin_checkriding(struct script_state* st) sd = script_rid2sd(st); if( sd == NULL ) - return buildin_end(st);// needs player attached + return 1;// no player attached, report source if( pc_isriding(sd) ) script_pushint(st, 1); @@ -6898,7 +6891,7 @@ int buildin_setriding(struct script_state* st) sd = script_rid2sd(st); if( sd == NULL ) - return 0;// needs player attached + return 1;// no player attached, report source if( script_hasdata(st,2) ) flag = conv_num(st, script_getdata(st,2)); @@ -6920,7 +6913,7 @@ int buildin_savepoint(struct script_state* st) sd = script_rid2sd(st); if( sd == NULL ) - return 0;// needs player attached + return 1;// no player attached, report source str = conv_str(st, script_getdata(st,2)); x = conv_num(st, script_getdata(st,3)); |