big monsters don't take extra field damage from multiple of same

This commit is contained in:
2025-08-04 11:30:25 -05:00
committed by Celtic Minstrel
parent 376ab08b8d
commit 360f381b49

View File

@@ -810,35 +810,50 @@ void monst_inflict_fields(short which_monst) {
which_m = &univ.town.monst[which_monst]; which_m = &univ.town.monst[which_monst];
bool have_radiate = which_m->abil[eMonstAbil::RADIATE].active; bool have_radiate = which_m->abil[eMonstAbil::RADIATE].active;
eFieldType which_radiate = which_m->abil[eMonstAbil::RADIATE].radiate.type; eFieldType which_radiate = which_m->abil[eMonstAbil::RADIATE].radiate.type;
// Judgment call: big monsters should only get damaged once per damage type if they're on
// multiple of the same field. (Except webs.)
bool quickfire = false;
bool blade_wall = false;
bool force_wall = false;
bool sleep_cloud = false;
bool ice_wall = false;
bool stink_cloud = false;
bool fire_wall = false;
for(short i = 0; i < univ.town.monst[which_monst].x_width; i++) for(short i = 0; i < univ.town.monst[which_monst].x_width; i++)
for(short j = 0; j < univ.town.monst[which_monst].y_width; j++) for(short j = 0; j < univ.town.monst[which_monst].y_width; j++)
if(univ.town.monst[which_monst].is_alive()) { if(univ.town.monst[which_monst].is_alive()) {
where_check.x = univ.town.monst[which_monst].cur_loc.x + i; where_check.x = univ.town.monst[which_monst].cur_loc.x + i;
where_check.y = univ.town.monst[which_monst].cur_loc.y + j; where_check.y = univ.town.monst[which_monst].cur_loc.y + j;
if(univ.town.is_quickfire(where_check.x,where_check.y)) { if(!quickfire && univ.town.is_quickfire(where_check.x,where_check.y)) {
quickfire = true;
r1 = get_ran(2,1,8); r1 = get_ran(2,1,8);
damage_monst(*which_m,7,r1,eDamageType::FIRE); damage_monst(*which_m,7,r1,eDamageType::FIRE);
} }
if(univ.town.is_blade_wall(where_check.x,where_check.y)) { if(!blade_wall && univ.town.is_blade_wall(where_check.x,where_check.y)) {
blade_wall = true;
r1 = get_ran(6,1,8); r1 = get_ran(6,1,8);
if(!have_radiate || which_radiate != eFieldType::WALL_BLADES) if(!have_radiate || which_radiate != eFieldType::WALL_BLADES)
damage_monst(*which_m,7,r1,eDamageType::WEAPON); damage_monst(*which_m,7,r1,eDamageType::WEAPON);
} }
if(univ.town.is_force_wall(where_check.x,where_check.y)) { if(!force_wall && univ.town.is_force_wall(where_check.x,where_check.y)) {
force_wall = true;
r1 = get_ran(3,1,6); r1 = get_ran(3,1,6);
if(!have_radiate || which_radiate != eFieldType::WALL_FORCE) if(!have_radiate || which_radiate != eFieldType::WALL_FORCE)
damage_monst(*which_m,7,r1,eDamageType::MAGIC); damage_monst(*which_m,7,r1,eDamageType::MAGIC);
} }
if(univ.town.is_sleep_cloud(where_check.x,where_check.y)) { if(!sleep_cloud && univ.town.is_sleep_cloud(where_check.x,where_check.y)) {
sleep_cloud = true;
if(!have_radiate || which_radiate != eFieldType::CLOUD_SLEEP) if(!have_radiate || which_radiate != eFieldType::CLOUD_SLEEP)
which_m->sleep(eStatus::ASLEEP,3,0); which_m->sleep(eStatus::ASLEEP,3,0);
} }
if(univ.town.is_ice_wall(where_check.x,where_check.y)) { if(!ice_wall && univ.town.is_ice_wall(where_check.x,where_check.y)) {
ice_wall = true;
r1 = get_ran(3,1,6); r1 = get_ran(3,1,6);
if(!have_radiate || which_radiate != eFieldType::WALL_ICE) if(!have_radiate || which_radiate != eFieldType::WALL_ICE)
damage_monst(*which_m,7,r1,eDamageType::COLD); damage_monst(*which_m,7,r1,eDamageType::COLD);
} }
if(univ.town.is_scloud(where_check.x,where_check.y)) { if(!stink_cloud && univ.town.is_scloud(where_check.x,where_check.y)) {
stink_cloud = true;
r1 = get_ran(1,2,3); r1 = get_ran(1,2,3);
if(!have_radiate || which_radiate != eFieldType::CLOUD_STINK) if(!have_radiate || which_radiate != eFieldType::CLOUD_STINK)
which_m->curse(r1); which_m->curse(r1);
@@ -849,7 +864,8 @@ void monst_inflict_fields(short which_monst) {
which_m->web(r1); which_m->web(r1);
univ.town.set_web(where_check.x,where_check.y,false); univ.town.set_web(where_check.x,where_check.y,false);
} }
if(univ.town.is_fire_wall(where_check.x,where_check.y)) { if(!fire_wall && univ.town.is_fire_wall(where_check.x,where_check.y)) {
fire_wall = true;
r1 = get_ran(2,1,6); r1 = get_ran(2,1,6);
if(!have_radiate || which_radiate != eFieldType::WALL_FIRE) if(!have_radiate || which_radiate != eFieldType::WALL_FIRE)
damage_monst(*which_m,7,r1,eDamageType::FIRE); damage_monst(*which_m,7,r1,eDamageType::FIRE);