X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FMadrasi.js;fp=client%2Fsrc%2Fvariants%2FMadrasi.js;h=54c1862bede629121975a761b72e660303699a32;hb=107dc1bd5361e2538b1551bdcc37c1e90a444b83;hp=0000000000000000000000000000000000000000;hpb=236485b53993f2adfd588022e2899a39491fc825;p=vchess.git diff --git a/client/src/variants/Madrasi.js b/client/src/variants/Madrasi.js new file mode 100644 index 00000000..54c1862b --- /dev/null +++ b/client/src/variants/Madrasi.js @@ -0,0 +1,64 @@ +import { ChessRules } from "@/base_rules"; + +export class MadrasiRules extends ChessRules { + isImmobilized(sq) { + const oppCol = V.GetOppCol(this.turn); + const piece = this.getPiece(sq[0], sq[1]); + let steps = []; + switch (piece) { + // NOTE: cannot use super.isAttackedByXXX + // because it would call the redefined isAttackedBySlideNJump + // => Infinite recursive calls. + case V.PAWN: { + const forward = (oppCol == 'w' ? 1 : -1); + steps = [[forward, 1], [forward, -1]]; + break; + } + case V.ROOK: + case V.BISHOP: + case V.KNIGHT: + steps = V.steps[piece]; + break; + case V.KING: + case V.QUEEN: + steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]); + break; + } + return super.isAttackedBySlideNJump( + sq, oppCol, piece, steps, [V.KING, V.PAWN, V.KNIGHT].includes(piece)) + } + + getPotentialMovesFrom([x, y]) { + return ( + !this.isImmobilized([x, y]) + ? super.getPotentialMovesFrom([x, y]) + : [] + ); + } + + isAttackedBySlideNJump([x, y], color, piece, steps, oneStep) { + for (let step of steps) { + let rx = x + step[0], + ry = y + step[1]; + while (V.OnBoard(rx, ry) && this.board[rx][ry] == V.EMPTY && !oneStep) { + rx += step[0]; + ry += step[1]; + } + if ( + V.OnBoard(rx, ry) && + this.getPiece(rx, ry) == piece && + this.getColor(rx, ry) == color && + // If enemy is immobilized, it doesn't attack: + !this.isImmobilized([rx, ry]) + ) { + return true; + } + } + return false; + } + + isAttackedByKing() { + // Connected kings paralyze each other + return false; + } +};