diff options
Diffstat (limited to 'crawl-ref/source/mon-iter.cc')
-rw-r--r-- | crawl-ref/source/mon-iter.cc | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/crawl-ref/source/mon-iter.cc b/crawl-ref/source/mon-iter.cc new file mode 100644 index 0000000000..1158a9028d --- /dev/null +++ b/crawl-ref/source/mon-iter.cc @@ -0,0 +1,87 @@ +#include "AppHdr.h" + +#include "mon-iter.h" + +#include "actor.h" +#include "coord-circle.h" +#include "env.h" +#include "monster.h" + +monster_iterator::monster_iterator() + : restr(R_NONE), curr_mid(0) +{ + advance(true); +} + +monster_iterator::monster_iterator(const circle_def* circle_) + : restr(R_CIRC), curr_mid(0), circle(circle_) +{ + advance(true); +} + +monster_iterator::monster_iterator(const los_def* los_) + : restr(R_LOS), curr_mid(0), los(los_) +{ + advance(true); +} + +monster_iterator::monster_iterator(const actor* act_) + : restr(R_ACT), curr_mid(0), act(act_) +{ + advance(true); +} + +monster_iterator::operator bool() const +{ + return (curr_mid < MAX_MONSTERS); +} + +monsters* monster_iterator::operator*() const +{ + return (&env.mons[curr_mid]); +} + +monsters* monster_iterator::operator->() const +{ + return (&env.mons[curr_mid]); +} + +monster_iterator& monster_iterator::operator++() +{ + advance(); + return (*this); +} + +monster_iterator monster_iterator::operator++(int) +{ + monster_iterator copy = *this; + ++(*this); + return (copy); +} + +bool monster_iterator::valid(int mid) const +{ + monsters* mon = &env.mons[mid]; + if (!mon->alive()) + return (false); + switch (restr) + { + case R_CIRC: + return (circle->contains(mon->pos())); + case R_LOS: + return (los->see_cell(mon->pos())); + case R_ACT: + return (act->can_see(mon)); + default: + return (true); + } +} + +void monster_iterator::advance(bool may_stay) +{ + if (!may_stay) + ++curr_mid; + while (curr_mid < MAX_MONSTERS && !valid(curr_mid)) + ++curr_mid; +} + |