UNPKG

@real_one_chess_king/game-logic

Version:
83 lines 3.63 kB
import { PieceType } from "../../piece/piece.constants"; import { isCoordinateEql } from "../../coordinate"; import { MovementRule } from "./movement-rule"; import { buildMoveAffect, getUserSelectedMoveAffect, markAsUserSelected, } from "../../affect/affect.utils"; export class CastlingMovementRule extends MovementRule { color; constructor({ id, name, moveToEmpty, moveToKill, collision, distance, directions, speed, color: color, mainPieceCoordinate, foreginPieceCoordinate, }) { super(id, name, moveToEmpty, moveToKill, collision, distance, directions, speed); this.color = color; this.mainPieceCoordinate = mainPieceCoordinate; this.foreginPieceCoordinate = foreginPieceCoordinate; } mainPieceCoordinate; foreginPieceCoordinate; isPieceMoved(turns, pieceType, color, from) { if (turns && turns.length) { return !!turns.find((turn) => { return (turn.pieceType === pieceType && // todo turn.pieceType sucks turn.color === color && isCoordinateEql(getUserSelectedMoveAffect(turn.affects).from, from)); }); } return false; } getSign() { const mainCoordinate = this.mainPieceCoordinate; const foreginCoordinate = this.foreginPieceCoordinate; return mainCoordinate[0] > foreginCoordinate[0] ? -1 : 1; } isSpaceBeetweenLocked(getPiece) { const [mainCoordX, mainCoordY] = this.mainPieceCoordinate; const [foreginCoordX] = this.foreginPieceCoordinate; const sign = this.getSign(); for (let i = (mainCoordX + 1 * sign) * sign; i < foreginCoordX; i++) { if (getPiece(i * sign, mainCoordY)) { return true; } } return false; } calculateNewCoord = () => { const [mainCoordinateX, mainCoordinateY] = this.mainPieceCoordinate; const [foreginCoordinateX, foreginCoordinateY] = this.foreginPieceCoordinate; const sign = this.getSign(); const newMainCoordinateX = mainCoordinateX + this.distance * sign; return [ markAsUserSelected(buildMoveAffect(this.mainPieceCoordinate, [ newMainCoordinateX, mainCoordinateY, ])), buildMoveAffect([foreginCoordinateX, foreginCoordinateY], [newMainCoordinateX - sign, foreginCoordinateY]), ]; }; isPieceNotExist(getPiece, [x, y]) { return !getPiece(x, y); } isColorDifferent(getPiece, [x, y]) { const piece = getPiece(x, y); return piece?.color !== this.color; } availableMoves(_fromX, _fromY, getPiece, turns) { const moves = []; if (this.isPieceNotExist(getPiece, this.mainPieceCoordinate) || this.isPieceNotExist(getPiece, this.foreginPieceCoordinate) || this.isColorDifferent(getPiece, this.mainPieceCoordinate) || this.isColorDifferent(getPiece, this.foreginPieceCoordinate) || this.isPieceMoved(turns, PieceType.King, this.color, this.mainPieceCoordinate) || this.isPieceMoved(turns, PieceType.Rook, this.color, this.foreginPieceCoordinate) || this.isSpaceBeetweenLocked(getPiece)) { return moves; } return [this.calculateNewCoord()]; } getMeta() { return { ...super.getMeta(), color: this.color, mainPieceCoordinate: [...this.mainPieceCoordinate], foreginPieceCoordinate: [...this.foreginPieceCoordinate], }; } } //# sourceMappingURL=castling.rule.js.map