generated from nhcarrigan/template
fix: preserve boss first-kill state across prestige
Fixes #39. Added bountyRunestonesClaimed?: boolean to the Boss type. The first-kill bounty runestones are now only awarded once across all prestige resets — the boss route checks the flag before awarding, sets it on first defeat, and buildPostPrestigeState carries the flag forward through fresh boss state on prestige. The boss panel badge no longer shows for bosses whose bounty has already been claimed.
This commit is contained in:
@@ -305,4 +305,25 @@ describe("boss route", () => {
|
||||
const res = await challenge({ bossId: "test_boss" });
|
||||
expect(res.status).toBe(500);
|
||||
});
|
||||
|
||||
it("does not re-award bounty runestones when bountyRunestonesClaimed is true", async () => {
|
||||
const state = makeState({
|
||||
bosses: [makeBoss({
|
||||
bountyRunestonesClaimed: true,
|
||||
currentHp: 100,
|
||||
damagePerSecond: 1,
|
||||
maxHp: 100,
|
||||
})] as GameState["bosses"],
|
||||
adventurers: [makeAdventurer()] as GameState["adventurers"],
|
||||
prestige: { count: 0, productionMultiplier: 1, purchasedUpgradeIds: [], runestones: 5 },
|
||||
zones: [],
|
||||
});
|
||||
vi.mocked(prisma.gameState.findUnique).mockResolvedValueOnce({ state } as never);
|
||||
vi.mocked(prisma.gameState.update).mockResolvedValueOnce({} as never);
|
||||
const res = await challenge({ bossId: "test_boss" });
|
||||
expect(res.status).toBe(200);
|
||||
const body = await res.json() as { won: boolean; rewards: { bountyRunestones: number } };
|
||||
expect(body.won).toBe(true);
|
||||
expect(body.rewards.bountyRunestones).toBe(0);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -292,6 +292,33 @@ describe("buildPostPrestigeState", () => {
|
||||
expect(prestigeState.player.lifetimeBossesDefeated).toBe(1);
|
||||
});
|
||||
|
||||
it("preserves bountyRunestonesClaimed flag on bosses across prestige", () => {
|
||||
const claimedBoss = {
|
||||
bountyRunestones: 5,
|
||||
bountyRunestonesClaimed: true,
|
||||
crystalReward: 0,
|
||||
currentHp: 0,
|
||||
damagePerSecond: 10,
|
||||
description: "A boss",
|
||||
equipmentRewards: [] as string[],
|
||||
essenceReward: 0,
|
||||
goldReward: 100,
|
||||
id: "troll_king",
|
||||
maxHp: 100,
|
||||
name: "Troll King",
|
||||
prestigeRequirement: 0,
|
||||
status: "defeated" as const,
|
||||
upgradeRewards: [] as string[],
|
||||
zoneId: "verdant_vale",
|
||||
};
|
||||
const state = makeMinimalState({ bosses: [ claimedBoss ] as GameState["bosses"] });
|
||||
const { prestigeState } = buildPostPrestigeState(state, "Tester");
|
||||
const matchingBoss = prestigeState.bosses.find((boss) => {
|
||||
return boss.id === "troll_king";
|
||||
});
|
||||
expect(matchingBoss?.bountyRunestonesClaimed).toBe(true);
|
||||
});
|
||||
|
||||
it("accumulates completed quests into lifetime total", () => {
|
||||
const quest = {
|
||||
id: "q_1",
|
||||
|
||||
Reference in New Issue
Block a user