--- a/src/rail_cmd.cpp Wed Jan 16 21:17:31 2008 +0000
+++ b/src/rail_cmd.cpp Wed Jan 16 22:26:45 2008 +0000
@@ -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