X-Git-Url: https://git.auder.net/?p=vchess.git;a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FChakart.js;h=ee3695e73f117552f848c92f79815eb669038e53;hp=8c0a837d1baa8d185d7e56af835ab8adc4ae5779;hb=90df90bca1a993930a0e1a07a1b4990dd538c6e2;hpb=7a1d72724ca06099ac87f094e7216d29a05c7a3e diff --git a/client/src/variants/Chakart.js b/client/src/variants/Chakart.js index 8c0a837d..ee3695e7 100644 --- a/client/src/variants/Chakart.js +++ b/client/src/variants/Chakart.js @@ -6,12 +6,44 @@ export class ChakartRules extends ChessRules { // (L'effet doit être caché au joueur : devrait être OK) // // Saut possible par dessus bonus ou champis mais pas bananes ou bombes +//==> redefinir isAttackedBySlide et getPotentialSlide... - // FEN : immobilized (pas flag), castle flags + flags peach (power used?) +// keep track of captured pieces: comme Grand; pieces can get back to board with toadette bonus. +// --> pour ce bonus, passer "capture" temporairement en "reserve" pour permettre de jouer le coup. + + // FEN : castle flags + flags peach (power used?) + Mario (invisibility used? --> move notation Q??) // "pièces" supplémentaires : bananes, bombes, champis, bonus --> + couleur ? // (Semble mieux sans couleur => couleur spéciale indiquant que c'est pas jouable) // (Attention: pas jouables cf. getPotentialMoves...) + hoverHighlight(x, y) { + // TODO: exact squares + return this.subTurn == 2; //&& this.firstMove.donkey or wario or bonus roi boo + } + + // king can be l or L (immobilized) --> copy-paste from Alice variant + static IsGoodPosition(position) { + if (position.length == 0) return false; + const rows = position.split("/"); + if (rows.length != V.size.x) return false; + let kings = { "k": 0, "K": 0 }; + for (let row of rows) { + let sumElts = 0; + for (let i = 0; i < row.length; i++) { + if (['K','k'].includes(row[i])) kings[row[i]]++; + if (V.PIECES.includes(row[i].toLowerCase())) sumElts++; + else { + const num = parseInt(row[i]); + if (isNaN(num)) return false; + sumElts += num; + } + } + if (sumElts != V.size.y) return false; + } + if (Object.values(kings).some(v => v != 1)) return false; + return true; + } + setOtherVariables(fen) { super.setOtherVariables(fen); this.subTurn = 1; @@ -23,13 +55,15 @@ export class ChakartRules extends ChessRules { if (this.subTurn == 2) { // TODO: coup compatible avec firstMove } + //Détails : + //Si une pièce pose quelque chose sur une case ça remplace ce qui y était déjà. } getPotentialPawnMoves(sq) { //Toad: pion - // laisse sur sa case de départ un champi turbo permettant à Peach d'aller - // une case plus loin, et aux pièces arrivant sur cette case de sauter par - // dessus une pièce immédiatement adjacente (en atterissant juste derrière). + // laisse sur sa case de départ un champi turbo permettant à Peach et cavalier et autres pions d'aller + // un dep plus loin (evt 2 cases si pion saut initial), et aux pièces arrivant sur cette case de sauter par + // dessus une pièce immédiatement adjacente dans leur trajectoire (en atterissant juste derrière). } // Coups en 2 temps (si pose possible) @@ -53,43 +87,47 @@ export class ChakartRules extends ChessRules { // laisse sur sa case de départ un bonus aléatoire // (NOTE: certains bonus pourraient ne pas être applicables ==> pion bloqué par exemple) // - i) roi boo(*E*) : échange avec n'importe quelle pièce (choix du joueur, type et/ou couleur différents) - // à condition que la position résultante ne soit pas un auto-échec // - i*) koopa(*B*) : ramène sur la case initiale // - ii) toadette(*R*) : permet de poser une pièce capturée sur le plateau // (n'importe où sauf 8eme rangée pour les pions) // - ii*) chomp(*W*) : mange la pièce ; si c'est Peach, c'est perdu // - iii) daisy(*T*) : permet de rejouer un coup avec la même pièce --> cumulable si ensuite coup sur bonus Daisy. // - iii*) bowser(*M*) : immobilise la pièce (marquée jaune/rouge), qui ne pourra pas jouer au tour suivant - // - iv) luigi(*L*) : fait changer de camp une pièce adverse (aléatoire ?) (sauf le roi) - // - iv*) waluigi(*D*) : fait changer de camp une de nos pièces (aléatoire ?) (sauf le roi) + // - iv) luigi(*L*) : fait changer de camp une pièce adverse (aléatoire) (sauf le roi) + // - iv*) waluigi(*D*) : fait changer de camp une de nos pièces (aléatoire, sauf le roi) // --> i, ii, iii en deux temps (subTurn 1 & 2) - // iii* : indication dans FEN (immobilized) } getPotentialQueenMoves(sq) { //Mario: dame - // pouvoir "casquette ailée" (à chaque coup?) : peut sauter par dessus n'importe quelle pièce (une seule), sans la capturer. + // pouvoir "fantôme" : peut effectuer une fois dans la partie un coup non-capturant invisible (=> choix à chaque coup, getPPpath(m) teste m.nvisible...) + //wg bg ghost once in the game the queen can make an invisible move --> printed as "?" } getPotentialKingMoves(sq) { //Peach: roi // Carapace rouge (disons ^^) jouable une seule fois dans la partie, // au lieu de se déplacer. Capture un ennemi au choix parmi les plus proches, - // à condition qu'ils soient visible (suivant les directions de déplacement d'une dame). + // à condition qu'ils soient visibles (suivant les directions de déplacement d'une dame). // Profite des accélérateurs posés par les pions (+ 1 case : obligatoire). } + atLeastOneMove() { + // TODO: check that + return true; + } + play(move) { - // 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é) ?) + // TODO: subTurn passe à 2 si arrivée sur bonus cavalier + // potentiellement pose (tour, fou) ou si choix (reconnaître i (ok), ii (ok) et iii (si coup normal + pas immobilisé) ?) // voire +2 si plusieurs daisy... + // si pièce immobilisée de ma couleur : elle redevient utilisable (changer status fin de play) } undo(move) { // TODO: reconnaissance inverse si subTurn == 1 --> juste impossible ==> marquer pendant play (comme DoubleMove1 : move.turn = ...) } - //atLeastOneMove() should be OK - doClick(square) { // A click to promote a piece on subTurn 2 would trigger this. // For now it would then return [NaN, NaN] because surrounding squares @@ -126,26 +164,11 @@ export class ChakartRules extends ChessRules { if (this.kingPos[this.turn][0] < 0) // King captured (or "chomped") return this.turn == "w" ? "0-1" : "1-0"; - const color = V.GetOppCol(this.turn); - const lastRank = (color == 'w' ? 0 : 7); - if (this.kingPos[color][0] == lastRank) - // The opposing edge is reached! - return color == "w" ? "1-0" : "0-1"; - if (this.atLeastOneMove()) return "*"; - // Game over - const oppCol = this.turn; - if (!this.underCheck(oppCol)) return "1/2"; - return (oppCol == "w" ? "0-1" : "1-0"); - //TODO: But = capturer la princesse adverse. Variante : but = la princesse arrive de l'autre côté de l'échiquier. - //==> On peut mixer ces deux conditions : arriver au bout du plateau ou capturer la princesse adverse. + //TODO: But = capturer la princesse adverse (téléportation possible donc pas but = arriver de l'autre côté) return '*'; } getComputerMove() { // TODO: random mover } - - //Détails : - //Si une pièce pose quelque chose sur une case ça remplace ce qui y était déjà. - //Pas de condition de pat, puisque l'objectif est la capture de la reine :) };