X-Git-Url: https://git.auder.net/img/parser.js?a=blobdiff_plain;f=variants%2FCoregal%2Fclass.js;h=23f67c757cef96331487ffbf4ed7fdd209f51bb5;hb=8f87962339f2bcaeb4c2716d0588a63449a68bde;hp=b563fec44dce9d6ecf840b4d7c41acd9202773db;hpb=5c1c7bcec764d94b0469ab4d7d0777ce67e05ae3;p=xogo.git diff --git a/variants/Coregal/class.js b/variants/Coregal/class.js index b563fec..23f67c7 100644 --- a/variants/Coregal/class.js +++ b/variants/Coregal/class.js @@ -1,10 +1,7 @@ -import { ChessRules, Move, PiPo } from "@/base_rules"; -import { ArrayFun } from "@/utils/array"; -import { randInt, sample } from "@/utils/alea"; +import ChessRules from "/base_rules.js"; +import {FenUtil} from "/utils/setupPieces.js" -export class CoregalRules extends ChessRules { - -//TODO: CSS royal queen symbol +export default class CoregalRules extends ChessRules { genRandInitBaseFen() { const s = FenUtil.setupPieces( @@ -13,55 +10,127 @@ export class CoregalRules extends ChessRules { randomness: this.options["randomness"], between: [{p1: 'k', p2: 'r'}, {p1: 'l', p2: 'r'}], diffCol: ['b'], - flags: ['r', 'k', 'l'] //TODO: add 'k' to all 'flags' calls ??! + // 'k' and 'l' useful only to get relative position + flags: ['r', 'k', 'l'] } ); + // Re-arrange flags: king + royal queen positions are only + // useful to know ordering, and thus allowed castles. + let flags = ""; + let relPos = { 'w': {}, 'b': {} }; + for (let c of [0, 1]) { + const col = (c == 0 ? 'w' : 'b'); + let first = ""; + for (let i=4*c; i<4*(c+1); i++) { + const pos = parseInt(s.flags.charAt(i), 10); + const symb = s[col][pos]; + if (['k', 'l'].includes(symb)) { + if (!first) { + relPos[col][symb] = '0'; //left + first = symb; + } + else + relPos[col][symb] = '1'; //right + } + else + flags += s.flags.charAt(i); + } + } return { fen: s.b.join("") + "/pppppppp/8/8/8/8/PPPPPPPP/" + s.w.join("").toUpperCase(), - o: {flags: s.flags} + o: { + flags: flags + flags, //duplicate: one for each royal piece + relPos: this.getRelposFen(relPos) + } }; } - pieces() { - let res = super.pieces(); + getPartFen(o) { + return (Object.assign( + {"relpos": o.init ? o.relPos : this.getRelposFen()}, + super.getPartFen(o) + )); + } + + getRelposFen(relPos) { + relPos = relPos || this.relPos; + return ( + relPos['w']['k'] + relPos['w']['l'] + + relPos['b']['k'] + relPos['b']['l'] + ); + } + + setOtherVariables(fenParsed, pieceArray) { + super.setOtherVariables(fenParsed, pieceArray); + this.relPos = { + 'w': { + 'k': fenParsed.relpos[0], + 'l': fenParsed.relpos[1] + }, + 'b': { + 'k': fenParsed.relpos[2], + 'l': fenParsed.relpos[3] + } + }; + } + + pieces(color, x, y) { + let res = super.pieces(color, x, y); res['l'] = JSON.parse(JSON.stringify(res['q'])); + // TODO: CSS royal queen symbol (with cross?) res['l']["class"] = "royal_queen"; + res['='] = {"class": "castle"}; //for castle display return res; } setFlags(fenflags) { - // white pieces positions, then black pieces positions - this.castleFlags = { w: [...Array(4)], b: [...Array(4)] }; - for (let i = 0; i < 8; i++) { - this.castleFlags[i < 4 ? "w" : "b"][i % 4] = - parseInt(fenflags.charAt(i), 10); - } + this.castleFlags = { + k: { + w: [0, 1].map(i => parseInt(fenflags.charAt(i), 10)), + b: [2, 3].map(i => parseInt(fenflags.charAt(i), 10)) + }, + l: { + w: [4, 5].map(i => parseInt(fenflags.charAt(i), 10)), + b: [6, 7].map(i => parseInt(fenflags.charAt(i), 10)) + } + }; + } + + getFlagsFen() { + return ['k', 'l'].map(p => { + return ['w', 'b'].map(c => { + return this.castleFlags[p][c].map(x => x.toString(10)).join(""); + }).join("") + }).join(""); } isKing(x, y, p) { if (!p) p = this.getPiece(x, y); - ['k', 'l'].includes(p); //no cannibal mode + return ['k', 'l'].includes(p); //no cannibal mode } getCastleMoves([x, y]) { + const c = this.getColor(x, y), + p = this.getPiece(x, y); // Relative position of the selected piece: left or right ? // If left: small castle left, large castle right. // If right: usual situation. - const c = this.getColor(x, y); - const relPos = (this.castleFlags[c][1] == y ? "left" : "right"); - const finalSquares = [ - relPos == "left" ? [1, 2] : [2, 3], - relPos == "right" ? [6, 5] : [5, 4] + this.relPos[c][p] == '0' ? [1, 2] : [2, 3], //0 == left + this.relPos[c][p] == '1' ? [6, 5] : [5, 4] //1 == right ]; - const saveFlags = JSON.stringify(this.castleFlags[c]); - // Alter flags to follow base_rules semantic - this.castleFlags[c] = [0, 3].map(i => this.castleFlags[c][i]); - const moves = super.getCastleMoves([x, y], finalSquares); - this.castleFlags[c] = JSON.parse(saveFlags); + let moves = + super.getCastleMoves([x, y], finalSquares, null, this.castleFlags[p][c]); + if (p == 'l') + moves.forEach(m => m.choice = '='); //required (for display) return moves; } + updateCastleFlags(move) { + super.updateCastleFlags(move, this.castleFlags['k'], 'k'); + super.updateCastleFlags(move, this.castleFlags['l'], 'l'); + } + };