diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index 4bfa85b882..7a2f8e33d6 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -1464,6 +1464,7 @@ static void ReReserveTrainPath(Train *v) * - 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 * - p1 = (bit 19-22)-signal style + * - p1 = (bit 23-27)-signal spacing * @param p2 used for CmdBuildManySignals() to copy direction of first signal * @param text unused * @return the cost of this operation or an error @@ -1511,6 +1512,10 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1, CommandCost cost; /* handle signals simulation on tunnel/bridge. */ if (IsTileType(tile, MP_TUNNELBRIDGE)) { + int signal_spacing = GB(p1, 23, 5); + if (signal_spacing == 0) return_cmd_error(STR_ERROR_THERE_IS_NO_RAILROAD_TRACK); + signal_spacing = Clamp(signal_spacing, 1, 16); + TileIndex tile_exit = GetOtherTunnelBridgeEnd(tile); if (TracksOverlap(GetTunnelBridgeTrackBits(tile)) || TracksOverlap(GetTunnelBridgeTrackBits(tile_exit))) return_cmd_error(STR_ERROR_NO_SUITABLE_RAILROAD_TRACK); bool bidirectional = HasBit(p1, 18) && (sigtype == SIGTYPE_PBS); @@ -1597,7 +1602,7 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1, if (IsTunnelBridgeWithSignalSimulation(tile)) { c->infrastructure.signal -= GetTunnelBridgeSignalSimulationSignalCount(tile, tile_exit); } else { - uint spacing = GetBestTunnelBridgeSignalSimulationSpacing(GetTileOwner(tile), tile, tile_exit); + uint spacing = GetBestTunnelBridgeSignalSimulationSpacing(tile, tile_exit, signal_spacing); SetTunnelBridgeSignalSimulationSpacing(tile, spacing); SetTunnelBridgeSignalSimulationSpacing(tile_exit, spacing); for (TileIndex t : { tile, tile_exit }) { @@ -2035,6 +2040,7 @@ static CommandCost CmdSignalTrackHelper(TileIndex tile, DoCommandFlag flags, uin SB(param1, 5, 3, sigtype); SB(param1, 19, 4, signal_style); if (!remove && signal_ctr == 0) SetBit(param1, 17); + if (!remove) SB(param1, 23, 5, Clamp(GB(p2, 24, 8), 1, 16)); /* Pick the correct orientation for the track direction */ signals = 0; diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 078fb0e663..8a25bd3ffd 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -306,6 +306,7 @@ static void GenericPlaceSignals(TileIndex tile) SB(p1, 9, 6, cycle_types); } SB(p1, 18, 1, _settings_client.gui.adv_sig_bridge_tun_modes); + SB(p1, 23, 5, Clamp(_settings_client.gui.drag_signals_density, 1, 16)); DoCommandP(tile, p1, 0, CMD_BUILD_SIGNALS | CMD_MSG((w != nullptr && _convert_signal_button) ? STR_ERROR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE : STR_ERROR_CAN_T_BUILD_SIGNALS_HERE), diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index a98bec1cbd..811ef94404 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -3652,7 +3652,7 @@ 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; + c->settings.old_simulated_wormhole_signals = _settings_game.construction.old_simulated_wormhole_signals; } } if (SlXvIsFeaturePresent(XSLFI_SIG_TUNNEL_BRIDGE, 1, 8)) { @@ -3662,7 +3662,14 @@ bool AfterLoadGame() DiagDirection dir = GetTunnelBridgeDirection(t); if (dir == DIAGDIR_NE || dir == DIAGDIR_SE) { TileIndex other = GetOtherTunnelBridgeEnd(t); - uint spacing = GetBestTunnelBridgeSignalSimulationSpacing(GetTileOwner(t), t, other); + Owner owner = GetTileOwner(t); + int target; + if (Company::IsValidID(owner)) { + target = Company::Get(owner)->settings.old_simulated_wormhole_signals; + } else { + target = 4; + } + uint spacing = GetBestTunnelBridgeSignalSimulationSpacing(t, other, target); SetTunnelBridgeSignalSimulationSpacing(t, spacing); SetTunnelBridgeSignalSimulationSpacing(other, spacing); } diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index 5961ba8be6..11d2f276d3 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -89,7 +89,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, 9, 9, "signal_tunnel_bridge", nullptr, nullptr, "XBSS" }, + { XSLFI_SIG_TUNNEL_BRIDGE, XSCF_NULL, 10, 10, "signal_tunnel_bridge", nullptr, nullptr, "XBSS" }, { XSLFI_IMPROVED_BREAKDOWNS, XSCF_NULL, 8, 8, "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 a837105a1e..e9e7f9615f 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -1993,7 +1993,6 @@ 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 0c6d26c495..c997f3336b 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -753,7 +753,8 @@ 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 + + byte old_simulated_wormhole_signals; ///< no longer needs a setting: tunnel/bridge signal simulation spacing }; /** Debug settings. */ diff --git a/src/table/settings/company_settings.ini b/src/table/settings/company_settings.ini index 7502d985b6..0b118b96d9 100644 --- a/src/table/settings/company_settings.ini +++ b/src/table/settings/company_settings.ini @@ -255,7 +255,7 @@ patxname = ""copy_clone_add_to_group"" [SDT_VAR] base = CompanySettings -var = simulated_wormhole_signals +var = old_simulated_wormhole_signals type = SLE_UINT8 flags = SF_PER_COMPANY def = 4 @@ -265,4 +265,5 @@ str = STR_CONFIG_SETTING_SIMULATE_SIGNALS strhelp = STR_CONFIG_SETTING_SIMULATE_SIGNALS_HELPTEXT strval = STR_CONFIG_SETTING_SIMULATE_SIGNALS_VALUE cat = SC_ADVANCED +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SIG_TUNNEL_BRIDGE, 1, 9) patxname = ""simulated_wormhole_signals"" diff --git a/src/tunnelbridge.h b/src/tunnelbridge.h index fd8d8e1f3b..4f42231eb7 100644 --- a/src/tunnelbridge.h +++ b/src/tunnelbridge.h @@ -13,8 +13,7 @@ #include "map_func.h" #include "tile_map.h" -uint GetTunnelBridgeSignalSimulationSpacingTarget(Owner owner); -uint GetBestTunnelBridgeSignalSimulationSpacing(Owner owner, TileIndex begin, TileIndex end); +uint GetBestTunnelBridgeSignalSimulationSpacing(TileIndex begin, TileIndex end, int target); uint GetTunnelBridgeSignalSimulationSignalCount(TileIndex begin, TileIndex end); void MarkTunnelBridgeSignalDirty(TileIndex tile, bool exit); diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 143d39dc35..71489dcdc3 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -134,18 +134,8 @@ void MarkBridgeOrTunnelDirtyOnReservationChange(TileIndex tile, ViewportMarkDirt } } -uint GetTunnelBridgeSignalSimulationSpacingTarget(Owner owner) +uint GetBestTunnelBridgeSignalSimulationSpacing(TileIndex begin, TileIndex end, int target) { - if (Company::IsValidID(owner)) { - return Company::Get(owner)->settings.simulated_wormhole_signals; - } else { - return 4; - } -} - -uint GetBestTunnelBridgeSignalSimulationSpacing(Owner owner, TileIndex begin, TileIndex end) -{ - int target = GetTunnelBridgeSignalSimulationSpacingTarget(owner); if (target <= 2) return target; int length = GetTunnelBridgeLength(begin, end); if (target > length || ((length + 1) % target) == 0) return target;