Merge branch 'signal_tunnels_bridges' into jgrpp
# Conflicts: # projects/openttd_vs100.vcxproj # projects/openttd_vs100.vcxproj.filters # projects/openttd_vs140.vcxproj # projects/openttd_vs140.vcxproj.filters # projects/openttd_vs80.vcproj # projects/openttd_vs90.vcproj # source.list # src/misc.cpp # src/openttd.cpp # src/pbs.cpp # src/saveload/extended_ver_sl.cpp # src/saveload/saveload.cpp # src/signal.cpp # src/train_cmd.cpp # src/tunnelbridge_map.h
This commit is contained in:
@@ -21,6 +21,7 @@
|
||||
#include "autoslope.h"
|
||||
#include "water.h"
|
||||
#include "tunnelbridge_map.h"
|
||||
#include "bridge_signal_map.h"
|
||||
#include "vehicle_func.h"
|
||||
#include "sound_func.h"
|
||||
#include "tunnelbridge.h"
|
||||
@@ -42,6 +43,8 @@
|
||||
#include "table/railtypes.h"
|
||||
#include "table/track_land.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "safeguards.h"
|
||||
|
||||
/** Helper type for lists/vectors of trains */
|
||||
@@ -1023,6 +1026,20 @@ CommandCost CmdBuildTrainDepot(TileIndex tile, DoCommandFlag flags, uint32 p1, u
|
||||
return cost;
|
||||
}
|
||||
|
||||
static void ClearBridgeTunnelSignalSimulation(TileIndex entrance, TileIndex exit)
|
||||
{
|
||||
if (IsBridge(entrance)) ClearBridgeEntranceSimulatedSignals(entrance);
|
||||
ClrTunnelBridgeSignalSimulationEntrance(entrance);
|
||||
ClrTunnelBridgeSignalSimulationExit(exit);
|
||||
}
|
||||
|
||||
static void SetupBridgeTunnelSignalSimulation(TileIndex entrance, TileIndex exit)
|
||||
{
|
||||
SetTunnelBridgeSignalSimulationEntrance(entrance);
|
||||
SetTunnelBridgeSignalState(entrance, SIGNAL_STATE_GREEN);
|
||||
SetTunnelBridgeSignalSimulationExit(exit);
|
||||
}
|
||||
|
||||
/**
|
||||
* Build signals, alternate between double/single, signal/semaphore,
|
||||
* pre/exit/combo-signals, and what-else not. If the rail piece does not
|
||||
@@ -1077,7 +1094,7 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1,
|
||||
cost = CommandCost();
|
||||
bool flip_variant = false;
|
||||
bool is_pbs = (sigtype == SIGTYPE_PBS) || (sigtype == SIGTYPE_PBS_ONEWAY);
|
||||
if (!HasWormholeSignals(tile)) { // toggle signal zero costs.
|
||||
if (!IsTunnelBridgeWithSignalSimulation(tile)) { // toggle signal zero costs.
|
||||
if (convert_signal) return_cmd_error(STR_ERROR_THERE_ARE_NO_SIGNALS);
|
||||
if (p2 != 12) cost = CommandCost(EXPENSES_CONSTRUCTION, _price[PR_BUILD_SIGNALS] * ((GetTunnelBridgeLength(tile, tile_exit) + 4) >> 2)); // minimal 1
|
||||
} else {
|
||||
@@ -1090,7 +1107,7 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1,
|
||||
}
|
||||
}
|
||||
if (flags & DC_EXEC) {
|
||||
if (p2 == 0 && HasWormholeSignals(tile)) { // Toggle signal if already signals present.
|
||||
if (p2 == 0 && IsTunnelBridgeWithSignalSimulation(tile)) { // Toggle signal if already signals present.
|
||||
if (convert_signal) {
|
||||
if (flip_variant) {
|
||||
SetTunnelBridgeSemaphore(tile, !IsTunnelBridgeSemaphore(tile));
|
||||
@@ -1104,37 +1121,28 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1,
|
||||
SetTunnelBridgePBS(tile, !IsTunnelBridgePBS(tile));
|
||||
SetTunnelBridgePBS(tile_exit, IsTunnelBridgePBS(tile));
|
||||
} else {
|
||||
if (IsTunnelBridgeEntrance(tile)) {
|
||||
ClrBitTunnelBridgeSignal(tile);
|
||||
ClrBitTunnelBridgeExit(tile_exit);
|
||||
SetBitTunnelBridgeExit(tile);
|
||||
SetBitTunnelBridgeSignal(tile_exit);
|
||||
if (IsTunnelBridgeSignalSimulationEntrance(tile)) {
|
||||
ClearBridgeTunnelSignalSimulation(tile, tile_exit);
|
||||
SetupBridgeTunnelSignalSimulation(tile_exit, tile);
|
||||
} else {
|
||||
ClrBitTunnelBridgeSignal(tile_exit);
|
||||
ClrBitTunnelBridgeExit(tile);
|
||||
SetBitTunnelBridgeExit(tile_exit);
|
||||
SetBitTunnelBridgeSignal(tile);
|
||||
ClearBridgeTunnelSignalSimulation(tile_exit, tile);
|
||||
SetupBridgeTunnelSignalSimulation(tile, tile_exit);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* Create one direction tunnel/bridge if required. */
|
||||
if (p2 == 0) {
|
||||
SetBitTunnelBridgeSignal(tile);
|
||||
SetBitTunnelBridgeExit(tile_exit);
|
||||
SetupBridgeTunnelSignalSimulation(tile, tile_exit);
|
||||
} else if (p2 == 4 || p2 == 8) {
|
||||
DiagDirection tbdir = GetTunnelBridgeDirection(tile);
|
||||
/* If signal only on one side build accoringly one-way tunnel/bridge. */
|
||||
if ((p2 == 8 && (tbdir == DIAGDIR_NE || tbdir == DIAGDIR_SE)) ||
|
||||
(p2 == 4 && (tbdir == DIAGDIR_SW || tbdir == DIAGDIR_NW))) {
|
||||
ClrBitTunnelBridgeExit(tile);
|
||||
ClrBitTunnelBridgeSignal(tile_exit);
|
||||
SetBitTunnelBridgeSignal(tile);
|
||||
SetBitTunnelBridgeExit(tile_exit);
|
||||
ClearBridgeTunnelSignalSimulation(tile_exit, tile);
|
||||
SetupBridgeTunnelSignalSimulation(tile, tile_exit);
|
||||
} else {
|
||||
ClrBitTunnelBridgeSignal(tile);
|
||||
ClrBitTunnelBridgeExit(tile_exit);
|
||||
SetBitTunnelBridgeSignal(tile_exit);
|
||||
SetBitTunnelBridgeExit(tile);
|
||||
ClearBridgeTunnelSignalSimulation(tile, tile_exit);
|
||||
SetupBridgeTunnelSignalSimulation(tile_exit, tile);
|
||||
}
|
||||
}
|
||||
if (p2 == 0 || p2 == 4 || p2 == 8) {
|
||||
@@ -1144,8 +1152,8 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1,
|
||||
SetTunnelBridgePBS(tile_exit, is_pbs);
|
||||
}
|
||||
}
|
||||
if (IsTunnelBridgeExit(tile) && IsTunnelBridgePBS(tile) && !HasTunnelBridgeReservation(tile)) SetTunnelBridgeExitGreen(tile, false);
|
||||
if (IsTunnelBridgeExit(tile_exit) && IsTunnelBridgePBS(tile_exit) && !HasTunnelBridgeReservation(tile_exit)) SetTunnelBridgeExitGreen(tile_exit, false);
|
||||
if (IsTunnelBridgeSignalSimulationExit(tile) && IsTunnelBridgePBS(tile) && !HasTunnelBridgeReservation(tile)) SetTunnelBridgeSignalState(tile, SIGNAL_STATE_RED);
|
||||
if (IsTunnelBridgeSignalSimulationExit(tile_exit) && IsTunnelBridgePBS(tile_exit) && !HasTunnelBridgeReservation(tile_exit)) SetTunnelBridgeSignalState(tile_exit, SIGNAL_STATE_RED);
|
||||
MarkBridgeOrTunnelDirty(tile);
|
||||
AddSideToSignalBuffer(tile, INVALID_DIAGDIR, GetTileOwner(tile));
|
||||
AddSideToSignalBuffer(tile_exit, INVALID_DIAGDIR, GetTileOwner(tile));
|
||||
@@ -1329,7 +1337,7 @@ static bool CheckSignalAutoFill(TileIndex &tile, Trackdir &trackdir, int &signal
|
||||
return true;
|
||||
|
||||
case MP_TUNNELBRIDGE: {
|
||||
if (!remove && HasWormholeSignals(tile)) return false;
|
||||
if (!remove && IsTunnelBridgeWithSignalSimulation(tile)) return false;
|
||||
TileIndex orig_tile = tile; // backup old value
|
||||
|
||||
if (GetTunnelBridgeTransportType(tile) != TRANSPORT_RAIL) return false;
|
||||
@@ -1580,7 +1588,7 @@ CommandCost CmdRemoveSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1
|
||||
if (IsTileType(tile, MP_TUNNELBRIDGE)) {
|
||||
TileIndex end = GetOtherTunnelBridgeEnd(tile);
|
||||
if (GetTunnelBridgeTransportType(tile) != TRANSPORT_RAIL) return_cmd_error(STR_ERROR_THERE_IS_NO_RAILROAD_TRACK);
|
||||
if (!HasWormholeSignals(tile)) return_cmd_error(STR_ERROR_THERE_ARE_NO_SIGNALS);
|
||||
if (!IsTunnelBridgeWithSignalSimulation(tile)) return_cmd_error(STR_ERROR_THERE_ARE_NO_SIGNALS);
|
||||
|
||||
cost *= ((GetTunnelBridgeLength(tile, end) + 4) >> 2);
|
||||
|
||||
@@ -1608,14 +1616,10 @@ CommandCost CmdRemoveSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1
|
||||
/* Do it? */
|
||||
if (flags & DC_EXEC) {
|
||||
|
||||
if (HasWormholeSignals(tile)) { // handle tunnel/bridge signals.
|
||||
if (IsTunnelBridgeWithSignalSimulation(tile)) { // handle tunnel/bridge signals.
|
||||
TileIndex end = GetOtherTunnelBridgeEnd(tile);
|
||||
ClrBitTunnelBridgeExit(tile);
|
||||
ClrBitTunnelBridgeExit(end);
|
||||
ClrBitTunnelBridgeSignal(tile);
|
||||
ClrBitTunnelBridgeSignal(end);
|
||||
_m[tile].m2 = 0;
|
||||
_m[end].m2 = 0;
|
||||
ClearBridgeTunnelSignalSimulation(end, tile);
|
||||
ClearBridgeTunnelSignalSimulation(tile, end);
|
||||
MarkBridgeOrTunnelDirty(tile);
|
||||
AddSideToSignalBuffer(tile, INVALID_DIAGDIR, GetTileOwner(tile));
|
||||
AddSideToSignalBuffer(end, INVALID_DIAGDIR, GetTileOwner(tile));
|
||||
|
Reference in New Issue
Block a user