Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 342 was 337, checked in by bknecht, 17 years ago

merged merger to FICN branch

File size: 3.5 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       
98      }
99    } else {
100      // we have our object
101      if(! it->updateData(sync))
102        std::cout << "We couldn't update objectID: " \
103          << sync.objectID << "; classID: " << sync.classID << std::endl;
104    }
105   
106  }
107 
108 
109}
110
111/**
112 * This function removes a Synchronisable out of the universe
113 * @param it iterator of the list pointing to the object
114 * @return iterator pointing to the next object in the list
115 */
116// orxonox::Iterator<Synchronisable> removeObject(orxonox::Iterator<Synchronisable> it){
117void removeObject(orxonox::Iterator<Synchronisable> &it){
118  orxonox::Iterator<Synchronisable> temp=it;
119  ++it;
120  delete  *temp;
121//   return it;
122}
123
124
125}
126
127
Note: See TracBrowser for help on using the repository browser.