Fix reversing train inside signalled bridge/tunnel not unreserving exit
This commit is contained in:
@@ -59,6 +59,7 @@ static void CheckIfTrainNeedsService(Train *v);
|
|||||||
static void CheckNextTrainTile(Train *v);
|
static void CheckNextTrainTile(Train *v);
|
||||||
TileIndex VehiclePosTraceRestrictPreviousSignalCallback(const Train *v, const void *);
|
TileIndex VehiclePosTraceRestrictPreviousSignalCallback(const Train *v, const void *);
|
||||||
static void TrainEnterStation(Train *v, StationID station);
|
static void TrainEnterStation(Train *v, StationID station);
|
||||||
|
static void UnreserveBridgeTunnelTile(TileIndex tile);
|
||||||
|
|
||||||
static const byte _vehicle_initial_x_fract[4] = {10, 8, 4, 8};
|
static const byte _vehicle_initial_x_fract[4] = {10, 8, 4, 8};
|
||||||
static const byte _vehicle_initial_y_fract[4] = { 8, 4, 8, 10};
|
static const byte _vehicle_initial_y_fract[4] = { 8, 4, 8, 10};
|
||||||
@@ -2224,11 +2225,11 @@ void ReverseTrainDirection(Train *v)
|
|||||||
if (ft.Follow(next_tile, exit_td)) {
|
if (ft.Follow(next_tile, exit_td)) {
|
||||||
TrackdirBits reserved = ft.m_new_td_bits & TrackBitsToTrackdirBits(GetReservedTrackbits(ft.m_new_tile));
|
TrackdirBits reserved = ft.m_new_td_bits & TrackBitsToTrackdirBits(GetReservedTrackbits(ft.m_new_tile));
|
||||||
if (reserved == TRACKDIR_BIT_NONE) {
|
if (reserved == TRACKDIR_BIT_NONE) {
|
||||||
UnreserveAcrossRailTunnelBridge(next_tile);
|
UnreserveBridgeTunnelTile(next_tile);
|
||||||
MarkTileDirtyByTile(next_tile, VMDF_NOT_MAP_MODE);
|
MarkTileDirtyByTile(next_tile, VMDF_NOT_MAP_MODE);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
UnreserveAcrossRailTunnelBridge(next_tile);
|
UnreserveBridgeTunnelTile(next_tile);
|
||||||
MarkTileDirtyByTile(next_tile, VMDF_NOT_MAP_MODE);
|
MarkTileDirtyByTile(next_tile, VMDF_NOT_MAP_MODE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2831,6 +2832,26 @@ void FreeTrainTrackReservation(const Train *v, TileIndex origin, Trackdir orig_t
|
|||||||
{
|
{
|
||||||
assert(v->IsFrontEngine());
|
assert(v->IsFrontEngine());
|
||||||
|
|
||||||
|
if (origin == INVALID_TILE && v->track & TRACK_BIT_WORMHOLE && IsTunnelBridgeWithSignalSimulation(v->tile)) {
|
||||||
|
Axis axis = DiagDirToAxis(GetTunnelBridgeDirection(v->tile));
|
||||||
|
DiagDirection axial_dir = DirToDiagDirAlongAxis(v->direction, axis);
|
||||||
|
TileIndex next_tile = TileVirtXY(v->x_pos, v->y_pos) + TileOffsByDiagDir(axial_dir);
|
||||||
|
if (next_tile == v->tile || next_tile == GetOtherTunnelBridgeEnd(v->tile)) {
|
||||||
|
origin = next_tile;
|
||||||
|
if (v->track == TRACK_BIT_WORMHOLE) {
|
||||||
|
/* Train in tunnel or on bridge, so just use his direction and make an educated guess
|
||||||
|
* given the track bits on the tunnel/bridge head tile.
|
||||||
|
* If a reachable track piece is reserved, use that, otherwise use the first reachable track piece.
|
||||||
|
*/
|
||||||
|
TrackBits tracks = GetAcrossTunnelBridgeReservationTrackBits(next_tile);
|
||||||
|
if (!tracks) tracks = GetAcrossTunnelBridgeTrackBits(next_tile);
|
||||||
|
orig_td = ReverseTrackdir(TrackExitdirToTrackdir(FindFirstTrack(tracks), GetTunnelBridgeDirection(next_tile)));
|
||||||
|
} else {
|
||||||
|
orig_td = TrackDirectionToTrackdir(FindFirstTrack(v->track & TRACK_BIT_MASK), v->direction);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TileIndex tile = origin != INVALID_TILE ? origin : v->tile;
|
TileIndex tile = origin != INVALID_TILE ? origin : v->tile;
|
||||||
Trackdir td = orig_td != INVALID_TRACKDIR ? orig_td : v->GetVehicleTrackdir();
|
Trackdir td = orig_td != INVALID_TRACKDIR ? orig_td : v->GetVehicleTrackdir();
|
||||||
bool free_tile = tile != v->tile || !(IsRailStationTile(v->tile) || IsTileType(v->tile, MP_TUNNELBRIDGE));
|
bool free_tile = tile != v->tile || !(IsRailStationTile(v->tile) || IsTileType(v->tile, MP_TUNNELBRIDGE));
|
||||||
|
Reference in New Issue
Block a user