diff --git a/src/die.js b/src/die.js new file mode 100644 index 0000000..b766519 --- /dev/null +++ b/src/die.js @@ -0,0 +1,3 @@ +export function rollDie() { + return Math.floor(Math.random() * 6) + 1; +} diff --git a/src/die.test.js b/src/die.test.js new file mode 100644 index 0000000..65db58b --- /dev/null +++ b/src/die.test.js @@ -0,0 +1,12 @@ +import { describe, expect, test } from "bun:test"; +import { rollDie } from "./die.js"; + +describe("rollDie", () => { + test("returns a number between 1 and 6", () => { + for (let i = 0; i < 100; i++) { + const result = rollDie(); + expect(result).toBeGreaterThanOrEqual(1); + expect(result).toBeLessThanOrEqual(6); + } + }); +}); diff --git a/src/enemies.js b/src/enemies.js index 7ac88ec..ce17e03 100644 --- a/src/enemies.js +++ b/src/enemies.js @@ -3,3 +3,18 @@ import enemyDb from "../data/enemies.json"; export function getEnemy(id) { return enemyDb[id]; } + +export function resolveEnemyAction(enemy, dieResult, trackPosition) { + if (enemy.actionType === "single") { + return enemy.actions["1"]; + } + if (enemy.actionType === "die") { + return enemy.actions[String(dieResult)]; + } + if (enemy.actionType === "cube") { + const track = enemy.actionTrack; + const pos = Math.min(trackPosition, track.length - 1); + return track[pos]; + } + return { intent: "unknown", effects: [] }; +} diff --git a/src/enemies.test.js b/src/enemies.test.js new file mode 100644 index 0000000..4b869df --- /dev/null +++ b/src/enemies.test.js @@ -0,0 +1,19 @@ +import { describe, expect, test } from "bun:test"; +import { getEnemy, resolveEnemyAction } from "./enemies.js"; + +describe("getEnemy", () => { + test("returns enemy by id", () => { + const enemy = getEnemy("jaw_worm"); + expect(enemy.name).toBe("Jaw Worm"); + expect(enemy.hp).toBeGreaterThan(0); + }); +}); + +describe("resolveEnemyAction", () => { + test("die action returns effects for given roll", () => { + const enemy = getEnemy("jaw_worm"); + const action = resolveEnemyAction(enemy, 1, 0); + expect(action.effects).toBeDefined(); + expect(action.effects.length).toBeGreaterThan(0); + }); +});