@real_one_chess_king/game-logic
Version:
R.O.C.K. chess game logic
61 lines • 2.31 kB
JavaScript
import { PieceType } from "../../piece/piece.constants";
import { Direction } from "./movement-rule";
import { PositionSpecificMovementRule, } from "./position-specific-movement.rule";
import { directionToVector } from "./straight-movement.rule";
import { buildKillAffect, buildMoveAffect, getUserSelectedMoveAffect, markAsUserSelected, } from "../../affect/affect.utils";
export class TakeOnThePassMovementRule extends PositionSpecificMovementRule {
constructor({ id, name, moveToEmpty, moveToKill, collision, distance, directions, speed, activatePositions, }) {
super({
id,
name,
moveToEmpty,
moveToKill,
collision,
distance,
directions,
speed,
activatePositions,
});
}
isNear(from, c) {
return from + 1 === c || from - 1 === c;
}
getDirectionModifier(dirrection) {
return dirrection === Direction.UpLeft || dirrection === Direction.UpRight
? -1
: +1;
}
possibleDirrections = [
Direction.UpLeft,
Direction.UpRight,
Direction.DownLeft,
Direction.DownRight,
];
pawnFirstDoubleStepDistance = 2;
calculateNewCoord = (x, y, diff, dirrection, turns) => {
if (!turns || !turns.length) {
return [];
}
if (!this.activatePositions.y?.has(y)) {
return [];
}
const lastTurn = turns[turns.length - 1];
const [enemyFromX, enemyFromY] = getUserSelectedMoveAffect(lastTurn.affects).from;
const [toX, toY] = getUserSelectedMoveAffect(lastTurn.affects).to;
const prevEnemyPos = this.getDirectionModifier(dirrection) * this.pawnFirstDoubleStepDistance;
const [newX, newY] = directionToVector(dirrection, x, y, diff);
if (lastTurn.pieceType === PieceType.Pawn &&
this.isNear(enemyFromX, x) &&
enemyFromX === toX &&
enemyFromY === y + prevEnemyPos &&
y === toY &&
enemyFromX === newX) {
return [
buildKillAffect([toX, toY]),
markAsUserSelected(buildMoveAffect([x, y], [newX, newY])),
];
}
return [];
};
}
//# sourceMappingURL=take-on-the-pass.rule.js.map