/** * Regnum - Définition des 12 personnages * * Chaque carte possède 4 attributs (valeurs de 1 à 6) : * food (🟡 Nourriture) - coin haut gauche - jaune * war (🔴 Guerre) - coin haut droite - rouge * health(🟢 Santé) - coin bas gauche - vert * diplo (🔵 Diplomatie) - coin bas droite - bleu * * Toutes les équipes ont exactement le même deck de 12 cartes, * seule la couleur d'équipe change visuellement. */ const CHARACTERS = [ { id: 'queen', name: 'Reine', food: 2, war: 2, health: 3, diplo: 5, description: 'Maîtresse de la diplomatie, elle tisse des alliances avec dextérité.' }, { id: 'prince', name: 'Prince', food: 2, war: 4, health: 2, diplo: 4, description: 'Héritier du trône, équilibré entre le glaive et la parole.' }, { id: 'butcher', name: 'Boucher', food: 5, war: 3, health: 1, diplo: 1, description: 'Maître des viandes, il nourrit le peuple mais soigne peu.' }, { id: 'doctor', name: 'Médecin', food: 2, war: 1, health: 6, diplo: 3, description: 'Expert en guérison, indispensable à la survie du royaume.' }, { id: 'apothecary', name: 'Apothicaire', food: 3, war: 1, health: 5, diplo: 3, description: 'Prépare potions et remèdes, soutien précieux en temps de crise.' }, { id: 'jester', name: 'Fou du Roi', food: 1, war: 1, health: 2, diplo: 6, description: 'Sa sagesse cachée derrière la bouffonnerie fait des miracles diplomatiques.' }, { id: 'assassin', name: 'Assassin', food: 1, war: 6, health: 1, diplo: 2, description: 'Frappe dans l\'ombre, inarrêtable au combat mais inutile ailleurs.' }, { id: 'peasant', name: 'Paysan', food: 6, war: 2, health: 2, diplo: 1, description: 'Nourrit tout le royaume, force vitale de toute civilisation.' }, { id: 'executioner', name: 'Bourreau', food: 2, war: 5, health: 1, diplo: 2, description: 'Bras armé de la justice royale, redouté de tous.' }, { id: 'knight', name: 'Chevalier', food: 3, war: 5, health: 2, diplo: 2, description: 'Défenseur du royaume, vaillant sur le champ de bataille.' }, { id: 'merchant', name: 'Marchand', food: 4, war: 1, health: 2, diplo: 5, description: 'Ses routes commerciales enrichissent et lient les royaumes.' }, { id: 'bishop', name: 'Évêque', food: 2, war: 1, health: 4, diplo: 5, description: 'Voix de l\'Église, il guérit les âmes et négocie la paix.' } ] /** * Couleurs des 4 équipes (teinte principale de la carte) */ const TEAM_COLORS = { 0: { name: 'Écarlate', hex: 0xcc2200, css: '#cc2200' }, 1: { name: 'Azur', hex: 0x1155cc, css: '#1155cc' }, 2: { name: 'Émeraude', hex: 0x1a7a2e, css: '#1a7a2e' }, 3: { name: 'Or', hex: 0xb8860b, css: '#b8860b' } } /** * Attributs visuels fixes (couleur de chaque coin) */ const ATTR_COLORS = { food: { hex: 0xf0c030, css: '#f0c030', label: 'Nourriture', corner: 'topLeft' }, war: { hex: 0xdd2222, css: '#dd2222', label: 'Guerre', corner: 'topRight' }, health: { hex: 0x22aa44, css: '#22aa44', label: 'Santé', corner: 'bottomLeft' }, diplo: { hex: 0x3399ee, css: '#3399ee', label: 'Diplomatie', corner: 'bottomRight' } } /** * Retourne le deck complet (les 12 personnages) pour une équipe donnée */ function getDeckForTeam(teamIndex) { return CHARACTERS.map(c => ({ ...c, teamIndex, teamColor: TEAM_COLORS[teamIndex] })) } /** * Distribue une main de N cartes par joueur depuis un deck mélangé */ function shuffle(arr) { const a = [...arr] for (let i = a.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [a[i], a[j]] = [a[j], a[i]] } return a } /** * Pour chaque joueur : retourne { hand, deck } (hand = les N premières cartes, deck = le reste) */ function dealHands(playerCount, handSize = 4) { const result = [] for (let i = 0; i < playerCount; i++) { const deck = shuffle(getDeckForTeam(i)) result.push({ hand: deck.slice(0, handSize), deck: deck.slice(handSize) // cartes restantes à piocher }) } return result } module.exports = { CHARACTERS, TEAM_COLORS, ATTR_COLORS, getDeckForTeam, dealHands }