Mercurial > hg > openttd
changeset 6116:05018fddac7b draft
(svn r8852) -Fix (r8735): make the dynamite tool for drive through road stops as if it were removing a normal road tile (consider the local authority and such).
-Fix (r8735): remove drive through road stops on town owned roads when going bankrupt/being removed.
author | rubidium <rubidium@openttd.org> |
---|---|
date | Fri, 23 Feb 2007 00:17:46 +0000 |
parents | c3ae49ab2bb2 |
children | 6def6ecb1bf7 |
files | src/road.h src/road_cmd.cpp src/station_cmd.cpp |
diffstat | 3 files changed, 39 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/road.h +++ b/src/road.h @@ -40,4 +40,14 @@ return (dir & 0x06) == 0; } +/** + * Is it allowed to remove the given road bits from the given tile? + * @param tile the tile to remove the road from + * @param remove the roadbits that are going to be removed + * @param owner the actual owner of the roadbits of the tile + * @param edge_road are the removed bits from a town? + * @return true when it is allowed to remove the road bits + */ +bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, bool *edge_road); + #endif /* ROAD_H */
--- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -35,11 +35,10 @@ } -static bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, bool* edge_road) +bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, bool *edge_road) { RoadBits present; RoadBits n; - Owner owner; *edge_road = true; if (_game_mode == GM_EDITOR) return true; @@ -47,8 +46,6 @@ // Only do the special processing for actual players. if (!IsValidPlayer(_current_player)) return true; - owner = IsLevelCrossingTile(tile) ? GetCrossingRoadOwner(tile) : GetTileOwner(tile); - // Only do the special processing if the road is owned // by a town if (owner != OWNER_TOWN) return (owner == OWNER_NONE) || CheckOwnership(owner); @@ -81,6 +78,10 @@ return true; } +static bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, bool *edge_road) +{ + return CheckAllowRemoveRoad(tile, remove, IsLevelCrossingTile(tile) ? GetCrossingRoadOwner(tile) : GetTileOwner(tile), edge_road); +} /** Delete a piece of road. * @param tile tile where to remove road from
--- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -2584,10 +2584,31 @@ RebuildStationLists(); InvalidateWindowClasses(WC_STATION_LIST); } else { - DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR); + if (IsDriveThroughStopTile(tile) && GetStopBuiltOnTownRoad(tile)) { + /* For a drive-through stop on a town-owned road remove the stop and replace the road */ + DoCommand(tile, 0, (GetStationType(tile) == STATION_TRUCK) ? RoadStop::TRUCK : RoadStop::BUS, DC_EXEC, CMD_REMOVE_ROAD_STOP); + } else { + DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR); + } } } +/** + * Check if a drive-through road stop tile can be cleared. + * Road stops built on town-owned roads check the conditions + * that would allow clearing of the original road. + * @param tile road stop tile to check + * @return true if the road can be cleared + */ +static bool CanRemoveRoadWithStop(TileIndex tile) +{ + /* The road can always be cleared if it was not a town-owned road */ + if (!GetStopBuiltOnTownRoad(tile)) return true; + + bool edge_road; + return CheckAllowRemoveRoad(tile, GetAnyRoadBits(tile), OWNER_TOWN, &edge_road); +} + static int32 ClearTile_Station(TileIndex tile, byte flags) { if (flags & DC_AUTO) { @@ -2610,11 +2631,11 @@ case STATION_RAIL: return RemoveRailroadStation(st, tile, flags); case STATION_AIRPORT: return RemoveAirport(st, flags); case STATION_TRUCK: - if (IsDriveThroughStopTile(tile) && GetStopBuiltOnTownRoad(tile)) + if (IsDriveThroughStopTile(tile) && !CanRemoveRoadWithStop(tile)) return_cmd_error(STR_3047_MUST_DEMOLISH_TRUCK_STATION); return RemoveRoadStop(st, flags, tile); case STATION_BUS: - if (IsDriveThroughStopTile(tile) && GetStopBuiltOnTownRoad(tile)) + if (IsDriveThroughStopTile(tile) && !CanRemoveRoadWithStop(tile)) return_cmd_error(STR_3046_MUST_DEMOLISH_BUS_STATION); return RemoveRoadStop(st, flags, tile); case STATION_BUOY: return RemoveBuoy(st, flags);