Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/FICN/src/network/GameStateManager.cc @ 369

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

PacketDecoder:

Extended Class to make inheriting easier…

-added virtual function, that can be implemented by lower classes

Client:

Added some function, changed some things (input, gamestate, connectionhandling)

Server:

same as client

File size: 3.8 KB
Line 
1//
2// C++ Implementation: GameStateManager
3//
4// Description:
5//
6//
7// Author:  Oliver Scheuss, (C) 2007
8//
9// Copyright: See COPYING file that comes with this distribution
10//
11//
12#include "GameStateManager.h"
13
14namespace network {
15
16GameStateManager::GameStateManager()
17{
18}
19
20GameStateManager::~GameStateManager()
21{
22}
23
24/**
25 * This function goes through the whole list of synchronisables and
26 * saves all the synchronisables to a flat "list".
27 * @return struct of type gamestate containing the size of the whole gamestate and a pointer linking to the flat list
28 */
29GameState GameStateManager::getSnapshot(int id)
30{
31  //the size of the gamestate
32  int totalsize=0;
33  //the size of one specific synchronisable
34  int tempsize=0;
35  // get the start of the Synchronisable list
36  orxonox::Iterator<Synchronisable> it;
37  // struct for return value of Synchronisable::getData()
38  syncData sync;
39 
40  GameState retval; //return value
41  retval.id=id;
42  // reserve a little memory and increase it later on
43  retval.data = (unsigned char*)malloc(1);
44 
45  // offset of memory functions
46  int offset=0;
47  // go through all Synchronisables
48  for(it = orxonox::ObjectList<Synchronisable>::start(); it != 0; ++it){
49    //get size of the synchronisable
50    tempsize=it->getSize();
51    // add place for data and 3 ints (length,classid,objectid)
52    totalsize+=tempsize+3*sizeof(int);
53    // allocate additional space
54    retval.data = (unsigned char *)realloc((void *)retval.data, totalsize);
55   
56    // run Synchronisable::getData with offset and additional place for 3 ints in between (for ids and length)
57    sync=it->getData(retval.data+offset+3*sizeof(int));
58    *(retval.data+offset)=sync.length;
59    *(retval.data+offset+sizeof(int))=sync.objectID;
60    *(retval.data+offset+2*sizeof(int))=sync.classID;
61    // increase data pointer
62    offset+=tempsize+3*sizeof(int);
63  }
64  retval.size=totalsize;
65  return retval;
66}
67
68/**
69 * This function loads a Snapshort of the gamestate into the universe
70 * @param state a GameState struct containing the size of the gamestate and a pointer linking to a flat list (returned by getSnapshot)
71 */
72bool GameStateManager::loadSnapshot(GameState state)
73{
74  unsigned char *data=state.data;
75  // get the start of the Synchronisable list
76  orxonox::Iterator<Synchronisable> it=orxonox::ObjectList<Synchronisable>::start();
77  syncData sync;
78  // loop as long as we have some data ;)
79  while(data < state.data+state.size){
80    // prepare the syncData struct
81    sync.length = *(int *)data;
82    data+=sizeof(int);
83    sync.objectID = *(int *)data;
84    data+=sizeof(int);
85    sync.classID = *(int *)data;
86    data+=sizeof(int);
87    sync.data = data;
88    data+=sync.length;
89   
90    if(it->objectID!=sync.objectID){
91      // bad luck ;)
92      // delete the synchronisable (obviously seems to be deleted on the server)
93      while(it != 0 && it->objectID!=sync.objectID){
94        removeObject(it);
95      }
96      if(it==0){  // add the new object
97        // =================== factory command to add object
98        // can we be sure the object really was added?
99        it=orxonox::ObjectList<Synchronisable>::end();
100        it->objectID=sync.objectID;
101        it->classID=sync.classID;
102      }
103    } else {
104      // we have our object
105      if(! it->updateData(sync))
106        std::cout << "We couldn't update objectID: " \
107          << sync.objectID << "; classID: " << sync.classID << std::endl;
108    }
109   
110  }
111 
112  return true;
113}
114
115/**
116 * This function removes a Synchronisable out of the universe
117 * @param it iterator of the list pointing to the object
118 * @return iterator pointing to the next object in the list
119 */
120// orxonox::Iterator<Synchronisable> removeObject(orxonox::Iterator<Synchronisable> it){
121void GameStateManager::removeObject(orxonox::Iterator<Synchronisable> &it){
122  orxonox::Iterator<Synchronisable> temp=it;
123  ++it;
124  delete  *temp;
125//   return it;
126}
127
128
129}
130
131
Note: See TracBrowser for help on using the repository browser.