X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FCwda.js;h=f8cc6d9fdb0b3f3cc698a1bb167dcbd7841b3940;hb=0652acd930d017fedef630c22f36868efad78d45;hp=c5ecf092e64fdab34db0972608efd0c8786fd310;hpb=74afb57db5e15af26de042ba3f70f3409f13cb5f;p=vchess.git diff --git a/client/src/variants/Cwda.js b/client/src/variants/Cwda.js index c5ecf092..f8cc6d9f 100644 --- a/client/src/variants/Cwda.js +++ b/client/src/variants/Cwda.js @@ -109,6 +109,24 @@ export class CwdaRules extends ChessRules { this.army2 = armies.charAt(1); } + scanKings(fen) { + this.kingPos = { w: [-1, -1], b: [-1, -1] }; + const fenRows = V.ParseFen(fen).position.split("/"); + for (let i = 0; i < fenRows.length; i++) { + let k = 0; + for (let j = 0; j < fenRows[i].length; j++) { + const newChar = fenRows[i].charAt(j); + if (['a', 'e', 'k'].includes(newChar)) this.kingPos["b"] = [i, k]; + else if (['A', 'E', 'K'].includes(newChar)) this.kingPos["w"] = [i, k]; + else { + const num = parseInt(fenRows[i].charAt(j), 10); + if (!isNaN(num)) k += num - 1; + } + k++; + } + } + } + static ParseFen(fen) { return Object.assign( { armies: fen.split(" ")[5] }, @@ -192,6 +210,30 @@ export class CwdaRules extends ChessRules { ); } + getEpSquare(moveOrSquare) { + if (!moveOrSquare) return undefined; //TODO: necessary line?! + if (typeof moveOrSquare === "string") { + const square = moveOrSquare; + if (square == "-") return undefined; + return V.SquareToCoords(square); + } + // Argument is a move: + const move = moveOrSquare; + const s = move.start, + e = move.end; + if ( + s.y == e.y && + Math.abs(s.x - e.x) == 2 && + ['p', 'u', 'v'].includes(move.appear[0].p) + ) { + return { + x: (s.x + e.x) / 2, + y: s.y + }; + } + return undefined; //default + } + getPotentialMovesFrom(sq) { switch (this.getPiece(sq[0], sq[1])) { case V.C_ROOK: return this.getPotentialC_rookMoves(sq); @@ -548,6 +590,28 @@ export class CwdaRules extends ChessRules { return super.isAttackedByQueen(sq, color); } + postPlay(move) { + const c = V.GetOppCol(this.turn); + const piece = move.appear[0].p; + // Update king position + flags + if (['k', 'a', 'e'].includes(piece)) { + this.kingPos[c][0] = move.appear[0].x; + this.kingPos[c][1] = move.appear[0].y; + this.castleFlags[c] = [V.size.y, V.size.y]; + } + // Next call is still required because the king may eat an opponent's rook + // TODO: castleFlags will be turned off twice then. + super.updateCastleFlags(move, piece); + } + + postUndo(move) { + // (Potentially) Reset king position + const c = this.getColor(move.start.x, move.start.y); + const piece = move.appear[0].p; + if (['k', 'a', 'e'].includes(piece)) + this.kingPos[c] = [move.start.x, move.start.y]; + } + static get VALUES() { return Object.assign( { @@ -572,4 +636,11 @@ export class CwdaRules extends ChessRules { return 2; } + getNotation(move) { + let notation = super.getNotation(move); + if (['u', 'v'].includes(move.appear[0].p)) + notation = notation.slice(0, -2); + return notation; + } + };