From 4eb0c37f3c4c9bc545a37afcbfdd0493df29de28 Mon Sep 17 00:00:00 2001 From: skotlex Date: Wed, 29 Aug 2007 18:30:25 +0000 Subject: - Added bonus bSkillHeal to distinguish offensive skill damage increases from healing power boosts. - Moved battle_skillatk_bonus to pc.c, cleaned up the related skillatk bonus code to consider the skillheal bonus option. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@11085 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 5 +++++ db/const.txt | 1 + doc/item_bonus.txt | 1 + src/map/battle.c | 20 +++----------------- src/map/battle.h | 2 -- src/map/map.h | 7 +++---- src/map/pc.c | 44 +++++++++++++++++++++++++++++++++++++++++--- src/map/pc.h | 3 +++ src/map/skill.c | 23 ++++++++++++----------- 9 files changed, 69 insertions(+), 37 deletions(-) diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 0d7d9a063..f19f7c111 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -3,6 +3,11 @@ Date Added AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK. IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. +2007/08/23 + * Added bonus bSkillHeal to distinguish offensive skill damage increases + from healing power boosts. + * Moved battle_skillatk_bonus to pc.c, cleaned up the related skillatk + bonus code to consider the skillheal bonus option. [Skotlex] 2007/08/23 * Updated athena-start & start to Shazeya's hack. Please test them! [DracoRPG] - Simplest way is to run ./start that is equivalent to Windows runserver_sql.bat diff --git a/db/const.txt b/db/const.txt index 2f6f4957d..1ca9e12ed 100644 --- a/db/const.txt +++ b/db/const.txt @@ -299,6 +299,7 @@ bNearAtkDef 1020 bLongAtkDef 1021 bDoubleRate 1022 bDoubleAddRate 1023 +bSkillHeal 1024 bMatkRate 1025 bIgnoreDefEle 1026 bIgnoreDefRace 1027 diff --git a/doc/item_bonus.txt b/doc/item_bonus.txt index 6a5b0a7bf..abc8ef622 100644 --- a/doc/item_bonus.txt +++ b/doc/item_bonus.txt @@ -162,6 +162,7 @@ bonus2 bAddEffWhenHit,n,x; n% chance to cause x state to the enemy when bonus2 bAddEffWhenHitShort,n,x; n% chance to cause x state to the enemy when being hit by physical close range damage bonus2 bSkillAtk,n,x; Increase damage of skill n by x% +bonus2 bSkillHeal,n,x; Increase heal amount of skill n by x% bonus2 bAddDamageByClass,n,x; When being hit by monster of class n increase damage taken by x% bonus2 bAddRace2,n,x; Increase damage by x% vs. enemies of race n diff --git a/src/map/battle.c b/src/map/battle.c index 93e2e98fb..3f9441aa4 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -824,20 +824,6 @@ static int battle_blewcount_bonus(struct map_session_data *sd, int skill_num) return 0; } -int battle_skillatk_bonus(struct map_session_data *sd, int skill_num) -{ - int i; - if (!sd->skillatk[0].id) - return 0; - for (i = 0; i < MAX_PC_BONUS && sd->skillatk[i].id && - sd->skillatk[i].id != skill_num; i++); - - if (i < MAX_PC_BONUS && sd->skillatk[i].id) - return sd->skillatk[i].val; - - return 0; -} - struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int mflag); struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int mflag); @@ -1637,7 +1623,7 @@ static struct Damage battle_calc_weapon_attack( if(sd) { - if (skill_num && (i = battle_skillatk_bonus(sd, skill_num))) + if (skill_num && (i = pc_skillatk_bonus(sd, skill_num))) ATK_ADDRATE(i); if(skill_num != PA_SACRIFICE && skill_num != MO_INVESTIGATE && @@ -2334,7 +2320,7 @@ struct Damage battle_calc_magic_attack( if(sd) { //Damage bonuses - if ((i = battle_skillatk_bonus(sd, skill_num))) + if ((i = pc_skillatk_bonus(sd, skill_num))) ad.damage += ad.damage*i/100; //Ignore Defense? @@ -2631,7 +2617,7 @@ struct Damage battle_calc_misc_attack( md.damage=md.damage*cardfix/10000; } - if (sd && (i = battle_skillatk_bonus(sd, skill_num))) + if (sd && (i = pc_skillatk_bonus(sd, skill_num))) md.damage += md.damage*i/100; if(md.damage < 0) diff --git a/src/map/battle.h b/src/map/battle.h index 1bd781f2b..ca9563ce6 100644 --- a/src/map/battle.h +++ b/src/map/battle.h @@ -29,8 +29,6 @@ int battle_calc_return_damage(struct block_list *bl, int *damage, int direct, in void battle_drain(struct map_session_data *sd, struct block_list *tbl, int rdamage, int ldamage, int race, int boss); -int battle_skillatk_bonus(struct map_session_data *sd, int skill_num); - int battle_attr_fix(struct block_list *src, struct block_list *target, int damage,int atk_elem,int def_type, int def_lv); // ダメージ最終計算 diff --git a/src/map/map.h b/src/map/map.h index 4ec216a3e..c7a6556c5 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -670,9 +670,9 @@ struct map_session_data { short id, rate, arrow_rate; unsigned char flag; } addeff[MAX_PC_BONUS], addeff2[MAX_PC_BONUS]; - struct { //skillatk raises bonus dmg% of skills, skillblown increases bonus blewcount for some skills. + struct { //skillatk raises bonus dmg% of skills, skillheal increases heal%, skillblown increases bonus blewcount for some skills. short id, val; - } skillatk[MAX_PC_BONUS], skillblown[MAX_PC_BONUS]; + } skillatk[MAX_PC_BONUS], skillheal[5], skillblown[MAX_PC_BONUS]; struct { short class_, rate; } add_def[MAX_PC_BONUS], add_mdef[MAX_PC_BONUS], @@ -1169,7 +1169,7 @@ enum _sp { SP_ADDEFF, SP_RESEFF, // 1012-1013 SP_BASE_ATK,SP_ASPD_RATE,SP_HP_RECOV_RATE,SP_SP_RECOV_RATE,SP_SPEED_RATE, // 1014-1018 SP_CRITICAL_DEF,SP_NEAR_ATK_DEF,SP_LONG_ATK_DEF, // 1019-1021 - SP_DOUBLE_RATE, SP_DOUBLE_ADD_RATE, SP_FREE2, SP_MATK_RATE, // 1022-1025 + SP_DOUBLE_RATE, SP_DOUBLE_ADD_RATE, SP_SKILL_HEAL, SP_MATK_RATE, // 1022-1025 SP_IGNORE_DEF_ELE,SP_IGNORE_DEF_RACE, // 1026-1027 SP_ATK_RATE,SP_SPEED_ADDRATE,SP_FREE3, // 1028-1030 SP_MAGIC_ATK_DEF,SP_MISC_ATK_DEF, // 1031-1032 @@ -1201,7 +1201,6 @@ enum _sp { SP_INTRAVISION, SP_ADD_MONSTER_DROP_ITEMGROUP, SP_SP_LOSS_RATE, // 2038-2040 SP_ADD_SKILL_BLOW, SP_SP_VANISH_RATE //2041 //Before adding another, note that these are free: - //1024 (SP_FREE2, previous matk) //1030 (SP_FREE3, previous AspdAddRate) //2022 (SP_FREE, previous bDefIgnoreMob) }; diff --git a/src/map/pc.c b/src/map/pc.c index d4fd5f94c..85ad38115 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -2209,10 +2209,26 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val) case SP_SKILL_ATK: if(sd->state.lr_flag == 2) break; - for (i = 0; i < MAX_PC_BONUS && sd->skillatk[i].id != 0 && sd->skillatk[i].id != type2; i++); - if (i == MAX_PC_BONUS) + for (i = 0; i < ARRAYLENGTH(sd->skillatk) && sd->skillatk[i].id != 0 && sd->skillatk[i].id != type2; i++); + if (i == ARRAYLENGTH(sd->skillatk)) + { //Better mention this so the array length can be updated. [Skotlex] + ShowDebug("run_script: bonus2 bSkillAtk reached it's limit (%d skills per character), bonus skill %d (+%d%%) lost.\n", ARRAYLENGTH(sd->skillatk), type2, val); + break; + } + if (sd->skillatk[i].id == type2) + sd->skillatk[i].val += val; + else { + sd->skillatk[i].id = type2; + sd->skillatk[i].val = val; + } + break; + case SP_SKILL_HEAL: + if(sd->state.lr_flag == 2) + break; + for (i = 0; i < ARRAYLENGTH(sd->skillatk) && sd->skillatk[i].id != 0 && sd->skillatk[i].id != type2; i++); + if (i == ARRAYLENGTH(sd->skillatk)) { //Better mention this so the array length can be updated. [Skotlex] - ShowDebug("run_script: bonus2 bSkillAtk reached it's limit (%d skills per character), bonus skill %d (+%d%%) lost.\n", MAX_PC_BONUS, type2, val); + ShowDebug("run_script: bonus2 bSkillAtk reached it's limit (%d skills per character), bonus skill %d (+%d%%) lost.\n", ARRAYLENGTH(sd->skillatk), type2, val); break; } if (sd->skillatk[i].id == type2) @@ -4792,6 +4808,28 @@ int pc_resethate(struct map_session_data* sd) return 0; } +int pc_skillatk_bonus(struct map_session_data *sd, int skill_num) +{ + int i; + for (i = 0; i < ARRAYLENGTH(sd->skillatk) && sd->skillatk[i].id; i++) + { + if (sd->skillatk[i].id == skill_num) + return sd->skillatk[i].val; + } + return 0; +} + +int pc_skillheal_bonus(struct map_session_data *sd, int skill_num) +{ + int i; + for (i = 0; i < ARRAYLENGTH(sd->skillheal) && sd->skillheal[i].id; i++) + { + if (sd->skillheal[i].id == skill_num) + return sd->skillheal[i].val; + } + return 0; +} + static int pc_respawn(int tid,unsigned int tick,int id,int data) { struct map_session_data *sd = map_id2sd(id); diff --git a/src/map/pc.h b/src/map/pc.h index ae7aeeda5..bced5ec01 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -205,6 +205,9 @@ int pc_unequipitem(struct map_session_data*,int,int); int pc_checkitem(struct map_session_data*); int pc_useitem(struct map_session_data*,int); +int pc_skillatk_bonus(struct map_session_data *sd, int skill_num); +int pc_skillheal_bonus(struct map_session_data *sd, int skill_num); + void pc_damage(struct map_session_data *sd,struct block_list *src,unsigned int hp, unsigned int sp); int pc_dead(struct map_session_data *sd,struct block_list *src); void pc_revive(struct map_session_data *sd,unsigned int hp, unsigned int sp); diff --git a/src/map/skill.c b/src/map/skill.c index f35de5edd..339525d93 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -849,13 +849,8 @@ int skill_calc_heal (struct block_list *src, struct block_list *target, int skil return battle_config.max_heal; heal = ( status_get_lv(src)+status_get_int(src) )/8 *(4+ skill_lv*8); - if(src->type == BL_PC) - { - if ((skill = pc_checkskill((TBL_PC*)src, HP_MEDITATIO)) > 0) - heal += heal * skill * 2 / 100; - if ((skill = battle_skillatk_bonus((TBL_PC*)src, AL_HEAL)) > 0) - heal += heal * skill / 100; - } + if(src->type == BL_PC && ((skill = pc_checkskill((TBL_PC*)src, HP_MEDITATIO)) > 0)) + heal += heal * skill * 2 / 100; if(src->type == BL_HOM && (skill = merc_hom_checkskill(((TBL_HOM*)src), HLIF_BRAIN)) > 0) heal += heal * skill * 2 / 100; @@ -3450,6 +3445,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in if (status_isimmune(bl) || (dstmd && dstmd->class_ == MOBID_EMPERIUM)) heal=0; if (sd) { + if ((i = pc_skillheal_bonus(sd, skillid))) + heal += heal * i / 100; if (sd && dstsd && sd->status.partner_id == dstsd->status.char_id && (sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE && sd->status.sex == 0) heal = heal*2; @@ -4667,7 +4664,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in sp = sp * (100 + pc_checkskill(dstsd,MG_SRECOVERY)*10) / 100; } } - if ((i = battle_skillatk_bonus(sd, skillid)) > 0) + if ((i = pc_skillheal_bonus(sd, skillid))) { hp += hp * i / 100; sp += sp * i / 100; @@ -5640,6 +5637,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in if (!bl) bl = src; i = skill_calc_heal( src, bl, 1+rand()%skilllv); + if (sd && (rnd = pc_skillheal_bonus(sd, skillid)) > 0) + i += i * rnd / 100; //Eh? why double skill packet? clif_skill_nodamage(src,bl,AL_HEAL,i,1); clif_skill_nodamage(src,bl,skillid,i,1); @@ -6297,7 +6296,7 @@ int skill_castend_pos2 (struct block_list *src, int x, int y, int skillid, int s i = pc_checkskill(sd,CR_SLIMPITCHER)*10 + pc_checkskill(sd,AM_POTIONPITCHER)*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*5 - + battle_skillatk_bonus(sd, skillid); + + pc_skillheal_bonus(sd, skillid); potion_hp = potion_hp * (100+i)/100; potion_sp = potion_sp * (100+i)/100; @@ -6703,8 +6702,6 @@ struct skill_unit_group *skill_unitsetting (struct block_list *src, int skillid, case NPC_EVILLAND: val1=(skilllv+3)*2; val2=(skilllv>6)?(skillid == PR_SANCTUARY?777:666):skilllv*100; - if (sd && (i = battle_skillatk_bonus(sd, skillid)) > 0) - val2 += val2 * i / 100; break; case WZ_FIREPILLAR: @@ -7272,6 +7269,8 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns int heal = sg->val2; if (tstatus->hp >= tstatus->max_hp) break; + if (sd && (type = pc_skillheal_bonus(sd, sg->skill_id))) + heal += heal * type / 100; if (tsc && tsc->count && tsc->data[SC_CRITICALWOUND].timer!=-1) heal -= heal * tsc->data[SC_CRITICALWOUND].val2 / 100; if (status_isimmune(bl)) @@ -7450,6 +7449,8 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns if (sg->src_id == bl->id) break; heal = sg->val2; + if (sd && (type = pc_skillheal_bonus(sd, sg->skill_id))) + heal += heal * type / 100; if(tsc && tsc->count && tsc->data[SC_CRITICALWOUND].timer!=-1) heal -= heal * tsc->data[SC_CRITICALWOUND].val2 / 100; clif_skill_nodamage(&src->bl, bl, AL_HEAL, heal, 1); -- cgit v1.2.3-70-g09d2