- Nouveau server/src/game/events.js : 6 événements (Récolte exceptionnelle,
Épidémie, Levée des troupes, Accord royal, Complot découvert, Grande fête
au château), deck PARTAGÉ de 18 cartes (3 exemplaires de chacun) mélangé
au démarrage de la partie.
- Room.js : buyEventDraw() (coût fixe 1 point dans chacune des 4 jauges,
effet immédiat contrairement aux objets/bâtiments — pas de conflit de
stock possible), playEventCard() (choix de jouer une carte de sa main,
max 1 par tour, avec ciblage optionnel), _resolvePendingEventPlays()
(résolution de TOUS les événements du tour AVANT le calcul des gains de
cartes personnage, défausse systématique, protection "Complot découvert"
pour soi-même uniquement). Les 6 effets incluent leurs synergies avec les
objets/bâtiments existants (Charrue, Trousse+Église pour Épidémie,
Trébuchet, Sceau Royal, Château Royal → pioche bonus).
- IMPORTANT : le ciblage de joueur (Accord royal, variante Trousse
d'Épidémie) transite par teamIndex (identifiant public) et non socketId
(jamais exposé au client via getPlayersInfo/getStateFor) — le serveur
résout teamIndex -> joueur réel au moment de la résolution.
- Nouvel event socket 'buy-event-draw' (effet immédiat) et 'play-event'
(résolution différée), eventResults inclus dans round-result.
- Client : events.js (miroir), EventCardObject.js (carte épurée façon
CardObject, badge rouge "!" pour les événements à effet négatif).
BootScene génère les textures plein cadre (méthode _generateClippedTexture
généralisée, réutilisée avec les personnages).
- GameScene : bouton de pioche à droite du bouton de confirmation (état
grisé selon jauges/main pleine/pioche déjà tentée), seconde main de cartes
événement (max 2) au-dessus de ce bouton, sélection d'une carte pour la
jouer avec séquence de ciblage interactive (surbrillance des slots
adversaires cliquables) pour Accord royal et la variante Trousse
d'Épidémie.
- 61 nouveaux tests unitaires serveur (events.js + Room.js : pioche, choix
de jouer, résolution des 6 effets avec/sans synergie, Complot découvert,
ordre événements-avant-personnages, deck partagé).
- Nouveaux helpers et tests d'intégration E2E Playwright (e2e/tests/events.spec.js)
pour la pioche, la limite de main à 2, et les 6 effets — certains
scénarios restent probabilistes (pioche aléatoire dans le deck partagé) et
peuvent nécessiter une stabilisation supplémentaire du timing.
- Nouveau server/src/game/buildings.js : 2 bâtiments, chacun couvrant 2
attributs, coût réparti sur les deux jauges, garantit +1 par tour sur
chaque attribut, avec bonus de synergie +1 si l'objet correspondant est
aussi possédé (Église+Trousse/Sceau, Château+Charrue/Trébuchet).
- Room.js : buyBuilding() (validation coût multi-jauges), résolution des
achats en attente avec la même priorité/stock unique que les objets,
_applyBuildingEffects() (garantie de base + synergie, jamais de recul par
rapport aux gains déjà boostés par un objet). getStateFor/getPlayersInfo
exposent buildings/myBuildings/availableBuildings/pendingBuyBuildingId.
- Nouvel event socket 'buy-building', boughtBuildings inclus dans round-result.
- Client : buildings.js (miroir), BootScene génère les textures portrait des
bâtiments (méthode _generatePortraitTexture généralisée, réutilisée avec
les objets). ItemBoardToken généralisé (kind='item'|'building', hAnchor
'left'|'right') pour afficher indifféremment un objet ou un bâtiment, avec
coût détaillé par jauge affiché sur la carte agrandie pour les bâtiments.
- GameScene : boutique de bâtiments en colonne à DROITE du plateau
(symétrique à la boutique d'objets à gauche), mes bâtiments possédés
affichés à GAUCHE de ma main (symétrique à mes objets à droite), bâtiments
des adversaires affichés sous leurs objets au niveau de leur slot.
- Fix : la carte détaillée héritait par défaut d'un ancrage "s'étend vers la
droite" adapté à la boutique d'objets (bord gauche du canvas) mais cassait
la boutique de bâtiments (bord droit) — le bouton ACHETER se retrouvait
hors du canvas et donc injoignable au clic. Ajout du paramètre hAnchor.
- 26 nouveaux tests unitaires serveur (buildings.js + Room.js : validations
d'achat multi-jauges, priorité/stock unique, effets de base et synergie).
- 6 nouveaux tests E2E Playwright (boutique bâtiments : affichage, position,
carte détaillée dans les limites du canvas, coût affiché, achat complet).
- Fix flakiness des tests E2E d'achat (item-shop + building-shop) : le mode
'min' de playCard garantit désormais que l'adversaire joue sa carte la
plus faible sur l'attribut ciblé, au lieu de simplement jouer un autre
attribut (insuffisant, le gain dépend de la comparaison au voisin gauche).
- Fix: UIScene n'était jamais lancée (active: false, jamais scene.launch)
donc l'event 'game-over' du serveur n'était jamais affiché — la partie
semblait ne pas avoir de fin. Remplacé par un panneau Vue dans GameView
(vainqueur, classement trié, bouton Quitter via vue-router). UIScene.js
supprimée (code mort).
- Extraction de client/src/utils/hudUtils.js (constantes ATTRS/couleurs et
gaugePercent) depuis GameView.vue pour les rendre testables isolément.
- Tests unitaires client (Vitest) : store Pinia (game.js) et hudUtils
(24 tests, client/test/unit/).
- Tests d'intégration E2E (Playwright, e2e/) avec de vrais clients
Socket.io et rendu Phaser réel dans Chromium :
* game-flow.spec.js : lobby → démarrage → main de 4 cartes → résolution
* item-shop.spec.js : boutique, bouton désactivé si jauge insuffisante,
achat retire l'objet pour tous + effet appliqué + affiché sur la table
* game-over.spec.js : partie complète (12 tours) → panneau de fin
webServer démarre automatiquement client+serveur ; ajout d'une route
GET /health côté Express pour permettre à Playwright de détecter un
serveur déjà démarré.
- README : documentation des 3 niveaux de tests (unitaires serveur,
unitaires client, intégration E2E) et de la nouvelle arborescence.