diff --git a/data/player.png b/data/player.png index 30820e6..53e8a3c 100644 Binary files a/data/player.png and b/data/player.png differ diff --git a/source/Network.c b/source/Network.c index 840ed90..9e6bbce 100755 --- a/source/Network.c +++ b/source/Network.c @@ -106,7 +106,7 @@ void networkHandleRecieve() { actualSize -= sizeof(u16); //if the seq id was expected handle the packet - u32 nextID = networkSeqRecvLast[sourceNetworkNodeID]+1; + u16 nextID = networkGetExpectedSeqFrom(sourceNetworkNodeID); if(seqID==nextID) { networkSeqRecvLast[sourceNetworkNodeID] = seqID; ackToSend = seqID; @@ -117,8 +117,8 @@ void networkHandleRecieve() { } else { processPacket(readPointer, size); } - } else if(seqID<=nextID-1) { - ackToSend = nextID-1; + } else if(networkSeqIsLowerThan(seqID, nextID)) { + ackToSend = seqID; } readPointer += size; actualSize -= size; @@ -527,6 +527,24 @@ bool networkGetNodeName(u16 id, char *name) { return false; } +u16 networkGetExpectedSeqFrom(u16 id) { + u16 nextID = networkSeqRecvLast[id]; + nextID += 1; + if(nextID==0) { + nextID = 1; + } + return nextID; +} + +bool networkSeqIsLowerThan(u16 firstID, u16 secondID) { + if (secondID < 100) { + return (firstID < secondID) || (firstID > 65536-100); + } else if (secondID > 65536-100) { + return (firstID < secondID) && (firstID > 100); + } else { + return (firstID < secondID); + } +} int fitInSendBuffer(size_t size) { //add "header" length diff --git a/source/Network.h b/source/Network.h index 870d1f5..92c1e32 100755 --- a/source/Network.h +++ b/source/Network.h @@ -40,5 +40,8 @@ u16 networkGetLocalNodeID(); bool networkIsNodeConnected(u16 id); bool networkGetNodeName(u16 id, char *name); +u16 networkGetExpectedSeqFrom(u16 id); +bool networkSeqIsLowerThan(u16 firstID, u16 secondID); + void networkSend(void *packet, size_t size); void networkSendWaitFlush();