summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/xom.cc
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/xom.cc')
-rw-r--r--crawl-ref/source/xom.cc82
1 files changed, 25 insertions, 57 deletions
diff --git a/crawl-ref/source/xom.cc b/crawl-ref/source/xom.cc
index 91d006d747..34f8392ee6 100644
--- a/crawl-ref/source/xom.cc
+++ b/crawl-ref/source/xom.cc
@@ -26,6 +26,7 @@
#include "message.h"
#include "misc.h"
#include "mon-behv.h"
+#include "mon-iter.h"
#include "mon-util.h"
#include "monplace.h"
#include "monstuff.h"
@@ -1197,14 +1198,10 @@ static int _xom_do_potion(bool debug = false)
static int _xom_confuse_monsters(int sever, bool debug = false)
{
bool rc = false;
- monsters *monster;
- for (unsigned i = 0; i < MAX_MONSTERS; ++i)
+ for (monster_iterator mi(&you.get_los()); mi; ++mi)
{
- monster = &menv[i];
-
- if (monster->type == MONS_NO_MONSTER || !mons_near(monster)
- || monster->wont_attack()
- || !mons_class_is_confusable(monster->type)
+ if (mi->wont_attack()
+ || !mons_class_is_confusable(mi->type)
|| one_chance_in(20))
{
continue;
@@ -1213,14 +1210,14 @@ static int _xom_confuse_monsters(int sever, bool debug = false)
if (debug)
return (XOM_GOOD_CONFUSION);
- if (monster->add_ench(mon_enchant(ENCH_CONFUSION, 0,
+ if (mi->add_ench(mon_enchant(ENCH_CONFUSION, 0,
KC_FRIENDLY, random2(sever))))
{
// Only give this message once.
if (!rc)
god_speaks(GOD_XOM, _get_xom_speech("confusion").c_str());
- simple_monster_message(monster, " looks rather confused.");
+ simple_monster_message(*mi, " looks rather confused.");
rc = true;
}
}
@@ -1541,24 +1538,16 @@ static int _xom_swap_weapons(bool debug = false)
}
std::vector<monsters *> mons_wpn;
- for (unsigned i = 0; i < MAX_MONSTERS; ++i)
+ for (monster_iterator mi(&you); mi; ++mi)
{
- monsters* m = &menv[i];
-
- if (!m->alive())
- continue;
-
- if (!you.see_cell(m->pos()))
- continue;
-
- if (!wpn || m->wont_attack() || m->is_summoned()
- || mons_itemuse(m) < MONUSE_STARTING_EQUIPMENT
- || (m->flags & MF_HARD_RESET))
+ if (!wpn || mi->wont_attack() || mi->is_summoned()
+ || mons_itemuse(*mi) < MONUSE_STARTING_EQUIPMENT
+ || (mi->flags & MF_HARD_RESET))
{
continue;
}
- const int mweap = m->inv[MSLOT_WEAPON];
+ const int mweap = mi->inv[MSLOT_WEAPON];
if (mweap == NON_ITEM)
continue;
@@ -1567,11 +1556,11 @@ static int _xom_swap_weapons(bool debug = false)
// Let's be nice about this.
if (weapon.base_type == OBJ_WEAPONS
&& !(weapon.flags & ISFLAG_SUMMONED)
- && you.can_wield(weapon, true) && m->can_wield(*wpn, true)
+ && you.can_wield(weapon, true) && mi->can_wield(*wpn, true)
&& !get_weapon_brand(weapon) != SPWPN_DISTORTION
&& (!is_artefact(weapon) || _art_is_safe(weapon)))
{
- mons_wpn.push_back(m);
+ mons_wpn.push_back(*mi);
}
}
if (mons_wpn.empty())
@@ -1677,18 +1666,9 @@ static int _xom_rearrange_pieces(int sever, bool debug = false)
return (XOM_DID_NOTHING);
std::vector<monsters *> mons;
- for (unsigned i = 0; i < MAX_MONSTERS; ++i)
- {
- monsters* m = &menv[i];
-
- if (!m->alive())
- continue;
+ for (monster_iterator mi(&you); mi; ++mi)
+ mons.push_back(*mi);
- if (!you.see_cell(m->pos()))
- continue;
-
- mons.push_back(m);
- }
if (mons.empty())
return (XOM_DID_NOTHING);
@@ -1741,24 +1721,16 @@ static int _xom_rearrange_pieces(int sever, bool debug = false)
static int _xom_animate_monster_weapon(int sever, bool debug = false)
{
std::vector<monsters *> mons_wpn;
- for (unsigned i = 0; i < MAX_MONSTERS; ++i)
+ for (monster_iterator mi(&you); mi; ++mi)
{
- monsters* m = &menv[i];
-
- if (!m->alive())
- continue;
-
- if (!you.see_cell(m->pos()))
- continue;
-
- if (m->wont_attack() || m->is_summoned()
- || mons_itemuse(m) < MONUSE_STARTING_EQUIPMENT
- || (m->flags & MF_HARD_RESET))
+ if (mi->wont_attack() || mi->is_summoned()
+ || mons_itemuse(*mi) < MONUSE_STARTING_EQUIPMENT
+ || (mi->flags & MF_HARD_RESET))
{
continue;
}
- const int mweap = m->inv[MSLOT_WEAPON];
+ const int mweap = mi->inv[MSLOT_WEAPON];
if (mweap == NON_ITEM)
continue;
@@ -1771,7 +1743,7 @@ static int _xom_animate_monster_weapon(int sever, bool debug = false)
&& !is_special_unrandom_artefact(weapon)
&& !get_weapon_brand(weapon) != SPWPN_DISTORTION)
{
- mons_wpn.push_back(m);
+ mons_wpn.push_back(*mi);
}
}
if (mons_wpn.empty())
@@ -2846,22 +2818,18 @@ static int _xom_player_confusion_effect(int sever, bool debug = false)
bool mons_too = false;
if (coinflip())
{
- for (unsigned i = 0; i < MAX_MONSTERS; ++i)
+ for (monster_iterator mi(&you.get_los()); mi; ++mi)
{
- monsters* const monster = &menv[i];
-
- if (!monster->alive()
- || !mons_near(monster)
- || !mons_class_is_confusable(monster->type)
+ if (!mons_class_is_confusable(mi->type)
|| one_chance_in(20))
{
continue;
}
- if (monster->add_ench(mon_enchant(ENCH_CONFUSION, 0,
+ if (mi->add_ench(mon_enchant(ENCH_CONFUSION, 0,
KC_FRIENDLY, random2(sever))))
{
- simple_monster_message(monster,
+ simple_monster_message(*mi,
" looks rather confused.");
}
mons_too = true;