@real_one_chess_king/game-logic
Version:
R.O.C.K. chess game logic
85 lines • 4.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RulesEngine = void 0;
const piece_movement_1 = require("./rules/piece-movement");
const castling_rule_1 = require("./rules/piece-movement/castling.rule");
const take_on_the_pass_rule_1 = require("./rules/piece-movement/take-on-the-pass.rule");
const rules_typeguards_1 = require("./rules/piece-movement/rules.typeguards");
const movement_rules_const_1 = require("./rules/piece-movement/movement-rules.const");
const transforming_on_position_typeguard_1 = require("./rules/piece-post-movement/transforming-on-position/transforming-on-position.typeguard");
const rulesMapper = {
[movement_rules_const_1.MovementRules.VerticalMovementRule]: piece_movement_1.VerticalMovementRule,
[movement_rules_const_1.MovementRules.HorizontalMovementRule]: piece_movement_1.HorizontalMovementRule,
[movement_rules_const_1.MovementRules.DiagonalMovementRule]: piece_movement_1.DiagonalMovementRule,
[movement_rules_const_1.MovementRules.KnightMovementRule]: piece_movement_1.KnightMovementRule,
[movement_rules_const_1.MovementRules.PositionSpecificMovementRule]: piece_movement_1.PositionSpecificMovementRule,
[movement_rules_const_1.MovementRules.TakeOnThePassMovementRule]: take_on_the_pass_rule_1.TakeOnThePassMovementRule,
[movement_rules_const_1.MovementRules.CastlingMovementRule]: castling_rule_1.CastlingMovementRule,
};
const postMovementRulesMapper = {
[movement_rules_const_1.PostMovementRules.TransformationOnPositionRule]: piece_movement_1.TransformationOnPositionRule,
};
class RulesEngine {
movementRules = new Map();
postMovementRules = new Map();
addMovementRule(ruleMeta) {
const r = rulesMapper[ruleMeta.name];
const uniqRulesParams = {};
if ((0, rules_typeguards_1.isPositionSpecificMovementRuleMeta)(ruleMeta)) {
const activatePositions = {};
if (ruleMeta.activatePositions.x) {
activatePositions.x = new Set(ruleMeta.activatePositions.x);
}
if (ruleMeta.activatePositions.y) {
activatePositions.y = new Set(ruleMeta.activatePositions.y);
}
uniqRulesParams.activatePositions = activatePositions;
}
const ruleInstance = new r({
...ruleMeta,
directions: new Set(ruleMeta.directions),
// eslint-disable-next-line @typescript-eslint/no-explicit-any
...uniqRulesParams,
});
this.movementRules.set(ruleMeta.id, ruleInstance);
}
addMovementRules(rulesMeta) {
rulesMeta.forEach((ruleMeta) => {
if (!this.movementRules.has(ruleMeta.id)) {
this.addMovementRule(ruleMeta);
}
});
}
addPostMovementRule(ruleMeta) {
if ((0, transforming_on_position_typeguard_1.isTransformingRuleMeta)(ruleMeta)) {
const ruleInstance = new postMovementRulesMapper[ruleMeta.name](ruleMeta);
this.postMovementRules.set(ruleMeta.id, ruleInstance);
}
else {
throw new Error("Invalid post movement rule");
}
}
addPostMovementRules(rulesMeta) {
rulesMeta.forEach((ruleMeta) => {
if (!this.postMovementRules.has(ruleMeta.id)) {
this.addPostMovementRule(ruleMeta);
}
});
}
getAvailableMoves(ruleId, x, y, getPiece, turns, size) {
const ruleInstance = this.movementRules.get(ruleId);
if (!ruleInstance) {
throw new Error(`Movement rule not found ${ruleId}`);
}
return ruleInstance.availableMoves(x, y, getPiece, turns, size);
}
addPostMovementCorrections(rule, sourceMoves, pieceType) {
const ruleInstance = this.postMovementRules.get(rule);
if (!ruleInstance) {
throw new Error(`Post movement rule not found ${rule}`);
}
return ruleInstance.updateMovesAffects(sourceMoves, pieceType);
}
}
exports.RulesEngine = RulesEngine;
//# sourceMappingURL=rules-engine.js.map