2015-05-13 02:39:56 +02:00
|
|
|
|
|
|
|
#include "demoreader.h"
|
|
|
|
#include "idemowriter.h"
|
|
|
|
#include "demofile.h"
|
2015-05-15 03:36:57 +02:00
|
|
|
#include "demotypes.h"
|
2015-05-13 02:39:56 +02:00
|
|
|
|
2015-05-15 03:36:57 +02:00
|
|
|
#include "netmessages/netmessages.h"
|
|
|
|
#include "netmessages/netcontants.h"
|
|
|
|
#include "bitbuf.h"
|
|
|
|
#include <vector>
|
|
|
|
#include <cstdint>
|
|
|
|
|
|
|
|
typedef bool (*NetMsgReadFn)(bf_read& bitbuf, SourceGameContext& context, void* data);
|
|
|
|
|
|
|
|
static const NetMsgReadFn netHandlers[] = DECLARE_NET_HANDLER_ARRAY(BitRead);
|
|
|
|
//static const void* netDataStructs[] = DECLARE_NET_DATA_ARRAY;
|
|
|
|
|
|
|
|
void ParsePacket(uint8_t* packet, size_t length, IDemoWriter* writer)
|
2015-05-13 02:39:56 +02:00
|
|
|
{
|
2015-05-15 03:36:57 +02:00
|
|
|
assert(length <= NET_MAX_PAYLOAD);
|
|
|
|
bf_read bitbuf(packet, length);
|
|
|
|
NetPacket netPacket;
|
2015-05-13 02:39:56 +02:00
|
|
|
while (bitbuf.GetNumBitsLeft() >= NETMSG_TYPE_BITS)
|
|
|
|
{
|
2015-05-15 03:36:57 +02:00
|
|
|
netPacket.type = bitbuf.ReadUBitLong(NETMSG_TYPE_BITS);
|
|
|
|
//netPacket.data = netDataStructs[netPacket.type];
|
|
|
|
//netHandlers[netPacket.type](bitbuf, context, );
|
2015-05-13 02:39:56 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-05-15 03:36:57 +02:00
|
|
|
void ParseDemo(DemoFileReader& reader, IDemoWriter* writer)
|
2015-05-13 02:39:56 +02:00
|
|
|
{
|
2015-05-15 03:36:57 +02:00
|
|
|
democmdinfo_t cmdInfo;
|
2015-05-13 02:39:56 +02:00
|
|
|
CommandPacket packet;
|
2015-05-15 03:36:57 +02:00
|
|
|
packet.cmdInfo = &cmdInfo;
|
2015-05-13 02:39:56 +02:00
|
|
|
std::vector<uint8_t> buffer;
|
2015-05-15 03:36:57 +02:00
|
|
|
buffer.resize(NET_MAX_PAYLOAD);
|
2015-05-13 02:39:56 +02:00
|
|
|
|
2015-05-15 03:36:57 +02:00
|
|
|
do
|
2015-05-13 02:39:56 +02:00
|
|
|
{
|
2015-05-15 03:36:57 +02:00
|
|
|
reader.ReadCmdHeader(packet.cmd, packet.tick);
|
2015-05-13 02:39:56 +02:00
|
|
|
switch (packet.cmd)
|
|
|
|
{
|
|
|
|
case dem_signon:
|
|
|
|
case dem_packet:
|
2015-05-15 03:36:57 +02:00
|
|
|
reader.ReadCmdInfo(*packet.cmdInfo);
|
2015-05-13 02:39:56 +02:00
|
|
|
reader.ReadSequenceInfo(packet.sequenceInfo1, packet.sequenceInfo2);
|
|
|
|
assert(packet.sequenceInfo1 == packet.sequenceInfo2);
|
2015-05-15 03:36:57 +02:00
|
|
|
reader.ReadRawData(buffer.data(), buffer.size());
|
2015-05-13 02:39:56 +02:00
|
|
|
break;
|
|
|
|
case dem_synctick:
|
|
|
|
// nothing
|
|
|
|
break;
|
|
|
|
case dem_consolecmd:
|
|
|
|
reader.ReadRawData(nullptr, 1024);
|
|
|
|
break;
|
|
|
|
case dem_usercmd:
|
2015-05-15 03:36:57 +02:00
|
|
|
reader.ReadUserCmd(buffer.data(), 256);
|
2015-05-13 02:39:56 +02:00
|
|
|
break;
|
|
|
|
case dem_datatables:
|
|
|
|
// TODO: datatables
|
|
|
|
reader.ReadRawData(nullptr, 64*1024);
|
|
|
|
break;
|
|
|
|
case dem_stop:
|
|
|
|
// TODO assert frame and tick numbers
|
|
|
|
break;
|
|
|
|
case dem_customdata:
|
|
|
|
reader.ReadRawData(nullptr, 0);
|
|
|
|
break;
|
|
|
|
case dem_stringtables:
|
|
|
|
reader.ReadRawData(nullptr, 0);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
assert(false);
|
|
|
|
break;
|
|
|
|
}
|
2015-05-15 03:36:57 +02:00
|
|
|
writer->StartCommandPacket(packet);
|
|
|
|
if (packet.cmd == dem_packet || packet.cmd == dem_signon)
|
|
|
|
{
|
|
|
|
ParsePacket(buffer.data(), buffer.size(), writer);
|
|
|
|
}
|
|
|
|
writer->EndCommandPacket();
|
|
|
|
} while (packet.cmd != dem_stop);
|
|
|
|
}
|
2015-05-13 02:39:56 +02:00
|
|
|
|
|
|
|
void DemoReader::ProcessDem(void* inputFp, IDemoWriter* writer)
|
|
|
|
{
|
|
|
|
DemoFileReader demoFile(reinterpret_cast<FILE*>(inputFp));
|
2015-05-15 03:36:57 +02:00
|
|
|
{
|
|
|
|
demoheader_t header;
|
|
|
|
demoFile.ReadDemoHeader(header);
|
|
|
|
writer->StartWriting(header);
|
|
|
|
}
|
|
|
|
ParseDemo(demoFile, writer);
|
|
|
|
writer->EndWriting();
|
2015-05-13 02:39:56 +02:00
|
|
|
}
|