From 9efeb3551a739f0f24e2b3d6e3acf4047ce76d16 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sat, 21 Nov 2020 17:43:55 +0000 Subject: [PATCH] Tunnel/bridge signal simulation spacing is now a company setting --- src/saveload/afterload.cpp | 6 ++++++ src/saveload/extended_ver_sl.cpp | 2 +- src/settings_gui.cpp | 2 +- src/settings_type.h | 4 +++- src/table/company_settings.ini | 15 +++++++++++++++ src/table/settings.ini | 9 ++++----- src/train_cmd.cpp | 23 +++++++++++++---------- src/tunnelbridge.h | 1 + src/tunnelbridge_cmd.cpp | 17 ++++++++++++++--- 9 files changed, 58 insertions(+), 21 deletions(-) diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 44170a1d1e..86d30a98a3 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -3574,6 +3574,12 @@ bool AfterLoadGame() } } } + if (SlXvIsFeaturePresent(XSLFI_SIG_TUNNEL_BRIDGE, 1, 7)) { + /* spacing setting moved to company settings */ + for (Company *c : Company::Iterate()) { + c->settings.simulated_wormhole_signals = _settings_game.construction.old_simulated_wormhole_signals; + } + } if (SlXvIsFeatureMissing(XSLFI_CUSTOM_BRIDGE_HEADS)) { /* ensure that previously unused custom bridge-head bits are cleared */ diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index 1fc1632b89..d391e2b486 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -81,7 +81,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { { XSLFI_DEPARTURE_BOARDS, XSCF_IGNORABLE_UNKNOWN, 1, 1, "departure_boards", nullptr, nullptr, nullptr }, { XSLFI_TIMETABLES_START_TICKS, XSCF_NULL, 2, 2, "timetable_start_ticks", nullptr, nullptr, nullptr }, { XSLFI_TOWN_CARGO_ADJ, XSCF_IGNORABLE_UNKNOWN, 2, 2, "town_cargo_adj", nullptr, nullptr, nullptr }, - { XSLFI_SIG_TUNNEL_BRIDGE, XSCF_NULL, 7, 7, "signal_tunnel_bridge", nullptr, nullptr, "XBSS" }, + { XSLFI_SIG_TUNNEL_BRIDGE, XSCF_NULL, 8, 8, "signal_tunnel_bridge", nullptr, nullptr, "XBSS" }, { XSLFI_IMPROVED_BREAKDOWNS, XSCF_NULL, 6, 6, "improved_breakdowns", nullptr, nullptr, nullptr }, { XSLFI_CONSIST_BREAKDOWN_FLAG, XSCF_NULL, 1, 1, "consist_breakdown_flag", nullptr, nullptr, nullptr }, { XSLFI_TT_WAIT_IN_DEPOT, XSCF_NULL, 1, 1, "tt_wait_in_depot", nullptr, nullptr, nullptr }, diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index ceb5df8c05..deac11ea40 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -1649,7 +1649,6 @@ static SettingsContainer &GetSettingsTree() SettingsPage *construction = interface->Add(new SettingsPage(STR_CONFIG_SETTING_INTERFACE_CONSTRUCTION)); { construction->Add(new SettingEntry("gui.link_terraform_toolbar")); - construction->Add(new SettingEntry("construction.simulated_wormhole_signals")); construction->Add(new SettingEntry("gui.enable_signal_gui")); construction->Add(new SettingEntry("gui.persistent_buildingtools")); construction->Add(new SettingEntry("gui.quick_goto")); @@ -1792,6 +1791,7 @@ static SettingsContainer &GetSettingsTree() company->Add(new SettingEntry("company.infra_others_buy_in_depot[3]")); company->Add(new SettingEntry("company.advance_order_on_clone")); company->Add(new SettingEntry("company.copy_clone_add_to_group")); + company->Add(new SettingEntry("company.simulated_wormhole_signals")); } SettingsPage *accounting = main->Add(new SettingsPage(STR_CONFIG_SETTING_ACCOUNTING)); diff --git a/src/settings_type.h b/src/settings_type.h index cbe03281ab..7b067193e1 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -382,7 +382,6 @@ struct ConstructionSettings { bool trees_around_snow_line_enabled; ///< enable mixed and arctic forest around snowline, and no trees above snowline uint8 command_pause_level; ///< level/amount of commands that can't be executed while paused uint16 maximum_signal_evaluations; ///< maximum number of programmable pre-signals which may be evaluated in one pass - byte simulated_wormhole_signals; ///< simulate signals in tunnel bool enable_build_river; ///< enable building rivers in-game bool enable_remove_water; ///< enable removing sea and rivers in-game uint8 road_custom_bridge_heads; ///< allow construction of road custom bridge heads @@ -406,6 +405,8 @@ struct ConstructionSettings { uint32 build_object_per_64k_frames; ///< how many tiles may, over a long period, have objects built on them per 65536 frames? uint16 build_object_frame_burst; ///< how many tiles may, over a short period, have objects built on them? uint8 tree_growth_rate; ///< tree growth rate + + byte old_simulated_wormhole_signals; ///< moved to company settings: simulate signals in tunnel }; /** Settings related to the AI. */ @@ -662,6 +663,7 @@ struct CompanySettings { uint16 timetable_autofill_rounding; ///< round up timetable times to be a multiple of this number of ticks bool advance_order_on_clone; ///< when cloning a vehicle or copying/sharing an order list, advance the current order to a suitable point bool copy_clone_add_to_group; ///< whether to add cloned vehicles to the source vehicle's group, when cloning a vehicle without sharing orders + byte simulated_wormhole_signals; ///< tunnel/bridge signal simulation spacing }; /** Debug settings. */ diff --git a/src/table/company_settings.ini b/src/table/company_settings.ini index 51dcf71ab2..6a6ae6f00b 100644 --- a/src/table/company_settings.ini +++ b/src/table/company_settings.ini @@ -11,6 +11,7 @@ static bool UpdateIntervalTrains(int32 p1); static bool UpdateIntervalRoadVeh(int32 p1); static bool UpdateIntervalShips(int32 p1); static bool UpdateIntervalAircraft(int32 p1); +static bool SimulatedWormholeSignalsChanged(int32 p1); static const SettingDesc _company_settings[] = { [post-amble] @@ -255,6 +256,20 @@ str = STR_CONFIG_SETTING_COPY_CLONE_ADD_TO_GROUP strhelp = STR_CONFIG_SETTING_COPY_CLONE_ADD_TO_GROUP_HELPTEXT patxname = ""copy_clone_add_to_group"" +[SDT_VAR] +base = CompanySettings +var = simulated_wormhole_signals +type = SLE_UINT8 +guiflags = SGF_PER_COMPANY +def = 4 +min = 1 +max = 16 +str = STR_CONFIG_SETTING_SIMULATE_SIGNALS +strval = STR_CONFIG_SETTING_SIMULATE_SIGNALS_VALUE +proc = SimulatedWormholeSignalsChanged +cat = SC_ADVANCED +patxname = ""simulated_wormhole_signals"" + [SDT_END] diff --git a/src/table/settings.ini b/src/table/settings.ini index 89fe709a78..49ef37bfae 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -50,7 +50,6 @@ static bool MaxVehiclesChanged(int32 p1); static bool InvalidateShipPathCache(int32 p1); static bool ImprovedBreakdownsSettingChanged(int32 p1); static bool DayLengthChanged(int32 p1); -static bool SimulatedWormholeSignalsChanged(int32 p1); static bool EnableSingleVehSharedOrderGuiChanged(int32 p1); static bool CheckYapfRailSignalPenalties(int32 p1); static bool ViewportMapShowTunnelModeChanged(int32 p1); @@ -707,11 +706,11 @@ strval = STR_CONFIG_SETTING_TILE_LENGTH [SDT_XREF] extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 2) -xref = ""construction.simulated_wormhole_signals"" +xref = ""construction.old_simulated_wormhole_signals"" [SDT_XREF] extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP) -xref = ""construction.simulated_wormhole_signals"" +xref = ""construction.old_simulated_wormhole_signals"" [SDT_VAR] base = GameSettings @@ -758,7 +757,7 @@ patxname = ""chunnel.construction.chunnel"" [SDT_VAR] base = GameSettings -var = construction.simulated_wormhole_signals +var = construction.old_simulated_wormhole_signals type = SLE_UINT8 flags = 0 def = 2 @@ -766,8 +765,8 @@ min = 1 max = 16 str = STR_CONFIG_SETTING_SIMULATE_SIGNALS strval = STR_CONFIG_SETTING_SIMULATE_SIGNALS_VALUE -proc = SimulatedWormholeSignalsChanged cat = SC_BASIC +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SIG_TUNNEL_BRIDGE, 1, 7) patxname = ""signal_tunnel_bridge.construction.simulated_wormhole_signals"" [SDT_XREF] diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index c65bb1ffee..7b5ac1eedb 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -2742,7 +2742,7 @@ static void HandleLastTunnelBridgeSignals(TileIndex tile, TileIndex end, DiagDir /* Clearing last bridge signal. */ int signal_offset = GetAndClearLastBridgeEntranceSetSignalIndex(end); if (signal_offset) { - TileIndex last_signal_tile = end + (TileOffsByDiagDir(dir) * _settings_game.construction.simulated_wormhole_signals * signal_offset); + TileIndex last_signal_tile = end + (TileOffsByDiagDir(dir) * GetTunnelBridgeSignalSimulationSpacing(tile) * signal_offset); MarkTileDirtyByTile(last_signal_tile, VMDF_NOT_MAP_MODE); } MarkTileDirtyByTile(tile, VMDF_NOT_MAP_MODE); @@ -3973,16 +3973,18 @@ static bool CheckTrainStayInWormHole(Train *t, TileIndex tile) static void HandleSignalBehindTrain(Train *v, int signal_number) { + const uint simulated_wormhole_signals = GetTunnelBridgeSignalSimulationSpacing(v->tile); + TileIndex tile; switch (v->direction) { default: NOT_REACHED(); - case DIR_NE: tile = TileVirtXY(v->x_pos + (TILE_SIZE * _settings_game.construction.simulated_wormhole_signals), v->y_pos); break; - case DIR_SE: tile = TileVirtXY(v->x_pos, v->y_pos - (TILE_SIZE * _settings_game.construction.simulated_wormhole_signals) ); break; - case DIR_SW: tile = TileVirtXY(v->x_pos - (TILE_SIZE * _settings_game.construction.simulated_wormhole_signals), v->y_pos); break; - case DIR_NW: tile = TileVirtXY(v->x_pos, v->y_pos + (TILE_SIZE * _settings_game.construction.simulated_wormhole_signals)); break; + case DIR_NE: tile = TileVirtXY(v->x_pos + (TILE_SIZE * simulated_wormhole_signals), v->y_pos); break; + case DIR_SE: tile = TileVirtXY(v->x_pos, v->y_pos - (TILE_SIZE * simulated_wormhole_signals) ); break; + case DIR_SW: tile = TileVirtXY(v->x_pos - (TILE_SIZE * simulated_wormhole_signals), v->y_pos); break; + case DIR_NW: tile = TileVirtXY(v->x_pos, v->y_pos + (TILE_SIZE * simulated_wormhole_signals)); break; } - if(tile == v->tile) { + if (tile == v->tile) { /* Flip signal on ramp. */ if (IsTunnelBridgeSignalSimulationEntrance(tile) && GetTunnelBridgeEntranceSignalState(tile) == SIGNAL_STATE_RED) { SetTunnelBridgeEntranceSignalState(tile, SIGNAL_STATE_GREEN); @@ -4343,16 +4345,17 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse) /* Handle signal simulation on tunnel/bridge. */ TileIndex old_tile = TileVirtXY(v->x_pos, v->y_pos); if (old_tile != gp.new_tile && IsTunnelBridgeWithSignalSimulation(v->tile) && (v->IsFrontEngine() || v->Next() == nullptr)) { + const uint simulated_wormhole_signals = GetTunnelBridgeSignalSimulationSpacing(v->tile); if (old_tile == v->tile) { if (v->IsFrontEngine() && v->force_proceed == 0 && IsTunnelBridgeSignalSimulationExitOnly(v->tile)) goto invalid_rail; /* Entered wormhole set counters. */ - v->wait_counter = (TILE_SIZE * _settings_game.construction.simulated_wormhole_signals) - TILE_SIZE; + v->wait_counter = (TILE_SIZE * simulated_wormhole_signals) - TILE_SIZE; v->tunnel_bridge_signal_num = 0; } uint distance = v->wait_counter; bool leaving = false; - if (distance == 0) v->wait_counter = (TILE_SIZE * _settings_game.construction.simulated_wormhole_signals); + if (distance == 0) v->wait_counter = (TILE_SIZE * simulated_wormhole_signals); if (v->IsFrontEngine()) { /* Check if track in front is free and see if we can leave wormhole. */ @@ -4378,7 +4381,7 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse) } } if (v->Next() == nullptr) { - if (v->tunnel_bridge_signal_num > 0 && distance == (TILE_SIZE * _settings_game.construction.simulated_wormhole_signals) - TILE_SIZE) HandleSignalBehindTrain(v, v->tunnel_bridge_signal_num - 2); + if (v->tunnel_bridge_signal_num > 0 && distance == (TILE_SIZE * simulated_wormhole_signals) - TILE_SIZE) HandleSignalBehindTrain(v, v->tunnel_bridge_signal_num - 2); DiagDirection tunnel_bridge_dir = GetTunnelBridgeDirection(v->tile); Axis axis = DiagDirToAxis(tunnel_bridge_dir); DiagDirection axial_dir = DirToDiagDirAlongAxis(v->direction, axis); @@ -4421,7 +4424,7 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse) TrainApproachingLineEnd(v, true, false); } } else if (v->wait_counter == 0) { - if (IsTooCloseBehindTrain(v, next_tile, TILE_SIZE * _settings_game.construction.simulated_wormhole_signals, true)) { + if (IsTooCloseBehindTrain(v, next_tile, TILE_SIZE * GetTunnelBridgeSignalSimulationSpacing(v->tile), true)) { TrainApproachingLineEnd(v, true, false); } } diff --git a/src/tunnelbridge.h b/src/tunnelbridge.h index b9ddf24592..92036aef70 100644 --- a/src/tunnelbridge.h +++ b/src/tunnelbridge.h @@ -13,6 +13,7 @@ #include "map_func.h" #include "tile_map.h" +uint GetTunnelBridgeSignalSimulationSpacing(TileIndex tile); uint GetTunnelBridgeSignalSimulationSignalCount(TileIndex begin, TileIndex end); /** diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 51b78548ef..4916689b11 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -127,6 +127,16 @@ void MarkBridgeOrTunnelDirtyOnReservationChange(TileIndex tile, ViewportMarkDirt } } +uint GetTunnelBridgeSignalSimulationSpacing(TileIndex tile) +{ + Owner owner = GetTileOwner(tile); + if (Company::IsValidID(owner)) { + return Company::Get(owner)->settings.simulated_wormhole_signals; + } else { + return 4; + } +} + /** * Get number of signals on bridge or tunnel with signal simulation. * @param begin The begin of the tunnel or bridge. @@ -135,7 +145,7 @@ void MarkBridgeOrTunnelDirtyOnReservationChange(TileIndex tile, ViewportMarkDirt */ uint GetTunnelBridgeSignalSimulationSignalCount(TileIndex begin, TileIndex end) { - uint result = 2 + (GetTunnelBridgeLength(begin, end) / _settings_game.construction.simulated_wormhole_signals); + uint result = 2 + (GetTunnelBridgeLength(begin, end) / GetTunnelBridgeSignalSimulationSpacing(begin)); if (IsTunnelBridgeSignalSimulationBidirectional(begin)) result *= 2; return result; } @@ -1657,10 +1667,11 @@ static void DrawBridgeSignalOnMiddlePart(const TileInfo *ti, TileIndex bridge_st uint bridge_signal_position = 0; int m2_position = 0; - uint bridge_section = GetTunnelBridgeLength(ti->tile, bridge_start_tile) + 1; + const uint bridge_section = GetTunnelBridgeLength(ti->tile, bridge_start_tile) + 1; + const uint simulated_wormhole_signals = GetTunnelBridgeSignalSimulationSpacing(bridge_start_tile); while (bridge_signal_position <= bridge_section) { - bridge_signal_position += _settings_game.construction.simulated_wormhole_signals; + bridge_signal_position += simulated_wormhole_signals; if (bridge_signal_position == bridge_section) { bool side = (_settings_game.vehicle.road_side != 0) && _settings_game.construction.train_signal_side;