diff options
-rw-r--r-- | crawl-ref/source/monstuff.cc | 10 | ||||
-rw-r--r-- | crawl-ref/source/religion.cc | 20 | ||||
-rw-r--r-- | crawl-ref/source/religion.h | 1 |
3 files changed, 26 insertions, 5 deletions
diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc index acdf66aef3..68b3278017 100644 --- a/crawl-ref/source/monstuff.cc +++ b/crawl-ref/source/monstuff.cc @@ -740,7 +740,7 @@ void monster_die(monsters *monster, killer_type killer, int i, bool silent) const bool gives_xp = !monster->has_ench(ENCH_ABJ); bool in_transit = false; - bool drop_items = !hard_reset; + bool drop_items = !hard_reset && !mons_is_holy(monster); #ifdef DGL_MILESTONES _check_kill_milestone(monster, killer, i); @@ -878,6 +878,8 @@ void monster_die(monsters *monster, killer_type killer, int i, bool silent) case KILL_YOU_MISSILE: // You kill by missile or beam. case KILL_YOU_CONF: // You kill by confusion. { + const bool bad_kill = + god_hates_killing(you.religion, monster); const bool created_friendly = testbits(monster->flags, MF_CREATED_FRIENDLY); const bool was_neutral = @@ -896,8 +898,8 @@ void monster_die(monsters *monster, killer_type killer, int i, bool silent) // killing triggers tutorial lesson _tutorial_inspect_kill(); - // prevent summoned creatures from being done_good kills, - if (!created_friendly && gives_xp) + // prevent summoned creatures from being good kills + if (bad_kill || (!created_friendly && gives_xp)) { if (mons_holiness(monster) == MH_NATURAL) { @@ -944,12 +946,10 @@ void monster_die(monsters *monster, killer_type killer, int i, bool silent) monster->hit_dice, true, monster); } - // Holy beings take their gear with them when they die. if (mons_is_holy(monster)) { did_god_conduct(DID_KILL_HOLY, monster->hit_dice, true, monster); - drop_items = false; } } diff --git a/crawl-ref/source/religion.cc b/crawl-ref/source/religion.cc index 1c868b6a3f..24d3de701b 100644 --- a/crawl-ref/source/religion.cc +++ b/crawl-ref/source/religion.cc @@ -5027,6 +5027,26 @@ std::string god_hates_your_god_reaction(god_type god, return ""; } +bool god_hates_killing(god_type god, const monsters* mon) +{ + bool retval = false; + const mon_holy_type holiness = mon->holiness(); + + switch (holiness) + { + case MH_HOLY: + retval = (is_good_god(god)); + break; + case MH_NATURAL: + retval = (god == GOD_ELYVILON); + break; + default: + break; + } + + return retval; +} + bool god_likes_butchery(god_type god) { return (god == GOD_OKAWARU diff --git a/crawl-ref/source/religion.h b/crawl-ref/source/religion.h index 67e02b647e..1ca01f75f1 100644 --- a/crawl-ref/source/religion.h +++ b/crawl-ref/source/religion.h @@ -55,6 +55,7 @@ bool god_hates_your_god(god_type god, god_type your_god = you.religion); std::string god_hates_your_god_reaction(god_type god, god_type your_god = you.religion); +bool god_hates_killing(god_type god, const monsters* mon); bool god_likes_butchery(god_type god); bool god_hates_butchery(god_type god); harm_protection_type god_protects_from_harm(god_type god, bool actual = true); |