Skip to content
Permalink
Browse files
Adds item bonus bReduceDamageReturn (#5601)
* Fixes #5488.
* Adds item bonus bReduceDamageReturn which reduces melee, ranged, and magic reflected damage.
Thanks to @Atemo!
  • Loading branch information
aleos89 committed Dec 7, 2020
1 parent dade413 commit d4d8130bcf0733d4d9edc4019db02184912c13c0
Showing with 24 additions and 5 deletions.
  1. +1 −0 doc/item_bonus.txt
  2. +6 −0 src/map/battle.cpp
  3. +1 −1 src/map/map.hpp
  4. +5 −0 src/map/pc.cpp
  5. +1 −1 src/map/pc.hpp
  6. +1 −0 src/map/script_constants.hpp
  7. +9 −3 src/map/skill.cpp
@@ -406,6 +406,7 @@ Damage return
bonus bShortWeaponDamageReturn,n; Reflects n% of received melee damage back to the enemy that caused it
bonus bLongWeaponDamageReturn,n; Reflects n% of received ranged damage back to the enemy that caused it
bonus bMagicDamageReturn,n; Adds a n% chance to reflect targetted magic spells back to the enemy that caused it
bonus bReduceDamageReturn,n; Reduces reflected damage (melee/ranged/magic) by n%

Strip/Break equipment
---------------------
@@ -7345,6 +7345,12 @@ int64 battle_calc_return_damage(struct block_list* bl, struct block_list *src, i
}
}

if (sd && sd->bonus.reduce_damage_return != 0) {
rdamage -= rdamage * sd->bonus.reduce_damage_return / 100;
if (rdamage < 1)
rdamage = 1;
}

if (ssc) {
if (ssc->data[SC_INSPIRATION]) {
rdamage += damage / 100;
@@ -509,7 +509,7 @@ enum _sp {
SP_WEAPON_ATK_RATE, SP_WEAPON_MATK_RATE, SP_DROP_ADDRACE, SP_DROP_ADDCLASS, SP_NO_MADO_FUEL, // 2083-2087
SP_IGNORE_DEF_CLASS_RATE, SP_REGEN_PERCENT_HP, SP_REGEN_PERCENT_SP, SP_SKILL_DELAY, SP_NO_WALK_DELAY, //2088-2092
SP_LONG_SP_GAIN_VALUE, SP_LONG_HP_GAIN_VALUE, SP_SHORT_ATK_RATE, SP_MAGIC_SUBSIZE, SP_CRIT_DEF_RATE, // 2093-2097
SP_MAGIC_SUBDEF_ELE // 2098
SP_MAGIC_SUBDEF_ELE, SP_REDUCE_DAMAGE_RETURN // 2098-2099
};

enum _look {
@@ -3541,6 +3541,10 @@ void pc_bonus(struct map_session_data *sd,int type,int val)
if(sd->state.lr_flag != 2)
sd->bonus.magic_damage_return += val;
break;
case SP_REDUCE_DAMAGE_RETURN:
if (sd->state.lr_flag != 2)
sd->bonus.reduce_damage_return += val;
break;
case SP_ALL_STATS: // [Valaris]
if(sd->state.lr_flag!=2) {
sd->indexed_bonus.param_bonus[SP_STR-SP_STR]+=val;
@@ -8881,6 +8885,7 @@ int64 pc_readparam(struct map_session_data* sd,int64 type)
case SP_SHORT_WEAPON_DAMAGE_RETURN: val = sd->bonus.short_weapon_damage_return; break;
case SP_LONG_WEAPON_DAMAGE_RETURN: val = sd->bonus.long_weapon_damage_return; break;
case SP_MAGIC_DAMAGE_RETURN: val = sd->bonus.magic_damage_return; break;
case SP_REDUCE_DAMAGE_RETURN: val = sd->bonus.reduce_damage_return; break;
case SP_PERFECT_HIDE: val = sd->special_state.perfect_hiding?1:0; break;
case SP_UNBREAKABLE: val = sd->bonus.unbreakable; break;
case SP_UNBREAKABLE_WEAPON: val = (sd->bonus.unbreakable_equip&EQP_WEAPON)?1:0; break;
@@ -519,7 +519,7 @@ struct map_session_data {
int get_zeny_rate;
int get_zeny_num; //Added Get Zeny Rate [Skotlex]
int double_add_rate;
int short_weapon_damage_return,long_weapon_damage_return;
int short_weapon_damage_return,long_weapon_damage_return,reduce_damage_return;
int magic_damage_return; // AppleGirl Was Here
int break_weapon_rate,break_armor_rate;
int crit_atk_rate;
@@ -762,6 +762,7 @@
export_constant2("bMagicSubSize",SP_MAGIC_SUBSIZE);
export_constant2("bCritDefRate",SP_CRIT_DEF_RATE);
export_constant2("bMagicSubDefEle", SP_MAGIC_SUBDEF_ELE);
export_constant2("bReduceDamageReturn",SP_REDUCE_DAMAGE_RETURN);

/* equip indices */
export_constant(EQI_COMPOUND_ON);
@@ -3292,7 +3292,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
struct status_change *sc, *tsc;
struct map_session_data *sd, *tsd;
int64 damage;
int8 rmdamage = 0;//magic reflected
bool rmdamage = false;//magic reflected
int type;
enum e_damage_type dmg_type;
bool shadow_flag = false;
@@ -3371,7 +3371,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
if( (dmg.damage || dmg.damage2) && (type = skill_magic_reflect(src, bl, src==dsrc)) )
{ //Magic reflection, switch caster/target
struct block_list *tbl = bl;
rmdamage = 1;
rmdamage = true;
bl = src;
src = tbl;
dsrc = tbl;
@@ -3429,6 +3429,12 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
//Reduction: 6% + 6% every 20%
dmg.damage -= dmg.damage * (6 * (1+per)) / 100;
}

if (sd && sd->bonus.reduce_damage_return != 0) {
dmg.damage -= dmg.damage * sd->bonus.reduce_damage_return / 100;
if (dmg.damage < 1)
dmg.damage = 1;
}
}
#endif
}
@@ -3819,7 +3825,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *

map_freeblock_unlock();

if ((flag&0x1000000) && rmdamage == 1)
if ((flag&0x1000000) && rmdamage)
return 0; //Should return 0 when damage was reflected

return damage;

0 comments on commit d4d8130

Please sign in to comment.