summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/landscape.cpp15
-rw-r--r--src/water.h2
-rw-r--r--src/water_cmd.cpp11
3 files changed, 26 insertions, 2 deletions
diff --git a/src/landscape.cpp b/src/landscape.cpp
index 35a00e1d2..adc510253 100644
--- a/src/landscape.cpp
+++ b/src/landscape.cpp
@@ -1038,7 +1038,12 @@ static void River_GetNeighbours(AyStar *aystar, OpenListNode *current)
static void River_FoundEndNode(AyStar *aystar, OpenListNode *current)
{
for (PathNode *path = &current->path; path != NULL; path = path->parent) {
- if (!IsWaterTile(path->node.tile)) MakeRiver(path->node.tile, Random());
+ TileIndex tile = path->node.tile;
+ if (!IsWaterTile(tile)) {
+ MakeRiver(tile, Random());
+ /* Remove desert directly around the river tile. */
+ CircularTileSearch(&tile, 5, RiverModifyDesertZone, NULL);
+ }
}
}
@@ -1168,7 +1173,7 @@ static void CreateRivers()
if (amount == 0) return;
uint wells = ScaleByMapSize(4 << _settings_game.game_creation.amount_of_rivers);
- SetGeneratingWorldProgress(GWP_RIVER, wells);
+ SetGeneratingWorldProgress(GWP_RIVER, wells + 256 / 64); // Include the tile loop calls below.
bool *marks = CallocT<bool>(MapSize());
for (; wells != 0; wells--) {
@@ -1181,6 +1186,12 @@ static void CreateRivers()
}
free(marks);
+
+ /* Run tile loop to update the ground density. */
+ for (uint i = 0; i != 256; i++) {
+ if (i % 64 == 0) IncreaseGeneratingWorldProgress(GWP_RIVER);
+ RunTileLoop();
+ }
}
void GenerateLandscape(byte mode)
diff --git a/src/water.h b/src/water.h
index a5bb1c629..56bd92fde 100644
--- a/src/water.h
+++ b/src/water.h
@@ -41,4 +41,6 @@ void DrawShoreTile(Slope tileh);
void MakeWaterKeepingClass(TileIndex tile, Owner o);
+bool RiverModifyDesertZone(TileIndex tile, void *data);
+
#endif /* WATER_H */
diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp
index 5ac09a9b1..efb3152d1 100644
--- a/src/water_cmd.cpp
+++ b/src/water_cmd.cpp
@@ -308,6 +308,13 @@ CommandCost CmdBuildLock(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
return DoBuildLock(tile, dir, flags);
}
+/** Callback to create non-desert around a river tile. */
+bool RiverModifyDesertZone(TileIndex tile, void *)
+{
+ if (GetTropicZone(tile) == TROPICZONE_DESERT) SetTropicZone(tile, TROPICZONE_NORMAL);
+ return false;
+}
+
/**
* Build a piece of canal.
* @param tile end tile of stretch-dragging
@@ -350,6 +357,10 @@ CommandCost CmdBuildCanal(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
switch (wc) {
case WATER_CLASS_RIVER:
MakeRiver(tile, Random());
+ if (_game_mode == GM_EDITOR) {
+ TileIndex tile2 = tile;
+ CircularTileSearch(&tile2, 5, RiverModifyDesertZone, NULL);
+ }
break;
case WATER_CLASS_SEA: