diff options
author | zelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573> | 2008-12-11 11:12:18 +0000 |
---|---|---|
committer | zelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573> | 2008-12-11 11:12:18 +0000 |
commit | a9ac64d3b972306982b27c81632182864022f939 (patch) | |
tree | 137e07e43b0d975949d817e257645a0aa9053c23 /crawl-ref/source/monstuff.cc | |
parent | dec341f5c123fcaab27d036d70dbef1456ad10fb (diff) | |
download | crawl-ref-a9ac64d3b972306982b27c81632182864022f939.tar.gz crawl-ref-a9ac64d3b972306982b27c81632182864022f939.zip |
Generalize swapping two pieces of terrain in function swap_terrain().
Encapsulate filling out a corpse object for a particular monster in
fill_out_corpse().
Started work on "swap chaos weapon with weapon of victim" chaos effect, but am
putting that off until there's some actor class virtual methods for changing
inventory and equipment.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7807 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/monstuff.cc')
-rw-r--r-- | crawl-ref/source/monstuff.cc | 66 |
1 files changed, 43 insertions, 23 deletions
diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc index cebd0170e1..513388d10a 100644 --- a/crawl-ref/source/monstuff.cc +++ b/crawl-ref/source/monstuff.cc @@ -308,11 +308,21 @@ void monster_drop_ething(monsters *monster, bool mark_item_origins, mprf(MSGCH_SOUND, grid_item_destruction_message(grd(monster->pos()))); } -static void _place_monster_corpse(const monsters *monster, bool silent, - int summon_type) +int fill_out_corpse(const monsters* monster, item_def& corpse, + bool allow_weightless) { - bool force = false; - int corpse_class = mons_species(monster->type); + ASSERT(monster->type != -1 && monster->type != MONS_PROGRAM_BUG); + corpse.clear(); + + int summon_type; + if (mons_is_summoned(monster, NULL, &summon_type) + || mons_enslaved_body_and_soul(monster) + || (monster->flags & (MF_BANISHED | MF_HARD_RESET))) + { + return (-1); + } + + int corpse_class = mons_species(monster->type); // If this was a corpse that was temporarily animated then turn the // monster back into a corpse. @@ -321,7 +331,6 @@ static void _place_monster_corpse(const monsters *monster, bool silent, || summon_type == SPELL_ANIMATE_SKELETON || summon_type == MON_SUMM_ANIMATE)) { - force = true; corpse_class = mons_zombie_base(monster); } @@ -334,28 +343,39 @@ static void _place_monster_corpse(const monsters *monster, bool silent, corpse_class = MONS_GLOWING_SHAPESHIFTER; // Doesn't leave a corpse. - if (mons_weight(corpse_class) == 0 || mons_enslaved_body_and_soul(monster) - || (!force && coinflip())) - { - return; - } + if (mons_weight(corpse_class) == 0 && !allow_weightless) + return (-1); + + corpse.flags = 0; + corpse.base_type = OBJ_CORPSES; + corpse.plus = corpse_class; + corpse.plus2 = 0; // butcher work done + corpse.sub_type = CORPSE_BODY; + corpse.special = FRESHEST_CORPSE; // rot time + corpse.quantity = 1; + corpse.orig_monnum = monster->type + 1; + corpse.props[MONSTER_NUMBER] = short(monster->number); + + corpse.colour = mons_class_colour(corpse_class); + if (corpse.colour == BLACK) + corpse.colour = monster->colour; + + return (corpse_class); +} +static void _place_monster_corpse(const monsters *monster, bool silent) +{ int o = get_item_slot(); if (o == NON_ITEM) return; - mitm[o].flags = 0; - mitm[o].base_type = OBJ_CORPSES; - mitm[o].plus = corpse_class; - mitm[o].plus2 = 0; // butcher work done - mitm[o].sub_type = CORPSE_BODY; - mitm[o].special = FRESHEST_CORPSE; // rot time - mitm[o].colour = mons_class_colour(corpse_class); - mitm[o].quantity = 1; - mitm[o].props[MONSTER_NUMBER] = short(monster->number); + const int corpse_class = fill_out_corpse(monster, mitm[o]); - if (mitm[o].colour == BLACK) - mitm[o].colour = monster->colour; + // Don't place a corpse? If a zombified monster is somehow capable + // of leaving a corpse then always place it. + const bool force = mons_class_is_zombified(monster->type); + if (corpse_class == -1 || (!force && coinflip())) + return; if (grid_destroys_items(grd(monster->pos()))) { @@ -1553,9 +1573,9 @@ void monster_die(monsters *monster, killer_type killer, curr_PlaceInfo.assert_validity(); _monster_die_cloud(monster, true, silent, summoned, summon_type); + // Have to add case for disintegration effect here? {dlb} if (!summoned) - // Have to add case for disintegration effect here? {dlb} - _place_monster_corpse(monster, silent, summon_type); + _place_monster_corpse(monster, silent); } _fire_monster_death_event(monster, killer, killer_index); |