1 import { ChessRules
} from "@/base_rules";
3 export class ChakartRules
extends ChessRules
{
4 // NOTE: getBasicMove, ajouter les bonus à vanish array
5 // + déterminer leur effet (si cavalier) ou case (si banane ou bombe)
6 // (L'effet doit être caché au joueur : devrait être OK)
8 // Saut possible par dessus bonus ou champis mais pas bananes ou bombes
10 // FEN : immobilized (pas flag), castle flags + flags peach (power used?)
11 // "pièces" supplémentaires : bananes, bombes, champis, bonus --> + couleur ?
12 // (Semble mieux sans couleur => couleur spéciale indiquant que c'est pas jouable)
13 // (Attention: pas jouables cf. getPotentialMoves...)
15 setOtherVariables(fen
) {
16 super.setOtherVariables(fen
);
20 getPotentialMovesFrom([x
, y
]) {
21 // TODO: bananes et bombes limitent les déplacements (agissent comme un mur "capturable")
22 // bananes jaunes et rouges ?! (agissant sur une seule couleur ?) --> mauvaise idée.
23 if (this.subTurn
== 2) {
24 // TODO: coup compatible avec firstMove
28 getPotentialPawnMoves(sq
) {
30 // laisse sur sa case de départ un champi turbo permettant à Peach d'aller
31 // une case plus loin, et aux pièces arrivant sur cette case de sauter par
32 // dessus une pièce immédiatement adjacente (en atterissant juste derrière).
35 // Coups en 2 temps (si pose)
36 getPotentialRookMoves(sq
) {
38 // pose une banane (optionnel) sur une case adjacente (diagonale) à celle d'arrivée
39 // Si une pièce arrive sur la peau de banane, alors elle effectue un déplacement
40 // aléatoire d'une (2?) case (vertical ou horizontal) depuis sa position finale.
43 // Coups en 2 temps (si pose)
44 getPotentialBishopMoves([x
, y
]) {
46 // pose une bombe (optionnel) sur une case orthogonalement adjacente à la case d'arrivée
47 // Si une pièce arrive sur une bombe, alors elle effectue un déplacement diagonal
48 // aléatoire d'une (2?) case depuis sa position finale (juste une case si impossible).
51 getPotentialKnightMoves([x
, y
]) {
53 // laisse sur sa case de départ un bonus aléatoire
54 // (NOTE: certains bonus pourraient ne pas être applicables ==> pion bloqué par exemple)
55 // - i) roi boo(*E*) : échange avec n'importe quelle pièce (choix du joueur, type et/ou couleur différents)
56 // à condition que la position résultante ne soit pas un auto-échec
57 // - i*) koopa(*B*) : ramène sur la case initiale
58 // - ii) toadette(*R*) : permet de poser une pièce capturée sur le plateau
59 // (n'importe où sauf 8eme rangée pour les pions)
60 // - ii*) chomp(*W*) : mange la pièce ; si c'est Peach, c'est perdu
61 // - iii) daisy(*T*) : permet de rejouer un coup avec la même pièce --> cumulable si ensuite coup sur bonus Daisy.
62 // - iii*) bowser(*M*) : immobilise la pièce (marquée jaune/rouge), qui ne pourra pas jouer au tour suivant
63 // - iv) luigi(*L*) : fait changer de camp une pièce adverse (aléatoire ?) (sauf le roi)
64 // - iv*) waluigi(*D*) : fait changer de camp une de nos pièces (aléatoire ?) (sauf le roi)
65 // --> i, ii, iii en deux temps (subTurn 1 & 2)
66 // iii* : indication dans FEN (immobilized)
69 getPotentialQueenMoves(sq
) {
71 // pouvoir "casquette ailée" (à chaque coup?) : peut sauter par dessus n'importe quelle pièce (une seule), sans la capturer.
74 getPotentialKingMoves(sq
) {
76 // Carapace rouge (disons ^^) jouable une seule fois dans la partie,
77 // au lieu de se déplacer. Capture un ennemi au choix parmi les plus proches,
78 // à condition qu'ils soient visible (suivant les directions de déplacement d'une dame).
79 // Profite des accélérateurs posés par les pions (+ 1 case : obligatoire).
83 // TODO: subTurn passe à 2 si potentiellement pose (tour, fou) ou si choix (reconnaître i (ok), ii (ok) et iii (si coup normal + pas immobilisé) ?)
84 // voire +2 si plusieurs daisy...
88 // TODO: reconnaissance inverse si subTurn == 1 --> juste impossible ==> marquer pendant play (comme DoubleMove1 : move.turn = ...)
91 //atLeastOneMove() should be OK
94 // A click to promote a piece on subTurn 2 would trigger this.
95 // For now it would then return [NaN, NaN] because surrounding squares
96 // have no IDs in the promotion modal. TODO: improve this?
97 if (isNaN(square
[0])) return null;
99 // if square is empty && firstMove is compatible,
100 // complete the move (banana or bomb).
101 // if square not empty, just complete with empty move
102 const Lf
= this.firstMove
.length
;
103 if (this.subTurn
== 2) {
105 this.board
[square
[0]][square
[1]] == V
.EMPTY
&&
106 !this.underCheck(this.turn
) &&
107 (La
== 0 || !this.oppositeMoves(this.amoves
[La
-1], this.firstMove
[Lf
-1]))
110 start: { x: -1, y: -1 },
111 end: { x: -1, y: -1 },
121 // TODO: king may also be "chomped"
122 super.updateCastleFlags(move, piece
);
126 if (this.kingPos
[this.turn
][0] < 0)
127 // King captured (or "chomped")
128 return this.turn
== "w" ? "0-1" : "1-0";
129 const color
= V
.GetOppCol(this.turn
);
130 const lastRank
= (color
== 'w' ? 0 : 7);
131 if (this.kingPos
[color
][0] == lastRank
)
132 // The opposing edge is reached!
133 return color
== "w" ? "1-0" : "0-1";
134 if (this.atLeastOneMove()) return "*";
136 const oppCol
= this.turn
;
137 if (!this.underCheck(oppCol
)) return "1/2";
138 return (oppCol
== "w" ? "0-1" : "1-0");
139 //TODO: But = capturer la princesse adverse. Variante : but = la princesse arrive de l'autre côté de l'échiquier.
140 //==> On peut mixer ces deux conditions : arriver au bout du plateau ou capturer la princesse adverse.
145 // TODO: random mover
149 //Si une pièce pose quelque chose sur une case ça remplace ce qui y était déjà.
150 //Pas de condition de pat, puisque l'objectif est la capture de la reine :)