e8b95cb1d4e67d4f6ca4bbcbb6adf35f07d5e94f
[vchess.git] / client / src / variants / Chakart.js
1 import { ChessRules } from "@/base_rules";
2
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)
7 //
8 // Saut possible par dessus bonus ou champis mais pas bananes ou bombes
9
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...)
14
15 setOtherVariables(fen) {
16 super.setOtherVariables(fen);
17 this.subTurn = 1;
18 }
19
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
25 }
26 }
27
28 getPotentialPawnMoves(sq) {
29 //Toad: pion
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).
33 }
34
35 // Coups en 2 temps (si pose)
36 getPotentialRookMoves(sq) {
37 //Donkey : tour
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.
41 }
42
43 // Coups en 2 temps (si pose)
44 getPotentialBishopMoves([x, y]) {
45 //Wario: fou
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).
49 }
50
51 getPotentialKnightMoves([x, y]) {
52 //Yoshi: cavalier
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)
67 }
68
69 getPotentialQueenMoves(sq) {
70 //Mario: dame
71 // pouvoir "casquette ailée" (à chaque coup?) : peut sauter par dessus n'importe quelle pièce (une seule), sans la capturer.
72 }
73
74 getPotentialKingMoves(sq) {
75 //Peach: roi
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).
80 }
81
82 play(move) {
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...
85 }
86
87 undo(move) {
88 // TODO: reconnaissance inverse si subTurn == 1 --> juste impossible ==> marquer pendant play (comme DoubleMove1 : move.turn = ...)
89 }
90
91 //atLeastOneMove() should be OK
92
93 doClick(square) {
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 (!square[0]) return null;
98 // If subTurn == 2:
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) {
104 if (
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]))
108 ) {
109 return {
110 start: { x: -1, y: -1 },
111 end: { x: -1, y: -1 },
112 appear: [],
113 vanish: []
114 };
115 }
116 }
117 return null;
118 }
119
120 postPlay(move) {
121 // TODO: king may also be "chomped"
122 super.updateCastleFlags(move, piece);
123 }
124
125 getCurrentScore() {
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 "*";
135 // Game over
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.
141 return '*';
142 }
143
144 getComputerMove() {
145 // TODO: random mover
146 }
147
148 //Détails :
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 :)
151 };