File: GameRecorder.h

package info (click to toggle)
moagg 0.18-6
  • links: PTS, VCS
  • area: main
  • in suites: lenny
  • size: 1,924 kB
  • ctags: 4,059
  • sloc: cpp: 23,814; sh: 2,652; makefile: 283
file content (175 lines) | stat: -rw-r--r-- 6,757 bytes parent folder | download | duplicates (3)
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