From def3a3933baecf911a0000d12383a397b50e89e4 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Mon, 26 Mar 2018 18:40:05 +0100 Subject: [PATCH] Move dual-use of load_unload_ticks for bridge/tun signals to new field --- src/saveload/afterload.cpp | 11 +++++++++++ src/saveload/extended_ver_sl.cpp | 2 +- src/saveload/vehicle_sl.cpp | 1 + src/train.h | 2 ++ src/train_cmd.cpp | 12 ++++++------ 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 76f0d2ec6e..8080e9f27c 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -2994,6 +2994,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; + } + } + } /* Station acceptance is some kind of cache */ if (IsSavegameVersionBefore(127)) { diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index 6475840b42..40779a3b3e 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -45,7 +45,7 @@ std::vector _sl_xv_discardable_chunk_ids; ///< list of chunks static const uint32 _sl_xv_slxi_chunk_version = 0; ///< current version os SLXI chunk const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { - { 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_NULL, XSCF_NULL, 0, 0, NULL, NULL, NULL, NULL },// This is the end marker }; diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index 86ca590e4d..181b8f54e0 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -720,6 +720,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 82e33b67d9..d991d00e93 100644 --- a/src/train.h +++ b/src/train.h @@ -102,6 +102,8 @@ struct Train FINAL : public GroundVehicle { /** Ticks waiting in front of a signal, ticks being stuck or a counter for forced proceeding through signals. */ uint16 wait_counter; + uint16 tunnel_bridge_signal_num; + /** We don't want GCC to zero our struct! It already is zeroed and has an index! */ Train() : GroundVehicleBase() {} /** We want to 'destruct' the right class. */ diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 99ee2ae38b..1887d3a160 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -1881,7 +1881,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; } @@ -3603,7 +3603,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; @@ -3628,13 +3628,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; @@ -3643,13 +3643,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();