src/network/network.cpp
changeset 7683 cd00f3932777
parent 7024 f767928cffd6
child 7716 d8fb9226bae4
--- a/src/network/network.cpp	Sat Jul 07 08:53:19 2007 +0000
+++ b/src/network/network.cpp	Sat Jul 07 10:06:10 2007 +0000
@@ -37,6 +37,7 @@
 #include "../console.h" /* IConsoleCmdExec */
 #include <stdarg.h> /* va_list */
 #include "../md5.h"
+#include "../fileio.h"
 
 /* Check whether NETWORK_NUM_LANDSCAPES is still in sync with NUM_LANDSCAPE */
 assert_compile((int)NETWORK_NUM_LANDSCAPES == (int)NUM_LANDSCAPE);
@@ -195,6 +196,9 @@
 			break;
 	}
 
+#ifdef DEBUG_DUMP_COMMANDS
+	debug_dump_commands("ddc:cmsg:%d;%d;%s\n", _date, _date_fract, message);
+#endif /* DUMP_COMMANDS */
 	IConsolePrintF(color, "%s", message);
 	AddTextMessage(color, duration, "%s", message);
 }
@@ -1235,6 +1239,9 @@
 			if (_sync_seed_1 != _random_seeds[0][0]) {
 #endif
 				NetworkError(STR_NETWORK_ERR_DESYNC);
+#ifdef DEBUG_DUMP_COMMANDS
+				debug_dump_commands("ddc:serr:%d;%d\n", _date, _date_fract);
+#endif /* DUMP_COMMANDS */
 				DEBUG(net, 0, "Sync error detected!");
 				NetworkClientError(NETWORK_RECV_STATUS_DESYNC, DEREF_CLIENT(0));
 				return false;
@@ -1280,6 +1287,37 @@
 	if (!NetworkReceive()) return;
 
 	if (_network_server) {
+#ifdef DEBUG_DUMP_COMMANDS
+		static FILE *f = FioFOpenFile("commands.log", "rb", SAVE_DIR);
+		static Date next_date = 0;
+		static uint32 next_date_fract;
+		static CommandPacket *cp = NULL;
+		if (f == NULL && next_date == 0) {
+			printf("Cannot open commands.log\n");
+			next_date = 1;
+		}
+
+		while (f != NULL && !feof(f)) {
+			if (cp != NULL && _date == next_date && _date_fract == next_date_fract) {
+				_current_player = cp->player;
+				_cmd_text = cp->text;
+				DoCommandP(cp->tile, cp->p1, cp->p2, NULL, cp->cmd);
+				free(cp);
+				cp = NULL;
+			}
+
+			if (cp != NULL) break;
+
+			char buff[4096];
+			if (fgets(buff, lengthof(buff), f) == NULL) break;
+			if (strncmp(buff, "ddc:cmd:", 8) != 0) continue;
+			cp = MallocT<CommandPacket>(1);
+			int player;
+			sscanf(&buff[8], "%d;%d;%d;%d;%d;%d;%d;%s", &next_date, &next_date_fract, &player, &cp->tile, &cp->p1, &cp->p2, &cp->cmd, cp->text);
+			cp->player = (Owner)player;
+		}
+#endif /* DUMP_COMMANDS */
+
 		bool send_frame = false;
 
 		// We first increase the _frame_counter
@@ -1436,4 +1474,18 @@
 			strncmp(_openttd_revision, other, NETWORK_REVISION_LENGTH - 1) == 0;
 }
 
+#ifdef DEBUG_DUMP_COMMANDS
+void CDECL debug_dump_commands(const char *s, ...)
+{
+	static FILE *f = FioFOpenFile("commands-out.log", "wb", SAVE_DIR);
+	if (f == NULL) return;
+
+	va_list va;
+	va_start(va, s);
+	vfprintf(f, s, va);
+	va_end(va);
+
+	fflush(f);
+}
+#endif /* DEBUG_DUMP_COMMANDS */
 #endif /* ENABLE_NETWORK */