diff options
Diffstat (limited to 'crawl-ref')
-rw-r--r-- | crawl-ref/source/abl-show.cc | 2 | ||||
-rw-r--r-- | crawl-ref/source/decks.cc | 3 | ||||
-rw-r--r-- | crawl-ref/source/delay.cc | 4 | ||||
-rw-r--r-- | crawl-ref/source/effects.cc | 81 | ||||
-rw-r--r-- | crawl-ref/source/effects.h | 11 | ||||
-rw-r--r-- | crawl-ref/source/fight.cc | 66 | ||||
-rw-r--r-- | crawl-ref/source/item_use.cc | 2 | ||||
-rw-r--r-- | crawl-ref/source/religion.cc | 7 | ||||
-rw-r--r-- | crawl-ref/source/spells3.cc | 3 | ||||
-rw-r--r-- | crawl-ref/source/spells4.cc | 89 | ||||
-rw-r--r-- | crawl-ref/source/spells4.h | 2 | ||||
-rw-r--r-- | crawl-ref/source/spl-cast.cc | 2 | ||||
-rw-r--r-- | crawl-ref/source/spl-util.cc | 53 | ||||
-rw-r--r-- | crawl-ref/source/spl-util.h | 30 |
14 files changed, 179 insertions, 176 deletions
diff --git a/crawl-ref/source/abl-show.cc b/crawl-ref/source/abl-show.cc index 5e52268867..39e1874f49 100644 --- a/crawl-ref/source/abl-show.cc +++ b/crawl-ref/source/abl-show.cc @@ -2408,7 +2408,7 @@ static int _find_ability_slot( ability_type which_ability ) //////////////////////////////////////////////////////////////////////////// -static int _lugonu_warp_monster(coord_def where, int pow, int) +static int _lugonu_warp_monster(coord_def where, int pow, int, actor *) { if (!in_bounds(where) || mgrd(where) == NON_MONSTER) return (0); diff --git a/crawl-ref/source/decks.cc b/crawl-ref/source/decks.cc index 0b0fe786f7..cfa3527d62 100644 --- a/crawl-ref/source/decks.cc +++ b/crawl-ref/source/decks.cc @@ -1716,9 +1716,8 @@ static void _stairs_card(int power, deck_rarity_type rarity) stair_draw_count++; } -static int _drain_monsters(coord_def where, int pow, int garbage) +static int _drain_monsters(coord_def where, int pow, int, actor *) { - UNUSED( garbage ); if (where == you.pos()) drain_exp(); else diff --git a/crawl-ref/source/delay.cc b/crawl-ref/source/delay.cc index fb1eabd818..bbd0ba1f2f 100644 --- a/crawl-ref/source/delay.cc +++ b/crawl-ref/source/delay.cc @@ -81,10 +81,8 @@ static bool _recite_mons_useless(const monsters *mon) } // Power is maximum 50. -static int _recite_to_monsters(coord_def where, int pow, int unused) +static int _recite_to_monsters(coord_def where, int pow, int, actor *) { - UNUSED(unused); - const int mon = mgrd(where); if (mon == NON_MONSTER) return (0); diff --git a/crawl-ref/source/effects.cc b/crawl-ref/source/effects.cc index 5a5f6db7c5..5ffd192a96 100644 --- a/crawl-ref/source/effects.cc +++ b/crawl-ref/source/effects.cc @@ -61,12 +61,18 @@ REVISION("$Rev$"); #include "view.h" #include "xom.h" -int holy_word_player(int pow, int caster) +int holy_word_player(int pow, int caster, actor *attacker) { if (!player_is_unholy()) return 0; - int hploss = std::max(0, you.hp / 2 - 1); + int hploss; + + // Holy word won't kill its user. + if (attacker != &you) + hploss = roll_dice(2, 15) + (random2(pow) / 3); + else + hploss = std::max(0, you.hp / 2 - 1); if (!hploss) return 0; @@ -103,7 +109,8 @@ int holy_word_player(int pow, int caster) return 1; } -int holy_word_monsters(coord_def where, int pow, int caster) +int holy_word_monsters(coord_def where, int pow, int caster, + actor *attacker) { int retval = 0; @@ -112,7 +119,7 @@ int holy_word_monsters(coord_def where, int pow, int caster) // Is the player in this cell? if (where == you.pos()) - retval = holy_word_player(pow, caster); + retval = holy_word_player(pow, caster, attacker); // Is a monster in this cell? const int mon = mgrd(where); @@ -122,35 +129,56 @@ int holy_word_monsters(coord_def where, int pow, int caster) monsters *monster = &menv[mon]; - if (!monster->alive() || monster->res_holy_energy(&you) > 0) + if (!monster->alive() || !mons_is_unholy(monster)) return retval; - const int hploss = roll_dice(2, 15) + (random2(pow) / 3); - retval = 1; + int hploss; + + // Holy word won't kill its user. + if (attacker != monster) + hploss = roll_dice(2, 15) + (random2(pow) / 3); + else + hploss = std::max(0, monster->hit_points / 2 - 1); + + if (hploss) + simple_monster_message(monster, " convulses!"); - // Currently, holy word annoys the monsters it affects because it - // can kill them, and because hostile monsters don't use it. - behaviour_event(monster, ME_ANNOY, MHITYOU); - simple_monster_message(monster, " convulses!"); - monster->hurt(&you, hploss); + monster->hurt(attacker, hploss); - if (monster->alive()) + if (hploss) { - if (monster->speed_increment >= 25) - monster->speed_increment -= 20; + retval = 1; + + // Holy word won't annoy, slow, or frighten its user. + if (monster->alive() && attacker != monster) + { + // Currently, holy word annoys the monsters it affects + // because it can kill them, and because hostile monsters + // don't use it. + behaviour_event(monster, ME_ANNOY, MHITYOU); - monster->add_ench(ENCH_FEAR); + if (monster->speed_increment >= 25) + monster->speed_increment -= 20; + + monster->add_ench(ENCH_FEAR); + } } return retval; } -int holy_word(int pow, int caster, const coord_def& where, bool silent) +int holy_word(int pow, int caster, const coord_def& where, bool silent, + actor *attacker) { - if (!silent) - mpr("You speak a Word of immense power!"); + if (!silent && attacker) + { + mprf("%s %s a Word of immense power!", + attacker->name(DESC_CAP_THE).c_str(), + attacker->conj_verb("speak").c_str()); + } - return apply_area_within_radius(holy_word_monsters, where, pow, 8, caster); + return apply_area_within_radius(holy_word_monsters, where, pow, 8, caster, + attacker); } int torment_player(int pow, int caster) @@ -221,7 +249,7 @@ int torment_player(int pow, int caster) // maximum power of 1000, high level monsters and characters would save // too often. (GDL) -int torment_monsters(coord_def where, int pow, int caster) +int torment_monsters(coord_def where, int pow, int caster, actor *attacker) { UNUSED(pow); @@ -232,7 +260,7 @@ int torment_monsters(coord_def where, int pow, int caster) retval = torment_player(0, caster); // Is a monster in this cell? - int mon = mgrd(where); + const int mon = mgrd(where); if (mon == NON_MONSTER) return retval; @@ -244,18 +272,15 @@ int torment_monsters(coord_def where, int pow, int caster) int hploss = std::max(0, monster->hit_points / 2 - 1); + if (hploss) + simple_monster_message(monster, " convulses!"); + // Currently, torment doesn't annoy the monsters it affects because // it can't kill them, and because hostile monsters use it. monster->hurt(NULL, hploss, BEAM_TORMENT_DAMAGE); if (hploss) - { retval = 1; - if (!monster->alive()) - return retval; - } - - simple_monster_message(monster, " convulses!"); return retval; } diff --git a/crawl-ref/source/effects.h b/crawl-ref/source/effects.h index e2c05fac02..5b17185d33 100644 --- a/crawl-ref/source/effects.h +++ b/crawl-ref/source/effects.h @@ -96,10 +96,12 @@ void yell(bool force = false); /* *********************************************************************** * called from: item_use - spell * *********************************************************************** */ -int holy_word(int pow, int caster, const coord_def& where, bool silent); +int holy_word(int pow, int caster, const coord_def& where, bool silent = false, + actor *attacker = NULL); -int holy_word_player(int pow, int caster); -int holy_word_monsters(coord_def where, int pow, int caster); +int holy_word_player(int pow, int caster, actor *attacker = NULL); +int holy_word_monsters(coord_def where, int pow, int caster, + actor *attacker = NULL); // last updated 12may2000 {dlb} @@ -110,7 +112,8 @@ int holy_word_monsters(coord_def where, int pow, int caster); int torment(int caster, const coord_def& where); int torment_player(int pow, int caster); -int torment_monsters(coord_def where, int pow, int caster); +int torment_monsters(coord_def where, int pow, int caster, + actor *attacker = NULL); void immolation(int caster, bool known = false); diff --git a/crawl-ref/source/fight.cc b/crawl-ref/source/fight.cc index 16a72a5847..fdddab382c 100644 --- a/crawl-ref/source/fight.cc +++ b/crawl-ref/source/fight.cc @@ -266,48 +266,48 @@ unchivalric_attack_type is_unchivalric_attack(const actor *attacker, // No unchivalric attacks on monsters that cannot fight (e.g. // plants) or monsters the attacker can't see (either due to // invisibility or being behind opaque clouds). - if (!defender->cannot_fight() && attacker->can_see(defender)) + if (defender->cannot_fight() || (attacker && !attacker->can_see(defender))) + return (unchivalric); + + // Distracted (but not batty); this only applies to players. + if (attacker && attacker->atype() == ACT_PLAYER && def->foe != MHITYOU + && !mons_is_batty(def)) { - // Distracted (but not batty); this only applies to players. - if (attacker->atype() == ACT_PLAYER && def->foe != MHITYOU - && !mons_is_batty(def)) - { - unchivalric = UCAT_DISTRACTED; - } + unchivalric = UCAT_DISTRACTED; + } - // confused (but not perma-confused) - if (def->has_ench(ENCH_CONFUSION) - && !mons_class_flag(def->type, M_CONFUSED)) - { - unchivalric = UCAT_CONFUSED; - } + // confused (but not perma-confused) + if (def->has_ench(ENCH_CONFUSION) + && !mons_class_flag(def->type, M_CONFUSED)) + { + unchivalric = UCAT_CONFUSED; + } - // fleeing - if (mons_is_fleeing(def)) - unchivalric = UCAT_FLEEING; + // fleeing + if (mons_is_fleeing(def)) + unchivalric = UCAT_FLEEING; - // invisible - if (!attacker->visible_to(defender)) - unchivalric = UCAT_INVISIBLE; + // invisible + if (attacker && !attacker->visible_to(defender)) + unchivalric = UCAT_INVISIBLE; - // held in a net - if (mons_is_caught(def)) - unchivalric = UCAT_HELD_IN_NET; + // held in a net + if (mons_is_caught(def)) + unchivalric = UCAT_HELD_IN_NET; - // petrifying - if (mons_is_petrifying(def)) - unchivalric = UCAT_PETRIFYING; + // petrifying + if (mons_is_petrifying(def)) + unchivalric = UCAT_PETRIFYING; - // paralysed - if (def->cannot_act()) - unchivalric = UCAT_PARALYSED; + // paralysed + if (def->cannot_act()) + unchivalric = UCAT_PARALYSED; - // sleeping - if (mons_is_sleeping(def)) - unchivalric = UCAT_SLEEPING; - } + // sleeping + if (mons_is_sleeping(def)) + unchivalric = UCAT_SLEEPING; - return unchivalric; + return (unchivalric); } ////////////////////////////////////////////////////////////////////////// diff --git a/crawl-ref/source/item_use.cc b/crawl-ref/source/item_use.cc index 15415b9467..882845c031 100644 --- a/crawl-ref/source/item_use.cc +++ b/crawl-ref/source/item_use.cc @@ -5040,7 +5040,7 @@ void read_scroll(int slot) } const bool success = holy_word(pow, HOLY_WORD_SCROLL, you.pos(), - !item_type_known(scroll)); + !item_type_known(scroll), &you); if (!success) { diff --git a/crawl-ref/source/religion.cc b/crawl-ref/source/religion.cc index 4616c13fad..5ffde17d8f 100644 --- a/crawl-ref/source/religion.cc +++ b/crawl-ref/source/religion.cc @@ -5972,7 +5972,7 @@ static bool _bless_weapon( god_type god, brand_type brand, int colour ) take_note(Note(NOTE_GOD_GIFT, you.religion)); you.flash_colour = colour; - viewwindow( true, false ); + viewwindow(true, false); mprf( MSGCH_GOD, "Your weapon shines brightly!" ); simple_god_message( " booms: Use this gift wisely!" ); @@ -5980,6 +5980,9 @@ static bool _bless_weapon( god_type god, brand_type brand, int colour ) if ( god == GOD_SHINING_ONE ) { holy_word(100, HOLY_WORD_TSO, you.pos(), true); +#ifndef USE_TILE + delay(1000); +#endif // Un-bloodify surrounding squares. for (radius_iterator ri(you.pos(), 3, true, true); ri; ++ri) @@ -5987,8 +5990,6 @@ static bool _bless_weapon( god_type god, brand_type brand, int colour ) env.map(*ri).property &= ~(FPROP_BLOODY); } - delay(1000); - return (true); } diff --git a/crawl-ref/source/spells3.cc b/crawl-ref/source/spells3.cc index 9d07e15a2c..665951f70a 100644 --- a/crawl-ref/source/spells3.cc +++ b/crawl-ref/source/spells3.cc @@ -1691,7 +1691,8 @@ bool cast_sanctuary(const int power) mpr("You are suddenly bathed in radiance!"); you.flash_colour = WHITE; - viewwindow( true, false ); + viewwindow(true, false); + holy_word(100, HOLY_WORD_ZIN, you.pos(), true); #ifndef USE_TILE delay(1000); diff --git a/crawl-ref/source/spells4.cc b/crawl-ref/source/spells4.cc index adea2e1abf..049b901be9 100644 --- a/crawl-ref/source/spells4.cc +++ b/crawl-ref/source/spells4.cc @@ -66,7 +66,6 @@ enum DEBRIS // jmf: add for shatter, dig, and Giants to throw }; // jmf: ...and I'll actually implement the items Real Soon Now... static int _make_a_rot_cloud(const coord_def& where, int pow, cloud_type ctype); -static int _quadrant_blink(coord_def where, int pow, int garbage); void do_monster_rot(int mon); @@ -91,10 +90,8 @@ static bool _player_hurt_monster(int monster, int damage) } // Here begin the actual spells: -static int _shatter_monsters(coord_def where, int pow, int garbage) +static int _shatter_monsters(coord_def where, int pow, int, actor *) { - UNUSED( garbage ); - dice_def dam_dice( 0, 5 + pow / 3 ); // number of dice set below const int monster = mgrd(where); @@ -186,10 +183,9 @@ static int _shatter_monsters(coord_def where, int pow, int garbage) return (damage); } -static int _shatter_items(coord_def where, int pow, int garbage) +static int _shatter_items(coord_def where, int pow, int, actor *) { UNUSED( pow ); - UNUSED( garbage ); int broke_stuff = 0; @@ -213,10 +209,8 @@ static int _shatter_items(coord_def where, int pow, int garbage) return 0; } -static int _shatter_walls(coord_def where, int pow, int garbage) +static int _shatter_walls(coord_def where, int pow, int, actor *) { - UNUSED(garbage); - int chance = 0; // if not in-bounds then we can't really shatter it -- bwr @@ -388,9 +382,8 @@ void cast_detect_secret_doors(int pow) mprf("You detect %s", (found > 0) ? "secret doors!" : "nothing."); } -static int _sleep_monsters(coord_def where, int pow, int garbage) +static int _sleep_monsters(coord_def where, int pow, int, actor *) { - UNUSED( garbage ); const int mnstr = mgrd(where); if (mnstr == NON_MONSTER) @@ -447,9 +440,8 @@ static bool _is_domesticated_animal(int type) return (false); } -static int _tame_beast_monsters(coord_def where, int pow, int garbage) +static int _tame_beast_monsters(coord_def where, int pow, int, actor *) { - UNUSED( garbage ); const int which_mons = mgrd(where); if (which_mons == NON_MONSTER) @@ -488,10 +480,9 @@ void cast_tame_beasts(int pow) apply_area_visible(_tame_beast_monsters, pow); } -static int _ignite_poison_objects(coord_def where, int pow, int garbage) +static int _ignite_poison_objects(coord_def where, int pow, int, actor *) { UNUSED( pow ); - UNUSED( garbage ); int strength = 0; @@ -526,10 +517,9 @@ static int _ignite_poison_objects(coord_def where, int pow, int garbage) return (strength); } -static int _ignite_poison_clouds( coord_def where, int pow, int garbage ) +static int _ignite_poison_clouds( coord_def where, int pow, int, actor *) { UNUSED( pow ); - UNUSED( garbage ); bool did_anything = false; @@ -557,10 +547,8 @@ static int _ignite_poison_clouds( coord_def where, int pow, int garbage ) return did_anything; } -static int _ignite_poison_monsters(coord_def where, int pow, int garbage) +static int _ignite_poison_monsters(coord_def where, int pow, int, actor *) { - UNUSED( garbage ); - bolt beam; beam.flavour = BEAM_FIRE; // This is dumb, only used for adjust! @@ -777,10 +765,8 @@ void cast_silence(int pow) } } -static int _discharge_monsters( coord_def where, int pow, int garbage ) +static int _discharge_monsters( coord_def where, int pow, int, actor *) { - UNUSED( garbage ); - const int mon = mgrd(where); int damage = 0; @@ -864,7 +850,7 @@ void cast_discharge( int pow ) // NB: this must be checked against the same effects // in fight.cc for all forms of attack !!! {dlb} // This function should be currently unused (the effect is too powerful). -static int _distortion_monsters(coord_def where, int pow, int message) +static int _distortion_monsters(coord_def where, int pow, int, actor *) { if (pow > 100) pow = 100; @@ -937,9 +923,9 @@ static int _distortion_monsters(coord_def where, int pow, int message) defender->banish(); return 1; } - else if (message) + else { - mpr("Nothing seems to happen."); + canned_msg(MSG_NOTHING_HAPPENS); return 1; } @@ -956,10 +942,8 @@ void cast_bend(int pow) // Really this is just applying the best of Band/Warp weapon/Warp field // into a spell that gives the "make monsters go away" benefit without // the insane damage potential. -- bwr -int disperse_monsters(coord_def where, int pow, int message) +int disperse_monsters(coord_def where, int pow, int, actor *) { - UNUSED( message ); - const int monster_attacked = mgrd(where); if (monster_attacked == NON_MONSTER) @@ -997,16 +981,12 @@ int disperse_monsters(coord_def where, int pow, int message) void cast_dispersal(int pow) { - if (apply_area_around_square( disperse_monsters, you.pos(), pow ) == 0) - { - mpr( "The air shimmers briefly around you." ); - } + if (apply_area_around_square(disperse_monsters, you.pos(), pow) == 0) + mpr("The air shimmers briefly around you."); } -static int _spell_swap_func(coord_def where, int pow, int message) +static int _spell_swap_func(coord_def where, int pow, int, actor *) { - UNUSED( message ); - int monster_attacked = mgrd(where); if (monster_attacked == NON_MONSTER) @@ -1041,7 +1021,7 @@ static int _spell_swap_func(coord_def where, int pow, int message) void cast_swap(int pow) { - apply_one_neighbouring_square( _spell_swap_func, pow ); + apply_one_neighbouring_square(_spell_swap_func, pow); } static int _make_a_rot_cloud(const coord_def& where, int pow, cloud_type ctype) @@ -1081,10 +1061,8 @@ int make_a_normal_cloud(coord_def where, int pow, int spread_rate, return 1; } -static int _passwall(coord_def where, int pow, int garbage) +static int _passwall(coord_def where, int pow, int, actor *) { - UNUSED( garbage ); - int howdeep = 0; bool done = false; int shallow = 1 + (you.skills[SK_EARTH_MAGIC] / 8); @@ -1160,17 +1138,16 @@ static int _passwall(coord_def where, int pow, int garbage) start_delay( DELAY_PASSWALL, 1 + howdeep, n.x, n.y ); return 1; -} // end passwall() +} void cast_passwall(int pow) { apply_one_neighbouring_square(_passwall, pow); } -static int _intoxicate_monsters(coord_def where, int pow, int garbage) +static int _intoxicate_monsters(coord_def where, int pow, int, actor *) { UNUSED( pow ); - UNUSED( garbage ); int mon = mgrd(where); @@ -1536,11 +1513,9 @@ void cast_fulsome_distillation( int powc ) mpr( "Unfortunately, you can't carry it right now!" ); } -static int _rot_living(coord_def where, int pow, int message) +static int _rot_living(coord_def where, int pow, int, actor *) { - UNUSED( message ); - - int mon = mgrd(where); + const int mon = mgrd(where); int ench; if (mon == NON_MONSTER) @@ -1560,11 +1535,9 @@ static int _rot_living(coord_def where, int pow, int message) return 1; } -static int _rot_undead(coord_def where, int pow, int garbage) +static int _rot_undead(coord_def where, int pow, int, actor *) { - UNUSED( garbage ); - - int mon = mgrd(where); + const int mon = mgrd(where); int ench; if (mon == NON_MONSTER) @@ -1618,10 +1591,8 @@ static int _rot_undead(coord_def where, int pow, int garbage) return 1; } -static int _rot_corpses(coord_def where, int pow, int garbage) +static int _rot_corpses(coord_def where, int pow, int, actor *) { - UNUSED( garbage ); - return _make_a_rot_cloud(where, pow, CLOUD_MIASMA); } @@ -1647,11 +1618,9 @@ void do_monster_rot(int mon) return; } -static int _snake_charm_monsters(coord_def where, int pow, int message) +static int _snake_charm_monsters(coord_def where, int pow, int, actor *) { - UNUSED( message ); - - int mon = mgrd(where); + const int mon = mgrd(where); if (mon == NON_MONSTER || one_chance_in(4) @@ -2394,10 +2363,8 @@ void cast_divine_shield() you.redraw_armour_class = true; } -static int _quadrant_blink(coord_def where, int pow, int garbage) +static int _quadrant_blink(coord_def where, int pow, int, actor *) { - UNUSED( garbage ); - if (where == you.pos()) return (0); diff --git a/crawl-ref/source/spells4.h b/crawl-ref/source/spells4.h index 7996dffac9..c508003df2 100644 --- a/crawl-ref/source/spells4.h +++ b/crawl-ref/source/spells4.h @@ -19,7 +19,7 @@ bool backlight_monsters(coord_def where, int pow, int garbage); int make_a_normal_cloud(coord_def where, int pow, int spread_rate, cloud_type ctype, kill_category, killer_type killer = KILL_NONE); -int disperse_monsters(coord_def where, int pow, int message); +int disperse_monsters(coord_def where, int pow); void cast_bend(int pow); void remove_condensation_shield(); diff --git a/crawl-ref/source/spl-cast.cc b/crawl-ref/source/spl-cast.cc index 8cef3bf1b1..6874c78590 100644 --- a/crawl-ref/source/spl-cast.cc +++ b/crawl-ref/source/spl-cast.cc @@ -1358,7 +1358,7 @@ spret_type your_spells(spell_type spell, int powc, bool allow_fail) break; case SPELL_HOLY_WORD: - holy_word(100, HOLY_WORD_SPELL, you.pos(), true); + holy_word(100, HOLY_WORD_SPELL, you.pos(), true, &you); break; case SPELL_REPEL_UNDEAD: diff --git a/crawl-ref/source/spl-util.cc b/crawl-ref/source/spl-util.cc index be1be5ae5b..b030fe8fca 100644 --- a/crawl-ref/source/spl-util.cc +++ b/crawl-ref/source/spl-util.cc @@ -467,25 +467,27 @@ const char *spell_title(spell_type spell) // Apply a function-pointer to all visible squares // Returns summation of return values from passed in function. -int apply_area_visible( cell_func cf, int power, bool pass_through_trans) +int apply_area_visible(cell_func cf, int power, + bool pass_through_trans, actor *agent) { int rv = 0; for (radius_iterator ri(you.pos(), LOS_RADIUS); ri; ++ri) - if ( pass_through_trans || see_grid_no_trans(*ri) ) - rv += cf(*ri, power, 0); + if (pass_through_trans || see_grid_no_trans(*ri)) + rv += cf(*ri, power, 0, agent); return (rv); } // Applies the effect to all nine squares around/including the target. // Returns summation of return values from passed in function. -int apply_area_square( cell_func cf, const coord_def& where, int power ) +int apply_area_square(cell_func cf, const coord_def& where, int power, + actor *agent) { int rv = 0; for (adjacent_iterator ai(where, false); ai; ++ai) - rv += cf(*ai, power, 0); + rv += cf(*ai, power, 0, agent); return (rv); } @@ -493,20 +495,22 @@ int apply_area_square( cell_func cf, const coord_def& where, int power ) // Applies the effect to the eight squares beside the target. // Returns summation of return values from passed in function. -int apply_area_around_square( cell_func cf, const coord_def& where, int power) +int apply_area_around_square(cell_func cf, const coord_def& where, int power, + actor *agent) { int rv = 0; for (adjacent_iterator ai(where, true); ai; ++ai) - rv += cf(*ai, power, 0); + rv += cf(*ai, power, 0, agent); return (rv); } -// Effect up to max_targs monsters around a point, chosen randomly -// Return varies with the function called; return values will be added up. -int apply_random_around_square( cell_func cf, const coord_def& where, - bool exclude_center, int power, int max_targs ) +// Affect up to max_targs monsters around a point, chosen randomly. +// Return varies with the function called; return values will be added up. +int apply_random_around_square(cell_func cf, const coord_def& where, + bool exclude_center, int power, int max_targs, + actor *agent) { int rv = 0; @@ -514,10 +518,10 @@ int apply_random_around_square( cell_func cf, const coord_def& where, return 0; if (max_targs >= 9 && !exclude_center) - return (apply_area_square( cf, where, power )); + return (apply_area_square(cf, where, power, agent)); if (max_targs >= 8 && exclude_center) - return (apply_area_around_square( cf, where, power )); + return (apply_area_around_square(cf, where, power, agent)); coord_def targs[8]; @@ -600,11 +604,11 @@ int apply_random_around_square( cell_func cf, const coord_def& where, // slot -- but we don't care about them). if (count <= max_targs) { - targs[ count - 1 ] = *ai; + targs[count - 1] = *ai; } else if (x_chance_in_y(max_targs, count)) { - const int pick = random2( max_targs ); + const int pick = random2(max_targs); targs[ pick ] = *ai; } } @@ -618,8 +622,8 @@ int apply_random_around_square( cell_func cf, const coord_def& where, // balance the called function. -- bwr for (int i = 0; i < targs_found; i++) { - ASSERT( !targs[i].origin() ); - rv += cf( targs[i], power, 0 ); + ASSERT(!targs[i].origin()); + rv += cf(targs[i], power, 0, agent); } } @@ -627,12 +631,12 @@ int apply_random_around_square( cell_func cf, const coord_def& where, } // Apply func to one square of player's choice beside the player. -int apply_one_neighbouring_square(cell_func cf, int power) +int apply_one_neighbouring_square(cell_func cf, int power, actor *agent) { dist bmove; mpr("Which direction? [ESC to cancel]", MSGCH_PROMPT); - direction( bmove, DIR_DIR, TARG_ENEMY ); + direction(bmove, DIR_DIR, TARG_ENEMY); if (!bmove.isValid) { @@ -640,7 +644,7 @@ int apply_one_neighbouring_square(cell_func cf, int power) return (-1); } - int rv = cf(you.pos() + bmove.delta, power, 1); + int rv = cf(you.pos() + bmove.delta, power, 1, agent); if (rv == 0) canned_msg(MSG_NOTHING_HAPPENS); @@ -648,14 +652,15 @@ int apply_one_neighbouring_square(cell_func cf, int power) return (rv); } -int apply_area_within_radius( cell_func cf, const coord_def& where, - int pow, int radius, int ctype ) +int apply_area_within_radius(cell_func cf, const coord_def& where, + int pow, int radius, int ctype, + actor *agent) { int rv = 0; - for ( radius_iterator ri(where, radius, false, false); ri; ++ri ) - rv += cf(*ri, pow, ctype); + for (radius_iterator ri(where, radius, false, false); ri; ++ri) + rv += cf(*ri, pow, ctype, agent); return (rv); } diff --git a/crawl-ref/source/spl-util.h b/crawl-ref/source/spl-util.h index 2a916a4b32..0342fcc076 100644 --- a/crawl-ref/source/spl-util.h +++ b/crawl-ref/source/spl-util.h @@ -79,25 +79,34 @@ const char *spell_title(spell_type which_spell); const char* spelltype_short_name( int which_spelltype ); const char* spelltype_long_name( int which_spelltype ); -typedef int cell_func(coord_def where, int pow, int aux); +typedef int cell_func(coord_def where, int pow, int aux, actor *agent); typedef int cloud_func(coord_def where, int pow, int spreadrate, cloud_type type, kill_category whose, killer_type killer); int apply_area_visible(cell_func cf, int power, - bool pass_through_trans = false); + bool pass_through_trans = false, actor *agent = NULL); -int apply_area_square(cell_func cf, const coord_def& where, int power); +int apply_area_square(cell_func cf, const coord_def& where, int power, + actor *agent = NULL); -int apply_area_around_square(cell_func cf, const coord_def& where, int power ); +int apply_area_around_square(cell_func cf, const coord_def& where, int power, + actor *agent = NULL); -int apply_random_around_square( cell_func cf, const coord_def& where, - bool hole_in_middle, int power, int max_targs ); +int apply_random_around_square(cell_func cf, const coord_def& where, + bool hole_in_middle, int power, int max_targs, + actor *agent = NULL); -int apply_one_neighbouring_square(cell_func cf, int power); +int apply_one_neighbouring_square(cell_func cf, int power, actor *agent = NULL); int apply_area_within_radius(cell_func cf, const coord_def& where, - int pow, int radius, int ctype); + int pow, int radius, int ctype, + actor *agent = NULL); + +void apply_area_cloud(cloud_func func, const coord_def& where, + int pow, int number, cloud_type ctype, + kill_category kc, killer_type killer, + int spread_rate = -1); bool spell_direction( dist &spelld, bolt &pbolt, targeting_type restrict = DIR_NONE, @@ -107,11 +116,6 @@ bool spell_direction( dist &spelld, bolt &pbolt, bool may_target_self = false, const char *prompt = NULL, bool cancel_at_self = false ); -void apply_area_cloud(cloud_func func, const coord_def& where, - int pow, int number, cloud_type ctype, - kill_category kc, killer_type killer, - int spread_rate = -1); - const char *spelltype_name(unsigned int which_spelltype); int spell_type2skill (unsigned int which_spelltype); |