Flesh out acid as a real damage type
This commit is contained in:
@@ -118,7 +118,9 @@ std::map<std::string,std::vector<std::string>> feature_flags = {
|
||||
{"talk-go-back", {"StackV1"}},
|
||||
// Bugs required for several VoDT test replays to run faithfully
|
||||
{"empty-wandering-monster-bug", {"fixed"}},
|
||||
{"too-many-extra-wandering-monsters-bug", {"fixed"}}
|
||||
{"too-many-extra-wandering-monsters-bug", {"fixed"}},
|
||||
// Game balance
|
||||
{"magic-resistance", {"fixed"}} // Resist Magic used to not help with magic damage!
|
||||
};
|
||||
|
||||
struct cParseEntrance {
|
||||
|
@@ -2363,12 +2363,9 @@ short damage_pc(cPlayer& which_pc,short how_much,eDamageType damage_type,eRace t
|
||||
|
||||
int boom_type = boom_gr[damage_type];
|
||||
|
||||
// Acid doesn't actually have its own damage type in classic BoE
|
||||
if(damage_type == eDamageType::ACID)
|
||||
damage_type = eDamageType::MAGIC;
|
||||
|
||||
// armor
|
||||
if(damage_type == eDamageType::WEAPON || damage_type == eDamageType::UNDEAD || damage_type == eDamageType::DEMON) {
|
||||
static std::set<eDamageType> armor_resist_damage = { eDamageType::WEAPON, eDamageType::UNDEAD, eDamageType::DEMON };
|
||||
if(armor_resist_damage.count(damage_type)) {
|
||||
how_much -= minmax(-5,5,which_pc.status[eStatus::BLESS_CURSE]);
|
||||
for(short i = 0; i < cPlayer::INVENTORY_SIZE; i++) {
|
||||
const cItem& item = which_pc.items[i];
|
||||
@@ -2416,6 +2413,10 @@ short damage_pc(cPlayer& which_pc,short how_much,eDamageType damage_type,eRace t
|
||||
}
|
||||
|
||||
short prot_from_dmg = which_pc.get_prot_level(eItemAbil::DAMAGE_PROTECTION,int(damage_type));
|
||||
// Acid damage used to be magic damage, so magic protection counts as acid protection:
|
||||
if(damage_type == eDamageType::ACID){
|
||||
prot_from_dmg += which_pc.get_prot_level(eItemAbil::DAMAGE_PROTECTION,int(eDamageType::MAGIC));
|
||||
}
|
||||
if(prot_from_dmg > 0) {
|
||||
// TODO: Why does this not depend on the ability strength if it's not weapon damage?
|
||||
if(damage_type == eDamageType::WEAPON) how_much -= prot_from_dmg;
|
||||
@@ -2447,8 +2448,13 @@ short damage_pc(cPlayer& which_pc,short how_much,eDamageType damage_type,eRace t
|
||||
how_much = 0;
|
||||
|
||||
// Mag. res helps w. fire and cold
|
||||
// TODO: Why doesn't this help with magic damage!?
|
||||
if(damage_type == eDamageType::FIRE || damage_type == eDamageType::COLD) {
|
||||
static std::set<eDamageType> magic_resist_damage = { eDamageType::FIRE, eDamageType::COLD };
|
||||
// Now it also helps with MAGIC:
|
||||
if(has_feature_flag("magic-resistance", "fixed")){
|
||||
magic_resist_damage.insert(eDamageType::MAGIC);
|
||||
magic_resist_damage.insert(eDamageType::ACID);
|
||||
}
|
||||
if(magic_resist_damage.count(damage_type)) {
|
||||
int magic_res = which_pc.status[eStatus::MAGIC_RESISTANCE];
|
||||
if(magic_res > 0)
|
||||
how_much /= 2;
|
||||
@@ -2458,7 +2464,8 @@ short damage_pc(cPlayer& which_pc,short how_much,eDamageType damage_type,eRace t
|
||||
|
||||
// major resistance
|
||||
short full_prot = which_pc.get_prot_level(eItemAbil::FULL_PROTECTION);
|
||||
if((damage_type == eDamageType::FIRE || damage_type == eDamageType::POISON || damage_type == eDamageType::MAGIC || damage_type == eDamageType::COLD)
|
||||
std::set<eDamageType> major_resist_damage = { eDamageType::FIRE, eDamageType::POISON, eDamageType::MAGIC, eDamageType::ACID, eDamageType::COLD};
|
||||
if(major_resist_damage.count(damage_type)
|
||||
&& (full_prot > 0))
|
||||
how_much = how_much / ((full_prot >= 7) ? 4 : 2);
|
||||
|
||||
|
@@ -338,7 +338,7 @@ bool check_special_terrain(location where_check,eSpecCtx mode,cPlayer& which_pc,
|
||||
break;
|
||||
if(mode == eSpecCtx::OUT_MOVE && out_boat_there(where_check))
|
||||
break;
|
||||
if(ter_flag3 > 0 && ter_flag3 < 8)
|
||||
if(ter_flag3 > 0 && ter_flag3 < int(eDamageType::SPECIAL))
|
||||
dam_type = (eDamageType) ter_flag3;
|
||||
else dam_type = eDamageType::WEAPON;
|
||||
r1 = get_ran(ter_flag2,1,ter_flag1);
|
||||
@@ -356,6 +356,10 @@ bool check_special_terrain(location where_check,eSpecCtx mode,cPlayer& which_pc,
|
||||
add_string_to_buf(" You feel cold!");
|
||||
pic_type = 4;
|
||||
break;
|
||||
case eDamageType::ACID:
|
||||
add_string_to_buf(" It burns!");
|
||||
pic_type = 6;
|
||||
break;
|
||||
case eDamageType::SPECIAL:
|
||||
dam_type = eDamageType::UNBLOCKABLE;
|
||||
BOOST_FALLTHROUGH;
|
||||
@@ -1472,16 +1476,13 @@ short damage_monst(cCreature& victim, short who_hit, short how_much, eDamageType
|
||||
|
||||
int boom_type = boom_gr[dam_type];
|
||||
|
||||
// Acid doesn't actually have its own damage type in classic BoE
|
||||
if(dam_type == eDamageType::ACID)
|
||||
dam_type = eDamageType::MAGIC;
|
||||
|
||||
if(dam_type < eDamageType::SPECIAL) {
|
||||
how_much = percent(how_much, victim.resist[dam_type]);
|
||||
}
|
||||
|
||||
// Absorb damage?
|
||||
if((dam_type == eDamageType::FIRE || dam_type == eDamageType::MAGIC || dam_type == eDamageType::COLD)
|
||||
std::set<eDamageType> absorbable_damage = { eDamageType::FIRE, eDamageType::MAGIC, eDamageType::COLD, eDamageType::ACID };
|
||||
if(absorbable_damage.count(dam_type)
|
||||
&& victim.abil[eMonstAbil::ABSORB_SPELLS].active && get_ran(1,1,1000) <= victim.abil[eMonstAbil::ABSORB_SPELLS].special.extra1) {
|
||||
add_check_overflow(victim.health, how_much);
|
||||
ASB(" Magic absorbed.");
|
||||
@@ -1491,7 +1492,7 @@ short damage_monst(cCreature& victim, short who_hit, short how_much, eDamageType
|
||||
// Saving throw
|
||||
if((dam_type == eDamageType::FIRE || dam_type == eDamageType::COLD) && get_ran(1,0,20) <= victim.level)
|
||||
how_much /= 2;
|
||||
if(dam_type == eDamageType::MAGIC && (get_ran(1,0,24) <= victim.level))
|
||||
if((dam_type == eDamageType::MAGIC || dam_type == eDamageType::ACID) && (get_ran(1,0,24) <= victim.level))
|
||||
how_much /= 2;
|
||||
|
||||
// Invulnerable?
|
||||
@@ -1501,8 +1502,13 @@ short damage_monst(cCreature& victim, short who_hit, short how_much, eDamageType
|
||||
how_much /= 10;
|
||||
|
||||
// Mag. res helps w. fire and cold
|
||||
// TODO: Why doesn't this help with magic damage!?
|
||||
if(dam_type == eDamageType::FIRE || dam_type == eDamageType::COLD) {
|
||||
static std::set<eDamageType> magic_resist_damage = { eDamageType::FIRE, eDamageType::COLD };
|
||||
// Now it also helps with MAGIC:
|
||||
if(has_feature_flag("magic-resistance", "fixed")){
|
||||
magic_resist_damage.insert(eDamageType::MAGIC);
|
||||
magic_resist_damage.insert(eDamageType::ACID);
|
||||
}
|
||||
if(magic_resist_damage.count(dam_type)) {
|
||||
int magic_res = victim.status[eStatus::MAGIC_RESISTANCE];
|
||||
if(magic_res > 0)
|
||||
how_much /= 2;
|
||||
|
Reference in New Issue
Block a user