1 #include "AppHdr.h"
2 
3 #include "coord.h"
4 
5 #include "state.h"
6 #include "viewgeom.h"
7 
8 //////////////////////////////////////////////////////////////////////////
9 // coord_def
10 
grid_distance(const coord_def & p1,const coord_def & p2)11 int grid_distance(const coord_def& p1, const coord_def& p2)
12 {
13     return (p2 - p1).rdist();
14 }
15 
distance2(const coord_def & p1,const coord_def & p2)16 int distance2(const coord_def& p1, const coord_def& p2)
17 {
18     return (p2 - p1).abs();
19 }
20 
adjacent(const coord_def & p1,const coord_def & p2)21 bool adjacent(const coord_def& p1, const coord_def& p2)
22 {
23     return grid_distance(p1, p2) <= 1;
24 }
25 
map_bounds_with_margin(coord_def p,int margin)26 bool map_bounds_with_margin(coord_def p, int margin)
27 {
28     return p.x >= X_BOUND_1 + margin && p.x <= X_BOUND_2 - margin
29            && p.y >= Y_BOUND_1 + margin && p.y <= Y_BOUND_2 - margin;
30 }
31 
clip(const coord_def & p)32 coord_def clip(const coord_def &p)
33 {
34     if (crawl_state.game_is_arena())
35     {
36         const coord_def &ul = crawl_view.glos1; // Upper left
37         const coord_def &lr = crawl_view.glos2; // Lower right
38         int x = p.x % (lr.x - ul.x + 1);
39         int y = p.y % (lr.y - ul.y + 1);
40         return coord_def(x, y);
41     }
42     int x = abs(p.x) % (GXM - 1) + MAPGEN_BORDER - 1;
43     int y = abs(p.y) % (GYM - 1) + MAPGEN_BORDER - 1;
44     return coord_def(x, y);
45 }
46 
random_in_bounds()47 coord_def random_in_bounds()
48 {
49     if (crawl_state.game_is_arena())
50     {
51         const coord_def &ul = crawl_view.glos1; // Upper left
52         const coord_def &lr = crawl_view.glos2; // Lower right
53         coord_def res;
54         res.x = random_range(ul.x, lr.x - 1);
55         res.y = random_range(ul.y, lr.y - 1);
56         return res;
57     }
58     else
59     {
60         coord_def res;
61         res.x = random_range(MAPGEN_BORDER, GXM - MAPGEN_BORDER - 1);
62         res.y = random_range(MAPGEN_BORDER, GYM - MAPGEN_BORDER - 1);
63         return res;
64     }
65 }
66 
67 // Coordinate system conversions.
68 
player2grid(const coord_def & pc)69 coord_def player2grid(const coord_def &pc)
70 {
71     return pc + you.pos();
72 }
73 
grid2player(const coord_def & gc)74 coord_def grid2player(const coord_def &gc)
75 {
76     return gc - you.pos();
77 }
78 
79 //rotates a coord_def that points to an adjacent square
80 //clockwise (direction > 0), or counter-clockwise (direction < 0)
rotate_adjacent(coord_def vector,int direction)81 coord_def rotate_adjacent(coord_def vector, int direction)
82 {
83     int xn, yn;
84 
85     xn = vector.x - sgn(direction) * vector.y;
86     yn = sgn(direction) * vector.x + vector.y;
87     vector.x = xn;
88     vector.y = yn;
89     return vector.sgn();
90 }
91 
clamp_in_bounds(const coord_def & p)92 coord_def clamp_in_bounds(const coord_def &p)
93 {
94     return coord_def(
95         min(X_BOUND_2 - 1, max(X_BOUND_1 + 1, p.x)),
96         min(Y_BOUND_2 - 1, max(Y_BOUND_1 + 1, p.y)));
97 }
98