1 #include "koord.h"
2 #include "loadsave.h"
3 #include "../display/scr_coord.h"
4 #include "../utils/simrandom.h"
5 #include "../simconst.h"
6
7
8 // default: close and far away does not matter
9 uint32 koord::locality_factor = 10000;
10
11
12 const scr_coord scr_coord::invalid(-1, -1);
13
14 const scr_size scr_size::invalid(-1, -1);
15 const scr_size scr_size::inf(0x7fffffff, 0x7fffffff);
16
17 const koord koord::invalid(-1, -1);
18 const koord koord::north( 0, -1);
19 const koord koord::east( 1, 0);
20 const koord koord::south( 0, 1);
21 const koord koord::west( -1, 0);
22 const koord koord::nsew[] = {
23 koord( 0, -1),
24 koord( 0, 1),
25 koord( 1, 0),
26 koord(-1, 0)
27 };
28
29 const koord koord::neighbours[] = {
30 koord( -1, -1),
31 koord( -1, 0 ),
32 koord( -1, 1 ),
33 koord( 0, 1 ),
34 koord( 1, 1 ),
35 koord( 1, 0 ),
36 koord( 1, -1 ),
37 koord( 0, -1 )
38 };
39
40 const koord koord::from_ribi[] = {
41 koord( 0, 0), // none
42 koord( 0, -1), // north (1)
43 koord( 1, 0), // east (2)
44 koord( 1, -1), // north-east (3)
45 koord( 0, 1), // south (4)
46 koord( 0, 0), // north-south (5)
47 koord( 1, 1), // south-east (6)
48 koord( 1, 0), // north-south-east (7)
49 koord(-1, 0), // west (8)
50 koord(-1, -1), // north-west (9)
51 koord( 0, 0), // east-west (10)
52 koord( 0, -1), // north-east-west (11)
53 koord(-1, 1), // south-west (12)
54 koord(-1, 0), // north-south-west (13)
55 koord( 0, 1), // south-east-west (14)
56 koord( 0, 0) // all
57 };
58
59 const koord koord::from_hang[] = {
60 koord( 0, 0), // 0:flat
61 koord( 0, 0), // 1:
62 koord( 0, 0), // 2:
63 koord( 0, 0), // 3:
64 koord( 0, 1), // 4:north single height slope
65 koord( 0, 0), // 5:
66 koord( 0, 0), // 6:
67 koord( 0, 0), // 7:
68 koord( 0, 1), // 8:north double height slope
69 koord( 0, 0), // 9:
70 koord( 0, 0), // 10:
71 koord( 0, 0), // 11:
72 koord( 1, 0), // 12:west single height slope
73 koord( 0, 0), // 13:
74 koord( 0, 0), // 14:
75 koord( 0, 0), // 15:
76 koord( 0, 0), // 16:
77 koord( 0, 0), // 17:
78 koord( 0, 0), // 18:
79 koord( 0, 0), // 19:
80 koord( 0, 0), // 20:
81 koord( 0, 0), // 21:
82 koord( 0, 0), // 22:
83 koord( 0, 0), // 23:
84 koord( 1, 0), // 24:west double height slope
85 koord( 0, 0), // 25:
86 koord( 0, 0), // 26:
87 koord( 0, 0), // 27:
88 koord(-1, 0), // 28:east single height slope
89 koord( 0, 0), // 29:
90 koord( 0, 0), // 30:
91 koord( 0, 0), // 31:
92 koord( 0, 0), // 32:
93 koord( 0, 0), // 33:
94 koord( 0, 0), // 34:
95 koord( 0, 0), // 35:
96 koord( 0, -1), // 36:south single height slope
97 koord( 0, 0), // 37:
98 koord( 0, 0), // 38:
99 koord( 0, 0), // 39:
100 koord( 0, 0), // 40:
101 koord( 0, 0), // 41:
102 koord( 0, 0), // 42:
103 koord( 0, 0), // 43:
104 koord( 0, 0), // 44:
105 koord( 0, 0), // 45:
106 koord( 0, 0), // 46:
107 koord( 0, 0), // 47:
108 koord( 0, 0), // 48:
109 koord( 0, 0), // 49:
110 koord( 0, 0), // 50:
111 koord( 0, 0), // 51:
112 koord( 0, 0), // 52:
113 koord( 0, 0), // 53:
114 koord( 0, 0), // 54:
115 koord( 0, 0), // 55:
116 koord(-1, 0), // 56:east double height slope
117 koord( 0, 0), // 57:
118 koord( 0, 0), // 58:
119 koord( 0, 0), // 59:
120 koord( 0, 0), // 60:
121 koord( 0, 0), // 61:
122 koord( 0, 0), // 62:
123 koord( 0, 0), // 63:
124 koord( 0, 0), // 64:
125 koord( 0, 0), // 65:
126 koord( 0, 0), // 66:
127 koord( 0, 0), // 67:
128 koord( 0, 0), // 68:
129 koord( 0, 0), // 69:
130 koord( 0, 0), // 70:
131 koord( 0, 0), // 71:
132 koord( 0, -1), // 72:south double height slope
133 koord( 0, 0), // 73:
134 koord( 0, 0), // 74:
135 koord( 0, 0), // 75:
136 koord( 0, 0), // 76:
137 koord( 0, 0), // 77:
138 koord( 0, 0), // 78:
139 koord( 0, 0), // 79:
140 koord( 0, 0) // 80:
141 };
142
143
rdwr(loadsave_t * file)144 void koord::rdwr(loadsave_t *file)
145 {
146 xml_tag_t k( file, "koord" );
147 file->rdwr_short(x);
148 file->rdwr_short(y);
149 }
150
151
152 // for debug messages...
get_str() const153 const char *koord::get_str() const
154 {
155 static char pos_str[32];
156 if(x==-1 && y==-1) {
157 return "koord invalid";
158 }
159 sprintf( pos_str, "%i,%i", x, y );
160 return pos_str;
161 }
162
163
get_fullstr() const164 const char *koord::get_fullstr() const
165 {
166 static char pos_str[32];
167 if(x==-1 && y==-1) {
168 return "koord invalid";
169 }
170 sprintf( pos_str, "(%i,%i)", x, y );
171 return pos_str;
172 }
173
174 // obey order of simrand among different compilers
koord_random(uint16 xrange,uint16 yrange)175 koord koord::koord_random( uint16 xrange, uint16 yrange )
176 {
177 koord ret;
178 ret.x = simrand(xrange);
179 ret.y = simrand(yrange);
180 return ret;
181 }
182