Merge branch 'signal_tunnels_bridges' into jgrpp
# Conflicts: # src/pbs.cpp # src/saveload/extended_ver_sl.cpp # src/settings_gui.cpp # src/settings_type.h # src/signal.cpp # src/table/settings.ini # src/train_cmd.cpp # src/tunnelbridge.h
This commit is contained in:
@@ -2202,10 +2202,10 @@ void ReverseTrainDirection(Train *v)
|
||||
return;
|
||||
}
|
||||
|
||||
/* We are inside tunnel/bidge with signals, reversing will close the entrance. */
|
||||
/* We are inside tunnel/bridge with signals, reversing will close the entrance. */
|
||||
if (IsTunnelBridgeWithSignalSimulation(v->tile)) {
|
||||
/* Flip signal on tunnel entrance tile red. */
|
||||
SetTunnelBridgeSignalState(v->tile, SIGNAL_STATE_RED);
|
||||
SetTunnelBridgeEntranceSignalState(v->tile, SIGNAL_STATE_RED);
|
||||
MarkTileDirtyByTile(v->tile);
|
||||
/* Clear counters. */
|
||||
v->wait_counter = 0;
|
||||
@@ -2601,14 +2601,16 @@ static void HandleLastTunnelBridgeSignals(TileIndex tile, TileIndex end, DiagDir
|
||||
if (free) {
|
||||
/* Open up the wormhole and clear m2. */
|
||||
if (IsBridge(end)) {
|
||||
SetAllBridgeEntranceSimulatedSignalsGreen(end);
|
||||
if (IsTunnelBridgeSignalSimulationEntrance(tile)) SetAllBridgeEntranceSimulatedSignalsGreen(tile);
|
||||
if (IsTunnelBridgeSignalSimulationEntrance(end)) SetAllBridgeEntranceSimulatedSignalsGreen(end);
|
||||
}
|
||||
|
||||
if (IsTunnelBridgeSignalSimulationEntrance(end) && GetTunnelBridgeSignalState(end) == SIGNAL_STATE_RED) {
|
||||
SetTunnelBridgeSignalState(end, SIGNAL_STATE_GREEN);
|
||||
if (IsTunnelBridgeSignalSimulationEntrance(end) && GetTunnelBridgeEntranceSignalState(end) == SIGNAL_STATE_RED) {
|
||||
SetTunnelBridgeEntranceSignalState(end, SIGNAL_STATE_GREEN);
|
||||
MarkTileDirtyByTile(end);
|
||||
} else if (IsTunnelBridgeSignalSimulationEntrance(tile) && GetTunnelBridgeSignalState(tile) == SIGNAL_STATE_RED) {
|
||||
SetTunnelBridgeSignalState(tile, SIGNAL_STATE_GREEN);
|
||||
}
|
||||
if (IsTunnelBridgeSignalSimulationEntrance(tile) && GetTunnelBridgeEntranceSignalState(tile) == SIGNAL_STATE_RED) {
|
||||
SetTunnelBridgeEntranceSignalState(tile, SIGNAL_STATE_GREEN);
|
||||
MarkTileDirtyByTile(tile);
|
||||
}
|
||||
}
|
||||
@@ -2617,7 +2619,7 @@ static void HandleLastTunnelBridgeSignals(TileIndex tile, TileIndex end, DiagDir
|
||||
static void UnreserveBridgeTunnelTile(TileIndex tile)
|
||||
{
|
||||
SetTunnelBridgeReservation(tile, false);
|
||||
if (IsTunnelBridgeSignalSimulationExit(tile) && IsTunnelBridgePBS(tile)) SetTunnelBridgeSignalState(tile, SIGNAL_STATE_RED);
|
||||
if (IsTunnelBridgeSignalSimulationExit(tile) && IsTunnelBridgePBS(tile)) SetTunnelBridgeExitSignalState(tile, SIGNAL_STATE_RED);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3197,7 +3199,7 @@ bool TryPathReserve(Train *v, bool mark_as_stuck, bool first_tile_okay)
|
||||
}
|
||||
}
|
||||
|
||||
if (IsTileType(v->tile, MP_TUNNELBRIDGE) && IsTunnelBridgeSignalSimulationExit(v->tile) &&
|
||||
if (IsTileType(v->tile, MP_TUNNELBRIDGE) && IsTunnelBridgeSignalSimulationExitOnly(v->tile) &&
|
||||
DiagDirToDiagTrackBits(GetTunnelBridgeDirection(v->tile)) == v->track) {
|
||||
// prevent any attempt to reserve the wrong way onto a tunnel/bridge exit
|
||||
return false;
|
||||
@@ -3707,7 +3709,7 @@ static bool CheckTrainStayInWormHolePathReserve(Train *t, TileIndex tile)
|
||||
}
|
||||
bool ok = TryPathReserve(t);
|
||||
t->tile = veh_orig;
|
||||
if (ok && IsTunnelBridgePBS(tile)) SetTunnelBridgeSignalState(tile, SIGNAL_STATE_GREEN);
|
||||
if (ok && IsTunnelBridgePBS(tile)) SetTunnelBridgeExitSignalState(tile, SIGNAL_STATE_GREEN);
|
||||
return ok;
|
||||
}
|
||||
|
||||
@@ -3755,8 +3757,8 @@ static void HandleSignalBehindTrain(Train *v, int signal_number)
|
||||
|
||||
if(tile == v->tile) {
|
||||
/* Flip signal on ramp. */
|
||||
if (IsTunnelBridgeSignalSimulationEntrance(tile) && GetTunnelBridgeSignalState(tile) == SIGNAL_STATE_RED) {
|
||||
SetTunnelBridgeSignalState(tile, SIGNAL_STATE_GREEN);
|
||||
if (IsTunnelBridgeSignalSimulationEntrance(tile) && GetTunnelBridgeEntranceSignalState(tile) == SIGNAL_STATE_RED) {
|
||||
SetTunnelBridgeEntranceSignalState(tile, SIGNAL_STATE_GREEN);
|
||||
MarkTileDirtyByTile(tile);
|
||||
}
|
||||
} else if (IsBridge(v->tile) && signal_number >= 0) {
|
||||
@@ -3987,18 +3989,24 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse)
|
||||
if (IsTunnelBridgeWithSignalSimulation(gp.new_tile)) {
|
||||
/* If red signal stop. */
|
||||
if (v->IsFrontEngine() && v->force_proceed == 0) {
|
||||
if (IsTunnelBridgeSignalSimulationEntrance(gp.new_tile) && GetTunnelBridgeSignalState(gp.new_tile) == SIGNAL_STATE_RED) {
|
||||
if (IsTunnelBridgeSignalSimulationEntrance(gp.new_tile) && GetTunnelBridgeEntranceSignalState(gp.new_tile) == SIGNAL_STATE_RED) {
|
||||
v->cur_speed = 0;
|
||||
v->vehstatus |= VS_TRAIN_SLOWING;
|
||||
return false;
|
||||
}
|
||||
if (IsTunnelBridgeSignalSimulationExit(gp.new_tile)) {
|
||||
if (IsTunnelBridgeSignalSimulationExitOnly(gp.new_tile)) {
|
||||
v->cur_speed = 0;
|
||||
goto invalid_rail;
|
||||
}
|
||||
/* Flip signal on tunnel entrance tile red. */
|
||||
SetTunnelBridgeSignalState(gp.new_tile, SIGNAL_STATE_RED);
|
||||
SetTunnelBridgeEntranceSignalState(gp.new_tile, SIGNAL_STATE_RED);
|
||||
MarkTileDirtyByTile(gp.new_tile);
|
||||
if (IsTunnelBridgeSignalSimulationBidirectional(gp.new_tile)) {
|
||||
/* Set incoming signal in other direction to red as well */
|
||||
TileIndex other_end = GetOtherTunnelBridgeEnd(gp.new_tile);
|
||||
SetTunnelBridgeEntranceSignalState(other_end, SIGNAL_STATE_RED);
|
||||
MarkTileDirtyByTile(other_end);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4058,7 +4066,7 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse)
|
||||
TileIndex old_tile = TileVirtXY(v->x_pos, v->y_pos);
|
||||
if (old_tile != gp.new_tile && IsTunnelBridgeWithSignalSimulation(v->tile) && (v->IsFrontEngine() || v->Next() == NULL)) {
|
||||
if (old_tile == v->tile) {
|
||||
if (v->IsFrontEngine() && v->force_proceed == 0 && IsTunnelBridgeSignalSimulationExit(v->tile)) goto invalid_rail;
|
||||
if (v->IsFrontEngine() && v->force_proceed == 0 && IsTunnelBridgeSignalSimulationExitOnly(v->tile)) goto invalid_rail;
|
||||
/* Entered wormhole set counters. */
|
||||
v->wait_counter = (TILE_SIZE * _settings_game.construction.simulated_wormhole_signals) - TILE_SIZE;
|
||||
v->tunnel_bridge_signal_num = 0;
|
||||
@@ -4365,17 +4373,21 @@ static void DeleteLastWagon(Train *v)
|
||||
if (IsTunnelBridgeWithSignalSimulation(tile)) {
|
||||
TileIndex end = GetOtherTunnelBridgeEnd(tile);
|
||||
UpdateSignalsOnSegment(end, INVALID_DIAGDIR, owner);
|
||||
bool is_entrance = IsTunnelBridgeSignalSimulationEntrance(tile);
|
||||
TileIndex entrance = is_entrance ? tile : end;
|
||||
if (TunnelBridgeIsFree(tile, end, nullptr).Succeeded()) {
|
||||
if (IsBridge(entrance)) {
|
||||
SetAllBridgeEntranceSimulatedSignalsGreen(entrance);
|
||||
MarkBridgeDirty(entrance, ZOOM_LVL_DRAW_MAP);
|
||||
}
|
||||
if (IsTunnelBridgeSignalSimulationEntrance(entrance) && GetTunnelBridgeSignalState(entrance) == SIGNAL_STATE_RED) {
|
||||
SetTunnelBridgeSignalState(entrance, SIGNAL_STATE_GREEN);
|
||||
MarkTileDirtyByTile(entrance);
|
||||
}
|
||||
auto process_tile = [](TileIndex t) {
|
||||
if (IsTunnelBridgeSignalSimulationEntrance(t)) {
|
||||
if (IsBridge(t)) {
|
||||
SetAllBridgeEntranceSimulatedSignalsGreen(t);
|
||||
MarkBridgeDirty(t, ZOOM_LVL_DRAW_MAP);
|
||||
}
|
||||
if (IsTunnelBridgeSignalSimulationEntrance(t) && GetTunnelBridgeEntranceSignalState(t) == SIGNAL_STATE_RED) {
|
||||
SetTunnelBridgeEntranceSignalState(t, SIGNAL_STATE_GREEN);
|
||||
MarkTileDirtyByTile(t, ZOOM_LVL_DRAW_MAP);
|
||||
}
|
||||
}
|
||||
};
|
||||
process_tile(tile);
|
||||
process_tile(end);
|
||||
}
|
||||
}
|
||||
} else if (IsRailDepotTile(tile)) {
|
||||
@@ -4615,7 +4627,7 @@ static bool TrainCheckIfLineEnds(Train *v, bool reverse)
|
||||
if (IsLevelCrossingTile(tile)) MaybeBarCrossingWithSound(tile);
|
||||
|
||||
if (IsTileType(tile, MP_TUNNELBRIDGE) && GetTunnelBridgeTransportType(tile) == TRANSPORT_RAIL &&
|
||||
IsTunnelBridgeSignalSimulationEntrance(tile) && GetTunnelBridgeSignalState(tile) == SIGNAL_STATE_RED) {
|
||||
IsTunnelBridgeSignalSimulationEntrance(tile) && GetTunnelBridgeEntranceSignalState(tile) == SIGNAL_STATE_RED) {
|
||||
return TrainApproachingLineEnd(v, true, reverse);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user