Project

General

Profile

Feature #1501 ยป 0084-Add-government-flag-requirement-type.patch

Marko Lindqvist, 07/12/2025 02:08 PM

View differences:

ai/default/daieffects.c
/* We can't meet a government requirement if we have a better one. */
return !have_better_government(pplayer, preq->source.value.govern);
case VUT_GOVFLAG:
break;
case VUT_IMPROVEMENT:
case VUT_SITE:
{
ai/default/daimilitary.c
case VUT_UTFLAG:
case VUT_UCLASS:
case VUT_UCFLAG:
/* FIXME: support converting siege machines (needs hard reqs checked) */
/* FIXME: Support converting siege machines (needs hard reqs checked) */
case VUT_ACTION:
case VUT_OTYPE:
case VUT_SPECIALIST:
......
case VUT_ADVANCE:
case VUT_TECHFLAG:
case VUT_GOVERNMENT:
case VUT_GOVFLAG:
case VUT_ACHIEVEMENT:
case VUT_IMPR_GENUS:
case VUT_IMPR_FLAG:
common/fc_types.h
(x == RPT_CERTAIN ? RPT_POSSIBLE : RPT_CERTAIN)
/* Originally in requirements.h, bumped up and revised to unify with
* city_production and worklists. Functions remain in requirements.c
* city_production and worklists. Functions remain in requirements.c
* Used in the network protocol. */
typedef union {
struct advance *advance;
......
Output_type_id outputtype;
int terrainclass; /* enum terrain_class */
int terrainalter; /* enum terrain_alteration */
int govflag; /* enum gov_flag_id */
int unitclassflag; /* enum unit_class_flag_id */
int unitflag; /* enum unit_flag_id */
int terrainflag; /* enum terrain_flag_id */
common/reqtext.c
}
return TRUE;
case VUT_GOVFLAG:
if (preq->range != REQ_RANGE_PLAYER) {
break;
}
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Requires a %s government."),
gov_flag_id_translated_name(preq->source.value.govflag));
} else {
cat_snprintf(buf, bufsz, _("Not available under a %s government."),
gov_flag_id_translated_name(preq->source.value.govflag));
}
return TRUE;
case VUT_ACHIEVEMENT:
switch (preq->range) {
case REQ_RANGE_PLAYER:
common/requirements.c
return;
}
break;
case VUT_GOVFLAG:
source->value.govflag = gov_flag_id_by_name(value, fc_strcasecmp);
if (gov_flag_id_is_valid(source->value.govflag)) {
return;
}
break;
case VUT_ACHIEVEMENT:
source->value.achievement = achievement_by_rule_name(value);
if (source->value.achievement != nullptr) {
......
return source;
}
break;
case VUT_GOVFLAG:
source.value.govflag = value;
return source;
case VUT_ACHIEVEMENT:
source.value.achievement = achievement_by_number(value);
if (source.value.achievement != nullptr) {
......
return source->value.techflag;
case VUT_GOVERNMENT:
return government_number(source->value.govern);
case VUT_GOVFLAG:
return source->value.govflag;
case VUT_ACHIEVEMENT:
return achievement_number(source->value.achievement);
case VUT_STYLE:
......
req.range = REQ_RANGE_CITY;
break;
case VUT_GOVERNMENT:
case VUT_GOVFLAG:
case VUT_ACHIEVEMENT:
case VUT_STYLE:
case VUT_ADVANCE:
......
&& req.range != REQ_RANGE_LOCAL);
break;
case VUT_GOVERNMENT:
case VUT_GOVFLAG:
case VUT_AI_LEVEL:
case VUT_STYLE:
case VUT_MINCITIES:
......
case VUT_PLAYER_FLAG:
case VUT_PLAYER_STATE:
case VUT_GOVERNMENT:
case VUT_GOVFLAG:
case VUT_TERRAIN:
case VUT_UTYPE:
case VUT_UTFLAG:
......
}
}
/**********************************************************************//**
Determine whether a government flag requirement is satisfied in a given
context, ignoring parts of the requirement that can be handled uniformly
for all requirement types.
context, other_context and req must not be null,
and req must be a gov flag requirement
**************************************************************************/
static enum fc_tristate
is_govflag_req_active(const struct civ_map *nmap,
const struct req_context *context,
const struct req_context *other_context,
const struct requirement *req)
{
IS_REQ_ACTIVE_VARIANT_ASSERT(VUT_GOVFLAG);
if (context->player == nullptr) {
return TRI_MAYBE;
} else {
return BOOL_TO_TRISTATE(BV_ISSET(government_of_player(context->player)->flags,
req->source.value.govflag));
}
}
/**********************************************************************//**
Determine whether a style requirement is satisfied in a given context,
ignoring parts of the requirement that can be handled uniformly for all
......
[VUT_FUTURETECHS] = {is_futuretechs_req_active, REQUCH_ACT, REQUC_WORLD},
[VUT_GOOD] = {is_good_req_active, REQUCH_NO},
[VUT_GOVERNMENT] = {is_gov_req_active, REQUCH_NO},
[VUT_GOVFLAG] = {is_govflag_req_active, REQUCH_NO},
[VUT_IMPROVEMENT] = {is_building_req_active, REQUCH_NO, REQUC_IMPR},
[VUT_SITE] = {is_building_req_active, REQUCH_NO, REQUC_IMPR},
[VUT_IMPR_GENUS] = {is_buildinggenus_req_active, REQUCH_YES},
......
case VUT_ADVANCE:
case VUT_TECHFLAG:
case VUT_GOVERNMENT:
case VUT_GOVFLAG:
case VUT_ACHIEVEMENT:
case VUT_IMPROVEMENT:
case VUT_SITE:
......
return psource1->value.techflag == psource2->value.techflag;
case VUT_GOVERNMENT:
return psource1->value.govern == psource2->value.govern;
case VUT_GOVFLAG:
return psource1->value.govflag == psource2->value.govflag;
case VUT_ACHIEVEMENT:
return psource1->value.achievement == psource2->value.achievement;
case VUT_STYLE:
......
return tech_flag_id_name(psource->value.techflag);
case VUT_GOVERNMENT:
return government_rule_name(psource->value.govern);
case VUT_GOVFLAG:
return gov_flag_id_name(psource->value.govflag);
case VUT_ACHIEVEMENT:
return achievement_rule_name(psource->value.achievement);
case VUT_STYLE:
......
fc_strlcat(buf, government_name_translation(psource->value.govern),
bufsz);
return buf;
case VUT_GOVFLAG:
cat_snprintf(buf, bufsz, _("\"%s\" gov"),
gov_flag_id_translated_name(psource->value.govflag));
return buf;
case VUT_ACHIEVEMENT:
fc_strlcat(buf, achievement_name_translation(psource->value.achievement),
bufsz);
......
if (preq->source.kind == VUT_GOVERNMENT) {
return preq->source.value.govern == source->value.govern ? ITF_YES
: ITF_NO;
} else if (preq->source.kind == VUT_GOVFLAG) {
return BV_ISSET(source->value.govern->flags, preq->source.value.govflag)
? ITF_YES : ITF_NO;
}
return ITF_NOT_APPLICABLE;
doc/README.effects
Achievement: World, Alliance, Team, Player
Counter: City
Gov: Player
GovFlag: Player
Building: World, Alliance, Team, Player, Continent, Traderoute,
City, Tile, Local
BuildingFlag: Local, Tile, City
gen_headers/enums/fc_types_enums.def
FUTURETECHS "FutureTechs"
GOOD "Good"
GOVERNMENT "Gov"
GOVFLAG "GovFlag"
IMPROVEMENT "Building"
IMPR_FLAG "BuildingFlag"
IMPR_GENUS "BuildingGenus"
server/cityturn.c
pcity, "have_government");
}
break;
case VUT_GOVFLAG:
if (preq->present) {
notify_player(pplayer, city_tile(pcity),
E_CITY_CANTBUILD, ftc_server,
_("%s can't build %s from the worklist; "
"it needs %s government. Postponing..."),
city_link(pcity),
tgt_name,
gov_flag_id_translated_name(preq->source.value.govflag));
script_server_signal_emit(signal_name, ptarget,
pcity, "need_govflag");
} else {
notify_player(pplayer, city_tile(pcity),
E_CITY_CANTBUILD, ftc_server,
_("%s can't build %s from the worklist; "
"it cannot have %s government. Postponing..."),
city_link(pcity),
tgt_name,
gov_flag_id_translated_name(preq->source.value.govflag));
script_server_signal_emit(signal_name, ptarget,
pcity, "have_govflag");
}
break;
case VUT_ACHIEVEMENT:
if (preq->present) {
notify_player(pplayer, city_tile(pcity),
server/ruleset/rssanity.c
case VUT_UCLASS:
case VUT_TILE_REL:
/* Can check different properties. */
case VUT_GOVFLAG:
case VUT_UTFLAG:
case VUT_UCFLAG:
case VUT_TERRFLAG:
tools/ruledit/univ_value.c
case VUT_GOVERNMENT:
src->value.govern = game.government_during_revolution;
return TRUE;
case VUT_GOVFLAG:
src->value.govflag = 0;
return TRUE;
case VUT_IMPROVEMENT:
case VUT_SITE:
if (game.control.num_impr_types <= 0) {
......
cb(government_rule_name(pgov), univ->value.govern == pgov, data);
} governments_re_active_iterate_end;
break;
case VUT_GOVFLAG:
for (i = 0; i < GOVF_LAST_USER_FLAG; i++) {
cb(gov_flag_id_name(i), univ->value.govflag == i, data);
}
break;
case VUT_IMPROVEMENT:
case VUT_SITE:
improvement_re_active_iterate(pimpr) {
    (1-1/1)