Changeset 436 for code/branches/FICN/src/network/GameStateManager.cc
- Timestamp:
- Dec 9, 2007, 12:42:46 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/FICN/src/network/GameStateManager.cc
r425 r436 14 14 namespace network { 15 15 16 GameStateManager::GameStateManager( )16 GameStateManager::GameStateManager(ClientInformation *head) 17 17 { 18 18 id=0; 19 head_=head; 19 20 } 20 21 … … 25 26 void GameStateManager::update(){ 26 27 reference = getSnapshot(id); 27 idGameState[id]=reference; 28 gameStateMap.insert(std::pair<int, GameState*>(id, reference)); 29 gameStateUsed[id]=0; 28 30 ++id; 29 31 return; … … 31 33 32 34 GameStateCompressed 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 } 34 41 GameState *server = reference; 35 return encode(client, server); 42 return encode(server); 43 // return an undiffed gamestate and set appropriate flags 36 44 } 37 45 … … 85 93 86 94 GameStateCompressed 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); 89 98 } 90 99 100 GameStateCompressed GameStateManager::encode(GameState *a){ 101 a->diffed=false; 102 return compress_(a); 103 } 91 104 92 105 GameState GameStateManager::diff(GameState *a, GameState *b){ … … 122 135 } 123 136 124 GameStateCompressed GameStateManager::compress_(GameState a) {125 int size = a .size;126 uLongf buffer = (uLongf)((a .size + 12)*1.01)+1;137 GameStateCompressed GameStateManager::compress_(GameState *a) { 138 int size = a->size; 139 uLongf buffer = (uLongf)((a->size + 12)*1.01)+1; 127 140 unsigned char* dest = (unsigned char*)malloc( buffer ); 128 141 int retval; 129 retval = compress( dest, &buffer, a .data, (uLong)size );142 retval = compress( dest, &buffer, a->data, (uLong)size ); 130 143 131 144 switch ( retval ) { … … 141 154 compressedGamestate.id = GAMESTATE; 142 155 compressedGamestate.data = dest; 156 compressedGamestate.diffed = a->diffed; 143 157 144 158 return compressedGamestate; … … 146 160 147 161 void 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 /* 148 170 GameState *old = clientGameState[clientID]; 149 171 deleteUnusedGameState(old); 150 clientGameState[clientID]=idGameState[gamestateID]; 172 clientGameState[clientID]=idGameState[gamestateID];*/ 151 173 } 152 174 153 bool GameStateManager::deleteUnusedGameState(GameState *state){ 154 for(unsigned int i=0; i<clientGameState.size(); i++){ 155 if(clientGameState[i]==state) 156 return false; 175 bool 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; 157 182 } 158 delete state; 159 return true; 160 } 161 162 void GameStateManager::removeClient(int clientID){ 163 clientGameState.erase(clientGameState.begin()+clientID); 183 return false; 164 184 } 165 185
Note: See TracChangeset
for help on using the changeset viewer.