summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfrosch <frosch@openttd.org>2014-09-07 14:21:16 +0000
committerfrosch <frosch@openttd.org>2014-09-07 14:21:16 +0000
commite2f5081f40706c389473639165c3cb95b72a4d1b (patch)
treed1d889cf27ab2e7737feb024d9a6e5057c1a30b5
parent9b72a9f6b804fd3bad86e156fea53776eef4b480 (diff)
downloadopenttd-e2f5081f40706c389473639165c3cb95b72a4d1b.tar.xz
(svn r26788) -Add: Desync replay option to skip/replay failed commands
-rw-r--r--docs/desync.txt6
-rw-r--r--src/network/network.cpp10
-rw-r--r--src/network/network_func.h1
3 files changed, 16 insertions, 1 deletions
diff --git a/docs/desync.txt b/docs/desync.txt
index fb53b62ae..b0b6bd7d4 100644
--- a/docs/desync.txt
+++ b/docs/desync.txt
@@ -194,6 +194,7 @@ Table of contents
- Get the same version of OpenTTD as the original server was running.
- Uncomment/enable the define 'DEBUG_DUMP_COMMANDS' in
'src/network/network_func.h'.
+ (DEBUG_FAILED_DUMP_COMMANDS is explained later)
- Put the 'commands-out.log' into the root save folder, and rename
it to 'commands.log'.
- Run 'openttd -D -d desync=3 -g startsavegame.sav'.
@@ -217,6 +218,11 @@ Table of contents
the last dmp_cmds that reproduces the replay and the first one
that fails.
+ If the replay does not succeed without mismatch, you can check the logs
+ whether there were failed commands. Then you may try to replay with
+ DEBUG_FAILED_DUMP_COMMANDS enabled. If the replay then fails, the
+ command test-run of the failed command modified the game state.
+
If you have the original 'dmp_cmds_*.sav', you can also compare those
savegames with your own ones from the replay. You can also comment/disable
the 'NOT_REACHED' mentioned above, to get another 'dmp_cmds_*.sav' from
diff --git a/src/network/network.cpp b/src/network/network.cpp
index d9645a595..ce37aaa3f 100644
--- a/src/network/network.cpp
+++ b/src/network/network.cpp
@@ -929,7 +929,11 @@ void NetworkGameLoop()
p += 2;
}
- if (strncmp(p, "cmd: ", 5) == 0 || strncmp(p, "cmdf: ", 6) == 0) {
+ if (strncmp(p, "cmd: ", 5) == 0
+#ifdef DEBUG_FAILED_DUMP_COMMANDS
+ || strncmp(p, "cmdf: ", 6) == 0
+#endif
+ ) {
p += 5;
if (*p == ' ') p++;
cp = CallocT<CommandPacket>(1);
@@ -958,6 +962,10 @@ void NetworkGameLoop()
} else if (strncmp(p, "msg: ", 5) == 0 || strncmp(p, "client: ", 8) == 0 ||
strncmp(p, "load: ", 6) == 0 || strncmp(p, "save: ", 6) == 0) {
/* A message that is not very important to the log playback, but part of the log. */
+#ifndef DEBUG_FAILED_DUMP_COMMANDS
+ } else if (strncmp(p, "cmdf: ", 6) == 0) {
+ DEBUG(net, 0, "Skipping replay of failed command: %s", p + 6);
+#endif
} else {
/* Can't parse a line; what's wrong here? */
DEBUG(net, 0, "trying to parse: %s", p);
diff --git a/src/network/network_func.h b/src/network/network_func.h
index 67d4c8d48..375cc3da5 100644
--- a/src/network/network_func.h
+++ b/src/network/network_func.h
@@ -17,6 +17,7 @@
* See docs/desync.txt for details.
*/
// #define DEBUG_DUMP_COMMANDS
+// #define DEBUG_FAILED_DUMP_COMMANDS
#include "core/address.h"
#include "network_type.h"