diff options
author | dshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573> | 2008-11-23 14:22:58 +0000 |
---|---|---|
committer | dshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573> | 2008-11-23 14:22:58 +0000 |
commit | f7d34b29bdd41086a10c8135466e4b974674eae5 (patch) | |
tree | a1ae965a8010f0b535c2a9f2bcfe4cb509521cf8 /crawl-ref/source/dungeon.cc | |
parent | 76c82d66daed178db22ec0fe9bd91cfb23cfb28c (diff) | |
download | crawl-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.cc | 38 |
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; |