X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FOtage.js;h=caf55c9ccecb6888137594672a0dec52c19dc641;hb=4313762da3237b04f204e121a20cab3ba7bb5dd2;hp=3e35767af8c618e4c603e827259400b1212ede22;hpb=f3f8470750e91ac7b5bf57a4e01c5791c54b65fb;p=vchess.git diff --git a/client/src/variants/Otage.js b/client/src/variants/Otage.js index 3e35767a..caf55c9c 100644 --- a/client/src/variants/Otage.js +++ b/client/src/variants/Otage.js @@ -36,7 +36,7 @@ export class OtageRules extends ChessRules { x: ['b', 'k'], y: ['q', 'q'], z: ['q', 'k'], - '_': ['k', 'k'] + '@': ['k', 'k'] }; } @@ -61,7 +61,7 @@ export class OtageRules extends ChessRules { for (let i = 0; i < row.length; i++) { const lowR = row[i].toLowerCase(); const readNext = !(ChessRules.PIECES.includes(lowR)); - if (!!(lowR.match(/[a-z_]/))) { + if (!!(lowR.match(/[a-z@]/))) { sumElts++; if (lowR == 'k') kings[row[i]]++; else if (readNext) { @@ -146,7 +146,7 @@ export class OtageRules extends ChessRules { const c = fenRows[i].charAt(j); const lowR = c.toLowerCase(); const readNext = !(ChessRules.PIECES.includes(lowR)); - if (!!(lowR.match(/[a-z_]/))) { + if (!!(lowR.match(/[a-z@]/))) { if (lowR == 'k') this.kingPos[c == 'k' ? 'b' : 'w'] = [i, k]; else if (readNext) { const up = this.getUnionPieces(fenRows[i][++j], lowR); @@ -197,9 +197,9 @@ export class OtageRules extends ChessRules { this.pawnFlags = flags[1]; } - static GenRandInitFen(randomness) { + static GenRandInitFen(options) { // Add 16 pawns flags: - return ChessRules.GenRandInitFen(randomness) + return ChessRules.GenRandInitFen(options) .slice(0, -2) + "1111111111111111 -"; } @@ -255,7 +255,14 @@ export class OtageRules extends ChessRules { // Transformation computed without taking union into account const up = this.getUnionPieces(initColor, initPiece); let args = [tr.p, up[oppCol]]; - if (['a', 'v'].includes(initColor)) args = args.reverse(); + if ( + ['a', 'v'].includes(initColor) || + // HACK: "ba" piece = two pawns, black controling. + // If promoting, must artificially imagine color was 'a': + (initPiece == 'a' && initColor == 'b') + ) { + args = args.reverse(); + } const capturer = (['a', 'b'].includes(initColor) ? 'b' : 'w'); const cp = this.getUnionCode(args[0], args[1], capturer); tr.c = cp.c; @@ -348,7 +355,7 @@ export class OtageRules extends ChessRules { } let baseMoves = []; const c = this.turn; - switch (piece || this.getPiece(x, y)) { + switch (piece) { case V.PAWN: { const firstRank = (c == 'w' ? 7 : 0); baseMoves = this.getPotentialPawnMoves([x, y]).filter(m => { @@ -383,10 +390,7 @@ export class OtageRules extends ChessRules { break; case V.KING: baseMoves = this.getSlideNJumpMoves( - [x, y], - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); if (!noCastle && this.castleFlags[this.turn].some(v => v < V.size.y)) baseMoves = baseMoves.concat(this.getCastleMoves([x, y])); break; @@ -646,11 +650,19 @@ export class OtageRules extends ChessRules { if (!m.end.released) return true; // Check for repetitions: V.PlayOnBoard(this.board, m); - const newState = { piece: m.end.released, position: this.getBaseFen() }; + const newState = { + piece: m.end.released, + square: { x: m.end.x, y: m.end.y }, + position: this.getBaseFen() + }; const repet = this.repetitions.some(r => { return ( r.piece == newState.piece && + ( + r.square.x == newState.square.x && + r.square.y == newState.square.y + ) && r.position == newState.position ); }); @@ -689,8 +701,8 @@ export class OtageRules extends ChessRules { const lm = this.lastMoveEnd[L-1]; const piece = !!lm - ? lm.p : - this.getPiece(move.vanish[0].x, move.vanish[0].y); + ? lm.p + : this.getPiece(move.vanish[0].x, move.vanish[0].y); if (piece == V.KING) this.kingPos[c] = [move.appear[0].x, move.appear[0].y]; this.updateCastleFlags(move, piece); @@ -724,6 +736,7 @@ export class OtageRules extends ChessRules { this.repetitions.push( { piece: move.end.released, + square: { x: move.end.x, y: move.end.y }, position: this.getBaseFen() } ); @@ -739,13 +752,20 @@ export class OtageRules extends ChessRules { this.turn = V.GetOppCol(this.turn); this.movesCount--; } - if (!!move.end.releasd) this.repetitions.pop(); + if (!!move.end.released) this.repetitions.pop(); this.postUndo(move); } postUndo(move) { if (this.getPiece(move.start.x, move.start.y) == V.KING) this.kingPos[this.turn] = [move.start.x, move.start.y]; + else { + // Check if a king is being released: put it on releasing square + const L = this.lastMoveEnd.length; + const lm = this.lastMoveEnd[L-1]; + if (!!lm && lm.p == V.KING) + this.kingPos[this.turn] = [move.start.x, move.start.y]; + } } getCurrentScore() {