Fix infra signal total when moving signalled tunnel/bridge to other company
When signal spacing setting differs
This commit is contained in:
@@ -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);
|
||||||
|
@@ -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)
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user