diff options
Diffstat (limited to 'crawl-ref/source/monstuff.cc')
-rw-r--r-- | crawl-ref/source/monstuff.cc | 55 |
1 files changed, 51 insertions, 4 deletions
diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc index 8df057e503..daf446fb0a 100644 --- a/crawl-ref/source/monstuff.cc +++ b/crawl-ref/source/monstuff.cc @@ -2531,6 +2531,54 @@ bool monster_blink(monsters *monster, bool quiet) return (true); } +bool mon_can_be_slimified(monsters *monster) +{ + return (mons_holiness(monster) == MH_UNDEAD + || mons_holiness(monster) == MH_NATURAL + && !mons_is_slime(monster)); +} + +void slimify_monster(monsters *mon, bool hostile) +{ + if (mons_holiness(mon) == MH_UNDEAD) + monster_polymorph(mon, MONS_DEATH_OOZE); + else + { + const int x = mon->hit_dice + (coinflip() ? 1 : -1) * random2(5); + + if (x < 3) + monster_polymorph(mon, MONS_OOZE); + else if (x >= 3 && x < 5) + monster_polymorph(mon, MONS_JELLY); + else if (x >= 5 && x < 7) + monster_polymorph(mon, MONS_BROWN_OOZE); + else if (x >= 7 && x <= 11) + { + if (coinflip()) + monster_polymorph(mon, MONS_SLIME_CREATURE); + else + monster_polymorph(mon, MONS_GIANT_AMOEBA); + } + else + { + if (coinflip()) + monster_polymorph(mon, MONS_ACID_BLOB); + else + monster_polymorph(mon, MONS_AZURE_JELLY); + } + } + + if (!mons_eats_items(mon)) + mon->add_ench(ENCH_EAT_ITEMS); + + if (!hostile) + mon->attitude = ATT_STRICT_NEUTRAL; + else + mon->attitude = ATT_HOSTILE; + + mons_make_god_gift(mon, GOD_JIYVA); +} + static void _set_random_target(monsters* mon) { mon->target = random_in_bounds(); // If we don't find anything better @@ -5533,12 +5581,12 @@ bool mons_avoids_cloud(const monsters *monster, cloud_struct cloud, if (monster->flight_mode() != FL_NONE) return (false); - // These don't care about deep water. + // These don't care about deep water. if (monster_habitable_grid(monster, DNGN_DEEP_WATER)) return (false); // This position could become deep water, and they might drown. - if (grd(cloud.pos) == DNGN_SHALLOW_WATER) + if (grd(cloud.pos) == DNGN_SHALLOW_WATER) return (true); // Otherwise, it's safe for everyone else. @@ -9458,8 +9506,7 @@ static void _mons_in_cloud(monsters *monster) hurted += ((4 * random2(3)) - random2(monster->ac)); wake = true; } - - break; + break; case CLOUD_MUTAGENIC: simple_monster_message(monster, " is engulfed in a mutagenic fog!"); |