Changeset c666518 in network-game for server/server.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
-
server/server.cpp
r84754c0 rc666518 47 47 Player *findPlayerByName(map<unsigned int, Player*> &m, string name); 48 48 Player *findPlayerByAddr(map<unsigned int, Player*> &m, const sockaddr_in &addr); 49 50 bool handleGameEvents(Game* game, MessageProcessor* msgProcessor, DataAccess* da); 51 bool handlePlayerEvents(Game* game, Player* p, MessageProcessor* msgProcessor, DataAccess* da); 49 52 50 53 void quit(int sig); … … 178 181 map<string, Game*>::iterator itGames; 179 182 Game* game = NULL; 183 DataAccess da; 180 184 181 185 for (itGames = mapGames.begin(); itGames != mapGames.end();) { 182 186 game = itGames->second; 183 if (game->handleGameEvents()) { 187 bool gameFinished = handleGameEvents(game, &msgProcessor, &da); 188 189 if (gameFinished) { 184 190 // save game record 185 191 int winningTeam = -1; … … 193 199 else { 194 200 map<unsigned int, Player*>::iterator it; 195 DataAccess da;196 201 197 202 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()); 199 214 } 200 215 } … … 585 600 int* playerRecord = da.getPlayerRecord(id); 586 601 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]; 590 607 591 608 serverMsg.type = MSG_TYPE_PROFILE; … … 860 877 } 861 878 879 bool 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 897 bool 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 862 1116 void quit(int sig) { 863 1117 done = true;
Note:
See TracChangeset
for help on using the changeset viewer.