summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Borowski <kilobyte@angband.pl>2013-10-28 13:01:03 +0100
committerAdam Borowski <kilobyte@angband.pl>2013-10-28 13:01:03 +0100
commit9232e2cf62fe475bdf3a9ab10fb0aeacf6a82102 (patch)
treeaf1f5cdbfae7f7c16690c7b497d62769ddcfc653
parent3e1346358229822a8d68b1ead015e7b4ed50e6e8 (diff)
downloadcrawl-ref-9232e2cf62fe475bdf3a9ab10fb0aeacf6a82102.tar.gz
crawl-ref-9232e2cf62fe475bdf3a9ab10fb0aeacf6a82102.zip
Don't impose TSO penance for reflecting poison/draining (you still get xp).
This introduces a new pseudo-agent, akin to ANON_FRIENDLY_MONSTER.
-rw-r--r--crawl-ref/source/beam.cc6
-rw-r--r--crawl-ref/source/defines.h1
-rw-r--r--crawl-ref/source/env.h2
-rw-r--r--crawl-ref/source/externs.h1
-rw-r--r--crawl-ref/source/mon-ench.cc1
-rw-r--r--crawl-ref/source/mon-stuff.cc2
-rw-r--r--crawl-ref/source/mon-util.cc9
-rw-r--r--crawl-ref/source/monster.cc6
-rw-r--r--crawl-ref/source/startup.cc1
-rw-r--r--crawl-ref/source/tags.cc2
10 files changed, 23 insertions, 8 deletions
diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc
index 3cdd220d6c..c4a12062b1 100644
--- a/crawl-ref/source/beam.cc
+++ b/crawl-ref/source/beam.cc
@@ -132,7 +132,7 @@ void bolt::emit_message(msg_channel_type chan, const char* m)
kill_category bolt::whose_kill() const
{
- if (YOU_KILL(thrower))
+ if (YOU_KILL(thrower) || beam_source == YOU_FAULTLESS)
return KC_YOU;
else if (MON_KILL(thrower))
{
@@ -6052,8 +6052,8 @@ actor* bolt::agent(bool ignore_reflection) const
// If the beam was reflected report a different point of origin
if (reflections > 0 && !ignore_reflection)
{
- if (reflector == NON_MONSTER)
- nominal_ktype = KILL_YOU_MISSILE;
+ if (reflector == NON_MONSTER || beam_source == NON_MONSTER)
+ return &menv[YOU_FAULTLESS];
nominal_source = reflector;
}
if (YOU_KILL(nominal_ktype))
diff --git a/crawl-ref/source/defines.h b/crawl-ref/source/defines.h
index 55e85b28bf..30457c9bbc 100644
--- a/crawl-ref/source/defines.h
+++ b/crawl-ref/source/defines.h
@@ -57,6 +57,7 @@ enum extra_monster_index_type
{
MAX_MONSTERS = 700, // max size of monster array {dlb}
ANON_FRIENDLY_MONSTER = MAX_MONSTERS,// unknown/dead ally, for actor blaming
+ YOU_FAULTLESS, // full xp but no penalty (reflection)
NON_MONSTER = NON_ENTITY, // no monster
MHITNOT = NON_MONSTER,
diff --git a/crawl-ref/source/env.h b/crawl-ref/source/env.h
index ab23dca21f..535ad62002 100644
--- a/crawl-ref/source/env.h
+++ b/crawl-ref/source/env.h
@@ -23,7 +23,7 @@ struct crawl_environment
colour_t floor_colour;
FixedVector< item_def, MAX_ITEMS > item; // item list
- FixedVector< monster, MAX_MONSTERS+1 > mons; // monster list, plus anon
+ FixedVector< monster, MAX_MONSTERS+2 > mons; // monster list, plus anon
feature_grid grid; // terrain grid
FixedArray<terrain_property_t, GXM, GYM> pgrid; // terrain properties
diff --git a/crawl-ref/source/externs.h b/crawl-ref/source/externs.h
index 4594216d9c..6bfba7c180 100644
--- a/crawl-ref/source/externs.h
+++ b/crawl-ref/source/externs.h
@@ -274,6 +274,7 @@ typedef uint32_t mid_t;
// the numbers are meaningless, there's just plenty of space for gods, env,
// and whatever else we want to have, while keeping all monster ids smaller.
#define MID_ANON_FRIEND ((mid_t)0xffff0000)
+#define MID_YOU_FAULTLESS ((mid_t)0xffff0001)
static inline monster_type operator++(monster_type &x)
{
diff --git a/crawl-ref/source/mon-ench.cc b/crawl-ref/source/mon-ench.cc
index e1e54db8cc..d98c005010 100644
--- a/crawl-ref/source/mon-ench.cc
+++ b/crawl-ref/source/mon-ench.cc
@@ -2017,6 +2017,7 @@ mon_enchant::operator string () const
duration,
kill_category_desc(who),
source == MID_ANON_FRIEND ? "anon friend" :
+ source == MID_YOU_FAULTLESS ? "you w/o fault" :
a ? a->name(DESC_PLAIN, true).c_str() : "N/A");
}
diff --git a/crawl-ref/source/mon-stuff.cc b/crawl-ref/source/mon-stuff.cc
index 4a79c41712..1f23b7b1ec 100644
--- a/crawl-ref/source/mon-stuff.cc
+++ b/crawl-ref/source/mon-stuff.cc
@@ -737,7 +737,7 @@ int exp_rate(int killer)
return 2;
}
- if (killer == MHITYOU)
+ if (killer == MHITYOU || killer == YOU_FAULTLESS)
return 2;
if (_is_pet_kill(KILL_MON, killer))
diff --git a/crawl-ref/source/mon-util.cc b/crawl-ref/source/mon-util.cc
index ad5af7feb1..064fbff37e 100644
--- a/crawl-ref/source/mon-util.cc
+++ b/crawl-ref/source/mon-util.cc
@@ -4606,6 +4606,8 @@ monster *monster_by_mid(mid_t m)
{
if (m == MID_ANON_FRIEND)
return &menv[ANON_FRIENDLY_MONSTER];
+ if (m == MID_YOU_FAULTLESS)
+ return &menv[YOU_FAULTLESS];
map<mid_t, unsigned short>::const_iterator mc = env.mid_cache.find(m);
if (mc != env.mid_cache.end())
@@ -4667,6 +4669,13 @@ void init_anon()
mon.mid = MID_ANON_FRIEND;
mon.attitude = ATT_FRIENDLY;
mon.hit_points = mon.max_hit_points = 1000;
+
+ monster &yf = menv[YOU_FAULTLESS];
+ yf.reset();
+ yf.type = MONS_PROGRAM_BUG;
+ yf.mid = MID_YOU_FAULTLESS;
+ yf.attitude = ATT_FRIENDLY; // higher than this, actually
+ yf.hit_points = mon.max_hit_points = 1000;
}
actor *find_agent(mid_t m, kill_category kc)
diff --git a/crawl-ref/source/monster.cc b/crawl-ref/source/monster.cc
index bc19d1e12a..22edb2d776 100644
--- a/crawl-ref/source/monster.cc
+++ b/crawl-ref/source/monster.cc
@@ -4196,7 +4196,7 @@ int monster::hurt(const actor *agent, int amount, beam_type flavour,
bool cleanup_dead, bool attacker_effects)
{
if (mons_is_projectile(type) || mindex() == ANON_FRIENDLY_MONSTER
- || type == MONS_DIAMOND_OBELISK)
+ || mindex() == YOU_FAULTLESS || type == MONS_DIAMOND_OBELISK)
{
return 0;
}
@@ -4668,7 +4668,9 @@ void monster::scale_hp(int num, int den)
kill_category monster::kill_alignment() const
{
- return (friendly() ? KC_FRIENDLY : KC_OTHER);
+ if (mid == MID_YOU_FAULTLESS)
+ return KC_YOU;
+ return friendly() ? KC_FRIENDLY : KC_OTHER;
}
bool monster::sicken(int amount, bool unused, bool quiet)
diff --git a/crawl-ref/source/startup.cc b/crawl-ref/source/startup.cc
index 8a1c2c0507..5b4054e9e5 100644
--- a/crawl-ref/source/startup.cc
+++ b/crawl-ref/source/startup.cc
@@ -98,6 +98,7 @@ static void _initialize()
info[0] = 0;
reset_all_monsters();
+ init_anon();
igrd.init(NON_ITEM);
mgrd.init(NON_MONSTER);
diff --git a/crawl-ref/source/tags.cc b/crawl-ref/source/tags.cc
index a340b8eea4..7f9ce872de 100644
--- a/crawl-ref/source/tags.cc
+++ b/crawl-ref/source/tags.cc
@@ -4240,7 +4240,7 @@ static void tag_read_level_monsters(reader &th)
// how many monsters?
count = unmarshallShort(th);
- ASSERT_RANGE(count, 0, MAX_MONSTERS + 1);
+ ASSERT_RANGE(count, 0, MAX_MONSTERS);
for (i = 0; i < count; i++)
{