1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
|
#ifndef GAMERECORDER_H
#define GAMERECORDER_H
#include <vector>
#include "Tools.h"
#include "File.h"
#include "ObjectVisitors.h"
#include "PDUs.h"
//----------------------------------------------------------------------------
class GameRecorder
{
SINGLETON_OBJECT(GameRecorder);
//------------------------------------------------------------------------
typedef std::map<Uint16, PDUBase*> PDUs;
typedef std::map<Uint16, ObjectPDUBase*> ObjectPDUs;
public:
//------------------------------------------------------------------------
class PreparePDUsConstVisitor : public ObjectConstVisitor
{
public:
//--------------------------------------------------------------------
PreparePDUsConstVisitor(GameRecorder *recorder)
: m_recorder(recorder) {}
~PreparePDUsConstVisitor() { m_recorder = NULL; }
private:
//--------------------------------------------------------------------
void do_visit(const Barrier *b);
void do_visit(const BlackHole *b);
void do_visit(const Crate *c);
void do_visit(const Grenade *g);
void do_visit(const Grinder *g);
void do_visit(const MagnetBase *m);
void do_visit(const Missile *m);
void do_visit(const MortarBase *m);
//void do_visit(const ParticleBase *p);
void do_visit(const ParticleFountainBase *f);
void do_visit(const Platform *p);
void do_visit(const ProjectileBase *p);
void do_visit(const SAMBatteryBase *s);
void do_visit(const Ship *s);
void do_visit(const SwitchBase *s);
void do_visit(const Tank *t);
void do_visit(const Thorn *t);
void do_visit(const TurretBase *t);
//--------------------------------------------------------------------
GameRecorder *m_recorder;
};
//------------------------------------------------------------------------
class AppendToBufferConstVisitor : public PDUConstVisitor
{
protected:
//--------------------------------------------------------------------
AppendToBufferConstVisitor(std::vector<char> &buffer)
: m_buffer(buffer) {}
public:
//--------------------------------------------------------------------
virtual ~AppendToBufferConstVisitor() {}
protected:
//--------------------------------------------------------------------
void appendUint8(const Uint8 value);
void appendUint16(const Uint16 value);
void appendUint32(const Uint32 value);
//--------------------------------------------------------------------
std::vector<char> &m_buffer;
};
//------------------------------------------------------------------------
class AppendCreatePDUToBufferConstVisitor : public AppendToBufferConstVisitor
{
public:
//--------------------------------------------------------------------
AppendCreatePDUToBufferConstVisitor(std::vector<char> &buffer)
: AppendToBufferConstVisitor(buffer) {}
~AppendCreatePDUToBufferConstVisitor() {}
private:
//--------------------------------------------------------------------
void do_visit(const BarrierPDU *pdu);
void do_visit(const BlackHolePDU *pdu);
void do_visit(const CratePDU *pdu);
void do_visit(const GrenadePDU *pdu);
void do_visit(const GrinderPDU *pdu);
void do_visit(const MagnetBasePDU *pdu);
void do_visit(const MissilePDU *pdu);
void do_visit(const MortarBasePDU *pdu);
void do_visit(const ParticleFountainBasePDU *pdu);
void do_visit(const PlatformPDU *pdu);
void do_visit(const ProjectileBasePDU *pdu);
void do_visit(const SAMBatteryBasePDU *pdu);
void do_visit(const ShipPDU *pdu);
void do_visit(const SwitchBasePDU *pdu);
void do_visit(const TankPDU *pdu);
void do_visit(const ThornPDU *pdu);
void do_visit(const TurretBasePDU *pdu);
//--------------------------------------------------------------------
void do_visit(const HeaderPDU *pdu);
void do_visit(const DeleteObjectPDU *pdu);
//--------------------------------------------------------------------
void do_objectPDUBase(const ObjectPDUBase *pdu);
void do_staticDecorationObjectPDUBase(const StaticDecorationObjectPDUBase *pdu);
};
//------------------------------------------------------------------------
class AppendUpdatePDUToBufferConstVisitor : public AppendToBufferConstVisitor
{
public:
//--------------------------------------------------------------------
AppendUpdatePDUToBufferConstVisitor(std::vector<char> &buffer)
: AppendToBufferConstVisitor(buffer) {}
~AppendUpdatePDUToBufferConstVisitor() {}
private:
//--------------------------------------------------------------------
void do_visit(const BarrierPDU *pdu);
void do_visit(const BlackHolePDU *pdu);
void do_visit(const CratePDU *pdu);
void do_visit(const GrenadePDU *pdu);
void do_visit(const GrinderPDU *pdu);
void do_visit(const MagnetBasePDU *pdu);
void do_visit(const MissilePDU *pdu);
void do_visit(const MortarBasePDU *pdu);
void do_visit(const ParticleFountainBasePDU *pdu);
void do_visit(const PlatformPDU *pdu);
void do_visit(const ProjectileBasePDU *pdu);
void do_visit(const SAMBatteryBasePDU *pdu);
void do_visit(const ShipPDU *pdu);
void do_visit(const SwitchBasePDU *pdu);
void do_visit(const TankPDU *pdu);
void do_visit(const ThornPDU *pdu);
void do_visit(const TurretBasePDU *pdu);
//--------------------------------------------------------------------
void do_visit(const HeaderPDU *pdu);
void do_visit(const DeleteObjectPDU *pdu);
};
//------------------------------------------------------------------------
GameRecorder();
~GameRecorder();
//------------------------------------------------------------------------
void writeFrame();
private:
//------------------------------------------------------------------------
void convertCreatePDUs2UpdatePDUs();
void processObjects();
void convertNotVisitedUpdatePDUs2DeletePDUs();
void encodePDUs(std::vector<char> &buffer);
//------------------------------------------------------------------------
File *m_file;
//------------------------------------------------------------------------
ObjectPDUs m_createPDUs;
ObjectPDUs m_updatePDUs;
PDUs m_deletePDUs;
};
#endif //GAMERECORDER_H
|