Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Nov 28, 2007, 2:41:41 PM (16 years ago)
Author:
scheusso
Message:

implementing GameStateManager

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/network/src/network/GameStateManager.cc

    r290 r314  
    2222}
    2323
    24 GameState GameStateManager::getSnapshot()
     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)
    2530{
     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  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 = malloc(1);
     44 
     45  // offset of memory functions
     46  int offset=0;
     47  // go through all Synchronisables
     48  for(it = 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+*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  Iterator<Synchronisable> it=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    } else {
     93      // we have our object
     94      if(! it->updateData(sync))
     95        std::cout << "We couldn't update objectID: " << sync.objectID << "; classID: " << sync.classID << std::endl;
     96    }
     97  }
    2698 
    2799}
    28100
    29 bool GameStateManager::loadSnapshot(GameState state)
    30 {
    31  
     101
     102
     103
    32104}
    33105
    34 }
     106
Note: See TracChangeset for help on using the changeset viewer.