Merge branch 'signal_tunnels_bridges-sx' into jgrpp

# Conflicts:
#	src/saveload/afterload.cpp
#	src/saveload/extended_ver_sl.cpp
#	src/signal.cpp
#	src/train_cmd.cpp
This commit is contained in:
Jonathan G Rennison
2016-02-21 12:16:11 +00:00
12 changed files with 243 additions and 35 deletions

View File

@@ -1058,21 +1058,46 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1,
if (IsTileType(tile, MP_TUNNELBRIDGE)) {
TileIndex tile_exit = GetOtherTunnelBridgeEnd(tile);
cost = CommandCost();
bool flip_variant = false;
bool is_pbs = (sigtype == SIGTYPE_PBS) || (sigtype == SIGTYPE_PBS_ONEWAY);
if (!HasWormholeSignals(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 {
if (HasBit(p1, 17)) return CommandCost();
if ((p2 != 0 && (sigvar == SIG_SEMAPHORE) != IsTunnelBridgeSemaphore(tile)) ||
(convert_signal && (ctrl_pressed || (sigvar == SIG_SEMAPHORE) != IsTunnelBridgeSemaphore(tile)))) {
flip_variant = true;
cost = CommandCost(EXPENSES_CONSTRUCTION, (_price[PR_BUILD_SIGNALS] + _price[PR_CLEAR_SIGNALS]) *
((GetTunnelBridgeLength(tile, tile_exit) + 4) >> 2)); // minimal 1
}
}
if (flags & DC_EXEC) {
if (p2 == 0 && HasWormholeSignals(tile)) { // Toggle signal if already signals present.
if (IsTunnelBridgeEntrance(tile)) {
ClrBitTunnelBridgeSignal(tile);
ClrBitTunnelBridgeExit(tile_exit);
SetBitTunnelBridgeExit(tile);
SetBitTunnelBridgeSignal(tile_exit);
if (convert_signal) {
if (flip_variant) {
SetTunnelBridgeSemaphore(tile, !IsTunnelBridgeSemaphore(tile));
SetTunnelBridgeSemaphore(tile_exit, IsTunnelBridgeSemaphore(tile));
}
if (!ctrl_pressed) {
SetTunnelBridgePBS(tile, is_pbs);
SetTunnelBridgePBS(tile_exit, is_pbs);
}
} else if (ctrl_pressed) {
SetTunnelBridgePBS(tile, !IsTunnelBridgePBS(tile));
SetTunnelBridgePBS(tile_exit, IsTunnelBridgePBS(tile));
} else {
ClrBitTunnelBridgeSignal(tile_exit);
ClrBitTunnelBridgeExit(tile);
SetBitTunnelBridgeExit(tile_exit);
SetBitTunnelBridgeSignal(tile);
if (IsTunnelBridgeEntrance(tile)) {
ClrBitTunnelBridgeSignal(tile);
ClrBitTunnelBridgeExit(tile_exit);
SetBitTunnelBridgeExit(tile);
SetBitTunnelBridgeSignal(tile_exit);
} else {
ClrBitTunnelBridgeSignal(tile_exit);
ClrBitTunnelBridgeExit(tile);
SetBitTunnelBridgeExit(tile_exit);
SetBitTunnelBridgeSignal(tile);
}
}
} else {
/* Create one direction tunnel/bridge if required. */
@@ -1084,14 +1109,24 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1,
/* 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);
} else {
ClrBitTunnelBridgeSignal(tile);
ClrBitTunnelBridgeExit(tile_exit);
SetBitTunnelBridgeSignal(tile_exit);
SetBitTunnelBridgeExit(tile);
}
}
SetTunnelBridgeSemaphore(tile, sigvar == SIG_SEMAPHORE);
SetTunnelBridgeSemaphore(tile_exit, sigvar == SIG_SEMAPHORE);
SetTunnelBridgePBS(tile, is_pbs);
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);
MarkBridgeOrTunnelDirty(tile);
AddSideToSignalBuffer(tile, INVALID_DIAGDIR, GetTileOwner(tile));
AddSideToSignalBuffer(tile_exit, INVALID_DIAGDIR, GetTileOwner(tile));