From 24f899df4143cf27c98b218da786de393578e765 Mon Sep 17 00:00:00 2001 From: dolorous Date: Tue, 17 Jun 2008 06:33:24 +0000 Subject: Fix attack conduct handling to register more than one conduct for an attack again. For example, if you make an unchivalric attack on a neutral monster, both the "unchivalric attack" and "attack neutral" conducts will be handled again, instead of just the former (big oops). Passing a constant-sized array of god_conduct_triggers and adding wrapper functions to enable and disable them all is not the most elegant solution, but I don't quite have the time or the understanding right now to rewrite the god_conduct_trigger class to handle more than one conduct at once, and this does work in the meantime. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@5914 c06c8d41-db1a-0410-9941-cceddc491573 --- crawl-ref/source/beam.cc | 16 ++++++++-------- crawl-ref/source/fight.cc | 8 ++++---- crawl-ref/source/religion.cc | 22 +++++++++++++++++----- crawl-ref/source/religion.h | 4 +++- crawl-ref/source/spells2.cc | 8 ++++---- crawl-ref/source/spells3.cc | 16 ++++++++-------- 6 files changed, 44 insertions(+), 30 deletions(-) (limited to 'crawl-ref') diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc index cc29d7f736..703ab87661 100644 --- a/crawl-ref/source/beam.cc +++ b/crawl-ref/source/beam.cc @@ -4374,8 +4374,8 @@ static int _affect_monster(bolt &beam, monsters *mon, item_def *item) if (submerged) return (0); - god_conduct_trigger conduct; - conduct.enabled = false; + god_conduct_trigger conducts[4]; + disable_attack_conducts(conducts); // Nasty enchantments will annoy the monster, and are considered // naughty (even if a monster might resist). @@ -4389,7 +4389,7 @@ static int _affect_monster(bolt &beam, monsters *mon, item_def *item) remove_sanctuary(true); } - set_attack_conducts(mon, conduct); + set_attack_conducts(conducts, mon); if (you.religion == GOD_BEOGH && mons_species(mon->type) == MONS_ORC @@ -4405,7 +4405,7 @@ static int _affect_monster(bolt &beam, monsters *mon, item_def *item) else behaviour_event(mon, ME_ALERT, _beam_source(beam)); - conduct.enabled = true; + enable_attack_conducts(conducts); // !@#*( affect_monster_enchantment() has side-effects on // the beam structure which screw up range_used_on_hit(), @@ -4557,8 +4557,8 @@ static int _affect_monster(bolt &beam, monsters *mon, item_def *item) // fire elementals on their side - the elementals won't give a sh*t, // after all). - god_conduct_trigger conduct; - conduct.enabled = false; + god_conduct_trigger conducts[4]; + disable_attack_conducts(conducts); if (_nasty_beam(mon, beam)) { @@ -4574,7 +4574,7 @@ static int _affect_monster(bolt &beam, monsters *mon, item_def *item) remove_sanctuary(true); } - set_attack_conducts(mon, conduct, !okay); + set_attack_conducts(conducts, mon, !okay); } if (you.religion == GOD_BEOGH && mons_species(mon->type) == MONS_ORC @@ -4630,7 +4630,7 @@ static int _affect_monster(bolt &beam, monsters *mon, item_def *item) _update_hurt_or_helped(beam, mon); - conduct.enabled = true; + enable_attack_conducts(conducts); // The beam hit. if (mons_near(mon)) diff --git a/crawl-ref/source/fight.cc b/crawl-ref/source/fight.cc index a35f3a9c2e..8ca5e7f113 100644 --- a/crawl-ref/source/fight.cc +++ b/crawl-ref/source/fight.cc @@ -608,8 +608,8 @@ bool melee_attack::attack() check_autoberserk(); check_special_wield_effects(); - god_conduct_trigger conduct; - conduct.enabled = false; + god_conduct_trigger conducts[4]; + disable_attack_conducts(conducts); if (attacker->atype() == ACT_PLAYER) { @@ -619,7 +619,7 @@ bool melee_attack::attack() return (false); } else - set_attack_conducts(def, conduct); + set_attack_conducts(conducts, def); } // Trying to stay general beyond this point is a recipe for insanity. @@ -628,7 +628,7 @@ bool melee_attack::attack() (defender->atype() == ACT_PLAYER) ? mons_attack_you() : mons_attack_mons()); - conduct.enabled = true; + enable_attack_conducts(conducts); return retval; } diff --git a/crawl-ref/source/religion.cc b/crawl-ref/source/religion.cc index 4f217b9ff5..c9bb6ed80d 100644 --- a/crawl-ref/source/religion.cc +++ b/crawl-ref/source/religion.cc @@ -2743,19 +2743,31 @@ bool did_god_conduct(conduct_type thing_done, int level, bool known, return (ret); } -void set_attack_conducts(const monsters *mon, god_conduct_trigger& conduct, +void set_attack_conducts(god_conduct_trigger conduct[4], const monsters *mon, bool known) { if (mons_friendly(mon)) - conduct.set(DID_ATTACK_FRIEND, 5, known, mon); + conduct[0].set(DID_ATTACK_FRIEND, 5, known, mon); else if (mons_neutral(mon)) - conduct.set(DID_ATTACK_NEUTRAL, 5, known, mon); + conduct[1].set(DID_ATTACK_NEUTRAL, 5, known, mon); if (is_unchivalric_attack(&you, mon, mon)) - conduct.set(DID_UNCHIVALRIC_ATTACK, 4, known, mon); + conduct[2].set(DID_UNCHIVALRIC_ATTACK, 4, known, mon); if (mons_is_holy(mon)) - conduct.set(DID_ATTACK_HOLY, mon->hit_dice, known, mon); + conduct[3].set(DID_ATTACK_HOLY, mon->hit_dice, known, mon); +} + +void enable_attack_conducts(god_conduct_trigger conduct[4]) +{ + for (int i = 0; i < 4; ++i) + conduct[i].enabled = true; +} + +void disable_attack_conducts(god_conduct_trigger conduct[4]) +{ + for (int i = 0; i < 4; ++i) + conduct[i].enabled = false; } static void _dock_piety(int piety_loss, int penance) diff --git a/crawl-ref/source/religion.h b/crawl-ref/source/religion.h index 60b3fbd094..6c2a0e9a0c 100644 --- a/crawl-ref/source/religion.h +++ b/crawl-ref/source/religion.h @@ -70,8 +70,10 @@ void dec_penance(god_type god, int val); bool did_god_conduct(conduct_type thing_done, int pgain, bool known = true, const monsters *victim = NULL); -void set_attack_conducts(const monsters *mon, god_conduct_trigger& conduct, +void set_attack_conducts(god_conduct_trigger conduct[4], const monsters *mon, bool known = true); +void enable_attack_conducts(god_conduct_trigger conduct[4]); +void disable_attack_conducts(god_conduct_trigger conduct[4]); void excommunication(god_type new_god = GOD_NO_GOD); void gain_piety(int pgn); diff --git a/crawl-ref/source/spells2.cc b/crawl-ref/source/spells2.cc index 19a89f2919..c7e7d49a07 100644 --- a/crawl-ref/source/spells2.cc +++ b/crawl-ref/source/spells2.cc @@ -910,14 +910,14 @@ char burn_freeze(int pow, beam_type flavour) monsters *monster = &menv[mgr]; - god_conduct_trigger conduct; - conduct.enabled = false; + god_conduct_trigger conducts[4]; + disable_attack_conducts(conducts); bool success = !stop_attack_prompt(monster, false, false); if (success) { - set_attack_conducts(monster, conduct); + set_attack_conducts(conducts, monster); mprf("You %s %s.", (flavour == BEAM_FIRE) ? "burn" : @@ -930,7 +930,7 @@ char burn_freeze(int pow, beam_type flavour) behaviour_event(monster, ME_ANNOY, MHITYOU); } - conduct.enabled = true; + enable_attack_conducts(conducts); if (success) { diff --git a/crawl-ref/source/spells3.cc b/crawl-ref/source/spells3.cc index a95ed565dc..af3b06794b 100644 --- a/crawl-ref/source/spells3.cc +++ b/crawl-ref/source/spells3.cc @@ -205,14 +205,14 @@ int cast_smiting(int power, dist &beam) { monsters *monster = &menv[mgrd[beam.tx][beam.ty]]; - god_conduct_trigger conduct; - conduct.enabled = false; + god_conduct_trigger conducts[4]; + disable_attack_conducts(conducts); success = !stop_attack_prompt(monster, false, false); if (success) { - set_attack_conducts(monster, conduct); + set_attack_conducts(conducts, monster); mprf("You smite %s!", monster->name(DESC_NOCAP_THE).c_str()); @@ -221,7 +221,7 @@ int cast_smiting(int power, dist &beam) mimic_alert(monster); } - conduct.enabled = true; + enable_attack_conducts(conducts); if (success) { @@ -250,14 +250,14 @@ int airstrike(int power, dist &beam) { monsters *monster = &menv[mgrd[beam.tx][beam.ty]]; - god_conduct_trigger conduct; - conduct.enabled = false; + god_conduct_trigger conducts[4]; + disable_attack_conducts(conducts); success = !stop_attack_prompt(monster, false, false); if (success) { - set_attack_conducts(monster, conduct); + set_attack_conducts(conducts, monster); mprf("The air twists around and strikes %s!", monster->name(DESC_NOCAP_THE).c_str()); @@ -267,7 +267,7 @@ int airstrike(int power, dist &beam) mimic_alert(monster); } - conduct.enabled = true; + enable_attack_conducts(conducts); if (success) { -- cgit v1.2.3-54-g00ecf