Apply the new ground_level method.
[crawl.git] / crawl-ref / source / actor-los.cc
blob4d1f4faa4084f042e9ecac52cdf7ceb1a5693666
1 #include "AppHdr.h"
3 #include "actor.h"
4 #include "coord.h"
5 #include "losglobal.h"
6 #include "player.h"
7 #include "monster.h"
8 #include "state.h"
9 #include "viewgeom.h"
11 bool actor::observable() const
13 return (crawl_state.game_is_arena() && this != &you
14 || this == &you || you.can_see(this));
17 bool actor::see_cell(const coord_def &p) const
19 if (!in_bounds(pos()))
20 return (false); // actor is off the map
22 return (cell_see_cell(pos(), p, LOS_DEFAULT));
25 bool player::see_cell(const coord_def &p) const
27 if (!map_bounds(p))
28 return (false);
29 if (crawl_state.game_is_arena() && this == &you)
30 return (true);
31 if (xray_vision)
32 return ((pos() - p).abs() <= dist_range(you.current_vision));
33 return (actor::see_cell(p));
36 bool actor::can_see(const actor *target) const
38 return (target->visible_to(this) && see_cell(target->pos()));
41 bool actor::see_cell_no_trans(const coord_def &p) const
43 return (cell_see_cell(pos(), p, LOS_NO_TRANS));
46 bool player::trans_wall_blocking(const coord_def &p) const
48 return (see_cell(p) && !see_cell_no_trans(p));
51 const los_base* actor::get_los()
53 los = los_glob(pos(), LOS_DEFAULT);
54 return (&los);
57 const los_base* player::get_los()
59 if (crawl_state.game_is_arena() && this == &you)
61 // env.show.init iterates over these bounds for arena
62 los = los_glob(crawl_view.vgrdc, LOS_ARENA,
63 circle_def(LOS_MAX_RANGE, C_SQUARE));
64 return (&los);
66 else if (xray_vision)
68 los = los_glob(pos(), LOS_ARENA,
69 circle_def(you.current_vision, C_ROUND));
70 return (&los);
72 else
73 return (actor::get_los());
76 const los_base* actor::get_los_no_trans()
78 los_no_trans = los_glob(pos(), LOS_NO_TRANS);
79 return (&los_no_trans);
82 bool player::can_see(const actor* a) const
84 if (crawl_state.game_is_arena() || crawl_state.arena_suspended)
85 return (see_cell(a->pos()));
86 else if (xray_vision)
87 return see_cell(a->pos());
88 else
89 return (actor::can_see(a));