74 lines
2.1 KiB
TypeScript
74 lines
2.1 KiB
TypeScript
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"]);
|
|
});
|
|
});
|