From 98e81e95a535f7d940057e79ab46902498d0d067 Mon Sep 17 00:00:00 2001 From: smatz Date: Sat, 9 Feb 2008 17:30:13 +0000 Subject: (svn r12095) -Fix [FS#1703]: when a company bankrupts, remove drive-through road stops, ship depots and buoys too. Update owners of water and road. --- src/road_cmd.cpp | 3 ++- src/station_cmd.cpp | 31 +++++++++++++++++++++++++++---- src/water_cmd.cpp | 22 +++++++++++++--------- 3 files changed, 42 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index 4711fa052..f0957acb0 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -1413,7 +1413,8 @@ static void ChangeTileOwner_Road(TileIndex tile, PlayerID old_player, PlayerID n } for (RoadType rt = ROADTYPE_ROAD; rt < ROADTYPE_END; rt++) { - if (!HasBit(GetRoadTypes(tile), rt)) continue; + /* ROADTYPE_ROAD denotes the tile owner, so update it too */ + if (rt != ROADTYPE_ROAD && !HasBit(GetRoadTypes(tile), rt)) continue; if (GetRoadOwner(tile, rt) == old_player) { SetRoadOwner(tile, rt, new_player == PLAYER_SPECTATOR ? OWNER_NONE : new_player); diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 750a723e7..bef1c1cf3 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -1465,6 +1465,15 @@ CommandCost CmdBuildRoadStop(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) return cost; } + +static void *ClearRoadStopStatusEnum(Vehicle *v, void *) +{ + if (v->type == VEH_ROAD) ClrBit(v->u.road.state, RVS_IN_DT_ROAD_STOP); + + return NULL; +} + + /** Remove a bus station * @param st Station to remove * @param flags operation to perform @@ -1491,7 +1500,13 @@ static CommandCost RemoveRoadStop(Station *st, uint32 flags, TileIndex tile) assert(cur_stop != NULL); - if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR; + /* don't do the check for drive-through road stops when company bankrupts */ + if (IsDriveThroughStopTile(tile) && (flags & DC_BANKRUPT)) { + /* remove the 'going through road stop' status from all vehicles on that tile */ + if (flags & DC_EXEC) VehicleFromPos(tile, NULL, &ClearRoadStopStatusEnum); + } else { + if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR; + } if (flags & DC_EXEC) { if (*primary_stop == cur_stop) { @@ -1905,7 +1920,8 @@ static CommandCost RemoveBuoy(Station *st, uint32 flags) TileIndex tile = st->dock_tile; if (HasStationInUse(st->index, INVALID_PLAYER)) return_cmd_error(STR_BUOY_IS_IN_USE); - if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR; + /* remove the buoy if there is a ship on tile when company goes bankrupt... */ + if (!(flags & DC_BANKRUPT) && !EnsureNoVehicleOnGround(tile)) return CMD_ERROR; if (flags & DC_EXEC) { st->dock_tile = 0; @@ -2891,11 +2907,18 @@ static void ChangeTileOwner_Station(TileIndex tile, PlayerID old_player, PlayerI RebuildStationLists(); InvalidateWindowClasses(WC_STATION_LIST); } else { - if (IsDriveThroughStopTile(tile) && GetStopBuiltOnTownRoad(tile)) { - /* For a drive-through stop on a town-owned road remove the stop and replace the road */ + if (IsDriveThroughStopTile(tile)) { + /* Remove the drive-through road stop */ DoCommand(tile, 0, (GetStationType(tile) == STATION_TRUCK) ? RoadStop::TRUCK : RoadStop::BUS, DC_EXEC | DC_BANKRUPT, CMD_REMOVE_ROAD_STOP); + assert(IsTileType(tile, MP_ROAD)); + /* Change owner of tile and all roadtypes */ + ChangeTileOwner(tile, old_player, new_player); } else { DoCommand(tile, 0, 0, DC_EXEC | DC_BANKRUPT, CMD_LANDSCAPE_CLEAR); + /* Set tile owner of water under (now removed) buoy and dock to OWNER_NONE. + * Update owner of buoy if it was not removed (was in orders). + * Do not update when owned by OWNER_WATER (sea and rivers). */ + if ((IsTileType(tile, MP_WATER) || IsBuoyTile(tile)) && IsTileOwner(tile, old_player)) SetTileOwner(tile, OWNER_NONE); } } } diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 5f316dac2..99141d795 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -220,15 +220,15 @@ void MakeWaterKeepingClass(TileIndex tile, Owner o) static CommandCost RemoveShipDepot(TileIndex tile, uint32 flags) { - TileIndex tile2; - if (!IsShipDepot(tile)) return CMD_ERROR; if (!CheckTileOwnership(tile)) return CMD_ERROR; - if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR; - tile2 = GetOtherShipDepotTile(tile); + TileIndex tile2 = GetOtherShipDepotTile(tile); - if (!EnsureNoVehicleOnGround(tile2)) return CMD_ERROR; + /* do not check for ship on tile when company goes bankrupt */ + if (!(flags & DC_BANKRUPT)) { + if (!EnsureNoVehicleOnGround(tile) || !EnsureNoVehicleOnGround(tile2)) return CMD_ERROR; + } if (flags & DC_EXEC) { /* Kill the depot, which is registered at the northernmost tile. Use that one */ @@ -1139,11 +1139,15 @@ static void ChangeTileOwner_Water(TileIndex tile, PlayerID old_player, PlayerID if (new_player != PLAYER_SPECTATOR) { SetTileOwner(tile, new_player); - } else if (IsShipDepot(tile)) { - DoCommand(tile, 0, 0, DC_EXEC | DC_BANKRUPT, CMD_LANDSCAPE_CLEAR); - } else { - SetTileOwner(tile, OWNER_NONE); + return; } + + /* Remove depot */ + if (IsShipDepot(tile)) DoCommand(tile, 0, 0, DC_EXEC | DC_BANKRUPT, CMD_LANDSCAPE_CLEAR); + + /* Set owner of canals and locks ... and also canal under dock there was before. + * Check if the new owner after removing depot isn't OWNER_WATER. */ + if (IsTileOwner(tile, old_player)) SetTileOwner(tile, OWNER_NONE); } static VehicleEnterTileStatus VehicleEnter_Water(Vehicle *v, TileIndex tile, int x, int y) -- cgit v1.2.3-54-g00ecf