From 9232e2cf62fe475bdf3a9ab10fb0aeacf6a82102 Mon Sep 17 00:00:00 2001 From: Adam Borowski Date: Mon, 28 Oct 2013 13:01:03 +0100 Subject: Don't impose TSO penance for reflecting poison/draining (you still get xp). This introduces a new pseudo-agent, akin to ANON_FRIENDLY_MONSTER. --- crawl-ref/source/beam.cc | 6 +++--- crawl-ref/source/defines.h | 1 + crawl-ref/source/env.h | 2 +- crawl-ref/source/externs.h | 1 + crawl-ref/source/mon-ench.cc | 1 + crawl-ref/source/mon-stuff.cc | 2 +- crawl-ref/source/mon-util.cc | 9 +++++++++ crawl-ref/source/monster.cc | 6 ++++-- crawl-ref/source/startup.cc | 1 + crawl-ref/source/tags.cc | 2 +- 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 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::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++) { -- cgit v1.2.3-54-g00ecf