diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/map/battle.c | 14 | ||||
-rw-r--r-- | src/map/map.h | 1 | ||||
-rw-r--r-- | src/map/pc.c | 23 | ||||
-rw-r--r-- | src/map/pc.h | 4 |
4 files changed, 42 insertions, 0 deletions
diff --git a/src/map/battle.c b/src/map/battle.c index 689622cf4..12d85993f 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -1234,6 +1234,20 @@ static int64 battle_calc_cardfix(int attack_type, struct block_list *src, struct } cardfix = cardfix * (100 - ele_fix_lh) / 100; } + + // Apply bSubDefEle damage reduction. + switch (src->type) { + case BL_MOB: + ele_fix = tsd->sub_def_ele[status_get_element(src)].rate_mob; + break; + case BL_PC: + ele_fix = tsd->sub_def_ele[status_get_element(src)].rate_pc; + break; + default: + break; + } + + cardfix = cardfix * (100 - ele_fix) / 100; } cardfix = cardfix * (100-tsd->subsize[sstatus->size]) / 100; cardfix = cardfix * (100-tsd->subrace2[s_race2]) / 100; diff --git a/src/map/map.h b/src/map/map.h index 17f210bc3..f57bb0278 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -557,6 +557,7 @@ enum status_point_types { //we better clean up this enum and change it name [Hem SP_SKILL_USE_SP,SP_MAGIC_ATK_ELE, SP_ADD_FIXEDCAST, SP_ADD_VARIABLECAST, //2055-2058 SP_SET_DEF_RACE,SP_SET_MDEF_RACE, //2059-2060 SP_RACE_TOLERANCE,SP_ADDMAXWEIGHT, //2061-2062 + SP_SUB_DEF_ELE, // 2063 /* must be the last, plugins add bonuses from this value onwards */ SP_LAST_KNOWN, diff --git a/src/map/pc.c b/src/map/pc.c index 64e52848f..2d3115d68 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -4031,6 +4031,29 @@ static int pc_bonus3(struct map_session_data *sd, int type, int type2, int type3 sd->bonus.sp_vanish_trigger = val; } break; + case SP_SUB_DEF_ELE: + if ((type2 >= ELE_MAX && type2 != ELE_ALL) || type2 < ELE_NEUTRAL) { + ShowError("pc_bonus3: SP_SUB_DEF_ELE: Invalid element %d\n", type2); + break; + } + + if (type2 == ELE_ALL) { + for (int j = ELE_NEUTRAL; j < ELE_MAX; j++) { + if ((val & 1) != 0) + sd->sub_def_ele[j].rate_mob += type3; + + if ((val & 2) != 0) + sd->sub_def_ele[j].rate_pc += type3; + } + } else { + if ((val & 1) != 0) + sd->sub_def_ele[type2].rate_mob += type3; + + if ((val & 2) != 0) + sd->sub_def_ele[type2].rate_pc += type3; + } + + break; default: ShowWarning("pc_bonus3: unknown type %d %d %d %d!\n",type,type2,type3,val); diff --git a/src/map/pc.h b/src/map/pc.h index e8e591b09..a0c3bf955 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -396,6 +396,10 @@ BEGIN_ZEROED_BLOCK; // this block will be globally zeroed at the beginning of st int rate, tick; } def_set_race[RC_MAX], mdef_set_race[RC_MAX]; struct { + int rate_mob; //!< Physical damage reduction against monster's defense element. + int rate_pc; //!< Physical damage reduction against player's defense element. + } sub_def_ele[ELE_MAX]; //!< Bonus bSubDefEle data structure. + struct { int atk_rate; int arrow_atk,arrow_ele,arrow_cri,arrow_hit; int nsshealhp,nsshealsp; |