Freeciv-3.3
Loading...
Searching...
No Matches
terrain.h
Go to the documentation of this file.
1/***********************************************************************
2 Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
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)
6 any later version.
7
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__TERRAIN_H
14#define FC__TERRAIN_H
15
16#ifdef __cplusplus
17extern "C" {
18#endif /* __cplusplus */
19
20/* utility */
21#include "bitvector.h"
22#include "shared.h"
23
24/* common */
25#include "fc_types.h"
26#include "name_translation.h"
27#include "unittype.h"
28
29/* gen_headers/enums */
30#include "terrain_enums_gen.h"
31
32#define MAX_NUM_USER_TER_FLAGS (TER_USER_LAST - TER_USER_1 + 1)
33
34struct base_type;
35struct strvec; /* Actually defined in "utility/string_vector.h". */
36struct rgbcolor;
37
38/* Used in the network protocol. */
45
46/* === */
47
49
50 char id_old_save; /* Single-character identifier used in old savegames. */
51#define RESOURCE_NULL_IDENTIFIER '\0'
52#define RESOURCE_NONE_IDENTIFIER ' '
53
54 int output[O_LAST]; /* Amount added by this resource. */
55
57};
58
59/* === */
60
61#define T_NONE (NULL) /* A special flag meaning no terrain type. */
62#define T_UNKNOWN (NULL) /* An unknown terrain. */
63
64/* The first terrain value. */
65#define T_FIRST 0
66
67/* A hard limit on the number of terrains; useful for static arrays.
68 * Used in the network protocol. */
69#define MAX_NUM_TERRAINS (96)
70
71/*
72 * This struct gives data about each terrain type. There are many ways
73 * it could be extended.
74 */
75struct terrain {
78 bool ruledit_disabled; /* Does not really exist - hole in terrain array */
83
84 char identifier; /* Single-character identifier used in games saved. */
85 char identifier_load; /* Single-character identifier that was used in the savegame
86 * loaded. */
87
88#define TERRAIN_UNKNOWN_IDENTIFIER 'u'
89
91
92 int movement_cost; /* whole MP, not scaled by SINGLE_MOVE */
93 int defense_bonus; /* % defense bonus - defaults to zero */
94
96
97 struct extra_type **resources; /* NULL-terminated */
98 int *resource_freq; /* same length as resources */
99
100#define RESOURCE_FREQUENCY_MINIMUM (0)
101#define RESOURCE_FREQUENCY_DEFAULT (1)
102#define RESOURCE_FREQUENCY_MAXIMUM (255)
103
107
110
113
116
119
121
123
126
127 /* Currently only clean times, but named for future */
129
131 const struct unit_type **animals;
132
133 /* May be NULL if the transformation is impossible. */
136
137 /* These are special properties of the terrain used by mapgen. If a tile
138 * has a property, then the value gives the weighted amount of tiles that
139 * will be assigned this terrain.
140 *
141 * For instance if mountains have 70 and hills have 30 of MG_MOUNTAINOUS
142 * then 70% of 'mountainous' tiles will be given mountains.
143 *
144 * Ocean_depth is different. Instead of a percentage, the depth of the
145 * tile in the range 0 (never chosen) to 100 (deepest) is used.
146 */
147 int property[MG_COUNT];
148#define TERRAIN_OCEAN_DEPTH_MINIMUM (1)
149#define TERRAIN_OCEAN_DEPTH_MAXIMUM (100)
150
152
154
155 struct rgbcolor *rgb;
156
158};
159
160/* General terrain accessor functions. */
162Terrain_type_id terrain_index(const struct terrain *pterrain);
163Terrain_type_id terrain_number(const struct terrain *pterrain);
164
166
167struct terrain *terrain_by_identifier(const char identifier);
168struct terrain *terrain_by_rule_name(const char *name);
169struct terrain *terrain_by_translated_name(const char *name);
171
172char terrain_identifier(const struct terrain *pterrain);
173const char *terrain_rule_name(const struct terrain *pterrain);
174const char *terrain_name_translation(const struct terrain *pterrain);
175
176/* Functions to operate on a terrain flag. */
177#define terrain_has_flag(terr, flag) BV_ISSET((terr)->flags, flag)
178
179bool is_terrain_flag_card_near(const struct civ_map *nmap,
180 const struct tile *ptile,
181 enum terrain_flag_id flag);
182bool is_terrain_flag_near_tile(const struct civ_map *nmap,
183 const struct tile *ptile,
184 enum terrain_flag_id flag);
186 const struct tile *ptile,
187 bool cardinal_only, bool percentage,
188 enum terrain_flag_id flag);
189void user_terrain_flags_init(void);
190void user_terrain_flags_free(void);
191void set_user_terrain_flag_name(enum terrain_flag_id id, const char *name, const char *helptxt);
192const char *terrain_flag_helptxt(enum terrain_flag_id id);
193
194/* Terrain-specific functions. */
195#define is_ocean(pterrain) ((pterrain) != T_UNKNOWN \
196 && terrain_type_terrain_class(pterrain) == TC_OCEAN)
197#define is_ocean_tile(ptile) \
198 is_ocean(tile_terrain(ptile))
199
200bool terrain_has_resource(const struct terrain *pterrain,
201 const struct extra_type *presource);
202
203/* Functions to operate on a general terrain type. */
204bool is_terrain_card_near(const struct civ_map *nmap,
205 const struct tile *ptile,
206 const struct terrain *pterrain,
207 bool check_self);
208bool is_terrain_near_tile(const struct civ_map *nmap,
209 const struct tile *ptile,
210 const struct terrain *pterrain,
211 bool check_self);
213 const struct tile *ptile,
214 bool cardinal_only, bool percentage,
216
217bool is_resource_card_near(const struct civ_map *nmap,
218 const struct tile *ptile,
219 const struct extra_type *pres,
220 bool check_self);
221bool is_resource_near_tile(const struct civ_map *nmap,
222 const struct tile *ptile,
223 const struct extra_type *pres,
224 bool check_self);
225
226struct resource_type *resource_type_init(struct extra_type *pextra);
227void resource_types_free(void);
228
229struct extra_type *resource_extra_get(const struct resource_type *presource);
230
231/* Special helper functions */
234
235int terrain_extra_build_time(const struct terrain *pterrain,
236 enum unit_activity activity,
237 const struct extra_type *tgt);
238int terrain_extra_removal_time(const struct terrain *pterrain,
239 enum unit_activity activity,
240 const struct extra_type *tgt)
241 fc__attribute((nonnull (1, 3)));
242
243/* Functions to operate on a terrain class. */
244const char *terrain_class_name_translation(enum terrain_class tclass);
245
246enum terrain_class terrain_type_terrain_class(const struct terrain *pterrain);
247bool is_terrain_class_card_near(const struct civ_map *nmap,
248 const struct tile *ptile, enum terrain_class tclass);
249bool is_terrain_class_near_tile(const struct civ_map *nmap,
250 const struct tile *ptile, enum terrain_class tclass);
252 const struct tile *ptile,
253 bool cardinal_only, bool percentage,
254 enum terrain_class tclass);
255
256/* Functions to deal with possible terrain alterations. */
257bool terrain_can_support_alteration(const struct terrain *pterrain,
259
260/* Initialization and iteration */
261void terrains_init(void);
262void terrains_free(void);
263
264struct terrain *terrain_array_first(void);
265const struct terrain *terrain_array_last(void);
266
267#define terrain_type_iterate(_p) \
268{ \
269 struct terrain *_p = terrain_array_first(); \
270 if (NULL != _p) { \
271 for (; _p <= terrain_array_last(); _p++) {
272
273#define terrain_type_iterate_end \
274 } \
275 } \
276}
277
278#define terrain_re_active_iterate(_p) \
279 terrain_type_iterate(_p) { \
280 if (!_p->ruledit_disabled) {
281
282#define terrain_re_active_iterate_end \
283 } \
284 } terrain_type_iterate_end;
285
286#define terrain_resources_iterate(pterrain, _res, _freq) \
287 if (NULL != pterrain && NULL != pterrain->resources) { \
288 int _res##_index; \
289 for (_res##_index = 0; \
290 pterrain->resources[_res##_index] != NULL; \
291 _res##_index++) { \
292 struct extra_type *_res = pterrain->resources[_res##_index]; \
293 int _freq = pterrain->resource_freq[_res##_index];
294
295#define terrain_resources_iterate_end \
296 } \
297 }
298
299#define terrain_animals_iterate(pterrain, _animal) \
300 if (NULL != pterrain && pterrain->num_animals > 0) { \
301 int _animal##_index; \
302 for (_animal##_index = 0; \
303 _animal##_index < pterrain->num_animals; \
304 _animal##_index++) { \
305 const struct unit_type *_animal = pterrain->animals[_animal##_index]; \
306
307#define terrain_animals_iterate_end \
308 } \
309 }
310
311#ifdef __cplusplus
312}
313#endif /* __cplusplus */
314
315#endif /* FC__TERRAIN_H */
char * incite_cost
Definition comments.c:76
static struct extra_type extras[MAX_EXTRA_TYPES]
Definition extras.c:31
int Terrain_type_id
Definition fc_types.h:233
#define MAX_EXTRA_TYPES
Definition fc_types.h:50
#define MAX_LEN_NAME
Definition fc_types.h:67
@ O_LAST
Definition fc_types.h:102
GType type
Definition repodlgs.c:1313
const char * name
Definition inputfile.c:127
struct extra_type * self
Definition terrain.h:56
char id_old_save
Definition terrain.h:50
int output[O_LAST]
Definition terrain.h:54
struct terrain * cultivate_result
Definition terrain.h:108
int placing_time
Definition terrain.h:120
struct terrain * cooler_wetter_result
Definition terrain.h:135
struct extra_type ** resources
Definition terrain.h:97
struct terrain * cooler_drier_result
Definition terrain.h:135
int item_number
Definition terrain.h:76
struct strvec * helptext
Definition terrain.h:157
struct terrain * warmer_wetter_result
Definition terrain.h:134
char graphic_alt2[MAX_LEN_NAME]
Definition terrain.h:82
bv_terrain_flags flags
Definition terrain.h:153
int * resource_freq
Definition terrain.h:98
bv_unit_classes native_to
Definition terrain.h:151
int road_time
Definition terrain.h:106
struct name_translation name
Definition terrain.h:77
int plant_time
Definition terrain.h:112
struct terrain * plant_result
Definition terrain.h:111
int irrigation_food_incr
Definition terrain.h:114
struct terrain * warmer_drier_result
Definition terrain.h:134
int defense_bonus
Definition terrain.h:93
int cultivate_time
Definition terrain.h:109
int movement_cost
Definition terrain.h:92
int num_animals
Definition terrain.h:130
int pillage_time
Definition terrain.h:125
int output[O_LAST]
Definition terrain.h:95
int transform_time
Definition terrain.h:124
char graphic_alt[MAX_LEN_NAME]
Definition terrain.h:81
int mining_time
Definition terrain.h:118
char identifier_load
Definition terrain.h:85
struct rgbcolor * rgb
Definition terrain.h:155
char graphic_str[MAX_LEN_NAME]
Definition terrain.h:80
enum terrain_class tclass
Definition terrain.h:90
int road_output_incr_pct[O_LAST]
Definition terrain.h:104
int extra_removal_times[MAX_EXTRA_TYPES]
Definition terrain.h:128
struct terrain * transform_result
Definition terrain.h:122
int irrigation_time
Definition terrain.h:115
int base_time
Definition terrain.h:105
const struct unit_type ** animals
Definition terrain.h:131
int mining_shield_incr
Definition terrain.h:117
void * ruledit_dlg
Definition terrain.h:79
char identifier
Definition terrain.h:84
bool ruledit_disabled
Definition terrain.h:78
Definition tile.h:50
#define fc__attribute(x)
Definition support.h:99
void user_terrain_flags_init(void)
Definition terrain.c:763
void terrains_free(void)
Definition terrain.c:64
struct terrain * terrain_by_rule_name(const char *name)
Definition terrain.c:185
bool is_terrain_class_near_tile(const struct civ_map *nmap, const struct tile *ptile, enum terrain_class tclass)
Definition terrain.c:611
char terrain_identifier(const struct terrain *pterrain)
Definition terrain.c:125
Terrain_type_id terrain_count(void)
Definition terrain.c:117
void terrains_init(void)
Definition terrain.c:42
struct extra_type * resource_extra_get(const struct resource_type *presource)
Definition terrain.c:295
bool terrain_can_support_alteration(const struct terrain *pterrain, enum terrain_alteration talter)
Definition terrain.c:672
int count_terrain_class_near_tile(const struct civ_map *nmap, const struct tile *ptile, bool cardinal_only, bool percentage, enum terrain_class tclass)
Definition terrain.c:632
bool is_terrain_class_card_near(const struct civ_map *nmap, const struct tile *ptile, enum terrain_class tclass)
Definition terrain.c:590
struct terrain * terrain_by_translated_name(const char *name)
Definition terrain.c:201
int count_terrain_flag_near_tile(const struct civ_map *nmap, const struct tile *ptile, bool cardinal_only, bool percentage, enum terrain_flag_id flag)
Definition terrain.c:477
int const char * terrain_class_name_translation(enum terrain_class tclass)
Definition terrain.c:660
const char * get_infrastructure_text(bv_extras extras)
Definition terrain.c:507
Terrain_type_id terrain_index(const struct terrain *pterrain)
Definition terrain.c:137
bool is_resource_card_near(const struct civ_map *nmap, const struct tile *ptile, const struct extra_type *pres, bool check_self)
Definition terrain.c:394
const char * terrain_name_translation(const struct terrain *pterrain)
Definition terrain.c:237
struct terrain * terrain_array_first(void)
Definition terrain.c:95
struct terrain * rand_terrain_by_flag(enum terrain_flag_id flag)
Definition terrain.c:216
struct terrain * terrain_by_number(const Terrain_type_id type)
Definition terrain.c:155
bool is_terrain_card_near(const struct civ_map *nmap, const struct tile *ptile, const struct terrain *pterrain, bool check_self)
Definition terrain.c:326
const char * terrain_rule_name(const struct terrain *pterrain)
Definition terrain.c:246
bool is_resource_near_tile(const struct civ_map *nmap, const struct tile *ptile, const struct extra_type *pres, bool check_self)
Definition terrain.c:415
void resource_types_free(void)
Definition terrain.c:287
void user_terrain_flags_free(void)
Definition terrain.c:775
enum terrain_class terrain_type_terrain_class(const struct terrain *pterrain)
Definition terrain.c:581
const char * terrain_flag_helptxt(enum terrain_flag_id id)
Definition terrain.c:828
bool terrain_has_resource(const struct terrain *pterrain, const struct extra_type *presource)
Definition terrain.c:254
struct resource_type * resource_type_init(struct extra_type *pextra)
Definition terrain.c:271
bool is_terrain_flag_near_tile(const struct civ_map *nmap, const struct tile *ptile, enum terrain_flag_id flag)
Definition terrain.c:457
struct extra_type * get_preferred_pillage(bv_extras extras)
Definition terrain.c:549
void set_user_terrain_flag_name(enum terrain_flag_id id, const char *name, const char *helptxt)
Definition terrain.c:787
const struct terrain * terrain_array_last(void)
Definition terrain.c:106
int terrain_extra_build_time(const struct terrain *pterrain, enum unit_activity activity, const struct extra_type *tgt)
Definition terrain.c:698
Terrain_type_id terrain_number(const struct terrain *pterrain)
Definition terrain.c:146
struct terrain * terrain_by_identifier(const char identifier)
Definition terrain.c:168
bool is_terrain_flag_card_near(const struct civ_map *nmap, const struct tile *ptile, enum terrain_flag_id flag)
Definition terrain.c:437
int terrain_extra_removal_time(const struct terrain *pterrain, enum unit_activity activity, const struct extra_type *tgt) fc__attribute((nonnull(1
special_river_move
Definition terrain.h:39
@ RMV_NORMAL
Definition terrain.h:40
@ RMV_FAST_RELAXED
Definition terrain.h:42
@ RMV_FAST_STRICT
Definition terrain.h:41
@ RMV_FAST_ALWAYS
Definition terrain.h:43
int count_terrain_property_near_tile(const struct civ_map *nmap, const struct tile *ptile, bool cardinal_only, bool percentage, enum mapgen_terrain_property prop)
Definition terrain.c:368
bool is_terrain_near_tile(const struct civ_map *nmap, const struct tile *ptile, const struct terrain *pterrain, bool check_self)
Definition terrain.c:347