changeset 8318:e2e3a8e85bdb draft

(svn r11883) -Fix (r11864): assert when trying to remove rail from a house or industry tile
author smatz <smatz@openttd.org>
date Wed, 16 Jan 2008 22:26:45 +0000
parents 7ce2445db70c
children b2743d3ccecb
files src/rail_cmd.cpp
diffstat 1 files changed, 10 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
@@ -441,9 +441,11 @@
 	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 @@
 			}
 
 			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 @@
 				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 @@
 	}
 
 	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