Feature #1505 » 0082-Add-MaxTopUnitsOnTile-requirement-type.patch
| ai/default/daieffects.c | ||
|---|---|---|
|
case VUT_DIPLREL_TILE_O:
|
||
|
case VUT_DIPLREL_UNITANY:
|
||
|
case VUT_DIPLREL_UNITANY_O:
|
||
|
case VUT_MAXTILEUNITS:
|
||
|
case VUT_MAXTILETOTALUNITS:
|
||
|
case VUT_MAXTILETOPUNITS:
|
||
|
case VUT_STYLE:
|
||
|
case VUT_UNITSTATE:
|
||
|
case VUT_ACTIVITY:
|
||
| ai/default/daimilitary.c | ||
|---|---|---|
|
case VUT_UNITSTATE:
|
||
|
case VUT_ACTIVITY:
|
||
|
case VUT_MINSIZE:
|
||
|
case VUT_MAXTILEUNITS:
|
||
|
case VUT_MAXTILETOTALUNITS:
|
||
|
case VUT_MAXTILETOPUNITS:
|
||
|
case VUT_MINHP:
|
||
|
case VUT_MINMOVES:
|
||
|
case VUT_COUNTER:
|
||
| common/fc_types.h | ||
|---|---|---|
|
enum impr_flag_id impr_flag;
|
||
|
enum plr_flag_id plr_flag;
|
||
|
int minmoves;
|
||
|
int max_tile_units;
|
||
|
int max_tile_total_units;
|
||
|
int max_tile_top_units;
|
||
|
int minveteran;
|
||
|
int min_hit_points;
|
||
|
int age;
|
||
| common/metaknowledge.c | ||
|---|---|---|
|
}
|
||
|
}
|
||
|
if (req->source.kind == VUT_MAXTILEUNITS) {
|
||
|
if (req->source.kind == VUT_MAXTILETOTALUNITS
|
||
|
|| req->source.kind == VUT_MAXTILETOPUNITS) {
|
||
|
if (context->tile == nullptr) {
|
||
|
/* The tile may exist but not be passed when the problem type is
|
||
|
* RPT_POSSIBLE. */
|
||
| common/oblig_reqs.c | ||
|---|---|---|
|
* conquer a city belonging to someone they were at war with.
|
||
|
* Conclusion: the conquered city had to be empty.
|
||
|
*/
|
||
|
oblig_hard_req_register(req_from_values(VUT_MAXTILEUNITS, REQ_RANGE_TILE,
|
||
|
oblig_hard_req_register(req_from_values(VUT_MAXTILETOTALUNITS, REQ_RANGE_TILE,
|
||
|
FALSE, FALSE, TRUE, 0),
|
||
|
TRUE,
|
||
|
N_("All action enablers for %s must require"
|
||
| common/reqtext.c | ||
|---|---|---|
|
}
|
||
|
break;
|
||
|
case VUT_MAXTILEUNITS:
|
||
|
case VUT_MAXTILETOTALUNITS:
|
||
|
switch (preq->range) {
|
||
|
case REQ_RANGE_TILE:
|
||
|
fc_strlcat(buf, prefix, bufsz);
|
||
|
if (preq->present) {
|
||
|
cat_snprintf(buf, bufsz,
|
||
|
PL_("At most %d unit may be present on the tile.",
|
||
|
"At most %d units may be present on the tile.",
|
||
|
preq->source.value.max_tile_units),
|
||
|
preq->source.value.max_tile_units);
|
||
|
PL_("At most %d total unit may be present on the tile.",
|
||
|
"At most %d total units may be present on the tile.",
|
||
|
preq->source.value.max_tile_total_units),
|
||
|
preq->source.value.max_tile_total_units);
|
||
|
} else {
|
||
|
cat_snprintf(buf, bufsz,
|
||
|
PL_("There must be more than %d unit present on "
|
||
|
PL_("There must be more than %d total unit present on "
|
||
|
"the tile.",
|
||
|
"There must be more than %d units present on "
|
||
|
"There must be more than %d total units present on "
|
||
|
"the tile.",
|
||
|
preq->source.value.max_tile_units),
|
||
|
preq->source.value.max_tile_units);
|
||
|
preq->source.value.max_tile_total_units),
|
||
|
preq->source.value.max_tile_total_units);
|
||
|
}
|
||
|
return TRUE;
|
||
|
case REQ_RANGE_CADJACENT:
|
||
| ... | ... | |
|
if (preq->present) {
|
||
|
cat_snprintf(buf, bufsz,
|
||
|
PL_("The tile or at least one cardinally adjacent tile "
|
||
|
"must have %d unit or fewer.",
|
||
|
"must have %d total unit or fewer.",
|
||
|
"The tile or at least one cardinally adjacent tile "
|
||
|
"must have %d units or fewer.",
|
||
|
preq->source.value.max_tile_units),
|
||
|
preq->source.value.max_tile_units);
|
||
|
"must have %d total units or fewer.",
|
||
|
preq->source.value.max_tile_total_units),
|
||
|
preq->source.value.max_tile_total_units);
|
||
|
} else {
|
||
|
cat_snprintf(buf, bufsz,
|
||
|
PL_("The tile and all cardinally adjacent tiles must "
|
||
|
"have more than %d unit each.",
|
||
|
"have more than %d total unit each.",
|
||
|
"The tile and all cardinally adjacent tiles must "
|
||
|
"have more than %d units each.",
|
||
|
preq->source.value.max_tile_units),
|
||
|
preq->source.value.max_tile_units);
|
||
|
"have more than %d total units each.",
|
||
|
preq->source.value.max_tile_total_units),
|
||
|
preq->source.value.max_tile_total_units);
|
||
|
}
|
||
|
return TRUE;
|
||
|
case REQ_RANGE_ADJACENT:
|
||
| ... | ... | |
|
if (preq->present) {
|
||
|
cat_snprintf(buf, bufsz,
|
||
|
PL_("The tile or at least one adjacent tile must have "
|
||
|
"%d unit or fewer.",
|
||
|
"%d total unit or fewer.",
|
||
|
"The tile or at least one adjacent tile must have "
|
||
|
"%d units or fewer.",
|
||
|
preq->source.value.max_tile_units),
|
||
|
preq->source.value.max_tile_units);
|
||
|
"%d total units or fewer.",
|
||
|
preq->source.value.max_tile_total_units),
|
||
|
preq->source.value.max_tile_total_units);
|
||
|
} else {
|
||
|
cat_snprintf(buf, bufsz,
|
||
|
PL_("The tile and all adjacent tiles must have more "
|
||
|
"than %d unit each.",
|
||
|
"than %d total unit each.",
|
||
|
"The tile and all adjacent tiles must have more "
|
||
|
"than %d units each.",
|
||
|
preq->source.value.max_tile_units),
|
||
|
preq->source.value.max_tile_units);
|
||
|
"than %d total units each.",
|
||
|
preq->source.value.max_tile_total_units),
|
||
|
preq->source.value.max_tile_total_units);
|
||
|
}
|
||
|
return TRUE;
|
||
|
case REQ_RANGE_CITY:
|
||
|
case REQ_RANGE_TRADE_ROUTE:
|
||
|
case REQ_RANGE_CONTINENT:
|
||
|
case REQ_RANGE_PLAYER:
|
||
|
case REQ_RANGE_TEAM:
|
||
|
case REQ_RANGE_ALLIANCE:
|
||
|
case REQ_RANGE_WORLD:
|
||
|
case REQ_RANGE_LOCAL:
|
||
|
case REQ_RANGE_COUNT:
|
||
|
/* Not supported. */
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case VUT_MAXTILETOPUNITS:
|
||
|
switch (preq->range) {
|
||
|
case REQ_RANGE_TILE:
|
||
|
fc_strlcat(buf, prefix, bufsz);
|
||
|
if (preq->present) {
|
||
|
cat_snprintf(buf, bufsz,
|
||
|
PL_("At most %d unit may be directly present on the tile.",
|
||
|
"At most %d units may be directly present on the tile.",
|
||
|
preq->source.value.max_tile_top_units),
|
||
|
preq->source.value.max_tile_top_units);
|
||
|
} else {
|
||
|
cat_snprintf(buf, bufsz,
|
||
|
PL_("There must be more than %d unit directly present on "
|
||
|
"the tile.",
|
||
|
"There must be more than %d units directly present on "
|
||
|
"the tile.",
|
||
|
preq->source.value.max_tile_top_units),
|
||
|
preq->source.value.max_tile_top_units);
|
||
|
}
|
||
|
return TRUE;
|
||
|
case REQ_RANGE_CADJACENT:
|
||
|
fc_strlcat(buf, prefix, bufsz);
|
||
|
if (preq->present) {
|
||
|
cat_snprintf(buf, bufsz,
|
||
|
PL_("The tile or at least one cardinally adjacent tile "
|
||
|
"must directly have %d unit or fewer.",
|
||
|
"The tile or at least one cardinally adjacent tile "
|
||
|
"must directly have %d units or fewer.",
|
||
|
preq->source.value.max_tile_top_units),
|
||
|
preq->source.value.max_tile_top_units);
|
||
|
} else {
|
||
|
cat_snprintf(buf, bufsz,
|
||
|
PL_("The tile and all cardinally adjacent tiles must "
|
||
|
"have directly more than %d unit each.",
|
||
|
"The tile and all cardinally adjacent tiles must "
|
||
|
"have directly more than %d units each.",
|
||
|
preq->source.value.max_tile_top_units),
|
||
|
preq->source.value.max_tile_top_units);
|
||
|
}
|
||
|
return TRUE;
|
||
|
case REQ_RANGE_ADJACENT:
|
||
|
fc_strlcat(buf, prefix, bufsz);
|
||
|
if (preq->present) {
|
||
|
cat_snprintf(buf, bufsz,
|
||
|
PL_("The tile or at least one adjacent tile must have "
|
||
|
"directly %d unit or fewer.",
|
||
|
"The tile or at least one adjacent tile must have "
|
||
|
"directly %d units or fewer.",
|
||
|
preq->source.value.max_tile_top_units),
|
||
|
preq->source.value.max_tile_top_units);
|
||
|
} else {
|
||
|
cat_snprintf(buf, bufsz,
|
||
|
PL_("The tile and all adjacent tiles must have "
|
||
|
"directly more than %d unit each.",
|
||
|
"The tile and all adjacent tiles must have "
|
||
|
"directly more than %d units each.",
|
||
|
preq->source.value.max_tile_top_units),
|
||
|
preq->source.value.max_tile_top_units);
|
||
|
}
|
||
|
return TRUE;
|
||
|
case REQ_RANGE_CITY:
|
||
| common/requirements.c | ||
|---|---|---|
|
return;
|
||
|
}
|
||
|
break;
|
||
|
case VUT_MAXTILEUNITS:
|
||
|
source->value.max_tile_units = atoi(value);
|
||
|
if (0 <= source->value.max_tile_units) {
|
||
|
case VUT_MAXTILETOTALUNITS:
|
||
|
source->value.max_tile_total_units = atoi(value);
|
||
|
if (0 <= source->value.max_tile_total_units) {
|
||
|
return;
|
||
|
}
|
||
|
break;
|
||
|
case VUT_MAXTILETOPUNITS:
|
||
|
source->value.max_tile_top_units = atoi(value);
|
||
|
if (0 <= source->value.max_tile_top_units) {
|
||
|
return;
|
||
|
}
|
||
|
break;
|
||
| ... | ... | |
|
case VUT_AI_LEVEL:
|
||
|
source.value.ai_level = value;
|
||
|
return source;
|
||
|
case VUT_MAXTILEUNITS:
|
||
|
source.value.max_tile_units = value;
|
||
|
case VUT_MAXTILETOTALUNITS:
|
||
|
source.value.max_tile_total_units = value;
|
||
|
return source;
|
||
|
case VUT_MAXTILETOPUNITS:
|
||
|
source.value.max_tile_top_units = value;
|
||
|
return source;
|
||
|
case VUT_TERRAINCLASS:
|
||
|
source.value.terrainclass = value;
|
||
| ... | ... | |
|
return source->value.minforeignpct;
|
||
|
case VUT_AI_LEVEL:
|
||
|
return source->value.ai_level;
|
||
|
case VUT_MAXTILEUNITS:
|
||
|
return source->value.max_tile_units;
|
||
|
case VUT_MAXTILETOTALUNITS:
|
||
|
return source->value.max_tile_total_units;
|
||
|
case VUT_MAXTILETOPUNITS:
|
||
|
return source->value.max_tile_top_units;
|
||
|
case VUT_TERRAINCLASS:
|
||
|
return source->value.terrainclass;
|
||
|
case VUT_ROADFLAG:
|
||
| ... | ... | |
|
case VUT_TERRAINCLASS:
|
||
|
case VUT_TERRAINALTER:
|
||
|
case VUT_CITYTILE:
|
||
|
case VUT_MAXTILEUNITS:
|
||
|
case VUT_MAXTILETOTALUNITS:
|
||
|
case VUT_MAXTILETOPUNITS:
|
||
|
case VUT_MINLATITUDE:
|
||
|
case VUT_MAXLATITUDE:
|
||
|
case VUT_MAX_DISTANCE_SQ:
|
||
| ... | ... | |
|
invalid = (req.range != REQ_RANGE_TILE);
|
||
|
break;
|
||
|
case VUT_CITYTILE:
|
||
|
case VUT_MAXTILEUNITS:
|
||
|
case VUT_MAXTILETOTALUNITS:
|
||
|
case VUT_MAXTILETOPUNITS:
|
||
|
invalid = (req.range != REQ_RANGE_TILE
|
||
|
&& req.range != REQ_RANGE_CADJACENT
|
||
|
&& req.range != REQ_RANGE_ADJACENT);
|
||
| ... | ... | |
|
case VUT_DIPLREL_TILE_O:
|
||
|
case VUT_DIPLREL_UNITANY:
|
||
|
case VUT_DIPLREL_UNITANY_O:
|
||
|
case VUT_MAXTILEUNITS:
|
||
|
case VUT_MAXTILETOTALUNITS:
|
||
|
case VUT_MAXTILETOPUNITS:
|
||
|
case VUT_MINTECHS:
|
||
|
case VUT_FUTURETECHS:
|
||
|
case VUT_MINCITIES:
|
||
| ... | ... | |
|
}
|
||
|
/**********************************************************************//**
|
||
|
Determine whether a maximum units on tile requirement is satisfied in a
|
||
|
given context, ignoring parts of the requirement that can be handled
|
||
|
Determine whether a maximum total units on tile 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 maxunitsontile requirement
|
||
|
**************************************************************************/
|
||
|
static enum fc_tristate
|
||
|
is_maxunitsontile_req_active(const struct civ_map *nmap,
|
||
|
const struct req_context *context,
|
||
|
const struct req_context *other_context,
|
||
|
const struct requirement *req)
|
||
|
is_maxtotalunitsontile_req_active(const struct civ_map *nmap,
|
||
|
const struct req_context *context,
|
||
|
const struct req_context *other_context,
|
||
|
const struct requirement *req)
|
||
|
{
|
||
|
int max_units;
|
||
|
IS_REQ_ACTIVE_VARIANT_ASSERT(VUT_MAXTILEUNITS);
|
||
|
IS_REQ_ACTIVE_VARIANT_ASSERT(VUT_MAXTILETOTALUNITS);
|
||
|
max_units = req->source.value.max_tile_units;
|
||
|
max_units = req->source.value.max_tile_total_units;
|
||
|
/* TODO: If can't see V_INVIS -> TRI_MAYBE */
|
||
|
switch (req->range) {
|
||
| ... | ... | |
|
return TRI_MAYBE;
|
||
|
}
|
||
|
/**********************************************************************//**
|
||
|
Determine whether a maximum top units on tile 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 maxunitsontile requirement
|
||
|
**************************************************************************/
|
||
|
static enum fc_tristate
|
||
|
is_maxtopunitsontile_req_active(const struct civ_map *nmap,
|
||
|
const struct req_context *context,
|
||
|
const struct req_context *other_context,
|
||
|
const struct requirement *req)
|
||
|
{
|
||
|
int max_units;
|
||
|
int count;
|
||
|
IS_REQ_ACTIVE_VARIANT_ASSERT(VUT_MAXTILETOPUNITS);
|
||
|
max_units = req->source.value.max_tile_top_units;
|
||
|
/* TODO: If can't see V_INVIS -> TRI_MAYBE */
|
||
|
switch (req->range) {
|
||
|
case REQ_RANGE_TILE:
|
||
|
if (!context->tile) {
|
||
|
return TRI_MAYBE;
|
||
|
}
|
||
|
count = 0;
|
||
|
unit_list_iterate(context->tile->units, punit) {
|
||
|
if (!unit_transported(punit)) {
|
||
|
count++;
|
||
|
}
|
||
|
} unit_list_iterate_end;
|
||
|
return BOOL_TO_TRISTATE(count <= max_units);
|
||
|
case REQ_RANGE_CADJACENT:
|
||
|
if (!context->tile) {
|
||
|
return TRI_MAYBE;
|
||
|
}
|
||
|
count = 0;
|
||
|
unit_list_iterate(context->tile->units, punit) {
|
||
|
if (!unit_transported(punit)) {
|
||
|
count++;
|
||
|
}
|
||
|
} unit_list_iterate_end;
|
||
|
if (count <= max_units) {
|
||
|
return TRI_YES;
|
||
|
}
|
||
|
cardinal_adjc_iterate(nmap, context->tile, adjc_tile) {
|
||
|
count = 0;
|
||
|
unit_list_iterate(adjc_tile->units, punit) {
|
||
|
if (!unit_transported(punit)) {
|
||
|
count++;
|
||
|
}
|
||
|
} unit_list_iterate_end;
|
||
|
if (count <= max_units) {
|
||
|
return TRI_YES;
|
||
|
}
|
||
|
} cardinal_adjc_iterate_end;
|
||
|
return TRI_NO;
|
||
|
case REQ_RANGE_ADJACENT:
|
||
|
if (!context->tile) {
|
||
|
return TRI_MAYBE;
|
||
|
}
|
||
|
count = 0;
|
||
|
unit_list_iterate(context->tile->units, punit) {
|
||
|
if (!unit_transported(punit)) {
|
||
|
count++;
|
||
|
}
|
||
|
} unit_list_iterate_end;
|
||
|
if (count <= max_units) {
|
||
|
return TRI_YES;
|
||
|
}
|
||
|
adjc_iterate(nmap, context->tile, adjc_tile) {
|
||
|
count = 0;
|
||
|
unit_list_iterate(adjc_tile->units, punit) {
|
||
|
if (!unit_transported(punit)) {
|
||
|
count++;
|
||
|
}
|
||
|
} unit_list_iterate_end;
|
||
|
if (count <= max_units) {
|
||
|
return TRI_YES;
|
||
|
}
|
||
|
} adjc_iterate_end;
|
||
|
return TRI_NO;
|
||
|
case REQ_RANGE_CITY:
|
||
|
case REQ_RANGE_TRADE_ROUTE:
|
||
|
case REQ_RANGE_CONTINENT:
|
||
|
case REQ_RANGE_PLAYER:
|
||
|
case REQ_RANGE_TEAM:
|
||
|
case REQ_RANGE_ALLIANCE:
|
||
|
case REQ_RANGE_WORLD:
|
||
|
case REQ_RANGE_LOCAL:
|
||
|
case REQ_RANGE_COUNT:
|
||
|
break;
|
||
|
}
|
||
|
fc_assert_msg(FALSE, "Invalid range %d.", req->range);
|
||
|
return TRI_MAYBE;
|
||
|
}
|
||
|
/**********************************************************************//**
|
||
|
Determine whether an extra requirement is satisfied in a given context,
|
||
|
ignoring parts of the requirement that can be handled uniformly for all
|
||
| ... | ... | |
|
[VUT_MAX_DISTANCE_SQ] = {is_max_distance_sq_req_active, REQUCH_YES},
|
||
|
[VUT_MAX_REGION_TILES] = {is_max_region_tiles_req_active, REQUCH_NO},
|
||
|
[VUT_MAXLATITUDE] = {is_latitude_req_active, REQUCH_YES},
|
||
|
[VUT_MAXTILEUNITS] = {is_maxunitsontile_req_active, REQUCH_NO},
|
||
|
[VUT_MAXTILETOTALUNITS] = {is_maxtotalunitsontile_req_active, REQUCH_NO},
|
||
|
[VUT_MAXTILETOPUNITS] = {is_maxtopunitsontile_req_active, REQUCH_NO},
|
||
|
[VUT_MINCALFRAG] = {is_mincalfrag_req_active, REQUCH_NO},
|
||
|
[VUT_MINCULTURE] = {is_minculture_req_active, REQUCH_NO},
|
||
|
[VUT_MINFOREIGNPCT] = {is_minforeignpct_req_active, REQUCH_NO},
|
||
| ... | ... | |
|
case VUT_DIPLREL_TILE_O:
|
||
|
case VUT_DIPLREL_UNITANY:
|
||
|
case VUT_DIPLREL_UNITANY_O:
|
||
|
case VUT_MAXTILEUNITS:
|
||
|
case VUT_MAXTILETOTALUNITS:
|
||
|
case VUT_MAXTILETOPUNITS:
|
||
|
case VUT_UTYPE:
|
||
|
case VUT_UCLASS:
|
||
|
case VUT_MINVETERAN:
|
||
| ... | ... | |
|
return psource1->value.minforeignpct == psource2->value.minforeignpct;
|
||
|
case VUT_AI_LEVEL:
|
||
|
return psource1->value.ai_level == psource2->value.ai_level;
|
||
|
case VUT_MAXTILEUNITS:
|
||
|
return psource1->value.max_tile_units == psource2->value.max_tile_units;
|
||
|
case VUT_MAXTILETOTALUNITS:
|
||
|
return psource1->value.max_tile_total_units == psource2->value.max_tile_total_units;
|
||
|
case VUT_MAXTILETOPUNITS:
|
||
|
return psource1->value.max_tile_top_units == psource2->value.max_tile_top_units;
|
||
|
case VUT_TERRAINCLASS:
|
||
|
return psource1->value.terrainclass == psource2->value.terrainclass;
|
||
|
case VUT_ROADFLAG:
|
||
| ... | ... | |
|
return buffer;
|
||
|
case VUT_AI_LEVEL:
|
||
|
return ai_level_name(psource->value.ai_level);
|
||
|
case VUT_MAXTILEUNITS:
|
||
|
fc_snprintf(buffer, sizeof(buffer), "%d", psource->value.max_tile_units);
|
||
|
case VUT_MAXTILETOTALUNITS:
|
||
|
fc_snprintf(buffer, sizeof(buffer), "%d", psource->value.max_tile_total_units);
|
||
|
return buffer;
|
||
|
case VUT_MAXTILETOPUNITS:
|
||
|
fc_snprintf(buffer, sizeof(buffer), "%d", psource->value.max_tile_top_units);
|
||
|
return buffer;
|
||
|
case VUT_TERRAINCLASS:
|
||
|
return terrain_class_name(psource->value.terrainclass);
|
||
| ... | ... | |
|
cat_snprintf(buf, bufsz, _("%s AI"),
|
||
|
ai_level_translated_name(psource->value.ai_level)); /* FIXME */
|
||
|
return buf;
|
||
|
case VUT_MAXTILEUNITS:
|
||
|
case VUT_MAXTILETOTALUNITS:
|
||
|
/* TRANS: here <= means 'less than or equal' */
|
||
|
cat_snprintf(buf, bufsz, PL_("<=%d total unit",
|
||
|
"<=%d total units",
|
||
|
psource->value.max_tile_total_units),
|
||
|
psource->value.max_tile_total_units);
|
||
|
return buf;
|
||
|
case VUT_MAXTILETOPUNITS:
|
||
|
/* TRANS: here <= means 'less than or equal' */
|
||
|
cat_snprintf(buf, bufsz, PL_("<=%d unit",
|
||
|
"<=%d units", psource->value.max_tile_units),
|
||
|
psource->value.max_tile_units);
|
||
|
"<=%d units", psource->value.max_tile_top_units),
|
||
|
psource->value.max_tile_top_units);
|
||
|
return buf;
|
||
|
case VUT_TERRAINCLASS:
|
||
|
/* TRANS: Terrain class: "Land terrain" */
|
||
| doc/README.effects | ||
|---|---|---|
|
Requirement types and supported ranges
|
||
|
======================================
|
||
|
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
|
||
|
Gov: Player
|
||
|
Building: World, Alliance, Team, Player, Continent, Traderoute, City,
|
||
|
Tile, Local
|
||
|
BuildingFlag: Local, Tile, City
|
||
|
BuildingGenus: Local
|
||
|
Site: World, Alliance, Team, Player, Continent, Traderoute, City,
|
||
|
Tile, Local
|
||
|
Extra: Local, Tile, Adjacent, CAdjacent, Traderoute, City
|
||
|
RoadFlag: Local, Tile, Adjacent, CAdjacent, Traderoute, City
|
||
|
ExtraFlag: Local, Tile, Adjacent, CAdjacent, Traderoute, City
|
||
|
Terrain: Tile, Adjacent, CAdjacent, Traderoute, City
|
||
|
Good: City
|
||
|
UnitType: Local, Tile, CAdjacent, Adjacent
|
||
|
UnitTypeFlag: Local, Tile, CAdjacent, Adjacent
|
||
|
UnitClass: Local, Tile, CAdjacent, Adjacent
|
||
|
UnitClassFlag: Local, Tile, CAdjacent, Adjacent
|
||
|
Nation: World, Alliance, Team, Player
|
||
|
NationGroup: World, Alliance, Team, Player
|
||
|
Nationality: Traderoute, City
|
||
|
PlayerFlag: Player
|
||
|
PlayerState: Player
|
||
|
OriginalOwner: City
|
||
|
DiplRel: World, Alliance, Team, Player, Local
|
||
|
DiplRelTile: Alliance, Team, Player, Local
|
||
|
DiplRelTileOther:Local
|
||
|
DiplRelUnitAny: Alliance, Team, Player, Local
|
||
|
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
|
||
|
Gov: Player
|
||
|
Building: World, Alliance, Team, Player, Continent, Traderoute,
|
||
|
City, Tile, Local
|
||
|
BuildingFlag: Local, Tile, City
|
||
|
BuildingGenus: Local
|
||
|
Site: World, Alliance, Team, Player, Continent, Traderoute,
|
||
|
City, Tile, Local
|
||
|
Extra: Local, Tile, Adjacent, CAdjacent, Traderoute, City
|
||
|
RoadFlag: Local, Tile, Adjacent, CAdjacent, Traderoute, City
|
||
|
ExtraFlag: Local, Tile, Adjacent, CAdjacent, Traderoute, City
|
||
|
Terrain: Tile, Adjacent, CAdjacent, Traderoute, City
|
||
|
Good: City
|
||
|
UnitType: Local, Tile, CAdjacent, Adjacent
|
||
|
UnitTypeFlag: Local, Tile, CAdjacent, Adjacent
|
||
|
UnitClass: Local, Tile, CAdjacent, Adjacent
|
||
|
UnitClassFlag: Local, Tile, CAdjacent, Adjacent
|
||
|
Nation: World, Alliance, Team, Player
|
||
|
NationGroup: World, Alliance, Team, Player
|
||
|
Nationality: Traderoute, City
|
||
|
PlayerFlag: Player
|
||
|
PlayerState: Player
|
||
|
OriginalOwner: City
|
||
|
DiplRel: World, Alliance, Team, Player, Local
|
||
|
DiplRelTile: Alliance, Team, Player, Local
|
||
|
DiplRelTileOther: Local
|
||
|
DiplRelUnitAny: Alliance, Team, Player, Local
|
||
|
DiplRelUnitAnyOther: Local
|
||
|
Action: Local
|
||
|
OutputType: Local
|
||
|
Specialist: Local
|
||
|
MinYear: World
|
||
|
MinCalFrag: World
|
||
|
Topology: World
|
||
|
Wrap: World
|
||
|
ServerSetting: World
|
||
|
Age (of unit): Local
|
||
|
Age (of city): City
|
||
|
Age (of player): Player
|
||
|
FormAge: Local
|
||
|
MinSize: Traderoute, City
|
||
|
MinCulture: World, Alliance, Team, Player, Traderoute, City
|
||
|
MinForeignPct: Traderoute, City
|
||
|
AI: Player
|
||
|
MaxUnitsOnTile: Tile, Adjacent, CAdjacent
|
||
|
TerrainClass: Tile, Adjacent, CAdjacent, Traderoute, City
|
||
|
TerrainFlag: Tile, Adjacent, CAdjacent, Traderoute, City
|
||
|
TerrainAlter: Tile
|
||
|
MinLatitude: Tile, Adjacent, CAdjacent, World
|
||
|
MaxLatitude: Tile, Adjacent, CAdjacent, World
|
||
|
CityTile: Tile, Adjacent, CAdjacent
|
||
|
CityStatus: Traderoute, City
|
||
|
Style: Player
|
||
|
UnitState: Local
|
||
|
Activity: Local
|
||
|
MinMoveFrags: Local
|
||
|
MinVeteran: Local
|
||
|
MinHitPoints: Local
|
||
|
TileRel: Tile, Adjacent, CAdjacent
|
||
|
MaxDistanceSq: Tile
|
||
|
MaxRegionTiles: Continent, Adjacent, CAdjacent
|
||
|
Action: Local
|
||
|
OutputType: Local
|
||
|
Specialist: Local
|
||
|
MinYear: World
|
||
|
MinCalFrag: World
|
||
|
Topology: World
|
||
|
Wrap: World
|
||
|
ServerSetting: World
|
||
|
Age (of unit): Local
|
||
|
Age (of city): City
|
||
|
Age (of player): Player
|
||
|
FormAge: Local
|
||
|
MinSize: Traderoute, City
|
||
|
MinCulture: World, Alliance, Team, Player, Traderoute, City
|
||
|
MinForeignPct: Traderoute, City
|
||
|
AI: Player
|
||
|
MaxUnitsOnTile: Tile, Adjacent, CAdjacent
|
||
|
MaxTopUnitsOnTile: Tile, Adjacent, CAdjacent
|
||
|
TerrainClass: Tile, Adjacent, CAdjacent, Traderoute, City
|
||
|
TerrainFlag: Tile, Adjacent, CAdjacent, Traderoute, City
|
||
|
TerrainAlter: Tile
|
||
|
MinLatitude: Tile, Adjacent, CAdjacent, World
|
||
|
MaxLatitude: Tile, Adjacent, CAdjacent, World
|
||
|
CityTile: Tile, Adjacent, CAdjacent
|
||
|
CityStatus: Traderoute, City
|
||
|
Style: Player
|
||
|
UnitState: Local
|
||
|
Activity: Local
|
||
|
MinMoveFrags: Local
|
||
|
MinVeteran: Local
|
||
|
MinHitPoints: Local
|
||
|
TileRel: Tile, Adjacent, CAdjacent
|
||
|
MaxDistanceSq: Tile
|
||
|
MaxRegionTiles: Continent, Adjacent, CAdjacent
|
||
|
Site is like Building, except that the requirement is fulfilled even after
|
||
| gen_headers/enums/fc_types_enums.def | ||
|---|---|---|
|
IMPR_FLAG "BuildingFlag"
|
||
|
IMPR_GENUS "BuildingGenus"
|
||
|
MAXLATITUDE "MaxLatitude"
|
||
|
MAXTILEUNITS "MaxUnitsOnTile"
|
||
|
MAXTILETOPUNITS "MaxTopUnitsOnTile"
|
||
|
MAXTILETOTALUNITS "MaxUnitsOnTile"
|
||
|
MAX_DISTANCE_SQ "MaxDistanceSq"
|
||
|
MAX_REGION_TILES "MaxRegionTiles"
|
||
|
MINCALFRAG "MinCalFrag"
|
||
| server/cityturn.c | ||
|---|---|---|
|
purge = TRUE;
|
||
|
}
|
||
|
break;
|
||
|
case VUT_MAXTILEUNITS:
|
||
|
case VUT_MAXTILETOTALUNITS:
|
||
|
if (preq->present) {
|
||
|
notify_player(pplayer, city_tile(pcity),
|
||
|
E_CITY_CANTBUILD, ftc_server,
|
||
|
PL_("%s can't build %s from the worklist; "
|
||
|
"more than %d total unit on tile."
|
||
|
" Postponing...",
|
||
|
"%s can't build %s from the worklist; "
|
||
|
"more than %d total units on tile."
|
||
|
" Postponing...",
|
||
|
preq->source.value.max_tile_total_units),
|
||
|
city_link(pcity),
|
||
|
tgt_name,
|
||
|
preq->source.value.max_tile_total_units);
|
||
|
script_server_signal_emit(signal_name, ptarget,
|
||
|
pcity, "need_tileunits");
|
||
|
} else {
|
||
|
notify_player(pplayer, city_tile(pcity),
|
||
|
E_CITY_CANTBUILD, ftc_server,
|
||
|
PL_("%s can't build %s from the worklist; "
|
||
|
"fewer than %d total unit on tile."
|
||
|
" Postponing...",
|
||
|
"%s can't build %s from the worklist; "
|
||
|
"fewer than %d total units on tile."
|
||
|
" Postponing...",
|
||
|
preq->source.value.max_tile_total_units + 1),
|
||
|
city_link(pcity),
|
||
|
tgt_name,
|
||
|
preq->source.value.max_tile_total_units + 1);
|
||
|
script_server_signal_emit(signal_name, ptarget,
|
||
|
pcity, "need_tileunits");
|
||
|
}
|
||
|
break;
|
||
|
case VUT_MAXTILETOPUNITS:
|
||
|
if (preq->present) {
|
||
|
notify_player(pplayer, city_tile(pcity),
|
||
|
E_CITY_CANTBUILD, ftc_server,
|
||
| ... | ... | |
|
"%s can't build %s from the worklist; "
|
||
|
"more than %d units on tile."
|
||
|
" Postponing...",
|
||
|
preq->source.value.max_tile_units),
|
||
|
preq->source.value.max_tile_top_units),
|
||
|
city_link(pcity),
|
||
|
tgt_name,
|
||
|
preq->source.value.max_tile_units);
|
||
|
preq->source.value.max_tile_top_units);
|
||
|
script_server_signal_emit(signal_name, ptarget,
|
||
|
pcity, "need_tileunits");
|
||
|
pcity, "need_tiletopunits");
|
||
|
} else {
|
||
|
notify_player(pplayer, city_tile(pcity),
|
||
|
E_CITY_CANTBUILD, ftc_server,
|
||
| ... | ... | |
|
"%s can't build %s from the worklist; "
|
||
|
"fewer than %d units on tile."
|
||
|
" Postponing...",
|
||
|
preq->source.value.max_tile_units + 1),
|
||
|
preq->source.value.max_tile_top_units + 1),
|
||
|
city_link(pcity),
|
||
|
tgt_name,
|
||
|
preq->source.value.max_tile_units + 1);
|
||
|
preq->source.value.max_tile_top_units + 1);
|
||
|
script_server_signal_emit(signal_name, ptarget,
|
||
|
pcity, "need_tileunits");
|
||
|
pcity, "need_tiletopunits");
|
||
|
}
|
||
|
break;
|
||
|
case VUT_AI_LEVEL:
|
||
| server/ruleset/rssanity.c | ||
|---|---|---|
|
/* Can have multiple, since it's flag based (wrapx & wrapy) */
|
||
|
case VUT_EXTRA:
|
||
|
/* Note that there can be more than 1 extra / tile. */
|
||
|
case VUT_MAXTILEUNITS:
|
||
|
case VUT_MAXTILETOTALUNITS:
|
||
|
case VUT_MAXTILETOPUNITS:
|
||
|
/* Can require different numbers on e.g. local/adjacent tiles. */
|
||
|
case VUT_NATION:
|
||
|
/* Can require multiple nations at Team/Alliance/World range. */
|
||
| tools/ruledit/univ_value.c | ||
|---|---|---|
|
case VUT_DIPLREL_UNITANY_O:
|
||
|
src->value.diplrel = DS_WAR;
|
||
|
return TRUE;
|
||
|
case VUT_MAXTILEUNITS:
|
||
|
src->value.max_tile_units = 0;
|
||
|
case VUT_MAXTILETOTALUNITS:
|
||
|
src->value.max_tile_total_units = 0;
|
||
|
return TRUE;
|
||
|
case VUT_MAXTILETOPUNITS:
|
||
|
src->value.max_tile_top_units = 0;
|
||
|
return TRUE;
|
||
|
case VUT_STYLE:
|
||
|
if (game.control.num_styles <= 0) {
|
||
| ... | ... | |
|
case VUT_MINSIZE:
|
||
|
case VUT_MINYEAR:
|
||
|
case VUT_MINCALFRAG:
|
||
|
case VUT_MAXTILEUNITS:
|
||
|
case VUT_MAXTILETOTALUNITS:
|
||
|
case VUT_MAXTILETOPUNITS:
|
||
|
case VUT_MINCULTURE:
|
||
|
case VUT_MINFOREIGNPCT:
|
||
|
case VUT_MINMOVES:
|
||