summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/monstuff.cc
diff options
context:
space:
mode:
authordshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-05-28 08:47:30 +0000
committerdshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-05-28 08:47:30 +0000
commit20a6609453ee2b51c388c296516c1abc1beab1d2 (patch)
tree201d735a3a4d66471005cb763078a6c05056752c /crawl-ref/source/monstuff.cc
parent7aed4c41d7fa0f9d70df56a82abbe69061e56269 (diff)
downloadcrawl-ref-20a6609453ee2b51c388c296516c1abc1beab1d2.tar.gz
crawl-ref-20a6609453ee2b51c388c296516c1abc1beab1d2.zip
Preliminary integration of Zooko's Xom patch (untested).
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1489 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/monstuff.cc')
-rw-r--r--crawl-ref/source/monstuff.cc59
1 files changed, 35 insertions, 24 deletions
diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc
index bedd380d1c..0923e8cb09 100644
--- a/crawl-ref/source/monstuff.cc
+++ b/crawl-ref/source/monstuff.cc
@@ -24,6 +24,7 @@
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
+#include <math.h>
#ifdef DOS
#include <conio.h>
@@ -375,7 +376,6 @@ void monster_die(monsters *monster, char killer, int i, bool silent)
if (monster->type == -1)
return;
- int xom_will_act = 0;
int monster_killed = monster_index(monster);
bool death_message =
!silent && mons_near(monster) && player_monster_visible(monster);
@@ -536,15 +536,6 @@ void monster_die(monsters *monster, char killer, int i, bool silent)
// killing triggers tutorial lesson
tutorial_inspect_kill();
- // Xom doesn't care who you killed:
- if (you.religion == GOD_XOM
- && random2(70) <= 10 + monster->hit_dice)
- {
- // postpone Xom action until after the monster dies
- xom_will_act = 1 + random2(monster->hit_dice);
- }
-
- // Trying to prevent summoning abuse here, so we're trying to
// prevent summoned creatures from being done_good kills,
// Only affects monsters friendly when created.
if (!created_friendly)
@@ -810,7 +801,7 @@ void monster_die(monsters *monster, char killer, int i, bool silent)
if (monster->type == MONS_SIMULACRUM_SMALL
|| monster->type == MONS_SIMULACRUM_LARGE)
{
- simple_monster_message( monster, " vaporizes!" );
+ simple_monster_message( monster, " vaporises!" );
place_cloud( CLOUD_COLD, monster->x, monster->y,
1 + random2(3), monster->kill_alignment() );
@@ -839,9 +830,6 @@ void monster_die(monsters *monster, char killer, int i, bool silent)
|| killer == KILL_YOU
|| pet_kill);
monster_cleanup(monster);
-
- if ( xom_will_act )
- Xom_acts(true, xom_will_act, false);
} // end monster_die
void monster_cleanup(monsters *monster)
@@ -1013,23 +1001,46 @@ static bool valid_morph( monsters *monster, int new_mclass )
return (monster_habitable_grid(new_mclass, current_tile));
} // end valid_morph()
-// note that power is (as of yet) unused within this function -
-// may be worthy of consideration of later implementation, though,
-// so I'll still let the parameter exist for the time being {dlb}
-bool monster_polymorph( monsters *monster, int targetc, int power )
+static bool is_poly_power_unsuitable(
+ poly_power_type power,
+ int src_pow,
+ int tgt_pow,
+ int relax)
+{
+ switch (power)
+ {
+ case PPT_LESS:
+ return (tgt_pow > src_pow - 3 + (relax * 3) / 2)
+ || (power == PPT_LESS && (tgt_pow < src_pow - (relax / 2)));
+ case PPT_MORE:
+ return (tgt_pow < src_pow + 2 - relax)
+ || (power == PPT_MORE && (tgt_pow > src_pow + relax));
+ default:
+ case PPT_SAME:
+ return (tgt_pow < src_pow - relax)
+ || (tgt_pow > src_pow + (relax * 3) / 2);
+ }
+}
+
+/*
+ * if targetc == RANDOM_MONSTER then relpower indicates the desired
+ * power of the new monster relative to the current monster.
+ * Relaxation still takes effect when needed no matter what relpower
+ * says.
+ */
+bool monster_polymorph( monsters *monster, monster_type targetc,
+ poly_power_type power )
{
std::string str_polymon;
int source_power, target_power, relax;
int tries = 1000;
- UNUSED( power );
-
// Used to be mons_power, but that just returns hit_dice
// for the monster class. By using the current hit dice
// the player gets the opportunity to use draining more
// effectively against shapeshifters. -- bwr
source_power = monster->hit_dice;
- relax = 2;
+ relax = 1;
if (targetc == RANDOM_MONSTER)
{
@@ -1044,15 +1055,15 @@ bool monster_polymorph( monsters *monster, int targetc, int power )
target_power = mons_power( targetc );
- if (one_chance_in(100))
+ if (one_chance_in(200))
relax++;
if (relax > 50)
return (simple_monster_message( monster, " shudders." ));
}
while (tries-- && (!valid_morph( monster, targetc )
- || target_power < source_power - relax
- || target_power > source_power + (relax * 3) / 2));
+ || is_poly_power_unsuitable(power, source_power,
+ target_power, relax)));
}
if (!valid_morph( monster, targetc ))