diff --git a/src/game/boe.monster.cpp b/src/game/boe.monster.cpp index be4b4671..549655db 100644 --- a/src/game/boe.monster.cpp +++ b/src/game/boe.monster.cpp @@ -809,35 +809,50 @@ void monst_inflict_fields(short which_monst) { which_m = &univ.town.monst[which_monst]; bool have_radiate = which_m->abil[eMonstAbil::RADIATE].active; eFieldType which_radiate = which_m->abil[eMonstAbil::RADIATE].radiate.type; + // Judgment call: big monsters shouldn't 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 j = 0; j < univ.town.monst[which_monst].y_width; j++) if(univ.town.monst[which_monst].is_alive()) { where_check.x = univ.town.monst[which_monst].cur_loc.x + i; 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); 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); if(!have_radiate || which_radiate != eFieldType::WALL_BLADES) 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); if(!have_radiate || which_radiate != eFieldType::WALL_FORCE) 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) 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); if(!have_radiate || which_radiate != eFieldType::WALL_ICE) 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); if(!have_radiate || which_radiate != eFieldType::CLOUD_STINK) which_m->curse(r1); @@ -848,7 +863,8 @@ void monst_inflict_fields(short which_monst) { which_m->web(r1); 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); if(!have_radiate || which_radiate != eFieldType::WALL_FIRE) damage_monst(*which_m,7,r1,eDamageType::FIRE);