summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/dungeon.cc
diff options
context:
space:
mode:
authordshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2008-11-23 14:22:58 +0000
committerdshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2008-11-23 14:22:58 +0000
commitf7d34b29bdd41086a10c8135466e4b974674eae5 (patch)
treea1ae965a8010f0b535c2a9f2bcfe4cb509521cf8 /crawl-ref/source/dungeon.cc
parent76c82d66daed178db22ec0fe9bd91cfb23cfb28c (diff)
downloadcrawl-ref-f7d34b29bdd41086a10c8135466e4b974674eae5.tar.gz
crawl-ref-f7d34b29bdd41086a10c8135466e4b974674eae5.zip
Allow place:X in MONS specifications to place random monsters suitable for place X.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7550 c06c8d41-db1a-0410-9941-cceddc491573
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;