From d76283590380ededb95138fc9c39505f48c62f27 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Mon, 30 Jan 2017 21:37:17 +0000 Subject: [PATCH] Signals on tunnel/bridges are now added to infrastructure stats. --- src/rail_cmd.cpp | 6 ++++++ src/saveload/company_sl.cpp | 7 ++++++- src/settings.cpp | 8 ++++++++ src/table/settings.ini | 3 ++- src/tunnelbridge.h | 12 ++++++++++++ src/tunnelbridge_cmd.cpp | 26 +++++++++++++++++++++++++- 6 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index 81f5b4318f..4d97ee8ca9 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -1097,6 +1097,8 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1, } } if (flags & DC_EXEC) { + Company * const c = Company::Get(GetTileOwner(tile)); + if (IsTunnelBridgeWithSignalSimulation(tile)) c->infrastructure.signal -= GetTunnelBridgeSignalSimulationSignalCount(tile, tile_exit); if (p2 == 0 && IsTunnelBridgeWithSignalSimulation(tile)) { // Toggle signal if already signals present. if (convert_signal) { if (flip_variant) { @@ -1149,6 +1151,8 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1, AddSideToSignalBuffer(tile_exit, INVALID_DIAGDIR, GetTileOwner(tile)); YapfNotifyTrackLayoutChange(tile, track); YapfNotifyTrackLayoutChange(tile_exit, track); + if (IsTunnelBridgeWithSignalSimulation(tile)) c->infrastructure.signal += GetTunnelBridgeSignalSimulationSignalCount(tile, tile_exit); + DirtyCompanyInfrastructureWindows(GetTileOwner(tile)); } return cost; } @@ -1600,6 +1604,7 @@ CommandCost CmdRemoveSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1 if (IsTunnelBridgeWithSignalSimulation(tile)) { // handle tunnel/bridge signals. TileIndex end = GetOtherTunnelBridgeEnd(tile); + Company::Get(GetTileOwner(tile))->infrastructure.signal -= GetTunnelBridgeSignalSimulationSignalCount(tile, end); ClearBridgeTunnelSignalSimulation(end, tile); ClearBridgeTunnelSignalSimulation(tile, end); MarkBridgeOrTunnelDirty(tile); @@ -1607,6 +1612,7 @@ CommandCost CmdRemoveSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1 AddSideToSignalBuffer(end, INVALID_DIAGDIR, GetTileOwner(tile)); YapfNotifyTrackLayoutChange(tile, track); YapfNotifyTrackLayoutChange(end, track); + DirtyCompanyInfrastructureWindows(GetTileOwner(tile)); return CommandCost(EXPENSES_CONSTRUCTION, cost); } diff --git a/src/saveload/company_sl.cpp b/src/saveload/company_sl.cpp index 27c069fe08..0e1b6db325 100644 --- a/src/saveload/company_sl.cpp +++ b/src/saveload/company_sl.cpp @@ -205,7 +205,12 @@ void AfterLoadCompanyStats() switch (GetTunnelBridgeTransportType(tile)) { case TRANSPORT_RAIL: c = Company::GetIfValid(GetTileOwner(tile)); - if (c != NULL) c->infrastructure.rail[GetRailType(tile)] += len; + if (c != NULL) { + c->infrastructure.rail[GetRailType(tile)] += len; + if (IsTunnelBridgeWithSignalSimulation(tile)) { + c->infrastructure.signal += GetTunnelBridgeSignalSimulationSignalCount(tile, other_end); + } + } break; case TRANSPORT_ROAD: { diff --git a/src/settings.cpp b/src/settings.cpp index 39fba94cc6..85a8d7ccb8 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -1148,6 +1148,14 @@ static bool InvalidateCompanyWindow(int32 p1) return true; } +static bool SimulatedWormholeSignalsChanged(int32 p1) +{ + extern void AfterLoadCompanyStats(); + AfterLoadCompanyStats(); + MarkWholeScreenDirty(); + return true; +} + /** Checks if any settings are set to incorrect values, and sets them to correct values in that case. */ static void ValidateSettings() { diff --git a/src/table/settings.ini b/src/table/settings.ini index b2a054d652..1529cabaac 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -42,6 +42,7 @@ static bool InvalidateCompanyInfrastructureWindow(int32 p1); static bool InvalidateCompanyWindow(int32 p1); static bool ZoomMinMaxChanged(int32 p1); static bool MaxVehiclesChanged(int32 p1); +static bool SimulatedWormholeSignalsChanged(int32 p1); #ifdef ENABLE_NETWORK static bool UpdateClientName(int32 p1); @@ -553,7 +554,7 @@ min = 1 max = 16 str = STR_CONFIG_SETTING_SIMULATE_SIGNALS strval = STR_CONFIG_SETTING_SIMULATE_SIGNALS_VALUE -proc = RedrawScreen +proc = SimulatedWormholeSignalsChanged from = 0 cat = SC_BASIC patxname = ""signal_tunnel_bridge.construction.simulated_wormhole_signals"" diff --git a/src/tunnelbridge.h b/src/tunnelbridge.h index 03de071e9d..96134272c0 100644 --- a/src/tunnelbridge.h +++ b/src/tunnelbridge.h @@ -17,6 +17,7 @@ void MarkBridgeDirty(TileIndex begin, TileIndex end, DiagDirection direction, uint bridge_height); void MarkBridgeDirty(TileIndex tile); void MarkBridgeOrTunnelDirty(TileIndex tile); +uint GetTunnelBridgeSignalSimulationSignalCount(uint length); /** * Calculates the length of a tunnel or a bridge (without end tiles) @@ -34,6 +35,17 @@ static inline uint GetTunnelBridgeLength(TileIndex begin, TileIndex end) return abs(x2 + y2 - x1 - y1) - 1; } +/** + * Get number of signals on bridge or tunnel with signal simulation. + * @param begin The begin of the tunnel or bridge. + * @param end The end of the tunnel or bridge. + * @pre IsTunnelBridgeWithSignalSimulation(begin) + */ +static inline uint GetTunnelBridgeSignalSimulationSignalCount(TileIndex begin, TileIndex end) +{ + return GetTunnelBridgeSignalSimulationSignalCount(GetTunnelBridgeLength(begin, end)); +} + extern TileIndex _build_tunnel_endtile; #endif /* TUNNELBRIDGE_H */ diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index fbb34f0dee..2620fe6572 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -95,6 +95,16 @@ void MarkBridgeOrTunnelDirty(TileIndex tile) } } +/** + * Get number of signals on bridge or tunnel with signal simulation. + * @param length Length of bridge/tunnel middle + * @return Number of signals on signalled bridge/tunnel of this length + */ +uint GetTunnelBridgeSignalSimulationSignalCount(uint length) +{ + return 2 + (length / _settings_game.construction.simulated_wormhole_signals); +} + /** Reset the data been eventually changed by the grf loaded. */ void ResetBridges() { @@ -854,6 +864,9 @@ static CommandCost DoClearTunnel(TileIndex tile, DoCommandFlag flags) if (Company::IsValidID(owner)) { Company::Get(owner)->infrastructure.rail[GetRailType(tile)] -= len * TUNNELBRIDGE_TRACKBIT_FACTOR; + if (IsTunnelBridgeWithSignalSimulation(tile)) { // handle tunnel/bridge signals. + Company::Get(GetTileOwner(tile))->infrastructure.signal -= GetTunnelBridgeSignalSimulationSignalCount(tile, endtile); + } DirtyCompanyInfrastructureWindows(owner); } @@ -939,7 +952,12 @@ static CommandCost DoClearBridge(TileIndex tile, DoCommandFlag flags) /* Update company infrastructure counts. */ if (rail) { - if (Company::IsValidID(owner)) Company::Get(owner)->infrastructure.rail[GetRailType(tile)] -= len * TUNNELBRIDGE_TRACKBIT_FACTOR; + if (Company::IsValidID(owner)) { + Company::Get(owner)->infrastructure.rail[GetRailType(tile)] -= len * TUNNELBRIDGE_TRACKBIT_FACTOR; + if (IsTunnelBridgeWithSignalSimulation(tile)) { // handle tunnel/bridge signals. + Company::Get(GetTileOwner(tile))->infrastructure.signal -= GetTunnelBridgeSignalSimulationSignalCount(tile, endtile); + } + } } else if (GetTunnelBridgeTransportType(tile) == TRANSPORT_ROAD) { RoadType rt; FOR_EACH_SET_ROADTYPE(rt, GetRoadTypes(tile)) { @@ -1860,6 +1878,12 @@ static void ChangeTileOwner_TunnelBridge(TileIndex tile, Owner old_owner, Owner if (new_owner != INVALID_OWNER) Company::Get(new_owner)->infrastructure.water += num_pieces; } + if (IsTunnelBridgeWithSignalSimulation(tile) && IsTunnelBridgeSignalSimulationEntrance(tile)) { + uint num_sigs = GetTunnelBridgeSignalSimulationSignalCount(tile, other_end); + Company::Get(old_owner)->infrastructure.signal -= num_sigs; + Company::Get(new_owner)->infrastructure.signal += num_sigs; + } + if (new_owner != INVALID_OWNER) { SetTileOwner(tile, new_owner); } else {