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