Change TunnelBridgeIsFree across_only to a mode enum type
This commit is contained in:
@@ -478,7 +478,7 @@ static PBSTileInfo FollowReservation(Owner o, RailTypes rts, TileIndex tile, Tra
|
|||||||
if (_settings_game.vehicle.train_braking_model == TBM_REALISTIC && IsTunnelBridgeSignalSimulationEntrance(tile)) {
|
if (_settings_game.vehicle.train_braking_model == TBM_REALISTIC && IsTunnelBridgeSignalSimulationEntrance(tile)) {
|
||||||
TileIndex end = GetOtherTunnelBridgeEnd(tile);
|
TileIndex end = GetOtherTunnelBridgeEnd(tile);
|
||||||
if (HasAcrossTunnelBridgeReservation(end) && GetTunnelBridgeExitSignalState(end) == SIGNAL_STATE_GREEN &&
|
if (HasAcrossTunnelBridgeReservation(end) && GetTunnelBridgeExitSignalState(end) == SIGNAL_STATE_GREEN &&
|
||||||
((flags & FRF_TB_EXIT_FREE) || TunnelBridgeIsFree(tile, end, nullptr, true).Succeeded())) {
|
((flags & FRF_TB_EXIT_FREE) || TunnelBridgeIsFree(tile, end, nullptr, TBIFM_ACROSS_ONLY).Succeeded())) {
|
||||||
/* skip far end */
|
/* skip far end */
|
||||||
if (lookahead != nullptr) {
|
if (lookahead != nullptr) {
|
||||||
lookahead->reservation_end_position += (DistanceManhattan(tile, end) - 1) * TILE_SIZE;
|
lookahead->reservation_end_position += (DistanceManhattan(tile, end) - 1) * TILE_SIZE;
|
||||||
@@ -501,7 +501,7 @@ static PBSTileInfo FollowReservation(Owner o, RailTypes rts, TileIndex tile, Tra
|
|||||||
if ((flags & FRF_IGNORE_ONEWAY) && _settings_game.vehicle.train_braking_model == TBM_REALISTIC && IsTunnelBridgeSignalSimulationExit(tile) &&
|
if ((flags & FRF_IGNORE_ONEWAY) && _settings_game.vehicle.train_braking_model == TBM_REALISTIC && IsTunnelBridgeSignalSimulationExit(tile) &&
|
||||||
GetTunnelBridgeExitSignalState(tile) == SIGNAL_STATE_GREEN) {
|
GetTunnelBridgeExitSignalState(tile) == SIGNAL_STATE_GREEN) {
|
||||||
TileIndex end = GetOtherTunnelBridgeEnd(tile);
|
TileIndex end = GetOtherTunnelBridgeEnd(tile);
|
||||||
if (HasAcrossTunnelBridgeReservation(end) && TunnelBridgeIsFree(tile, end, nullptr, true).Succeeded()) {
|
if (HasAcrossTunnelBridgeReservation(end) && TunnelBridgeIsFree(tile, end, nullptr, TBIFM_ACROSS_ONLY).Succeeded()) {
|
||||||
/* skip far end */
|
/* skip far end */
|
||||||
tile = end;
|
tile = end;
|
||||||
trackdir = GetTunnelBridgeExitTrackdir(tile);
|
trackdir = GetTunnelBridgeExitTrackdir(tile);
|
||||||
@@ -729,7 +729,7 @@ static void FollowReservationEnumerate(Owner o, RailTypes rts, TileIndex tile, T
|
|||||||
if (_settings_game.vehicle.train_braking_model == TBM_REALISTIC && IsTunnelBridgeSignalSimulationEntrance(tile)) {
|
if (_settings_game.vehicle.train_braking_model == TBM_REALISTIC && IsTunnelBridgeSignalSimulationEntrance(tile)) {
|
||||||
TileIndex end = GetOtherTunnelBridgeEnd(tile);
|
TileIndex end = GetOtherTunnelBridgeEnd(tile);
|
||||||
if (HasAcrossTunnelBridgeReservation(end) && GetTunnelBridgeExitSignalState(end) == SIGNAL_STATE_GREEN &&
|
if (HasAcrossTunnelBridgeReservation(end) && GetTunnelBridgeExitSignalState(end) == SIGNAL_STATE_GREEN &&
|
||||||
((flags & FRF_TB_EXIT_FREE) || TunnelBridgeIsFree(tile, end, nullptr, true).Succeeded())) {
|
((flags & FRF_TB_EXIT_FREE) || TunnelBridgeIsFree(tile, end, nullptr, TBIFM_ACROSS_ONLY).Succeeded())) {
|
||||||
/* skip far end */
|
/* skip far end */
|
||||||
Trackdir end_trackdir = GetTunnelBridgeExitTrackdir(end);
|
Trackdir end_trackdir = GetTunnelBridgeExitTrackdir(end);
|
||||||
tile = end;
|
tile = end;
|
||||||
@@ -741,7 +741,7 @@ static void FollowReservationEnumerate(Owner o, RailTypes rts, TileIndex tile, T
|
|||||||
if ((flags & FRF_IGNORE_ONEWAY) && _settings_game.vehicle.train_braking_model == TBM_REALISTIC && IsTunnelBridgeSignalSimulationExit(tile) &&
|
if ((flags & FRF_IGNORE_ONEWAY) && _settings_game.vehicle.train_braking_model == TBM_REALISTIC && IsTunnelBridgeSignalSimulationExit(tile) &&
|
||||||
GetTunnelBridgeExitSignalState(tile) == SIGNAL_STATE_GREEN) {
|
GetTunnelBridgeExitSignalState(tile) == SIGNAL_STATE_GREEN) {
|
||||||
TileIndex end = GetOtherTunnelBridgeEnd(tile);
|
TileIndex end = GetOtherTunnelBridgeEnd(tile);
|
||||||
if (HasAcrossTunnelBridgeReservation(end) && TunnelBridgeIsFree(tile, end, nullptr, true).Succeeded()) {
|
if (HasAcrossTunnelBridgeReservation(end) && TunnelBridgeIsFree(tile, end, nullptr, TBIFM_ACROSS_ONLY).Succeeded()) {
|
||||||
/* skip far end */
|
/* skip far end */
|
||||||
tile = end;
|
tile = end;
|
||||||
trackdir = GetTunnelBridgeExitTrackdir(tile);
|
trackdir = GetTunnelBridgeExitTrackdir(tile);
|
||||||
|
@@ -1496,7 +1496,7 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1,
|
|||||||
if (!ValParamTrackOrientation(track) || !IsTrackAcrossTunnelBridge(tile, track)) {
|
if (!ValParamTrackOrientation(track) || !IsTrackAcrossTunnelBridge(tile, track)) {
|
||||||
return_cmd_error(STR_ERROR_THERE_IS_NO_RAILROAD_TRACK);
|
return_cmd_error(STR_ERROR_THERE_IS_NO_RAILROAD_TRACK);
|
||||||
}
|
}
|
||||||
CommandCost ret = TunnelBridgeIsFree(tile, GetOtherTunnelBridgeEnd(tile), nullptr, true);
|
CommandCost ret = TunnelBridgeIsFree(tile, GetOtherTunnelBridgeEnd(tile), nullptr, TBIFM_ACROSS_ONLY);
|
||||||
if (ret.Failed()) return ret;
|
if (ret.Failed()) return ret;
|
||||||
} else if (!ValParamTrackOrientation(track) || !IsPlainRailTile(tile) || !HasTrack(tile, track)) {
|
} else if (!ValParamTrackOrientation(track) || !IsPlainRailTile(tile) || !HasTrack(tile, track)) {
|
||||||
return_cmd_error(STR_ERROR_THERE_IS_NO_RAILROAD_TRACK);
|
return_cmd_error(STR_ERROR_THERE_IS_NO_RAILROAD_TRACK);
|
||||||
@@ -2185,7 +2185,7 @@ CommandCost CmdRemoveSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1
|
|||||||
}
|
}
|
||||||
if (!IsTunnelBridgeWithSignalSimulation(tile)) return_cmd_error(STR_ERROR_THERE_ARE_NO_SIGNALS);
|
if (!IsTunnelBridgeWithSignalSimulation(tile)) return_cmd_error(STR_ERROR_THERE_ARE_NO_SIGNALS);
|
||||||
TileIndex end = GetOtherTunnelBridgeEnd(tile);
|
TileIndex end = GetOtherTunnelBridgeEnd(tile);
|
||||||
CommandCost ret = TunnelBridgeIsFree(tile, end, nullptr, true);
|
CommandCost ret = TunnelBridgeIsFree(tile, end, nullptr, TBIFM_ACROSS_ONLY);
|
||||||
if (ret.Failed()) return ret;
|
if (ret.Failed()) return ret;
|
||||||
|
|
||||||
cost *= GetTunnelBridgeSignalSimulationSignalCount(tile, end);
|
cost *= GetTunnelBridgeSignalSimulationSignalCount(tile, end);
|
||||||
|
@@ -3593,7 +3593,7 @@ static void ClearPathReservation(const Train *v, TileIndex tile, Trackdir track_
|
|||||||
/* Are we just leaving a tunnel/bridge? */
|
/* Are we just leaving a tunnel/bridge? */
|
||||||
if (TrackdirExitsTunnelBridge(tile, track_dir)) {
|
if (TrackdirExitsTunnelBridge(tile, track_dir)) {
|
||||||
TileIndex end = GetOtherTunnelBridgeEnd(tile);
|
TileIndex end = GetOtherTunnelBridgeEnd(tile);
|
||||||
bool free = TunnelBridgeIsFree(tile, end, v, true).Succeeded();
|
bool free = TunnelBridgeIsFree(tile, end, v, TBIFM_ACROSS_ONLY).Succeeded();
|
||||||
HandleLastTunnelBridgeSignals(tile, end, ReverseDiagDir(GetTunnelBridgeDirection(tile)), free);
|
HandleLastTunnelBridgeSignals(tile, end, ReverseDiagDir(GetTunnelBridgeDirection(tile)), free);
|
||||||
}
|
}
|
||||||
} else if (tunbridge_clear_unsignaled_other_end) {
|
} else if (tunbridge_clear_unsignaled_other_end) {
|
||||||
@@ -3720,7 +3720,7 @@ void FreeTrainTrackReservation(Train *v, TileIndex origin, Trackdir orig_td)
|
|||||||
}
|
}
|
||||||
} else if (IsTunnelBridgeWithSignalSimulation(tile) && TrackdirExitsTunnelBridge(tile, td)) {
|
} else if (IsTunnelBridgeWithSignalSimulation(tile) && TrackdirExitsTunnelBridge(tile, td)) {
|
||||||
TileIndex end = GetOtherTunnelBridgeEnd(tile);
|
TileIndex end = GetOtherTunnelBridgeEnd(tile);
|
||||||
bool free = TunnelBridgeIsFree(tile, end, v, true).Succeeded();
|
bool free = TunnelBridgeIsFree(tile, end, v, TBIFM_ACROSS_ONLY).Succeeded();
|
||||||
if (!free) break;
|
if (!free) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6107,7 +6107,7 @@ static Vehicle *CollectTrackbitsFromCrashedVehiclesEnum(Vehicle *v, void *data)
|
|||||||
|
|
||||||
static void SetSignalledBridgeTunnelGreenIfClear(TileIndex tile, TileIndex end)
|
static void SetSignalledBridgeTunnelGreenIfClear(TileIndex tile, TileIndex end)
|
||||||
{
|
{
|
||||||
if (TunnelBridgeIsFree(tile, end, nullptr, true).Succeeded()) {
|
if (TunnelBridgeIsFree(tile, end, nullptr, TBIFM_ACROSS_ONLY).Succeeded()) {
|
||||||
auto process_tile = [](TileIndex t) {
|
auto process_tile = [](TileIndex t) {
|
||||||
if (IsTunnelBridgeSignalSimulationEntrance(t)) {
|
if (IsTunnelBridgeSignalSimulationEntrance(t)) {
|
||||||
if (IsBridge(t)) {
|
if (IsBridge(t)) {
|
||||||
|
@@ -619,7 +619,7 @@ bool IsTrainCollidableRoadVehicleOnGround(TileIndex tile)
|
|||||||
struct GetVehicleTunnelBridgeProcData {
|
struct GetVehicleTunnelBridgeProcData {
|
||||||
const Vehicle *v;
|
const Vehicle *v;
|
||||||
TileIndex t;
|
TileIndex t;
|
||||||
bool across_only;
|
TunnelBridgeIsFreeMode mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Procedure called for every vehicle found in tunnel/bridge in the hash map */
|
/** Procedure called for every vehicle found in tunnel/bridge in the hash map */
|
||||||
@@ -628,9 +628,11 @@ static Vehicle *GetVehicleTunnelBridgeProc(Vehicle *v, void *data)
|
|||||||
const GetVehicleTunnelBridgeProcData *info = (GetVehicleTunnelBridgeProcData*) data;
|
const GetVehicleTunnelBridgeProcData *info = (GetVehicleTunnelBridgeProcData*) data;
|
||||||
if (v == info->v) return nullptr;
|
if (v == info->v) return nullptr;
|
||||||
|
|
||||||
if (v->type == VEH_TRAIN && info->across_only && IsBridge(info->t)) {
|
if (v->type == VEH_TRAIN && info->mode != TBIFM_ALL && IsBridge(info->t)) {
|
||||||
TrackBits vehicle_track = Train::From(v)->track;
|
TrackBits vehicle_track = Train::From(v)->track;
|
||||||
if (!(vehicle_track & TRACK_BIT_WORMHOLE) && !(GetAcrossBridgePossibleTrackBits(info->t) & vehicle_track)) return nullptr;
|
if (!(vehicle_track & TRACK_BIT_WORMHOLE)) {
|
||||||
|
if (info->mode == TBIFM_ACROSS_ONLY && !(GetAcrossBridgePossibleTrackBits(info->t) & vehicle_track)) return nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return v;
|
return v;
|
||||||
@@ -641,10 +643,10 @@ static Vehicle *GetVehicleTunnelBridgeProc(Vehicle *v, void *data)
|
|||||||
* @param tile first end
|
* @param tile first end
|
||||||
* @param endtile second end
|
* @param endtile second end
|
||||||
* @param ignore Ignore this vehicle when searching
|
* @param ignore Ignore this vehicle when searching
|
||||||
* @param across_only Only find vehicles which are passing across the bridge/tunnel or on connecting bridge head track pieces
|
* @param mode Whether to only find vehicles which are passing across the bridge/tunnel or on connecting bridge head track pieces
|
||||||
* @return Succeeded command (if tunnel/bridge is free) or failed command (if a vehicle is using the tunnel/bridge).
|
* @return Succeeded command (if tunnel/bridge is free) or failed command (if a vehicle is using the tunnel/bridge).
|
||||||
*/
|
*/
|
||||||
CommandCost TunnelBridgeIsFree(TileIndex tile, TileIndex endtile, const Vehicle *ignore, bool across_only)
|
CommandCost TunnelBridgeIsFree(TileIndex tile, TileIndex endtile, const Vehicle *ignore, TunnelBridgeIsFreeMode mode)
|
||||||
{
|
{
|
||||||
/* Value v is not safe in MP games, however, it is used to generate a local
|
/* Value v is not safe in MP games, however, it is used to generate a local
|
||||||
* error message only (which may be different for different machines).
|
* error message only (which may be different for different machines).
|
||||||
@@ -653,7 +655,7 @@ CommandCost TunnelBridgeIsFree(TileIndex tile, TileIndex endtile, const Vehicle
|
|||||||
GetVehicleTunnelBridgeProcData data;
|
GetVehicleTunnelBridgeProcData data;
|
||||||
data.v = ignore;
|
data.v = ignore;
|
||||||
data.t = tile;
|
data.t = tile;
|
||||||
data.across_only = across_only;
|
data.mode = mode;
|
||||||
VehicleType type = static_cast<VehicleType>(GetTunnelBridgeTransportType(tile));
|
VehicleType type = static_cast<VehicleType>(GetTunnelBridgeTransportType(tile));
|
||||||
Vehicle *v = VehicleFromPos(tile, type, &data, &GetVehicleTunnelBridgeProc, true);
|
Vehicle *v = VehicleFromPos(tile, type, &data, &GetVehicleTunnelBridgeProc, true);
|
||||||
if (v == nullptr) {
|
if (v == nullptr) {
|
||||||
|
@@ -132,7 +132,12 @@ void ViewportAddVehicles(DrawPixelInfo *dpi, bool update_vehicles);
|
|||||||
void ViewportMapDrawVehicles(DrawPixelInfo *dpi, Viewport *vp);
|
void ViewportMapDrawVehicles(DrawPixelInfo *dpi, Viewport *vp);
|
||||||
|
|
||||||
void ShowNewGrfVehicleError(EngineID engine, StringID part1, StringID part2, GRFBugs bug_type, bool critical);
|
void ShowNewGrfVehicleError(EngineID engine, StringID part1, StringID part2, GRFBugs bug_type, bool critical);
|
||||||
CommandCost TunnelBridgeIsFree(TileIndex tile, TileIndex endtile, const Vehicle *ignore = nullptr, bool across_only = false);
|
|
||||||
|
enum TunnelBridgeIsFreeMode {
|
||||||
|
TBIFM_ALL,
|
||||||
|
TBIFM_ACROSS_ONLY,
|
||||||
|
};
|
||||||
|
CommandCost TunnelBridgeIsFree(TileIndex tile, TileIndex endtile, const Vehicle *ignore = nullptr, TunnelBridgeIsFreeMode mode = TBIFM_ALL);
|
||||||
Train *GetTrainClosestToTunnelBridgeEnd(TileIndex tile, TileIndex other_tile);
|
Train *GetTrainClosestToTunnelBridgeEnd(TileIndex tile, TileIndex other_tile);
|
||||||
int GetAvailableFreeTilesInSignalledTunnelBridge(TileIndex entrance, TileIndex exit, TileIndex tile);
|
int GetAvailableFreeTilesInSignalledTunnelBridge(TileIndex entrance, TileIndex exit, TileIndex tile);
|
||||||
int GetAvailableFreeTilesInSignalledTunnelBridgeWithStartOffset(TileIndex entrance, TileIndex exit, int offset);
|
int GetAvailableFreeTilesInSignalledTunnelBridgeWithStartOffset(TileIndex entrance, TileIndex exit, int offset);
|
||||||
|
Reference in New Issue
Block a user