fix: bouton de confirmation désactivé après avoir sélectionné une carte, si une autre action réseau survient entretemps
Cause : le listener 'game-state' de GameScene se déclenche à CHAQUE action de N'IMPORTE QUEL joueur dans la salle (jouer une carte, acheter un objet ou un bâtiment, piocher/jouer un événement) — pas seulement au vrai changement de tour. À chaque déclenchement, dès que phase==='selecting', _deactivateBtn() était appelé INCONDITIONNELLEMENT, même si le joueur avait déjà sélectionné une carte de sa main (this.selectedCard non-null) sans encore l'avoir confirmée. Conséquence concrète : sélectionner une carte, PUIS effectuer n'importe quelle autre action (typiquement piocher une carte Événement) désactivait visuellement le bouton "CONFIRMER MA CARTE" (fond terne, texte grisé) alors que la carte restait réellement sélectionnée en mémoire ET visuellement surélevée sur le plateau (CardObject._selected reste true, jamais désélectionnée par ce chemin). Un premier clic sur la carte la DÉSÉLECTIONNAIT alors (CardObject._onDown bascule select/deselect selon _selected, déjà à true), obligeant à cliquer une seconde fois pour la vraiment resélectionner — exactement le symptôme rapporté. Fix : ne réinitialiser visuellement le bouton (_deactivateBtn()) que si aucune carte n'est actuellement sélectionnée (), respectant l'état réel de sélection au lieu de le réinitialiser à chaque game-state reçu. Nouveau test E2E de régression (e2e/tests/card-selection-persistence.spec.js) reproduisant précisément le scénario : sélectionner une carte, piocher un événement, vérifier que selectedCard ET le pulse-tween du bouton restent actifs, puis confirmer directement sans recliquer sur la carte. Confirmé discriminant : échoue de façon reproductible (2/2 tentatives) quand le fix est retiré isolément, passe systématiquement avec le fix en place. Ajout des helpers e2e/tests/helpers.js: selectHandCard() et confirmSelectedCard() (extraits de playCard(), qui reste inchangée en façade — les 5 usages existants de playCard() dans la suite E2E restent compatibles sans modification). 54 tests unitaires client + 166 tests unitaires serveur + suite game-flow.spec.js (4 tests, non liés à ce fix) toujours au vert.
This commit is contained in:
1 parent
4fe9cf4393
commit
a5ecc23498
3 files changed
+142
-3
No files matched your search
+24
-2
@@ -84,12 +84,20 @@ export async function startGame(page) {
|
||||
* élevée sur l'attribut visé par pur hasard) — il faut explicitement qu'il
|
||||
* joue sa carte la plus FAIBLE sur cet attribut précis.
|
||||
*/
|
||||
export async function playCard(page, attr = null, mode = 'max') {
|
||||
/**
|
||||
* Clique sur une carte de la main (sans confirmer) pour la sélectionner.
|
||||
* Séparé de playCard() pour pouvoir tester des scénarios où d'autres
|
||||
* actions ont lieu ENTRE la sélection et la confirmation (ex: piocher un
|
||||
* événement pendant qu'une carte personnage est déjà sélectionnée — voir
|
||||
* la régression "il faut recliquer sur la carte pour la re-sélectionner").
|
||||
* Retourne false si la main est vide.
|
||||
*/
|
||||
export async function selectHandCard(page, attr = null, mode = 'max') {
|
||||
const canvas = page.locator('#phaser-container canvas')
|
||||
const box = await canvas.boundingBox()
|
||||
|
||||
const handLen = await page.evaluate(() => {
|
||||
const game = window.__ALL_GAMES__[window.__ALL_GAMES__.length - 1]
|
||||
const game = window.__ALL_GAMES__?.[window.__ALL_GAMES__.length - 1]
|
||||
const scene = game?.scene?.getScene('GameScene')
|
||||
return scene?.handCards?.length ?? 0
|
||||
})
|
||||
@@ -117,6 +125,13 @@ export async function playCard(page, attr = null, mode = 'max') {
|
||||
|
||||
await page.mouse.click(box.x + cardPos.x, box.y + cardPos.y)
|
||||
await page.waitForTimeout(200)
|
||||
return true
|
||||
}
|
||||
|
||||
/** Clique sur le bouton "CONFIRMER MA CARTE" (suppose une carte déjà sélectionnée). */
|
||||
export async function confirmSelectedCard(page) {
|
||||
const canvas = page.locator('#phaser-container canvas')
|
||||
const box = await canvas.boundingBox()
|
||||
|
||||
const btnPos = await page.evaluate(() => {
|
||||
const game = window.__ALL_GAMES__?.[window.__ALL_GAMES__.length - 1]
|
||||
@@ -130,6 +145,13 @@ export async function playCard(page, attr = null, mode = 'max') {
|
||||
return true
|
||||
}
|
||||
|
||||
/** Sélectionne une carte de la main puis la confirme immédiatement (comportement historique de playCard). */
|
||||
export async function playCard(page, attr = null, mode = 'max') {
|
||||
const selected = await selectHandCard(page, attr, mode)
|
||||
if (!selected) return false
|
||||
return confirmSelectedCard(page)
|
||||
}
|
||||
|
||||
/**
|
||||
* Joue un tour complet pour une liste de pages (dans l'ordre donné), puis
|
||||
* attend la résolution + le début du tour suivant (délai serveur fixe de
|
||||
|
||||
Reference in new issue
Block a user