UNPKG

@real_one_chess_king/game-logic

Version:
87 lines 3.91 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CastlingMovementRule = void 0; const piece_constants_1 = require("../../piece/piece.constants"); const coordinate_1 = require("../../coordinate"); const movement_rule_1 = require("./movement-rule"); const affect_utils_1 = require("../../affect/affect.utils"); class CastlingMovementRule extends movement_rule_1.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 && (0, coordinate_1.isCoordinateEql)((0, affect_utils_1.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 [ (0, affect_utils_1.markAsUserSelected)((0, affect_utils_1.buildMoveAffect)(this.mainPieceCoordinate, [ newMainCoordinateX, mainCoordinateY, ])), (0, affect_utils_1.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, piece_constants_1.PieceType.King, this.color, this.mainPieceCoordinate) || this.isPieceMoved(turns, piece_constants_1.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], }; } } exports.CastlingMovementRule = CastlingMovementRule; //# sourceMappingURL=castling.rule.js.map