Feature #1425 ยป 0064-Add-FutureTechs-requirement-type.patch
| ai/default/daieffects.c | ||
|---|---|---|
|
case VUT_ACHIEVEMENT:
|
||
|
case VUT_MINCULTURE:
|
||
|
case VUT_MINTECHS:
|
||
|
case VUT_FUTURETECHS:
|
||
|
/* No way to remove once present. */
|
||
|
return preq->present;
|
||
| ai/default/daimilitary.c | ||
|---|---|---|
|
case VUT_PLAYER_STATE:
|
||
|
case VUT_MINCULTURE:
|
||
|
case VUT_MINTECHS:
|
||
|
case VUT_FUTURETECHS:
|
||
|
case VUT_MINCITIES:
|
||
|
case VUT_ORIGINAL_OWNER:
|
||
|
case VUT_ROADFLAG:
|
||
| common/fc_types.h | ||
|---|---|---|
|
int age;
|
||
|
int form_age;
|
||
|
int min_techs;
|
||
|
int future_techs;
|
||
|
int min_cities;
|
||
|
int latitude;
|
||
|
int distance_sq;
|
||
| common/reqtext.c | ||
|---|---|---|
|
}
|
||
|
break;
|
||
|
case VUT_FUTURETECHS:
|
||
|
switch (preq->range) {
|
||
|
case REQ_RANGE_WORLD:
|
||
|
fc_strlcat(buf, prefix, bufsz);
|
||
|
if (preq->present) {
|
||
|
cat_snprintf(buf, bufsz,
|
||
|
_("Requires %d future techs to be known in the world."),
|
||
|
preq->source.value.future_techs);
|
||
|
} else {
|
||
|
cat_snprintf(buf, bufsz,
|
||
|
_("Prevented when %d future techs are known in the world."),
|
||
|
preq->source.value.future_techs);
|
||
|
}
|
||
|
return TRUE;
|
||
|
case REQ_RANGE_PLAYER:
|
||
|
fc_strlcat(buf, prefix, bufsz);
|
||
|
if (preq->present) {
|
||
|
cat_snprintf(buf, bufsz,
|
||
|
_("Requires player to know %d future techs."),
|
||
|
preq->source.value.future_techs);
|
||
|
} else {
|
||
|
cat_snprintf(buf, bufsz,
|
||
|
_("Prevented when player knows %d future techs."),
|
||
|
preq->source.value.future_techs);
|
||
|
}
|
||
|
return TRUE;
|
||
|
case REQ_RANGE_LOCAL:
|
||
|
case REQ_RANGE_TILE:
|
||
|
case REQ_RANGE_CADJACENT:
|
||
|
case REQ_RANGE_ADJACENT:
|
||
|
case REQ_RANGE_CITY:
|
||
|
case REQ_RANGE_TRADE_ROUTE:
|
||
|
case REQ_RANGE_CONTINENT:
|
||
|
case REQ_RANGE_TEAM:
|
||
|
case REQ_RANGE_ALLIANCE:
|
||
|
case REQ_RANGE_COUNT:
|
||
|
/* Not supported. */
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case VUT_MINCITIES:
|
||
|
switch (preq->range) {
|
||
|
case REQ_RANGE_PLAYER:
|
||
| common/requirements.c | ||
|---|---|---|
|
return;
|
||
|
}
|
||
|
break;
|
||
|
case VUT_FUTURETECHS:
|
||
|
source->value.future_techs = atoi(value);
|
||
|
if (source->value.future_techs > 0) {
|
||
|
return;
|
||
|
}
|
||
|
break;
|
||
|
case VUT_MINCITIES:
|
||
|
source->value.min_cities = atoi(value);
|
||
|
if (source->value.min_cities > 0) {
|
||
| ... | ... | |
|
case VUT_MINTECHS:
|
||
|
source.value.min_techs = value;
|
||
|
return source;
|
||
|
case VUT_FUTURETECHS:
|
||
|
source.value.future_techs = value;
|
||
|
return source;
|
||
|
case VUT_MINCITIES:
|
||
|
source.value.min_cities = value;
|
||
|
return source;
|
||
| ... | ... | |
|
return source->value.form_age;
|
||
|
case VUT_MINTECHS:
|
||
|
return source->value.min_techs;
|
||
|
case VUT_FUTURETECHS:
|
||
|
return source->value.future_techs;
|
||
|
case VUT_MINCITIES:
|
||
|
return source->value.min_cities;
|
||
|
case VUT_ACTION:
|
||
| ... | ... | |
|
case VUT_PLAYER_FLAG:
|
||
|
case VUT_PLAYER_STATE:
|
||
|
case VUT_MINCITIES:
|
||
|
case VUT_FUTURETECHS:
|
||
|
req.range = REQ_RANGE_PLAYER;
|
||
|
break;
|
||
|
case VUT_MINYEAR:
|
||
| ... | ... | |
|
break;
|
||
|
case VUT_ACHIEVEMENT:
|
||
|
case VUT_MINTECHS:
|
||
|
case VUT_FUTURETECHS:
|
||
|
invalid = (req.range < REQ_RANGE_PLAYER);
|
||
|
break;
|
||
|
case VUT_ADVANCE:
|
||
| ... | ... | |
|
case VUT_DIPLREL_UNITANY_O:
|
||
|
case VUT_MAXTILEUNITS:
|
||
|
case VUT_MINTECHS:
|
||
|
case VUT_FUTURETECHS:
|
||
|
case VUT_MINCITIES:
|
||
|
case VUT_MINLATITUDE:
|
||
|
case VUT_MAXLATITUDE:
|
||
| ... | ... | |
|
}
|
||
|
}
|
||
|
/**********************************************************************//**
|
||
|
Determine whether a minimum future technologies 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 mintechs requirement
|
||
|
**************************************************************************/
|
||
|
static enum fc_tristate
|
||
|
is_futuretechs_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_FUTURETECHS);
|
||
|
switch (req->range) {
|
||
|
case REQ_RANGE_WORLD:
|
||
|
players_iterate_alive(plr) {
|
||
|
if (research_get(plr)->future_tech
|
||
|
>= req->source.value.future_techs) {
|
||
|
return TRI_YES;
|
||
|
}
|
||
|
} players_iterate_alive_end;
|
||
|
return TRI_NO;
|
||
|
case REQ_RANGE_PLAYER:
|
||
|
if (context->player == nullptr) {
|
||
|
return TRI_MAYBE;
|
||
|
} else {
|
||
|
return BOOL_TO_TRISTATE(research_get(context->player)->future_tech
|
||
|
>= req->source.value.future_techs);
|
||
|
}
|
||
|
default:
|
||
|
return TRI_MAYBE;
|
||
|
}
|
||
|
}
|
||
|
/**********************************************************************//**
|
||
|
Determine whether a minimum cities count requirement is satisfied in a
|
||
|
given context, ignoring parts of the requirement that can be handled
|
||
| ... | ... | |
|
[VUT_DIPLREL_UNITANY_O] = {is_diplrel_unitany_o_req_active, REQUCH_NO},
|
||
|
[VUT_EXTRA] = {is_extra_req_active, REQUCH_NO, REQUC_LOCAL},
|
||
|
[VUT_EXTRAFLAG] = {is_extraflag_req_active, REQUCH_NO, REQUC_LOCAL},
|
||
|
[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_IMPROVEMENT] = {is_building_req_active, REQUCH_NO, REQUC_IMPR},
|
||
| ... | ... | |
|
case VUT_MINCULTURE:
|
||
|
case VUT_MINFOREIGNPCT:
|
||
|
case VUT_MINTECHS:
|
||
|
case VUT_FUTURETECHS:
|
||
|
case VUT_MINCITIES:
|
||
|
case VUT_NATIONALITY:
|
||
|
case VUT_ORIGINAL_OWNER: /* As long as midgame player creation or civil war possible */
|
||
| ... | ... | |
|
return psource1->value.form_age == psource2->value.form_age;
|
||
|
case VUT_MINTECHS:
|
||
|
return psource1->value.min_techs == psource2->value.min_techs;
|
||
|
case VUT_FUTURETECHS:
|
||
|
return psource1->value.future_techs == psource2->value.future_techs;
|
||
|
case VUT_MINCITIES:
|
||
|
return psource1->value.min_cities == psource2->value.min_cities;
|
||
|
case VUT_ACTION:
|
||
| ... | ... | |
|
case VUT_MINTECHS:
|
||
|
fc_snprintf(buffer, sizeof(buffer), "%d", psource->value.min_techs);
|
||
|
return buffer;
|
||
|
case VUT_FUTURETECHS:
|
||
|
fc_snprintf(buffer, sizeof(buffer), "%d", psource->value.future_techs);
|
||
|
return buffer;
|
||
|
case VUT_MINCITIES:
|
||
|
fc_snprintf(buffer, sizeof(buffer), "%d", psource->value.min_cities);
|
||
| ... | ... | |
|
cat_snprintf(buf, bufsz, _("%d Techs"),
|
||
|
psource->value.min_techs);
|
||
|
return buf;
|
||
|
case VUT_FUTURETECHS:
|
||
|
cat_snprintf(buf, bufsz, _("%d Future techs"),
|
||
|
psource->value.future_techs);
|
||
|
return buf;
|
||
|
case VUT_MINCITIES:
|
||
|
cat_snprintf(buf, bufsz, _("%d Cities"),
|
||
|
psource->value.min_cities);
|
||
| doc/README.effects | ||
|---|---|---|
|
Tech: World, Alliance, Team, Player, Local
|
||
|
TechFlag: World, Alliance, Team, Player, Local
|
||
|
MinTechs: World, Player
|
||
|
FutureTechs: World, Player
|
||
|
MinCities: Player
|
||
|
Achievement: World, Alliance, Team, Player
|
||
|
Counter: City
|
||
| gen_headers/enums/fc_types_enums.def | ||
|---|---|---|
|
EXTRA "Extra"
|
||
|
EXTRAFLAG "ExtraFlag"
|
||
|
FORM_AGE "FormAge"
|
||
|
FUTURETECHS "FutureTechs"
|
||
|
GOOD "Good"
|
||
|
GOVERNMENT "Gov"
|
||
|
IMPROVEMENT "Building"
|
||
| server/cityturn.c | ||
|---|---|---|
|
purge = TRUE;
|
||
|
}
|
||
|
break;
|
||
|
case VUT_FUTURETECHS:
|
||
|
if (preq->present) {
|
||
|
notify_player(pplayer, city_tile(pcity),
|
||
|
E_CITY_CANTBUILD, ftc_server,
|
||
|
_("%s can't build %s from the worklist; "
|
||
|
"%d future techs must be known. Postponing..."),
|
||
|
city_link(pcity),
|
||
|
tgt_name,
|
||
|
preq->source.value.future_techs);
|
||
|
script_server_signal_emit(signal_name, ptarget,
|
||
|
pcity, "need_futuretechs");
|
||
|
} else {
|
||
|
purge = TRUE;
|
||
|
}
|
||
|
break;
|
||
|
case VUT_MINCITIES:
|
||
|
if (preq->present) {
|
||
|
notify_player(pplayer, city_tile(pcity),
|
||
| server/ruleset/rssanity.c | ||
|---|---|---|
|
break;
|
||
|
case VUT_MINTECHS:
|
||
|
case VUT_FUTURETECHS:
|
||
|
/* At ranges 'Player' and 'World' */
|
||
|
if (rc > 2) {
|
||
|
ruleset_error(logger, LOG_ERROR,
|
||
| tools/ruledit/univ_value.c | ||
|---|---|---|
|
case VUT_MINTECHS:
|
||
|
src->value.min_techs = 0;
|
||
|
return TRUE;
|
||
|
case VUT_FUTURETECHS:
|
||
|
src->value.future_techs = 0;
|
||
|
return TRUE;
|
||
|
case VUT_MINCITIES:
|
||
|
src->value.min_cities = 0;
|
||
|
return TRUE;
|
||
| ... | ... | |
|
case VUT_AGE:
|
||
|
case VUT_FORM_AGE:
|
||
|
case VUT_MINTECHS:
|
||
|
case VUT_FUTURETECHS:
|
||
|
case VUT_MINCITIES:
|
||
|
case VUT_MINLATITUDE:
|
||
|
case VUT_MAXLATITUDE:
|
||