diff --git a/src/include/netconnect.h b/src/include/netconnect.h index 16b80cab6..16db640a6 100644 --- a/src/include/netconnect.h +++ b/src/include/netconnect.h @@ -74,6 +74,7 @@ class CNetworkHost public: unsigned char *Serialize() const; void Deserialize(const unsigned char *p); + void Clear(); static size_t Size() { return 4 + 2 + 2 + NetPlayerNameSize; } uint32_t Host; /// Host address diff --git a/src/include/network.h b/src/include/network.h index 2039e5c48..b217e4b52 100644 --- a/src/include/network.h +++ b/src/include/network.h @@ -238,12 +238,10 @@ public: -- Variables ----------------------------------------------------------------------------*/ -extern int NetworkNumInterfaces; /// Network number of interfaces extern Socket NetworkFildes; /// Network file descriptor extern int NetworkInSync; /// Network is in sync extern int NetworkUpdates; /// Network update each # game cycles extern int NetworkLag; /// Network lag (# game cycles) -extern unsigned long NetworkStatus[PlayerMax]; /// Network status /*---------------------------------------------------------------------------- -- Functions diff --git a/src/network/netconnect.cpp b/src/network/netconnect.cpp index a5f695ff5..daa12d363 100644 --- a/src/network/netconnect.cpp +++ b/src/network/netconnect.cpp @@ -122,6 +122,14 @@ void CNetworkHost::Deserialize(const unsigned char *p) memcpy(this->PlyName, p, sizeof(this->PlyName)); } +void CNetworkHost::Clear() +{ + this->Host = 0; + this->Port = 0; + this->PlyNr = 0; + memset(this->PlyName, 0, sizeof(this->PlyName)); +} + unsigned char *CServerSetup::Serialize() const { unsigned char *buf = new unsigned char[CServerSetup::Size()]; @@ -402,10 +410,7 @@ void NetworkInitClientConnect() NetworkServerPort = NetworkPort; LastStateMsgType = ICMServerQuit; for (int i = 0; i < PlayerMax; ++i) { - Hosts[i].Host = 0; - Hosts[i].Port = 0; - Hosts[i].PlyNr = 0; - memset(Hosts[i].PlyName, 0, sizeof(Hosts[i].PlyName)); + Hosts[i].Clear(); } ServerSetupState.Clear(); LocalSetupState.Clear(); @@ -439,10 +444,7 @@ void NetworkInitServerConnect(int openslots) // Cannot use NetPlayers here, as map change might modify the number!! for (int i = 0; i < PlayerMax; ++i) { NetStates[i].State = ccs_unused; - Hosts[i].Host = 0; - Hosts[i].Port = 0; - Hosts[i].PlyNr = 0; // slotnr until final cfg msg - memset(Hosts[i].PlyName, 0, sizeof(Hosts[i].PlyName)); + Hosts[i].Clear(); } // preset the server (initially always slot 0) @@ -584,8 +586,7 @@ void NetworkServerStartGame() if (Hosts[j].PlyNr) { DebugPrint("Compact: Hosts %d -> Hosts %d\n" _C_ j _C_ i); Hosts[i] = Hosts[j]; - Hosts[j].PlyNr = 0; - Hosts[j].Host = Hosts[j].Port = 0; + Hosts[j].Clear(); std::swap(LocalSetupState.CompOpt[i], LocalSetupState.CompOpt[j]); std::swap(LocalSetupState.Race[i], LocalSetupState.Race[j]); std::swap(LocalSetupState.LastFrame[i], LocalSetupState.LastFrame[j]); @@ -659,13 +660,8 @@ void NetworkServerStartGame() NetLocalPlayerNumber = Hosts[0].PlyNr; HostsCount = NetPlayers - 1; - // // Move ourselves (server slot 0) to the end of the list - // - Hosts[PlayerMax - 1] = Hosts[0]; // last slot unused (special), use as tempstore.. - Hosts[0] = Hosts[HostsCount]; - Hosts[HostsCount] = Hosts[PlayerMax - 1]; - Hosts[PlayerMax - 1].PlyNr = 0; + std::swap(Hosts[0], Hosts[HostsCount]); // Prepare the final config message: message.Type = MessageInitReply; @@ -673,9 +669,7 @@ void NetworkServerStartGame() message.HostsCount = NetPlayers; message.MapUID = htonl(Map.Info.MapUID); for (int i = 0; i < NetPlayers; ++i) { - message.u.Hosts[i].Host = Hosts[i].Host; - message.u.Hosts[i].Port = Hosts[i].Port; - memcpy(message.u.Hosts[i].PlyName, Hosts[i].PlyName, sizeof(message.u.Hosts[i].PlyName) - 1); + message.u.Hosts[i] = Hosts[i]; message.u.Hosts[i].PlyNr = htons(Hosts[i].PlyNr); } @@ -1042,10 +1036,7 @@ static void KickDeadClient(int c) { DebugPrint("kicking client %d\n" _C_ Hosts[c].PlyNr); NetStates[c].State = ccs_unused; - Hosts[c].Host = 0; - Hosts[c].Port = 0; - Hosts[c].PlyNr = 0; - memset(Hosts[c].PlyName, 0, sizeof(Hosts[c].PlyName)); + Hosts[c].Clear(); ServerSetupState.Ready[c] = 0; ServerSetupState.Race[c] = 0; ServerSetupState.LastFrame[c] = 0L; @@ -1280,7 +1271,6 @@ static void ClientParseConnected(const CInitMessage &msg) static void ClientParseMapInfo(const CInitMessage &msg) { switch (msg.SubType) { - case ICMState: // Server has sent us first state info ServerSetupState = msg.u.State; NetLocalState = ccs_synced; @@ -1316,10 +1306,8 @@ static void ClientParseSynced(const CInitMessage &msg, unsigned long host, int p int i; for (i = 0; i < msg.HostsCount - 1; ++i) { if (msg.u.Hosts[i].Host || msg.u.Hosts[i].Port) { - Hosts[HostsCount].Host = msg.u.Hosts[i].Host; - Hosts[HostsCount].Port = msg.u.Hosts[i].Port; + Hosts[HostsCount] = msg.u.Hosts[i]; Hosts[HostsCount].PlyNr = ntohs(msg.u.Hosts[i].PlyNr); - memcpy(Hosts[HostsCount].PlyName, msg.u.Hosts[i].PlyName, sizeof(Hosts[HostsCount].PlyName) - 1); HostsCount++; DebugPrint("Client %d = %d.%d.%d.%d:%d [%.*s]\n" _C_ ntohs(ntohs(msg.u.Hosts[i].PlyNr)) _C_ NIPQUAD(ntohl(msg.u.Hosts[i].Host)) _C_ @@ -1372,7 +1360,6 @@ static void ClientParseSynced(const CInitMessage &msg, unsigned long host, int p static void ClientParseAsync(const CInitMessage &msg) { switch (msg.SubType) { - case ICMResync: // Server has resynced with us and sends resync data DebugPrint("ccs_async: ICMResync\n"); for (int i = 1; i < PlayerMax - 1; ++i) { @@ -1533,10 +1520,8 @@ static void ServerParseHello(int h, const CInitMessage &msg, unsigned long host, for (int i = 1; i < PlayerMax - 1; ++i) { // Info about other clients if (i != h) { if (Hosts[i].PlyNr) { - message.u.Hosts[i].Host = Hosts[i].Host; - message.u.Hosts[i].Port = Hosts[i].Port; + message.u.Hosts[i] = Hosts[i]; message.u.Hosts[i].PlyNr = htons(Hosts[i].PlyNr); - memcpy(message.u.Hosts[i].PlyName, Hosts[i].PlyName, sizeof(message.u.Hosts[i].PlyName) - 1); } else { message.u.Hosts[i].Host = 0; message.u.Hosts[i].Port = 0; @@ -1585,10 +1570,8 @@ static void ServerParseResync(const int h, unsigned long host, int port) for (int i = 1; i < PlayerMax - 1; ++i) { // Info about other clients if (i != h) { if (Hosts[i].PlyNr) { - message.u.Hosts[i].Host = Hosts[i].Host; - message.u.Hosts[i].Port = Hosts[i].Port; + message.u.Hosts[i] = Hosts[i]; message.u.Hosts[i].PlyNr = htons(Hosts[i].PlyNr); - memcpy(message.u.Hosts[i].PlyName, Hosts[i].PlyName, sizeof(message.u.Hosts[i].PlyName) - 1); } else { message.u.Hosts[i].Host = 0; message.u.Hosts[i].Port = 0; diff --git a/src/network/network.cpp b/src/network/network.cpp index eef1a0f05..44986ff43 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -222,7 +222,6 @@ #include "commands.h" #include "interface.h" #include "map.h" -#include "master.h" #include "netconnect.h" #include "net_lowlevel.h" #include "player.h" @@ -250,21 +249,21 @@ public: unsigned long Time; /// time to execute unsigned char Type; /// Command Type - CNetworkCommand Data; /// command content + CNetworkCommand Data; /// command content }; //---------------------------------------------------------------------------- // Variables //---------------------------------------------------------------------------- -int NetworkNumInterfaces; /// Network number of interfaces -Socket NetworkFildes = static_cast<Socket>(-1); /// Network file descriptor +static int NetworkNumInterfaces; /// Network number of interfaces +Socket NetworkFildes = static_cast<Socket>(-1); /// Network file descriptor int NetworkInSync = 1; /// Network is in sync int NetworkUpdates = 5; /// Network update each # game cycles int NetworkLag = 10; /// Network lag in # game cycles -unsigned long NetworkStatus[PlayerMax]; /// Network status -unsigned long NetworkLastFrame[PlayerMax]; /// Last frame received packet -int NetworkTimeout = 45; /// Number of seconds until player times out +static unsigned long NetworkStatus[PlayerMax]; /// Network status +static unsigned long NetworkLastFrame[PlayerMax]; /// Last frame received packet +static const int NetworkTimeout = 45; /// Number of seconds until player times out static char NetMsgBuf[PlayerMax][128]; /// Chat message buffers static int NetMsgBufLen[PlayerMax]; /// Stored chat message length @@ -272,8 +271,8 @@ static unsigned long NetworkDelay; /// Delay counter for recover. static int NetworkSyncSeeds[256]; /// Network sync seeds. static int NetworkSyncHashs[256]; /// Network sync hashs. static CNetworkCommandQueue NetworkIn[256][PlayerMax][MaxNetworkCommands]; /// Per-player network packet input queue -std::list<CNetworkCommandQueue *> CommandsIn; /// Network command input queue -std::list<CNetworkCommandQueue *> MsgCommandsIn;/// Network message input queue +static std::list<CNetworkCommandQueue *> CommandsIn; /// Network command input queue +static std::list<CNetworkCommandQueue *> MsgCommandsIn; /// Network message input queue #ifdef DEBUG static int NetworkReceivedPackets; /// Packets received packets @@ -743,9 +742,7 @@ void NetworkSendExtendedCommand(int command, int arg1, int arg2, int arg3, */ void NetworkSendSelection(CUnit **units, int count) { - CNetworkPacket packet; int teammates[PlayerMax]; - int nosent; // Check if we have any teammates to send to int numteammates = 0; @@ -761,39 +758,39 @@ void NetworkSendSelection(CUnit **units, int count) // // Build and send packets to cover all units. // + CNetworkPacket packet; int unitcount = 0; while (unitcount < count) { - NetworkSelectionHeader *header = (NetworkSelectionHeader *) &packet.Header; + NetworkSelectionHeader &header = (NetworkSelectionHeader &) packet.Header; if (unitcount == 0) { - header->Add = 0; + header.Add = 0; } else { - header->Add = 1; + header.Add = 1; } - header->Remove = 0; + header.Remove = 0; - nosent = 0; + int nosent = 0; int i; for (i = 0; i < MaxNetworkCommands && unitcount < count; ++i) { - header->Type[i] = MessageSelection; - CNetworkSelection *selection = (CNetworkSelection *)&packet.Command[i]; + header.Type[i] = MessageSelection; + CNetworkSelection &selection = (CNetworkSelection &)packet.Command[i]; for (int ref = 0; ref < 4 && unitcount < count; ++ref, ++unitcount) { - selection->Unit[ref] = htons(UnitNumber(*units[unitcount])); + selection.Unit[ref] = htons(UnitNumber(*units[unitcount])); ++nosent; } } if (unitcount >= count) { // This is the last command - header->NumberSent = nosent; + header.NumberSent = nosent; } else { - header->NumberSent = MaxNetworkCommands * 4; + header.NumberSent = MaxNetworkCommands * 4; } for (; i < MaxNetworkCommands; ++i) { packet.Header.Type[i] = MessageNone; } - // // Send the Constructed packet to team members // @@ -806,26 +803,26 @@ void NetworkSendSelection(CUnit **units, int count) } delete [] buf; } - } + /** ** Process Received Unit Selection ** ** @param packet Network Packet to Process ** @param player Player number */ -static void NetworkProcessSelection(CNetworkPacket *packet, int player) +static void NetworkProcessSelection(const CNetworkPacket &packet, int player) { - NetworkSelectionHeader *header = reinterpret_cast<NetworkSelectionHeader *>(&packet->Header); - const size_t count = header->NumberSent; - const int adjust = (header->Add << 1) | header->Remove; + const NetworkSelectionHeader &header = reinterpret_cast<const NetworkSelectionHeader &>(packet.Header); + const size_t count = header.NumberSent; + const int adjust = (header.Add << 1) | header.Remove; std::vector<CUnit *> units; - for (int i = 0; header->Type[i] == MessageSelection; ++i) { - CNetworkSelection *selection = reinterpret_cast<CNetworkSelection *>(&packet->Command[i]); + for (int i = 0; header.Type[i] == MessageSelection; ++i) { + const CNetworkSelection &selection = reinterpret_cast<const CNetworkSelection &>(packet.Command[i]); for (int j = 0; j < 4 && units.size() < count; ++j) { - units.push_back(&UnitManager.GetSlotUnit(ntohs(selection->Unit[j]))); + units.push_back(&UnitManager.GetSlotUnit(ntohs(selection.Unit[j]))); } } Assert(count == units.size()); @@ -865,22 +862,15 @@ static void NetworkRemovePlayer(int player) */ void NetworkEvent() { - unsigned char buf[1024]; - CNetworkPacket packet; - int player; - int i; - int commands; - unsigned long n; - if (!IsNetworkGame()) { NetworkInSync = 1; return; } - // // Read the packet. - // + unsigned char buf[1024]; unsigned long host; int port; + int i; if ((i = NetRecvUDP(NetworkFildes, &buf, sizeof(buf), &host, &port)) < 0) { // // Server or client gone? @@ -895,16 +885,15 @@ void NetworkEvent() ++NetworkReceivedPackets; #endif - // // Setup messages - // if (NetConnectRunning) { if (NetworkParseSetupEvent(buf, i, host, port)) { return; } } - commands = packet.Deserialize(buf, i); + CNetworkPacket packet; + int commands = packet.Deserialize(buf, i); if (commands < 0) { DebugPrint("Bad packet read\n"); return; @@ -921,24 +910,21 @@ void NetworkEvent() NIPQUAD(ntohl(host)) _C_ ntohs(port)); return; } - player = Hosts[i].PlyNr; + + const int player = Hosts[i].PlyNr; // In a normal packet there is a least sync, selection may not have that if (packet.Header.Type[0] == MessageSelection || commands == 0) { - NetworkProcessSelection(&packet, player); + NetworkProcessSelection(packet, player); return; } - // // Parse the packet commands. - // for (i = 0; i < commands; ++i) { const CNetworkCommand *nc = &packet.Command[i]; bool validCommand = false; - // // Handle some messages. - // if (packet.Header.Type[i] == MessageQuit) { int playerNum = ntohs(nc->X); @@ -950,7 +936,7 @@ void NetworkEvent() if (packet.Header.Type[i] == MessageResend) { // Destination cycle (time to execute). - n = ((GameCycle + 128) & ~0xFF) | packet.Header.Cycle; + unsigned long n = ((GameCycle + 128) & ~0xFF) | packet.Header.Cycle; if (n > GameCycle + 128) { n -= 0x100; } @@ -983,12 +969,11 @@ void NetworkEvent() } } } - return; } // Destination cycle (time to execute). - n = ((GameCycle + 128) & ~0xFF) | packet.Header.Cycle; + unsigned long n = ((GameCycle + 128) & ~0xFF) | packet.Header.Cycle; if (n > GameCycle + 128) { n -= 0x100; } @@ -1048,13 +1033,11 @@ void NetworkEvent() NetworkIn[packet.Header.Cycle][player][i].Time = 0; } - // // Waiting for this time slot - // if (!NetworkInSync) { NetworkInSync = 1; - n = (GameCycle / NetworkUpdates) * NetworkUpdates + NetworkUpdates; - for (player = 0; player < HostsCount; ++player) { + unsigned long n = (GameCycle / NetworkUpdates) * NetworkUpdates + NetworkUpdates; + for (int player = 0; player < HostsCount; ++player) { if (NetworkIn[n & 0xFF][Hosts[player].PlyNr][0].Time != n) { NetworkInSync = 0; break; @@ -1080,7 +1063,6 @@ void NetworkQuit() for (int i = 1; i < MaxNetworkCommands; ++i) { NetworkIn[n & 0xFF][ThisPlayer->Index][i].Type = MessageNone; } - NetworkSendPacket(NetworkIn[n & 0xFF][ThisPlayer->Index]); } @@ -1091,82 +1073,84 @@ void NetworkQuit() */ void NetworkChatMessage(const std::string &msg) { - CNetworkCommandQueue *ncq; - CNetworkChat *ncm; if (IsNetworkGame()) { const char *cp = msg.c_str(); - int n = msg.size(); - while (n >= (int)sizeof(ncm->Text)) { - ncq = AllocNCQ(); + size_t n = msg.size(); + while (n >= sizeof(CNetworkChat::Text)) { + CNetworkCommandQueue *ncq = AllocNCQ(); MsgCommandsIn.push_back(ncq); ncq->Type = MessageChat; - ncm = (CNetworkChat *)(&ncq->Data); + CNetworkChat *ncm = (CNetworkChat *)(&ncq->Data); ncm->Player = ThisPlayer->Index; memcpy(ncm->Text, cp, sizeof(ncm->Text)); cp += sizeof(ncm->Text); n -= sizeof(ncm->Text); } - ncq = AllocNCQ(); + CNetworkCommandQueue *ncq = AllocNCQ(); MsgCommandsIn.push_back(ncq); ncq->Type = MessageChatTerm; - ncm = (CNetworkChat *)(&ncq->Data); + CNetworkChat *ncm = (CNetworkChat *)(&ncq->Data); ncm->Player = ThisPlayer->Index; memcpy(ncm->Text, cp, n + 1); // see >= above :) } } +static void ParseNetworkCommand_Sync(const CNetworkCommandQueue &ncq) +{ + Assert((ncq.Type & 0x7F) == MessageSync); + + int ply = ntohs(ncq.Data.X) << 16; + ply |= ntohs(ncq.Data.Y); + if (ply != NetworkSyncSeeds[GameCycle & 0xFF] + || ntohs(ncq.Data.Unit) != NetworkSyncHashs[GameCycle & 0xFF]) { + + SetMessage("%s", _("Network out of sync")); + DebugPrint("\nNetwork out of sync %x!=%x! %d!=%d! Cycle %lu\n\n" _C_ + ply _C_ NetworkSyncSeeds[GameCycle & 0xFF] _C_ + ntohs(ncq.Data.Unit) _C_ NetworkSyncHashs[GameCycle & 0xFF] _C_ GameCycle); + } +} + +static void ParseNetworkCommand_Chat(const CNetworkCommandQueue &ncq) +{ + const CNetworkChat &ncm = reinterpret_cast<const CNetworkChat &>(ncq.Data); + int ply = ncm.Player; + + if (NetMsgBufLen[ply] + sizeof(CNetworkChat::Text) < 128) { + memcpy(NetMsgBuf[ply] + NetMsgBufLen[ply], ncm.Text, sizeof(ncm.Text)); + } + NetMsgBufLen[ply] += sizeof(ncm.Text); + if (ncq.Type == MessageChatTerm) { + NetMsgBuf[ply][127] = '\0'; + SetMessage("%s", NetMsgBuf[ply]); + PlayGameSound(GameSounds.ChatMessage.Sound, MaxSampleVolume); + CommandLog("chat", NoUnitP, FlushCommands, -1, -1, NoUnitP, NetMsgBuf[ply], -1); + NetMsgBufLen[ply] = 0; + } +} + /** ** Parse a network command. ** ** @param ncq Network command from queue */ -static void ParseNetworkCommand(const CNetworkCommandQueue *ncq) +static void ParseNetworkCommand(const CNetworkCommandQueue &ncq) { - int ply; + switch (ncq.Type & 0x7F) { + case MessageSync: ParseNetworkCommand_Sync(ncq); break; - switch (ncq->Type & 0x7F) { - case MessageSync: - ply = ntohs(ncq->Data.X) << 16; - ply |= ntohs(ncq->Data.Y); - if (ply != NetworkSyncSeeds[GameCycle & 0xFF] - || ntohs(ncq->Data.Unit) != NetworkSyncHashs[GameCycle & 0xFF]) { + case MessageChat: // Follow + case MessageChatTerm: ParseNetworkCommand_Chat(ncq); break; - SetMessage("%s", _("Network out of sync")); - DebugPrint("\nNetwork out of sync %x!=%x! %d!=%d! Cycle %lu\n\n" _C_ - ply _C_ NetworkSyncSeeds[GameCycle & 0xFF] _C_ - ntohs(ncq->Data.Unit) _C_ NetworkSyncHashs[GameCycle & 0xFF] _C_ GameCycle); - } - return; - case MessageChat: - case MessageChatTerm: { - const CNetworkChat *ncm; - - ncm = (CNetworkChat *)(&ncq->Data); - ply = ncm->Player; - if (NetMsgBufLen[ply] + sizeof(ncm->Text) < 128) { - memcpy(((char *)NetMsgBuf[ply]) + NetMsgBufLen[ply], ncm->Text, sizeof(ncm->Text)); - } - NetMsgBufLen[ply] += sizeof(ncm->Text); - if (ncq->Type == MessageChatTerm) { - NetMsgBuf[ply][127] = '\0'; - SetMessage("%s", NetMsgBuf[ply]); - PlayGameSound(GameSounds.ChatMessage.Sound, MaxSampleVolume); - CommandLog("chat", NoUnitP, FlushCommands, -1, -1, NoUnitP, NetMsgBuf[ply], -1); - NetMsgBufLen[ply] = 0; - } - } - break; case MessageQuit: - NetworkRemovePlayer(ncq->Data.X); - CommandLog("quit", NoUnitP, FlushCommands, ncq->Data.X, -1, NoUnitP, NULL, -1); - CommandQuit(ncq->Data.X); + NetworkRemovePlayer(ncq.Data.X); + CommandLog("quit", NoUnitP, FlushCommands, ncq.Data.X, -1, NoUnitP, NULL, -1); + CommandQuit(ncq.Data.X); break; case MessageExtendedCommand: { - const CNetworkExtendedCommand *nec; - - nec = (CNetworkExtendedCommand *)(&ncq->Data); - ParseExtendedCommand(nec->ExtendedType, (ncq->Type & 0x80) >> 7, + const CNetworkExtendedCommand *nec = (CNetworkExtendedCommand *)(&ncq.Data); + ParseExtendedCommand(nec->ExtendedType, (ncq.Type & 0x80) >> 7, nec->Arg1, ntohs(nec->Arg2), ntohs(nec->Arg3), ntohs(nec->Arg4)); } break; @@ -1175,8 +1159,8 @@ static void ParseNetworkCommand(const CNetworkCommandQueue *ncq) Assert(0); break; default: - ParseCommand(ncq->Type, ntohs(ncq->Data.Unit), - ntohs(ncq->Data.X), ntohs(ncq->Data.Y), ntohs(ncq->Data.Dest)); + ParseCommand(ncq.Type, ntohs(ncq.Data.Unit), + ntohs(ncq.Data.X), ntohs(ncq.Data.Y), ntohs(ncq.Data.Dest)); break; } } @@ -1196,9 +1180,7 @@ static void NetworkResendCommands() ++NetworkSendResend; #endif - // // Build packet - // packet.Header.Type[0] = MessageResend; packet.Header.Type[1] = MessageNone; packet.Header.Cycle = @@ -1212,9 +1194,7 @@ static void NetworkResendCommands() */ static void NetworkSendCommands() { - // // No command available, send sync. - // int numcommands = 0; CNetworkCommandQueue *incommand = NULL; CNetworkCommandQueue *ncq = NetworkIn[(GameCycle + NetworkLag) & 0xFF][ThisPlayer->Index]; @@ -1267,26 +1247,20 @@ static void NetworkSendCommands() */ static void NetworkExecCommands() { - CNetworkCommandQueue *ncq; - - // // Must execute commands on all computers in the same order. - // for (int i = 0; i < NumPlayers; ++i) { - // // Remove commands. - // for (int c = 0; c < MaxNetworkCommands; ++c) { - ncq = &NetworkIn[GameCycle & 0xFF][i][c]; - if (ncq->Type == MessageNone) { + const CNetworkCommandQueue &ncq = NetworkIn[GameCycle & 0xFF][i][c]; + if (ncq.Type == MessageNone) { break; } - if (ncq->Time) { + if (ncq.Time) { #ifdef DEBUG - if (ncq->Time != GameCycle) { + if (ncq.Time != GameCycle) { DebugPrint("cycle %lu idx %lu time %lu\n" _C_ - GameCycle _C_ GameCycle & 0xFF _C_ ncq->Time); - Assert(ncq->Time == GameCycle); + GameCycle _C_ GameCycle & 0xFF _C_ ncq.Time); + Assert(ncq.Time == GameCycle); } #endif ParseNetworkCommand(ncq); @@ -1300,16 +1274,12 @@ static void NetworkExecCommands() */ static void NetworkSyncCommands() { - const CNetworkCommandQueue *ncq; - unsigned long n; - - // // Check if all next messages are available. - // NetworkInSync = 1; - n = GameCycle + NetworkUpdates; + unsigned long n = GameCycle + NetworkUpdates; for (int i = 0; i < HostsCount; ++i) { - ncq = NetworkIn[n & 0xFF][Hosts[i].PlyNr]; + const CNetworkCommandQueue *ncq = NetworkIn[n & 0xFF][Hosts[i].PlyNr]; + if (ncq[0].Time != n) { NetworkInSync = 0; NetworkDelay = FrameCounter + NetworkUpdates; @@ -1350,13 +1320,10 @@ void NetworkRecover() // Check for players that timed out for (int i = 0; i < HostsCount; ++i) { - int secs; - if (!NetworkLastFrame[Hosts[i].PlyNr]) { continue; } - - secs = (FrameCounter - NetworkLastFrame[Hosts[i].PlyNr]) / + int secs = (FrameCounter - NetworkLastFrame[Hosts[i].PlyNr]) / (FRAMES_PER_SECOND * VideoSyncSpeed / 100); // FIXME: display a menu while we wait if (secs >= 3 && secs < NetworkTimeout) { @@ -1367,11 +1334,9 @@ void NetworkRecover() } if (secs >= NetworkTimeout) { CNetworkCommand nc; - const CNetworkCommandQueue *ncq; - unsigned long n; CNetworkPacket np; - n = GameCycle + NetworkUpdates; + unsigned long n = GameCycle + NetworkUpdates; nc.X = Hosts[i].PlyNr; NetworkIn[n & 0xFF][Hosts[i].PlyNr][0].Time = n; NetworkIn[n & 0xFF][Hosts[i].PlyNr][0].Type = MessageQuit; @@ -1379,7 +1344,7 @@ void NetworkRecover() PlayerQuit[Hosts[i].PlyNr] = 1; SetMessage("%s", _("Timed out")); - ncq = &NetworkIn[n & 0xFF][Hosts[i].PlyNr][0]; + const CNetworkCommandQueue *ncq = &NetworkIn[n & 0xFF][Hosts[i].PlyNr][0]; np.Header.Cycle = ncq->Time & 0xFF; np.Header.Type[0] = ncq->Type; np.Header.Type[1] = MessageNone; @@ -1396,4 +1361,3 @@ void NetworkRecover() } //@} -