Changeset c666518 in network-game for common/Game.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
  • common/Game.cpp

    r84754c0 rc666518  
    235235}
    236236
    237 bool Game::handleGameEvents() {
    238    map<unsigned int, Player*>::iterator it;
    239    bool gameFinished = false;
    240 
    241    for (it = this->getPlayers().begin(); it != this->getPlayers().end(); it++) {
    242       gameFinished = gameFinished || this->handlePlayerEvents(it->second);
    243    }
    244 
    245    if (gameFinished) {
    246       for (it = this->players.begin(); it != this->players.end(); it++) {
    247          it->second->currentGame = NULL;
    248       }
    249    }
    250 
    251    return gameFinished;
    252 }
    253 
    254 bool Game::handlePlayerEvents(Player* p) {
    255    NETWORK_MSG serverMsg;
    256    FLOAT_POSITION oldPos;
    257    bool gameFinished = false;
    258    bool broadcastMove = false;
    259 
    260    cout << "moving player" << endl;
    261 
    262    // move player and perform associated tasks
    263    oldPos = p->pos;
    264    if (p->move(this->worldMap)) {
    265 
    266       cout << "player moved" << endl;
    267       if (this->processPlayerMovement(p, oldPos))
    268          broadcastMove = true;
    269       cout << "player move processed" << endl;
    270 
    271       ObjectType flagType;
    272       POSITION pos;
    273       bool flagTurnedIn = false;
    274       bool flagReturned = false;
    275       bool ownFlagAtBase = false;
    276 
    277       switch(this->worldMap->getStructure(p->pos.x/25, p->pos.y/25)) {
    278          case STRUCTURE_BLUE_FLAG:
    279          {
    280             if (p->team == 0 && p->hasRedFlag) {
    281                // check that your flag is at your base
    282                pos = this->worldMap->getStructureLocation(STRUCTURE_BLUE_FLAG);
    283                            
    284                vector<WorldMap::Object>* vctObjects = this->worldMap->getObjects();
    285                vector<WorldMap::Object>::iterator itObjects;
    286 
    287                for (itObjects = vctObjects->begin(); itObjects != vctObjects->end(); itObjects++) {
    288                   if (itObjects->type == OBJECT_BLUE_FLAG) {
    289                      if (itObjects->pos.x == pos.x*25+12 && itObjects->pos.y == pos.y*25+12) {
    290                         ownFlagAtBase = true;
    291                         break;
    292                      }
    293                   }
    294                }
    295 
    296                if (ownFlagAtBase) {
    297                   p->hasRedFlag = false;
    298                   flagType = OBJECT_RED_FLAG;
    299                   pos = this->worldMap->getStructureLocation(STRUCTURE_RED_FLAG);
    300                   flagTurnedIn = true;
    301                   this->blueScore++;
    302                }
    303             }
    304 
    305             break;
    306          }
    307          case STRUCTURE_RED_FLAG:
    308          {
    309             if (p->team == 1 && p->hasBlueFlag) {
    310                // check that your flag is at your base
    311                pos = this->worldMap->getStructureLocation(STRUCTURE_RED_FLAG);
    312                        
    313                vector<WorldMap::Object>* vctObjects = this->worldMap->getObjects();
    314                vector<WorldMap::Object>::iterator itObjects;
    315 
    316                for (itObjects = vctObjects->begin(); itObjects != vctObjects->end(); itObjects++) {
    317                   if (itObjects->type == OBJECT_RED_FLAG) {
    318                      if (itObjects->pos.x == pos.x*25+12 && itObjects->pos.y == pos.y*25+12) {
    319                         ownFlagAtBase = true;
    320                         break;
    321                      }
    322                   }
    323                }
    324 
    325                if (ownFlagAtBase) {
    326                   p->hasBlueFlag = false;
    327                   flagType = OBJECT_BLUE_FLAG;
    328                   pos = this->worldMap->getStructureLocation(STRUCTURE_BLUE_FLAG);
    329                   flagTurnedIn = true;
    330                   this->redScore++;
    331                }
    332             }
    333 
    334             break;
    335          }
    336          default:
    337          {
    338             break;
    339          }
    340       }
    341 
    342       if (flagTurnedIn) {
    343          unsigned int blueScore = this->blueScore;
    344          unsigned int redScore = this->redScore;
    345 
    346          pos.x = pos.x*25+12;
    347          pos.y = pos.y*25+12;
    348          this->addObjectToMap(flagType, pos.x, pos.y);
    349 
    350          serverMsg.type = MSG_TYPE_SCORE;
    351          memcpy(serverMsg.buffer, &blueScore, 4);
    352          memcpy(serverMsg.buffer+4, &redScore, 4);
    353          msgProcessor->broadcastMessage(serverMsg, this->players);
    354 
    355          // check to see if the game should end
    356          // move to its own method
    357          if (this->blueScore == 3 || this->redScore == 3) {
    358             gameFinished = true;
    359 
    360             unsigned int winningTeam;
    361             if (this->blueScore == 3)
    362                winningTeam = 0;
    363             else if (this->redScore == 3)
    364                winningTeam = 1;
    365 
    366             serverMsg.type = MSG_TYPE_FINISH_GAME;
    367 
    368             // I should create an instance of the GameSummary object here and just serialize it into this message
    369             memcpy(serverMsg.buffer, &winningTeam, 4);
    370             memcpy(serverMsg.buffer+4, &blueScore, 4);
    371             memcpy(serverMsg.buffer+8, &redScore, 4);
    372             strcpy(serverMsg.buffer+12, this->getName().c_str());
    373             msgProcessor->broadcastMessage(serverMsg, this->players);
    374          }
    375 
    376          // this means a PLAYER message will be sent
    377          broadcastMove = true;
    378       }
    379 
    380       // go through all objects and check if the player is close to one and if its their flag
    381       vector<WorldMap::Object>* vctObjects = this->worldMap->getObjects();
    382       vector<WorldMap::Object>::iterator itObjects;
    383       POSITION structPos;
    384 
    385       for (itObjects = vctObjects->begin(); itObjects != vctObjects->end(); itObjects++) {
    386          POSITION pos = itObjects->pos;
    387 
    388          if (posDistance(p->pos, pos.toFloat()) < 10) {
    389             if (p->team == 0 && itObjects->type == OBJECT_BLUE_FLAG) {
    390                structPos = this->worldMap->getStructureLocation(STRUCTURE_BLUE_FLAG);
    391                flagReturned = true;
    392                break;
    393             } else if (p->team == 1 && itObjects->type == OBJECT_RED_FLAG) {
    394                structPos = this->worldMap->getStructureLocation(STRUCTURE_RED_FLAG);
    395                flagReturned = true;
    396                break;
    397             }
    398          }
    399       }
    400 
    401       if (flagReturned) {
    402          itObjects->pos.x = structPos.x*25+12;
    403          itObjects->pos.y = structPos.y*25+12;
    404 
    405          serverMsg.type = MSG_TYPE_OBJECT;
    406          itObjects->serialize(serverMsg.buffer);
    407          msgProcessor->broadcastMessage(serverMsg, this->players);
    408       }
    409 
    410       if (broadcastMove) {
    411          serverMsg.type = MSG_TYPE_PLAYER;
    412          p->serialize(serverMsg.buffer);
    413          msgProcessor->broadcastMessage(serverMsg, this->players);
    414       }
    415    }
    416 
    417    cout << "processing player attack" << endl;
    418 
    419    // check if the player's attack animation is complete
    420    if (p->isAttacking && p->timeAttackStarted+p->attackCooldown <= getCurrentMillis()) {
    421       p->isAttacking = false;
    422       cout << "Attack animation is complete" << endl;
    423 
    424       //send everyone an ATTACK message
    425       cout << "about to broadcast attack" << endl;
    426 
    427       if (p->attackType == Player::ATTACK_MELEE) {
    428          cout << "Melee attack" << endl;
    429 
    430          Player* target = players[p->getTargetPlayer()];
    431          this->dealDamageToPlayer(target, p->damage);
    432       } else if (p->attackType == Player::ATTACK_RANGED) {
    433          cout << "Ranged attack" << endl;
    434 
    435          Projectile proj(p->pos.x, p->pos.y, p->getTargetPlayer(), p->damage);
    436          this->assignProjectileId(&proj);
    437          this->addProjectile(proj);
    438 
    439          int x = p->pos.x;
    440          int y = p->pos.y;
    441          unsigned int targetId = p->getTargetPlayer();
    442 
    443          serverMsg.type = MSG_TYPE_PROJECTILE;
    444          memcpy(serverMsg.buffer, &proj.id, 4);
    445          memcpy(serverMsg.buffer+4, &x, 4);
    446          memcpy(serverMsg.buffer+8, &y, 4);
    447          memcpy(serverMsg.buffer+12, &targetId, 4);
    448          msgProcessor->broadcastMessage(serverMsg, players);
    449       } else
    450          cout << "Invalid attack type: " << p->attackType << endl;
    451    }
    452 
    453    return gameFinished;
    454 }
    455 
    456237void Game::assignProjectileId(Projectile* p) {
    457238   p->id = unusedProjectileId;
Note: See TracChangeset for help on using the changeset viewer.