UNPKG

@real_one_chess_king/game-logic

Version:
85 lines 4.08 kB
"use strict"; 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