- 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.
62 lines
2.0 KiB
JavaScript
62 lines
2.0 KiB
JavaScript
const { test, describe } = require('node:test')
|
|
const assert = require('node:assert/strict')
|
|
|
|
const { EVENTS, getEventById, buildEventDeck, DRAW_COST } = require('../../src/game/events')
|
|
|
|
describe('events.js', () => {
|
|
test('expose exactement 6 événements', () => {
|
|
assert.equal(EVENTS.length, 6)
|
|
})
|
|
|
|
test('chaque événement a un id unique', () => {
|
|
const ids = EVENTS.map(e => e.id)
|
|
assert.equal(new Set(ids).size, ids.length)
|
|
})
|
|
|
|
test('DRAW_COST demande 1 point dans chacune des 4 jauges', () => {
|
|
assert.deepEqual(DRAW_COST, { food: 1, war: 1, health: 1, diplo: 1 })
|
|
})
|
|
|
|
test('chaque événement utilise DRAW_COST comme coût de pioche', () => {
|
|
for (const e of EVENTS) {
|
|
assert.deepEqual(e.cost, DRAW_COST)
|
|
}
|
|
})
|
|
|
|
describe('getEventById', () => {
|
|
test('retourne l\'événement correspondant à un id existant', () => {
|
|
const epidemic = getEventById('epidemic')
|
|
assert.ok(epidemic)
|
|
assert.equal(epidemic.name, 'Épidémie')
|
|
})
|
|
|
|
test('retourne null pour un id inconnu', () => {
|
|
assert.equal(getEventById('does-not-exist'), null)
|
|
})
|
|
|
|
test('retourne null pour undefined/null', () => {
|
|
assert.equal(getEventById(undefined), null)
|
|
assert.equal(getEventById(null), null)
|
|
})
|
|
})
|
|
|
|
describe('buildEventDeck', () => {
|
|
test('contient exactement 18 cartes (3 exemplaires de chacun des 6 événements)', () => {
|
|
const deck = buildEventDeck()
|
|
assert.equal(deck.length, 18)
|
|
})
|
|
|
|
test('contient exactement 3 exemplaires de chaque id', () => {
|
|
const deck = buildEventDeck()
|
|
const counts = {}
|
|
deck.forEach(id => { counts[id] = (counts[id] ?? 0) + 1 })
|
|
EVENTS.forEach(e => assert.equal(counts[e.id], 3, `${e.id} devrait apparaître 3 fois`))
|
|
})
|
|
|
|
test('mélange le deck (l\'ordre n\'est pas systématiquement identique entre deux appels)', () => {
|
|
const decks = Array.from({ length: 5 }, () => buildEventDeck().join(','))
|
|
assert.ok(new Set(decks).size > 1, 'les decks mélangés devraient différer entre les appels')
|
|
})
|
|
})
|
|
})
|