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:
@@ -1045,7 +1045,7 @@ static void ClearBridgeTunnelSignalSimulation(TileIndex entrance, TileIndex exit
|
||||
static void SetupBridgeTunnelSignalSimulation(TileIndex entrance, TileIndex exit)
|
||||
{
|
||||
SetTunnelBridgeSignalSimulationEntrance(entrance);
|
||||
SetTunnelBridgeSignalState(entrance, SIGNAL_STATE_GREEN);
|
||||
SetTunnelBridgeEntranceSignalState(entrance, SIGNAL_STATE_GREEN);
|
||||
SetTunnelBridgeSignalSimulationExit(exit);
|
||||
}
|
||||
|
||||
@@ -1064,6 +1064,7 @@ static void SetupBridgeTunnelSignalSimulation(TileIndex entrance, TileIndex exit
|
||||
* - p1 = (bit 9-14)- cycle through which signal set?
|
||||
* - p1 = (bit 15-16)-cycle the signal direction this many times
|
||||
* - p1 = (bit 17) - 1 = don't modify an existing signal but don't fail either, 0 = always set new signal type
|
||||
* - p1 = (bit 18) - permit creation of/conversion to bidirectionally signalled bridges/tunnels
|
||||
* @param p2 used for CmdBuildManySignals() to copy direction of first signal
|
||||
* @param text unused
|
||||
* @return the cost of this operation or an error
|
||||
@@ -1099,22 +1100,47 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1,
|
||||
CommandCost cost;
|
||||
/* handle signals simulation on tunnel/bridge. */
|
||||
if (IsTileType(tile, MP_TUNNELBRIDGE)) {
|
||||
bool bidirectional = HasBit(p1, 18) && (sigtype == SIGTYPE_PBS);
|
||||
TileIndex tile_exit = GetOtherTunnelBridgeEnd(tile);
|
||||
cost = CommandCost();
|
||||
bool flip_variant = false;
|
||||
bool is_pbs = (sigtype == SIGTYPE_PBS) || (sigtype == SIGTYPE_PBS_ONEWAY);
|
||||
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
|
||||
if (p2 != 12) cost = CommandCost(EXPENSES_CONSTRUCTION, _price[PR_BUILD_SIGNALS] * ((GetTunnelBridgeLength(tile, tile_exit) + 4) >> 2) * (bidirectional ? 2 : 1)); // minimal 1
|
||||
} else {
|
||||
if (HasBit(p1, 17)) return CommandCost();
|
||||
bool is_bidi = IsTunnelBridgeSignalSimulationBidirectional(tile);
|
||||
bool will_be_bidi = is_bidi;
|
||||
if (p2 == 0) {
|
||||
if (convert_signal) {
|
||||
will_be_bidi = bidirectional && !ctrl_pressed;
|
||||
} else if (ctrl_pressed) {
|
||||
will_be_bidi = false;
|
||||
}
|
||||
} else if (!is_pbs) {
|
||||
will_be_bidi = false;
|
||||
}
|
||||
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]) *
|
||||
cost = CommandCost(EXPENSES_CONSTRUCTION, ((_price[PR_BUILD_SIGNALS] * (will_be_bidi ? 2 : 1)) + (_price[PR_CLEAR_SIGNALS] * (is_bidi ? 2 : 1))) *
|
||||
((GetTunnelBridgeLength(tile, tile_exit) + 4) >> 2)); // minimal 1
|
||||
} else if (is_bidi != will_be_bidi) {
|
||||
cost = CommandCost(EXPENSES_CONSTRUCTION, _price[will_be_bidi ? PR_BUILD_SIGNALS : PR_CLEAR_SIGNALS] * ((GetTunnelBridgeLength(tile, tile_exit) + 4) >> 2)); // minimal 1
|
||||
}
|
||||
}
|
||||
auto remove_pbs_bidi = [&]() {
|
||||
if (IsTunnelBridgeSignalSimulationBidirectional(tile)) {
|
||||
ClrTunnelBridgeSignalSimulationExit(tile);
|
||||
ClrTunnelBridgeSignalSimulationEntrance(tile_exit);
|
||||
}
|
||||
};
|
||||
auto set_bidi = [&](TileIndex t) {
|
||||
SetTunnelBridgeSignalSimulationEntrance(t);
|
||||
SetTunnelBridgeEntranceSignalState(t, SIGNAL_STATE_GREEN);
|
||||
SetTunnelBridgeSignalSimulationExit(t);
|
||||
};
|
||||
if (flags & DC_EXEC) {
|
||||
Company * const c = Company::Get(GetTileOwner(tile));
|
||||
if (IsTunnelBridgeWithSignalSimulation(tile)) c->infrastructure.signal -= GetTunnelBridgeSignalSimulationSignalCount(tile, tile_exit);
|
||||
@@ -1127,11 +1153,18 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1,
|
||||
if (!ctrl_pressed) {
|
||||
SetTunnelBridgePBS(tile, is_pbs);
|
||||
SetTunnelBridgePBS(tile_exit, is_pbs);
|
||||
if (bidirectional) {
|
||||
set_bidi(tile);
|
||||
set_bidi(tile_exit);
|
||||
} else {
|
||||
remove_pbs_bidi();
|
||||
}
|
||||
}
|
||||
} else if (ctrl_pressed) {
|
||||
SetTunnelBridgePBS(tile, !IsTunnelBridgePBS(tile));
|
||||
SetTunnelBridgePBS(tile_exit, IsTunnelBridgePBS(tile));
|
||||
} else {
|
||||
if (!IsTunnelBridgePBS(tile)) remove_pbs_bidi();
|
||||
} else if (!IsTunnelBridgeSignalSimulationBidirectional(tile)) {
|
||||
if (IsTunnelBridgeSignalSimulationEntrance(tile)) {
|
||||
ClearBridgeTunnelSignalSimulation(tile, tile_exit);
|
||||
SetupBridgeTunnelSignalSimulation(tile_exit, tile);
|
||||
@@ -1143,7 +1176,12 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1,
|
||||
} else {
|
||||
/* Create one direction tunnel/bridge if required. */
|
||||
if (p2 == 0) {
|
||||
SetupBridgeTunnelSignalSimulation(tile, tile_exit);
|
||||
if (bidirectional) {
|
||||
set_bidi(tile);
|
||||
set_bidi(tile_exit);
|
||||
} else {
|
||||
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. */
|
||||
@@ -1161,10 +1199,11 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1,
|
||||
SetTunnelBridgeSemaphore(tile_exit, sigvar == SIG_SEMAPHORE);
|
||||
SetTunnelBridgePBS(tile, is_pbs);
|
||||
SetTunnelBridgePBS(tile_exit, is_pbs);
|
||||
if (!IsTunnelBridgePBS(tile)) remove_pbs_bidi();
|
||||
}
|
||||
}
|
||||
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);
|
||||
if (IsTunnelBridgeSignalSimulationExit(tile) && IsTunnelBridgePBS(tile) && !HasTunnelBridgeReservation(tile)) SetTunnelBridgeExitSignalState(tile, SIGNAL_STATE_RED);
|
||||
if (IsTunnelBridgeSignalSimulationExit(tile_exit) && IsTunnelBridgePBS(tile_exit) && !HasTunnelBridgeReservation(tile_exit)) SetTunnelBridgeExitSignalState(tile_exit, SIGNAL_STATE_RED);
|
||||
MarkBridgeOrTunnelDirty(tile);
|
||||
AddSideToSignalBuffer(tile, INVALID_DIAGDIR, GetTileOwner(tile));
|
||||
AddSideToSignalBuffer(tile_exit, INVALID_DIAGDIR, GetTileOwner(tile));
|
||||
@@ -1604,6 +1643,7 @@ CommandCost CmdRemoveSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1
|
||||
if (!IsTunnelBridgeWithSignalSimulation(tile)) return_cmd_error(STR_ERROR_THERE_ARE_NO_SIGNALS);
|
||||
|
||||
cost *= ((GetTunnelBridgeLength(tile, end) + 4) >> 2);
|
||||
if (IsTunnelBridgeSignalSimulationBidirectional(tile)) cost *= 2;
|
||||
|
||||
CommandCost ret = EnsureNoTrainOnTrack(GetOtherTunnelBridgeEnd(tile), track);
|
||||
if (ret.Failed()) return ret;
|
||||
|
Reference in New Issue
Block a user