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
@@ -1274,6 +1274,17 @@ export function automatonCommand(
|
||||
const tier = TIERS[tierName] ?? TIERS.archmage;
|
||||
if (view.phase !== "playing") return null;
|
||||
|
||||
if (view.slowDeathPending) {
|
||||
if (view.slowDeathPending.playerId !== you) return null;
|
||||
// Soak only when the bites reach toward the floor — the card is worth
|
||||
// more against a fireball than one point of rot.
|
||||
const absorb = inHand(view, "absorb");
|
||||
const pts = view.slowDeathPending.points;
|
||||
if (absorb && me(view).life - pts <= 4) {
|
||||
return { type: "slowDeathChoice", absorbInstanceId: absorb.instanceId };
|
||||
}
|
||||
return { type: "slowDeathChoice" };
|
||||
}
|
||||
if (view.wardPending) {
|
||||
// A Ward is free damage on a thief of OUR gold: always spring it.
|
||||
return view.wardPending.ownerId === you ? { type: "wardChoice", play: true } : null;
|
||||
@@ -1803,6 +1814,7 @@ export function automatonCommand(
|
||||
export function automatonFallback(view: GameView, tierName: AutomatonTier = "archmage"): Command {
|
||||
const you = view.you;
|
||||
if (view.wardPending?.ownerId === you) return { type: "wardChoice", play: false };
|
||||
if (view.slowDeathPending?.playerId === you) return { type: "slowDeathChoice" };
|
||||
if (view.pendingDiscard === you) {
|
||||
return { type: "discard", instanceIds: worstCards(view, Math.max(1, overLimit(view))) };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user