00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "TraitementComServeurJeu.h"
00022
00023 TraitementComServeurJeu::TraitementComServeurJeu(unsigned int port){
00024 mPort=port;
00025 mPartie=Partie::GetInstance();
00026 mBdD=BdD::GetInstance();
00027 mSJReady=false;
00028 cout<<endl<<" SP TraitementComServeurJeu::Création d'un thread pour la communication avec un serveur de jeu sur le port "<<port<<endl;
00029 try{
00030 mSocket=new SocketUDP((unsigned int)port);
00031 } catch(SocketException s){ s.Afficher(); }
00032 }
00033
00034 TraitementComServeurJeu::~TraitementComServeurJeu(){
00035 if(mSocket!=NULL) delete mSocket;
00036
00037 }
00038 void* TraitementComServeurJeu::Traitement(){
00039 while(1){
00040 string cmd=mSocket->Ecouter();
00041
00042 TraiterHello(cmd);
00043 TraiterAttenteJoueur(cmd);
00044 TraiterConnexionJoueur(cmd);
00045 TraiterServeurJeuPret(cmd);
00046 TraiterReceptionStatus(cmd);
00047 TraiterFinPartie(cmd);
00048
00049 mSocket->Envoyer(cmd);
00050 }
00051 return NULL;
00052 }
00053
00054 void TraitementComServeurJeu::TraiterHello(string cmd){
00055 if(cmd=="HELLO"){
00056 cout<<" SP TraitementComServeurJeu::Le serveur de jeu a initialisé le protocole de communication UDP"<<endl;
00057 mSocket->Envoyer(cmd);
00058
00059 mPartie->AjouterPartie(mPort);
00060 mSJReady=true;
00061 }
00062 }
00063
00064 void TraitementComServeurJeu::TraiterServeurJeuPret(string cmd){
00065 if(cmd=="READY"){
00066 cout<<" SP TraitementComServeurJeu::Le serveur de jeu nous indique que la partie commence"<<endl;
00067 mSocket->Envoyer(cmd);
00068 }
00069 }
00070
00071 void TraitementComServeurJeu::TraiterAttenteJoueur(string cmd){
00072 istringstream iss(cmd);
00073 string arg1, arg2;
00074 getline(iss,arg1,' ');
00075 if(arg1=="WAITING"){
00076 getline(iss,arg2,' ');
00077 cout<<" SP TraitementComServeurJeu::Le serveur de jeu attend la connexion de tous les joueurs ("<<arg2<<" fantomes automatiques)"<<endl;
00078 istringstream iss(arg2);
00079 unsigned int nbFantome;
00080 iss>>nbFantome;
00081 mPartie->SetNbFantomeAuto(mPort,nbFantome);
00082 mSocket->Envoyer(cmd);
00083 }
00084 }
00085
00086 void TraitementComServeurJeu::TraiterConnexionJoueur(string cmd){
00087 istringstream iss(cmd);
00088 string arg1, arg2, arg3, arg4;
00089 getline(iss,arg1,' ');
00090 if(arg1=="SET"){
00091 getline(iss,arg2,' ');
00092 if(arg2=="PACMAN"){
00093 getline(iss,arg3,' ');
00094 cout<<" SP TraitementComServeurJeu::Le serveur de jeu nous indique que pacman ("<<arg3<<") vient de se connecter"<<endl;
00095 mPartie->SetLoginPacman(mPort,arg3);
00096 mPartie->SetScorePacman(mPort,0);
00097 }
00098 if(arg2=="F"){
00099 getline(iss,arg3,' ');
00100 getline(iss,arg4,' ');
00101 cout<<" SP TraitementComServeurJeu::Le serveur de jeu nous indique qu'un fantome ("<<arg3<<") vient de se connecter"<<endl;
00102 istringstream iss(arg4);
00103 unsigned int noFantome;
00104 iss>>noFantome;
00105 mPartie->SetLoginF(mPort,noFantome,arg3);
00106 mPartie->SetScoreF(mPort,noFantome,0);
00107 }
00108 }
00109 }
00110
00111 void TraitementComServeurJeu::TraiterReceptionStatus(string cmd){
00112 istringstream iss(cmd);
00113 string arg1;
00114 getline(iss,arg1,' ');
00115 if(arg1=="STATUS"){
00116 string loginP, scoreP, loginF1, scoreF1, loginF2, scoreF2, loginF3, scoreF3, nbPomme, status;
00117 getline(iss,loginP,' '); getline(iss,scoreP,' '); getline(iss,loginF1,' '); getline(iss,scoreF1,' ');
00118 getline(iss,loginF2,' '); getline(iss,scoreF2,' '); getline(iss,loginF3,' '); getline(iss,scoreF3,' ');
00119 getline(iss,nbPomme,' '); getline(iss,status,' ');
00120 unsigned int sP, sF1, sF2, sF3;
00121 istringstream iss1(scoreP), iss2(scoreF1), iss3(scoreF2), iss4(scoreF3);
00122 iss1>>sP; iss2>>sF1; iss3>>sF2; iss4>>sF3;
00123 if(loginP!="hotplug") mPartie->SetScorePacman(mPort,sP);
00124 if(loginF1!="hotplug") mPartie->SetScoreF(mPort,0,sF1);
00125 if(loginF2!="hotplug")mPartie->SetScoreF(mPort,1,sF2);
00126 if(loginF3!="hotplug") mPartie->SetScoreF(mPort,2,sF3);
00127 mSocket->Envoyer(cmd);
00128 }
00129 }
00130
00131 void TraitementComServeurJeu::TraiterFinPartie(string cmd){
00132 if(cmd=="GAME OVER"){
00133 cout<<" SP TraitementComServeurJeu::Le serveur de jeu nous indique que la partie est terminée"<<endl;
00134
00135 string loginP=mPartie->GetLoginPacman(mPort);
00136 if(loginP!="hotplug"){
00137 unsigned int scoreP=mBdD->GetScore(loginP);
00138 scoreP+=mPartie->GetScorePacman(mPort);
00139 mBdD->SetScore(loginP,scoreP);
00140 }
00141 string loginF1=mPartie->GetLoginF(mPort,0);
00142 if((loginF1!="auto")&&(loginF1!="hotplug")){
00143 unsigned int scoreF1=mBdD->GetScore(loginF1);
00144 scoreF1+=mPartie->GetScoreF(mPort,0);
00145 mBdD->SetScore(loginF1,scoreF1);
00146 }
00147 string loginF2=mPartie->GetLoginF(mPort,1);
00148 if((loginF2!="auto")&&(loginF2!="hotplug")){
00149 unsigned int scoreF2=mBdD->GetScore(loginF2);
00150 scoreF2+=mPartie->GetScoreF(mPort,1);
00151 mBdD->SetScore(loginF2,scoreF2);
00152 }
00153 string loginF3=mPartie->GetLoginF(mPort,2);
00154 if((loginF3!="auto")&&(loginF3!="hotplug")){
00155 unsigned int scoreF3=mBdD->GetScore(loginF3);
00156 scoreF3+=mPartie->GetScoreF(mPort,2);
00157 mBdD->SetScore(loginF3,scoreF3);
00158 }
00159
00160 mBdD->Sauvegarder();
00161
00162 mPartie->SupprimerPartie(mPort);
00163 }
00164 }
00165