113 lines
3.3 KiB
C++
113 lines
3.3 KiB
C++
|
|
#include "gameevents.h"
|
|
#include "base/bitfile.h"
|
|
#include <stdio.h>
|
|
|
|
namespace GameEvents
|
|
{
|
|
EventDataMap ParseEventData(bf_read& bitbuf, const EventDescriptor& desc, std::vector<char>& stringMem)
|
|
{
|
|
stringMem.reserve(stringMem.size() + MAX_EVENT_BYTES);
|
|
EventDataMap data;
|
|
char tempStr[MAX_EVENT_BYTES];
|
|
for (const EventValue& value : desc.values)
|
|
{
|
|
EventData& eventData = data[value.name];
|
|
eventData.type = value.type;
|
|
switch(value.type)
|
|
{
|
|
case EventValueType::String:
|
|
{
|
|
int length = 0;
|
|
const bool ok = bitbuf.ReadString(tempStr, sizeof(tempStr), false, &length);
|
|
assert(ok);
|
|
length += 1; // for null terminator
|
|
|
|
eventData.strOffset = stringMem.size();
|
|
stringMem.insert(stringMem.end(), tempStr, tempStr + length + 1);
|
|
break;
|
|
}
|
|
case EventValueType::Float:
|
|
{
|
|
eventData.flValue = bitbuf.ReadFloat();
|
|
break;
|
|
}
|
|
case EventValueType::Long:
|
|
{
|
|
eventData.i32Value = bitbuf.ReadSBitLong(32);
|
|
break;
|
|
}
|
|
case EventValueType::Short:
|
|
{
|
|
eventData.i16Value = bitbuf.ReadSBitLong(16);
|
|
break;
|
|
}
|
|
case EventValueType::Byte:
|
|
{
|
|
eventData.u8Value = bitbuf.ReadUBitLong(8);
|
|
break;
|
|
}
|
|
case EventValueType::Bool:
|
|
{
|
|
eventData.bValue = bitbuf.ReadOneBit() != 0;
|
|
break;
|
|
}
|
|
case EventValueType::Local:
|
|
default:
|
|
assert(false);
|
|
break;
|
|
}
|
|
}
|
|
return data;
|
|
}
|
|
|
|
void PrintEventData(bf_read& bitbuf, const EventDescriptor& desc)
|
|
{
|
|
char tempStr[MAX_EVENT_BYTES];
|
|
printf("%s:\n", desc.name);
|
|
for (const EventValue& value : desc.values)
|
|
{
|
|
printf(" %s: ", value.name);
|
|
switch(value.type)
|
|
{
|
|
case EventValueType::String:
|
|
{
|
|
const bool ok = bitbuf.ReadString(tempStr, sizeof(tempStr), false, nullptr);
|
|
assert(ok);
|
|
printf("%s\n", tempStr);
|
|
break;
|
|
}
|
|
case EventValueType::Float:
|
|
{
|
|
printf("%f\n", bitbuf.ReadFloat());
|
|
break;
|
|
}
|
|
case EventValueType::Long:
|
|
{
|
|
printf("%i\n", bitbuf.ReadSBitLong(32));
|
|
break;
|
|
}
|
|
case EventValueType::Short:
|
|
{
|
|
printf("%i\n", bitbuf.ReadSBitLong(16));
|
|
break;
|
|
}
|
|
case EventValueType::Byte:
|
|
{
|
|
printf("%u\n", bitbuf.ReadUBitLong(8));
|
|
break;
|
|
}
|
|
case EventValueType::Bool:
|
|
{
|
|
printf("%s\n", (bitbuf.ReadOneBit() != 0) ? "true" : "false");
|
|
break;
|
|
}
|
|
case EventValueType::Local:
|
|
default:
|
|
assert(false);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|