blob: 1158a9028d152384b90cfce09da9938a32c531de (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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;
}
|