# HG changeset patch # User PeterN # Date 2023-04-12 21:30:03 # Node ID cf14d56e290ba43a1eb9acd259edb74183ba494c # Parent 2007da10bda13ef3afaf3ab6f5d41c401192f609 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. diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -1362,6 +1362,20 @@ static inline bool RoadTypesAllowHouseHe 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 *ti } } 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 *ti return; } + if (!TownCanGrowRoad(t1, tile)) return; + _grow_town_result = GROWTH_SEARCH_STOPPED; }