✨Feature: enhance encounter resolution with creature names and result labels
This commit is contained in:
73
src/rules/encounters.test.ts
Normal file
73
src/rules/encounters.test.ts
Normal 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"]);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user