1 #include "property.h"
2
3 #include "map/grid.h"
4 #include "map/random.h"
5
6 enum {
7 BIT_SIZE1 = 0x00,
8 BIT_SIZE2 = 0x01,
9 BIT_SIZE3 = 0x02,
10 BIT_SIZE4 = 0x04,
11 BIT_SIZE5 = 0x08,
12 BIT_SIZE7 = 0x0f,
13 BIT_SIZES = 0x0f,
14 BIT_NO_SIZES = 0xf0,
15 BIT_CONSTRUCTION = 0x10,
16 BIT_NO_CONSTRUCTION = 0xef,
17 BIT_ALTERNATE_TERRAIN = 0x20,
18 BIT_DELETED = 0x40,
19 BIT_NO_DELETED = 0xbf,
20 BIT_PLAZA_OR_EARTHQUAKE = 0x80,
21 BIT_NO_PLAZA = 0x7f,
22 BIT_NO_CONSTRUCTION_AND_DELETED = 0xaf,
23 EDGE_MASK_X = 0x7,
24 EDGE_MASK_Y = 0x38,
25 EDGE_MASK_XY = 0x3f,
26 EDGE_LEFTMOST_TILE = 0x40,
27 EDGE_NO_LEFTMOST_TILE = 0xbf,
28 EDGE_NATIVE_LAND = 0x80,
29 EDGE_NO_NATIVE_LAND = 0x7f,
30 };
31
32 static grid_u8 edge_grid;
33 static grid_u8 bitfields_grid;
34
35 static grid_u8 edge_backup;
36 static grid_u8 bitfields_backup;
37
edge_for(int x,int y)38 static int edge_for(int x, int y)
39 {
40 return 8 * y + x;
41 }
42
map_property_is_draw_tile(int grid_offset)43 int map_property_is_draw_tile(int grid_offset)
44 {
45 return edge_grid.items[grid_offset] & EDGE_LEFTMOST_TILE;
46 }
47
map_property_mark_draw_tile(int grid_offset)48 void map_property_mark_draw_tile(int grid_offset)
49 {
50 edge_grid.items[grid_offset] |= EDGE_LEFTMOST_TILE;
51 }
52
map_property_clear_draw_tile(int grid_offset)53 void map_property_clear_draw_tile(int grid_offset)
54 {
55 edge_grid.items[grid_offset] &= ~EDGE_LEFTMOST_TILE;
56 }
57
map_property_is_native_land(int grid_offset)58 int map_property_is_native_land(int grid_offset)
59 {
60 return edge_grid.items[grid_offset] & EDGE_NATIVE_LAND;
61 }
62
map_property_mark_native_land(int grid_offset)63 void map_property_mark_native_land(int grid_offset)
64 {
65 edge_grid.items[grid_offset] |= EDGE_NATIVE_LAND;
66 }
67
map_property_clear_all_native_land(void)68 void map_property_clear_all_native_land(void)
69 {
70 map_grid_and_u8(edge_grid.items, EDGE_NO_NATIVE_LAND);
71 }
72
map_property_multi_tile_xy(int grid_offset)73 int map_property_multi_tile_xy(int grid_offset)
74 {
75 return edge_grid.items[grid_offset] & EDGE_MASK_XY;
76 }
77
map_property_multi_tile_x(int grid_offset)78 int map_property_multi_tile_x(int grid_offset)
79 {
80 return edge_grid.items[grid_offset] & EDGE_MASK_X;
81 }
82
map_property_multi_tile_y(int grid_offset)83 int map_property_multi_tile_y(int grid_offset)
84 {
85 return edge_grid.items[grid_offset] & EDGE_MASK_Y;
86 }
87
map_property_is_multi_tile_xy(int grid_offset,int x,int y)88 int map_property_is_multi_tile_xy(int grid_offset, int x, int y)
89 {
90 return (edge_grid.items[grid_offset] & EDGE_MASK_XY) == edge_for(x, y);
91 }
92
map_property_set_multi_tile_xy(int grid_offset,int x,int y,int is_draw_tile)93 void map_property_set_multi_tile_xy(int grid_offset, int x, int y, int is_draw_tile)
94 {
95 if (is_draw_tile) {
96 edge_grid.items[grid_offset] = edge_for(x, y) | EDGE_LEFTMOST_TILE;
97 } else {
98 edge_grid.items[grid_offset] = edge_for(x, y);
99 }
100 }
101
map_property_clear_multi_tile_xy(int grid_offset)102 void map_property_clear_multi_tile_xy(int grid_offset)
103 {
104 // only keep native land marker
105 edge_grid.items[grid_offset] &= EDGE_NATIVE_LAND;
106 }
107
map_property_multi_tile_size(int grid_offset)108 int map_property_multi_tile_size(int grid_offset)
109 {
110 switch (bitfields_grid.items[grid_offset] & BIT_SIZES) {
111 case BIT_SIZE2: return 2;
112 case BIT_SIZE3: return 3;
113 case BIT_SIZE4: return 4;
114 case BIT_SIZE5: return 5;
115 case BIT_SIZE7: return 7;
116 default: return 1;
117 }
118 }
119
map_property_set_multi_tile_size(int grid_offset,int size)120 void map_property_set_multi_tile_size(int grid_offset, int size)
121 {
122 bitfields_grid.items[grid_offset] &= BIT_NO_SIZES;
123 switch (size) {
124 case 2: bitfields_grid.items[grid_offset] |= BIT_SIZE2; break;
125 case 3: bitfields_grid.items[grid_offset] |= BIT_SIZE3; break;
126 case 4: bitfields_grid.items[grid_offset] |= BIT_SIZE4; break;
127 case 5: bitfields_grid.items[grid_offset] |= BIT_SIZE5; break;
128 case 7: bitfields_grid.items[grid_offset] |= BIT_SIZE7; break;
129
130 }
131 }
132
map_property_init_alternate_terrain(void)133 void map_property_init_alternate_terrain(void)
134 {
135 int map_width, map_height;
136 map_grid_size(&map_width, &map_height);
137 for (int y = 0; y < map_height; y++) {
138 for (int x = 0; x < map_width; x++) {
139 int grid_offset = map_grid_offset(x, y);
140 if (map_random_get(grid_offset) & 1) {
141 bitfields_grid.items[grid_offset] |= BIT_ALTERNATE_TERRAIN;
142 }
143 }
144 }
145 }
146
map_property_is_alternate_terrain(int grid_offset)147 int map_property_is_alternate_terrain(int grid_offset)
148 {
149 return bitfields_grid.items[grid_offset] & BIT_ALTERNATE_TERRAIN;
150 }
151
map_property_is_plaza_or_earthquake(int grid_offset)152 int map_property_is_plaza_or_earthquake(int grid_offset)
153 {
154 return bitfields_grid.items[grid_offset] & BIT_PLAZA_OR_EARTHQUAKE;
155 }
156
map_property_mark_plaza_or_earthquake(int grid_offset)157 void map_property_mark_plaza_or_earthquake(int grid_offset)
158 {
159 bitfields_grid.items[grid_offset] |= BIT_PLAZA_OR_EARTHQUAKE;
160 }
161
map_property_clear_plaza_or_earthquake(int grid_offset)162 void map_property_clear_plaza_or_earthquake(int grid_offset)
163 {
164 bitfields_grid.items[grid_offset] &= BIT_NO_PLAZA;
165 }
166
map_property_is_constructing(int grid_offset)167 int map_property_is_constructing(int grid_offset)
168 {
169 return bitfields_grid.items[grid_offset] & BIT_CONSTRUCTION;
170 }
171
map_property_mark_constructing(int grid_offset)172 void map_property_mark_constructing(int grid_offset)
173 {
174 bitfields_grid.items[grid_offset] |= BIT_CONSTRUCTION;
175 }
176
map_property_clear_constructing(int grid_offset)177 void map_property_clear_constructing(int grid_offset)
178 {
179 bitfields_grid.items[grid_offset] &= BIT_NO_CONSTRUCTION;
180 }
181
map_property_is_deleted(int grid_offset)182 int map_property_is_deleted(int grid_offset)
183 {
184 return bitfields_grid.items[grid_offset] & BIT_DELETED;
185 }
186
map_property_mark_deleted(int grid_offset)187 void map_property_mark_deleted(int grid_offset)
188 {
189 bitfields_grid.items[grid_offset] |= BIT_DELETED;
190 }
191
map_property_clear_deleted(int grid_offset)192 void map_property_clear_deleted(int grid_offset)
193 {
194 bitfields_grid.items[grid_offset] &= BIT_NO_DELETED;
195 }
196
map_property_clear_constructing_and_deleted(void)197 void map_property_clear_constructing_and_deleted(void)
198 {
199 map_grid_and_u8(bitfields_grid.items, BIT_NO_CONSTRUCTION_AND_DELETED);
200 }
201
map_property_clear(void)202 void map_property_clear(void)
203 {
204 map_grid_clear_u8(bitfields_grid.items);
205 map_grid_clear_u8(edge_grid.items);
206 }
207
map_property_backup(void)208 void map_property_backup(void)
209 {
210 map_grid_copy_u8(bitfields_grid.items, bitfields_backup.items);
211 map_grid_copy_u8(edge_grid.items, edge_backup.items);
212 }
213
map_property_restore(void)214 void map_property_restore(void)
215 {
216 map_grid_copy_u8(bitfields_backup.items, bitfields_grid.items);
217 map_grid_copy_u8(edge_backup.items, edge_grid.items);
218 }
219
map_property_save_state(buffer * bitfields,buffer * edge)220 void map_property_save_state(buffer *bitfields, buffer *edge)
221 {
222 map_grid_save_state_u8(bitfields_grid.items, bitfields);
223 map_grid_save_state_u8(edge_grid.items, edge);
224 }
225
map_property_load_state(buffer * bitfields,buffer * edge)226 void map_property_load_state(buffer *bitfields, buffer *edge)
227 {
228 map_grid_load_state_u8(bitfields_grid.items, bitfields);
229 map_grid_load_state_u8(edge_grid.items, edge);
230 }
231