diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 4e88aa8180..6ae6a4c0fa 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -3348,6 +3348,17 @@ bool AfterLoadGame() } } } + if (SlXvIsFeaturePresent(XSLFI_SIG_TUNNEL_BRIDGE, 1, 4)) { + /* load_unload_ticks --> tunnel_bridge_signal_num */ + Train *t; + FOR_ALL_TRAINS(t) { + TileIndex tile = t->tile; + if (IsTileType(tile, MP_TUNNELBRIDGE) && GetTunnelBridgeTransportType(tile) == TRANSPORT_RAIL && IsTunnelBridgeWithSignalSimulation(tile)) { + t->tunnel_bridge_signal_num = t->load_unload_ticks; + t->load_unload_ticks = 0; + } + } + } 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 ce14306d39..1b6e1c6940 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -55,7 +55,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { { XSLFI_DEPARTURE_BOARDS, XSCF_IGNORABLE_UNKNOWN, 1, 1, "departure_boards", NULL, NULL, NULL }, { XSLFI_TIMETABLES_START_TICKS, XSCF_NULL, 2, 2, "timetable_start_ticks", NULL, NULL, NULL }, { XSLFI_TOWN_CARGO_ADJ, XSCF_IGNORABLE_UNKNOWN, 2, 2, "town_cargo_adj", NULL, NULL, NULL }, - { XSLFI_SIG_TUNNEL_BRIDGE, XSCF_NULL, 4, 4, "signal_tunnel_bridge", NULL, NULL, "XBSS" }, + { XSLFI_SIG_TUNNEL_BRIDGE, XSCF_NULL, 5, 5, "signal_tunnel_bridge", NULL, NULL, "XBSS" }, { XSLFI_IMPROVED_BREAKDOWNS, XSCF_NULL, 6, 6, "improved_breakdowns", NULL, NULL, NULL }, { XSLFI_TT_WAIT_IN_DEPOT, XSCF_NULL, 1, 1, "tt_wait_in_depot", NULL, NULL, NULL }, { XSLFI_AUTO_TIMETABLE, XSCF_NULL, 4, 4, "auto_timetables", NULL, NULL, NULL }, diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index 51779ca317..ebd2d77abb 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -749,6 +749,7 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLE_CONDNULL(2, 2, 59), SLE_CONDVAR(Train, wait_counter, SLE_UINT16, 136, SL_MAX_VERSION), + SLE_CONDVAR_X(Train, tunnel_bridge_signal_num, SLE_UINT16, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SIG_TUNNEL_BRIDGE, 5)), SLE_CONDNULL(2, 2, 19), SLE_CONDVAR(Train, gv_flags, SLE_UINT16, 139, SL_MAX_VERSION), diff --git a/src/train.h b/src/train.h index 5de070a0ce..bd9522bfde 100644 --- a/src/train.h +++ b/src/train.h @@ -117,6 +117,7 @@ struct Train FINAL : public GroundVehicle { uint16 wait_counter; uint16 reverse_distance; + uint16 tunnel_bridge_signal_num; /** We don't want GCC to zero our struct! It already is zeroed and has an index! */ Train() : GroundVehicleBase() {} diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 70416c9dce..7705bd9c2d 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -2065,7 +2065,7 @@ void ReverseTrainDirection(Train *v) MarkTileDirtyByTile(v->tile); /* Clear counters. */ v->wait_counter = 0; - v->load_unload_ticks = 0; + v->tunnel_bridge_signal_num = 0; return; } @@ -3927,7 +3927,7 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse) if (v->IsFrontEngine() && v->force_proceed == 0 && IsTunnelBridgeSignalSimulationExit(v->tile)) goto invalid_rail; /* Entered wormhole set counters. */ v->wait_counter = (TILE_SIZE * _settings_game.construction.simulated_wormhole_signals) - TILE_SIZE; - v->load_unload_ticks = 0; + v->tunnel_bridge_signal_num = 0; } uint distance = v->wait_counter; @@ -3952,13 +3952,13 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse) } /* flip signal in front to red on bridges*/ if (distance == 0 && IsBridge(v->tile)) { - SetBridgeEntranceSimulatedSignalState(v->tile, v->load_unload_ticks, SIGNAL_STATE_RED); + SetBridgeEntranceSimulatedSignalState(v->tile, v->tunnel_bridge_signal_num, SIGNAL_STATE_RED); MarkTileDirtyByTile(gp.new_tile); } } } if (v->Next() == NULL) { - if (v->load_unload_ticks > 0 && distance == (TILE_SIZE * _settings_game.construction.simulated_wormhole_signals) - TILE_SIZE) HandleSignalBehindTrain(v, v->load_unload_ticks - 2); + 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 (old_tile == v->tile) { /* We left ramp into wormhole. */ v->x_pos = gp.x; @@ -3967,13 +3967,13 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse) UnreserveBridgeTunnelTile(old_tile); } } - if (distance == 0) v->load_unload_ticks++; + if (distance == 0) v->tunnel_bridge_signal_num++; v->wait_counter -= TILE_SIZE; if (leaving) { // Reset counters. v->force_proceed = 0; v->wait_counter = 0; - v->load_unload_ticks = 0; + v->tunnel_bridge_signal_num = 0; v->x_pos = gp.x; v->y_pos = gp.y; v->UpdatePosition();