UNPKG

@real_one_chess_king/game-logic

Version:
61 lines 2.31 kB
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