Feature #1501 ยป 0084-Add-government-flag-requirement-type.patch
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) {
|