chore: resolve stash merge conflicts + stage sliding.ts range-bonus changes
This commit is contained in:
parent
100bf5c909
commit
be7a3ea57b
1 changed files with 30 additions and 4 deletions
|
|
@ -9,6 +9,12 @@
|
||||||
* 2. Ally-occupied → stop immediately (square NOT included)
|
* 2. Ally-occupied → stop immediately (square NOT included)
|
||||||
* 3. Enemy-occupied → legal capture, then stop
|
* 3. Enemy-occupied → legal capture, then stop
|
||||||
*
|
*
|
||||||
|
* RangeBonus fact (seeded by the range-bonus modifier descriptor) extends
|
||||||
|
* or limits how many squares a piece may travel per ray. The effective
|
||||||
|
* maxSteps is clamped to [0, 7] — the natural board-geometry ceiling on
|
||||||
|
* an 8×8 board. For standard chess (full range), RangeBonus=0 is the
|
||||||
|
* default and behaviour is identical to the original implementation.
|
||||||
|
*
|
||||||
* Intentionally NOT handled here (see later phases):
|
* Intentionally NOT handled here (see later phases):
|
||||||
* - check filtering → P2.18
|
* - check filtering → P2.18
|
||||||
* - turn order → P2.13
|
* - turn order → P2.13
|
||||||
|
|
@ -28,9 +34,22 @@ import {
|
||||||
} from "./board-queries.js";
|
} from "./board-queries.js";
|
||||||
import type { PieceColor, Square } from "../schema.js";
|
import type { PieceColor, Square } from "../schema.js";
|
||||||
|
|
||||||
|
const BASE_RANGE = 7;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the RangeBonus fact for a piece and compute the effective maxSteps
|
||||||
|
* per ray. The bonus is clamped so maxSteps stays within [0, BASE_RANGE].
|
||||||
|
* Absent fact → bonus of 0 → maxSteps = BASE_RANGE (standard full range).
|
||||||
|
*/
|
||||||
|
function getRangeMaxSteps(session: Session, pieceId: EntityId): number {
|
||||||
|
const value = session.get(pieceId, "RangeBonus");
|
||||||
|
const rangeBonus = value !== undefined ? (value as number) : 0;
|
||||||
|
return Math.min(BASE_RANGE, Math.max(0, BASE_RANGE + rangeBonus));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Walk each ray in `rays` from the piece outward, emitting legal moves
|
* Walk each ray in `rays` from the piece outward, emitting legal moves
|
||||||
* until a blocker is hit.
|
* until a blocker is hit or maxSteps squares have been traversed.
|
||||||
*/
|
*/
|
||||||
function getSlidingMoves(
|
function getSlidingMoves(
|
||||||
session: Session,
|
session: Session,
|
||||||
|
|
@ -38,10 +57,14 @@ function getSlidingMoves(
|
||||||
from: Square,
|
from: Square,
|
||||||
color: PieceColor,
|
color: PieceColor,
|
||||||
rays: Square[][],
|
rays: Square[][],
|
||||||
|
maxSteps: number,
|
||||||
): LegalMove[] {
|
): LegalMove[] {
|
||||||
const moves: LegalMove[] = [];
|
const moves: LegalMove[] = [];
|
||||||
for (const ray of rays) {
|
for (const ray of rays) {
|
||||||
|
let steps = 0;
|
||||||
for (const to of ray) {
|
for (const to of ray) {
|
||||||
|
if (steps >= maxSteps) break;
|
||||||
|
steps++;
|
||||||
if (isAllyAt(session, to, color)) {
|
if (isAllyAt(session, to, color)) {
|
||||||
// Own piece blocks — do not include this square, stop the ray.
|
// Own piece blocks — do not include this square, stop the ray.
|
||||||
break;
|
break;
|
||||||
|
|
@ -66,7 +89,8 @@ export function getLegalBishopMoves(
|
||||||
const from = getPiecePosition(session, pieceId);
|
const from = getPiecePosition(session, pieceId);
|
||||||
const color = getPieceColor(session, pieceId);
|
const color = getPieceColor(session, pieceId);
|
||||||
if (from === null || color === null) return [];
|
if (from === null || color === null) return [];
|
||||||
return getSlidingMoves(session, pieceId, from, color, bishopCandidates(from));
|
const maxSteps = getRangeMaxSteps(session, pieceId);
|
||||||
|
return getSlidingMoves(session, pieceId, from, color, bishopCandidates(from), maxSteps);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Get all legal rook moves for the given rook entity. */
|
/** Get all legal rook moves for the given rook entity. */
|
||||||
|
|
@ -77,7 +101,8 @@ export function getLegalRookMoves(
|
||||||
const from = getPiecePosition(session, pieceId);
|
const from = getPiecePosition(session, pieceId);
|
||||||
const color = getPieceColor(session, pieceId);
|
const color = getPieceColor(session, pieceId);
|
||||||
if (from === null || color === null) return [];
|
if (from === null || color === null) return [];
|
||||||
return getSlidingMoves(session, pieceId, from, color, rookCandidates(from));
|
const maxSteps = getRangeMaxSteps(session, pieceId);
|
||||||
|
return getSlidingMoves(session, pieceId, from, color, rookCandidates(from), maxSteps);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Get all legal queen moves for the given queen entity. */
|
/** Get all legal queen moves for the given queen entity. */
|
||||||
|
|
@ -88,5 +113,6 @@ export function getLegalQueenMoves(
|
||||||
const from = getPiecePosition(session, pieceId);
|
const from = getPiecePosition(session, pieceId);
|
||||||
const color = getPieceColor(session, pieceId);
|
const color = getPieceColor(session, pieceId);
|
||||||
if (from === null || color === null) return [];
|
if (from === null || color === null) return [];
|
||||||
return getSlidingMoves(session, pieceId, from, color, queenCandidates(from));
|
const maxSteps = getRangeMaxSteps(session, pieceId);
|
||||||
|
return getSlidingMoves(session, pieceId, from, color, queenCandidates(from), maxSteps);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue