27 #define SPECENUM_NAME req_range
28 #define SPECENUM_VALUE0 REQ_RANGE_LOCAL
29 #define SPECENUM_VALUE0NAME "Local"
30 #define SPECENUM_VALUE1 REQ_RANGE_CADJACENT
31 #define SPECENUM_VALUE1NAME "CAdjacent"
32 #define SPECENUM_VALUE2 REQ_RANGE_ADJACENT
33 #define SPECENUM_VALUE2NAME "Adjacent"
34 #define SPECENUM_VALUE3 REQ_RANGE_CITY
35 #define SPECENUM_VALUE3NAME "City"
36 #define SPECENUM_VALUE4 REQ_RANGE_TRADEROUTE
37 #define SPECENUM_VALUE4NAME "Traderoute"
38 #define SPECENUM_VALUE5 REQ_RANGE_CONTINENT
39 #define SPECENUM_VALUE5NAME "Continent"
40 #define SPECENUM_VALUE6 REQ_RANGE_PLAYER
41 #define SPECENUM_VALUE6NAME "Player"
42 #define SPECENUM_VALUE7 REQ_RANGE_TEAM
43 #define SPECENUM_VALUE7NAME "Team"
44 #define SPECENUM_VALUE8 REQ_RANGE_ALLIANCE
45 #define SPECENUM_VALUE8NAME "Alliance"
46 #define SPECENUM_VALUE9 REQ_RANGE_WORLD
47 #define SPECENUM_VALUE9NAME "World"
48 #define SPECENUM_COUNT REQ_RANGE_COUNT
49 #include "specenum_gen.h"
51 #define req_range_iterate(_range_) \
53 enum req_range _range_; \
54 for (_range_ = REQ_RANGE_LOCAL; _range_ < REQ_RANGE_COUNT; \
55 _range_ = (enum req_range)(_range_ + 1)) {
57 #define req_range_iterate_end \
75 #define SPECVEC_TAG requirement
76 #define SPECVEC_TYPE struct requirement
78 #define requirement_vector_iterate(req_vec, preq) \
79 TYPED_VECTOR_ITERATE(struct requirement, req_vec, preq)
80 #define requirement_vector_iterate_end VECTOR_ITERATE_END
100 const struct requirement_vector *vec);
103 const struct player *target_player,
const struct player *other_player,
104 const struct city *target_city,
const struct impr_type *target_building,
105 const struct tile *target_tile,
const struct unit *target_unit,
111 const enum vision_layer vision_layer = V_COUNT,
112 const enum national_intelligence nintel = NI_COUNT);
114 const struct player *other_player,
115 const struct city *target_city,
117 const struct tile *target_tile,
118 const struct unit *target_unit,
122 const struct action *target_action,
123 const struct requirement_vector *
reqs,
125 const enum vision_layer vision_layer = V_COUNT,
126 const enum national_intelligence nintel = NI_COUNT);
131 const struct requirement_vector *vec);
134 enum universals_n kind);
154 const void *parent_item,
const struct requirement_vector *vec);
164 typedef struct requirement_vector *(*requirement_vector_by_number)(
178 const struct requirement_vector *vec);
182 #define SPECENUM_NAME req_vec_change_operation
183 #define SPECENUM_VALUE0 RVCO_REMOVE
184 #define SPECENUM_VALUE0NAME N_("Remove")
185 #define SPECENUM_VALUE1 RVCO_APPEND
186 #define SPECENUM_VALUE1NAME N_("Append")
187 #define SPECENUM_COUNT RVCO_NOOP
188 #include "specenum_gen.h"
212 const void *parent_item);
221 const void *parent_item);
238 char *buf,
size_t bufsz);
248 #define universal_is_mentioned_by_requirement(preq, psource) \
249 are_universals_equal(&preq->source, psource)
251 const struct requirement_vector *
reqs,
const struct universal *psource);
261 const struct requirement_vector *
reqs,
264 bool check_necessary,
const struct requirement_vector *
reqs,
269 #define universals_iterate(_univ_) \
271 enum universals_n _univ_; \
272 for (_univ_ = VUT_NONE; _univ_ < VUT_COUNT; \
273 _univ_ = (enum universals_n)(_univ_ + 1)) {
275 #define universals_iterate_end \
283 #define requirement_fulfilled_by_government(_gov_, _rqs_) \
284 sv_universal_fulfills_requirements( \
286 (struct universal){.value = {.govern = (_gov_)}, \
287 .kind = VUT_GOVERNMENT})
288 #define requirement_fulfilled_by_nation(_nat_, _rqs_) \
289 sv_universal_fulfills_requirements( \
291 (struct universal){.value = {.nation = (_nat_)}, .kind = VUT_NATION})
292 #define requirement_fulfilled_by_improvement(_imp_, _rqs_) \
293 sv_universal_fulfills_requirements( \
295 (struct universal){.value = {.building = (_imp_)}, \
296 .kind = VUT_IMPROVEMENT})
297 #define requirement_fulfilled_by_terrain(_ter_, _rqs_) \
298 sv_universal_fulfills_requirements( \
300 (struct universal){.value = {.terrain = (_ter_)}, \
301 .kind = VUT_TERRAIN})
302 #define requirement_fulfilled_by_unit_class(_uc_, _rqs_) \
303 sv_universal_fulfills_requirements( \
305 (struct universal){.value = {.uclass = (_uc_)}, .kind = VUT_UCLASS})
306 #define requirement_fulfilled_by_unit_type(_ut_, _rqs_) \
307 sv_universal_fulfills_requirements( \
309 (struct universal){.value = {.utype = (_ut_)}, .kind = VUT_UTYPE})
311 #define requirement_needs_improvement(_imp_, _rqs_) \
312 sv_universal_fulfills_requirements( \
314 (struct universal){.value = {.building = (_imp_)}, \
315 .kind = VUT_IMPROVEMENT})
318 const bool present,
const int max_value);
320 #define requirement_diplrel_ereq(_id_, _range_, _present_) \
321 requirement_kind_ereq(_id_, _range_, _present_, DRO_LAST)
bool universal_is_relevant_to_requirement(const struct requirement *req, const struct universal *source)
Returns TRUE iff the specified universal is relevant to fulfilling the specified requirement.
bool is_req_in_vec(const struct requirement *req, const struct requirement_vector *vec)
Returns TRUE iff the requirement vector vec contains the requirement req.
int universal_build_shield_cost(const struct city *pcity, const struct universal *target)
Return the number of shields it takes to build this universal.
struct req_vec_problem * req_vec_problem_new(int num_suggested_solutions, const char *description,...)
Returns a new requirement vector problem with the specified number of suggested solutions and the spe...
signed char req_vec_num_in_item
req_vec_num_in_item a requirement vectors number in an item.
void universal_extraction(const struct universal *source, int *kind, int *value)
Extract universal structure into its components for serialization; the opposite of universal_by_numbe...
req_vec_num_in_item(* requirement_vector_number)(const void *parent_item, const struct requirement_vector *vec)
Returns the requirement vector number of the specified requirement vector in the specified parent ite...
req_vec_num_in_item req_vec_vector_number(const void *parent_item, const struct requirement_vector *vec)
Returns the requirement vector number of the specified requirement vector in the specified requiremen...
bool universal_fulfills_requirements(bool check_necessary, const struct requirement_vector *reqs, const struct universal *source)
Will the universal 'source' fulfill the requirements in the list? If 'check_necessary' is FALSE: are ...
bool sv_universal_fulfills_requirements(bool check_necessary, const struct requirement_vector *reqs, const struct universal source)
Version of universal_fulfills_requirements that takes the universal by value.
bool req_vec_change_apply(const struct req_vec_change *modification, requirement_vector_by_number getter, const void *parent_item)
Returns TRUE iff the specified requirement vector modification was successfully applied to the specif...
bool are_requirements_equal(const struct requirement *req1, const struct requirement *req2)
Returns TRUE if req1 and req2 are equal.
bool is_req_unchanging(const struct requirement *req)
Return TRUE if this is an "unchanging" requirement.
struct req_vec_problem * req_vec_get_first_contradiction(const struct requirement_vector *vec, requirement_vector_number get_num, const void *parent_item)
Returns the first self contradiction found in the specified requirement vector with suggested solutio...
struct requirement req_from_str(const char *type, const char *range, bool survives, bool present, bool quiet, const char *value)
Parse a requirement type and value string into a requirement structure.
void universal_value_from_str(struct universal *source, const char *value)
Parse requirement value strings into a universal structure.
bool is_req_active(const struct player *target_player, const struct player *other_player, const struct city *target_city, const struct impr_type *target_building, const struct tile *target_tile, const struct unit *target_unit, const struct unit_type *target_unittype, const struct output_type *target_output, const struct specialist *target_specialist, const struct action *target_action, const struct requirement *req, const enum req_problem_type prob_type, const enum vision_layer vision_layer=V_COUNT, const enum national_intelligence nintel=NI_COUNT)
Checks the requirement to see if it is active on the given target.
void req_get_values(const struct requirement *req, int *type, int *range, bool *survives, bool *present, bool *quiet, int *value)
Return the value of a req as a serializable integer.
struct requirement req_from_values(int type, int range, bool survives, bool present, bool quiet, int value)
Set the values of a req from serializable integers.
const char * universal_type_rule_name(const struct universal *psource)
Return untranslated name of the universal source name.
const char * universal_name_translation(const struct universal *psource, char *buf, size_t bufsz)
Make user-friendly text for the source.
bool universal_replace_in_req_vec(struct requirement_vector *reqs, const struct universal *to_replace, const struct universal *replacement)
Replaces all instances of the universal to_replace with replacement in the requirement vector reqs an...
QString req_to_fstring(const struct requirement *req)
Returns the given requirement as a formatted string ready for printing.
bool are_requirements_contradictions(const struct requirement *req1, const struct requirement *req2)
Returns TRUE if req1 and req2 contradicts each other.
void universal_found_functions_init()
Initialise universal_found_function array.
int requirement_kind_ereq(const int value, const enum req_range range, const bool present, const int max_value)
Returns (the position of) the given requirement's enumerator in the enumeration of all possible requi...
void req_vec_problem_free(struct req_vec_problem *issue)
De-allocates resources associated with the given requirement vector problem.
struct universal universal_by_number(const enum universals_n kind, const int value)
Combine values into a universal structure.
enum req_item_found universal_fulfills_requirement(const struct requirement *preq, const struct universal *source)
Will the universal 'source' fulfill this requirement?
struct requirement_vector *(* requirement_vector_by_number)(const void *parent_item, req_vec_num_in_item number)
Returns a writable pointer to the specified requirement vector in the specified parent item or nullpt...
bool req_vec_wants_type(const struct requirement_vector *reqs, enum universals_n kind)
Returns TRUE iff the specified requirement vector has a positive requirement of the specified require...
bool does_req_contradicts_reqs(const struct requirement *req, const struct requirement_vector *vec)
Returns TRUE if the given requirement contradicts the given requirement vector.
bool are_universals_equal(const struct universal *psource1, const struct universal *psource2)
Return TRUE iff the two sources are equivalent.
const char * universal_rule_name(const struct universal *psource)
Return the (untranslated) rule name of the universal.
int universal_number(const struct universal *source)
Return the universal number of the constituent.
bool are_reqs_active(const struct player *target_player, const struct player *other_player, const struct city *target_city, const struct impr_type *target_building, const struct tile *target_tile, const struct unit *target_unit, const struct unit_type *target_unittype, const struct output_type *target_output, const struct specialist *target_specialist, const struct action *target_action, const struct requirement_vector *reqs, const enum req_problem_type prob_type, const enum vision_layer vision_layer=V_COUNT, const enum national_intelligence nintel=NI_COUNT)
Checks the requirement(s) to see if they are active on the given target.
bool universal_is_mentioned_by_requirements(const struct requirement_vector *reqs, const struct universal *psource)
Returns TRUE iff the universal 'psource' is directly mentioned by any of the requirements in 'reqs'.
const char *(* requirement_vector_namer)(req_vec_num_in_item number)
Returns the name of the specified requirement vector number in the parent item or nullptr if parent i...
struct universal universal_by_rule_name(const char *kind, const char *value)
Parse requirement type (kind) and value strings into a universal structure.
const char * req_vec_change_translation(const struct req_vec_change *change, const requirement_vector_namer namer)
Returns the specified requirement vector change as a translated string ready for use in the user inte...
req_vec_num_in_item vector_number
enum req_vec_change_operation operation
int num_suggested_solutions
char description_translated[500]
struct req_vec_change * suggested_solutions