Add die roll and enemy action resolver

This commit is contained in:
Jared Miller 2026-02-23 17:36:59 -05:00
parent 0bb8f236c0
commit 35d2176bc2
Signed by: shmup
GPG key ID: 22B5C6D66A38B06C
4 changed files with 49 additions and 0 deletions

3
src/die.js Normal file
View file

@ -0,0 +1,3 @@
export function rollDie() {
return Math.floor(Math.random() * 6) + 1;
}

12
src/die.test.js Normal file
View file

@ -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);
}
});
});

View file

@ -3,3 +3,18 @@ import enemyDb from "../data/enemies.json";
export function getEnemy(id) { export function getEnemy(id) {
return enemyDb[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: [] };
}

19
src/enemies.test.js Normal file
View file

@ -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);
});
});