Feature #1183 ยป 0041-requirements.-ch-Improve-Coding-Style.patch
common/requirements.c | ||
---|---|---|
************************************************************************/
|
||
typedef enum req_item_found (*universal_found)(const struct requirement *,
|
||
const struct universal *);
|
||
static universal_found universal_found_function[VUT_COUNT] = {NULL};
|
||
static universal_found universal_found_function[VUT_COUNT] = {nullptr};
|
||
static
|
||
enum fc_tristate tri_req_present(const struct civ_map *nmap,
|
||
... | ... | |
const struct req_context *context,
|
||
const struct requirement *req)
|
||
{
|
||
if (TRI_YES != tri_req_present(nmap, context, NULL, req)) {
|
||
if (TRI_YES != tri_req_present(nmap, context, nullptr, req)) {
|
||
return REQUCH_NO;
|
||
}
|
||
return def;
|
||
... | ... | |
req_copy(&preq, req);
|
||
preq.range = REQ_RANGE_PLAYER;
|
||
if (TRI_YES != tri_req_present(nmap, context, NULL, &preq)) {
|
||
if (TRI_YES != tri_req_present(nmap, context, nullptr, &preq)) {
|
||
return REQ_RANGE_TEAM == req->range ? REQUCH_ACT : REQUCH_NO;
|
||
}
|
||
}
|
||
... | ... | |
fc_assert_ret_val(VUT_CITYTILE == req->source.kind, REQUCH_NO);
|
||
if (CITYT_CENTER == req->source.value.citytile
|
||
|| (CITYT_BORDERING_TCLASS_REGION != req->source.value.citytile
|
||
&& NULL != context->city && NULL != context->tile
|
||
&& NULL != city_tile(context->city)
|
||
&& context->city != nullptr && context->tile != nullptr
|
||
&& city_tile(context->city) != nullptr
|
||
&& are_tiles_in_range(city_tile(context->city), context->tile,
|
||
req->range))){
|
||
/* Cities don't move, and most reqs are present on city center */
|
||
... | ... | |
if (req->source.kind == VUT_IMPROVEMENT
|
||
&& improvement_obsolete(context->player, b, context->city)) {
|
||
/* FIXME: sometimes can unobsolete, but considering it
|
||
/* FIXME: Sometimes can unobsolete, but considering it
|
||
* may sometimes put the function on endless recursion */
|
||
return REQUCH_ACT; /* Mostly about techs */
|
||
}
|
||
... | ... | |
if (great_wonder_is_destroyed(b)
|
||
|| (!great_wonder_is_available(b)
|
||
&& (req->range <= REQ_RANGE_CITY && TRI_YES
|
||
== tri_req_present(nmap, context, NULL, req)))) {
|
||
== tri_req_present(nmap, context, nullptr, req)))) {
|
||
/* If the wonder stays somewhere, it may either remain there
|
||
* or be destroyed. If it is destroyed, it is nowhere. */
|
||
return REQUCH_SCRIPTS;
|
||
... | ... | |
/**********************************************************************//**
|
||
Parse requirement type (kind) and value strings into a universal
|
||
structure. Passing in a NULL type is considered VUT_NONE (not an error).
|
||
structure. Passing in a nullptr type is considered VUT_NONE (not an error).
|
||
Pass this some values like "Building", "Factory".
|
||
FIXME: ensure that every caller checks error return!
|
||
FIXME: Ensure that every caller checks error return!
|
||
**************************************************************************/
|
||
struct universal universal_by_rule_name(const char *kind,
|
||
const char *value)
|
||
... | ... | |
static bool activity_is_valid_in_requirement(enum unit_activity act)
|
||
{
|
||
return unit_activity_is_valid(act)
|
||
&& act != ACTIVITY_SENTRY
|
||
&& act != ACTIVITY_GOTO
|
||
&& act != ACTIVITY_EXPLORE;
|
||
&& act != ACTIVITY_SENTRY
|
||
&& act != ACTIVITY_GOTO
|
||
&& act != ACTIVITY_EXPLORE;
|
||
}
|
||
/**********************************************************************//**
|
||
... | ... | |
return;
|
||
case VUT_ADVANCE:
|
||
source->value.advance = advance_by_rule_name(value);
|
||
if (source->value.advance != NULL) {
|
||
if (source->value.advance != nullptr) {
|
||
return;
|
||
}
|
||
break;
|
||
... | ... | |
break;
|
||
case VUT_GOVERNMENT:
|
||
source->value.govern = government_by_rule_name(value);
|
||
if (source->value.govern != NULL) {
|
||
if (source->value.govern != nullptr) {
|
||
return;
|
||
}
|
||
break;
|
||
case VUT_ACHIEVEMENT:
|
||
source->value.achievement = achievement_by_rule_name(value);
|
||
if (source->value.achievement != NULL) {
|
||
if (source->value.achievement != nullptr) {
|
||
return;
|
||
}
|
||
break;
|
||
case VUT_STYLE:
|
||
source->value.style = style_by_rule_name(value);
|
||
if (source->value.style != NULL) {
|
||
if (source->value.style != nullptr) {
|
||
return;
|
||
}
|
||
break;
|
||
case VUT_IMPROVEMENT:
|
||
case VUT_SITE:
|
||
source->value.building = improvement_by_rule_name(value);
|
||
if (source->value.building != NULL) {
|
||
if (source->value.building != nullptr) {
|
||
return;
|
||
}
|
||
break;
|
||
... | ... | |
break;
|
||
case VUT_EXTRA:
|
||
source->value.extra = extra_type_by_rule_name(value);
|
||
if (source->value.extra != NULL) {
|
||
if (source->value.extra != nullptr) {
|
||
return;
|
||
}
|
||
break;
|
||
case VUT_GOOD:
|
||
source->value.good = goods_by_rule_name(value);
|
||
if (source->value.good != NULL) {
|
||
if (source->value.good != nullptr) {
|
||
return;
|
||
}
|
||
break;
|
||
... | ... | |
break;
|
||
case VUT_NATIONGROUP:
|
||
source->value.nationgroup = nation_group_by_rule_name(value);
|
||
if (source->value.nationgroup != NULL) {
|
||
if (source->value.nationgroup != nullptr) {
|
||
return;
|
||
}
|
||
break;
|
||
... | ... | |
break;
|
||
case VUT_ACTION:
|
||
source->value.action = action_by_rule_name(value);
|
||
if (source->value.action != NULL) {
|
||
if (source->value.action != nullptr) {
|
||
return;
|
||
}
|
||
break;
|
||
... | ... | |
break;
|
||
case VUT_COUNTER:
|
||
source->value.counter = counter_by_rule_name(value);
|
||
if (source->value.counter != NULL) {
|
||
if (source->value.counter != nullptr) {
|
||
return;
|
||
}
|
||
break;
|
||
... | ... | |
/**********************************************************************//**
|
||
Combine values into a universal structure. This is for serialization
|
||
and is the opposite of universal_extraction().
|
||
FIXME: ensure that every caller checks error return!
|
||
FIXME: Ensure that every caller checks error return!
|
||
**************************************************************************/
|
||
struct universal universal_by_number(const enum universals_n kind,
|
||
const int value)
|
||
const int value)
|
||
{
|
||
struct universal source;
|
||
... | ... | |
switch (source.kind) {
|
||
case VUT_NONE:
|
||
/* Avoid compiler warning about unitialized source.value */
|
||
source.value.advance = NULL;
|
||
source.value.advance = nullptr;
|
||
return source;
|
||
case VUT_ADVANCE:
|
||
source.value.advance = advance_by_number(value);
|
||
if (source.value.advance != NULL) {
|
||
if (source.value.advance != nullptr) {
|
||
return source;
|
||
}
|
||
break;
|
||
... | ... | |
return source;
|
||
case VUT_GOVERNMENT:
|
||
source.value.govern = government_by_number(value);
|
||
if (source.value.govern != NULL) {
|
||
if (source.value.govern != nullptr) {
|
||
return source;
|
||
}
|
||
break;
|
||
case VUT_ACHIEVEMENT:
|
||
source.value.achievement = achievement_by_number(value);
|
||
if (source.value.achievement != NULL) {
|
||
if (source.value.achievement != nullptr) {
|
||
return source;
|
||
}
|
||
break;
|
||
case VUT_STYLE:
|
||
source.value.style = style_by_number(value);
|
||
if (source.value.style != NULL) {
|
||
if (source.value.style != nullptr) {
|
||
return source;
|
||
}
|
||
break;
|
||
case VUT_IMPROVEMENT:
|
||
case VUT_SITE:
|
||
source.value.building = improvement_by_number(value);
|
||
if (source.value.building != NULL) {
|
||
if (source.value.building != nullptr) {
|
||
return source;
|
||
}
|
||
break;
|
||
... | ... | |
return source;
|
||
case VUT_TERRAIN:
|
||
source.value.terrain = terrain_by_number(value);
|
||
if (source.value.terrain != NULL) {
|
||
if (source.value.terrain != nullptr) {
|
||
return source;
|
||
}
|
||
break;
|
||
... | ... | |
return source;
|
||
case VUT_NATION:
|
||
source.value.nation = nation_by_number(value);
|
||
if (source.value.nation != NULL) {
|
||
if (source.value.nation != nullptr) {
|
||
return source;
|
||
}
|
||
break;
|
||
case VUT_NATIONGROUP:
|
||
source.value.nationgroup = nation_group_by_number(value);
|
||
if (source.value.nationgroup != NULL) {
|
||
if (source.value.nationgroup != nullptr) {
|
||
return source;
|
||
}
|
||
break;
|
||
... | ... | |
break;
|
||
case VUT_NATIONALITY:
|
||
source.value.nationality = nation_by_number(value);
|
||
if (source.value.nationality != NULL) {
|
||
if (source.value.nationality != nullptr) {
|
||
return source;
|
||
}
|
||
break;
|
||
case VUT_ORIGINAL_OWNER:
|
||
source.value.origowner = nation_by_number(value);
|
||
if (source.value.origowner != NULL) {
|
||
if (source.value.origowner != nullptr) {
|
||
return source;
|
||
}
|
||
break;
|
||
case VUT_UTYPE:
|
||
source.value.utype = utype_by_number(value);
|
||
if (source.value.utype != NULL) {
|
||
if (source.value.utype != nullptr) {
|
||
return source;
|
||
}
|
||
break;
|
||
... | ... | |
return source;
|
||
case VUT_UCLASS:
|
||
source.value.uclass = uclass_by_number(value);
|
||
if (source.value.uclass != NULL) {
|
||
if (source.value.uclass != nullptr) {
|
||
return source;
|
||
}
|
||
break;
|
||
... | ... | |
return source;
|
||
case VUT_ACTION:
|
||
source.value.action = action_by_number(value);
|
||
if (source.value.action != NULL) {
|
||
if (source.value.action != nullptr) {
|
||
return source;
|
||
}
|
||
break;
|
||
... | ... | |
/* If we reach here there's been an error. */
|
||
source.kind = universals_n_invalid();
|
||
/* Avoid compiler warning about unitialized source.value */
|
||
source.value.advance = NULL;
|
||
source.value.advance = nullptr;
|
||
return source;
|
||
}
|
||
... | ... | |
the opposite of universal_by_number().
|
||
**************************************************************************/
|
||
void universal_extraction(const struct universal *source,
|
||
int *kind, int *value)
|
||
int *kind, int *value)
|
||
{
|
||
*kind = source->kind;
|
||
*value = universal_number(source);
|
||
... | ... | |
/**********************************************************************//**
|
||
Parse a requirement type and value string into a requirement structure.
|
||
Returns the invalid element for enum universal_n on error. Passing in a
|
||
NULL type is considered VUT_NONE (not an error).
|
||
Returns the invalid element for enum universal_n on error. Passing in
|
||
a nullptr type is considered VUT_NONE (not an error).
|
||
Pass this some values like "Building", "Factory".
|
||
**************************************************************************/
|
||
... | ... | |
{
|
||
struct requirement req;
|
||
bool invalid;
|
||
const char *error = NULL;
|
||
const char *error = nullptr;
|
||
req.source = universal_by_rule_name(type, value);
|
||
... | ... | |
} else {
|
||
/* Scan the range string to find the range. If no range is given a
|
||
* default fallback is used rather than giving an error. */
|
||
if (range != NULL) {
|
||
if (range != nullptr) {
|
||
req.range = req_range_by_name(range, fc_strcasecmp);
|
||
if (!req_range_is_valid(req.range)) {
|
||
invalid = TRUE;
|
||
... | ... | |
invalid = (req.range != REQ_RANGE_WORLD);
|
||
break;
|
||
case VUT_AGE:
|
||
/* FIXME: could support TRADE_ROUTE, TEAM, etc */
|
||
/* FIXME: Could support TRADE_ROUTE, TEAM, etc */
|
||
invalid = (req.range != REQ_RANGE_LOCAL
|
||
&& req.range != REQ_RANGE_CITY
|
||
&& req.range != REQ_RANGE_PLAYER);
|
||
... | ... | |
of req_get_values.
|
||
**************************************************************************/
|
||
struct requirement req_from_values(int type, int range,
|
||
bool survives, bool present, bool quiet,
|
||
int value)
|
||
bool survives, bool present, bool quiet,
|
||
int value)
|
||
{
|
||
struct requirement req;
|
||
... | ... | |
}
|
||
/**********************************************************************//**
|
||
Return the value of a req as a serializable integer. This is the opposite
|
||
Return the value of a req as a serializable integer. This is the opposite
|
||
of req_set_value.
|
||
**************************************************************************/
|
||
void req_get_values(const struct requirement *req,
|
||
int *type, int *range,
|
||
bool *survives, bool *present, bool *quiet,
|
||
int *value)
|
||
int *type, int *range,
|
||
bool *survives, bool *present, bool *quiet,
|
||
int *value)
|
||
{
|
||
universal_extraction(&req->source, type, value);
|
||
*range = req->range;
|
||
... | ... | |
Does not care if one is quiet and the other not.
|
||
**************************************************************************/
|
||
bool are_requirements_equal(const struct requirement *req1,
|
||
const struct requirement *req2)
|
||
const struct requirement *req2)
|
||
{
|
||
return (are_universals_equal(&req1->source, &req2->source)
|
||
&& req1->range == req2->range
|
||
&& req1->survives == req2->survives
|
||
&& req1->present == req2->present);
|
||
&& req1->range == req2->range
|
||
&& req1->survives == req2->survives
|
||
&& req1->present == req2->present);
|
||
}
|
||
/**********************************************************************//**
|
||
... | ... | |
Returns the number of buildings of a certain type owned by plr.
|
||
**************************************************************************/
|
||
static int num_player_buildings(const struct player *pplayer,
|
||
const struct impr_type *building)
|
||
const struct impr_type *building)
|
||
{
|
||
if (is_wonder(building)) {
|
||
return (wonder_is_built(pplayer, building) ? 1 : 0);
|
||
... | ... | |
Returns the number of buildings of a certain type on a continent.
|
||
**************************************************************************/
|
||
static int num_continent_buildings(const struct player *pplayer,
|
||
int continent,
|
||
const struct impr_type *building)
|
||
int continent,
|
||
const struct impr_type *building)
|
||
{
|
||
if (is_wonder(building)) {
|
||
const struct city *pcity;
|
||
... | ... | |
return BOOL_TO_TRISTATE(num_world_buildings_total(building) > 0);
|
||
case REQ_RANGE_ALLIANCE:
|
||
case REQ_RANGE_TEAM:
|
||
if (context->player == NULL) {
|
||
if (context->player == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
players_iterate_alive(plr2) {
|
||
... | ... | |
} players_iterate_alive_end;
|
||
return TRI_NO;
|
||
case REQ_RANGE_PLAYER:
|
||
if (context->player == NULL) {
|
||
if (context->player == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
return BOOL_TO_TRISTATE(player_has_ever_built(context->player,
|
||
... | ... | |
return BOOL_TO_TRISTATE(num_world_buildings(building) > 0);
|
||
case REQ_RANGE_ALLIANCE:
|
||
case REQ_RANGE_TEAM:
|
||
if (context->player == NULL) {
|
||
if (context->player == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
players_iterate_alive(plr2) {
|
||
... | ... | |
} players_iterate_alive_end;
|
||
return TRI_NO;
|
||
case REQ_RANGE_PLAYER:
|
||
if (context->player == NULL) {
|
||
if (context->player == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
return BOOL_TO_TRISTATE(num_player_buildings(context->player,
|
||
... | ... | |
enum fc_tristate ret = TRI_NO;
|
||
trade_partners_iterate(context->city, trade_partner) {
|
||
if (trade_partner == NULL) {
|
||
if (trade_partner == nullptr) {
|
||
ret = TRI_MAYBE;
|
||
} else if (city_has_building(trade_partner, building)) {
|
||
return TRI_YES;
|
||
... | ... | |
return TRI_NO;
|
||
}
|
||
} else {
|
||
/* TODO: other local targets */
|
||
/* TODO: Other local targets */
|
||
return TRI_MAYBE;
|
||
}
|
||
case REQ_RANGE_TILE:
|
||
... | ... | |
{
|
||
struct player *owner;
|
||
if (pcity == NULL) {
|
||
if (pcity == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
... | ... | |
case REQ_RANGE_CITY:
|
||
return is_buildingflag_in_city(context->city, req->source.value.impr_flag);
|
||
case REQ_RANGE_TILE:
|
||
if (context->tile == NULL) {
|
||
if (context->tile == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
return is_buildingflag_in_city(tile_city(context->tile),
|
||
... | ... | |
switch (req->range) {
|
||
case REQ_RANGE_PLAYER:
|
||
return (context->player != NULL
|
||
return (context->player != nullptr
|
||
? BOOL_TO_TRISTATE(player_has_flag(context->player,
|
||
req->source.value.plr_flag))
|
||
: TRI_MAYBE);
|
||
... | ... | |
switch (req->range) {
|
||
case REQ_RANGE_PLAYER:
|
||
return (context->player != NULL
|
||
return (context->player != nullptr
|
||
? BOOL_TO_TRISTATE(player_has_state(context->player,
|
||
req->source.value.plrstate))
|
||
: TRI_MAYBE);
|
||
... | ... | |
enum fc_tristate ret = TRI_NO;
|
||
trade_partners_iterate(context->city, trade_partner) {
|
||
if (trade_partner == NULL) {
|
||
if (trade_partner == nullptr) {
|
||
ret = TRI_MAYBE;
|
||
} else if (city_culture(trade_partner) >= minculture) {
|
||
return TRI_YES;
|
||
... | ... | |
case REQ_RANGE_TEAM:
|
||
case REQ_RANGE_ALLIANCE:
|
||
case REQ_RANGE_WORLD:
|
||
if (NULL == context->player) {
|
||
if (context->player == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
players_iterate_alive(plr2) {
|
||
... | ... | |
enum fc_tristate ret = TRI_NO;
|
||
trade_partners_iterate(context->city, trade_partner) {
|
||
if (trade_partner == NULL) {
|
||
if (trade_partner == nullptr) {
|
||
ret = TRI_MAYBE;
|
||
} else {
|
||
foreign_pct = citizens_nation_foreign(trade_partner) * 100
|
||
... | ... | |
max_units = req->source.value.max_tile_units;
|
||
/* TODO: if can't see V_INVIS -> TRI_MAYBE */
|
||
/* TODO: If can't see V_INVIS -> TRI_MAYBE */
|
||
switch (req->range) {
|
||
case REQ_RANGE_TILE:
|
||
if (!context->tile) {
|
||
... | ... | |
ret = TRI_NO;
|
||
trade_partners_iterate(context->city, trade_partner) {
|
||
if (trade_partner == NULL) {
|
||
if (trade_partner == nullptr) {
|
||
ret = TRI_MAYBE;
|
||
} else {
|
||
city_tile_iterate(nmap, city_map_radius_sq_get(trade_partner),
|
||
... | ... | |
}
|
||
return BOOL_TO_TRISTATE(city_receives_goods(context->city, pgood)
|
||
|| (goods_has_flag(pgood, GF_SELF_PROVIDED)
|
||
&& goods_can_be_provided(context->city, pgood, NULL)));
|
||
&& goods_can_be_provided(context->city, pgood,
|
||
nullptr)));
|
||
case REQ_RANGE_TILE:
|
||
case REQ_RANGE_CADJACENT:
|
||
case REQ_RANGE_ADJACENT:
|
||
... | ... | |
if (!context->city) {
|
||
return TRI_MAYBE;
|
||
}
|
||
if (pterrain != NULL) {
|
||
if (pterrain != nullptr) {
|
||
city_tile_iterate(nmap, city_map_radius_sq_get(context->city),
|
||
city_tile(context->city), ptile) {
|
||
if (tile_terrain(ptile) == pterrain) {
|
||
... | ... | |
if (!context->city) {
|
||
return TRI_MAYBE;
|
||
}
|
||
if (pterrain != NULL) {
|
||
if (pterrain != nullptr) {
|
||
enum fc_tristate ret;
|
||
city_tile_iterate(nmap, city_map_radius_sq_get(context->city),
|
||
... | ... | |
ret = TRI_NO;
|
||
trade_partners_iterate(context->city, trade_partner) {
|
||
if (trade_partner == NULL) {
|
||
if (trade_partner == nullptr) {
|
||
ret = TRI_MAYBE;
|
||
} else {
|
||
city_tile_iterate(nmap, city_map_radius_sq_get(trade_partner),
|
||
... | ... | |
ret = TRI_NO;
|
||
trade_partners_iterate(context->city, trade_partner) {
|
||
if (trade_partner == NULL) {
|
||
if (trade_partner == nullptr) {
|
||
ret = TRI_MAYBE;
|
||
} else {
|
||
city_tile_iterate(nmap, city_map_radius_sq_get(trade_partner),
|
||
... | ... | |
ret = TRI_NO;
|
||
trade_partners_iterate(context->city, trade_partner) {
|
||
if (trade_partner == NULL) {
|
||
if (trade_partner == nullptr) {
|
||
ret = TRI_MAYBE;
|
||
} else {
|
||
city_tile_iterate(nmap, city_map_radius_sq_get(trade_partner),
|
||
... | ... | |
ret = TRI_NO;
|
||
trade_partners_iterate(context->city, trade_partner) {
|
||
if (trade_partner == NULL) {
|
||
if (trade_partner == nullptr) {
|
||
ret = TRI_MAYBE;
|
||
} else {
|
||
city_tile_iterate(nmap, city_map_radius_sq_get(trade_partner),
|
||
... | ... | |
ret = TRI_NO;
|
||
trade_partners_iterate(context->city, trade_partner) {
|
||
if (trade_partner == NULL) {
|
||
if (trade_partner == nullptr) {
|
||
ret = TRI_MAYBE;
|
||
} else {
|
||
city_tile_iterate(nmap, city_map_radius_sq_get(trade_partner),
|
||
... | ... | |
{
|
||
IS_REQ_ACTIVE_VARIANT_ASSERT(VUT_GOVERNMENT);
|
||
if (context->player == NULL) {
|
||
if (context->player == nullptr) {
|
||
return TRI_MAYBE;
|
||
} else {
|
||
return BOOL_TO_TRISTATE(government_of_player(context->player)
|
||
... | ... | |
{
|
||
IS_REQ_ACTIVE_VARIANT_ASSERT(VUT_STYLE);
|
||
if (context->player == NULL) {
|
||
if (context->player == nullptr) {
|
||
return TRI_MAYBE;
|
||
} else {
|
||
return BOOL_TO_TRISTATE(context->player->style
|
||
... | ... | |
return ((game.info.global_advance_count - 1)
|
||
>= req->source.value.min_techs);
|
||
case REQ_RANGE_PLAYER:
|
||
if (context->player == NULL) {
|
||
if (context->player == nullptr) {
|
||
return TRI_MAYBE;
|
||
} else {
|
||
/* "None" does not count */
|
||
... | ... | |
switch (req->range) {
|
||
case REQ_RANGE_PLAYER:
|
||
if (context->player == NULL) {
|
||
if (context->player == nullptr) {
|
||
return TRI_MAYBE;
|
||
} else {
|
||
/* "None" does not count */
|
||
... | ... | |
{
|
||
IS_REQ_ACTIVE_VARIANT_ASSERT(VUT_AI_LEVEL);
|
||
if (context->player == NULL) {
|
||
if (context->player == nullptr) {
|
||
return TRI_MAYBE;
|
||
} else {
|
||
return BOOL_TO_TRISTATE(is_ai(context->player)
|
||
... | ... | |
switch (req->range) {
|
||
case REQ_RANGE_PLAYER:
|
||
if (context->player == NULL) {
|
||
if (context->player == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
return BOOL_TO_TRISTATE(nation_of_player(context->player) == nation);
|
||
case REQ_RANGE_TEAM:
|
||
case REQ_RANGE_ALLIANCE:
|
||
if (context->player == NULL) {
|
||
if (context->player == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
players_iterate_alive(plr2) {
|
||
... | ... | |
* (e.g. via /remove), rather than just dying, this 'survives'
|
||
* requirement will stop being true for their nation.
|
||
* create_command_newcomer() can also cause this to happen. */
|
||
return BOOL_TO_TRISTATE(NULL != nation->player
|
||
return BOOL_TO_TRISTATE(nation->player != nullptr
|
||
&& (req->survives || nation->player->is_alive));
|
||
case REQ_RANGE_LOCAL:
|
||
case REQ_RANGE_TILE:
|
||
... | ... | |
switch (req->range) {
|
||
case REQ_RANGE_PLAYER:
|
||
if (context->player == NULL) {
|
||
if (context->player == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
return BOOL_TO_TRISTATE(nation_is_in_group(
|
||
... | ... | |
case REQ_RANGE_TEAM:
|
||
case REQ_RANGE_ALLIANCE:
|
||
case REQ_RANGE_WORLD:
|
||
if (context->player == NULL) {
|
||
if (context->player == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
players_iterate_alive(plr2) {
|
||
... | ... | |
switch (req->range) {
|
||
case REQ_RANGE_CITY:
|
||
if (context->city == NULL) {
|
||
if (context->city == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
citizens_iterate(context->city, slot, count) {
|
||
... | ... | |
return TRI_NO;
|
||
case REQ_RANGE_TRADE_ROUTE:
|
||
if (context->city == NULL) {
|
||
if (context->city == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
citizens_iterate(context->city, slot, count) {
|
||
... | ... | |
ret = TRI_NO;
|
||
trade_partners_iterate(context->city, trade_partner) {
|
||
if (trade_partner == NULL) {
|
||
if (trade_partner == nullptr) {
|
||
ret = TRI_MAYBE;
|
||
} else {
|
||
citizens_iterate(trade_partner, slot, count) {
|
||
... | ... | |
switch (req->range) {
|
||
case REQ_RANGE_CITY:
|
||
if (context->city == NULL || context->city->original == NULL) {
|
||
if (context->city == nullptr || context->city->original == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
if (player_nation(context->city->original) == nation) {
|
||
... | ... | |
{
|
||
switch (range) {
|
||
case REQ_RANGE_PLAYER:
|
||
if (target_player == NULL) {
|
||
if (target_player == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
return BOOL_TO_TRISTATE(is_diplrel_to_other(target_player, diplrel));
|
||
case REQ_RANGE_TEAM:
|
||
case REQ_RANGE_ALLIANCE:
|
||
case REQ_RANGE_WORLD:
|
||
if (target_player == NULL) {
|
||
if (target_player == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
players_iterate_alive(plr2) {
|
||
... | ... | |
} players_iterate_alive_end;
|
||
return TRI_NO;
|
||
case REQ_RANGE_LOCAL:
|
||
if (target_player == NULL || other_player == NULL) {
|
||
if (target_player == nullptr || other_player == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
return BOOL_TO_TRISTATE(is_diplrel_between(target_player, other_player, diplrel));
|
||
... | ... | |
IS_REQ_ACTIVE_VARIANT_ASSERT(VUT_DIPLREL_TILE);
|
||
return is_diplrel_in_range(context->tile ? tile_owner(context->tile)
|
||
: NULL,
|
||
: nullptr,
|
||
context->player,
|
||
req->range,
|
||
req->source.value.diplrel);
|
||
... | ... | |
IS_REQ_ACTIVE_VARIANT_ASSERT(VUT_DIPLREL_TILE_O);
|
||
return is_diplrel_in_range(context->tile ? tile_owner(context->tile)
|
||
: NULL,
|
||
: nullptr,
|
||
other_context->player,
|
||
req->range,
|
||
req->source.value.diplrel);
|
||
... | ... | |
{
|
||
enum fc_tristate out = TRI_NO;
|
||
if (target_tile == NULL) {
|
||
if (target_tile == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
... | ... | |
/* Could be asked with incomplete data.
|
||
* is_req_active() will handle it based on prob_type. */
|
||
if (context->unit == NULL) {
|
||
if (context->unit == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
switch (uprop) {
|
||
case USP_TRANSPORTED:
|
||
return BOOL_TO_TRISTATE(context->unit->transporter != NULL);
|
||
return BOOL_TO_TRISTATE(context->unit->transporter != nullptr);
|
||
case USP_LIVABLE_TILE:
|
||
return BOOL_TO_TRISTATE(
|
||
can_unit_exist_at_tile(nmap, context->unit,
|
||
... | ... | |
"Unsupported range \"%s\"",
|
||
req_range_name(req->range));
|
||
if (context->unit == NULL) {
|
||
if (context->unit == nullptr) {
|
||
/* FIXME: Excluding ACTIVITY_IDLE here is a bit ugly, but done because
|
||
* it's the zero value that context has by default - so many callers
|
||
* who meant not to set specific activity actually have ACTIVITY_IDLE
|
||
... | ... | |
{
|
||
IS_REQ_ACTIVE_VARIANT_ASSERT(VUT_MINVETERAN);
|
||
if (context->unit == NULL) {
|
||
if (context->unit == nullptr) {
|
||
return TRI_MAYBE;
|
||
} else {
|
||
return BOOL_TO_TRISTATE(context->unit->veteran
|
||
... | ... | |
{
|
||
IS_REQ_ACTIVE_VARIANT_ASSERT(VUT_MINMOVES);
|
||
if (context->unit == NULL) {
|
||
if (context->unit == nullptr) {
|
||
return TRI_MAYBE;
|
||
} else {
|
||
return BOOL_TO_TRISTATE(req->source.value.minmoves
|
||
... | ... | |
{
|
||
IS_REQ_ACTIVE_VARIANT_ASSERT(VUT_MINHP);
|
||
if (context->unit == NULL) {
|
||
if (context->unit == nullptr) {
|
||
return TRI_MAYBE;
|
||
} else {
|
||
return BOOL_TO_TRISTATE(req->source.value.min_hit_points
|
||
... | ... | |
switch (req->range) {
|
||
case REQ_RANGE_LOCAL:
|
||
if (context->unit == NULL || !is_server()) {
|
||
if (context->unit == nullptr || !is_server()) {
|
||
return TRI_MAYBE;
|
||
} else {
|
||
return BOOL_TO_TRISTATE(
|
||
... | ... | |
}
|
||
break;
|
||
case REQ_RANGE_CITY:
|
||
if (context->city == NULL) {
|
||
if (context->city == nullptr) {
|
||
return TRI_MAYBE;
|
||
} else {
|
||
return BOOL_TO_TRISTATE(
|
||
... | ... | |
}
|
||
break;
|
||
case REQ_RANGE_PLAYER:
|
||
if (context->player == NULL) {
|
||
if (context->player == nullptr) {
|
||
return TRI_MAYBE;
|
||
} else {
|
||
return BOOL_TO_TRISTATE(req->source.value.age
|
||
... | ... | |
switch (req->range) {
|
||
case REQ_RANGE_LOCAL:
|
||
if (context->unit == NULL || !is_server()) {
|
||
if (context->unit == nullptr || !is_server()) {
|
||
return TRI_MAYBE;
|
||
} else {
|
||
return BOOL_TO_TRISTATE(
|
||
... | ... | |
}
|
||
/**********************************************************************//**
|
||
Is center of given city in tile. If city is NULL, any city will do.
|
||
Is center of given city in tile. If city is nullptr, any city will do.
|
||
**************************************************************************/
|
||
static bool is_city_in_tile(const struct tile *ptile,
|
||
const struct city *pcity)
|
||
const struct city *pcity)
|
||
{
|
||
if (pcity == NULL) {
|
||
return tile_city(ptile) != NULL;
|
||
if (pcity == nullptr) {
|
||
return tile_city(ptile) != nullptr;
|
||
} else {
|
||
return is_city_center(pcity, ptile);
|
||
}
|
||
... | ... | |
citytile = req->source.value.citytile;
|
||
fc_assert_ret_val(req_range_is_valid(req->range), TRI_MAYBE);
|
||
if (context->tile == NULL) {
|
||
if (context->tile == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
... | ... | |
case CITYT_CLAIMED:
|
||
switch (req->range) {
|
||
case REQ_RANGE_TILE:
|
||
return BOOL_TO_TRISTATE(context->tile->owner != NULL);
|
||
return BOOL_TO_TRISTATE(context->tile->owner != nullptr);
|
||
case REQ_RANGE_CADJACENT:
|
||
if (context->tile->owner != NULL) {
|
||
if (context->tile->owner != nullptr) {
|
||
return TRI_YES;
|
||
}
|
||
cardinal_adjc_iterate(nmap, context->tile, adjc_tile) {
|
||
if (adjc_tile->owner != NULL) {
|
||
if (adjc_tile->owner != nullptr) {
|
||
return TRI_YES;
|
||
}
|
||
} cardinal_adjc_iterate_end;
|
||
return TRI_NO;
|
||
case REQ_RANGE_ADJACENT:
|
||
if (context->tile->owner != NULL) {
|
||
if (context->tile->owner != nullptr) {
|
||
return TRI_YES;
|
||
}
|
||
adjc_iterate(nmap, context->tile, adjc_tile) {
|
||
if (adjc_tile->owner != NULL) {
|
||
if (adjc_tile->owner != nullptr) {
|
||
return TRI_YES;
|
||
}
|
||
} adjc_iterate_end;
|
||
... | ... | |
case CITYT_EXTRAS_OWNED:
|
||
switch (req->range) {
|
||
case REQ_RANGE_TILE:
|
||
return BOOL_TO_TRISTATE(context->tile->extras_owner != NULL);
|
||
return BOOL_TO_TRISTATE(context->tile->extras_owner != nullptr);
|
||
case REQ_RANGE_CADJACENT:
|
||
if (context->tile->extras_owner != NULL) {
|
||
if (context->tile->extras_owner != nullptr) {
|
||
return TRI_YES;
|
||
}
|
||
cardinal_adjc_iterate(nmap, context->tile, adjc_tile) {
|
||
if (adjc_tile->extras_owner != NULL) {
|
||
if (adjc_tile->extras_owner != nullptr) {
|
||
return TRI_YES;
|
||
}
|
||
} cardinal_adjc_iterate_end;
|
||
return TRI_NO;
|
||
case REQ_RANGE_ADJACENT:
|
||
if (context->tile->extras_owner != NULL) {
|
||
if (context->tile->extras_owner != nullptr) {
|
||
return TRI_YES;
|
||
}
|
||
adjc_iterate(nmap, context->tile, adjc_tile) {
|
||
if (adjc_tile->extras_owner != NULL) {
|
||
if (adjc_tile->extras_owner != nullptr) {
|
||
return TRI_YES;
|
||
}
|
||
} adjc_iterate_end;
|
||
... | ... | |
case CITYT_WORKED:
|
||
switch (req->range) {
|
||
case REQ_RANGE_TILE:
|
||
return BOOL_TO_TRISTATE(context->tile->worked != NULL);
|
||
return BOOL_TO_TRISTATE(context->tile->worked != nullptr);
|
||
case REQ_RANGE_CADJACENT:
|
||
if (context->tile->worked != NULL) {
|
||
if (context->tile->worked != nullptr) {
|
||
return TRI_YES;
|
||
}
|
||
cardinal_adjc_iterate(nmap, context->tile, adjc_tile) {
|
||
if (adjc_tile->worked != NULL) {
|
||
if (adjc_tile->worked != nullptr) {
|
||
return TRI_YES;
|
||
}
|
||
} cardinal_adjc_iterate_end;
|
||
return TRI_NO;
|
||
case REQ_RANGE_ADJACENT:
|
||
if (context->tile->worked != NULL) {
|
||
if (context->tile->worked != nullptr) {
|
||
return TRI_YES;
|
||
}
|
||
adjc_iterate(nmap, context->tile, adjc_tile) {
|
||
if (adjc_tile->worked != NULL) {
|
||
if (adjc_tile->worked != nullptr) {
|
||
return TRI_YES;
|
||
}
|
||
} adjc_iterate_end;
|
||
... | ... | |
citystatus = req->source.value.citystatus;
|
||
if (context->city == NULL) {
|
||
if (context->city == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
... | ... | |
case CITYS_OWNED_BY_ORIGINAL:
|
||
switch (req->range) {
|
||
case REQ_RANGE_CITY:
|
||
if (context->city->original == NULL) {
|
||
if (context->city->original == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
return BOOL_TO_TRISTATE(city_owner(context->city) == context->city->original);
|
||
... | ... | |
ret = TRI_NO;
|
||
trade_partners_iterate(context->city, trade_partner) {
|
||
if (trade_partner == NULL || trade_partner->original == NULL) {
|
||
if (trade_partner == nullptr || trade_partner->original == nullptr) {
|
||
ret = TRI_MAYBE;
|
||
} else if (city_owner(trade_partner) == trade_partner->original) {
|
||
return TRI_YES;
|
||
... | ... | |
ret = TRI_NO;
|
||
trade_partners_iterate(context->city, trade_partner) {
|
||
if (trade_partner == NULL) {
|
||
if (trade_partner == nullptr) {
|
||
ret = TRI_MAYBE;
|
||
} else if (trade_partner->had_famine) {
|
||
return TRI_YES;
|
||
... | ... | |
ret = TRI_NO;
|
||
trade_partners_iterate(context->city, trade_partner) {
|
||
if (trade_partner == NULL) {
|
||
if (trade_partner == nullptr) {
|
||
ret = TRI_MAYBE;
|
||
} else if (trade_partner->anarchy > 0) {
|
||
return TRI_YES;
|
||
... | ... | |
ret = TRI_NO;
|
||
trade_partners_iterate(context->city, trade_partner) {
|
||
if (trade_partner == NULL) {
|
||
if (trade_partner == nullptr) {
|
||
ret = TRI_MAYBE;
|
||
} else if (trade_partner->rapture > 0) {
|
||
return TRI_YES;
|
||
... | ... | |
ret = TRI_NO;
|
||
trade_partners_iterate(context->city, trade_partner) {
|
||
if (trade_partner == NULL) {
|
||
if (trade_partner == nullptr) {
|
||
ret = TRI_MAYBE;
|
||
} else if (trade_partner->acquire_t != CACQ_FOUNDED) {
|
||
return TRI_YES;
|
||
... | ... | |
{
|
||
IS_REQ_ACTIVE_VARIANT_ASSERT(VUT_MINSIZE);
|
||
if (context->city == NULL) {
|
||
if (context->city == nullptr) {
|
||
return TRI_MAYBE;
|
||
} else {
|
||
if (req->range == REQ_RANGE_TRADE_ROUTE) {
|
||
... | ... | |
ret = TRI_NO;
|
||
trade_partners_iterate(context->city, trade_partner) {
|
||
if (trade_partner == NULL) {
|
||
if (trade_partner == nullptr) {
|
||
ret = TRI_MAYBE;
|
||
} else if (city_size_get(trade_partner) >= req->source.value.minsize) {
|
||
return TRI_YES;
|
||
... | ... | |
count = req->source.value.counter;
|
||
if (NULL == context->city) {
|
||
if (context->city == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
return BOOL_TO_TRISTATE(count->checkpoint <=
|
||
... | ... | |
if (req->range == REQ_RANGE_WORLD) {
|
||
return BOOL_TO_TRISTATE(achievement_claimed(achievement));
|
||
} else if (context->player == NULL) {
|
||
} else if (context->player == nullptr) {
|
||
return TRI_MAYBE;
|
||
} else if (req->range == REQ_RANGE_ALLIANCE
|
||
|| req->range == REQ_RANGE_TEAM) {
|
||
... | ... | |
{
|
||
int min = -MAP_MAX_LATITUDE, max = MAP_MAX_LATITUDE;
|
||
fc_assert_ret_val(req != NULL, TRI_MAYBE);
|
||
fc_assert(context != NULL);
|
||
fc_assert_ret_val(req != nullptr, TRI_MAYBE);
|
||
fc_assert(context != nullptr);
|
||
switch (req->source.kind) {
|
||
case VUT_MINLATITUDE:
|
||
... | ... | |
&& max >= MAP_MIN_REAL_LATITUDE(wld.map));
|
||
case REQ_RANGE_TILE:
|
||
if (context->tile == NULL) {
|
||
if (context->tile == nullptr) {
|
||
return TRI_MAYBE;
|
||
} else {
|
||
int tile_lat = map_signed_latitude(context->tile);
|
||
... | ... | |
}
|
||
case REQ_RANGE_CADJACENT:
|
||
if (context->tile == NULL) {
|
||
if (context->tile == nullptr) {
|
||
return TRI_MAYBE;
|
||
}
|
||
... | ... | |
context gives the target (or targets) to evaluate against
|
||
req gives the requirement itself
|
||
context and other_context may be NULL. This is equivalent to passing
|
||
context and other_context may be nullptr. This is equivalent to passing
|
||
empty contexts.
|
||
Make sure you give all aspects of the target when calling this function:
|
||
... | ... | |
/**********************************************************************//**
|
||
Applies the standard evaluation of req in context, ignoring req->present.
|
||
context and other_context may be NULL. This is equivalent to passing
|
||
context and other_context may be nullptr. This is equivalent to passing
|
||
empty contexts.
|
||
Fields of context that are NULL are considered unspecified
|
||
Fields of context that are nullptr are considered unspecified
|
||
and will produce TRI_MAYBE if req needs them to evaluate.
|
||
**************************************************************************/
|
||
static
|
||
... | ... | |
return TRI_NO;
|
||
}
|
||
fc_assert_ret_val(req_definitions[req->source.kind].cb != NULL, TRI_NO);
|
||
fc_assert_ret_val(req_definitions[req->source.kind].cb != nullptr, TRI_NO);
|
||
return req_definitions[req->source.kind].cb(nmap, context,
|
||
other_context, req);
|
||
... | ... | |
/**********************************************************************//**
|
||
Evaluates req in context to fc_tristate.
|
||
context and other_context may be NULL. This is equivalent to passing
|
||
context and other_context may be nullptr. This is equivalent to passing
|
||
empty contexts.
|
||
Fields of context that are NULL are considered unspecified
|
||
Fields of context that are nullptr are considered unspecified
|
||
and will produce TRI_MAYBE if req needs them to evaluate.
|
||
**************************************************************************/
|
||
enum fc_tristate tri_req_active(const struct req_context *context,
|
||
... | ... | |
reqs gives the requirement vector.
|
||
The function returns TRUE only if all requirements are active.
|
||
context and other_context may be NULL. This is equivalent to passing
|
||
context and other_context may be nullptr. This is equivalent to passing
|
||
empty contexts.
|
||
Make sure you give all aspects of the target when calling this function:
|
||
... | ... | |
const struct req_context *other_context,
|
||
const struct requirement *req)
|
||
{
|
||
/* FIXME: doubles code from calendar.c */
|
||
/* FIXME: Doubles code from calendar.c */
|
||
int ypt = get_world_bonus(EFT_TURN_YEARS);
|
||
int fpt = get_world_bonus(EFT_TURN_FRAGMENTS);
|
||
int fragment = game.info.fragment_count;
|
||
int fragment1 = fragment; /* if fragments don't advance */
|
||
int fragment1 = fragment; /* If fragments don't advance */
|
||
int year_inc, year_inc1;
|
||
const int slowdown = (victory_enabled(VC_SPACERACE)
|
||
? get_world_bonus(EFT_SLOW_DOWN_TIMELINE) : 0);
|
||
... | ... | |
case VUT_AGE:
|
||
switch (req->range) {
|
||
case REQ_RANGE_LOCAL:
|
||
if (context->unit == NULL || !is_server()) {
|
||
if (context->unit == nullptr || !is_server()) {
|
||
return TRI_MAYBE;
|
||
} else {
|
||
int ua = game.info.turn + pass - context->unit->birth_turn;
|
||
... | ... | |
}
|
||
break;
|
||
case REQ_RANGE_CITY:
|
||
if (context->city == NULL) {
|
||
if (context->city == nullptr) {
|
||
return TRI_MAYBE;
|
||
} else {
|
||
int ca = game.info.turn + pass - context->city->turn_founded;
|
||
... | ... | |
}
|
||
break;
|
||
case REQ_RANGE_PLAYER:
|
||
if (context->player == NULL) {
|
||
if (context->player == nullptr) {
|
||
return TRI_MAYBE;
|
||
} else {
|
||
present = req->source.value.age
|
||
... | ... | |
}
|
||
break;
|
||
case VUT_FORM_AGE:
|
||
if (context->unit == NULL || !is_server()) {
|
||
if (context->unit == nullptr || !is_server()) {
|
||
return TRI_MAYBE;
|
||
} else {
|
||
int ua = game.info.turn + pass - context->unit->current_form_turn;
|
||
... | ... | |
/**********************************************************************//**
|
||
Test requirements in reqs with tester according to (data, n_data)
|
||
and give the resulting tristate.
|
||
If maybe_reqs is not NULL, copies requirements that are evaluated
|
||
If maybe_reqs is not nullptr, copies requirements that are evaluated
|
||
to TRI_MAYBE into it (stops as soon as one evaluates to TRI_NO).
|
||
**************************************************************************/
|
||
enum fc_tristate
|
||
... | ... | |
bool active = TRUE;
|
||
bool certain = TRUE;
|
||
fc_assert_ret_val(NULL != tester, TRI_NO);
|
||
fc_assert_ret_val(tester != nullptr, TRI_NO);
|
||
requirement_vector_iterate(reqs, preq) {
|
||
switch(tester(context, other_context, preq,
|
||
data, n_data)) {
|
||
... | ... | |
if (can_improvement_go_obsolete(b)) {
|
||
if (improvement_obsolete(context->player, b, context->city)) {
|
||
/* FIXME: sometimes can unobsolete, but considering it
|
||
/* FIXME: Sometimes can unobsolete, but considering it
|
||
* may sometimes put the function on endless recursion */
|
||
return REQUCH_ACT; /* Mostly about techs */
|
||
} else {
|
||
/* NOTE: may obsoletion reqs be unchanging? Hardly but why not. */
|
||
/* NOTE: May obsoletion reqs be unchanging? Hardly but why not. */
|
||
return REQUCH_NO;
|
||
}
|
||
}
|
||
... | ... | |
/**********************************************************************//**
|
||
Returns TRUE iff the specified requirement vector has a positive
|
||
requirement of the specified requirement type.
|
||
@param reqs the requirement vector to look in
|
||
@param kind the requirement type to look for
|
||
**************************************************************************/
|
||
... | ... | |
Returns TRUE iff the specified requirement is known to be impossible to
|
||
fulfill. Note that this function may return FALSE even when it is
|
||
impossible to fulfill a requirement if it can't detect it.
|
||
@param req the requirement to check the possibility of.
|
||
@return TRUE iff the requirement never can be fulfilled.
|
||
**************************************************************************/
|
||
... | ... | |
Returns TRUE iff the specified requirement vector is known to be
|
||
impossible to fulfill. Note that this function may return FALSE even when
|
||
it is impossible to fulfill a requirement if it can't detect it.
|
||
@param reqs the requirement vector to check the possibility of.
|
||
@return TRUE iff the requirement vector never can be fulfilled.
|
||
**************************************************************************/
|
||
... | ... | |
/**********************************************************************//**
|
||
Returns the requirement vector number of the specified requirement
|
||
vector in the specified requirement vector.
|
||
@param parent_item the item that may own the vector.
|
||
@param vec the requirement vector to number.
|
||
@return the requirement vector number the vector has in the parent item.
|
||
... | ... | |
/********************************************************************//**
|
||
Returns a writable pointer to the specified requirement vector in the
|
||
specified requirement vector or NULL if the parent item doesn't have a
|
||
requirement vector with that requirement vector number.
|
||
specified requirement vector or nullptr if the parent item doesn't have
|
||
a requirement vector with that requirement vector number.
|
||
@param parent_item the item that should have the requirement vector.
|
||
@param number the item's requirement vector number.
|
||
@return a pointer to the specified requirement vector.
|
||
... | ... | |
struct requirement_vector *
|
||
req_vec_by_number(const void *parent_item, req_vec_num_in_item number)
|
||
{
|
||
fc_assert_ret_val(number == 0, NULL);
|
||
fc_assert_ret_val(number == 0, nullptr);
|
||
return (struct requirement_vector *)parent_item;
|
||
}
|
||
... | ... | |
ready for use in the user interface.
|
||
N.B.: The returned string is static, so every call to this function
|
||
overwrites the previous.
|
||
@param change the requirement vector change
|
||
@param namer a function that returns a description of the vector to
|
||
change for the item the vector belongs to.
|
||
... | ... | |
static char buf[MAX_LEN_NAME * 3];
|
||
struct astring astr;
|
||
fc_assert_ret_val(change, NULL);
|
||
fc_assert_ret_val(change, nullptr);
|
||
fc_assert_ret_val(req_vec_change_operation_is_valid(change->operation),
|
||
NULL);
|
||
nullptr);
|
||
/* Get rid of the previous. */
|
||
buf[0] = '\0';
|
||
if (namer == NULL) {
|
||
if (namer == nullptr) {
|
||
/* TRANS: default description of a requirement vector
|
||
* (used in ruledit) */
|
||
req_vec_description = _("the requirement vector");
|
||
... | ... | |
/**********************************************************************//**
|
||
Returns TRUE iff the specified requirement vector modification was
|
||
successfully applied to the specified target requirement vector.
|
||
@param modification the requirement vector change
|
||
@param getter a function that returns a pointer to the requirement
|
||
vector the change should be applied to given a ruleset
|
||
... | ... | |
Returns a new requirement vector problem with the specified number of
|
||
suggested solutions and the specified description. The suggestions are
|
||
added by the caller.
|
||
@param num_suggested_solutions the number of suggested solutions.
|
||
@param description the description of the problem.
|
||
@param description_translated the translated description of the problem.
|
||
... | ... | |
Returns a new requirement vector problem with the specified number of
|
||
suggested solutions and the specified description. The suggestions are
|
||
added by the caller.
|
||
@param num_suggested_solutions the number of suggested solutions.
|
||
@param descr the description of the problem as a format string
|
||
@return the new requirement vector problem.
|
||
... | ... | |
/**********************************************************************//**
|
||
De-allocates resources associated with the given requirement vector
|
||
problem.
|
||
@param issue the no longer needed problem.
|
||
**************************************************************************/
|
||
void req_vec_problem_free(struct req_vec_problem *issue)
|
||
... | ... | |
/**********************************************************************//**
|
||
Returns the first self contradiction found in the specified requirement
|
||
vector with suggested solutions or NULL if no contradiction was found.
|
||
vector with suggested solutions or nullptr if no contradiction was found.
|
||
It is the responsibility of the caller to free the suggestion when it is
|
||
done with it.
|
||
@param vec the requirement vector to look in.
|
||
@param get_num function that returns the requirement vector's number in
|
||
the parent item.
|
||
... | ... | |
int i, j;
|
||
req_vec_num_in_item vec_num;
|
||
if (vec == NULL || requirement_vector_size(vec) == 0) {
|
||
if (vec == nullptr || requirement_vector_size(vec) == 0) {
|
||
/* No vector. */
|
||
return NULL;
|
||
return nullptr;
|
||
}
|
||
if (get_num == NULL || parent_item == NULL) {
|
||
if (get_num == nullptr || parent_item == nullptr) {
|
||
vec_num = 0;
|
||
} else {
|
||
vec_num = get_num(parent_item, vec);
|
||
... | ... | |
}
|
||
}
|
||
return NULL;
|
||
return nullptr;
|
||
}
|
||
/**********************************************************************//**
|
||
Returns a suggestion to fix the specified requirement vector or NULL if
|
||
Returns a suggestion to fix the specified requirement vector or nullptr if
|
||
no fix is found to be needed. It is the responsibility of the caller to
|
||
free the suggestion when it is done with it.
|
||
@param vec the requirement vector to look in.
|
||
@param get_num function that returns the requirement vector's number in
|
||
the parent item.
|
||
... | ... | |
/**********************************************************************//**
|
||
Returns the first universal known to always be absent in the specified
|
||
requirement vector with suggested solutions or NULL if no missing
|
||
requirement vector with suggested solutions or nullptr if no missing
|
||
universals were found.
|
||
It is the responsibility of the caller to free the suggestion when it is
|
||
done with it.
|
||
@param vec the requirement vector to look in.
|
||
@param get_num function that returns the requirement vector's number in
|
||
the parent item.
|
||
... | ... | |
{
|
||
int i;
|
||
req_vec_num_in_item vec_num;
|
||
struct req_vec_problem *problem = NULL;
|
||
struct req_vec_problem *problem = nullptr;
|
||
if (vec == NULL || requirement_vector_size(vec) == 0) {
|
||
if (vec == nullptr || requirement_vector_size(vec) == 0) {
|
||
/* No vector. */
|
||
return NULL;
|
||
return nullptr;
|
||
}
|
||
if (get_num == NULL || parent_item == NULL) {
|
||
if (get_num == nullptr || parent_item == nullptr) {
|
||
vec_num = 0;
|
||
} else {
|
||
vec_num = get_num(parent_item, vec);
|
||
... | ... | |
* requirement makes it possible to fulfill it. This is a rule
|
||
* change and shouldn't be "fixed" without thinking. Don't offer any
|
||
* automatic solution to prevent mindless "fixes". */
|
||
/* TRANS: ruledit warns a user about an unused requirement vector
|
||
/* TRANS: Ruledit warns a user about an unused requirement vector
|
||
* that never can be fulfilled because it asks for something that
|
||
* never will be there. */
|
||
if (problem == NULL) {
|
||
if (problem == nullptr) {
|
||
problem = req_vec_problem_new(0,
|
||
N_("Requirement {%s} requires %s but it will never be"
|
||
" there."),
|
||
... | ... | |
continue;
|
||
}
|
||
if (problem != NULL) {
|
||
if (problem != nullptr) {
|
||
/* Free previous one (one with no solution proposals) */
|
||
req_vec_problem_free(problem);
|
||
}
|
||
... | ... | |
/**********************************************************************//**
|
||
Returns the first redundant requirement in the specified requirement
|
||
vector with suggested solutions or NULL if no redundant requirements were
|
||
vector with suggested solutions or nullptr if no redundant requirements were
|
||
found.
|