From 47b8383e2c3ac8b2601ee60f1ff8031c4a22b6d7 Mon Sep 17 00:00:00 2001 From: Sveinung Kvilhaugsvik Date: Tue, 11 May 2021 12:25:15 +0200 Subject: [PATCH 08/14] Make the road_time > 0 hard req obligatory... ...for "Build Road". It can't be made obligatory for other extra building actions that may result in a road until the sub target extra can be checked. See osdn #42510 --- client/gui-gtk-3.0/helpdlg.c | 3 +-- client/gui-gtk-3.22/helpdlg.c | 3 +-- client/gui-gtk-4.0/helpdlg.c | 3 +-- client/gui-qt/helpdlg.cpp | 3 +-- client/helpdata.c | 3 +-- common/actions.c | 11 +++++++++++ data/alien/game.ruleset | 4 ++++ data/civ1/game.ruleset | 4 ++++ data/civ2/game.ruleset | 4 ++++ data/civ2civ3/game.ruleset | 4 ++++ data/classic/game.ruleset | 4 ++++ data/experimental/game.ruleset | 4 ++++ data/granularity/game.ruleset | 4 ++++ data/multiplayer/game.ruleset | 4 ++++ data/sandbox/game.ruleset | 4 ++++ data/stub/game.ruleset | 4 ++++ data/webperimental/game.ruleset | 4 ++++ doc/README.actions | 2 +- 18 files changed, 61 insertions(+), 11 deletions(-) diff --git a/client/gui-gtk-3.0/helpdlg.c b/client/gui-gtk-3.0/helpdlg.c index 466ecb689b..6900459f53 100644 --- a/client/gui-gtk-3.0/helpdlg.c +++ b/client/gui-gtk-3.0/helpdlg.c @@ -1286,8 +1286,7 @@ static void help_update_terrain(const struct help_item *pitem, if (action_id_univs_not_blocking(ACTION_MINE, NULL, &for_terr)) { help_extras_of_act_for_terrain(pterrain, ACTIVITY_MINE, _("Build as mine")); } - if (pterrain->road_time != 0 - && action_id_univs_not_blocking(ACTION_ROAD, NULL, &for_terr)) { + if (action_id_univs_not_blocking(ACTION_ROAD, NULL, &for_terr)) { help_extras_of_act_for_terrain(pterrain, ACTIVITY_GEN_ROAD, _("Build as road")); } if (pterrain->base_time != 0 diff --git a/client/gui-gtk-3.22/helpdlg.c b/client/gui-gtk-3.22/helpdlg.c index 80f2a497d8..14201dfb4e 100644 --- a/client/gui-gtk-3.22/helpdlg.c +++ b/client/gui-gtk-3.22/helpdlg.c @@ -1286,8 +1286,7 @@ static void help_update_terrain(const struct help_item *pitem, if (action_id_univs_not_blocking(ACTION_MINE, NULL, &for_terr)) { help_extras_of_act_for_terrain(pterrain, ACTIVITY_MINE, _("Build as mine")); } - if (pterrain->road_time != 0 - && action_id_univs_not_blocking(ACTION_ROAD, NULL, &for_terr)) { + if (action_id_univs_not_blocking(ACTION_ROAD, NULL, &for_terr)) { help_extras_of_act_for_terrain(pterrain, ACTIVITY_GEN_ROAD, _("Build as road")); } if (pterrain->base_time != 0 diff --git a/client/gui-gtk-4.0/helpdlg.c b/client/gui-gtk-4.0/helpdlg.c index 48c89ff4f1..8c66ed2b1f 100644 --- a/client/gui-gtk-4.0/helpdlg.c +++ b/client/gui-gtk-4.0/helpdlg.c @@ -1293,8 +1293,7 @@ static void help_update_terrain(const struct help_item *pitem, if (action_id_univs_not_blocking(ACTION_MINE, NULL, &for_terr)) { help_extras_of_act_for_terrain(pterrain, ACTIVITY_MINE, _("Build as mine")); } - if (pterrain->road_time != 0 - && action_id_univs_not_blocking(ACTION_ROAD, NULL, &for_terr)) { + if (action_id_univs_not_blocking(ACTION_ROAD, NULL, &for_terr)) { help_extras_of_act_for_terrain(pterrain, ACTIVITY_GEN_ROAD, _("Build as road")); } if (pterrain->base_time != 0 diff --git a/client/gui-qt/helpdlg.cpp b/client/gui-qt/helpdlg.cpp index 29bcc67ee3..329597f359 100644 --- a/client/gui-qt/helpdlg.cpp +++ b/client/gui-qt/helpdlg.cpp @@ -1394,8 +1394,7 @@ void help_widget::set_topic_terrain(const help_item *topic, if (action_id_univs_not_blocking(ACTION_MINE, NULL, &for_terr)) { add_extras_of_act_for_terrain(pterrain, ACTIVITY_MINE, _("Build as mine")); } - if (pterrain->road_time != 0 - && action_id_univs_not_blocking(ACTION_ROAD, NULL, &for_terr)) { + if (action_id_univs_not_blocking(ACTION_ROAD, NULL, &for_terr)) { add_extras_of_act_for_terrain(pterrain, ACTIVITY_GEN_ROAD, _("Build as road")); } if (pterrain->base_time != 0 diff --git a/client/helpdata.c b/client/helpdata.c index 722c6d7eed..db7b6340fe 100644 --- a/client/helpdata.c +++ b/client/helpdata.c @@ -3307,8 +3307,7 @@ void helptext_terrain(char *buf, size_t bufsz, struct player *pplayer, _("* You cannot build cities on this terrain.")); CATLSTR(buf, bufsz, "\n"); } - if (pterrain->road_time == 0 - || !action_id_univs_not_blocking(ACTION_ROAD, NULL, &source)) { + if (!action_id_univs_not_blocking(ACTION_ROAD, NULL, &source)) { /* Can't build roads; only mention if ruleset has buildable roads */ extra_type_by_cause_iterate(EC_ROAD, pextra) { if (pextra->buildable) { diff --git a/common/actions.c b/common/actions.c index b49bcb9b55..efbd5886de 100644 --- a/common/actions.c +++ b/common/actions.c @@ -551,6 +551,17 @@ static void hard_code_oblig_hard_reqs(void) " \"CanMine\")"), ACTRES_MINE, ACTRES_NONE); + oblig_hard_req_register(req_from_values(VUT_TERRAINALTER, REQ_RANGE_LOCAL, + FALSE, FALSE, FALSE, + TA_CAN_ROAD), + TRUE, + N_("All action enablers for %s must require" + " that the target" + " tile's terrain's road_time" + " is above 0. (See \"TerrainAlter\"'s" + " \"CanRoad\")"), + ACTRES_ROAD, + ACTRES_NONE); /* Why this is a hard requirement: Preserve semantics of the NoCities * terrain flag. */ diff --git a/data/alien/game.ruleset b/data/alien/game.ruleset index b7ead7d65d..329c7582fc 100644 --- a/data/alien/game.ruleset +++ b/data/alien/game.ruleset @@ -988,6 +988,10 @@ actor_reqs = { "type", "name", "range" "UnitFlag", "Settlers", "Local" } +target_reqs = + { "type", "name", "range" + "TerrainAlter", "CanRoad", "Local" + } [actionenabler_base] action = "Build Base" diff --git a/data/civ1/game.ruleset b/data/civ1/game.ruleset index 1ca16bb6be..1835ca3cd5 100644 --- a/data/civ1/game.ruleset +++ b/data/civ1/game.ruleset @@ -864,6 +864,10 @@ actor_reqs = { "type", "name", "range" "UnitFlag", "Settlers", "Local" } +target_reqs = + { "type", "name", "range" + "TerrainAlter", "CanRoad", "Local" + } [actionenabler_base] action = "Build Base" diff --git a/data/civ2/game.ruleset b/data/civ2/game.ruleset index 838b7da59c..0593cdcd13 100644 --- a/data/civ2/game.ruleset +++ b/data/civ2/game.ruleset @@ -1186,6 +1186,10 @@ actor_reqs = { "type", "name", "range" "UnitFlag", "Settlers", "Local" } +target_reqs = + { "type", "name", "range" + "TerrainAlter", "CanRoad", "Local" + } [actionenabler_base] action = "Build Base" diff --git a/data/civ2civ3/game.ruleset b/data/civ2civ3/game.ruleset index 30b2428249..5f149f49eb 100644 --- a/data/civ2civ3/game.ruleset +++ b/data/civ2civ3/game.ruleset @@ -1336,6 +1336,10 @@ actor_reqs = { "type", "name", "range" "UnitFlag", "Settlers", "Local" } +target_reqs = + { "type", "name", "range" + "TerrainAlter", "CanRoad", "Local" + } [actionenabler_base] action = "Build Base" diff --git a/data/classic/game.ruleset b/data/classic/game.ruleset index 9e24c56bf5..6633fa9b48 100644 --- a/data/classic/game.ruleset +++ b/data/classic/game.ruleset @@ -1301,6 +1301,10 @@ actor_reqs = { "type", "name", "range" "UnitFlag", "Settlers", "Local" } +target_reqs = + { "type", "name", "range" + "TerrainAlter", "CanRoad", "Local" + } [actionenabler_base] action = "Build Base" diff --git a/data/experimental/game.ruleset b/data/experimental/game.ruleset index 75996f6a19..2955ef25b9 100644 --- a/data/experimental/game.ruleset +++ b/data/experimental/game.ruleset @@ -1320,6 +1320,10 @@ actor_reqs = { "type", "name", "range" "UnitFlag", "Settlers", "Local" } +target_reqs = + { "type", "name", "range" + "TerrainAlter", "CanRoad", "Local" + } [actionenabler_base] action = "Build Base" diff --git a/data/granularity/game.ruleset b/data/granularity/game.ruleset index 129d36b70a..64b5343e2c 100644 --- a/data/granularity/game.ruleset +++ b/data/granularity/game.ruleset @@ -818,6 +818,10 @@ colorlist = { "r", "g", "b" 255, 0, 0 } +target_reqs = + { "type", "name", "range" + "TerrainAlter", "CanRoad", "Local" + } [teams] ; freeciv optional team names definition. diff --git a/data/multiplayer/game.ruleset b/data/multiplayer/game.ruleset index 9ddcaf3bb6..7c4849d2d4 100644 --- a/data/multiplayer/game.ruleset +++ b/data/multiplayer/game.ruleset @@ -1292,6 +1292,10 @@ actor_reqs = { "type", "name", "range" "UnitFlag", "Settlers", "Local" } +target_reqs = + { "type", "name", "range" + "TerrainAlter", "CanRoad", "Local" + } [actionenabler_base] action = "Build Base" diff --git a/data/sandbox/game.ruleset b/data/sandbox/game.ruleset index ff39a3e4d4..6652284b10 100644 --- a/data/sandbox/game.ruleset +++ b/data/sandbox/game.ruleset @@ -2380,6 +2380,10 @@ actor_reqs = { "type", "name", "range" "UnitFlag", "Settlers", "Local" } +target_reqs = + { "type", "name", "range" + "TerrainAlter", "CanRoad", "Local" + } [actionenabler_base] action = "Build Base" diff --git a/data/stub/game.ruleset b/data/stub/game.ruleset index e92ae5efe5..55c01d43c9 100644 --- a/data/stub/game.ruleset +++ b/data/stub/game.ruleset @@ -679,6 +679,10 @@ colorlist = { "r", "g", "b" 255, 0, 0 } +target_reqs = + { "type", "name", "range" + "TerrainAlter", "CanRoad", "Local" + } [teams] ; freeciv optional team names definition. diff --git a/data/webperimental/game.ruleset b/data/webperimental/game.ruleset index 79b624abba..3efd9021fd 100644 --- a/data/webperimental/game.ruleset +++ b/data/webperimental/game.ruleset @@ -1587,6 +1587,10 @@ actor_reqs = { "type", "name", "range" "UnitFlag", "Settlers", "Local" } +target_reqs = + { "type", "name", "range" + "TerrainAlter", "CanRoad", "Local" + } [actionenabler_base] action = "Build Base" diff --git a/doc/README.actions b/doc/README.actions index ec84b6093d..e9abd6f95a 100644 --- a/doc/README.actions +++ b/doc/README.actions @@ -1071,7 +1071,7 @@ Actions done by a unit against a tile * the target extra (the extra to be built) is an road * the target tile doesn't already have the target extra * the target extra is buildable (see extra type's buildable) - * the target tile's terrain's road_time isn't 0 + * the target tile's terrain's road_time is above 0 (!) * if the target extra is both a road and a base the target tile's terrain's base_time isn't 0 * if the target extra is both a road and a base the target extra can't -- 2.30.2