fix monster field infliction logic. Fix #765

This commit is contained in:
2025-08-04 11:21:37 -05:00
committed by Celtic Minstrel
parent 1b0a7aa76a
commit 376ab08b8d

View File

@@ -815,53 +815,44 @@ void monst_inflict_fields(short which_monst) {
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;
// TODO: If the goal is to damage the monster by any fields it's on, why all the break statements?
if(univ.town.is_quickfire(where_check.x,where_check.y)) {
r1 = get_ran(2,1,8);
damage_monst(*which_m,7,r1,eDamageType::FIRE);
break;
}
if(univ.town.is_blade_wall(where_check.x,where_check.y)) {
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);
break;
}
if(univ.town.is_force_wall(where_check.x,where_check.y)) {
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);
break;
}
if(univ.town.is_sleep_cloud(where_check.x,where_check.y)) {
if(have_radiate && which_radiate != eFieldType::CLOUD_SLEEP)
if(!have_radiate || which_radiate != eFieldType::CLOUD_SLEEP)
which_m->sleep(eStatus::ASLEEP,3,0);
break;
}
if(univ.town.is_ice_wall(where_check.x,where_check.y)) {
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);
break;
}
if(univ.town.is_scloud(where_check.x,where_check.y)) {
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);
break;
}
if(univ.town.is_web(where_check.x,where_check.y) && which_m->m_type != eRace::BUG) {
which_m->spell_note(eSpellNote::WEBBED);
r1 = get_ran(1,2,3);
which_m->web(r1);
univ.town.set_web(where_check.x,where_check.y,false);
break;
}
if(univ.town.is_fire_wall(where_check.x,where_check.y)) {
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);
break;
}
if(univ.town.is_force_cage(where_check.x,where_check.y))
process_force_cage(where_check, univ.get_target_i(*which_m));