| 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 | }; |