roleplayer
Version:
A library for building table top role playing game worlds, and managing campaigns in those worlds
82 lines (68 loc) • 2.4 kB
text/typescript
import { DnDRuleset } from "../../data/rulesets/dnd-5th";
import { generateId } from "../../lib/generate-id";
import { startCampaign } from "../actions";
import { CharacterEventTypes, type CampaignEvent, type RoleplayerEvent } from "../events/events";
import { Roleplayer } from "../roleplayer";
import { HealthResourceTypeName } from "../world/resource";
const ruleset = new DnDRuleset((str) => {
const [, staticValue = "0"] = str.split("+");
return 2 + +staticValue;
});
describe("Campaign state", () => {
it("calculates correct character level", () => {
const roleplayer = new Roleplayer({ ruleset }, { id: generateId() });
const characterId = generateId();
roleplayer.dispatchAction(startCampaign());
const events: RoleplayerEvent[] = [
{
id: generateId(),
type: CharacterEventTypes.CharacterSpawned,
characterId,
serialNumber: 0,
roundId: "0",
},
{
id: generateId(),
type: CharacterEventTypes.CharacterExperienceSet,
characterId,
experience: 100,
serialNumber: 0,
roundId: "0",
},
];
roleplayer.dispatchEvents(...events);
const state = roleplayer.campaign;
expect(state.characters.length).toBe(1);
const character = state.characters[0];
expect(character?.xp).toBe(100);
});
it("applies events", () => {
const roleplayer = new Roleplayer({ ruleset }, { id: generateId() });
const characterId = generateId();
const healthResource = ruleset.getCharacterResourceTypes().find((rt) => rt.name === HealthResourceTypeName);
const events = [
{
type: CharacterEventTypes.CharacterSpawned,
characterId,
},
{
type: CharacterEventTypes.CharacterNameSet,
characterId,
name: "Some name",
},
{
type: CharacterEventTypes.CharacterResourceMaxSet,
characterId,
resourceTypeId: healthResource!.id,
max: 10,
},
] satisfies CampaignEvent[];
roleplayer.dispatchEvents(...events);
const state = roleplayer.campaign;
expect(state.characters.length).toBe(1);
const character = state.characters[0];
const characterHealth = character!.resources.find((r) => r.resourceTypeId === healthResource!.id);
expect(character!.name).toBe("Some name");
expect(characterHealth!.max).toBe(10);
});
});