Mercurial > hg > openttd
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