1 /**********************************************************************
2 Freeciv - Copyright (C) 2004 - Marcelo J. Burda
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2, or (at your option)
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12 ***********************************************************************/
13 #ifndef FC__UTILITIES_H
14 #define FC__UTILITIES_H
16 typedef void (*tile_knowledge_cb
)(struct tile
*ptile
);
18 #define MG_UNUSED mapgen_terrain_property_invalid()
20 void generator_free(void);
22 void regenerate_lakes(void);
23 void smooth_water_depth(void);
24 void assign_continent_numbers(void);
25 int get_lake_surrounders(Continent_id cont
);
26 int get_continent_size(Continent_id id
);
27 int get_ocean_size(Continent_id id
);
29 struct terrain
*most_shallow_ocean(bool frozen
);
30 struct terrain
*pick_ocean(int depth
, bool frozen
);
32 struct terrain
*pick_terrain_by_flag(enum terrain_flag_id flag
);
33 struct terrain
*pick_terrain(enum mapgen_terrain_property target
,
34 enum mapgen_terrain_property prefer
,
35 enum mapgen_terrain_property avoid
);
37 /* Provide a block to convert from native to map coordinates. For instance
38 * do_in_map_pos(mx, my, xn, yn) {
39 * tile_set_terrain(mx, my, T_OCEAN);
40 * } do_in_map_pos_end;
41 * Note: that the map position is declared as const and can't be changed
44 #define do_in_map_pos(ptile, nat_x, nat_y) \
46 struct tile *ptile = native_pos_to_tile((nat_x), (nat_y)); \
49 #define do_in_map_pos_end \
53 /***************************************************************************
54 iterate on selected axe (x if is_X_axis is TRUE) over a interval of -dist
55 to dist around the center_tile
56 _index : the position in the interval of iteration (from -dist to dist)
57 _tile : the tile pointer
58 ***************************************************************************/
59 #define axis_iterate(center_tile, _tile, _index, dist, is_X_axis) \
61 int _tile##_x, _tile##_y; \
63 const struct tile *_tile##_center = (center_tile); \
64 const bool _index##_axis = (is_X_axis); \
65 const int _index##_d = (dist); \
66 int _index = -(_index##_d); \
68 for (; _index <= _index##_d; _index++) { \
69 int _nat##_x, _nat##_y; \
70 index_to_native_pos(&_nat##_x, &_nat##_y, tile_index(_tile##_center)); \
71 _tile##_x = _nat##_x + (_index##_axis ? _index : 0); \
72 _tile##_y = _nat##_y + (_index##_axis ? 0 : _index); \
73 _tile = native_pos_to_tile(_tile##_x, _tile##_y); \
76 #define axis_iterate_end \
81 /***************************************************************************
82 pdata or pfilter can be NULL!
83 ***************************************************************************/
84 #define whole_map_iterate_filtered(_tile, pdata, pfilter) \
86 bool (*_tile##_filter)(const struct tile *vtile, const void *vdata) = (pfilter);\
87 const void *_tile##_data = (pdata); \
89 whole_map_iterate(_tile) { \
90 if (NULL == _tile##_filter || (_tile##_filter)(_tile, _tile##_data)) {
92 #define whole_map_iterate_filtered_end \
94 } whole_map_iterate_end; \
97 bool is_normal_nat_pos(int x
, int y
);
100 void adjust_int_map_filtered(int *int_map
, int int_map_max
, void *data
,
101 bool (*filter
)(const struct tile
*ptile
,
103 #define adjust_int_map(int_map, int_map_max) \
104 adjust_int_map_filtered(int_map, int_map_max, (void *)NULL, \
105 (bool (*)(const struct tile *ptile, const void *data) )NULL)
106 void smooth_int_map(int *int_map
, bool zeroes_at_edges
);
109 void create_placed_map(void);
110 void destroy_placed_map(void);
111 void map_set_placed(struct tile
*ptile
);
112 void map_unset_placed(struct tile
*ptile
);
113 bool not_placed(const struct tile
*ptile
);
114 bool placed_map_is_initialized(void);
115 void set_all_ocean_tiles_placed(void) ;
116 void set_placed_near_pos(struct tile
*ptile
, int dist
);
120 #endif /* FC__UTILITIES_H */