# Boardgame (Mobdays)
# Boardgame
Faire jouer un joueur pendant son propre tour -> https://boardgame.io/documentation/#/stages?id=stages
```ts
const cardTypes = ["mulet", "choucroute", "cloclo", "mout-mout", "clavihairist", "sidecut", "belle-zebuth", "double-face", "mimi-reille", "malaise-en-japonais"] as const
```
## Espionne
> "À la fin de la manche, si vous êtes le seul joueur encore en lice qui a joué ou défaussé une Espionne, vous gagnez 1 pion faveur."
⚠️ pas cumulable (1 pion même si le même joueur défausse 2 fois l'éspionne dans une même manche)
⚠️ doit rester visible (en défausse + indicateur sur le joueur)
- event : fin de manche (`endIf`)
-> résolution :
```ts
const spyCards = discardedCards.filter(card => card.cardName === Card.PRINCE);
const playHasWonPoint = spyCards.length > 1 ? spyCards[0].player === spyCards[1].player: true;
```
```ts
type DiscardedCard = {
cardName: Card.PRINCE
player: number
}
type DiscardedCards : DiscardedCard[]
```
```ts
{
currentPlayer: '0',
playOrder: ['0', '1',],
playOrderPos: 0,
}
```
## Garde
> "Choisissez un autre joueur et nommez un personnage autre que le Garde. Si le joueur choisi a cette carte en main, il quitte la manche"
moves :
1. sélectionner le Garde
2. choisir un joueur
3. nommer une carte
résolution -> le joueur sélectionné quitte la partie ou non
```ts
type PlayingPlayers = Player[]
```
## Prêtre
> "Choisissez un autre joueur et regardez sa main."
moves :
1. sélectionner le Prêtre
2. choisir un autre joueur
3. regarder la main du joueur choisi et timeout de fin ? ou 4. action de terminer son tour
```ts
type VisibleHands = {
player: number;
otherHands: number[];
}
type Player = {
visibleHands: VisibleHands;
}
```
exemple :
```ts
const firstPlayVisibleHands:VisibleHands = {
player: 1,
otherHands: [1]
}
// peut voir la main du joueur 2
firstPlayVisibleHands.otherHands.push(2) // ⚠️ à `Immer` https://boardgame.io/documentation/#/immutability
```
## Baron
> "Choisissez un autre joueur et comparez discrètement vos mains. Celui dont la carte a la plus faible valeur quitte la manche."
moves :
1. Sélectionner le Baron
2. choisir un autre joueur
-> le joueur avec la carte la plus faible quitte la partie
## Servante
> "Jusqu'à votre prochain tour, les effets de cartes des autres joueurs ne peuvent pas vous cibler."
moves :
1. Sélectionner la Servante
2. le joueur actuel n'est pas une cible éligible (`targetablePlayers`) jusqu'à son prochain tour
-> résolution : au début de chaque tour d'un joueur on vérifie qu'il est dans la liste des `targetablePlayers`, s'il ne l'est pas on l'ajoute
```ts
type TargetablePlayer = number[];
```
## Prince
> "Choisissez n'importe quel joueur, y compris vous même. Le joueur choisi défausse sa main et en pioche une nouvelle."
moves :
1. sélectionner Prince
2. sélectionner un joueur
3. le joueur ciblé discard deux cartes (`hand.pop(2)`)
-> résolution : le joueur ciblé pioche une carte du deck (deck.pop, hand.push)
⚠️ cas de la princesse
```ts
function PlayPrince(G, ctx) {
ctx.events.setActivePlayers({ others: 'prince', minMoves: 2, maxMoves: 2 });
}
const game = {
moves: { PlayPrince },
turn: {
stages: {
prince: {
moves: { Discard, Draw },
},
},
},
};
```
## Chancelier
> "Piochez 2 cartes. Conservez 1 carte et placez les 2 autres dans l'ordre de votre choix sous le paquet."
moves :
1. sélectionner le Chancelier
-> piocher 2 cartes (deck.pop(2), hand.push(2))
⚠️ si plus qu'une carte on la pioche
## Roi
> "Choisissez un autre joueur et échangez vos mains."
moves :
1. sélectionner le Roi
2. sélectionner un autre joueur
-> le joueur actuel a la main du joueur sélectionné et le joueur sélectionné a la main du joueur actuel
## Comtesse
> "Si votre main contient le Roi ou un Prince, vous devez jouer la Comtesse."
event : le joueur qui a la comtesse en main pioche une carte
-> si la carte piochée est un roi ou un prince, play Prince ou Roi
## Princesse
> "Si vous jouez ou défaussez la Princesse, vous quittez la manche."
La partie s'arrête à l'épuisement du paquet -> comparaison une fois que tous les effets ont été appliqués