Salle d'Attente

La page Salle d'Attente (WaitingRoomPage) affiche les joueurs ayant rejoint la partie et permet à l'hôte de lancer le jeu une fois que tous les joueurs sont prêts.

WaitingRoomPage

Type : ConsumerStatefulWidget
State : _WaitingRoomPageState extends ConsumerState(WaitingRoomPage)

Propriétés de constructeur

Propriété Type Description
mode String Mode de la salle ("create" ou "join")

Propriétés d'état

Propriété Type Description
maxPlayers int Nombre maximum de joueurs (constante: 6)
playerNameToKick String? Nom du joueur à expulser (pour confirmation)
_assetPreloader AssetPreloaderService Service de préchargement des assets du jeu
_isStartingGame bool Indique si le jeu est en cours de démarrage
gridLimits Map(int, int) Limites de joueurs par taille de grille
_playerAvatarCache Map(String, String?) Cache des URLs d'avatars

Méthodes

initState()

Description : Initialise la page, configure les écouteurs et précharge les assets.
Actions :

  1. Réinitialise le flag de sortie
  2. Configure les écouteurs Socket.IO
  3. Configure l'écouteur de démarrage de partie
  4. Précharge les assets du jeu

Retour : void

dispose()

Description : Nettoie les ressources et le cache.
Retour : void

_preloadGameAssets()

Description : Précharge tous les assets du jeu (sprites, images, etc.).
Retour : Future

void _setupListeners()

Description : Configure les écouteurs initiaux pour le provider de game view.
Action : Initialise le provider avec le code de partie et le nom du joueur
Retour : void

void _setupGameStartListener()

Description : Configure l'écouteur pour le démarrage de la partie.
Event : onGameStart (via waitingRoomNotifier)
Action : Navigue vers GameViewPage quand la partie commence
Retour : void

void _showErrorPopup(String message)

Description : Affiche un popup d'erreur.
Retour : void

void _showPlayerKickedPopup(String message)

Description : Affiche un popup d'expulsion et redirige vers HomePage.
Retour : void

void _showGameCancelledPopup(String message)

Description : Affiche un popup d'annulation de partie et redirige vers HomePage.
Retour : void

void _focusOnGeneralChannel()

Description : Active le canal de chat général après avoir quitté la salle.
Retour : void

_startGame()

Description : Lance la partie (hôte uniquement).
Validations :

  1. Au moins 2 joueurs
  2. Assets préchargés
  3. Pas déjà en cours de démarrage

Action : Appelle waitingRoomNotifier.startGame()
Retour : Future

_leaveWaitingRoom()

Description : Quitte la salle d'attente.
Actions :

  1. Définit le flag de sortie
  2. Quitte la salle via Socket.IO
  3. Navigue vers HomePage
  4. Focus sur le canal général

Retour : Future

void _showLeaveConfirmationDialog()

Description : Affiche un dialogue de confirmation avant de quitter.
Retour : void

void _showKickConfirmationDialog(String playerName)

Description : Affiche un dialogue de confirmation avant d'expulser un joueur.
Paramètres :

Retour : void

_kickPlayer(String playerName)

Description : Expulse un joueur de la salle (hôte uniquement).
Action : Appelle waitingRoomNotifier.kickPlayer(playerName)
Retour : Future

bool _isHost()

Description : Vérifie si le joueur actuel est l'hôte de la partie.
Retour : bool

bool _isGameFull()

Description : Vérifie si la partie a atteint le nombre maximum de joueurs selon la taille de grille.
Retour : bool

bool _canStartGame()

Description : Vérifie si la partie peut être lancée.
Conditions :

  1. Au moins 2 joueurs
  2. Pas déjà en train de démarrer

Retour : bool

String? _getPlayerAvatarUrl(String playerName)

Description : Récupère l'URL d'avatar d'un joueur (avec cache).
Retour : String?

Widget _buildHeader()

Description : Construit l'en-tête avec titre et bouton quitter.
Retour : Widget

Widget _buildGameInfo(OnGoingGameModel game)

Description : Construit la section d'informations de la partie.
Contenu :

Retour : Widget

Widget _buildPlayersList(OnGoingGameModel game)

Description : Construit la liste des joueurs avec leurs avatars.
Retour : Widget

Widget _buildPlayerCard(PlayerModel player)

Description : Construit une carte de joueur.
Contenu :

Retour : Widget

Widget _buildStartButton()

Description : Construit le bouton de démarrage de partie (hôte uniquement).
Retour : Widget

Éléments visuels

En-tête

Informations de la partie

Liste des joueurs

Bouton de démarrage

Overlays

Dialogues

Composants utilisés

TwoButtonPopup

Popup avec deux boutons (confirmation/annulation).

OneButtonPopup

Popup avec un seul bouton (notification).

UserProfileWidget

Widget de profil utilisateur.

ChatboxWidget

Widget de chat.

HelpButtonWidget

Bouton d'aide.

HelpPopupWidget

Popup d'aide.

GameLoadingOverlay

Overlay de chargement pendant le démarrage.

Providers utilisés

waitingRoomNotifierProvider

Type : StateNotifierProvider(WaitingRoomNotifier, WaitingRoomState)

Provider gérant l'état de la salle d'attente.

WaitingRoomState

Propriété Type Description
currentGame OnGoingGameModel? Partie actuelle
currentPlayer PlayerModel? Joueur actuel
isLeaving bool Si le joueur est en train de quitter
errorMessage String? Message d'erreur

WaitingRoomNotifier - Méthodes

void resetLeavingFlag()

Description : Réinitialise le flag de sortie.
Retour : void

startGame()

Description : Lance la partie (hôte uniquement).
Event Socket : Envoie "startGame"
Retour : Future

leaveWaitingRoom(String gameCode)

Description : Quitte la salle d'attente.
Event Socket : Envoie "leaveWaitingRoom"
Retour : Future

kickPlayer(String playerName)

Description : Expulse un joueur (hôte uniquement).
Event Socket : Envoie "kickPlayer"
Retour : Future

void clearError()

Description : Efface le message d'erreur.
Retour : void

void listenForGameStart(Function(OnGoingGameModel) callback)

Description : Écoute l'event de démarrage de partie.
Event : "gameStarted"
Retour : void

void setCurrentGame(OnGoingGameModel game)

Description : Définit la partie actuelle.
Retour : void

void setCurrentPlayer(PlayerModel player)

Description : Définit le joueur actuel.
Retour : void

gameViewProvider(providerKey)

Type : StateNotifierProvider(GameViewNotifier, GameViewState)

Provider initialisé pour préparer la game view.

chatNotifierProvider

Type : StateNotifierProvider(ChatNotifier, ChatState)

Provider du chat.

friendsNotifierProvider

Type : StateNotifierProvider(FriendsNotifier, FriendsState)

Provider des amis.

userProfileProvider

Type : Provider(UserProfileEntity?)

Provider du profil utilisateur.

translationProvider

Type : Provider(TranslationWrapper)

Provider de traduction.

themeNotifierProvider

Type : StateNotifierProvider(ThemeNotifier, ThemeState)

Provider de thème.

helpPopupProvider

Type : StateNotifierProvider(HelpPopupNotifier, HelpPopupState)

Provider d'aide.

Écouteurs Socket.IO

Les events Socket.IO sont gérés via le WaitingRoomNotifier :

Events reçus

gameStarted

Description : La partie est lancée par l'hôte.
Payload : OnGoingGameModel
Action : Navigation vers GameViewPage

playerJoined

Description : Un nouveau joueur rejoint la salle.
Payload : PlayerModel
Action : Mise à jour de la liste des joueurs

playerLeft

Description : Un joueur quitte la salle.
Payload : playerName
Action : Retrait du joueur de la liste

playerKicked

Description : Un joueur est expulsé.
Payload : playerName
Action : Si c'est le joueur actuel, affiche popup et redirige vers HomePage

gameCancelled

Description : L'hôte annule la partie.
Action : Affiche popup et redirige tous les joueurs vers HomePage

gameLockUpdated

Description : Le statut de verrouillage de la partie change (drop-in/drop-out).
Payload : isLocked
Action : Met à jour l'état de la partie

Events envoyés

startGame

Description : Lancé par l'hôte pour démarrer la partie.
Payload : gameCode

leaveWaitingRoom

Description : Le joueur quitte la salle.
Payload : gameCode, playerName

kickPlayer

Description : L'hôte expulse un joueur.
Payload : gameCode, playerName

Navigation

Préchargement des assets

Le service AssetPreloaderService précharge tous les assets nécessaires au jeu :

Timing : Le préchargement commence dès l'entrée dans la salle d'attente, permettant un démarrage instantané du jeu.

Limites de joueurs

Taille de grille Joueurs max
10x10 2
15x15 4
20x20 6

Ces limites sont respectées automatiquement. Le bouton de démarrage est désactivé si pas assez de joueurs.

Gestion des rôles

Hôte (Admin)

Joueur normal

Comportement du code de partie

Le code de partie (4 chiffres) est affiché en grand et peut être copié dans le presse-papiers en cliquant dessus. Cela permet de partager facilement le code avec des amis.

Gestion de la sortie

Quand un joueur quitte la salle:

  1. Flag isLeaving activé
  2. Event Socket.IO envoyé
  3. Navigation vers HomePage
  4. Focus sur le canal général
  5. Si c'était l'hôte, la partie est automatiquement annulée

Session ID

Lors du démarrage de la partie, un session ID unique est généré :

final sessionId = DateTime.now().microsecondsSinceEpoch.toString();

Cet ID est utilisé pour identifier de manière unique la session de jeu du joueur et éviter les conflits en cas de reconnexion.