Commit | Line | Data |
---|---|---|
6c7cbfed BA |
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 | ||
fa74f624 | 35 | // Coups en 2 temps (si pose possible) |
6c7cbfed BA |
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 | ||
1c15969e BA |
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? | |
107dc1bd | 97 | if (isNaN(square[0])) return null; |
1c15969e BA |
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 | ||
6c7cbfed | 125 | getCurrentScore() { |
1c15969e BA |
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"); | |
6c7cbfed BA |
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 | ||
1c15969e BA |
144 | getComputerMove() { |
145 | // TODO: random mover | |
146 | } | |
147 | ||
6c7cbfed BA |
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 | }; |