>
o
X
X
]
#
<

NOUS LES DEVS

Valider une partie

A la conquête du jeu vidéo partie 10

Niveau : expert(e)
</> </> </>

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) );
}
validation_partie_co

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 -

NOUS LES DEVS

Vous aimez ce que je fais ? Vous voulez que j'en fasse plus ? dans le développement du blog.