TraitementComServeurJeu.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2007 by Pierre Schmitt, Ludovic Giacomello, Nhi Ly      *
00003  *                                                                         *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  *                                                                         *
00010  *   This program is distributed in the hope that it will be useful,       *
00011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00013  *   GNU General Public License for more details.                          *
00014  *                                                                         *
00015  *   You should have received a copy of the GNU General Public License     *
00016  *   along with this program; if not, write to the                         *
00017  *   Free Software Foundation, Inc.,                                       *
00018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
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                 //On passe la chaine à toutes les méthodes en vue d'un éventuel traitement 
00042                 TraiterHello(cmd);
00043                 TraiterAttenteJoueur(cmd);      
00044                 TraiterConnexionJoueur(cmd);
00045                 TraiterServeurJeuPret(cmd);
00046                 TraiterReceptionStatus(cmd);
00047                 TraiterFinPartie(cmd);
00048                 //Si aucune commande appropriée a été reçue on la renvoie
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                 //On ajoute la partie 
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                 //On met a jour les scores 
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                 //On sauvegarde 
00160                 mBdD->Sauvegarder();
00161                 //On supprime la partie 
00162                 mPartie->SupprimerPartie(mPort);
00163         }
00164 }
00165 

Generated on Wed Jan 2 14:01:41 2008 for Pacman by  doxygen 1.5.1