Ops hardening plus two rules gaps close (rev 13)
Operational: auto-reboot for kernel patches (09:30 UTC), Caddy access logs at /var/lib/caddy (self-rotating; the sandbox denies /var/log), logrotate for the backup log, a restore drill proving a Spaces snapshot boots 56/56 rooms clean, the about page's plain sentence on permanent recording, and /wizwar-pulse to read it all weekly. Rules: safes now smash — attacks aimed at the box accumulate on it and the fifteenth point bursts it (widening, ungated). And SLOW DEATH's bites pause for a victim holding an ABSORB — the card named by the FAQ, not Absorb Spell — each soaking exactly one point, rev-gated at 13 with the instant-bite legacy pinned. Bots weigh the soak against their life. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
This commit is contained in:
co-authored by
Claude Fable 5
parent
a66b058c68
commit
92613d7386
@@ -136,6 +136,27 @@ describe("safes and lock cards", () => {
|
||||
expect(state.openSafes).toEqual([]);
|
||||
});
|
||||
|
||||
it("fifteen points of battering bursts the safe open", () => {
|
||||
let { state, raider, chest } = safeRig();
|
||||
const box = state.players.find((p) => p.id === raider)!.position;
|
||||
// Two 5-point fireballs dent it; the third bursts it.
|
||||
for (let i = 0; i < 3; i++) {
|
||||
const fb = giveCard(state, raider, "fireball", `F${i}`, 0);
|
||||
state = must(state, raider, {
|
||||
type: "cast", instanceId: fb.instanceId, target: { kind: "cell", cell: { ...box } },
|
||||
});
|
||||
if (i < 2) {
|
||||
expect(state.squareContents[cellKey(box)]?.kind).toBe("safe");
|
||||
state = must(state, raider, { type: "endTurn", draw: 0 });
|
||||
const other = state.players.find((p) => p.id !== raider)!;
|
||||
state = must(state, other.id, { type: "endTurn", draw: 0 });
|
||||
}
|
||||
}
|
||||
expect(state.squareContents[cellKey(box)]).toBeUndefined();
|
||||
state = must(state, raider, { type: "pickUpTreasure" });
|
||||
expect(state.treasures.find((t) => t.id === chest.id)!.carriedBy).toBe(raider);
|
||||
});
|
||||
|
||||
it("the key must be at or beside the safe", () => {
|
||||
let { state, raider } = safeRig();
|
||||
const p = state.players.find((q) => q.id === raider)!;
|
||||
|
||||
Reference in New Issue
Block a user