- Nouveaux personnages illustrés (12 PNG remplacés dans client/public/cards) - 4 objets achetables (Trébuchet, Charrue, Trousse du Médecin, Sceau Royal) avec effets permanents (double_gain, guaranteed_gain, copy_best_in_game), stock unique par partie, priorité d'achat tournante entre joueurs - Boutique en colonne à gauche du plateau : icônes compactes, carte détaillée agrandie au survol (taille découplée du displayScale du jeton), bouton ACHETER actif/grisé selon la jauge du joueur, retrait immédiat de la colonne une fois l'objet acheté (les autres remontent pour combler) - Objets achetés affichés "posés sur la table" : à côté de la main pour soi, sous le slot de jeu pour les adversaires - Icône du premier joueur (priorité d'achat) dans le HUD Vue - Refonte des cartes personnage (CardObject) : portrait plein cadre épuré, valeurs d'attribut discrètes aux 4 coins - Fix removePlayer : nettoyage de pendingBuys/pendingPlays et recalage de firstPlayerIndex à la déconnexion d'un joueur - 77 tests unitaires serveur (node:test) : cards, items, Room, RoomManager - README mis à jour avec les règles complètes du jeu - .gitignore : exclusion de .idea/ et .serena/ (artefacts d'outils locaux)
105 lines
3.6 KiB
Markdown
105 lines
3.6 KiB
Markdown
# Regnum
|
|
|
|
Jeu de cartes en ligne multijoueur (2-4 joueurs). Collecte des points en jouant des cartes de royaume simultanément pendant X tours.
|
|
|
|
## Stack
|
|
|
|
- **Frontend** : Vue 3 + Phaser 3 + Pinia
|
|
- **Backend** : Node.js + Express + Socket.io
|
|
- **Temps réel** : WebSockets
|
|
|
|
## Structure
|
|
|
|
```
|
|
regnum/
|
|
├── client/ # Vue 3 + Phaser 3
|
|
│ └── src/
|
|
│ ├── views/ # HomeView, LobbyView, GameView
|
|
│ ├── game/ # Scènes Phaser (Boot, Game, UI) + objets
|
|
│ ├── stores/ # Pinia store
|
|
│ └── services/# Socket.io client
|
|
└── server/ # Node.js
|
|
└── src/
|
|
├── game/ # Room, RoomManager, cards
|
|
└── index.js # Serveur Express + Socket.io
|
|
```
|
|
|
|
## Lancement
|
|
|
|
### Serveur
|
|
```bash
|
|
cd server
|
|
npm install
|
|
npm run dev
|
|
```
|
|
|
|
### Client
|
|
```bash
|
|
cd client
|
|
npm install
|
|
npm run dev
|
|
```
|
|
|
|
Ouvrir `http://localhost:5173`
|
|
|
|
## Tests
|
|
|
|
Tests unitaires du moteur de jeu (serveur), avec le test runner natif de Node.js :
|
|
|
|
```bash
|
|
cd server
|
|
npm test # exécution unique
|
|
npm run test:watch # mode watch
|
|
```
|
|
|
|
## Règles
|
|
|
|
### Principe général
|
|
|
|
- 2 à 4 joueurs par partie, chacun avec son propre deck des mêmes 12 personnages (seule la couleur d'équipe change).
|
|
- Chaque joueur commence avec une main de 4 cartes ; le reste du deck (8 cartes) est pioché une carte par tour.
|
|
- La partie dure **12 tours**. Elle se termine avant si tous les joueurs n'ont plus ni carte en main ni carte à piocher.
|
|
- Chaque tour, tous les joueurs choisissent **simultanément** une carte (cachée), puis les cartes sont révélées et résolues en même temps.
|
|
|
|
### Les 4 jauges
|
|
|
|
Chaque personnage possède 4 attributs (valeurs de 1 à 6), qui correspondent à 4 jauges cumulées par le joueur pendant toute la partie :
|
|
|
|
| Jauge | Icône |
|
|
|---|---|
|
|
| Nourriture | 🟡 |
|
|
| Guerre | 🔴 |
|
|
| Santé | 🟢 |
|
|
| Diplomatie | 🔵 |
|
|
|
|
### Résolution d'un tour
|
|
|
|
Pour chaque attribut, un joueur compare la valeur de sa carte jouée à celle de son **voisin de gauche** (ordre des joueurs dans la partie, en boucle) :
|
|
|
|
```
|
|
gain = max(0, ma_valeur - valeur_du_voisin_de_gauche)
|
|
```
|
|
|
|
Le gain (jamais négatif) est ajouté à la jauge correspondante du joueur. Le score total d'un joueur est la somme de ses 4 jauges.
|
|
|
|
### Les 12 personnages
|
|
|
|
Reine, Prince, Boucher, Médecin, Apothicaire, Fou du Roi, Assassin, Paysan, Bourreau, Chevalier, Marchand, Évêque — chacun avec un profil d'attributs différent (ex : le Paysan est fort en Nourriture mais faible en Diplomatie, l'Assassin est très fort en Guerre mais faible partout ailleurs).
|
|
|
|
### Objets achetables
|
|
|
|
Pendant la phase de sélection, un joueur peut dépenser des points d'une jauge pour acheter un objet, qui procure un **effet permanent** pour le reste de la partie tant qu'il le possède. Chaque objet coûte 3 points et n'existe qu'en **un seul exemplaire** pour toute la partie (premier arrivé, premier servi) :
|
|
|
|
| Objet | Jauge liée | Effet |
|
|
|---|---|---|
|
|
| Trébuchet | 🔴 Guerre | Double le gain de Guerre à chaque tour |
|
|
| Charrue | 🟡 Nourriture | Double le gain de Nourriture à chaque tour |
|
|
| Trousse du Médecin | 🟢 Santé | Garantit +2 en Santé à chaque tour, quel que soit le résultat |
|
|
| Sceau Royal | 🔵 Diplomatie | Copie le meilleur gain de Diplomatie parmi tous les autres joueurs |
|
|
|
|
En cas de conflit (plusieurs joueurs achètent le même objet le même tour), c'est le joueur le plus proche du **"premier joueur"** du tour (rôle qui tourne entre les joueurs à chaque tour) qui l'obtient ; les autres conservent leurs points.
|
|
|
|
### Fin de partie
|
|
|
|
Le joueur avec le score total (somme des 4 jauges) le plus élevé après 12 tours remporte la partie.
|