summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/dungeon.cc
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/dungeon.cc')
-rw-r--r--crawl-ref/source/dungeon.cc38
1 files changed, 38 insertions, 0 deletions
diff --git a/crawl-ref/source/dungeon.cc b/crawl-ref/source/dungeon.cc
index a57c96010d..9d8bc2c6f7 100644
--- a/crawl-ref/source/dungeon.cc
+++ b/crawl-ref/source/dungeon.cc
@@ -4918,6 +4918,36 @@ bool dgn_place_monster(mons_spec &mspec,
}
mgen_data mg(static_cast<monster_type>(mid));
+
+ if (mg.cls == RANDOM_MONSTER && mspec.place.is_valid())
+ {
+ int lev = monster_level;
+
+ if (mspec.place.level_type == LEVEL_DUNGEON)
+ lev = absdungeon_depth(mspec.place.branch, mspec.place.depth);
+
+ if (mlev == -8)
+ lev = 4 + lev * 2;
+ else if (mlev == -9)
+ lev += 5;
+
+ int tries = 100;
+ do
+ {
+ mg.cls = pick_random_monster(mspec.place, lev, lev);
+ } while (mg.cls != MONS_PROGRAM_BUG
+ && mons_class_is_zombified(mspec.monbase)
+ && !mons_zombie_size(mg.cls)
+ && tries-- > 0);
+
+ if (mg.cls == MONS_PROGRAM_BUG
+ || (mons_class_is_zombified(mspec.monbase)
+ && !mons_zombie_size(mg.cls)))
+ {
+ mg.cls = RANDOM_MONSTER;
+ }
+ }
+
mg.power = monster_level;
mg.behaviour = (m_generate_awake) ? BEH_WANDER : BEH_SLEEP;
mg.base_type = mspec.monbase;
@@ -4925,6 +4955,14 @@ bool dgn_place_monster(mons_spec &mspec,
mg.colour = mspec.colour;
mg.pos = where;
+ if (mons_class_is_zombified(mg.base_type))
+ {
+ if (mons_class_is_zombified(mg.cls))
+ mg.base_type = MONS_PROGRAM_BUG;
+ else
+ std::swap(mg.base_type, mg.cls);
+ }
+
if (m_patrolling)
mg.flags |= MG_PATROLLING;