From c7de85c91c57331da055f899548e29febdd949c0 Mon Sep 17 00:00:00 2001 From: Sveinung Kvilhaugsvik Date: Thu, 24 Jun 2021 09:44:20 +0200 Subject: [PATCH 7/7] Add the new DiplRelUnitAnyOther requirement type. See osdn #42563 --- ai/default/daieffects.c | 1 + common/fc_types.h | 2 ++ common/metaknowledge.c | 3 ++- common/player.c | 6 ++++-- common/reqtext.c | 32 ++++++++++++++++++++++++++++++++ common/requirements.c | 23 ++++++++++++++++++++++- doc/README.effects | 10 ++++++++++ server/cityturn.c | 1 + server/rssanity.c | 1 + tools/ruledit/univ_value.c | 2 ++ 10 files changed, 77 insertions(+), 4 deletions(-) diff --git a/ai/default/daieffects.c b/ai/default/daieffects.c index de437ad953..95da321919 100644 --- a/ai/default/daieffects.c +++ b/ai/default/daieffects.c @@ -811,6 +811,7 @@ bool dai_can_requirement_be_met_in_city(const struct requirement *preq, case VUT_DIPLREL_TILE: case VUT_DIPLREL_TILE_O: case VUT_DIPLREL_UNITANY: + case VUT_DIPLREL_UNITANY_O: case VUT_MAXTILEUNITS: case VUT_STYLE: case VUT_UNITSTATE: diff --git a/common/fc_types.h b/common/fc_types.h index 63cdce2c6b..991ebd6d88 100644 --- a/common/fc_types.h +++ b/common/fc_types.h @@ -756,6 +756,8 @@ typedef union { #define SPECENUM_VALUE46NAME "DiplRelTileOther" #define SPECENUM_VALUE47 VUT_DIPLREL_UNITANY #define SPECENUM_VALUE47NAME "DiplRelUnitAny" +#define SPECENUM_VALUE48 VUT_DIPLREL_UNITANY_O +#define SPECENUM_VALUE48NAME "DiplRelUnitAnyOther" /* Keep this last. */ #define SPECENUM_COUNT VUT_COUNT #include "specenum_gen.h" diff --git a/common/metaknowledge.c b/common/metaknowledge.c index af0fa41f8f..b21632bbef 100644 --- a/common/metaknowledge.c +++ b/common/metaknowledge.c @@ -274,7 +274,8 @@ static bool is_req_knowable(const struct player *pow_player, if (req->source.kind == VUT_DIPLREL || req->source.kind == VUT_DIPLREL_TILE || req->source.kind == VUT_DIPLREL_TILE_O - || req->source.kind == VUT_DIPLREL_UNITANY) { + || req->source.kind == VUT_DIPLREL_UNITANY + || req->source.kind == VUT_DIPLREL_UNITANY_O) { switch (req->range) { case REQ_RANGE_LOCAL: if (other_player == NULL diff --git a/common/player.c b/common/player.c index ccb745ff87..91fd2aa4cf 100644 --- a/common/player.c +++ b/common/player.c @@ -1757,12 +1757,14 @@ bv_diplrel_all_reqs diplrel_req_contradicts(const struct requirement *req) if (!(req->source.kind == VUT_DIPLREL || req->source.kind == VUT_DIPLREL_TILE || req->source.kind == VUT_DIPLREL_TILE_O - || req->source.kind == VUT_DIPLREL_UNITANY)) { + || req->source.kind == VUT_DIPLREL_UNITANY + || req->source.kind == VUT_DIPLREL_UNITANY_O)) { /* No known contradiction of a requirement of any other kind. */ fc_assert(req->source.kind == VUT_DIPLREL || req->source.kind == VUT_DIPLREL_TILE || req->source.kind == VUT_DIPLREL_TILE_O - || req->source.kind == VUT_DIPLREL_UNITANY); + || req->source.kind == VUT_DIPLREL_UNITANY + || req->source.kind == VUT_DIPLREL_UNITANY_O); return known; } diff --git a/common/reqtext.c b/common/reqtext.c index 613fc4ae54..f3d3ea88ca 100644 --- a/common/reqtext.c +++ b/common/reqtext.c @@ -1456,6 +1456,38 @@ bool req_text_insert(char *buf, size_t bufsz, struct player *pplayer, } break; + case VUT_DIPLREL_UNITANY_O: + switch (preq->range) { + case REQ_RANGE_LOCAL: + fc_strlcat(buf, prefix, bufsz); + if (preq->present) { + cat_snprintf(buf, bufsz, + _("Requires that the tile has at least one unit that" + " has the relationship '%s' with the other player."), + diplrel_name_translation(preq->source.value.diplrel)); + } else { + cat_snprintf(buf, bufsz, + _("Requires that the tile has at least one unit that" + " doesn't have the relationship '%s' with" + " the other player."), + diplrel_name_translation(preq->source.value.diplrel)); + } + return TRUE; + case REQ_RANGE_CADJACENT: + case REQ_RANGE_ADJACENT: + case REQ_RANGE_CITY: + case REQ_RANGE_TRADEROUTE: + case REQ_RANGE_CONTINENT: + case REQ_RANGE_PLAYER: + case REQ_RANGE_TEAM: + case REQ_RANGE_ALLIANCE: + case REQ_RANGE_WORLD: + case REQ_RANGE_COUNT: + /* Not supported. */ + break; + } + break; + case VUT_UTYPE: switch (preq->range) { case REQ_RANGE_LOCAL: diff --git a/common/requirements.c b/common/requirements.c index d96c361658..5dfbc55cab 100644 --- a/common/requirements.c +++ b/common/requirements.c @@ -196,6 +196,7 @@ void universal_value_from_str(struct universal *source, const char *value) case VUT_DIPLREL_TILE: case VUT_DIPLREL_TILE_O: case VUT_DIPLREL_UNITANY: + case VUT_DIPLREL_UNITANY_O: source->value.diplrel = diplrel_by_rule_name(value); if (source->value.diplrel != diplrel_other_invalid()) { return; @@ -470,6 +471,7 @@ struct universal universal_by_number(const enum universals_n kind, case VUT_DIPLREL_TILE: case VUT_DIPLREL_TILE_O: case VUT_DIPLREL_UNITANY: + case VUT_DIPLREL_UNITANY_O: source.value.diplrel = value; if (source.value.diplrel != diplrel_other_invalid()) { return source; @@ -640,6 +642,7 @@ int universal_number(const struct universal *source) case VUT_DIPLREL_TILE: case VUT_DIPLREL_TILE_O: case VUT_DIPLREL_UNITANY: + case VUT_DIPLREL_UNITANY_O: return source->value.diplrel; case VUT_UTYPE: return utype_number(source->value.utype); @@ -783,6 +786,7 @@ struct requirement req_from_str(const char *type, const char *range, case VUT_CITYTILE: case VUT_MAXTILEUNITS: case VUT_DIPLREL_TILE_O: + case VUT_DIPLREL_UNITANY_O: req.range = REQ_RANGE_LOCAL; break; case VUT_MINSIZE: @@ -894,6 +898,9 @@ struct requirement req_from_str(const char *type, const char *range, || (req.source.value.diplrel == DRO_FOREIGN && req.range != REQ_RANGE_LOCAL); break; + case VUT_DIPLREL_UNITANY_O: + invalid = (req.range != REQ_RANGE_LOCAL); + break; case VUT_NATION: case VUT_NATIONGROUP: invalid = (req.range != REQ_RANGE_PLAYER @@ -1007,6 +1014,7 @@ struct requirement req_from_str(const char *type, const char *range, case VUT_DIPLREL_TILE: case VUT_DIPLREL_TILE_O: case VUT_DIPLREL_UNITANY: + case VUT_DIPLREL_UNITANY_O: case VUT_MAXTILEUNITS: case VUT_MINTECHS: /* Most requirements don't support 'survives'. */ @@ -1232,6 +1240,7 @@ bool are_requirements_contradictions(const struct requirement *req1, case VUT_DIPLREL_TILE: case VUT_DIPLREL_TILE_O: case VUT_DIPLREL_UNITANY: + case VUT_DIPLREL_UNITANY_O: if (req2->source.kind != req1->source.kind) { /* Finding contradictions across requirement kinds aren't supported * for DiplRel requirements. */ @@ -3219,6 +3228,11 @@ bool is_req_active(const struct player *target_player, req->range, req->source.value.diplrel); break; + case VUT_DIPLREL_UNITANY_O: + eval = is_diplrel_unitany_in_range(target_tile, other_player, + req->range, + req->source.value.diplrel); + break; case VUT_UTYPE: if (target_unittype == NULL) { eval = TRI_MAYBE; @@ -3549,6 +3563,7 @@ bool is_req_unchanging(const struct requirement *req) case VUT_DIPLREL_TILE: case VUT_DIPLREL_TILE_O: case VUT_DIPLREL_UNITANY: + case VUT_DIPLREL_UNITANY_O: case VUT_MAXTILEUNITS: case VUT_UTYPE: /* Not sure about this one */ case VUT_UTFLAG: /* Not sure about this one */ @@ -3661,6 +3676,7 @@ bool universal_never_there(const struct universal *source) case VUT_DIPLREL_TILE: case VUT_DIPLREL_TILE_O: case VUT_DIPLREL_UNITANY: + case VUT_DIPLREL_UNITANY_O: case VUT_MAXTILEUNITS: case VUT_UTYPE: case VUT_UCLASS: @@ -4231,6 +4247,7 @@ bool are_universals_equal(const struct universal *psource1, case VUT_DIPLREL_TILE: case VUT_DIPLREL_TILE_O: case VUT_DIPLREL_UNITANY: + case VUT_DIPLREL_UNITANY_O: return psource1->value.diplrel == psource2->value.diplrel; case VUT_UTYPE: return psource1->value.utype == psource2->value.utype; @@ -4357,6 +4374,7 @@ const char *universal_rule_name(const struct universal *psource) case VUT_DIPLREL_TILE: case VUT_DIPLREL_TILE_O: case VUT_DIPLREL_UNITANY: + case VUT_DIPLREL_UNITANY_O: return diplrel_rule_name(psource->value.diplrel); case VUT_NATIONALITY: return nation_rule_name(psource->value.nationality); @@ -4501,6 +4519,7 @@ const char *universal_name_translation(const struct universal *psource, case VUT_DIPLREL_TILE: case VUT_DIPLREL_TILE_O: case VUT_DIPLREL_UNITANY: + case VUT_DIPLREL_UNITANY_O: fc_strlcat(buf, diplrel_name_translation(psource->value.diplrel), bufsz); return buf; @@ -5180,7 +5199,8 @@ static enum req_item_found diplrel_found(const struct requirement *preq, fc_assert_ret_val((source->kind == VUT_DIPLREL || source->kind == VUT_DIPLREL_TILE || source->kind == VUT_DIPLREL_TILE_O - || source->kind == VUT_DIPLREL_UNITANY), + || source->kind == VUT_DIPLREL_UNITANY + || source->kind == VUT_DIPLREL_UNITANY_O), ITF_NOT_APPLICABLE); if (preq->source.kind == source->kind) { @@ -5292,6 +5312,7 @@ void universal_found_functions_init(void) universal_found_function[VUT_DIPLREL_TILE] = &diplrel_found; universal_found_function[VUT_DIPLREL_TILE_O] = &diplrel_found; universal_found_function[VUT_DIPLREL_UNITANY] = &diplrel_found; + universal_found_function[VUT_DIPLREL_UNITANY_O] = &diplrel_found; universal_found_function[VUT_UNITSTATE] = &ustate_found; } diff --git a/doc/README.effects b/doc/README.effects index 4209fe46ac..f175d9b2b5 100644 --- a/doc/README.effects +++ b/doc/README.effects @@ -73,6 +73,7 @@ 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 @@ -749,6 +750,15 @@ The player is the owner of a unit at the tile. The second player is DiplRel's player. Doesn't have the World requirement range as that would be redundant. +The DiplRelUnitAnyOther requirement type +---------------------------------------- +Check if any unit at the tile has the specified diplomatic relationship. +Note that it says any - not each. It being true for one unit is enough. +The player is the owner of a unit at the tile. +The second player is DiplRel's second player. +Only works in the Local requirement range as DiplRel and DiplRelUnitAny +covers the rest. + The MaxUnitsOnTile requirement type ----------------------------------- Check the number of units present on a tile. Is true if no more than the diff --git a/server/cityturn.c b/server/cityturn.c index 5592d2b68c..ab6487dda6 100644 --- a/server/cityturn.c +++ b/server/cityturn.c @@ -1490,6 +1490,7 @@ static bool worklist_item_postpone_req_vec(struct universal *target, } break; case VUT_DIPLREL_UNITANY: + case VUT_DIPLREL_UNITANY_O: if (preq->present) { notify_player(pplayer, city_tile(pcity), E_CITY_CANTBUILD, ftc_server, diff --git a/server/rssanity.c b/server/rssanity.c index ac9e68aa1b..9ab4988776 100644 --- a/server/rssanity.c +++ b/server/rssanity.c @@ -377,6 +377,7 @@ static bool sanity_check_req_set(int reqs_of_type[], int local_reqs_of_type[], case VUT_DIPLREL_TILE: case VUT_DIPLREL_TILE_O: case VUT_DIPLREL_UNITANY: + case VUT_DIPLREL_UNITANY_O: /* Can have multiple requirements of these types */ break; case VUT_COUNT: diff --git a/tools/ruledit/univ_value.c b/tools/ruledit/univ_value.c index 2e81bf62ab..4056851df7 100644 --- a/tools/ruledit/univ_value.c +++ b/tools/ruledit/univ_value.c @@ -155,6 +155,7 @@ bool universal_value_initial(struct universal *src) case VUT_DIPLREL_TILE: case VUT_DIPLREL_TILE_O: case VUT_DIPLREL_UNITANY: + case VUT_DIPLREL_UNITANY_O: src->value.diplrel = DS_WAR; return TRUE; case VUT_MAXTILEUNITS: @@ -363,6 +364,7 @@ void universal_kind_values(struct universal *univ, case VUT_DIPLREL_TILE: case VUT_DIPLREL_TILE_O: case VUT_DIPLREL_UNITANY: + case VUT_DIPLREL_UNITANY_O: for (i = 0; i < DS_LAST; i++) { cb(diplstate_type_name(i), univ->value.diplrel == i, data); } -- 2.30.2