Fix infra signal total when moving signalled tunnel/bridge to other company

When signal spacing setting differs
This commit is contained in:
Jonathan G Rennison
2021-06-12 23:41:32 +01:00
parent ad0e085ec7
commit 384e8cca89
3 changed files with 13 additions and 10 deletions

View File

@@ -1461,7 +1461,7 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1,
Company * const c = Company::Get(GetTileOwner(tile)); Company * const c = Company::Get(GetTileOwner(tile));
std::vector<Train *> re_reserve_trains; std::vector<Train *> re_reserve_trains;
if (IsTunnelBridgeWithSignalSimulation(tile)) { if (IsTunnelBridgeWithSignalSimulation(tile)) {
c->infrastructure.signal -= GetTunnelBridgeSignalSimulationSignalCount(tile, tile_exit); c->infrastructure.signal -= GetTunnelBridgeSignalSimulationSignalCount(c, tile, tile_exit);
} else { } else {
for (TileIndex t : { tile, tile_exit }) { for (TileIndex t : { tile, tile_exit }) {
if (HasAcrossTunnelBridgeReservation(t)) { if (HasAcrossTunnelBridgeReservation(t)) {
@@ -1536,7 +1536,7 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1,
AddSideToSignalBuffer(tile_exit, INVALID_DIAGDIR, GetTileOwner(tile)); AddSideToSignalBuffer(tile_exit, INVALID_DIAGDIR, GetTileOwner(tile));
YapfNotifyTrackLayoutChange(tile, track); YapfNotifyTrackLayoutChange(tile, track);
YapfNotifyTrackLayoutChange(tile_exit, track); YapfNotifyTrackLayoutChange(tile_exit, track);
if (IsTunnelBridgeWithSignalSimulation(tile)) c->infrastructure.signal += GetTunnelBridgeSignalSimulationSignalCount(tile, tile_exit); if (IsTunnelBridgeWithSignalSimulation(tile)) c->infrastructure.signal += GetTunnelBridgeSignalSimulationSignalCount(c, tile, tile_exit);
DirtyCompanyInfrastructureWindows(GetTileOwner(tile)); DirtyCompanyInfrastructureWindows(GetTileOwner(tile));
for (Train *re_reserve_train : re_reserve_trains) { for (Train *re_reserve_train : re_reserve_trains) {
ReReserveTrainPath(re_reserve_train); ReReserveTrainPath(re_reserve_train);
@@ -2028,7 +2028,8 @@ CommandCost CmdRemoveSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1
} }
} }
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
Company::Get(GetTileOwner(tile))->infrastructure.signal -= GetTunnelBridgeSignalSimulationSignalCount(tile, end); Company *c = Company::Get(GetTileOwner(tile));
c->infrastructure.signal -= GetTunnelBridgeSignalSimulationSignalCount(c, tile, end);
ClearBridgeTunnelSignalSimulation(end, tile); ClearBridgeTunnelSignalSimulation(end, tile);
ClearBridgeTunnelSignalSimulation(tile, end); ClearBridgeTunnelSignalSimulation(tile, end);
MarkBridgeOrTunnelDirty(tile); MarkBridgeOrTunnelDirty(tile);

View File

@@ -14,7 +14,7 @@
#include "tile_map.h" #include "tile_map.h"
uint GetTunnelBridgeSignalSimulationSpacing(TileIndex tile); uint GetTunnelBridgeSignalSimulationSpacing(TileIndex tile);
uint GetTunnelBridgeSignalSimulationSignalCount(TileIndex begin, TileIndex end); uint GetTunnelBridgeSignalSimulationSignalCount(Company *c, TileIndex begin, TileIndex end);
/** /**
* Calculates the length of a tunnel or a bridge (without end tiles) * Calculates the length of a tunnel or a bridge (without end tiles)

View File

@@ -143,13 +143,14 @@ uint GetTunnelBridgeSignalSimulationSpacing(TileIndex tile)
/** /**
* Get number of signals on bridge or tunnel with signal simulation. * Get number of signals on bridge or tunnel with signal simulation.
* @param c Company to use.
* @param begin The begin of the tunnel or bridge. * @param begin The begin of the tunnel or bridge.
* @param end The end of the tunnel or bridge. * @param end The end of the tunnel or bridge.
* @pre IsTunnelBridgeWithSignalSimulation(begin) * @pre IsTunnelBridgeWithSignalSimulation(begin)
*/ */
uint GetTunnelBridgeSignalSimulationSignalCount(TileIndex begin, TileIndex end) uint GetTunnelBridgeSignalSimulationSignalCount(Company *c, TileIndex begin, TileIndex end)
{ {
uint result = 2 + (GetTunnelBridgeLength(begin, end) / GetTunnelBridgeSignalSimulationSpacing(begin)); uint result = 2 + (GetTunnelBridgeLength(begin, end) / c->settings.simulated_wormhole_signals);
if (IsTunnelBridgeSignalSimulationBidirectional(begin)) result *= 2; if (IsTunnelBridgeSignalSimulationBidirectional(begin)) result *= 2;
return result; return result;
} }
@@ -1246,9 +1247,10 @@ static CommandCost DoClearTunnel(TileIndex tile, DoCommandFlag flags)
check_tile(endtile); check_tile(endtile);
if (Company::IsValidID(owner)) { if (Company::IsValidID(owner)) {
Company::Get(owner)->infrastructure.rail[GetRailType(tile)] -= len * TUNNELBRIDGE_TRACKBIT_FACTOR; Company *c = Company::Get(owner);
c->infrastructure.rail[GetRailType(tile)] -= len * TUNNELBRIDGE_TRACKBIT_FACTOR;
if (IsTunnelBridgeWithSignalSimulation(tile)) { // handle tunnel/bridge signals. if (IsTunnelBridgeWithSignalSimulation(tile)) { // handle tunnel/bridge signals.
Company::Get(GetTileOwner(tile))->infrastructure.signal -= GetTunnelBridgeSignalSimulationSignalCount(tile, endtile); c->infrastructure.signal -= GetTunnelBridgeSignalSimulationSignalCount(c, tile, endtile);
} }
DirtyCompanyInfrastructureWindows(owner); DirtyCompanyInfrastructureWindows(owner);
} }
@@ -2691,9 +2693,9 @@ static void UpdateRailTunnelBridgeInfrastructure(Company *c, TileIndex begin, Ti
if (IsTunnelBridgeWithSignalSimulation(begin)) { if (IsTunnelBridgeWithSignalSimulation(begin)) {
if (add) { if (add) {
c->infrastructure.signal += GetTunnelBridgeSignalSimulationSignalCount(begin, end); c->infrastructure.signal += GetTunnelBridgeSignalSimulationSignalCount(c, begin, end);
} else { } else {
c->infrastructure.signal -= GetTunnelBridgeSignalSimulationSignalCount(begin, end); c->infrastructure.signal -= GetTunnelBridgeSignalSimulationSignalCount(c, begin, end);
} }
} }
} }