Freeciv-3.4
Loading...
Searching...
No Matches
univ_value.c
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
14#ifdef HAVE_CONFIG_H
15#include <fc_config.h>
16#endif
17
18/* common */
19#include "achievements.h"
20#include "counters.h"
21#include "game.h"
22#include "government.h"
23#include "nation.h"
24#include "requirements.h"
25#include "server_settings.h"
26#include "specialist.h"
27#include "tech.h"
28#include "traderoutes.h"
29
30/* server */
31#include "rssanity.h"
32#include "settings.h"
33
34#include "univ_value.h"
35
36/********************************************************************/
43{
44 switch (src->kind) {
45 case VUT_NONE:
46 /* Value of None should never be used */
47 return TRUE;
48 case VUT_ADVANCE:
49 if (game.control.num_tech_types <= 0) {
50 return FALSE;
51 }
53 return TRUE;
54 case VUT_COUNTER:
56 return FALSE;
57 }
59 return TRUE;
60 case VUT_GOVERNMENT:
62 return TRUE;
63 case VUT_GOVFLAG:
64 src->value.govflag = 0;
65 return TRUE;
66 case VUT_IMPROVEMENT:
67 case VUT_SITE:
68 if (game.control.num_impr_types <= 0) {
69 return FALSE;
70 }
72 return TRUE;
73 case VUT_TERRAIN:
75 return TRUE;
76 case VUT_NATION:
77 if (game.control.nation_count <= 0) {
78 return FALSE;
79 }
81 return TRUE;
82 case VUT_UTYPE:
83 if (game.control.num_unit_types <= 0) {
84 return FALSE;
85 }
86 src->value.utype = utype_by_number(0);
87 return TRUE;
88 case VUT_UTFLAG:
89 src->value.unitflag = (enum unit_type_flag_id)0;
90 return TRUE;
91 case VUT_UCLASS:
92 if (game.control.num_unit_classes <= 0) {
93 return FALSE;
94 }
96 return TRUE;
97 case VUT_UCFLAG:
99 return TRUE;
100 case VUT_OTYPE:
101 src->value.outputtype = (enum output_type_id)0;
102 return TRUE;
103 case VUT_SPECIALIST:
105 return FALSE;
106 }
108 return TRUE;
109 case VUT_MINSIZE:
110 src->value.minsize = 0;
111 return TRUE;
112 case VUT_AI_LEVEL:
114 return TRUE;
115 case VUT_TERRAINCLASS:
117 return TRUE;
118 case VUT_MINYEAR:
119 src->value.minyear = 0;
120 return TRUE;
121 case VUT_MINCALFRAG:
122 src->value.mincalfrag = 0;
123 return TRUE;
124 case VUT_TERRAINALTER:
126 return TRUE;
127 case VUT_CITYTILE:
129 return TRUE;
130 case VUT_CITYSTATUS:
132 return TRUE;
133 case VUT_GOOD:
134 if (game.control.num_goods_types <= 0) {
135 return FALSE;
136 }
137 src->value.good = goods_by_number(0);
138 return TRUE;
139 case VUT_TERRFLAG:
141 return TRUE;
142 case VUT_NATIONALITY:
143 if (game.control.nation_count <= 0) {
144 return FALSE;
145 }
147 return TRUE;
149 if (game.control.nation_count <= 0) {
150 return FALSE;
151 }
153 return TRUE;
154 case VUT_ROADFLAG:
155 src->value.roadflag = RF_RIVER;
156 return TRUE;
157 case VUT_EXTRA:
158 if (game.control.num_extra_types <= 0) {
159 return FALSE;
160 }
161 src->value.extra = extra_by_number(0);
162 return TRUE;
163 case VUT_TECHFLAG:
165 return TRUE;
166 case VUT_ACHIEVEMENT:
168 return FALSE;
169 }
171 return TRUE;
172 case VUT_DIPLREL:
173 case VUT_DIPLREL_TILE:
177 src->value.diplrel = DS_WAR;
178 return TRUE;
181 return TRUE;
183 src->value.max_tile_top_units = 0;
184 return TRUE;
185 case VUT_STYLE:
186 if (game.control.num_styles <= 0) {
187 return FALSE;
188 }
189 src->value.style = style_by_number(0);
190 return TRUE;
191 case VUT_MINCULTURE:
192 src->value.minculture = 0;
193 return TRUE;
195 src->value.minforeignpct = 0;
196 return TRUE;
197 case VUT_UNITSTATE:
199 return TRUE;
200 case VUT_ACTIVITY:
202 return TRUE;
203 case VUT_MINMOVES:
204 src->value.minmoves = 0;
205 return TRUE;
206 case VUT_MINVETERAN:
207 src->value.minveteran = 0;
208 return TRUE;
209 case VUT_MINHP:
210 src->value.min_hit_points = 0;
211 return TRUE;
212 case VUT_AGE:
213 src->value.age = 0;
214 return TRUE;
215 case VUT_FORM_AGE:
216 src->value.form_age = 0;
217 return TRUE;
218 case VUT_NATIONGROUP:
219 if (nation_group_count() <= 0) {
220 return FALSE;
221 }
223 return TRUE;
224 case VUT_TOPO:
226 return TRUE;
227 case VUT_WRAP:
229 return TRUE;
231 src->value.ssetval
233 return TRUE;
234 case VUT_IMPR_GENUS:
236 return TRUE;
237 case VUT_IMPR_FLAG:
239 return TRUE;
240 case VUT_PLAYER_FLAG:
241 src->value.plr_flag = PLRF_AI;
242 return TRUE;
243 case VUT_PLAYER_STATE:
245 return TRUE;
246 case VUT_ACTION:
247 src->value.action = action_by_number(0);
248 return TRUE;
249 case VUT_MINTECHS:
250 src->value.min_techs = 0;
251 return TRUE;
252 case VUT_FUTURETECHS:
253 src->value.future_techs = 0;
254 return TRUE;
255 case VUT_MINCITIES:
256 src->value.min_cities = 0;
257 return TRUE;
258 case VUT_EXTRAFLAG:
260 return TRUE;
261 case VUT_MINLATITUDE:
262 case VUT_MAXLATITUDE:
263 src->value.latitude = 0;
264 return TRUE;
266 src->value.distance_sq = 0;
267 return TRUE;
269 src->value.region_tiles = 0;
270 return TRUE;
271 case VUT_TILE_REL:
273 return TRUE;
274 case VUT_COUNT:
275 fc_assert(src->kind != VUT_COUNT);
276 return FALSE;
277 }
278
279 return FALSE;
280}
281
282/********************************************************************/
286 univ_kind_values_cb cb, void *data)
287{
288 int i;
289
290 switch (univ->kind) {
291 case VUT_NONE:
292 break;
293 case VUT_ADVANCE:
295 cb(advance_rule_name(padv), univ->value.advance == padv, data);
297 break;
298 case VUT_COUNTER:
300 cb(counter_rule_name(pcount), univ->value.counter == pcount, data);
302 break;
303 case VUT_GOVERNMENT:
305 cb(government_rule_name(pgov), univ->value.govern == pgov, data);
307 break;
308 case VUT_GOVFLAG:
309 for (i = 0; i < GOVF_LAST_USER_FLAG; i++) {
310 cb(gov_flag_id_name(i), univ->value.govflag == i, data);
311 }
312 break;
313 case VUT_IMPROVEMENT:
314 case VUT_SITE:
316 cb(improvement_rule_name(pimpr), univ->value.building == pimpr, data);
318 break;
319 case VUT_TERRAIN:
321 cb(terrain_rule_name(pterr), univ->value.terrain == pterr, data);
323 break;
324 case VUT_NATION:
326 cb(nation_rule_name(pnat), univ->value.nation == pnat, data);
328 break;
329 case VUT_UTYPE:
331 cb(utype_rule_name(putype), univ->value.utype == putype, data);
333 break;
334 case VUT_UCLASS:
336 cb(uclass_rule_name(pclass), univ->value.uclass == pclass, data);
338 break;
339 case VUT_OTYPE:
341 cb(get_output_name(otype), univ->value.outputtype == otype, data);
343 break;
344 case VUT_GOOD:
346 cb(goods_rule_name(pgood), univ->value.good == pgood, data);
348 break;
349 case VUT_NATIONALITY:
351 cb(nation_rule_name(pnat), univ->value.nationality == pnat, data);
353 break;
356 cb(nation_rule_name(pnat), univ->value.origowner == pnat, data);
358 break;
359 case VUT_EXTRA:
361 cb(extra_rule_name(pextra), univ->value.extra == pextra, data);
363 break;
364 case VUT_STYLE:
366 cb(style_rule_name(pstyle), univ->value.style == pstyle, data);
368 break;
369 case VUT_AI_LEVEL:
370 for (i = 0; i < AI_LEVEL_COUNT; i++) {
371 cb(ai_level_name(i), univ->value.ai_level == i, data);
372 }
373 break;
374 case VUT_SPECIALIST:
376 cb(specialist_rule_name(pspe), univ->value.specialist == pspe, data);
378 break;
379 case VUT_TERRAINCLASS:
380 for (i = 0; i < TC_COUNT; i++) {
381 cb(terrain_class_name(i), univ->value.terrainclass == i, data);
382 }
383 break;
384 case VUT_UTFLAG:
385 for (i = 0; i < UTYF_LAST_USER_FLAG; i++) {
386 cb(unit_type_flag_id_name(i), univ->value.unitflag == i, data);
387 }
388 break;
389 case VUT_UCFLAG:
390 for (i = 0; i < UCF_COUNT; i++) {
391 cb(unit_class_flag_id_name(i), univ->value.unitclassflag == i, data);
392 }
393 break;
394 case VUT_TERRFLAG:
395 for (i = 0; i < TER_USER_LAST; i++) {
396 cb(terrain_flag_id_name(i), univ->value.terrainflag == i, data);
397 }
398 break;
399 case VUT_ROADFLAG:
400 for (i = 0; i < RF_COUNT; i++) {
401 cb(road_flag_id_name(i), univ->value.roadflag == i, data);
402 }
403 break;
404 case VUT_TECHFLAG:
405 for (i = 0; i < TF_COUNT; i++) {
406 cb(tech_flag_id_name(i), univ->value.techflag == i, data);
407 }
408 break;
409 case VUT_EXTRAFLAG:
410 for (i = 0; i < EF_COUNT; i++) {
411 cb(extra_flag_id_name(i), univ->value.extraflag == i, data);
412 }
413 break;
414 case VUT_TERRAINALTER:
415 for (i = 0; i < TA_COUNT; i++) {
416 cb(terrain_alteration_name(i), univ->value.terrainalter == i, data);
417 }
418 break;
419 case VUT_CITYTILE:
420 for (i = 0; i < CITYT_LAST; i++) {
421 cb(citytile_type_name(i), univ->value.citytile == i, data);
422 }
423 break;
424 case VUT_CITYSTATUS:
425 for (i = 0; i < CITYS_LAST; i++) {
426 cb(citystatus_type_name(i), univ->value.citystatus == i, data);
427 }
428 break;
429 case VUT_TILE_REL:
430 for (i = 0; i < TREL_COUNT; i++) {
431 cb(tilerel_type_name(i), univ->value.tilerel == i, data);
432 }
433 break;
434 case VUT_ACHIEVEMENT:
436 cb(achievement_rule_name(pach), univ->value.achievement == pach, data);
438 break;
439 case VUT_DIPLREL:
440 case VUT_DIPLREL_TILE:
444 for (i = 0; i < DS_LAST; i++) {
445 cb(diplstate_type_name(i), univ->value.diplrel == i, data);
446 }
447 for (; i < DRO_LAST; i++) {
448 cb(diplrel_other_name(i), univ->value.diplrel == i, data);
449 }
450 break;
451 case VUT_UNITSTATE:
452 for (i = 0; i < USP_COUNT; i++) {
453 cb(ustate_prop_name(i), univ->value.unit_state == i, data);
454 }
455 break;
456 case VUT_ACTIVITY:
459 &(struct universal){.kind = VUT_ACTIVITY,
460 .value = {.activity = act}})) {
461 /* This activity is excluded from appearing in requirement
462 * vectors. */
463 continue;
464 }
465 cb(unit_activity_name(act), univ->value.activity == act, data);
467 break;
468 case VUT_NATIONGROUP:
472 break;
473 case VUT_TOPO:
474 for (i = 0; i < TOPO_FLAG_BITS; i++) {
475 cb(topo_flag_name(1 << i), univ->value.topo_property == 1 << i, data);
476 }
477 break;
478 case VUT_WRAP:
479 for (i = 0; i < WRAP_FLAG_BITS; i++) {
480 cb(wrap_flag_name(1 << i), univ->value.wrap_property == 1 << i, data);
481 }
482 break;
484 for (i = 0;
485 /* Only binary settings with the value TRUE are currently
486 * supported. */
487 i < settings_number();
488 i++) {
490 cb(ssetv_rule_name(i),
491 univ->value.ssetval == ssetv_from_values(i, TRUE), data);
492 }
493 }
494 break;
495 case VUT_IMPR_GENUS:
496 genus_iterate(genus) {
497 cb(impr_genus_id_name(genus), univ->value.impr_genus == genus, data);
499 break;
500 case VUT_IMPR_FLAG:
501 for (i = 0; i < IF_COUNT; i++) {
502 cb(impr_flag_id_name(i), univ->value.impr_flag == i, data);
503 }
504 break;
505 case VUT_PLAYER_FLAG:
506 for (i = 0; i < PLRF_COUNT; i++) {
507 cb(plr_flag_id_name(i), univ->value.plr_flag == i, data);
508 }
509 break;
510 case VUT_PLAYER_STATE:
511 for (i = 0; i < PLRS_LAST; i++) {
512 cb(plrstate_type_name(i), univ->value.plrstate == i, data);
513 }
514 break;
515 case VUT_ACTION:
516 action_iterate(act) {
517 struct action *pact = action_by_number(act);
518
519 cb(action_rule_name(pact), univ->value.action == pact, data);
521 break;
522 case VUT_MINSIZE:
523 case VUT_MINYEAR:
524 case VUT_MINCALFRAG:
527 case VUT_MINCULTURE:
529 case VUT_MINMOVES:
530 case VUT_MINVETERAN:
531 case VUT_MINHP:
532 case VUT_AGE:
533 case VUT_FORM_AGE:
534 case VUT_MINTECHS:
535 case VUT_FUTURETECHS:
536 case VUT_MINCITIES:
537 case VUT_MINLATITUDE:
538 case VUT_MAXLATITUDE:
541 /* Requirement types having numerical value */
542 cb(nullptr, FALSE, data);
543 break;
544 case VUT_COUNT:
545 fc_assert(univ->kind != VUT_COUNT);
546 break;
547 }
548}
struct achievement * achievement_by_number(int id)
const char * achievement_rule_name(struct achievement *pach)
#define achievements_re_active_iterate(_p)
#define achievements_re_active_iterate_end
const char * action_rule_name(const struct action *action)
Definition actions.c:1237
static struct action * action_by_number(action_id act_id)
Definition actions.h:400
#define action_iterate_end
Definition actions.h:218
#define action_iterate(_act_)
Definition actions.h:214
const char * get_output_name(Output_type_id output)
Definition city.c:629
#define output_type_iterate(output)
Definition city.h:846
#define output_type_iterate_end
Definition city.h:852
char * incite_cost
Definition comments.c:76
struct counter * counter_by_index(int index, enum counter_target target)
Definition counters.c:183
const char * counter_rule_name(struct counter *pcount)
Definition counters.c:165
int counters_get_city_counters_count(void)
Definition counters.c:74
#define city_counters_iterate_end
Definition counters.h:64
#define city_counters_iterate(pcount)
Definition counters.h:57
struct extra_type * extra_by_number(int id)
Definition extras.c:183
const char * extra_rule_name(const struct extra_type *pextra)
Definition extras.c:203
#define extra_type_re_active_iterate_end
Definition extras.h:329
#define extra_type_re_active_iterate(_p)
Definition extras.h:325
#define TOPO_FLAG_BITS
Definition fc_types.h:462
@ CTGT_CITY
Definition fc_types.h:127
#define WRAP_FLAG_BITS
Definition fc_types.h:471
output_type_id
Definition fc_types.h:101
struct civ_game game
Definition game.c:62
const char * government_rule_name(const struct government *pgovern)
Definition government.c:135
#define governments_re_active_iterate(_p)
Definition government.h:132
#define governments_re_active_iterate_end
Definition government.h:136
#define GOVF_LAST_USER_FLAG
Definition government.h:28
struct impr_type * improvement_by_number(const Impr_type_id id)
const char * improvement_rule_name(const struct impr_type *pimprove)
#define genus_iterate_end
#define improvement_re_active_iterate_end
#define genus_iterate(_p)
#define improvement_re_active_iterate(_p)
#define fc_assert(condition)
Definition log.h:177
const char * nation_rule_name(const struct nation_type *pnation)
Definition nation.c:138
struct nation_type * nation_by_number(const Nation_type_id nation)
Definition nation.c:493
const char * nation_group_rule_name(const struct nation_group *pgroup)
Definition nation.c:1117
struct nation_group * nation_group_by_number(int id)
Definition nation.c:1038
int nation_group_count(void)
Definition nation.c:966
#define nations_iterate_end
Definition nation.h:338
#define nations_iterate(NAME_pnation)
Definition nation.h:335
#define nation_groups_iterate(NAME_pgroup)
Definition nation.h:313
#define nation_groups_iterate_end
Definition nation.h:317
bool universal_is_legal_in_requirement(const struct universal *univ)
bool sanity_check_server_setting_value_in_req(ssetv ssetval)
Definition rssanity.c:144
server_setting_id server_setting_by_name(const char *name)
const char * ssetv_rule_name(ssetv val)
ssetv ssetv_from_values(server_setting_id setting, int value)
int settings_number(void)
Definition settings.c:5311
struct specialist * specialist_by_number(const Specialist_type_id id)
Definition specialist.c:110
const char * specialist_rule_name(const struct specialist *sp)
Definition specialist.c:157
#define specialist_type_re_active_iterate_end
Definition specialist.h:114
#define specialist_type_re_active_iterate(_p)
Definition specialist.h:109
struct packet_ruleset_control control
Definition game.h:83
struct government * government_during_revolution
Definition game.h:94
enum universals_n kind
Definition fc_types.h:593
universals_u value
Definition fc_types.h:592
struct nation_style * style_by_number(int id)
Definition style.c:88
const char * style_rule_name(const struct nation_style *pstyle)
Definition style.c:108
#define styles_re_active_iterate_end
Definition style.h:60
#define styles_re_active_iterate(_p)
Definition style.h:56
#define TRUE
Definition support.h:46
#define FALSE
Definition support.h:47
struct advance * advance_by_number(const Tech_type_id atype)
Definition tech.c:107
const char * advance_rule_name(const struct advance *padvance)
Definition tech.c:309
#define advance_re_active_iterate(_p)
Definition tech.h:279
#define advance_re_active_iterate_end
Definition tech.h:283
#define A_NONE
Definition tech.h:43
struct terrain * terrain_by_number(const Terrain_type_id type)
Definition terrain.c:158
const char * terrain_rule_name(const struct terrain *pterrain)
Definition terrain.c:250
#define terrain_re_active_iterate_end
Definition terrain.h:281
#define terrain_re_active_iterate(_p)
Definition terrain.h:277
const char * goods_rule_name(struct goods_type *pgood)
struct goods_type * goods_by_number(Goods_type_id id)
#define goods_type_re_active_iterate_end
#define goods_type_re_active_iterate(_p)
const struct unit_type * utype
Definition fc_types.h:535
int region_tiles
Definition fc_types.h:582
struct nation_style * style
Definition fc_types.h:539
enum ai_level ai_level
Definition fc_types.h:543
struct specialist * specialist
Definition fc_types.h:532
enum impr_genus_id impr_genus
Definition fc_types.h:567
enum citytile_type citytile
Definition fc_types.h:544
struct nation_group * nationgroup
Definition fc_types.h:538
struct extra_type * extra
Definition fc_types.h:536
enum wrap_flag wrap_property
Definition fc_types.h:585
enum plrstate_type plrstate
Definition fc_types.h:546
enum tilerel_type tilerel
Definition fc_types.h:547
struct nation_type * nation
Definition fc_types.h:529
int terrainclass
Definition fc_types.h:554
int unitclassflag
Definition fc_types.h:557
struct government * govern
Definition fc_types.h:527
struct nation_type * origowner
Definition fc_types.h:531
enum impr_flag_id impr_flag
Definition fc_types.h:568
int terrainalter
Definition fc_types.h:555
enum citystatus_type citystatus
Definition fc_types.h:545
int minforeignpct
Definition fc_types.h:550
const struct impr_type * building
Definition fc_types.h:528
int max_tile_total_units
Definition fc_types.h:571
int max_tile_top_units
Definition fc_types.h:572
struct achievement * achievement
Definition fc_types.h:537
ssetv ssetval
Definition fc_types.h:586
struct advance * advance
Definition fc_types.h:525
enum unit_activity activity
Definition fc_types.h:566
struct goods_type * good
Definition fc_types.h:541
struct terrain * terrain
Definition fc_types.h:533
int terrainflag
Definition fc_types.h:559
enum ustate_prop unit_state
Definition fc_types.h:565
Output_type_id outputtype
Definition fc_types.h:553
int distance_sq
Definition fc_types.h:581
enum topo_flag topo_property
Definition fc_types.h:584
struct counter * counter
Definition fc_types.h:526
int min_hit_points
Definition fc_types.h:574
struct unit_class * uclass
Definition fc_types.h:534
struct nation_type * nationality
Definition fc_types.h:530
struct action * action
Definition fc_types.h:540
int future_techs
Definition fc_types.h:578
enum plr_flag_id plr_flag
Definition fc_types.h:569
#define activity_type_iterate(_act_)
Definition unit.h:287
#define activity_type_iterate_end
Definition unit.h:292
struct unit_class * uclass_by_number(const Unit_Class_id id)
Definition unittype.c:2506
const char * utype_rule_name(const struct unit_type *punittype)
Definition unittype.c:1604
struct unit_type * utype_by_number(const Unit_type_id id)
Definition unittype.c:114
const char * uclass_rule_name(const struct unit_class *pclass)
Definition unittype.c:1667
#define unit_type_re_active_iterate(_p)
Definition unittype.h:875
#define unit_class_re_active_iterate_end
Definition unittype.h:932
#define UTYF_LAST_USER_FLAG
Definition unittype.h:335
#define unit_class_re_active_iterate(_p)
Definition unittype.h:928
#define unit_type_re_active_iterate_end
Definition unittype.h:879
bool universal_value_initial(struct universal *src)
Definition univ_value.c:42
void universal_kind_values(struct universal *univ, univ_kind_values_cb cb, void *data)
Definition univ_value.c:285
void(* univ_kind_values_cb)(const char *value, bool current, void *data)
Definition univ_value.h:20