mirror of https://github.com/OpenTTD/OpenTTD
(svn r13929) -Codechange [YAPP]: Reserving and unreserving of single tracks is now possible. (michi_cc)
parent
2bb8825538
commit
f6555cf6f8
116
src/pbs.cpp
116
src/pbs.cpp
|
@ -1,7 +1,6 @@
|
|||
/* $Id$ */
|
||||
|
||||
/** @file pbs.cpp */
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "openttd.h"
|
||||
#include "pbs.h"
|
||||
|
@ -9,6 +8,10 @@
|
|||
#include "road_map.h"
|
||||
#include "station_map.h"
|
||||
#include "tunnelbridge_map.h"
|
||||
#include "functions.h"
|
||||
#include "debug.h"
|
||||
#include "direction_func.h"
|
||||
#include "settings_type.h"
|
||||
|
||||
/**
|
||||
* Get the reserved trackbits for any tile, regardless of type.
|
||||
|
@ -41,3 +44,114 @@ TrackBits GetReservedTrackbits(TileIndex t)
|
|||
}
|
||||
return TRACK_BIT_NONE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the reservation for a complete station platform.
|
||||
* @pre IsRailwayStationTile(start)
|
||||
* @param start starting tile of the platform
|
||||
* @param dir the direction in which to follow the platform
|
||||
* @param b the state the reservation should be set to
|
||||
*/
|
||||
void SetRailwayStationPlatformReservation(TileIndex start, DiagDirection dir, bool b)
|
||||
{
|
||||
TileIndex tile = start;
|
||||
TileIndexDiff diff = TileOffsByDiagDir(dir);
|
||||
|
||||
assert(IsRailwayStationTile(start));
|
||||
assert(GetRailStationAxis(start) == DiagDirToAxis(dir));
|
||||
|
||||
do {
|
||||
SetRailwayStationReservation(tile, b);
|
||||
if (_settings_client.gui.show_track_reservation) MarkTileDirtyByTile(tile);
|
||||
tile = TILE_ADD(tile, diff);
|
||||
} while (IsCompatibleTrainStationTile(tile, start));
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to reserve a specific track on a tile
|
||||
* @param tile the tile
|
||||
* @param t the track
|
||||
* @return true if reservation was successfull, i.e. the track was
|
||||
* free and didn't cross any other reserved tracks.
|
||||
*/
|
||||
bool TryReserveRailTrack(TileIndex tile, Track t)
|
||||
{
|
||||
assert((GetTileTrackStatus(tile, TRANSPORT_RAIL, 0) & TrackToTrackBits(t)) != 0);
|
||||
|
||||
if (_settings_client.gui.show_track_reservation) {
|
||||
MarkTileDirtyByTile(tile);
|
||||
}
|
||||
|
||||
switch (GetTileType(tile)) {
|
||||
case MP_RAILWAY:
|
||||
if (IsPlainRailTile(tile)) return TryReserveTrack(tile, t);
|
||||
if (IsRailWaypoint(tile) || IsRailDepot(tile)) {
|
||||
if (!GetDepotWaypointReservation(tile)) {
|
||||
SetDepotWaypointReservation(tile, true);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case MP_ROAD:
|
||||
if (IsLevelCrossing(tile) && !GetCrossingReservation(tile)) {
|
||||
SetCrossingReservation(tile, true);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case MP_STATION:
|
||||
if (IsRailwayStation(tile) && !GetRailwayStationReservation(tile)) {
|
||||
SetRailwayStationReservation(tile, true);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
case MP_TUNNELBRIDGE:
|
||||
if (GetTunnelBridgeTransportType(tile) == TRANSPORT_RAIL && !GetRailTunnelBridgeReservation(tile)) {
|
||||
SetTunnelBridgeReservation(tile, true);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Lift the reservation of a specific track on a tile
|
||||
* @param tile the tile
|
||||
* @param t the track
|
||||
*/
|
||||
void UnreserveRailTrack(TileIndex tile, Track t)
|
||||
{
|
||||
assert((GetTileTrackStatus(tile, TRANSPORT_RAIL, 0) & TrackToTrackBits(t)) != 0);
|
||||
|
||||
if (_settings_client.gui.show_track_reservation) {
|
||||
MarkTileDirtyByTile(tile);
|
||||
}
|
||||
|
||||
switch (GetTileType(tile)) {
|
||||
case MP_RAILWAY:
|
||||
if (IsRailWaypoint(tile) || IsRailDepot(tile)) SetDepotWaypointReservation(tile, false);
|
||||
if (IsPlainRailTile(tile)) UnreserveTrack(tile, t);
|
||||
break;
|
||||
|
||||
case MP_ROAD:
|
||||
if (IsLevelCrossing(tile)) SetCrossingReservation(tile, false);
|
||||
break;
|
||||
|
||||
case MP_STATION:
|
||||
if (IsRailwayStation(tile)) SetRailwayStationReservation(tile, false);
|
||||
break;
|
||||
|
||||
case MP_TUNNELBRIDGE:
|
||||
if (GetTunnelBridgeTransportType(tile) == TRANSPORT_RAIL) SetTunnelBridgeReservation(tile, false);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
18
src/pbs.h
18
src/pbs.h
|
@ -6,8 +6,26 @@
|
|||
#define PBS_H
|
||||
|
||||
#include "tile_type.h"
|
||||
#include "direction_type.h"
|
||||
#include "track_type.h"
|
||||
|
||||
TrackBits GetReservedTrackbits(TileIndex t);
|
||||
|
||||
void SetRailwayStationPlatformReservation(TileIndex start, DiagDirection dir, bool b);
|
||||
|
||||
bool TryReserveRailTrack(TileIndex tile, Track t);
|
||||
void UnreserveRailTrack(TileIndex tile, Track t);
|
||||
|
||||
/**
|
||||
* Check whether some of tracks is reserved on a tile.
|
||||
*
|
||||
* @param tile the tile
|
||||
* @param tracks the tracks to test
|
||||
* @return true if at least on of tracks is reserved
|
||||
*/
|
||||
static inline bool HasReservedTracks(TileIndex tile, TrackBits tracks)
|
||||
{
|
||||
return (GetReservedTrackbits(tile) & tracks) != TRACK_BIT_NONE;
|
||||
}
|
||||
|
||||
#endif /* PBS_H */
|
||||
|
|
|
@ -256,6 +256,39 @@ static inline void SetTrackReservation(TileIndex t, TrackBits b)
|
|||
SB(_m[t].m2, 11, 1, (byte)(b != TRACK_BIT_NONE));
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to reserve a specific track on a tile
|
||||
* @pre IsPlainRailTile(t) && HasTrack(tile, t)
|
||||
* @param tile the tile
|
||||
* @param t the rack to reserve
|
||||
* @return true if successful
|
||||
*/
|
||||
static inline bool TryReserveTrack(TileIndex tile, Track t)
|
||||
{
|
||||
assert(HasTrack(tile, t));
|
||||
TrackBits bits = TrackToTrackBits(t);
|
||||
TrackBits res = GetTrackReservation(tile);
|
||||
if ((res & bits) != TRACK_BIT_NONE) return false; // already reserved
|
||||
res |= bits;
|
||||
if (TracksOverlap(res)) return false; // crossing reservation present
|
||||
SetTrackReservation(tile, res);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Lift the reservation of a specific track on a tile
|
||||
* @pre IsPlainRailTile(t) && HasTrack(tile, t)
|
||||
* @param tile the tile
|
||||
* @param t the track to free
|
||||
*/
|
||||
static inline void UnreserveTrack(TileIndex tile, Track t)
|
||||
{
|
||||
assert(HasTrack(tile, t));
|
||||
TrackBits res = GetTrackReservation(tile);
|
||||
res &= ~TrackToTrackBits(t);
|
||||
SetTrackReservation(tile, res);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the reservation state of the waypoint or depot
|
||||
* @note Works for both waypoints and rail depots
|
||||
|
|
Loading…
Reference in New Issue