Flesh out acid as a real damage type

This commit is contained in:
2025-05-08 18:17:18 -05:00
parent 01608064f2
commit 005d40806c
12 changed files with 54 additions and 28 deletions

View File

@@ -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 {

View File

@@ -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);

View File

@@ -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;