summaryrefslogtreecommitdiff
path: root/src/network/network.cpp
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2010-04-13 17:36:19 +0000
committerrubidium <rubidium@openttd.org>2010-04-13 17:36:19 +0000
commit23190b895265c4b01c4a2397c60dea7bd9039d1b (patch)
tree67469d2857d7ab0d68c66446860fc69a1b92c7dc /src/network/network.cpp
parentb76f0185d4064a4c44c6030976213dffe4493873 (diff)
downloadopenttd-23190b895265c4b01c4a2397c60dea7bd9039d1b.tar.xz
(svn r19617) -Fix [desync debug]: log the sync state only once per day, not multiple times when paused with _date_fract = 0
-Change [desync debug]: check the sync state from the command stream and make sure no unknown input is encountered
Diffstat (limited to 'src/network/network.cpp')
-rw-r--r--src/network/network.cpp48
1 files changed, 39 insertions, 9 deletions
diff --git a/src/network/network.cpp b/src/network/network.cpp
index 68eeeb509..669de71dc 100644
--- a/src/network/network.cpp
+++ b/src/network/network.cpp
@@ -1078,7 +1078,14 @@ void NetworkGameLoop()
if (_network_server) {
/* Log the sync state to check for in-syncedness of replays. */
- if (_date_fract == 0) DEBUG(desync, 1, "sync: %08x; %02x; %08x; %08x", _date, _date_fract, _random.state[0], _random.state[1]);
+ if (_date_fract == 0) {
+ /* We don't want to log multiple times if paused. */
+ static Date last_log;
+ if (last_log != _date) {
+ DEBUG(desync, 1, "sync: %08x; %02x; %08x; %08x", _date, _date_fract, _random.state[0], _random.state[1]);
+ last_log = _date;
+ }
+ }
#ifdef DEBUG_DUMP_COMMANDS
/* Loading of the debug commands from -ddesync>=1 */
@@ -1086,22 +1093,34 @@ void NetworkGameLoop()
static Date next_date = 0;
static uint32 next_date_fract;
static CommandPacket *cp = NULL;
+ static bool check_sync_state = false;
+ static uint32 sync_state[2];
if (f == NULL && next_date == 0) {
DEBUG(net, 0, "Cannot open commands.log");
next_date = 1;
}
while (f != NULL && !feof(f)) {
- if (cp != NULL && _date == next_date && _date_fract == next_date_fract) {
- _current_company = cp->company;
- bool ret = DoCommandP(cp->tile, cp->p1, cp->p2, cp->cmd, NULL, cp->text);
- DEBUG(net, 0, "injecting: %08x; %02x; %02x; %06x; %08x; %08x; %08x; \"%s\" (%s) -> %i", _date, _date_fract, (int)_current_company, cp->tile, cp->p1, cp->p2, cp->cmd, cp->text, GetCommandName(cp->cmd), (int)ret);
- assert(ret);
- free(cp);
- cp = NULL;
+ if (_date == next_date && _date_fract == next_date_fract) {
+ if (cp != NULL) {
+ NetworkSend_Command(cp->tile, cp->p1, cp->p2, cp->cmd & ~CMD_FLAGS_MASK, NULL, cp->text, cp->company);
+ DEBUG(net, 0, "injecting: %08x; %02x; %02x; %06x; %08x; %08x; %08x; \"%s\" (%s)", _date, _date_fract, (int)_current_company, cp->tile, cp->p1, cp->p2, cp->cmd, cp->text, GetCommandName(cp->cmd));
+ free(cp);
+ cp = NULL;
+ }
+ if (check_sync_state) {
+ if (sync_state[0] == _random.state[0] && sync_state[1] == _random.state[1]) {
+ DEBUG(net, 0, "sync check: %08x; %02x; match", _date, _date_fract);
+ } else {
+ DEBUG(net, 0, "sync check: %08x; %02x; mismatch expected {%08x, %08x}, got {%08x, %08x}",
+ _date, _date_fract, sync_state[0], sync_state[1], _random.state[0], _random.state[1]);
+ NOT_REACHED();
+ }
+ check_sync_state = false;
+ }
}
- if (cp != NULL) break;
+ if (cp != NULL || check_sync_state) break;
char buff[4096];
if (fgets(buff, lengthof(buff), f) == NULL) break;
@@ -1134,6 +1153,17 @@ void NetworkGameLoop()
cp->p1 = PM_PAUSED_NORMAL;
cp->p2 = 1;
_ddc_fastforward = false;
+ } else if (strncmp(p, "sync: ", 6) == 0) {
+ int ret = sscanf(p + 6, "%x; %x; %x; %x", &next_date, &next_date_fract, &sync_state[0], &sync_state[1]);
+ assert(ret == 4);
+ check_sync_state = true;
+ } 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. */
+ } else {
+ /* Can't parse a line; what's wrong here? */
+ DEBUG(net, 0, "trying to parse: %s", p);
+ NOT_REACHED();
}
}
if (f != NULL && feof(f)) {