summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsmatz <smatz@openttd.org>2008-01-16 22:26:45 +0000
committersmatz <smatz@openttd.org>2008-01-16 22:26:45 +0000
commitc8178d43c128f0e1d6ddb7b3c7f9b70d98bdea28 (patch)
tree562967d7a664d7bfaecee638c1ec69e991471d36
parentac7bc24b0e46b6ab9c6a2f171677702d4b9dbfef (diff)
downloadopenttd-c8178d43c128f0e1d6ddb7b3c7f9b70d98bdea28.tar.xz
(svn r11883) -Fix (r11864): assert when trying to remove rail from a house or industry tile
-rw-r--r--src/rail_cmd.cpp13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp
index c404d15d5..9f795dcdc 100644
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
@@ -441,9 +441,11 @@ CommandCost CmdRemoveSingleRail(TileIndex tile, uint32 flags, uint32 p1, uint32
if (!ValParamTrackOrientation((Track)p2)) return CMD_ERROR;
trackbit = TrackToTrackBits(track);
- /* Need to read tile owner now because it may change when the rail is removed.
- * Also, in case of floods, _current_player != owner */
- Owner owner = GetTileOwner(tile);
+ /* Need to read tile owner now because it may change when the rail is removed
+ * Also, in case of floods, _current_player != owner
+ * There may be invalid tiletype even in exec run (when removing long track),
+ * so do not call GetTileOwner(tile) in any case here */
+ Owner owner = INVALID_OWNER;
switch (GetTileType(tile)) {
case MP_ROAD: {
@@ -455,6 +457,7 @@ CommandCost CmdRemoveSingleRail(TileIndex tile, uint32 flags, uint32 p1, uint32
}
if (flags & DC_EXEC) {
+ owner = GetTileOwner(tile);
MakeRoadNormal(tile, GetCrossingRoadBits(tile), GetRoadTypes(tile), GetTownIndex(tile), GetRoadOwner(tile, ROADTYPE_ROAD), GetRoadOwner(tile, ROADTYPE_TRAM), GetRoadOwner(tile, ROADTYPE_HWAY));
}
break;
@@ -478,6 +481,7 @@ CommandCost CmdRemoveSingleRail(TileIndex tile, uint32 flags, uint32 p1, uint32
cost.AddCost(DoCommand(tile, track, 0, flags, CMD_REMOVE_SIGNALS));
if (flags & DC_EXEC) {
+ owner = GetTileOwner(tile);
present ^= trackbit;
if (present == 0) {
if (GetRailGroundType(tile) == RAIL_GROUND_WATER) {
@@ -496,6 +500,9 @@ CommandCost CmdRemoveSingleRail(TileIndex tile, uint32 flags, uint32 p1, uint32
}
if (flags & DC_EXEC) {
+ /* if we got that far, 'owner' variable is set correctly */
+ assert(IsValidPlayer(owner));
+
MarkTileDirtyByTile(tile);
if (crossing) {
/* crossing is set when only TRACK_BIT_X and TRACK_BIT_Y are set. As we