summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/monstuff.cc
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/monstuff.cc')
-rw-r--r--crawl-ref/source/monstuff.cc13
1 files changed, 12 insertions, 1 deletions
diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc
index 2474d35160..8fb825aab2 100644
--- a/crawl-ref/source/monstuff.cc
+++ b/crawl-ref/source/monstuff.cc
@@ -913,6 +913,15 @@ static bool valid_morph( struct monsters *monster, int new_mclass )
// morph targets are _always_ "base" classes, not derived ones.
new_mclass = mons_species(new_mclass);
+ // [ds] Non-base draconians are much more trouble than their HD
+ // suggests.
+ if (mons_genus(new_mclass) == MONS_DRACONIAN
+ && new_mclass != MONS_DRACONIAN
+ && !one_chance_in(4))
+ {
+ return (false);
+ }
+
/* various inappropriate polymorph targets */
if (mons_class_holiness( new_mclass ) != mons_holiness( monster )
|| mons_class_flag( new_mclass, M_NO_EXP_GAIN ) // not helpless
@@ -920,11 +929,13 @@ static bool valid_morph( struct monsters *monster, int new_mclass )
|| new_mclass == MONS_PROGRAM_BUG
|| new_mclass == MONS_SHAPESHIFTER
|| new_mclass == MONS_GLOWING_SHAPESHIFTER
-
// These shouldn't happen anyways (demons unaffected + holiness check),
// but if we ever do have polydemon, these will be needed:
|| new_mclass == MONS_PLAYER_GHOST
|| new_mclass == MONS_PANDEMONIUM_DEMON
+ || new_mclass == MONS_ROYAL_JELLY
+ || new_mclass == MONS_ORANGE_STATUE
+ || new_mclass == MONS_SILVER_STATUE
|| (new_mclass >= MONS_GERYON && new_mclass <= MONS_ERESHKIGAL))
{
return (false);