Browse Source

Fixed Asprika damage reduction (#8173)

- Monster damage is now always reduced by items that reduce BF_WEAPON damage
- Monster damage is now never reduced by items that reduce BF_MAGIC damage
- Asprika now reduces all damage from monsters by 30%
- Asprika now reduces all physical damage from players by 30%
- Asprika now reduces damage regardless of range of the attack
- Shaman Hat will no longer reduce damage from monsters, but will still reduce magic damage from players
- This also affects all custom items using bonus3 bSubEle and bonus3 bSubRace
- Added a config to battle/items.conf to return to old behavior
- Fixes #8171
Playtester 1 year ago
parent
commit
dd663c7eb4
4 changed files with 16 additions and 10 deletions
  1. 6 0
      conf/battle/items.conf
  2. 1 10
      db/pre-re/item_db_equip.yml
  3. 8 0
      src/map/battle.cpp
  4. 1 0
      src/map/battle.hpp

+ 6 - 0
conf/battle/items.conf

@@ -134,3 +134,9 @@ min_shop_buy: 1
 // Minimum sell price of items at a normal shop
 // Minimum sell price of items at a normal shop
 // Officially items can be sold for 0 Zeny
 // Officially items can be sold for 0 Zeny
 min_shop_sell: 0
 min_shop_sell: 0
+
+// Should items that reduce damage from element/race count all monster damage as physical? (Note 1)
+// Officially "Asprika" (god item) reduces all monsters damage rather than just physical damage
+// Shaman Hat on the other hand doesn't reduce monster damage at all (reduces magical damage in PVP)
+// This only affects items with bonus3 bSubEle and bonus3 bSubRace.
+cardfix_monster_physical: yes

+ 1 - 10
db/pre-re/item_db_equip.yml

@@ -20587,16 +20587,7 @@ Body:
     EquipLevelMin: 94
     EquipLevelMin: 94
     Script: |
     Script: |
       bonus bMdef,5;
       bonus bMdef,5;
-      bonus3 bSubEle,Ele_Neutral,30,BF_SHORT;
-      bonus3 bSubEle,Ele_Water,30,BF_SHORT;
-      bonus3 bSubEle,Ele_Earth,30,BF_SHORT;
-      bonus3 bSubEle,Ele_Fire,30,BF_SHORT;
-      bonus3 bSubEle,Ele_Wind,30,BF_SHORT;
-      bonus3 bSubEle,Ele_Poison,30,BF_SHORT;
-      bonus3 bSubEle,Ele_Holy,30,BF_SHORT;
-      bonus3 bSubEle,Ele_Dark,30,BF_SHORT;
-      bonus3 bSubEle,Ele_Ghost,30,BF_SHORT;
-      bonus3 bSubEle,Ele_Undead,30,BF_SHORT;
+      bonus3 bSubEle,Ele_All,30,BF_WEAPON;
       bonus bFlee,30;
       bonus bFlee,30;
       skill "AL_TELEPORT",1;
       skill "AL_TELEPORT",1;
       bonus bUnbreakableGarment;
       bonus bUnbreakableGarment;

+ 8 - 0
src/map/battle.cpp

@@ -689,6 +689,13 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li
 	t_race2 = status_get_race2(target);
 	t_race2 = status_get_race2(target);
 	s_defele = (tsd) ? (enum e_element)status_get_element(src) : ELE_NONE;
 	s_defele = (tsd) ? (enum e_element)status_get_element(src) : ELE_NONE;
 
 
+	// When the attacker is a monster, then all bonuses on BF_WEAPON will work and no bonuses on BF_MAGIC
+	// Does not impact the attack type
+	if (src && src->type == BL_MOB && battle_config.cardfix_monster_physical) {
+		flag |= BF_WEAPON;
+		flag &= ~BF_MAGIC;
+	}
+
 //Official servers apply the cardfix value on a base of 1000 and round down the reduction/increase
 //Official servers apply the cardfix value on a base of 1000 and round down the reduction/increase
 #define APPLY_CARDFIX(damage, fix) { (damage) = (damage) - (int64)(((damage) * (1000 - max(0, fix))) / 1000); }
 #define APPLY_CARDFIX(damage, fix) { (damage) = (damage) - (int64)(((damage) * (1000 - max(0, fix))) / 1000); }
 
 
@@ -10569,6 +10576,7 @@ static const struct _battle_data {
 	{ "delay_dependon_agi",                 &battle_config.delay_dependon_agi,              0,      0,      1,              },
 	{ "delay_dependon_agi",                 &battle_config.delay_dependon_agi,              0,      0,      1,              },
 	{ "skill_delay_attack_enable",          &battle_config.sdelay_attack_enable,            0,      0,      1,              },
 	{ "skill_delay_attack_enable",          &battle_config.sdelay_attack_enable,            0,      0,      1,              },
 	{ "left_cardfix_to_right",              &battle_config.left_cardfix_to_right,           0,      0,      1,              },
 	{ "left_cardfix_to_right",              &battle_config.left_cardfix_to_right,           0,      0,      1,              },
+	{ "cardfix_monster_physical",           &battle_config.cardfix_monster_physical,        1,      0,      1,              },
 	{ "skill_add_range",                    &battle_config.skill_add_range,                 0,      0,      INT_MAX,        },
 	{ "skill_add_range",                    &battle_config.skill_add_range,                 0,      0,      INT_MAX,        },
 	{ "skill_out_range_consume",            &battle_config.skill_out_range_consume,         1,      0,      1,              },
 	{ "skill_out_range_consume",            &battle_config.skill_out_range_consume,         1,      0,      1,              },
 	{ "skillrange_by_distance",             &battle_config.skillrange_by_distance,          ~BL_PC, BL_NUL, BL_ALL,         },
 	{ "skillrange_by_distance",             &battle_config.skillrange_by_distance,          ~BL_PC, BL_NUL, BL_ALL,         },

+ 1 - 0
src/map/battle.hpp

@@ -150,6 +150,7 @@ struct Battle_Config
 	int delay_dependon_dex, delay_dependon_agi;
 	int delay_dependon_dex, delay_dependon_agi;
 	int sdelay_attack_enable;
 	int sdelay_attack_enable;
 	int left_cardfix_to_right;
 	int left_cardfix_to_right;
+	int cardfix_monster_physical;
 	int skill_add_range;
 	int skill_add_range;
 	int skill_out_range_consume;
 	int skill_out_range_consume;
 	int skill_amotion_leniency;
 	int skill_amotion_leniency;