00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "TraitementJoueur.h"
00022
00023 TraitementJoueur::TraitementJoueur(Socket *s, bool hotplug) : Thread(){
00024 mHotPlug=hotplug;
00025 if(s==NULL){
00026 if(!mHotPlug){
00027 cout<<" SJ TraitementJoueur::Création d'un thread pour gérer un fantome automatique"<<endl;
00028 mLogin="auto";
00029 } else {
00030 cout<<" SJ TraitementJoueur::Création d'un thread pour remplacer un joueur déconnecté"<<endl;
00031 mLogin="hotplug";
00032 }
00033
00034 } else {
00035 cout<<" SJ TraitementJoueur::Création d'un thread pour traiter le client"<<endl;
00036 mLogin="";
00037 }
00038 mJeu=Jeu::GetInstance();
00039 mSocket=s;
00040 mZombie=false;
00041 mIdJoueur=-1;
00042 }
00043
00044 TraitementJoueur::~TraitementJoueur(){
00045 cout<<" SJ TraitementJoueur::Destruction du thread de traitement du joueur "<<mLogin<<endl;
00046 if(mSocket!=NULL) delete mSocket;
00047 }
00048
00049 void *TraitementJoueur::Traitement(){
00050 if(mSocket!=NULL){
00051
00052 if(!WaitForHello()) return NULL;
00053 mLogin=WaitForLogin();
00054 if(mLogin=="ERROR") return NULL;
00055 if(!WaitForRole()) return NULL;
00056 if(!WaitForPlayers()) return NULL;
00057 if(!TraitementDeplacement()) return NULL;
00058 cout<<" SJ TraitementJoueur::Fin du traitement de "<<mLogin<<endl;
00059 } else {
00060 mVerrou.Lock();
00061 string place=mJeu->JoueurConnectes();
00062 if(!mHotPlug){
00063
00064 for(unsigned int i=0; i<3; i++){
00065 if(place[i]=='0'){
00066 mJeu->SetJoueur(i,"auto");
00067 mIdJoueur=i;
00068 break;
00069 }
00070 }
00071 mVerrou.Unlock();
00072 WaitForPlayers();
00073 DeplacementAuto();
00074 cout<<" SJ TraitementJoueur::Fin du traitement du fantome automatique "<<mIdJoueur<<endl;
00075 } else {
00076
00077 for(unsigned int i=0; i<4; i++){
00078 if(place[i]=='0'){
00079 mJeu->SetJoueur(i,"hotplug");
00080 mIdJoueur=i;
00081 break;
00082 }
00083 }
00084 mVerrou.Unlock();
00085 DeplacementAuto();
00086 cout<<" SJ TraitementJoueur::Fin du traitement du joueur automatique de remplacement "<<mIdJoueur<<endl;
00087 }
00088 }
00089 return NULL;
00090 }
00091
00092 void TraitementJoueur::ModeZombie(){
00093 cout<<" SJ TraitementJoueur::Passé en mode "; printf( "\e[31mZombie\e[m\n" );
00094 if(mIdJoueur!=-1) mJeu->UnSetJoueur(mIdJoueur);
00095 mZombie=true;
00096 while(1) sleep(1);
00097 }
00098 bool TraitementJoueur::WaitForHello(){
00099
00100 cout<<" SJ TraitementJoueur::Attente de l'initiation du protocole de la part du client";
00101 try{
00102 while(mSocket->Ecouter()!="HELLO"){
00103 mSocket->Envoyer("ERROR HELLO");
00104 }
00105 mSocket->Envoyer("HELLO");
00106
00107 printf("\e[32m [OK]\e[m\n");
00108 } catch(SocketException s){
00109 cout<<" SJ TraitementJoueur::"; printf( "\e[31m[Erreur] \e[m"); cout<<"Déconnexion du client: le thread passe en mode "; printf( "\e[31mZombie\e[m\n" );
00110 ModeZombie();
00111 return false;
00112 }
00113 return true;
00114 }
00115
00116
00117 string TraitementJoueur::WaitForLogin(){
00118
00119 string line,cmd;
00120 do{
00121 try{
00122 line=mSocket->Ecouter();
00123 string login;
00124 istringstream iss(line);
00125 getline(iss,cmd,' ');
00126 if(cmd=="LOGIN"){
00127 getline(iss,login,' ');
00128 cout<<" SJ TraitementJoueur::Connexion de "<<login<<endl;
00129 mSocket->Envoyer("LOGIN OK");
00130 return login;
00131 } else mSocket->Envoyer("ERROR LOGIN");
00132 } catch(SocketException s){
00133 cout<<" SJ TraitementJoueur::"; printf( "\e[31m[Erreur] \e[m"); cout<<"Déconnexion du client: le thread passe en mode "; printf( "\e[31mZombie\e[m\n" );
00134 ModeZombie();
00135 return false;
00136 }
00137 } while(1);
00138 }
00139
00140 bool TraitementJoueur::WaitForRole(){
00141 mVerrou.Lock();
00142 cout<<" SJ TraitementJoueur::Envoi des places restantes"<<endl;
00143
00144 string place=mJeu->JoueurConnectes();
00145 string reponse="BUSY ";
00146 reponse+=place;
00147 try{
00148 mSocket->Envoyer(reponse);
00149 cout<<" SJ TraitementJoueur::Attente du rôle"<<endl;
00150 bool stop=false;
00151
00152 do{
00153 string line=mSocket->Ecouter();
00154 string cmd,role;
00155 istringstream iss(line);
00156 getline(iss,cmd,' ');
00157 if(cmd=="GET"){
00158 getline(iss,role,' ');
00159 reponse="SET "; reponse+=mLogin; reponse+=" "; reponse+=role;
00160 if(role=="PACMAN"){
00161 if(place[3]=='0'){
00162 stop=true;
00163 mIdJoueur=3;
00164 mJeu->SetJoueur(mIdJoueur,mLogin);
00165 mSocket->Envoyer(reponse);
00166 cout<<" SJ TraitementJoueur::Attente du rôle"; printf("\e[32m [OK]\e[m\n");
00167 } else mSocket->Envoyer("ERROR GET ROLE");
00168 } else if(role=="F1"){
00169 if(place[0]=='0'){
00170 stop=true;
00171 mIdJoueur=0;
00172 mJeu->SetJoueur(mIdJoueur,mLogin);
00173 mSocket->Envoyer(reponse);
00174 cout<<" SJ TraitementJoueur::Attente du rôle"; printf("\e[32m [OK]\e[m\n");
00175 } else mSocket->Envoyer("ERROR GET ROLE");
00176 } else if(role=="F2"){
00177 if(place[1]=='0'){
00178 stop=true;
00179 mIdJoueur=1;
00180 mJeu->SetJoueur(mIdJoueur,mLogin);
00181 mSocket->Envoyer(reponse);
00182 cout<<" SJ TraitementJoueur::Attente du rôle"; printf("\e[32m [OK]\e[m\n");
00183 } else mSocket->Envoyer("ERROR GET ROLE");
00184 } else if(role=="F3"){
00185 if(place[2]=='0'){
00186 stop=true;
00187 mIdJoueur=2;
00188 mJeu->SetJoueur(mIdJoueur,mLogin);
00189 mSocket->Envoyer(reponse);
00190 cout<<" SJ TraitementJoueur::Attente du rôle"; printf("\e[32m [OK]\e[m\n");
00191 } else mSocket->Envoyer("ERROR GET ROLE");
00192 } else mSocket->Envoyer("ERROR GET ROLE");
00193 } else mSocket->Envoyer("ERROR GET ROLE");
00194 } while(!stop);
00195 mVerrou.Unlock();
00196 } catch(SocketException s){
00197 cout<<" SJ TraitementJoueur::"; printf( "\e[31m[Erreur] \e[m"); cout<<"Déconnexion du client: le thread passe en mode "; printf( "\e[31mZombie\e[m\n" );
00198 ModeZombie();
00199 return false;
00200 }
00201 return true;
00202 }
00203
00204 bool TraitementJoueur::WaitForPlayers(){
00205 cout<<" SJ TraitementJoueur::Attente des autres joueurs..."<<endl;
00206 while(!(mJeu->JeuPret())){
00207 sleep(1);
00208 }
00209 cout<<" SJ TraitementJoueur::"<<mLogin<<" "<<mIdJoueur<<" dit: Le jeu est prêt!!!"<<endl;
00210 try{
00211 if(mSocket!=NULL) mSocket->Envoyer("READY");
00212 } catch(SocketException s){
00213 cout<<" SJ TraitementJoueur::"; printf( "\e[31m[Erreur] \e[m"); cout<<"Déconnexion du client: le thread passe en mode "; printf( "\e[31mZombie\e[m\n" );
00214 ModeZombie();
00215 }
00216 return true;
00217 }
00218
00219 bool TraitementJoueur::TraitementDeplacement(){
00220 while(!mJeu->GameOver()){
00221 try{
00222 string line=mSocket->Ecouter();
00223
00224 if(line=="GRID") {
00225 string res=mJeu->EtatPartie(); res+=" ";
00226 res+=mJeu->toString(); res+=" ";
00227 mSocket->Envoyer(res);
00228 }
00229
00230 if((line=="HAUT")||(line=="BAS")||(line=="GAUCHE")||(line=="DROITE")){
00231 if(mJeu->DeplacerPersonnage(mIdJoueur,line[0])) mSocket->Envoyer("MOVE OK");
00232 else mSocket->Envoyer("MOVE BAD");
00233 } else mSocket->Envoyer("MOVE BAD");
00234 } catch(SocketException s){
00235 cout<<" SJ TraitementJoueur::"; printf( "\e[31m[Erreur] \e[m"); cout<<"Déconnexion du client: le thread passe en mode "; printf( "\e[31mZombie\e[m\n" );
00236 ModeZombie();
00237 }
00238 }
00239 return true;
00240 }
00241
00242 void TraitementJoueur::DeplacementAuto(){
00243 cout<<" SJ TraitementJoueur::Démarrage du déplacement automatique du personnage "<<mIdJoueur<<endl;
00244 bool deplacementOk=false;
00245 char c;
00246 while(!mJeu->GameOver()){
00247 if(deplacementOk){
00248
00249 deplacementOk=mJeu->DeplacerPersonnage(mIdJoueur,c);
00250 } else {
00251 switch(mJeu->UintAleat(1,4)){
00252 case 1 : {
00253 deplacementOk=mJeu->DeplacerPersonnage(mIdJoueur,'H'); c='H';
00254 break;
00255 }
00256 case 2 : {
00257 deplacementOk=mJeu->DeplacerPersonnage(mIdJoueur,'B'); c='B';
00258 break;
00259 }
00260 case 3 : {
00261 deplacementOk=mJeu->DeplacerPersonnage(mIdJoueur,'G'); c='G';
00262 break;
00263 }
00264 case 4 : {
00265 deplacementOk=mJeu->DeplacerPersonnage(mIdJoueur,'D'); c='D';
00266 break;
00267 }
00268 }
00269 }
00270 sleep(1);
00271 }
00272 }