Project

General

Profile

Feature #347 ยป 0048-Add-support-for-UnitType-requirements-on-Tile-Adjace.patch

Marko Lindqvist, 03/23/2024 08:58 AM

View differences:

common/requirements.c
case VUT_EXTRA:
case VUT_ROADFLAG:
case VUT_EXTRAFLAG:
/* keep old behavior */
/* Keep old behavior */
req.range = REQ_RANGE_TILE;
break;
case VUT_TERRAIN:
......
&& req.range != REQ_RANGE_ALLIANCE
&& req.range != REQ_RANGE_WORLD);
break;
case VUT_UTYPE:
case VUT_UTFLAG:
case VUT_UCLASS:
case VUT_UCFLAG:
......
case VUT_SPECIALIST:
invalid = (req.range != REQ_RANGE_LOCAL);
break;
case VUT_UTYPE:
invalid = (req.range != REQ_RANGE_LOCAL
&& req.range != REQ_RANGE_TILE
&& req.range != REQ_RANGE_CADJACENT
&& req.range != REQ_RANGE_ADJACENT);
break;
case VUT_TERRAINALTER: /* XXX could in principle support C/ADJACENT */
invalid = (req.range != REQ_RANGE_TILE);
break;
......
punittype = req->source.value.utype;
if (req->range != REQ_RANGE_LOCAL) {
switch (req->range) {
case REQ_RANGE_LOCAL:
if (!context->unittype) {
return TRI_MAYBE;
}
return BOOL_TO_TRISTATE(context->unittype == punittype);
case REQ_RANGE_TILE:
case REQ_RANGE_CADJACENT:
case REQ_RANGE_ADJACENT:
if (context->tile == nullptr) {
return TRI_MAYBE;
}
unit_list_iterate(context->tile->units, punit) {
if (punit->utype == punittype) {
return TRI_YES;
}
} unit_list_iterate_end;
if (req->range == REQ_RANGE_TILE) {
return TRI_NO;
}
if (req->range == REQ_RANGE_CADJACENT) {
cardinal_adjc_iterate(nmap, context->tile, adjc_tile) {
unit_list_iterate(adjc_tile->units, punit) {
if (punit->utype == punittype) {
return TRI_YES;
}
} unit_list_iterate_end;
} cardinal_adjc_iterate_end;
} else {
fc_assert(req->range == REQ_RANGE_ADJACENT);
adjc_iterate(nmap, context->tile, adjc_tile) {
unit_list_iterate(adjc_tile->units, punit) {
if (punit->utype == punittype) {
return TRI_YES;
}
} unit_list_iterate_end;
} adjc_iterate_end;
}
return TRI_NO;
}
if (!context->unittype) {
return TRI_MAYBE;
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_COUNT:
fc_assert(FALSE);
break;
}
return BOOL_TO_TRISTATE(context->unittype == punittype);
return TRI_NO;
}
/**********************************************************************//**
doc/README.effects
ExtraFlag: Local, Tile, Adjacent, CAdjacent, Traderoute, City
Terrain: Tile, Adjacent, CAdjacent, Traderoute, City
Good: City
UnitType: Local
UnitType: Local, Tile, CAdjacent, Adjacent
UnitFlag: Local
UnitClass: Local
UnitClassFlag: Local
server/ruleset/rssanity.c
if (rc > 1 && preq->present) {
/* Multiple requirements of the same type */
switch (preq->source.kind) {
case VUT_GOVERNMENT:
case VUT_UTYPE:
case VUT_UCLASS:
case VUT_ACTION:
case VUT_ACTIVITY:
case VUT_OTYPE:
case VUT_SPECIALIST:
case VUT_MINSIZE: /* Breaks nothing, but has no sense either */
case VUT_MINCITIES:
case VUT_MINFOREIGNPCT:
case VUT_MINMOVES: /* Breaks nothing, but has no sense either */
case VUT_MINVETERAN: /* Breaks nothing, but has no sense either */
case VUT_MINHP: /* Breaks nothing, but has no sense either */
case VUT_MINYEAR:
case VUT_MINCALFRAG:
case VUT_AI_LEVEL:
case VUT_TERRAINALTER: /* Local range only */
case VUT_STYLE:
case VUT_IMPR_GENUS:
case VUT_ORIGINAL_OWNER: /* City range -> only one original owner */
case VUT_FORM_AGE:
/* There can be only one requirement of these types (with current
* range limitations)
* Requirements might be identical, but we consider multiple
* declarations error anyway. */
ruleset_error(logger, LOG_ERROR,
"%s: Requirement list has multiple %s requirements",
list_for, universal_type_rule_name(&preq->source));
return FALSE;
break;
case VUT_GOVERNMENT:
case VUT_UCLASS:
case VUT_ACTION:
case VUT_ACTIVITY:
case VUT_OTYPE:
case VUT_SPECIALIST:
case VUT_MINSIZE: /* Breaks nothing, but has no sense either */
case VUT_MINCITIES:
case VUT_MINFOREIGNPCT:
case VUT_MINMOVES: /* Breaks nothing, but has no sense either */
case VUT_MINVETERAN: /* Breaks nothing, but has no sense either */
case VUT_MINHP: /* Breaks nothing, but has no sense either */
case VUT_MINYEAR:
case VUT_MINCALFRAG:
case VUT_AI_LEVEL:
case VUT_TERRAINALTER: /* Local range only */
case VUT_STYLE:
case VUT_IMPR_GENUS:
case VUT_ORIGINAL_OWNER: /* City range -> only one original owner */
case VUT_FORM_AGE:
/* There can be only one requirement of these types (with current
* range limitations)
* Requirements might be identical, but we consider multiple
* declarations error anyway. */
case VUT_TERRAIN:
/* There can be only up to max_tiles requirements of these types */
if (max_tiles != -1 && rc > max_tiles) {
ruleset_error(logger, LOG_ERROR,
"%s: Requirement list has more %s requirements than "
"can ever be fulfilled.", list_for,
universal_type_rule_name(&preq->source));
return FALSE;
}
break;
ruleset_error(logger, LOG_ERROR,
"%s: Requirement list has multiple %s requirements",
list_for, universal_type_rule_name(&preq->source));
return FALSE;
break;
case VUT_TERRAINCLASS:
if (rc > 2 || (max_tiles != -1 && rc > max_tiles)) {
ruleset_error(logger, LOG_ERROR,
"%s: Requirement list has more %s requirements than "
"can ever be fulfilled.", list_for,
universal_type_rule_name(&preq->source));
return FALSE;
}
break;
case VUT_TERRAIN:
/* There can be only up to max_tiles requirements of these types */
if (max_tiles != -1 && rc > max_tiles) {
ruleset_error(logger, LOG_ERROR,
"%s: Requirement list has more %s requirements than "
"can ever be fulfilled.", list_for,
universal_type_rule_name(&preq->source));
return FALSE;
}
break;
case VUT_TERRAINCLASS:
if (rc > 2 || (max_tiles != -1 && rc > max_tiles)) {
ruleset_error(logger, LOG_ERROR,
"%s: Requirement list has more %s requirements than "
"can ever be fulfilled.", list_for,
universal_type_rule_name(&preq->source));
return FALSE;
}
break;
case VUT_AGE:
/* There can be age of the city, unit, and player */
......
case VUT_UNITSTATE:
case VUT_CITYTILE:
case VUT_GOOD:
case VUT_UTYPE:
/* Can check different properties. */
case VUT_UTFLAG:
case VUT_UCFLAG:
    (1-1/1)