From 4fe9cf4393a7f3415fb5e27d72d241bb3c957154 Mon Sep 17 00:00:00 2001 From: Kevin L'Hereec Date: Mon, 24 Aug 2026 17:27:00 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20ReferenceError=20bloquait=20le=20ciblage?= =?UTF-8?q?=20d'Accord=20royal/=C3=89pid=C3=A9mie,=20laissant=20la=20carte?= =?UTF-8?q?=20jou=C3=A9e=20ind=C3=A9finiment=20en=20main?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Régression introduite par le précédent refactor (commit 34d1bbe) qui a remplacé le paramètre 'token' (référence Phaser) par 'eventId' (string) dans _onEventCardPlay, mais avait oublié de mettre à jour les 2 appels internes à this._startTargeting(token, ...) pour les événements Accord royal et Épidémie (variante Trousse) — 'token' n'existait plus dans ce scope, provoquant un ReferenceError JavaScript non capturé au moment précis où l'utilisateur cliquait sur JOUER pour un événement nécessitant un ciblage. Conséquence concrète : l'exception interrompait l'exécution de _onEventCardPlay avant d'atteindre _startTargeting, donc aucune séquence de ciblage ne démarrait jamais, playEventCard n'émettait jamais 'play-event' au serveur, pendingEventPlayId restait null côté serveur, et la carte réapparaissait comme "jouable" en main indéfiniment — exactement le symptôme rapporté ("les événements ne semblent pas être résolus et restent dans la seconde main même si joués"). Reproduit et confirmé via un test E2E de trace ciblé (game-state + _renderEventHand loggés à chaque appel) : avant le fix, pendingEventPlayId restait null malgré le clic sur JOUER + les 2 clics de ciblage ; après le fix, pendingEventPlayId=royal_accord est bien transmis au serveur et la carte disparaît correctement de la main après résolution du tour. Fix trivial : this._startTargeting(token, ...) -> this._startTargeting(eventId, ...) sur les 2 appels concernés. 54 tests unitaires client + 166 tests unitaires serveur toujours au vert (ce bug, une ReferenceError dans un chemin de code jamais exercé par les tests unitaires existants — qui ne peuvent pas simuler un vrai clic Phaser sur le bouton JOUER + la séquence de ciblage — n'était détectable que par test E2E ou lecture manuelle). --- client/src/game/scenes/GameScene.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/game/scenes/GameScene.js b/client/src/game/scenes/GameScene.js index 20967ec..2282e77 100644 --- a/client/src/game/scenes/GameScene.js +++ b/client/src/game/scenes/GameScene.js @@ -830,12 +830,12 @@ export class GameScene extends Phaser.Scene { // server/src/game/Room.js) — le ciblage transite par teamIndex // (identifiant public), jamais par socketId (donnée serveur interne // jamais exposée au client). - this._startTargeting(token, ['gainTargetTeamIndex', 'loseTargetTeamIndex'], { + this._startTargeting(eventId, ['gainTargetTeamIndex', 'loseTargetTeamIndex'], { gainTargetTeamIndex: 'Choisissez un joueur qui gagnera 1 Diplomatie', loseTargetTeamIndex: 'Choisissez un joueur qui perdra 1 Diplomatie' }) } else if (eventData.id === 'epidemic') { - this._startTargeting(token, ['targetTeamIndex'], { + this._startTargeting(eventId, ['targetTeamIndex'], { targetTeamIndex: 'Choisissez l\'adversaire qui perdra 2 Santé (Trousse du Médecin)' }) }