summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfrosch <frosch@openttd.org>2008-01-17 17:13:47 +0000
committerfrosch <frosch@openttd.org>2008-01-17 17:13:47 +0000
commitc7fe6641190c4734c64f4713ad11711c1f340f13 (patch)
tree2c09beeccb6100d84403b39f0e1b2035459e018d
parent03e7f6f2d2c3802fd6ad653302aec52585cc0ef9 (diff)
downloadopenttd-c7fe6641190c4734c64f4713ad11711c1f340f13.tar.xz
(svn r11898) -Fix: Update neighboured canals + signals when flooding non-flat tiles, too.
-rw-r--r--src/rail_cmd.cpp13
-rw-r--r--src/water.h2
-rw-r--r--src/water_cmd.cpp16
3 files changed, 21 insertions, 10 deletions
diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp
index 9f795dcdc..0627580da 100644
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
@@ -528,10 +528,12 @@ CommandCost CmdRemoveSingleRail(TileIndex tile, uint32 flags, uint32 p1, uint32
* The function floods the lower halftile, if the tile has a halftile foundation.
*
* @param t The tile to flood.
+ * @return true if something was flooded.
*/
-void FloodHalftile(TileIndex t)
+bool FloodHalftile(TileIndex t)
{
- if (GetRailGroundType(t) == RAIL_GROUND_WATER) return;
+ bool flooded = false;
+ if (GetRailGroundType(t) == RAIL_GROUND_WATER) return flooded;
Slope tileh = GetTileSlope(t, NULL);
TrackBits rail_bits = GetTrackBits(t);
@@ -542,20 +544,23 @@ void FloodHalftile(TileIndex t)
TrackBits to_remove = lower_track & rail_bits;
if (to_remove != 0) {
_current_player = OWNER_WATER;
- if (CmdFailed(DoCommand(t, 0, FIND_FIRST_BIT(to_remove), DC_EXEC, CMD_REMOVE_SINGLE_RAIL))) return; // not yet floodable
+ if (CmdFailed(DoCommand(t, 0, FIND_FIRST_BIT(to_remove), DC_EXEC, CMD_REMOVE_SINGLE_RAIL))) return flooded; // not yet floodable
+ flooded = true;
rail_bits = rail_bits & ~to_remove;
if (rail_bits == 0) {
MakeShore(t);
MarkTileDirtyByTile(t);
- return;
+ return flooded;
}
}
if (IsNonContinuousFoundation(GetRailFoundation(tileh, rail_bits))) {
+ flooded = true;
SetRailGroundType(t, RAIL_GROUND_WATER);
MarkTileDirtyByTile(t);
}
}
+ return flooded;
}
static const TileIndexDiffC _trackdelta[] = {
diff --git a/src/water.h b/src/water.h
index dbb2e114f..edd270006 100644
--- a/src/water.h
+++ b/src/water.h
@@ -10,6 +10,6 @@ void DrawShipDepotSprite(int x, int y, int image);
void DrawCanalWater(TileIndex tile);
void MakeWaterOrCanalDependingOnOwner(TileIndex tile, Owner o);
void MakeWaterOrCanalDependingOnSurroundings(TileIndex t, Owner o);
-void FloodHalftile(TileIndex t);
+bool FloodHalftile(TileIndex t);
#endif /* WATER_H */
diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp
index 3ef44acd7..319362bea 100644
--- a/src/water_cmd.cpp
+++ b/src/water_cmd.cpp
@@ -605,6 +605,8 @@ static void TileLoopWaterHelper(TileIndex tile, const TileIndexDiffC *offs)
return;
}
+ bool flooded = false; // Will be set to true, when something is flooded
+
/* Is any corner of the dest tile raised? (First two corners already checked above. */
if (TileHeight(TILE_ADD(tile, ToTileIndexDiff(offs[3]))) != 0 ||
TileHeight(TILE_ADD(tile, ToTileIndexDiff(offs[4]))) != 0) {
@@ -613,7 +615,7 @@ static void TileLoopWaterHelper(TileIndex tile, const TileIndexDiffC *offs)
case MP_RAILWAY: {
if (!IsPlainRailTile(target)) break;
- FloodHalftile(target);
+ flooded = FloodHalftile(target);
Vehicle *v = FindFloodableVehicleOnTile(target);
if (v != NULL) FloodVehicle(v);
@@ -625,6 +627,7 @@ static void TileLoopWaterHelper(TileIndex tile, const TileIndexDiffC *offs)
case MP_TREES:
_current_player = OWNER_WATER;
if (CmdSucceeded(DoCommand(target, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR))) {
+ flooded = true;
MakeShore(target);
MarkTileDirtyByTile(target);
}
@@ -642,14 +645,17 @@ static void TileLoopWaterHelper(TileIndex tile, const TileIndexDiffC *offs)
/* flood flat tile */
if (CmdSucceeded(DoCommand(target, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR))) {
+ flooded = true;
MakeWater(target);
MarkTileDirtyByTile(target);
- /* Mark surrounding canal tiles dirty too to avoid glitches */
- for (Direction dir = DIR_BEGIN; dir < DIR_END; dir++) {
- MarkTileDirtyIfCanal(target + TileOffsByDir(dir));
- }
}
+ }
+ if (flooded) {
+ /* Mark surrounding canal tiles dirty too to avoid glitches */
+ for (Direction dir = DIR_BEGIN; dir < DIR_END; dir++) {
+ MarkTileDirtyIfCanal(target + TileOffsByDir(dir));
+ }
/* update signals if needed */
UpdateSignalsInBuffer();
}