Feature: enhance encounter resolution with creature names and result labels

This commit is contained in:
Keith Solomon
2026-03-15 13:11:28 -05:00
parent 1ff20723ec
commit 39703ce6b0
5 changed files with 196 additions and 1 deletions

View File

@@ -0,0 +1,73 @@
import { describe, expect, it } from "vitest";
import { sampleContentPack } from "@/data/sampleContentPack";
import { createRoomStateFromTemplate } from "./rooms";
import { resolveRoomEncounter } from "./encounters";
function createSequenceRoller(values: number[]) {
let index = 0;
return () => {
const next = values[index];
index += 1;
return next;
};
}
describe("encounter resolution", () => {
it("marks explicitly empty rooms as having no encounter", () => {
const room = createRoomStateFromTemplate(
sampleContentPack,
"room.level1.small.empty",
1,
"room.level1.small.empty-space",
);
room.notes.push("Nothing here.");
const result = resolveRoomEncounter(sampleContentPack, room);
expect(result.encounter?.creatureIds).toEqual([]);
expect(result.encounter?.resultLabel).toBe("No encounter");
});
it("uses room context to resolve a guard encounter table", () => {
const room = createRoomStateFromTemplate(
sampleContentPack,
"room.level1.guard-room",
1,
"room.level1.normal.guard-room",
);
room.notes.push("Use the guards encounter table if occupied.");
const result = resolveRoomEncounter(
sampleContentPack,
room,
createSequenceRoller([6]),
);
expect(result.lookup?.entry.label).toBe("Guard and Warrior");
expect(result.encounter?.sourceTableCode).toBe("L1G");
expect(result.encounter?.creatureNames).toEqual(["Guard", "Warrior"]);
});
it("resolves crate events from room context when the room hints at crate rolls", () => {
const room = createRoomStateFromTemplate(
sampleContentPack,
"room.level1.storage-area",
1,
"room.level1.normal.storage-area",
);
room.notes.push("Roll for food, drink, or crate events while searching.");
const result = resolveRoomEncounter(
sampleContentPack,
room,
createSequenceRoller([2]),
);
expect(result.lookup?.entry.label).toBe("Giant Rat Pair");
expect(result.encounter?.sourceTableCode).toBe("L1CE");
expect(result.encounter?.creatureNames).toEqual(["Giant Rat Pair"]);
});
});