Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/netp5/src/network/packet/Gamestate.h @ 3211

Last change on this file since 3211 was 3211, checked in by rgrieder, 15 years ago

Moved PacketFlag and added includes for memcpy() and abort() (Mingw didn't seem to care).

  • Property svn:eol-style set to native
File size: 4.2 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Oliver Scheuss
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29
30#ifndef _Gamestate_H__
31#define _Gamestate_H__
32
33#include "network/NetworkPrereqs.h"
34
35#include <cassert>
36#include <cstring>
37#include <list>
38
39#include "util/CRC32.h"
40#include "network/TrafficControl.h"
41#include "Packet.h"
42
43namespace orxonox {
44
45namespace packet {
46
47class _NetworkExport GamestateHeader{
48  public:
49    GamestateHeader(uint8_t *data){ assert(data); data_ = data; *(uint32_t*)data_ = ENUM::Gamestate; }
50    GamestateHeader(uint8_t *data, GamestateHeader* h)
51    { assert(data); data_=data; memcpy(data_, h->data_, getSize()); }
52    static inline uint32_t getSize()
53    { return 21; }
54
55    inline int32_t getID() const
56    { assert(data_); return *(int32_t*)(data_+4); }
57    inline void setID(int32_t id)
58    { assert(data_); *(int32_t*)(data_+4) = id; }
59
60    inline int32_t getBaseID() const
61    { assert(data_); return *(int32_t*)(data_+8); }
62    inline void setBaseID(int32_t id)
63    { assert(data_); *(int32_t*)(data_+8) = id; }
64
65    inline uint32_t getDataSize() const
66    { assert(data_); return *(uint32_t*)(data_+12); }
67    inline void setDataSize(uint32_t size)
68    { assert(data_); *(uint32_t*)(data_+12) = size; }
69
70    inline uint32_t getCompSize() const
71    { assert(data_); return *(uint32_t*)(data_+16); }
72    inline void setCompSize(uint32_t size)
73    { assert(data_); *(uint32_t*)(data_+16) = size; }
74
75    inline bool isDiffed() const
76    { assert(data_); return *(int8_t*)(data_+20) & 0x1; }
77    inline void setDiffed(bool b)
78    { assert(data_); *(int8_t*)(data_+20) = (b<<0) | (*(int8_t*)(data_+20) & 0x6 ); }
79
80    inline bool isComplete() const
81    { assert(data_); return *(int8_t*)(data_+20) & 0x2; }
82    inline void setComplete(bool b)
83    { assert(data_); *(int8_t*)(data_+20) = (b<<1) | (*(int8_t*)(data_+20) & 0x5 ); }
84
85    inline bool isCompressed() const
86    { assert(data_); return *(int8_t*)(data_+20) & 0x4; }
87    inline void setCompressed(bool b)
88    { assert(data_); *(int8_t*)(data_+20) = (b<<2) | (*(int8_t*)(data_+20) & 0x3 ); }
89
90    inline void operator=(GamestateHeader& h)
91    { assert(data_); assert(h.data_); memcpy( data_, h.data_, getSize()); }
92  private:
93    uint8_t *data_;
94
95};
96
97/**
98        @author Oliver Scheuss
99*/
100class _NetworkExport Gamestate: public Packet{
101  public:
102    Gamestate();
103    Gamestate(uint8_t *data, unsigned int clientID);
104    Gamestate(uint8_t *data);
105    Gamestate(const Gamestate& g);
106
107    ~Gamestate();
108
109    bool collectData(int id, uint8_t mode=0x0);
110    bool spreadData( uint8_t mode=0x0);
111    inline int32_t getID() const { return header_->getID(); }
112    inline bool isDiffed() const { return header_->isDiffed(); }
113    inline bool isCompressed() const { return header_->isCompressed(); }
114    inline int32_t getBaseID() const { return header_->getBaseID(); }
115    Gamestate *diff(Gamestate *base);
116    Gamestate *undiff(Gamestate *base);
117    Gamestate* doSelection(unsigned int clientID, unsigned int targetSize);
118    bool compressData();
119    bool decompressData();
120    bool operator ==(packet::Gamestate gs);
121
122    // Packet functions
123  private:
124    void rawDiff( uint8_t* newdata, uint8_t* data, uint8_t* basedata, uint32_t datalength, uint32_t baselength);
125    virtual uint32_t getSize() const;
126    virtual inline bool process();
127
128  private:
129    uint32_t calcGamestateSize(int32_t id, uint8_t mode=0x0);
130    std::list<obj> dataVector_;
131    GamestateHeader* header_;
132};
133
134}
135
136}
137
138#endif /* _Gamestate_H__ */
Note: See TracBrowser for help on using the repository browser.