Gestion des WebSockets
Cette section détaille les composants qui gèrent les communications en temps réel via WebSockets. Ces services sont essentiels pour maintenir la connexion entre le client et le serveur, ainsi que pour synchroniser l'état du jeu entre tous les participants.
Événements Socket principaux
Les événements Socket.IO sont définis dans SocketIOEvents
(commun client/serveur) et incluent:
- Événements de gestion de partie (
CreateGame
,JoinWaitingRoom
) - Événements de jeu (
Deplacement
,ActionDoor
) - Événements de combat (
StartCombat
,Attack
,Escape
) - Événements de chat (
SendMessage
,ReceiveMessage
)
Points d'attention
- Le
SocketService
sert de façade pour tous les autres services spécialisés - Chaque service spécialisé gère un aspect spécifique (jeu, salle d'attente, rejoindre une partie)
- L'approche est modulaire, permettant d'étendre facilement le système
- Les services utilisent intensivement le pattern Observer via les événements Socket.IO
Cette architecture permet une synchronisation en temps réel efficace entre tous les clients tout en maintenant une séparation des préoccupations claire.
SocketService (socket.service.ts)
Service central qui gère les connexions Socket.IO et coordonne tous les gestionnaires de sockets spécifiques.
Méthodes
constructor(server: Server, onGoingGameService: OnGoingGameService, waitingSocketService: WaitingSocketService, joinRoomService: JoinGameService, timerService: TimerSocketService, combatService: CombatSocketService, chatService: ChatService)
- Description: Initialise le service avec toutes les dépendances nécessaires.
- Paramètres: Tous les services spécialisés qui géreront différents aspects des communications WebSocket.
- Importance: Élevée - Point d'entrée pour toute la gestion WebSocket.
- Détails: Récupère l'instance IO de Socket.IO à partir du serveur et appelle
init()
.
sendToRoom(nip: string, dir: string, data?: unknown)
- Description: Envoie un message à tous les clients connectés à une salle spécifique.
- Paramètres:
nip
- Code de la salle (identifiant de partie)dir
- Type d'événement à émettredata
- Données optionnelles à envoyer
- Importance: Très élevée - Méthode principale pour la diffusion des événements aux clients.
getIO(): SocketIOServer
- Description: Renvoie l'instance Socket.IO.
- Retour: L'instance SocketIOServer.
- Importance: Élévée - Utilisée par d'autres services pour accéder à l'instance IO.
private init(): void
- Description: Configure le gestionnaire de connexion Socket.IO.
- Importance: Élevée - Initialise tous les gestionnaires d'événements.
- Détails: S'abonne à l'événement 'connection' et appelle
activateNewSocket()
pour chaque nouvelle connexion.
private activateNewSocket(socket: Socket)
- Description: Configure tous les gestionnaires d'événements pour une nouvelle connexion socket.
- Paramètres:
socket
- La connexion socket à configurer. - Importance: Élevée - Délègue la gestion des événements aux services spécialisés.
GameSocketHandlerService
Service (game-socket.handler.service.ts) qui gère les événements socket liés au jeu principal.
Méthodes
initialize(service: IOnGoingGameService): void
- Description: Initialise le service avec l'instance d'OnGoingGameService.
- Paramètres:
service
- Service de gestion des parties en cours. - Importance: Élevée - Configuration nécessaire pour accéder aux parties.
handleSocket(socket: Socket): void
- Description: Configure les gestionnaires d'événements généraux pour le jeu.
- Paramètres:
socket
- La connexion socket à configurer. - Importance: Élevée - Gère les événements de création de partie et de déconnexion.
- Détails: S'abonne aux événements 'CreateGame' et 'Disconnect'.
handleGame(socket: Socket): void
- Description: Configure les gestionnaires d'événements spécifiques au déroulement du jeu.
- Paramètres:
socket
- La connexion socket à configurer. - Importance: Très élevée - Gère les événements de jeu (déplacement, combat, etc.).
- Détails: S'abonne aux événements 'StartGame', 'ChangeRound', etc., et délègue à des méthodes privées.
private handlePlayerMovement(socket: Socket): void
- Description: Gère les événements de déplacement des joueurs.
- Paramètres:
socket
- La connexion socket concernée. - Importance: Très élevée - Logique centrale pour les déplacements.
- Détails: Vérifie la validité du déplacement, met à jour la position du joueur, et notifie les autres joueurs.
private handleTeleportPlayer(socket: Socket): void
- Description: Gère les événements de téléportation (mode debug).
- Paramètres:
socket
- La connexion socket concernée. - Importance: Élévée - Fonctionnalité de débogage.
private handleDoorAction(socket: Socket): void
- Description: Gère les événements d'interaction avec les portes.
- Paramètres:
socket
- La connexion socket concernée. - Importance: Élevée - Mécanisme de jeu important.
- Détails: Vérifie si l'action sur la porte est possible et notifie les clients.
private handlePlayerActions(socket: Socket): void
- Description: Gère les événements d'actions des joueurs.
- Paramètres:
socket
- La connexion socket concernée. - Importance: Élevée - Gère la fin du tour et les actions de débogage.
private checkInventoryFull(player: Player, cell: Cell, game: OnGoingGame): boolean
- Description: Vérifie si l'inventaire d'un joueur est plein.
- Paramètres:
player
- Le joueur concernécell
- La cellule contenant l'objetgame
- La partie en cours
- Retour:
true
si l'inventaire est plein,false
sinon. - Importance: Élevée - Logique d'inventaire.
Autres méthodes privées utilitaires
private isCellInPath(cellOnPath: Cell): boolean
private isItemInPath(fastestWay: { path: Vec2[]; cost: number }, stopAtItemCell: Vec2, i: number): boolean
Ces méthodes sont des utilitaires pour la gestion des déplacements et des interactions avec les objets.
WaitingSocketService
Service (waiting-room-socket.service.ts) qui gère les événements socket de la salle d'attente.
Méthodes
constructor(private onGoingGameService: OnGoingGameService)
- Description: Initialise le service avec le service de gestion des parties.
- Paramètres:
onGoingGameService
- Service gérant les parties en cours. - Importance: Élévée.
handleSocket(socket: Socket): void
- Description: Configure les gestionnaires d'événements pour la salle d'attente.
- Paramètres:
socket
- La connexion socket à configurer. - Importance: Élevée - Point d'entrée pour la gestion de la salle d'attente.
- Détails: Configure les événements 'ToggleGameLock', 'RequestGameUpdate', etc.
private handlePlayerLeave(socket: Socket, isDisconnected: boolean)
- Description: Gère le départ d'un joueur de la salle d'attente.
- Paramètres:
socket
- La connexion socket concernéeisDisconnected
- Indique si le départ est dû à une déconnexion
- Importance: Élevée - Logique critique pour maintenir la cohérence.
- Détails: Si le joueur est l'administrateur, annule la partie, sinon le retire simplement.
private cancelGame(nip: string, isDisconnected: boolean)
- Description: Annule une partie en attente.
- Paramètres:
nip
- Code de la partieisDisconnected
- Indique si l'annulation est due à une déconnexion
- Importance: Élevée - Nettoyage crucial des ressources.
- Détails: Notifie tous les joueurs et nettoie les ressources serveur.
private chooseVirtualPlayerName(socket: Socket): string
- Description: Sélectionne un nom aléatoire pour un joueur virtuel.
- Paramètres:
socket
- La connexion socket pour accéder à la partie. - Retour: Le nom choisi pour le bot.
- Importance: Élevée - Utilitaire pour les bots.
private chooseVirtualPlayerAvatar(socket: Socket): string
- Description: Sélectionne un avatar aléatoire pour un joueur virtuel.
- Paramètres:
socket
- La connexion socket pour accéder à la partie. - Retour: L'URL de l'avatar choisi.
- Importance: Élevée - Utilitaire pour les bots.
private createVirtualPlayer(socket: Socket, playerType: string): Player | null
- Description: Crée un joueur virtuel du type spécifié.
- Paramètres:
socket
- La connexion socket pour accéder à la partieplayerType
- Type de bot ('AggressiveBot' ou 'DefensiveBot')
- Retour: Le joueur virtuel créé ou null si type invalide.
- Importance: Élevée - Création des bots.
JoinGameService
Service (join-game.service.ts) qui gère la logique de rejoindre une partie.
Méthodes
constructor(private onGoingGameService: OnGoingGameService)
- Description: Initialise le service avec le service de gestion des parties.
- Paramètres:
onGoingGameService
- Service gérant les parties en cours. - Importance: Élevée
handleSocket(socket: Socket): void
- Description: Configure les gestionnaires d'événements pour rejoindre une partie.
- Paramètres:
socket
- La connexion socket à configurer. - Importance: Élevée - Point d'entrée pour rejoindre une partie.
- Détails: Configure les événements 'JoinCharacterCreation' et 'JoinWaitingRoom'.