diff --git a/jgrpp-changelog.md b/jgrpp-changelog.md index 7c639162ba..2fcfe6f64a 100644 --- a/jgrpp-changelog.md +++ b/jgrpp-changelog.md @@ -2,15 +2,14 @@ * * * +### v0.31.5 (2019-08-29) +* Fix multiplayer desync when when moving newly built wagon + ### v0.32-rc2 (2019-08-24) * Fix crash when using query tool on non-road bridges. * Fix road vehicles not being limited by the road type max speed. * Bump trunk base from commit a52bbb72a8a2cbcbefb0ff91b559f33c34094239 to commit dabccf70b4c02f68ebf51aca807376ca4f2a0e15. -### v0.32-rc1 (2019-07-13) -* Include NotRoadTypes (NRT). -* Bump trunk base from commit 21edf67f89c60351d5a0d84625455aa296b6b950 to commit a52bbb72a8a2cbcbefb0ff91b559f33c34094239. - ### v0.31.4 (2019-08-24) * Fix crash when removing signals from tunnel/bridge with trainless reservation. * Fix various cases where reversing a train inside a signalled tunnel/bridge handled PBS reservations incorrectly. @@ -20,6 +19,10 @@ * Change network protocol to send server/join and rcon passwords in hashed form instead of in clear text. * Fix various possible sources of non-determinism which could potentially cause multiplayer desyncs. +### v0.32-rc1 (2019-07-13) +* Include NotRoadTypes (NRT). +* Bump trunk base from commit 21edf67f89c60351d5a0d84625455aa296b6b950 to commit a52bbb72a8a2cbcbefb0ff91b559f33c34094239. + ### v0.31.3 (2019-07-13) * Fix the target order number of conditional order jumps being loaded incorrectly from SpringPP savegames. * Fix order backups not being restored when using buy and refit. diff --git a/projects/openttd_vs140.vcxproj b/projects/openttd_vs140.vcxproj index 08f4471954..c67ed2912c 100644 --- a/projects/openttd_vs140.vcxproj +++ b/projects/openttd_vs140.vcxproj @@ -492,6 +492,7 @@ + @@ -754,6 +755,7 @@ + diff --git a/projects/openttd_vs140.vcxproj.filters b/projects/openttd_vs140.vcxproj.filters index b9a5835109..8ba60609b1 100644 --- a/projects/openttd_vs140.vcxproj.filters +++ b/projects/openttd_vs140.vcxproj.filters @@ -570,6 +570,9 @@ Header Files + + Header Files + Header Files @@ -1356,6 +1359,9 @@ Core Source Code + + Core Source Code + Core Source Code diff --git a/projects/openttd_vs141.vcxproj b/projects/openttd_vs141.vcxproj index af77a7c6d9..5971ce9697 100644 --- a/projects/openttd_vs141.vcxproj +++ b/projects/openttd_vs141.vcxproj @@ -492,6 +492,7 @@ + @@ -754,6 +755,7 @@ + diff --git a/projects/openttd_vs141.vcxproj.filters b/projects/openttd_vs141.vcxproj.filters index b9a5835109..8ba60609b1 100644 --- a/projects/openttd_vs141.vcxproj.filters +++ b/projects/openttd_vs141.vcxproj.filters @@ -570,6 +570,9 @@ Header Files + + Header Files + Header Files @@ -1356,6 +1359,9 @@ Core Source Code + + Core Source Code + Core Source Code diff --git a/projects/openttd_vs142.vcxproj b/projects/openttd_vs142.vcxproj index 46fc1f7bd7..2a62df7011 100644 --- a/projects/openttd_vs142.vcxproj +++ b/projects/openttd_vs142.vcxproj @@ -492,6 +492,7 @@ + @@ -754,6 +755,7 @@ + diff --git a/projects/openttd_vs142.vcxproj.filters b/projects/openttd_vs142.vcxproj.filters index b9a5835109..8ba60609b1 100644 --- a/projects/openttd_vs142.vcxproj.filters +++ b/projects/openttd_vs142.vcxproj.filters @@ -570,6 +570,9 @@ Header Files + + Header Files + Header Files @@ -1356,6 +1359,9 @@ Core Source Code + + Core Source Code + Core Source Code diff --git a/source.list b/source.list index 6bf55ec306..feaf7f30bd 100644 --- a/source.list +++ b/source.list @@ -180,6 +180,7 @@ date_func.h date_gui.h date_type.h debug.h +debug_settings.h video/dedicated_v.h departures_func.h departures_gui.h diff --git a/src/crashlog.cpp b/src/crashlog.cpp index b95a26ab1c..02d349f5d3 100644 --- a/src/crashlog.cpp +++ b/src/crashlog.cpp @@ -227,6 +227,10 @@ char *CrashLog::LogConfiguration(char *buffer, const char *last) const buffer += seprintf(buffer, last, "Map size: 0x%X (%u x %u)%s\n\n", MapSize(), MapSizeX(), MapSizeY(), (!_m || !_me) ? ", NO MAP ALLOCATED" : ""); + if (_settings_game.debug.chicken_bits != 0) { + buffer += seprintf(buffer, last, "Chicken bits: 0x%08X\n\n", _settings_game.debug.chicken_bits); + } + buffer += seprintf(buffer, last, "AI Configuration (local: %i) (current: %i):\n", (int)_local_company, (int)_current_company); const Company *c; FOR_ALL_COMPANIES(c) { diff --git a/src/debug_settings.h b/src/debug_settings.h new file mode 100644 index 0000000000..4b197b4504 --- /dev/null +++ b/src/debug_settings.h @@ -0,0 +1,28 @@ +/* $Id$ */ + +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ + +/** @file debug_settings.h Debug settings. */ + +#ifndef DEBUG_SETTINGS_H +#define DEBUG_SETTINGS_H + +#include "settings_type.h" +#include "core/bitmath_func.hpp" + +enum ChickenBitFlags { + DCBF_VEH_TICK_CACHE = 0, + DCBF_MP_NO_STATE_CSUM_CHECK = 1, +}; + +inline bool HasChickenBit(ChickenBitFlags flag) +{ + return HasBit(_settings_game.debug.chicken_bits, flag); +} + +#endif /* DEBUG_SETTINGS_H */ diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 319f9c5277..31e1f26c68 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -34,6 +34,7 @@ #include "../crashlog.h" #include "../core/checksum_func.hpp" #include "../fileio_func.h" +#include "../debug_settings.h" #include "table/strings.h" @@ -302,9 +303,9 @@ void ClientNetworkGameSocketHandler::ClientError(NetworkRecvStatus res) if (_sync_frame != 0) { if (_sync_frame == _frame_counter) { #ifdef NETWORK_SEND_DOUBLE_SEED - if (_sync_seed_1 != _random.state[0] || _sync_seed_2 != _random.state[1] || _sync_state_checksum != _state_checksum.state) { + if (_sync_seed_1 != _random.state[0] || _sync_seed_2 != _random.state[1] || (_sync_state_checksum != _state_checksum.state && !HasChickenBit(DCBF_MP_NO_STATE_CSUM_CHECK))) { #else - if (_sync_seed_1 != _random.state[0] || _sync_state_checksum != _state_checksum.state) { + if (_sync_seed_1 != _random.state[0] || (_sync_state_checksum != _state_checksum.state && !HasChickenBit(DCBF_MP_NO_STATE_CSUM_CHECK))) { #endif DesyncExtraInfo info; if (_sync_seed_1 != _random.state[0]) info.flags |= DesyncExtraInfo::DEIF_RAND1; diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 86a533452e..05c0e03f2c 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -80,23 +80,13 @@ void ClearOrderDestinationRefcountMap() _order_destination_refcount_map_valid = false; } -static void UpdateOrderDestinationRefcount(const Order *order, VehicleType type, Owner owner, int delta) +void UpdateOrderDestinationRefcount(const Order *order, VehicleType type, Owner owner, int delta) { if (order->IsType(OT_GOTO_STATION) || order->IsType(OT_GOTO_WAYPOINT) || order->IsType(OT_IMPLICIT)) { _order_destination_refcount_map[OrderDestinationRefcountMapKey(order->GetDestination(), owner, order->GetType(), type)] += delta; } } -inline void RegisterOrderDestination(const Order *order, VehicleType type, Owner owner) -{ - if (_order_destination_refcount_map_valid) UpdateOrderDestinationRefcount(order, type, owner, 1); -} - -inline void UnregisterOrderDestination(const Order *order, VehicleType type, Owner owner) -{ - if (_order_destination_refcount_map_valid) UpdateOrderDestinationRefcount(order, type, owner, -1); -} - /** Clean everything up. */ Order::~Order() { diff --git a/src/order_cmd.h b/src/order_cmd.h index 5dc0f40784..aae22e1be6 100644 --- a/src/order_cmd.h +++ b/src/order_cmd.h @@ -16,6 +16,18 @@ #include "order_func.h" #include "vehicle_base.h" +void UpdateOrderDestinationRefcount(const Order *order, VehicleType type, Owner owner, int delta); + +inline void RegisterOrderDestination(const Order *order, VehicleType type, Owner owner) +{ + if (_order_destination_refcount_map_valid) UpdateOrderDestinationRefcount(order, type, owner, 1); +} + +inline void UnregisterOrderDestination(const Order *order, VehicleType type, Owner owner) +{ + if (_order_destination_refcount_map_valid) UpdateOrderDestinationRefcount(order, type, owner, -1); +} + /** * Removes all orders from a vehicle for which order_predicate returns true. * Handles timetable updating, removing implicit orders correctly, etc. @@ -41,6 +53,8 @@ restart: break; } + UnregisterOrderDestination(order, v->type, v->owner); + /* Clear wait time */ if (!order->IsType(OT_CONDITIONAL)) v->orders.list->UpdateTotalDuration(-order->GetWaitTime()); if (order->IsWaitTimetabled()) { diff --git a/src/settings_type.h b/src/settings_type.h index 5aff422722..fea9b1a007 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -643,6 +643,11 @@ struct CompanySettings { bool advance_order_on_clone; ///< when cloning a vehicle or copying/sharing an order list, advance the current order to a suitable point }; +/** Debug settings. */ +struct DebugSettings { + uint32 chicken_bits; ///< chicken bits +}; + /** All settings together for the game. */ struct GameSettings { DifficultySettings difficulty; ///< settings related to the difficulty @@ -659,6 +664,7 @@ struct GameSettings { LinkGraphSettings linkgraph; ///< settings for link graph calculations StationSettings station; ///< settings related to station management LocaleSettings locale; ///< settings related to used currency/unit system in the current game + DebugSettings debug; ///< debug settings }; /** All settings that are only important for the local client. */ diff --git a/src/table/settings.ini b/src/table/settings.ini index 87e96e251c..3e818613c3 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -5299,5 +5299,17 @@ cat = SC_EXPERT extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_VEHICLE_REPAIR_COST) patxname = ""vehicle_repair_cost.vehicle.repair_cost"" +[SDT_VAR] +base = GameSettings +var = debug.chicken_bits +type = SLE_UINT32 +flags = SLF_NOT_IN_CONFIG +guiflags = SGF_NO_NEWGAME +def = 0 +min = 0 +max = 0xFFFFFFFF +cat = SC_EXPERT +patxname = ""debug.chicken_bits"" + [SDT_END] diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 3a623312da..e80a27af0e 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -869,6 +869,8 @@ static CommandCost CmdBuildRailWagon(TileIndex tile, DoCommandFlag flags, const break; } } + + InvalidateVehicleTickCaches(); } return CommandCost(); diff --git a/src/vehicle.cpp b/src/vehicle.cpp index ea67c4513f..1aa760eeee 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -59,6 +59,7 @@ #include "tbtr_template_vehicle_func.h" #include "string_func.h" #include "scope_info.h" +#include "debug_settings.h" #include "3rdparty/cpp-btree/btree_set.h" #include "table/strings.h" @@ -1273,7 +1274,7 @@ void CallVehicleTicks() FOR_ALL_STATIONS(st) LoadUnloadStation(st); } - if (!_tick_caches_valid) RebuildVehicleTickCaches(); + if (!_tick_caches_valid || HasChickenBit(DCBF_VEH_TICK_CACHE)) RebuildVehicleTickCaches(); Vehicle *v = nullptr; SCOPE_INFO_FMT([&v], "CallVehicleTicks: %s", scope_dumper().VehicleInfo(v));