Changeset c666518 in network-game for common/Game.cpp
- Timestamp:
- Oct 17, 2014, 1:19:28 AM (10 years ago)
- Branches:
- master
- Children:
- aee0634
- Parents:
- 84754c0
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
common/Game.cpp
r84754c0 rc666518 235 235 } 236 236 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 tasks263 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 base282 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 base311 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 end356 // move to its own method357 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 message369 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 sent377 broadcastMove = true;378 }379 380 // go through all objects and check if the player is close to one and if its their flag381 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 complete420 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 message425 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 } else450 cout << "Invalid attack type: " << p->attackType << endl;451 }452 453 return gameFinished;454 }455 456 237 void Game::assignProjectileId(Projectile* p) { 457 238 p->id = unusedProjectileId;
Note:
See TracChangeset
for help on using the changeset viewer.