184 lines
4.4 KiB
JavaScript
184 lines
4.4 KiB
JavaScript
/**
|
|
* 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 }
|