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