Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/presentation/src/network/packet/Gamestate.h @ 2655

Last change on this file since 2655 was 2655, checked in by scheusso, 16 years ago

finally got rid of these structs in our network datastream
this means we should now be able to play with gcc and msvc compiled versions together

  • Property svn:eol-style set to native
File size: 4.1 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, (C) 2008
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29
30#ifndef NETWORK_PACKETGAMESTATE_H
31#define NETWORK_PACKETGAMESTATE_H
32
33#include "network/NetworkPrereqs.h"
34
35#include "Packet.h"
36#include "network/TrafficControl.h"
37#include "core/CoreIncludes.h"
38#include <map>
39#include <list>
40#ifndef NDEBUG
41#include "util/CRC32.h"
42#endif
43
44namespace orxonox {
45
46namespace packet {
47
48class _NetworkExport GamestateHeader{
49  public:
50    GamestateHeader(uint8_t *data){ data_ = data; *(uint32_t*)data_ = ENUM::Gamestate; }
51    GamestateHeader(uint8_t *data, GamestateHeader* h)
52      { data_=data; memcpy(data_, h->data_, getSize()); }
53    static inline uint32_t getSize()
54      { return 21; }
55
56    inline int32_t getID() const
57      { return *(int32_t*)(data_+4); }
58    inline void setID(int32_t id)
59      { *(int32_t*)(data_+4) = id; }
60
61    inline int32_t getBaseID() const
62      { return *(int32_t*)(data_+8); }
63    inline void setBaseID(int32_t id)
64      { *(int32_t*)(data_+8) = id; }
65
66    inline uint32_t getDataSize() const
67      { return *(uint32_t*)(data_+12); }
68    inline void setDataSize(uint32_t size)
69      { *(uint32_t*)(data_+12) = size; }
70
71    inline uint32_t getCompSize() const
72      { return *(uint32_t*)(data_+16); }
73    inline void setCompSize(uint32_t size)
74      { *(uint32_t*)(data_+16) = size; }
75
76    inline bool isDiffed() const
77      { return *(int8_t*)(data_+20) & 0x1; }
78    inline void setDiffed(bool b)
79      { *(int8_t*)(data_+20) = (b<<0) | (*(int8_t*)(data_+20) & 0x6 ); }
80
81    inline bool isComplete() const
82      { return *(int8_t*)(data_+20) & 0x2; }
83    inline void setComplete(bool b)
84      { *(int8_t*)(data_+20) = (b<<1) | (*(int8_t*)(data_+20) & 0x5 ); }
85
86    inline bool isCompressed() const
87      { return *(int8_t*)(data_+20) & 0x4; }
88    inline void setCompressed(bool b)
89      { *(int8_t*)(data_+20) = (b<<2) | (*(int8_t*)(data_+20) & 0x3 ); }
90
91    inline void operator=(GamestateHeader& h)
92      { memcpy( data_, h.data_, getSize()); }
93  private:
94    uint8_t *data_;
95//#define GAMESTATE_START(data) (data + sizeof(GamestateHeader))
96//#define GAMESTATE_HEADER(data) ((GamestateHeader *)data)
97//#define HEADER GAMESTATE_HEADER(data_)
98
99};
100
101/**
102        @author Oliver Scheuss
103*/
104class _NetworkExport Gamestate: public Packet{
105  public:
106    Gamestate();
107    Gamestate(uint8_t *data, unsigned int clientID);
108    Gamestate(uint8_t *data);
109
110    ~Gamestate();
111
112    bool collectData(int id, uint8_t mode=0x0);
113    bool spreadData( uint8_t mode=0x0);
114    inline int32_t getID() const { return header_->getID(); }
115    inline bool isDiffed() const { return header_->isDiffed(); }
116    inline bool isCompressed() const { return header_->isCompressed(); }
117    inline int32_t getBaseID() const { return header_->getBaseID(); }
118    Gamestate *diff(Gamestate *base);
119    Gamestate *undiff(Gamestate *base);
120    Gamestate* doSelection(unsigned int clientID, unsigned int targetSize);
121    bool compressData();
122    bool decompressData();
123
124    // Packet functions
125  private:
126    virtual uint32_t getSize() const;
127    virtual inline bool process();
128
129    bool operator ==(packet::Gamestate gs);
130  private:
131    uint32_t calcGamestateSize(int32_t id, uint8_t mode=0x0);
132    std::list<obj> dataMap_;
133    GamestateHeader* header_;
134};
135
136}
137
138}
139
140#endif
Note: See TracBrowser for help on using the repository browser.