Principe
Lorsque une partie est pleine, celle-ci passe en préparation et chaque joueur doit valider sont CO. Dès qu’un joueur valide sont CO, il doit attendre que les autres fassent de même, mais si jamais un seul autre joueur change de CO, alors tout les joueurs doivent revalider à nouveau leur CO, cela permet d’éviter les tricheries, chaque joueur aura connaissance des CO de chacun lorsque la partie commencera.
Préparation
Lorsqu’un joueur rejoint une partie et que celle-ci est pleine alors la méthode response_prepare_partie est executée auprès de chacun des joueurs de la partie, et qui consiste à afficher un message et d’ajouter tout le système d’événements pour valider la partie.
response_prepare_partie(params){
$(".wait .content .text").html(`Choisi ton générale et valide !`);
$(".wait .content .place").html(``);
this.current_partie = params.partie_id;
this.display_slot(params.players_info);
//ajouter le bouton valide partie
$(".wait .sub-menu").append(`<button class="valide_partie">Valider la partie</button>`);
//evenement pour validation partie
$(".wait .sub-menu").off("click.valide_partie").on("click.valide_partie",".valide_partie", event => this.event_valide_partie(event) );
}
Changement de CO côté client
Lorsque la partie est pleine, chaque joueur peut changer son CO, pour se faire, j’ai ajouté deux boutons sur chaque slot, qui permettent de choisir le CO précédent ou suivant, et bien sûr, cela envoie une requête au serveur via la méthode event_change_co.
//event change co
event_change_co(event){
let pos = this.list_co.indexOf(this.current_co);
if( $(event.target).hasClass("before") ){
pos--;
if( pos == 0){
pos = this.list_co.length - 1;
}
}else{
pos++;
if( pos == this.list_co.length ){
pos = 1;
}
}
//changement de co
this.current_co = this.list_co[ pos ];
//envois serveur
this.send_to_server("message",{ action : "request_change_co" , params : { token : this.token , partie_id : this.current_partie , co : pos } });
$("#list-players").off("click.change_co");
}
Changement de CO côté serveur
Au niveau de la méthode request_change_co() côté serveur, ce qui est important de voir ce n’est pas tant l’envoi du changement de CO aux autres joueurs, mais bien la réinitialisation de la variable validation_players, car la partie ne pourra seulement commencer que lorsque l’ensemble des joueurs de la partie auront validé leur CO.
request_change_co(user_socket, params){
e("> Changement de co");
//si l'user a bien sa partie courante à la partie envoyer en params
if( params.partie_id == this.users[ params.token ].current_partie ){
this.parties[ params.partie_id ].list_players[ params.token ].co = this.list_co[ params.co ];
//envois à tout les users de la partie
for(let token in this.parties[ params.partie_id ].list_players ){
//si un seul joueur change de co ont passe leur état à join
this.users[ token ].state = "join";
//reset les validation
this.parties[ params.partie_id ].validation_players = {};
e("reset etat");
this.send_to_specific_client(this.users[token].socket_id, "message", {
action : "response_request_change_co",
params : this.get_list_players_for_preparation( this.parties[ params.partie_id ] )
});
}
}
}
Validation côté client
Lorsqu’un joueur clique sur le bouton valider, une requête de validation est envoyée au serveur via la méthode event_valide_partie.
//event validation de partie
event_valide_partie(event){
if( this.current_partie ){
this.send_to_server("message",{ action : "request_valide_partie" , params : { token : this.token , partie_id : this.current_partie } });
$(".wait .sub-menu").off("click.valide_partie");
}
}
Validation côté serveur
Quand un joueur valide son CO, la méthode request_valide_partie() est appelée et permet de changer l’état du joueur en « valide », et lorsque tous les joueurs ont validé la partie, alors la partie peut être lancée.
request_valide_partie(user_socket, params){
e(`> Joueur ${params.token} valide la partie ${params.partie_id}`);
//si le joueur fait bien partie de l'equipe et que la partie est pleine
if( this.parties[ params.partie_id ].list_players[ params.token ] && this.parties[ params.partie_id ].map.nbr_joueur == Object.keys( this.parties[ params.partie_id ].list_players ).length ){
this.parties[ params.partie_id ].validation_players[ params.token ] = true;
//si etat valide
if( this.users[ params.token ].state == "making" || this.users[ params.token ].state == "join" ){
//change l'etat du joueur
this.users[ params.token ].state = "valide";
//si la partie est pleine
if( Object.keys( this.parties[ params.partie_id ].validation_players ).length == this.parties[ params.partie_id ].map.nbr_joueur ){
//la partie est plein ont peux commencer
this.init_partie(params.partie_id);
for(let token in this.parties[ params.partie_id ].list_players ){
this.users[ token ].state = "fight";
this.send_to_specific_client( this.users[token].socket_id, "message", { action : "response_launch_partie", params : {
result : true,
map : this.parties[ params.partie_id ].map,
} });
}
}else{
//envois à tous le monde la validation, si le joueur est le dernier il passera directement en combat
for(let token in this.parties[ params.partie_id ].list_players ){
this.send_to_specific_client(this.users[token].socket_id, "message", {
action : "response_request_valide_partie",
params : {
id_to_valide : params.token
}
});
}
}
}
}
}
02/07/2016
Yann Vangampelaere - nouslesdevs -