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));