big monsters don't take extra field damage from multiple of same
This commit is contained in:
@@ -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);
|
||||||
|
Reference in New Issue
Block a user