@real_one_chess_king/game-logic
Version:
R.O.C.K. chess game logic
87 lines • 3.91 kB
JavaScript
"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