diff options
author | FlavioJS <FlavioJS@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2007-01-09 17:31:13 +0000 |
---|---|---|
committer | FlavioJS <FlavioJS@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2007-01-09 17:31:13 +0000 |
commit | faa7a02a489886461cd039cc306f1fc55d81daa5 (patch) | |
tree | 07ba43506b1c277d7033855c5495dd0e7444ae39 /src | |
parent | dde71c808130e2923b321561d3d772e0e734b725 (diff) | |
download | hercules-faa7a02a489886461cd039cc306f1fc55d81daa5.tar.gz hercules-faa7a02a489886461cd039cc306f1fc55d81daa5.tar.bz2 hercules-faa7a02a489886461cd039cc306f1fc55d81daa5.tar.xz hercules-faa7a02a489886461cd039cc306f1fc55d81daa5.zip |
- Changes to script buildin functions:
* functions checking if a player is attached as soon as possible.
* functions that required a player attached and would crash if none was
there terminate the script now. (others keep the current behaviour to
maintain full backward compatibility)
* removed the unused flag argument in guildskill.
* bonus,bonus2,bonus3,bonus4 use the same function now (remains the same
script-wise)
* added an optional parameter to setcart,setfalcon,setriding so it's
possible to remove the cart/falcon/mount or select a specific cart
* other cleanups
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@9636 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src')
-rw-r--r-- | src/common/socket.c | 2 | ||||
-rw-r--r-- | src/map/clif.c | 2 | ||||
-rw-r--r-- | src/map/guild.c | 23 | ||||
-rw-r--r-- | src/map/guild.h | 2 | ||||
-rw-r--r-- | src/map/intif.c | 17 | ||||
-rw-r--r-- | src/map/intif.h | 2 | ||||
-rw-r--r-- | src/map/itemdb.c | 12 | ||||
-rw-r--r-- | src/map/map.h | 15 | ||||
-rw-r--r-- | src/map/pc.c | 73 | ||||
-rw-r--r-- | src/map/pc.h | 8 | ||||
-rw-r--r-- | src/map/script.c | 627 | ||||
-rw-r--r-- | src/map/skill.h | 2 | ||||
-rw-r--r-- | src/map/status.c | 2 |
13 files changed, 416 insertions, 371 deletions
diff --git a/src/common/socket.c b/src/common/socket.c index 6589978bb..c03240739 100644 --- a/src/common/socket.c +++ b/src/common/socket.c @@ -282,7 +282,7 @@ static int connect_client(int listen_fd) ShowError("accept failed (code %i)!\n", s_errno); return -1; } - + if(fd_max<=fd) fd_max=fd+1; setsocketopts(fd); diff --git a/src/map/clif.c b/src/map/clif.c index 8aaab7dd9..2e40bf7da 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -7898,7 +7898,7 @@ int clif_charnameupdate (struct map_session_data *ssd) memcpy(WBUFP(buf,30), p->party.name, NAME_LENGTH); else WBUFB(buf,30) = 0; - + if (g) { int i, ps = -1; diff --git a/src/map/guild.c b/src/map/guild.c index 49d5dd0db..b71b6344b 100644 --- a/src/map/guild.c +++ b/src/map/guild.c @@ -1171,26 +1171,23 @@ int guild_getexp(struct map_session_data *sd,int exp) } // スキルポイント割り振り -int guild_skillup(struct map_session_data *sd,int skill_num,int flag) +int guild_skillup(TBL_PC* sd, int skill_num) { - struct guild *g; + struct guild* g; int idx = skill_num - GD_SKILLBASE; nullpo_retr(0, sd); - if(idx < 0 || idx >= MAX_GUILDSKILL) - - return 0; - if(sd->status.guild_id==0 || (g=guild_search(sd->status.guild_id))==NULL) - return 0; - if(strcmp(sd->status.name,g->master)) + if( idx < 0 || idx >= MAX_GUILDSKILL || // not a guild skill + sd->status.guild_id == 0 || (g=guild_search(sd->status.guild_id)) == NULL || // no guild + strcmp(sd->status.name, g->master) ) // not the guild master return 0; - if( (g->skill_point>0 || flag&1) && - g->skill[idx].id!=0 && - g->skill[idx].lv < guild_skill_get_max(skill_num) ){ - intif_guild_skillup(g->guild_id,skill_num,sd->status.account_id,flag); - } + if( g->skill_point > 0 && + g->skill[idx].id != 0 && + g->skill[idx].lv < guild_skill_get_max(skill_num) ) + intif_guild_skillup(g->guild_id, skill_num, sd->status.account_id); + return 0; } // スキルポイント割り振り通知 diff --git a/src/map/guild.h b/src/map/guild.h index 7de747b8d..6171c72f2 100644 --- a/src/map/guild.h +++ b/src/map/guild.h @@ -48,7 +48,7 @@ int guild_member_leaved(int guild_id,int account_id,int char_id,int flag, const char *name,const char *mes); int guild_expulsion(struct map_session_data *sd,int guild_id, int account_id,int char_id,const char *mes); -int guild_skillup(struct map_session_data *sd,int skill_num,int flag); +int guild_skillup(struct map_session_data* sd, int skill_num); void guild_block_skill(struct map_session_data *sd, int time); int guild_reqalliance(struct map_session_data *sd,struct map_session_data *tsd); int guild_reply_reqalliance(struct map_session_data *sd,int account_id,int flag); diff --git a/src/map/intif.c b/src/map/intif.c index 54c5bf73a..18a6cc81b 100644 --- a/src/map/intif.c +++ b/src/map/intif.c @@ -694,17 +694,16 @@ int intif_guild_position(int guild_id,int idx,struct guild_position *p) return 0; } // ギルドスキルアップ要求 -int intif_guild_skillup(int guild_id,int skill_num,int account_id,int flag) +int intif_guild_skillup(int guild_id, int skill_num, int account_id) { - if (CheckForCharServer()) + if( CheckForCharServer() ) return 0; - WFIFOHEAD(inter_fd,14); - WFIFOW(inter_fd, 0)=0x303c; - WFIFOL(inter_fd, 2)=guild_id; - WFIFOL(inter_fd, 6)=skill_num; - WFIFOL(inter_fd,10)=account_id; - //WFIFOL(inter_fd,14)=flag; - WFIFOSET(inter_fd,14); + WFIFOHEAD(inter_fd, 14); + WFIFOW(inter_fd, 0) = 0x303c; + WFIFOL(inter_fd, 2) = guild_id; + WFIFOL(inter_fd, 6) = skill_num; + WFIFOL(inter_fd, 10) = account_id; + WFIFOSET(inter_fd, 14); return 0; } // ギルド同盟/敵対要求 diff --git a/src/map/intif.h b/src/map/intif.h index 8fc005508..86f09e30e 100644 --- a/src/map/intif.h +++ b/src/map/intif.h @@ -46,7 +46,7 @@ int intif_guild_change_gm(int guild_id, const char* name, int len); int intif_guild_change_basicinfo(int guild_id, int type, const void *data, int len); int intif_guild_change_memberinfo(int guild_id, int account_id, int char_id, int type, const void *data, int len); int intif_guild_position(int guild_id, int idx, struct guild_position *p); -int intif_guild_skillup(int guild_id, int skill_num, int account_id, int flag); +int intif_guild_skillup(int guild_id, int skill_num, int account_id); int intif_guild_alliance(int guild_id1, int guild_id2, int account_id1, int account_id2, int flag); int intif_guild_notice(int guild_id, const char *mes1, const char *mes2); int intif_guild_emblem(int guild_id, int len, const char *data); diff --git a/src/map/itemdb.c b/src/map/itemdb.c index 2d4e9a3af..7d27f4fd0 100644 --- a/src/map/itemdb.c +++ b/src/map/itemdb.c @@ -1141,7 +1141,7 @@ static int itemdb_readdb(void) str[19] = p; //Script np = strchr(p,'}'); - + while (np && np[1] && np[1] != ',') np = strchr(np+1,'}'); //Jump close brackets until the next field is found. if (!np || !np[1]) { @@ -1152,13 +1152,13 @@ static int itemdb_readdb(void) np[1] = '\0'; //Set end of script id->script = parse_script(str[19],filename[i],lines,0); np+=2; //Skip to next field - + if(!np || (p=strchr(np,'{'))==NULL) continue; - + str[20] = p; //Equip Script np = strchr(p,'}'); - + while (np && np[1] && np[1] != ',') np = strchr(np+1,'}'); //Jump close brackets until the next field is found. if (!np || !np[1]) { @@ -1166,11 +1166,11 @@ static int itemdb_readdb(void) id->equip_script = parse_script(str[20],filename[i],lines,0); continue; } - + np[1] = '\0'; //Set end of script id->equip_script = parse_script(str[20],filename[i],lines,0); np+=2; //Skip comma, to next field - + if(!np || (p=strchr(np,'{'))==NULL) continue; //Unequip script, last column. diff --git a/src/map/map.h b/src/map/map.h index 70b5df912..e78ea9dcd 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -1153,7 +1153,7 @@ struct flooritem_data { struct item item_data; }; -enum { +enum _sp { SP_SPEED,SP_BASEEXP,SP_JOBEXP,SP_KARMA,SP_MANNER,SP_HP,SP_MAXHP,SP_SP, // 0-7 SP_MAXSP,SP_STATUSPOINT,SP_0a,SP_BASELEVEL,SP_SKILLPOINT,SP_STR,SP_AGI,SP_VIT, // 8-15 SP_INT,SP_DEX,SP_LUK,SP_CLASS,SP_ZENY,SP_SEX,SP_NEXTBASEEXP,SP_NEXTJOBEXP, // 16-23 @@ -1210,8 +1210,17 @@ enum { //are available! }; -enum { - LOOK_BASE,LOOK_HAIR,LOOK_WEAPON,LOOK_HEAD_BOTTOM,LOOK_HEAD_TOP,LOOK_HEAD_MID,LOOK_HAIR_COLOR,LOOK_CLOTHES_COLOR,LOOK_SHIELD,LOOK_SHOES +enum _look { + LOOK_BASE, + LOOK_HAIR, + LOOK_WEAPON, + LOOK_HEAD_BOTTOM, + LOOK_HEAD_TOP, + LOOK_HEAD_MID, + LOOK_HAIR_COLOR, + LOOK_CLOTHES_COLOR, + LOOK_SHIELD, + LOOK_SHOES }; // CELLs for non-permanent cell-based effects (Pneuma, Basilica, Npcs, etc) diff --git a/src/map/pc.c b/src/map/pc.c index 656555136..a8f16af13 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -2402,47 +2402,47 @@ int pc_bonus4(struct map_session_data *sd,int type,int type2,int type3,int type4 * 2 - Like 1, except the level granted can stack with previously learned level. *------------------------------------------ */ -int pc_skill(struct map_session_data *sd,int id,int level,int flag) +int pc_skill(TBL_PC* sd, int id, int level, int flag) { nullpo_retr(0, sd); - if(level>MAX_SKILL_LEVEL){ - if(battle_config.error_log) + if( level > MAX_SKILL_LEVEL ){ + if( battle_config.error_log ) ShowError("pc_skill: Skill level %d too high. Max lv supported is MAX_SKILL_LEVEL (%d)\n", level, MAX_SKILL_LEVEL); return 0; } - switch (flag) { + switch( flag ){ case 0: //Set skill data overwriting whatever was there before. - sd->status.skill[id].id=id; - sd->status.skill[id].lv=level; - sd->status.skill[id].flag=0; - if (!level) //Remove skill. + sd->status.skill[id].id = id; + sd->status.skill[id].lv = level; + sd->status.skill[id].flag = 0; + if( !level ) //Remove skill. sd->status.skill[id].id = 0; - if (!skill_get_inf(id)) //Only recalculate for passive skills. - status_calc_pc(sd,0); + if( !skill_get_inf(id) ) //Only recalculate for passive skills. + status_calc_pc(sd, 0); clif_skillinfoblock(sd); break; case 2: //Add skill bonus on top of what you had. - if (sd->status.skill[id].id==id) { - if (!sd->status.skill[id].flag) - sd->status.skill[id].flag=sd->status.skill[id].lv+2; //Store previous level. + if( sd->status.skill[id].id == id ){ + if( !sd->status.skill[id].flag ) // Store previous level. + sd->status.skill[id].flag = sd->status.skill[id].lv + 2; } else { - sd->status.skill[id].id=id; - sd->status.skill[id].flag=1; //Set that this is a bonus skill. + sd->status.skill[id].id = id; + sd->status.skill[id].flag = 1; //Set that this is a bonus skill. } - sd->status.skill[id].lv+=level; + sd->status.skill[id].lv += level; break; case 1: //Item bonus skill. - if(sd->status.skill[id].lv >= level) + if( sd->status.skill[id].lv >= level ) return 0; - if(sd->status.skill[id].id==id) { - if (!sd->status.skill[id].flag) //Non-granted skill, store it's level. - sd->status.skill[id].flag=sd->status.skill[id].lv+2; + if( sd->status.skill[id].id == id ){ + if( !sd->status.skill[id].flag ) //Non-granted skill, store it's level. + sd->status.skill[id].flag = sd->status.skill[id].lv + 2; } else { - sd->status.skill[id].id=id; - sd->status.skill[id].flag=1; + sd->status.skill[id].id = id; + sd->status.skill[id].flag = 1; } - sd->status.skill[id].lv=level; + sd->status.skill[id].lv = level; break; default: //Unknown flag? return 0; @@ -4467,7 +4467,7 @@ int pc_skillup(struct map_session_data *sd,int skill_num) nullpo_retr(0, sd); if(skill_num >= GD_SKILLBASE){ - guild_skillup(sd,skill_num,0); + guild_skillup(sd, skill_num); return 0; } @@ -5790,10 +5790,13 @@ int pc_setcart(struct map_session_data *sd,int type) * 鷹設定 *------------------------------------------ */ -int pc_setfalcon(struct map_session_data *sd) +int pc_setfalcon(TBL_PC* sd, int flag) { - if(pc_checkskill(sd,HT_FALCON)>0){ // ファルコンマスタリ?スキル所持 - pc_setoption(sd,sd->sc.option|OPTION_FALCON); + if( flag ){ + if( pc_checkskill(sd,HT_FALCON)>0 ) // ファルコンマスタリ?スキル所持 + pc_setoption(sd,sd->sc.option|OPTION_FALCON); + } else if( pc_isfalcon(sd) ){ + pc_setoption(sd,sd->sc.option&~OPTION_FALCON); // remove falcon } return 0; @@ -5803,11 +5806,15 @@ int pc_setfalcon(struct map_session_data *sd) * ペコペコ設定 *------------------------------------------ */ -int pc_setriding(struct map_session_data *sd) +int pc_setriding(TBL_PC* sd, int flag) { - if((pc_checkskill(sd,KN_RIDING)>0)){ // ライディングスキル所持 - pc_setoption(sd,sd->sc.option|OPTION_RIDING); + if( flag ){ + if( pc_checkskill(sd,KN_RIDING) > 0 ) // ライディングスキル所持 + pc_setoption(sd, sd->sc.option|OPTION_RIDING); + } else if( pc_isriding(sd) ){ + pc_setoption(sd, sd->sc.option&~OPTION_RIDING); } + return 0; } @@ -6297,7 +6304,7 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos) clif_equipitemack(sd,n,0,0); // fail return 0; } - + if(pos == EQP_ACC) { //Accesories should only go in one of the two, pos = req_pos&EQP_ACC; if (pos == EQP_ACC) //User specified both slots.. @@ -6328,7 +6335,7 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos) sd->equip_index[i] = n; } } - + if(pos==EQP_AMMO){ clif_arrowequip(sd,n); clif_arrow_fail(sd,3); @@ -6494,7 +6501,7 @@ int pc_unequipitem(struct map_session_data *sd,int n,int flag) if((sd->status.inventory[n].equip & EQP_ARMS) && sd->weapontype1 == 0 && sd->weapontype2 == 0) skill_enchant_elemental_end(&sd->bl,-1); - + sd->status.inventory[n].equip=0; if(flag&1) { diff --git a/src/map/pc.h b/src/map/pc.h index c290ec696..06d8198f9 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -165,7 +165,7 @@ int pc_bonus(struct map_session_data*,int,int); int pc_bonus2(struct map_session_data *sd,int,int,int); int pc_bonus3(struct map_session_data *sd,int,int,int,int); int pc_bonus4(struct map_session_data *sd,int,int,int,int,int); -int pc_skill(struct map_session_data*,int,int,int); +int pc_skill(struct map_session_data* sd, int id, int level, int flag); int pc_insert_card(struct map_session_data *sd,int idx_card,int idx_equip); @@ -208,9 +208,9 @@ int pc_itemheal(struct map_session_data *sd,int itemid, int hp,int sp); int pc_percentheal(struct map_session_data *sd,int,int); int pc_jobchange(struct map_session_data *,int, int); int pc_setoption(struct map_session_data *,int); -int pc_setcart(struct map_session_data *sd,int type); -int pc_setfalcon(struct map_session_data *sd); -int pc_setriding(struct map_session_data *sd); +int pc_setcart(struct map_session_data* sd, int type); +int pc_setfalcon(struct map_session_data* sd, int flag); +int pc_setriding(struct map_session_data* sd, int flag); int pc_changelook(struct map_session_data *,int,int); int pc_equiplookall(struct map_session_data *sd); diff --git a/src/map/script.c b/src/map/script.c index 005e471c6..bce1f6cc7 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -59,6 +59,9 @@ #define script_getdata(st,i) &((st)->stack->stack_data[(st)->start+(i)]) /// Returns if the stack contains data at the target index #define script_hasdata(st,i) ( (st)->end > (st)->start + (i) ) +/// Returns the index of the last data in the stack +#define script_lastdata(st) ( (st)->end - (st)->start + 1 ) +#define script_pushint(st,val) push_val((st)->stack, C_INT, (val)) #define script_isstring(data) ( (data)->type == C_STR || (data)->type == C_CONSTSTR ) #define script_isint(data) ( (data)->type == C_INT ) @@ -1852,6 +1855,8 @@ struct map_session_data *script_rid2sd(struct script_state *st) if(!sd){ ShowError("script_rid2sd: fatal error ! player not attached!\n"); report_src(st); + //## I would also terminate script execution. [FlavioJS] + //st->state = END; } return sd; } @@ -3866,26 +3871,26 @@ struct script_function buildin_func[] = { {buildin_statusup,"statusup","i"}, {buildin_statusup2,"statusup2","ii"}, {buildin_bonus,"bonus","ii"}, - {buildin_bonus2,"bonus2","iii"}, - {buildin_bonus3,"bonus3","iiii"}, - {buildin_bonus4,"bonus4","iiiii"}, - {buildin_skill,"skill","ii*"}, - {buildin_addtoskill,"addtoskill","ii*"}, // [Valaris] + {buildin_bonus,"bonus2","iii"}, + {buildin_bonus,"bonus3","iiii"}, + {buildin_bonus,"bonus4","iiiii"}, + {buildin_skill,"skill","ii?"}, + {buildin_addtoskill,"addtoskill","ii?"}, // [Valaris] {buildin_guildskill,"guildskill","ii"}, {buildin_getskilllv,"getskilllv","i"}, {buildin_getgdskilllv,"getgdskilllv","ii"}, - {buildin_basicskillcheck,"basicskillcheck","*"}, - {buildin_getgmlevel,"getgmlevel","*"}, + {buildin_basicskillcheck,"basicskillcheck",""}, + {buildin_getgmlevel,"getgmlevel",""}, {buildin_end,"end",""}, // {buildin_end,"break",""}, this might confuse advanced scripting support [Eoe] {buildin_checkoption,"checkoption","i"}, - {buildin_setoption,"setoption","i*"}, - {buildin_setcart,"setcart",""}, - {buildin_checkcart,"checkcart","*"}, //fixed by Lupus (added '*') - {buildin_setfalcon,"setfalcon",""}, - {buildin_checkfalcon,"checkfalcon","*"}, //fixed by Lupus (fixed wrong pointer, added '*') - {buildin_setriding,"setriding",""}, - {buildin_checkriding,"checkriding","*"}, //fixed by Lupus (fixed wrong pointer, added '*') + {buildin_setoption,"setoption","i?"}, + {buildin_setcart,"setcart","?"}, + {buildin_checkcart,"checkcart",""}, + {buildin_setfalcon,"setfalcon","?"}, + {buildin_checkfalcon,"checkfalcon",""}, + {buildin_setriding,"setriding","?"}, + {buildin_checkriding,"checkriding",""}, {buildin_savepoint,"save","sii"}, {buildin_savepoint,"savepoint","sii"}, {buildin_gettimetick,"gettimetick","i"}, @@ -6483,408 +6488,436 @@ int buildin_statusup2(struct script_state *st) return 0; } -/*========================================== - * 装備品による能力値ボーナス - *------------------------------------------ - */ -int buildin_bonus(struct script_state *st) -{ - int type,val; - struct map_session_data *sd; - - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - val=conv_num(st,& (st->stack->stack_data[st->start+3])); - sd=script_rid2sd(st); - pc_bonus(sd,type,val); - return 0; -} -/*========================================== - * 装備品による能力値ボーナス - *------------------------------------------ - */ -int buildin_bonus2(struct script_state *st) +/// See 'doc/item_bonus.txt' +/// bonus <bonus type>,<val1> +/// bonus2 <bonus type>,<val1>,<val2> +/// bonus3 <bonus type>,<val1>,<val2>,<val3> +/// bonus4 <bonus type>,<val1>,<val2>,<val3>,<val4> +int buildin_bonus(struct script_state* st) { - int type,type2,val; - struct map_session_data *sd; + int type; + int type2; + int type3; + int type4; + int val; + TBL_PC* sd; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - type2=conv_num(st,& (st->stack->stack_data[st->start+3])); - val=conv_num(st,& (st->stack->stack_data[st->start+4])); - sd=script_rid2sd(st); - pc_bonus2(sd,type,type2,val); + sd = script_rid2sd(st); + if( sd == NULL ) + return 0; // no player attached + + type = conv_num(st, script_getdata(st,2)); + switch( script_lastdata(st) ){ + case 3: + val = conv_num(st, script_getdata(st,3)); + pc_bonus(sd, type, val); + break; + case 4: + type2 = conv_num(st, script_getdata(st,3)); + val = conv_num(st, script_getdata(st,4)); + pc_bonus2(sd, type, type2, val); + break; + case 5: + type2 = conv_num(st, script_getdata(st,3)); + type3 = conv_num(st, script_getdata(st,4)); + val = conv_num(st, script_getdata(st,5)); + pc_bonus3(sd, type, type2, type3, val); + break; + case 6: + type2 = conv_num(st, script_getdata(st,3)); + type3 = conv_num(st, script_getdata(st,4)); + type4 = conv_num(st, script_getdata(st,5)); + val = conv_num(st, script_getdata(st,6)); + pc_bonus4(sd, type, type2, type3, type4, val); + break; + default: + ShowDebug("buildin_bonus: unexpected last data (%d)\n", script_lastdata(st)); + } return 0; } -/*========================================== - * 装備品による能力値ボーナス - *------------------------------------------ - */ -int buildin_bonus3(struct script_state *st) + +/// Changes the level of a player skill. +/// skill <skill id>,<level>{,<flag>} +/// @see pc_skill() for flag +int buildin_skill(struct script_state* st) { - int type,type2,type3,val; - struct map_session_data *sd; + int id; + int level; + int flag = 1; + TBL_PC* sd; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - type2=conv_num(st,& (st->stack->stack_data[st->start+3])); - type3=conv_num(st,& (st->stack->stack_data[st->start+4])); - val=conv_num(st,& (st->stack->stack_data[st->start+5])); - sd=script_rid2sd(st); - pc_bonus3(sd,type,type2,type3,val); + sd = script_rid2sd(st); + if( sd == NULL ) + return 0; // no player attached + + id = conv_num(st, script_getdata(st,2)); + level = conv_num(st, script_getdata(st,3)); + if( script_hasdata(st,4) ) + flag = conv_num(st, script_getdata(st,4)); + pc_skill(sd, id, level, flag); return 0; } -int buildin_bonus4(struct script_state *st) +/// Changes the level of a player skill. +/// addtoskill <skill id>,<level>{,<flag>} +/// @see pc_skill() for flag +int buildin_addtoskill(struct script_state* st) { - int type,type2,type3,type4,val; - struct map_session_data *sd; + int id; + int level; + int flag = 2; + TBL_PC* sd; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - type2=conv_num(st,& (st->stack->stack_data[st->start+3])); - type3=conv_num(st,& (st->stack->stack_data[st->start+4])); - type4=conv_num(st,& (st->stack->stack_data[st->start+5])); - val=conv_num(st,& (st->stack->stack_data[st->start+6])); - sd=script_rid2sd(st); - pc_bonus4(sd,type,type2,type3,type4,val); + sd = script_rid2sd(st); + if( sd == NULL ) + return 0; // no player attached + + id = conv_num(st, script_getdata(st,2)); + level = conv_num(st, script_getdata(st,3)); + if( script_hasdata(st,4) ) + flag = conv_num(st, script_getdata(st,4)); + pc_skill(sd, id, level, flag); return 0; } -/*========================================== - * スキル所得 - *------------------------------------------ - */ -int buildin_skill(struct script_state *st) + +/// Increases the level of the guild skill. +/// guildskill <skill id>,<level> +int buildin_guildskill(struct script_state* st) { - int id,level,flag=1; - struct map_session_data *sd; + int id; + int level; + TBL_PC* sd; + int i; - id=conv_num(st,& (st->stack->stack_data[st->start+2])); - level=conv_num(st,& (st->stack->stack_data[st->start+3])); - if( st->end>st->start+4 ) - flag=conv_num(st,&(st->stack->stack_data[st->start+4]) ); - sd=script_rid2sd(st); - pc_skill(sd,id,level,flag); + sd = script_rid2sd(st); + if( sd == NULL ) + return 0; // needs player attached + + id = conv_num(st, script_getdata(st,2)); + level = conv_num(st, script_getdata(st,3)); + for( i=0; i < level; i++ ) + guild_skillup(sd, id); return 0; } -// add x levels of skill (stackable) [Valaris] -int buildin_addtoskill(struct script_state *st) +/// Returns the level of the player skill. +/// getskilllv(<skill id>) -> <level> +int buildin_getskilllv(struct script_state* st) { - int id,level,flag=2; - struct map_session_data *sd; + int id; + TBL_PC* sd; - id=conv_num(st,& (st->stack->stack_data[st->start+2])); - level=conv_num(st,& (st->stack->stack_data[st->start+3])); - if( st->end>st->start+4 ) - flag=conv_num(st,&(st->stack->stack_data[st->start+4]) ); - sd=script_rid2sd(st); - pc_skill(sd,id,level,flag); + sd = script_rid2sd(st); + if( sd == NULL ){ + script_pushint(st, 0); + return 0; // needs player attached + } + + id = conv_num(st, script_getdata(st,2)); + script_pushint(st, pc_checkskill(sd,id)); return 0; } -/*========================================== - * ギルドスキル取得 - *------------------------------------------ - */ -int buildin_guildskill(struct script_state *st) +/// Returns the level of the guild skill. +/// getgdskilllv(<guild id>,<skill id>) -> <level> +int buildin_getgdskilllv(struct script_state* st) { - int id,level,flag=0; - struct map_session_data *sd; - int i=0; + int guild_id; + int skill_id; + struct guild* g; - id=conv_num(st,& (st->stack->stack_data[st->start+2])); - level=conv_num(st,& (st->stack->stack_data[st->start+3])); - if( st->end>st->start+4 ) - flag=conv_num(st,&(st->stack->stack_data[st->start+4]) ); - sd=script_rid2sd(st); - for(i=0;i<level;i++) - guild_skillup(sd,id,flag); + guild_id = conv_num(st, script_getdata(st,2)); + skill_id = conv_num(st, script_getdata(st,3)); + g = guild_search(guild_id); + if( g == NULL ) + script_pushint(st, -1); + else + script_pushint(st, guild_checkskill(g,skill_id)); return 0; -} -/*========================================== - * スキルレベル所得 - *------------------------------------------ - */ -int buildin_getskilllv(struct script_state *st) -{ - int id=conv_num(st,& (st->stack->stack_data[st->start+2])); - push_val(st->stack,C_INT, pc_checkskill( script_rid2sd(st) ,id) ); - return 0; -} -/*========================================== - * getgdskilllv(Guild_ID, Skill_ID); - * skill_id = 10000 : GD_APPROVAL - * 10001 : GD_KAFRACONTRACT - * 10002 : GD_GUARDIANRESEARCH - * 10003 : GD_GUARDUP - * 10004 : GD_EXTENSION - *------------------------------------------ - */ -int buildin_getgdskilllv(struct script_state *st) -{ - int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2])); - int skill_id=conv_num(st,& (st->stack->stack_data[st->start+3])); - struct guild *g=guild_search(guild_id); - push_val(st->stack,C_INT, (g==NULL)?-1:guild_checkskill(g,skill_id) ); - return 0; /* - struct map_session_data *sd=NULL; - struct guild *g=NULL; int skill_id; + TBL_PC* sd; + struct guild* g = NULL; + + sd = script_rid2sd(st); + if( sd == NULL ) + return 0; // needs player attached + + skill_id = conv_num(st, script_getdata(st,2)); + if( sd->status.guild_id > 0 ) + g = guild_search(sd->status.guild_id); + if( g == NULL ) + script_pushint(st, -1); + else + script_pushint(st, guild_checkskill(g,skill_id+9999)); - skill_id=conv_num(st,& (st->stack->stack_data[st->start+2])); - sd=script_rid2sd(st); - if(sd && sd->status.guild_id > 0) g=guild_search(sd->status.guild_id); - if(sd && g) { - push_val(st->stack,C_INT, guild_checkskill(g,skill_id+9999) ); - } else { - push_val(st->stack,C_INT,-1); - } return 0; */ } -/*========================================== - * - *------------------------------------------ - */ -int buildin_basicskillcheck(struct script_state *st) + +/// Returns the 'basic_skill_check' setting. +/// basicskillcheck() -> <setting> +int buildin_basicskillcheck(struct script_state* st) { - push_val(st->stack,C_INT, battle_config.basic_skill_check); + script_pushint(st, battle_config.basic_skill_check); return 0; } -/*========================================== - * - *------------------------------------------ - */ -int buildin_getgmlevel(struct script_state *st) + +/// Returns the GM level of the player. +/// getgmlevel() -> <level> +int buildin_getgmlevel(struct script_state* st) { - push_val(st->stack,C_INT, pc_isGM(script_rid2sd(st))); + TBL_PC* sd; + + sd = script_rid2sd(st); + if( sd == NULL ){ + script_pushint(st, 0); + return 0; // needs player attached + } + + script_pushint(st, pc_isGM(sd)); + return 0; } -/*========================================== - * - *------------------------------------------ - */ -int buildin_end(struct script_state *st) +/// Terminates the execution of this script instance. +/// end +int buildin_end(struct script_state* st) { st->state = END; return 0; } -/*========================================== - * - *------------------------------------------ - */ -int buildin_checkoption(struct script_state *st) +/// Checks if the player has that option. +/// checkoption(<option>) -> <bool> +int buildin_checkoption(struct script_state* st) { - int type; - struct map_session_data *sd; + int option; + TBL_PC* sd; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - sd=script_rid2sd(st); + sd = script_rid2sd(st); + if( sd == NULL ) + return buildin_end(st);// needs player attached - if(sd->sc.option & type){ - push_val(st->stack,C_INT,1); - } else { - push_val(st->stack,C_INT,0); - } + option = conv_num(st, script_getdata(st,2)); + if( sd->sc.option&option ) + script_pushint(st, 1); + else + script_pushint(st, 0); return 0; } -/*========================================== - * - *------------------------------------------ - */ -int buildin_checkoption1(struct script_state *st) + +/// Checks if the player is in that opt1 state. +/// checkoption1(<opt1>) -> <bool> +int buildin_checkoption1(struct script_state* st) { - int type; - struct map_session_data *sd; + int opt1; + TBL_PC* sd; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - sd=script_rid2sd(st); + sd = script_rid2sd(st); + if( sd == NULL ) + return buildin_end(st);// needs player attached - if(sd->sc.opt1 & type){ - push_val(st->stack,C_INT,1); - } else { - push_val(st->stack,C_INT,0); - } + opt1 = conv_num(st, script_getdata(st,2)); + if( sd->sc.opt1 == opt1 ) + script_pushint(st, 1); + else + script_pushint(st, 0); return 0; } -/*========================================== - * - *------------------------------------------ - */ -int buildin_checkoption2(struct script_state *st) + +/// Checks if the player has that opt2. +/// checkoption2(<opt2>) -> <bool> +int buildin_checkoption2(struct script_state* st) { - int type; - struct map_session_data *sd; + int opt2; + TBL_PC* sd; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - sd=script_rid2sd(st); + sd = script_rid2sd(st); + if( sd == NULL ) + return buildin_end(st);// needs player attached - if(sd->sc.opt2 & type){ - push_val(st->stack,C_INT,1); - } else { - push_val(st->stack,C_INT,0); - } + opt2 = conv_num(st, script_getdata(st,2)); + if( sd->sc.opt2&opt2 ) + script_pushint(st, 1); + else + script_pushint(st, 0); return 0; } -/*========================================== - * - *------------------------------------------ - */ -int buildin_setoption(struct script_state *st) +/// Changes the option of the player. +/// setoption <option number>{,<flag>} +int buildin_setoption(struct script_state* st) { - int type; - struct map_session_data *sd; - int flag=1; - - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - if(st->end>st->start+3 ) - flag=conv_num(st,&(st->stack->stack_data[st->start+3]) ); - else if (!type) { //Request to remove everything. + int option; + int flag = 1; + TBL_PC* sd; + + sd = script_rid2sd(st); + if( sd == NULL ) + return 0;// needs player attached + + option = conv_num(st, script_getdata(st,2)); + if( script_hasdata(st,3) ) + flag = conv_num(st, script_getdata(st,3)); + else if( !option ){// Request to remove everything. flag = 0; - type = OPTION_CART|OPTION_FALCON|OPTION_RIDING; + option = OPTION_CART|OPTION_FALCON|OPTION_RIDING; } - sd=script_rid2sd(st); - if (!sd) return 0; + if( flag ){// Add option + if( option&OPTION_WEDDING && !battle_config.wedding_modifydisplay ) + option &= ~OPTION_WEDDING;// Do not show the wedding sprites + pc_setoption(sd, sd->sc.option|option); + } else// Remove option + pc_setoption(sd, sd->sc.option&~option); - if (flag) {//Add option - if (type&OPTION_WEDDING && !battle_config.wedding_modifydisplay) - type&=~OPTION_WEDDING; //Do not show the wedding sprites - pc_setoption(sd,sd->sc.option|type); - } else//Remove option - pc_setoption(sd,sd->sc.option&~type); return 0; } -/*========================================== - * Checkcart [Valaris] - *------------------------------------------ - */ - -int buildin_checkcart(struct script_state *st) +/// Returns if the player has a cart. +/// checkcart() -> <bool> +/// @author Valaris +int buildin_checkcart(struct script_state* st) { - struct map_session_data *sd; + TBL_PC* sd; - sd=script_rid2sd(st); + sd = script_rid2sd(st); + if( sd == NULL ) + return buildin_end(st);// needs player attached + + if( pc_iscarton(sd) ) + script_pushint(st, 1); + else + script_pushint(st, 0); - if(pc_iscarton(sd)){ - push_val(st->stack,C_INT,1); - } else { - push_val(st->stack,C_INT,0); - } return 0; } -/*========================================== - * カートを付ける - *------------------------------------------ - */ -int buildin_setcart(struct script_state *st) +/// Sets the cart of the player. +/// setcart {<type>} +int buildin_setcart(struct script_state* st) { - struct map_session_data *sd; + int type = 1; + TBL_PC* sd; - sd=script_rid2sd(st); - pc_setcart(sd,1); + sd = script_rid2sd(st); + if( sd == NULL ) + return 0;// needs player attached + + if( script_hasdata(st,2) ) + type = conv_num(st, script_getdata(st,2)); + pc_setcart(sd, type); return 0; } -/*========================================== - * checkfalcon [Valaris] - *------------------------------------------ - */ - -int buildin_checkfalcon(struct script_state *st) +/// Returns if the player has a falcon. +/// checkfalcon() -> <bool> +/// @author Valaris +int buildin_checkfalcon(struct script_state* st) { - struct map_session_data *sd; + TBL_PC* sd; - sd=script_rid2sd(st); + sd = script_rid2sd(st); + if( sd == NULL ) + return buildin_end(st);// needs player attached - if(pc_isfalcon(sd)){ - push_val(st->stack,C_INT,1); - } else { - push_val(st->stack,C_INT,0); - } + if( pc_isfalcon(sd) ) + script_pushint(st, 1); + else + script_pushint(st, 0); return 0; } - -/*========================================== - * 鷹を付ける - *------------------------------------------ - */ -int buildin_setfalcon(struct script_state *st) +/// Sets if the player has a falcon or not. +/// setfalcon {<flag>} +int buildin_setfalcon(struct script_state* st) { - struct map_session_data *sd; + int flag = 1; + TBL_PC* sd; - sd=script_rid2sd(st); - pc_setfalcon(sd); + sd = script_rid2sd(st); + if( sd == NULL ) + return 0;// needs player attached + + if( script_hasdata(st,2) ) + flag = conv_num(st, script_getdata(st,2)); + + pc_setfalcon(sd, flag); return 0; } -/*========================================== - * Checkcart [Valaris] - *------------------------------------------ - */ - -int buildin_checkriding(struct script_state *st) +/// Returns if the player is riding. +/// checkriding() -> <bool> +/// @author Valaris +int buildin_checkriding(struct script_state* st) { - struct map_session_data *sd; + TBL_PC* sd; - sd=script_rid2sd(st); + sd = script_rid2sd(st); + if( sd == NULL ) + return buildin_end(st);// needs player attached - if(pc_isriding(sd)){ - push_val(st->stack,C_INT,1); - } else { - push_val(st->stack,C_INT,0); - } + if( pc_isriding(sd) ) + script_pushint(st, 1); + else + script_pushint(st, 0); return 0; } - -/*========================================== - * ペコペコ乗り - *------------------------------------------ - */ -int buildin_setriding(struct script_state *st) +/// Sets if the player is riding. +/// setriding {<flag>} +int buildin_setriding(struct script_state* st) { - struct map_session_data *sd; + int flag = 1; + TBL_PC* sd; - sd=script_rid2sd(st); - pc_setriding(sd); + sd = script_rid2sd(st); + if( sd == NULL ) + return 0;// needs player attached + + if( script_hasdata(st,2) ) + flag = conv_num(st, script_getdata(st,2)); + pc_setriding(sd, flag); return 0; } -/*========================================== - * セーブポイントの保存 - *------------------------------------------ - */ -int buildin_savepoint(struct script_state *st) +/// Sets the save point of the player. +/// save "<map name>",<x>,<y> +/// savepoint "<map name>",<x>,<y> +int buildin_savepoint(struct script_state* st) { - int x,y; + int x; + int y; short map; - char *str; + char* str; + TBL_PC* sd; - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - x=conv_num(st,& (st->stack->stack_data[st->start+3])); - y=conv_num(st,& (st->stack->stack_data[st->start+4])); + sd = script_rid2sd(st); + if( sd == NULL ) + return 0;// needs player attached + + str = conv_str(st, script_getdata(st,2)); + x = conv_num(st, script_getdata(st,3)); + y = conv_num(st, script_getdata(st,4)); map = mapindex_name2id(str); - if (map) - pc_setsavepoint(script_rid2sd(st),map,x,y); + if( map ) + pc_setsavepoint(sd, map, x, y); + return 0; } diff --git a/src/map/skill.h b/src/map/skill.h index ac08ab34b..ddb9042a0 100644 --- a/src/map/skill.h +++ b/src/map/skill.h @@ -272,7 +272,7 @@ enum { ST_RECOV_WEIGHT_RATE,ST_MOVE_ENABLE,ST_WATER, }; -enum { +enum _skill { NV_BASIC = 1, SM_SWORD, diff --git a/src/map/status.c b/src/map/status.c index a9da05e7f..a79ff7f89 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -6036,7 +6036,7 @@ int status_change_end( struct block_list* bl , int type,int tid ) status = status_get_status_data(bl); nullpo_retr(0,sc); nullpo_retr(0,status); - + if(type < 0 || type >= SC_MAX) return 0; |