From ff55bfb78747a9a31e40b926ab04abc83b4346b7 Mon Sep 17 00:00:00 2001 From: PeterN Date: Wed, 12 Apr 2023 22:30:03 +0100 Subject: [PATCH] Fix #10343: Don't extend town-disallowed roadtypes. (#10347) Towns currently don't build disallowed roadtypes, however they should also not extend disallowed roadtypes as well. If the roadtype that cannot be extended happens to be the roadtype that the town was going to build then this restriction is ignored. --- src/town_cmd.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 9d3ae90188..81732f3941 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -1362,6 +1362,20 @@ static inline bool RoadTypesAllowHouseHere(TileIndex t) return !allow; } +/** Test if town can grow road onto a specific tile. + * @param town Town that is building. + * @param tile Tile to build upon. + * @return true iff the tile's road type don't prevent extending the road. + */ +static bool TownCanGrowRoad(const Town *town, TileIndex tile) +{ + if (!IsTileType(tile, MP_ROAD)) return true; + + /* Allow extending on roadtypes which can be built by town, or if the road type matches the type the town will build. */ + RoadType rt = GetRoadTypeRoad(tile); + return HasBit(GetRoadTypeInfo(rt)->flags, ROTF_TOWN_BUILD) || GetTownRoadType(town) == rt; +} + /** * Grows the given town. * There are at the moment 3 possible way's for @@ -1438,6 +1452,8 @@ static void GrowTownInTile(TileIndex *tile_ptr, RoadBits cur_rb, DiagDirection t } } else if (target_dir < DIAGDIR_END && !(cur_rb & DiagDirToRoadBits(ReverseDiagDir(target_dir)))) { + if (!TownCanGrowRoad(t1, tile)) return; + /* Continue building on a partial road. * Should be always OK, so we only generate * the fitting RoadBits */ @@ -1557,6 +1573,8 @@ static void GrowTownInTile(TileIndex *tile_ptr, RoadBits cur_rb, DiagDirection t return; } + if (!TownCanGrowRoad(t1, tile)) return; + _grow_town_result = GROWTH_SEARCH_STOPPED; }