diff options
author | malufett <malufett.eat.my.binaries@gmail.com> | 2014-12-26 07:28:10 +0800 |
---|---|---|
committer | malufett <malufett.eat.my.binaries@gmail.com> | 2014-12-26 07:28:10 +0800 |
commit | 6dd08befa6064a652d0d98e7cb85f0e353992dd5 (patch) | |
tree | 1eba127574e172fc6802572d0be413887e0ced0d /src/map/battle.c | |
parent | dfdbc6e81eb37c2b23d5dcbcf0f94e4a9d0de2a7 (diff) | |
download | hercules-6dd08befa6064a652d0d98e7cb85f0e353992dd5.tar.gz hercules-6dd08befa6064a652d0d98e7cb85f0e353992dd5.tar.bz2 hercules-6dd08befa6064a652d0d98e7cb85f0e353992dd5.tar.xz hercules-6dd08befa6064a652d0d98e7cb85f0e353992dd5.zip |
Updated KG/OB Spirit Charms to official behavior
-http://hercules.ws/board/tracker/issue-8170-oborokagerou-charm/
-http://hercules.ws/board/tracker/issue-8274-ninja-charms-not-giving-proper-bonuses/
Signed-off-by: malufett <malufett.eat.my.binaries@gmail.com>
Diffstat (limited to 'src/map/battle.c')
-rw-r--r-- | src/map/battle.c | 75 |
1 files changed, 40 insertions, 35 deletions
diff --git a/src/map/battle.c b/src/map/battle.c index 459af3a81..f740d6518 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -401,24 +401,7 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d break; } } //end tsc check - if( src && src->type == BL_PC ){ - struct map_session_data *sd = BL_CAST(BL_PC, src); - int s; - ARR_FIND(1, 6, s, sd->charm[s] > 0); - - if( s < 5 && atk_elem == s ) - ratio += sd->charm[s] * 2; // +2% custom value - } - if( target && target->type == BL_PC ) { - struct map_session_data *tsd = BL_CAST(BL_PC, target); - int t; - - ARR_FIND(1, 6, t, tsd->charm[t] > 0); - - if( t < 5 && atk_elem == t ) - damage -= damage * ( tsd->charm[t] * 3 ) / 100;// -3% custom value - } if( ratio < 100 ) return damage - (damage * (100 - ratio) / 100); else @@ -1251,14 +1234,16 @@ int64 battle_calc_defense(int attack_type, struct block_list *src, struct block_ def2 = status->calc_def2(target, tsc, def2, false); // status def(RE) #endif - if( sd ){ - i = sd->ignore_def[is_boss(target)?RC_BOSS:RC_NONBOSS]; + if ( sd ) { + i = sd->ignore_def[is_boss(target) ? RC_BOSS : RC_NONBOSS]; i += sd->ignore_def[tstatus->race]; - if( i ){ - if( i > 100 ) i = 100; + if ( i ) { + if ( i > 100 ) i = 100; def1 -= def1 * i / 100; def2 -= def2 * i / 100; } + if ( sd->spiritcharm[SPIRITS_TYPE_CHARM_LAND] > 0 ) // hidden from status window + def1 += 10 * def1 * sd->spiritcharm[SPIRITS_TYPE_CHARM_LAND] / 100; } if( sc && sc->data[SC_EXPIATIO] ){ @@ -1497,20 +1482,38 @@ int battle_calc_skillratio(int attack_type, struct block_list *src, struct block break; case NJ_KOUENKA: skillratio -= 10; + if ( sd && sd->spiritcharm[SPIRITS_TYPE_CHARM_FIRE] > 0 ) + skillratio += 20 * sd->spiritcharm[SPIRITS_TYPE_CHARM_FIRE]; break; case NJ_KAENSIN: skillratio -= 50; + if ( sd && sd->spiritcharm[SPIRITS_TYPE_CHARM_FIRE] > 0 ) + skillratio += 10 * sd->spiritcharm[SPIRITS_TYPE_CHARM_FIRE]; break; case NJ_BAKUENRYU: - skillratio += 50 * (skill_lv-1); + skillratio += 50 * (skill_lv - 1); + if ( sd && sd->spiritcharm[SPIRITS_TYPE_CHARM_FIRE] > 0 ) + skillratio += 15 * sd->spiritcharm[SPIRITS_TYPE_CHARM_FIRE]; break; +#ifdef RENEWAL + case NJ_HYOUSENSOU: + skillratio -= 30; + if ( sd && sd->spiritcharm[SPIRITS_TYPE_CHARM_WATER] > 0 ) + skillratio += 5 * sd->spiritcharm[SPIRITS_TYPE_CHARM_WATER]; +#endif case NJ_HYOUSYOURAKU: skillratio += 50 * skill_lv; + if ( sd && sd->spiritcharm[SPIRITS_TYPE_CHARM_WATER] > 0 ) + skillratio += 25 * sd->spiritcharm[SPIRITS_TYPE_CHARM_WATER]; break; case NJ_RAIGEKISAI: skillratio += 60 + 40 * skill_lv; + if ( sd && sd->spiritcharm[SPIRITS_TYPE_CHARM_WIND] > 0 ) + skillratio += 15 * sd->spiritcharm[SPIRITS_TYPE_CHARM_WIND]; break; case NJ_KAMAITACHI: + if ( sd && sd->spiritcharm[SPIRITS_TYPE_CHARM_WIND] > 0 ) + skillratio += 10 * sd->spiritcharm[SPIRITS_TYPE_CHARM_WIND]; case NPC_ENERGYDRAIN: skillratio += 100 * skill_lv; break; @@ -1536,6 +1539,8 @@ int battle_calc_skillratio(int attack_type, struct block_list *src, struct block break; case NJ_HUUJIN: skillratio += 50; + if ( sd && sd->spiritcharm[SPIRITS_TYPE_CHARM_WIND] > 0 ) + skillratio += 20 * sd->spiritcharm[SPIRITS_TYPE_CHARM_WIND]; break; #else case WZ_VERMILION: @@ -1757,12 +1762,12 @@ int battle_calc_skillratio(int attack_type, struct block_list *src, struct block skillratio += 100 * skill_lv; break; case KO_KAIHOU: - if( sd ){ - ARR_FIND(1, 6, i, sd->charm[i] > 0); - if( i < 5 ){ - skillratio += -100 + 200 * sd->charm[i]; + if ( sd ) { + ARR_FIND(SPIRITS_TYPE_CHARM_WATER, SPIRITS_TYPE_SPHERE, i, sd->spiritcharm[i] > 0); + if ( i < SPIRITS_TYPE_SPHERE ) { + skillratio += -100 + 200 * sd->spiritcharm[i]; RE_LVL_DMOD(100); - pc->del_charm(sd, sd->charm[i], i); + pc->del_charm(sd, sd->spiritcharm[i], i); } } break; @@ -3366,9 +3371,9 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list if (s_ele == -1){ // pl=-1 : the skill takes the weapon's element s_ele = sstatus->rhw.ele; - if( sd ){ //Summoning 10 charm will endow your weapon - ARR_FIND(1, 6, i, sd->charm[i] >= 10); - if( i < 5 ) s_ele = i; + if( sd ){ //Summoning 10 spiritcharm will endow your weapon + ARR_FIND(SPIRITS_TYPE_CHARM_WATER, SPIRITS_TYPE_SPHERE, i, sd->spiritcharm[i] >= MAX_SPIRITCHARM); + if( i < SPIRITS_TYPE_SPHERE ) s_ele = i; } }else if (s_ele == -2) //Use status element s_ele = status_get_attack_sc_element(src,status->get_sc(src)); @@ -3411,8 +3416,8 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list break; case KO_KAIHOU: if( sd ){ - ARR_FIND(1, 6, i, sd->charm[i] > 0); - if( i < 5 ) + ARR_FIND(SPIRITS_TYPE_CHARM_WATER, SPIRITS_TYPE_SPHERE, i, sd->spiritcharm[i] > 0); + if( i < SPIRITS_TYPE_SPHERE ) s_ele = i; } break; @@ -4257,9 +4262,9 @@ struct Damage battle_calc_weapon_attack(struct block_list *src,struct block_list { //Take weapon's element s_ele = sstatus->rhw.ele; s_ele_ = sstatus->lhw.ele; - if( sd ){ //Summoning 10 charm will endow your weapon. - ARR_FIND(1, 6, i, sd->charm[i] >= 10); - if( i < 5 ) s_ele = s_ele_ = i; + if( sd ){ //Summoning 10 spiritcharm will endow your weapon. + ARR_FIND(SPIRITS_TYPE_CHARM_WATER, SPIRITS_TYPE_SPHERE, i, sd->spiritcharm[i] >= MAX_SPIRITCHARM); + if( i < SPIRITS_TYPE_SPHERE ) s_ele = s_ele_ = i; } if( flag.arrow && sd && sd->bonus.arrow_ele ) s_ele = sd->bonus.arrow_ele; |