Tunnel/bridge signal simulation spacing is now a company setting
This commit is contained in:
@@ -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 */
|
||||
|
@@ -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 },
|
||||
|
@@ -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));
|
||||
|
@@ -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. */
|
||||
|
@@ -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]
|
||||
|
||||
|
||||
|
@@ -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]
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -13,6 +13,7 @@
|
||||
#include "map_func.h"
|
||||
#include "tile_map.h"
|
||||
|
||||
uint GetTunnelBridgeSignalSimulationSpacing(TileIndex tile);
|
||||
uint GetTunnelBridgeSignalSimulationSignalCount(TileIndex begin, TileIndex end);
|
||||
|
||||
/**
|
||||
|
@@ -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;
|
||||
|
||||
|
Reference in New Issue
Block a user