Browse Source

Use std::list to manage TMegaPkts

pull/2421/head
Vladimir Olteanu 5 years ago committed by Anders Jenbo
parent
commit
d8da397795
  1. 49
      Source/msg.cpp
  2. 8
      Source/msg.h

49
Source/msg.cpp

@ -7,6 +7,7 @@
#include <memory>
#include <fmt/format.h>
#include <list>
#include "DiabloUI/diabloui.h"
#include "automap.h"
@ -39,6 +40,16 @@ int dwRecCount;
namespace {
struct TMegaPkt {
uint32_t spaceLeft;
byte data[32000];
TMegaPkt()
: spaceLeft(sizeof(data))
{
}
};
#define MAX_CHUNKS (NUMLEVELS + 4)
uint32_t sgdwOwnerWait;
@ -46,48 +57,31 @@ uint32_t sgdwRecvOffset;
int sgnCurrMegaPlayer;
DLevel sgLevels[NUMLEVELS];
BYTE sbLastCmd;
TMegaPkt *sgpCurrPkt;
byte sgRecvBuf[sizeof(DLevel) + 1];
BYTE sgbRecvCmd;
LocalLevel sgLocals[NUMLEVELS];
DJunk sgJunk;
TMegaPkt *sgpMegaPkt;
bool sgbDeltaChanged;
BYTE sgbDeltaChunks;
std::list<TMegaPkt> MegaPktList;
void GetNextPacket()
{
TMegaPkt *result;
sgpCurrPkt = static_cast<TMegaPkt *>(std::malloc(sizeof(TMegaPkt)));
if (sgpCurrPkt == nullptr)
app_fatal("Failed to allocate memory");
sgpCurrPkt->pNext = nullptr;
sgpCurrPkt->dwSpaceLeft = sizeof(result->data);
result = (TMegaPkt *)&sgpMegaPkt;
while (result->pNext != nullptr)
result = result->pNext;
result->pNext = sgpCurrPkt;
MegaPktList.emplace_back();
}
void FreePackets()
{
while (sgpMegaPkt != nullptr) {
sgpCurrPkt = sgpMegaPkt->pNext;
std::free(sgpMegaPkt);
sgpMegaPkt = sgpCurrPkt;
}
MegaPktList.clear();
}
void PrePacket()
{
uint8_t playerId = -1;
for (TMegaPkt *pkt = sgpMegaPkt; pkt != nullptr; pkt = pkt->pNext) {
byte *data = pkt->data;
size_t spaceLeft = sizeof(pkt->data);
while (spaceLeft != pkt->dwSpaceLeft) {
for (TMegaPkt &pkt : MegaPktList) {
byte *data = pkt.data;
size_t spaceLeft = sizeof(pkt.data);
while (spaceLeft != pkt.spaceLeft) {
auto cmdId = static_cast<_cmd_id>(*data);
if (cmdId == FAKE_CMD_SETID) {
@ -123,11 +117,12 @@ void SendPacket(int pnum, const void *packet, DWORD dwSize)
cmd.bPlr = pnum;
SendPacket(pnum, &cmd, sizeof(cmd));
}
if (sgpCurrPkt->dwSpaceLeft < dwSize)
if (MegaPktList.back().spaceLeft < dwSize)
GetNextPacket();
memcpy(sgpCurrPkt->data + sizeof(sgpCurrPkt->data) - sgpCurrPkt->dwSpaceLeft, packet, dwSize);
sgpCurrPkt->dwSpaceLeft -= dwSize;
TMegaPkt &currMegaPkt = MegaPktList.back();
memcpy(currMegaPkt.data + sizeof(currMegaPkt.data) - currMegaPkt.spaceLeft, packet, dwSize);
currMegaPkt.spaceLeft -= dwSize;
}
int WaitForTurns()

8
Source/msg.h

@ -398,14 +398,6 @@ struct DJunk {
};
#pragma pack(pop)
#pragma pack(push, 1)
struct TMegaPkt {
struct TMegaPkt *pNext;
uint32_t dwSpaceLeft;
byte data[32000];
};
#pragma pack(pop)
struct TBuffer {
uint32_t dwNextWriteOffset;
byte bData[4096];

Loading…
Cancel
Save