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