1 #include "elevation.h"
2 
3 #include "map/data.h"
4 #include "map/grid.h"
5 
6 static grid_u8 elevation;
7 
map_elevation_at(int grid_offset)8 int map_elevation_at(int grid_offset)
9 {
10     return elevation.items[grid_offset];
11 }
12 
map_elevation_set(int grid_offset,int value)13 void map_elevation_set(int grid_offset, int value)
14 {
15     elevation.items[grid_offset] = value;
16 }
17 
map_elevation_clear(void)18 void map_elevation_clear(void)
19 {
20     map_grid_clear_u8(elevation.items);
21 }
22 
fix_cliff_tiles(int grid_offset)23 static void fix_cliff_tiles(int grid_offset)
24 {
25     // reduce elevation when the surrounding tiles are at least 2 lower
26     int max = elevation.items[grid_offset] - 1;
27     if (elevation.items[grid_offset + map_grid_delta(-1, 0)] < max ||
28         elevation.items[grid_offset + map_grid_delta(0, -1)] < max ||
29         elevation.items[grid_offset + map_grid_delta(1, 0)] < max ||
30         elevation.items[grid_offset + map_grid_delta(0, 1)] < max) {
31         elevation.items[grid_offset]--;
32     }
33 }
34 
map_elevation_remove_cliffs(void)35 void map_elevation_remove_cliffs(void)
36 {
37     // elevation is max 5, so we need 4 passes to fix the lot
38     for (int level = 0; level < 4; level++) {
39         int grid_offset = map_data.start_offset;
40         for (int y = 0; y < map_data.height; y++, grid_offset += map_data.border_size) {
41             for (int x = 0; x < map_data.width; x++, grid_offset++) {
42                 if (elevation.items[grid_offset] > 0) {
43                     fix_cliff_tiles(grid_offset);
44                 }
45             }
46         }
47     }
48 }
49 
map_elevation_save_state(buffer * buf)50 void map_elevation_save_state(buffer *buf)
51 {
52     map_grid_save_state_u8(elevation.items, buf);
53 }
54 
map_elevation_load_state(buffer * buf)55 void map_elevation_load_state(buffer *buf)
56 {
57     map_grid_load_state_u8(elevation.items, buf);
58 }
59