1 #include "AppHdr.h"
2 
3 #include "actor.h"
4 
5 #include "coord.h"
6 #include "god-passive.h"
7 #include "los-type.h"
8 #include "losglobal.h"
9 #include "state.h"
10 
observable() const11 bool actor::observable() const
12 {
13     return crawl_state.game_is_arena() || is_player() || you.can_see(*this);
14 }
15 
see_cell(const coord_def & p) const16 bool actor::see_cell(const coord_def &p) const
17 {
18     if (!in_bounds(pos()))
19         return false; // actor is off the map
20 
21     return cell_see_cell(pos(), p, LOS_DEFAULT);
22 }
23 
see_cell(const coord_def & p) const24 bool player::see_cell(const coord_def &p) const
25 {
26     if (!map_bounds(p))
27         return false; // Players can't see (-1,-1) but maybe can see (0,0).
28     if (crawl_state.game_is_arena() || crawl_state.arena_suspended)
29         return true;
30     if (!in_bounds(pos()))
31         return false; // A non-arena player at (0,0) can't see anything.
32     if (wizard_vision)
33         return (pos() - p).rdist() <= current_vision;
34     if (have_passive(passive_t::xray_vision))
35         return (pos() - p).rdist() <= ash_scry_radius() || actor::see_cell(p);
36     return actor::see_cell(p);
37 }
38 
can_see(const actor & target) const39 bool actor::can_see(const actor &target) const
40 {
41     return target.visible_to(this) && see_cell(target.pos());
42 }
43 
see_cell_no_trans(const coord_def & p) const44 bool actor::see_cell_no_trans(const coord_def &p) const
45 {
46     return cell_see_cell(pos(), p, LOS_NO_TRANS);
47 }
48 
trans_wall_blocking(const coord_def & p) const49 bool player::trans_wall_blocking(const coord_def &p) const
50 {
51     return see_cell(p) && !see_cell_no_trans(p);
52 }
53 
can_see(const actor & a) const54 bool player::can_see(const actor& a) const
55 {
56     if (crawl_state.game_is_arena() || crawl_state.arena_suspended)
57         return see_cell(a.pos());
58     else
59         return actor::can_see(a);
60 }
61