From 96ec9908a051fa22fcfc9a57912e286c9f6b3bb9 Mon Sep 17 00:00:00 2001 From: SamuXarick <43006711+SamuXarick@users.noreply.github.com> Date: Sat, 14 Jan 2023 23:43:41 +0000 Subject: [PATCH] Codechange: refactor removal of desert around river tiles --- src/landscape.cpp | 38 ++++++-------------------------------- src/water.h | 1 + src/water_cmd.cpp | 12 ++++++++++++ 3 files changed, 19 insertions(+), 32 deletions(-) diff --git a/src/landscape.cpp b/src/landscape.cpp index 66912ee3fc..31cdd7f6df 100644 --- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -1064,11 +1064,7 @@ static bool MakeLake(TileIndex tile, void *user_data) for (DiagDirection d = DIAGDIR_BEGIN; d < DIAGDIR_END; d++) { TileIndex t2 = tile + TileOffsByDiagDir(d); if (IsWaterTile(t2)) { - MakeRiver(tile, Random()); - MarkTileDirtyByTile(tile); - /* Remove desert directly around the river tile. */ - TileIndex t = tile; - CircularTileSearch(&t, RIVER_OFFSET_DESERT_DISTANCE, RiverModifyDesertZone, nullptr); + MakeRiverAndModifyDesertZoneAround(tile); return false; } } @@ -1202,12 +1198,7 @@ static bool RiverMakeWider(TileIndex tile, void *data) /* If the tile upstream isn't flat, don't bother. */ if (GetTileSlope(downstream_tile) != SLOPE_FLAT) return false; - MakeRiver(downstream_tile, Random()); - MarkTileDirtyByTile(downstream_tile); - - /* Remove desert directly around the river tile. */ - TileIndex cur_tile = downstream_tile; - CircularTileSearch(&cur_tile, RIVER_OFFSET_DESERT_DISTANCE, RiverModifyDesertZone, nullptr); + MakeRiverAndModifyDesertZoneAround(downstream_tile); } /* If upstream is dry and flat, try making it a river tile. */ @@ -1215,23 +1206,13 @@ static bool RiverMakeWider(TileIndex tile, void *data) /* If the tile upstream isn't flat, don't bother. */ if (GetTileSlope(upstream_tile) != SLOPE_FLAT) return false; - MakeRiver(upstream_tile, Random()); - MarkTileDirtyByTile(upstream_tile); - - /* Remove desert directly around the river tile. */ - TileIndex cur_tile = upstream_tile; - CircularTileSearch(&cur_tile, RIVER_OFFSET_DESERT_DISTANCE, RiverModifyDesertZone, nullptr); + MakeRiverAndModifyDesertZoneAround(upstream_tile); } } /* If the tile slope matches the desired slope, add a river tile. */ if (cur_slope == desired_slope) { - MakeRiver(tile, Random()); - MarkTileDirtyByTile(tile); - - /* Remove desert directly around the river tile. */ - TileIndex cur_tile = tile; - CircularTileSearch(&cur_tile, RIVER_OFFSET_DESERT_DISTANCE, RiverModifyDesertZone, nullptr); + MakeRiverAndModifyDesertZoneAround(tile); } /* Always return false to keep searching. */ @@ -1310,10 +1291,7 @@ static void River_FoundEndNode(AyStar *aystar, OpenListNode *current) for (PathNode *path = ¤t->path; path != nullptr; path = path->parent, cur_pos++) { TileIndex tile = path->node.tile; if (!IsWaterTile(tile)) { - MakeRiver(tile, Random()); - MarkTileDirtyByTile(tile); - /* Remove desert directly around the river tile. */ - CircularTileSearch(&tile, RIVER_OFFSET_DESERT_DISTANCE, RiverModifyDesertZone, nullptr); + MakeRiverAndModifyDesertZoneAround(tile); } } @@ -1453,11 +1431,7 @@ static std::tuple FlowRiver(TileIndex spring, TileIndex begin, uint /* We only want a lake if the river is long enough. */ DistanceManhattan(spring, lakeCenter) > min_river_length) { end = lakeCenter; - MakeRiver(lakeCenter, Random()); - MarkTileDirtyByTile(lakeCenter); - /* Remove desert directly around the river tile. */ - CircularTileSearch(&lakeCenter, RIVER_OFFSET_DESERT_DISTANCE, RiverModifyDesertZone, nullptr); - lakeCenter = end; + MakeRiverAndModifyDesertZoneAround(lakeCenter); uint range = RandomRange(8) + 3; CircularTileSearch(&lakeCenter, range, MakeLake, &height); /* Call the search a second time so artefacts from going circular in one direction get (mostly) hidden. */ diff --git a/src/water.h b/src/water.h index 27c3339c18..379c13ef72 100644 --- a/src/water.h +++ b/src/water.h @@ -39,6 +39,7 @@ void MakeWaterKeepingClass(TileIndex tile, Owner o); void CheckForDockingTile(TileIndex t); bool RiverModifyDesertZone(TileIndex tile, void *data); +void MakeRiverAndModifyDesertZoneAround(TileIndex tile); static const uint RIVER_OFFSET_DESERT_DISTANCE = 5; ///< Circular tile search radius to create non-desert around a river tile. bool IsWateredTile(TileIndex tile, Direction from); diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 68b2cef3e7..0e23b7259c 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -427,6 +427,18 @@ bool RiverModifyDesertZone(TileIndex tile, void *) return false; } +/** + * Make a river tile and remove desert directly around it. + * @param tile The tile to change into river and create non-desert around + */ +void MakeRiverAndModifyDesertZoneAround(TileIndex tile) { + MakeRiver(tile, Random()); + MarkTileDirtyByTile(tile); + + /* Remove desert directly around the river tile. */ + CircularTileSearch(&tile, RIVER_OFFSET_DESERT_DISTANCE, RiverModifyDesertZone, nullptr); +} + /** * Build a piece of canal. * @param flags type of operation