import { expect } from "@esm-bundle/chai"; import { GameLoop } from "../../../src/core/GameLoop.js"; import { createGameLoopSetup, cleanupGameLoop, createRunData, createMockGameStateManagerForCombat, setupCombatUnits, cleanupTurnSystem, } from "./helpers.js"; describe("Core: GameLoop - Combat Highlights CoA 8", function () { this.timeout(30000); let gameLoop; let container; let mockGameStateManager; let playerUnit; let enemyUnit; beforeEach(async () => { const setup = createGameLoopSetup(); gameLoop = setup.gameLoop; container = setup.container; if (gameLoop.turnSystemAbortController) { gameLoop.turnSystemAbortController.abort(); } gameLoop.stop(); if ( gameLoop.turnSystem && typeof gameLoop.turnSystem.reset === "function" ) { gameLoop.turnSystem.reset(); } gameLoop.init(container); mockGameStateManager = createMockGameStateManagerForCombat(); gameLoop.gameStateManager = mockGameStateManager; const runData = createRunData({ squad: [{ id: "u1", classId: "CLASS_VANGUARD" }], }); await gameLoop.startLevel(runData, { startAnimation: false }); const units = setupCombatUnits(gameLoop); playerUnit = units.playerUnit; enemyUnit = units.enemyUnit; }); afterEach(async () => { gameLoop.clearMovementHighlights(); gameLoop.clearSpawnZoneHighlights(); cleanupTurnSystem(gameLoop); cleanupGameLoop(gameLoop, container); await new Promise(resolve => setTimeout(resolve, 10)); }); it("CoA 8: should calculate reachable positions correctly", () => { const reachable = gameLoop.movementSystem.getReachableTiles( playerUnit, 4 ); expect(reachable).to.be.an("array"); expect(reachable.length).to.be.greaterThan(0); reachable.forEach((pos) => { expect(pos).to.have.property("x"); expect(pos).to.have.property("y"); expect(pos).to.have.property("z"); expect(gameLoop.grid.isValidBounds(pos)).to.be.true; }); }); });