Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Dec 9, 2007, 12:42:46 PM (16 years ago)
Author:
scheusso
Message:

extended gamestatehandling for diffed and not diffed gamestates (initial states, etc)

File:
1 edited

Legend:

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

    r425 r436  
    1414namespace network {
    1515
    16 GameStateManager::GameStateManager()
     16GameStateManager::GameStateManager(ClientInformation *head)
    1717{
    1818  id=0;
     19  head_=head;
    1920}
    2021
     
    2526void GameStateManager::update(){
    2627  reference = getSnapshot(id);
    27   idGameState[id]=reference;
     28  gameStateMap.insert(std::pair<int, GameState*>(id, reference));
     29  gameStateUsed[id]=0;
    2830  ++id;
    2931  return;
     
    3133
    3234GameStateCompressed GameStateManager::popGameState(int clientID){
    33   GameState *client = clientGameState[clientID];
     35  int gID = head_->findClient(clientID)->getGamestateID();
     36  if(gID!=GAMESTATEID_INITIAL){
     37    GameState *client = gameStateMap[gID];
     38    GameState *server = reference;
     39    return encode(client, server);
     40  }
    3441  GameState *server = reference;
    35   return encode(client, server);
     42  return encode(server);
     43  // return an undiffed gamestate and set appropriate flags
    3644}
    3745
     
    8593
    8694GameStateCompressed GameStateManager::encode(GameState *a, GameState *b){
    87   GameState r = diff(a,b);
    88   return compress_(r);
     95    GameState r = diff(a,b);
     96  r.diffed = true;
     97  return compress_(&r);
    8998}
    9099
     100GameStateCompressed GameStateManager::encode(GameState *a){
     101  a->diffed=false;
     102  return compress_(a);
     103}
    91104
    92105GameState GameStateManager::diff(GameState *a, GameState *b){
     
    122135}
    123136
    124 GameStateCompressed GameStateManager::compress_(GameState a) {
    125   int size = a.size;
    126   uLongf buffer = (uLongf)((a.size + 12)*1.01)+1;
     137GameStateCompressed GameStateManager::compress_(GameState *a) {
     138  int size = a->size;
     139  uLongf buffer = (uLongf)((a->size + 12)*1.01)+1;
    127140  unsigned char* dest = (unsigned char*)malloc( buffer );
    128141  int retval;
    129   retval = compress( dest, &buffer, a.data, (uLong)size ); 
     142  retval = compress( dest, &buffer, a->data, (uLong)size ); 
    130143 
    131144  switch ( retval ) {
     
    141154  compressedGamestate.id = GAMESTATE;
    142155  compressedGamestate.data = dest;
     156  compressedGamestate.diffed = a->diffed;
    143157 
    144158  return compressedGamestate;
     
    146160
    147161void GameStateManager::ackGameState(int clientID, int gamestateID){
     162  ClientInformation *temp = head_->findClient(clientID);
     163  int curid = temp->getID();
     164  // decrease usage of gamestate and save it
     165  deleteUnusedGameState(curid);
     166  //increase gamestateused
     167  ++gameStateUsed.find(gamestateID)->second;
     168  temp->setGamestateID(gamestateID);
     169  /*
    148170  GameState *old = clientGameState[clientID];
    149171  deleteUnusedGameState(old);
    150   clientGameState[clientID]=idGameState[gamestateID];
     172  clientGameState[clientID]=idGameState[gamestateID];*/
    151173}
    152174
    153 bool GameStateManager::deleteUnusedGameState(GameState *state){
    154   for(unsigned int i=0; i<clientGameState.size(); i++){
    155     if(clientGameState[i]==state)
    156       return false;
     175bool GameStateManager::deleteUnusedGameState(int gamestateID){
     176  int used = --(gameStateUsed.find(gamestateID)->second);
     177  if(id-gamestateID>KEEP_GAMESTATES && used==0){
     178    // delete gamestate
     179    delete gameStateMap.find(gamestateID)->second;
     180    gameStateMap.erase(gamestateID);
     181    return true;
    157182  }
    158   delete state;
    159   return true;
    160 }
    161 
    162 void GameStateManager::removeClient(int clientID){
    163   clientGameState.erase(clientGameState.begin()+clientID);
     183  return false;
    164184}
    165185
Note: See TracChangeset for help on using the changeset viewer.