Changeset c666518 in network-game for server/server.cpp


Ignore:
Timestamp:
Oct 17, 2014, 1:19:28 AM (10 years ago)
Author:
Dmitry Portnoy <dmp1488@…>
Branches:
master
Children:
aee0634
Parents:
84754c0
Message:

Move handleGameEvents and handlePlayers events from the Game class to the server

File:
1 edited

Legend:

Unmodified
Added
Removed
  • server/server.cpp

    r84754c0 rc666518  
    4747Player *findPlayerByName(map<unsigned int, Player*> &m, string name);
    4848Player *findPlayerByAddr(map<unsigned int, Player*> &m, const sockaddr_in &addr);
     49
     50bool handleGameEvents(Game* game, MessageProcessor* msgProcessor, DataAccess* da);
     51bool handlePlayerEvents(Game* game, Player* p, MessageProcessor* msgProcessor, DataAccess* da);
    4952
    5053void quit(int sig);
     
    178181         map<string, Game*>::iterator itGames;
    179182         Game* game = NULL;
     183         DataAccess da;
    180184
    181185         for (itGames = mapGames.begin(); itGames != mapGames.end();) {
    182186            game = itGames->second;
    183             if (game->handleGameEvents()) {
     187            bool gameFinished = handleGameEvents(game, &msgProcessor, &da);
     188
     189            if (gameFinished) {
    184190               // save game record
    185191               int winningTeam = -1;
     
    193199               else {
    194200                  map<unsigned int, Player*>::iterator it;
    195                   DataAccess da;
    196201
    197202                  for (it = game->getPlayers().begin(); it != game->getPlayers().end(); it++) {
    198                       da.saveGameHistory(it->second->getId(), winningTeam, game->getBlueScore(), game->getRedScore());
     203                      Player* p = it->second;
     204                      cout << "winning team: " << winningTeam << endl;
     205                      cout << "player team: " << p->team << endl;
     206                      cout << "player id: " << p->getId() << endl;
     207                     
     208                      if (winningTeam == p->team)
     209                          p->wins++;
     210                      else
     211                          p->losses++;
     212                      da.updatePlayer(p);
     213                      da.saveGameHistory(p->getId(), winningTeam, game->getBlueScore(), game->getRedScore());
    199214                  }
    200215               }
     
    585600         int* playerRecord = da.getPlayerRecord(id);
    586601
    587          int honorPoints = playerRecord[0];
    588          int wins = playerRecord[1];
    589          int losses = playerRecord[2];
     602         // playerRecord[0] is level
     603         // playerRecord[1] is experience
     604         int honorPoints = playerRecord[2];
     605         int wins = playerRecord[3];
     606         int losses = playerRecord[4];
    590607
    591608         serverMsg.type = MSG_TYPE_PROFILE;
     
    860877}
    861878
     879bool handleGameEvents(Game* game, MessageProcessor* msgProcessor, DataAccess* da) {
     880   map<unsigned int, Player*> players = game->getPlayers();
     881   map<unsigned int, Player*>::iterator it;
     882   bool gameFinished = false;
     883
     884   for (it = players.begin(); it != players.end(); it++) {
     885      gameFinished = gameFinished || handlePlayerEvents(game, it->second, msgProcessor, da);
     886   }
     887
     888   if (gameFinished) {
     889      for (it = players.begin(); it != players.end(); it++) {
     890         it->second->currentGame = NULL;
     891      }
     892   }
     893
     894   return gameFinished;
     895}
     896
     897bool handlePlayerEvents(Game* game, Player* p, MessageProcessor* msgProcessor, DataAccess* da) {
     898   NETWORK_MSG serverMsg;
     899   FLOAT_POSITION oldPos;
     900   bool gameFinished = false;
     901   bool broadcastMove = false;
     902
     903   cout << "moving player" << endl;
     904
     905   // move player and perform associated tasks
     906   oldPos = p->pos;
     907   if (p->move(game->getMap())) {
     908
     909      cout << "player moved" << endl;
     910      if (game->processPlayerMovement(p, oldPos))
     911         broadcastMove = true;
     912      cout << "player move processed" << endl;
     913
     914      ObjectType flagType;
     915      POSITION pos;
     916      bool flagTurnedIn = false;
     917      bool flagReturned = false;
     918      bool ownFlagAtBase = false;
     919
     920      switch(game->getMap()->getStructure(p->pos.x/25, p->pos.y/25)) {
     921         case STRUCTURE_BLUE_FLAG:
     922         {
     923            if (p->team == 0 && p->hasRedFlag) {
     924               // check that your flag is at your base
     925               pos = game->getMap()->getStructureLocation(STRUCTURE_BLUE_FLAG);
     926                           
     927               vector<WorldMap::Object>* vctObjects = game->getMap()->getObjects();
     928               vector<WorldMap::Object>::iterator itObjects;
     929
     930               for (itObjects = vctObjects->begin(); itObjects != vctObjects->end(); itObjects++) {
     931                  if (itObjects->type == OBJECT_BLUE_FLAG) {
     932                     if (itObjects->pos.x == pos.x*25+12 && itObjects->pos.y == pos.y*25+12) {
     933                        ownFlagAtBase = true;
     934                        break;
     935                     }
     936                  }
     937               }
     938
     939               if (ownFlagAtBase) {
     940                  p->hasRedFlag = false;
     941                  flagType = OBJECT_RED_FLAG;
     942                  pos = game->getMap()->getStructureLocation(STRUCTURE_RED_FLAG);
     943                  flagTurnedIn = true;
     944                  game->setBlueScore(game->getBlueScore()+1);
     945               }
     946            }
     947
     948            break;
     949         }
     950         case STRUCTURE_RED_FLAG:
     951         {
     952            if (p->team == 1 && p->hasBlueFlag) {
     953               // check that your flag is at your base
     954               pos = game->getMap()->getStructureLocation(STRUCTURE_RED_FLAG);
     955                       
     956               vector<WorldMap::Object>* vctObjects = game->getMap()->getObjects();
     957               vector<WorldMap::Object>::iterator itObjects;
     958
     959               for (itObjects = vctObjects->begin(); itObjects != vctObjects->end(); itObjects++) {
     960                  if (itObjects->type == OBJECT_RED_FLAG) {
     961                     if (itObjects->pos.x == pos.x*25+12 && itObjects->pos.y == pos.y*25+12) {
     962                        ownFlagAtBase = true;
     963                        break;
     964                     }
     965                  }
     966               }
     967
     968               if (ownFlagAtBase) {
     969                  p->hasBlueFlag = false;
     970                  flagType = OBJECT_BLUE_FLAG;
     971                  pos = game->getMap()->getStructureLocation(STRUCTURE_BLUE_FLAG);
     972                  flagTurnedIn = true;
     973                  game->setRedScore(game->getRedScore()+1);
     974               }
     975            }
     976
     977            break;
     978         }
     979         default:
     980         {
     981            break;
     982         }
     983      }
     984
     985      if (flagTurnedIn) {
     986         unsigned int blueScore = game->getBlueScore();
     987         unsigned int redScore = game->getRedScore();
     988
     989         pos.x = pos.x*25+12;
     990         pos.y = pos.y*25+12;
     991         game->addObjectToMap(flagType, pos.x, pos.y);
     992
     993         serverMsg.type = MSG_TYPE_SCORE;
     994         memcpy(serverMsg.buffer, &blueScore, 4);
     995         memcpy(serverMsg.buffer+4, &redScore, 4);
     996         msgProcessor->broadcastMessage(serverMsg, game->getPlayers());
     997
     998         // give honor to everyone on the winning team
     999         map<unsigned int, Player*>::iterator itPlayers;
     1000         for (itPlayers = game->getPlayers().begin(); itPlayers != game->getPlayers().end(); itPlayers++) {
     1001            if (itPlayers->second->team == p->team) {
     1002               itPlayers->second->honor += 50;
     1003               da->updatePlayer(itPlayers->second);
     1004            }
     1005         }
     1006
     1007         // check to see if the game should end
     1008         // move to its own method
     1009         if (game->getBlueScore() == 3 || game->getRedScore() == 3) {
     1010            gameFinished = true;
     1011
     1012            unsigned int winningTeam;
     1013            if (game->getBlueScore() == 3)
     1014               winningTeam = 0;
     1015            else if (game->getRedScore() == 3)
     1016               winningTeam = 1;
     1017
     1018            serverMsg.type = MSG_TYPE_FINISH_GAME;
     1019
     1020            // I should create an instance of the GameSummary object here and just serialize it into this message
     1021            memcpy(serverMsg.buffer, &winningTeam, 4);
     1022            memcpy(serverMsg.buffer+4, &blueScore, 4);
     1023            memcpy(serverMsg.buffer+8, &redScore, 4);
     1024            strcpy(serverMsg.buffer+12, game->getName().c_str());
     1025            msgProcessor->broadcastMessage(serverMsg, game->getPlayers());
     1026
     1027            // give honor to everyone on the winning team
     1028            for (itPlayers = game->getPlayers().begin(); itPlayers != game->getPlayers().end(); itPlayers++) {
     1029               if (itPlayers->second->team == p->team) {
     1030                  itPlayers->second->honor += 150;
     1031                  da->updatePlayer(itPlayers->second);
     1032               }
     1033            }
     1034         }
     1035
     1036         // this means a PLAYER message will be sent
     1037         broadcastMove = true;
     1038      }
     1039
     1040      // go through all objects and check if the player is close to one and if its their flag
     1041      vector<WorldMap::Object>* vctObjects = game->getMap()->getObjects();
     1042      vector<WorldMap::Object>::iterator itObjects;
     1043      POSITION structPos;
     1044
     1045      for (itObjects = vctObjects->begin(); itObjects != vctObjects->end(); itObjects++) {
     1046         POSITION pos = itObjects->pos;
     1047
     1048         if (posDistance(p->pos, pos.toFloat()) < 10) {
     1049            if (p->team == 0 && itObjects->type == OBJECT_BLUE_FLAG) {
     1050               structPos = game->getMap()->getStructureLocation(STRUCTURE_BLUE_FLAG);
     1051               flagReturned = true;
     1052               break;
     1053            } else if (p->team == 1 && itObjects->type == OBJECT_RED_FLAG) {
     1054               structPos = game->getMap()->getStructureLocation(STRUCTURE_RED_FLAG);
     1055               flagReturned = true;
     1056               break;
     1057            }
     1058         }
     1059      }
     1060
     1061      if (flagReturned) {
     1062         itObjects->pos.x = structPos.x*25+12;
     1063         itObjects->pos.y = structPos.y*25+12;
     1064
     1065         serverMsg.type = MSG_TYPE_OBJECT;
     1066         itObjects->serialize(serverMsg.buffer);
     1067         msgProcessor->broadcastMessage(serverMsg, game->getPlayers());
     1068      }
     1069
     1070      if (broadcastMove) {
     1071         serverMsg.type = MSG_TYPE_PLAYER;
     1072         p->serialize(serverMsg.buffer);
     1073         msgProcessor->broadcastMessage(serverMsg, game->getPlayers());
     1074      }
     1075   }
     1076
     1077   cout << "processing player attack" << endl;
     1078
     1079   // check if the player's attack animation is complete
     1080   if (p->isAttacking && p->timeAttackStarted+p->attackCooldown <= getCurrentMillis()) {
     1081      p->isAttacking = false;
     1082      cout << "Attack animation is complete" << endl;
     1083
     1084      //send everyone an ATTACK message
     1085      cout << "about to broadcast attack" << endl;
     1086
     1087      if (p->attackType == Player::ATTACK_MELEE) {
     1088         cout << "Melee attack" << endl;
     1089
     1090         Player* target = game->getPlayers()[p->getTargetPlayer()];
     1091         game->dealDamageToPlayer(target, p->damage);
     1092      } else if (p->attackType == Player::ATTACK_RANGED) {
     1093         cout << "Ranged attack" << endl;
     1094
     1095         Projectile proj(p->pos.x, p->pos.y, p->getTargetPlayer(), p->damage);
     1096         game->assignProjectileId(&proj);
     1097         game->addProjectile(proj);
     1098
     1099         int x = p->pos.x;
     1100         int y = p->pos.y;
     1101         unsigned int targetId = p->getTargetPlayer();
     1102
     1103         serverMsg.type = MSG_TYPE_PROJECTILE;
     1104         memcpy(serverMsg.buffer, &proj.id, 4);
     1105         memcpy(serverMsg.buffer+4, &x, 4);
     1106         memcpy(serverMsg.buffer+8, &y, 4);
     1107         memcpy(serverMsg.buffer+12, &targetId, 4);
     1108         msgProcessor->broadcastMessage(serverMsg, game->getPlayers());
     1109      } else
     1110         cout << "Invalid attack type: " << p->attackType << endl;
     1111   }
     1112
     1113   return gameFinished;
     1114}
     1115
    8621116void quit(int sig) {
    8631117   done = true;
Note: See TracChangeset for help on using the changeset viewer.