Credibility pass: the session seams sanded from the clips-and-camera batch
Two blind reviews of everything since the last pass (afa0e17), every
finding checked against the code, no behavior changed: all thirty
scene goldens match without a re-bless and the engine suite is
untouched.
Reel and renderer: the camera's look-down rule is stated once, beside
LOOK_DOWN, instead of twice in the effect; the empty aim branch that
stood where a cutaway used to be is gone (the guard it implied is now
explicit); the pit events and the punch are handled by their own
types, not through "in" casts; smoothstep is one export used by every
tween instead of eleven inline copies; the two floor rings share one
painter; project() takes a Billboard instead of a third hand-typed
copy of its fields; the strides-left figure and the web rim no longer
shadow the reel's steps and the pane's fx; the die card's verdict is
built from events, not by matching an emoji; the workshop asks for the
hover cue by name instead of passing an empty click handler.
Server and engine: one requestBase() for the origin, one slug pattern
in store.ts gating both the clip page and its files, one 404 for both;
LOOPBACK sits above its only caller; doCounteract names what a counter
is played against once; fearCells sits beside its own docblock rather
than between sightedCellsFor and its.
Deploy: chromiumExe, the private server, ffmpeg, and the reel rewind
live in deploy/lib/harness.mjs, shared by the gate, the recorder, and
the card cutter instead of pasted three times; the recorder drops its
duplicate frame counters and names its poster settle; the card uses the
gallery's exact gold; the one-time Sentry URL bootstrap leaves
deploy.sh; the backup comment states the rule rather than the incident.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
ddd2e347bd
commit
e1a740119c
@@ -5743,6 +5743,8 @@ function doCounteract(
|
||||
): CommandResult {
|
||||
const state = clone(prev);
|
||||
const stack = state.stack!;
|
||||
/** What the counter is played against, as the chronicle names it. */
|
||||
const against = stack.attackCard?.cardId ?? stack.sourceName ?? "punch";
|
||||
const player = state.players.find((p) => p.id === playerId)!;
|
||||
const card = player.hand.find((c) => c.instanceId === instanceId);
|
||||
if (!card) return err("card not in hand");
|
||||
@@ -5779,7 +5781,7 @@ function doCounteract(
|
||||
}
|
||||
player.hand.push(attackCard);
|
||||
const events: GameEvent[] = [
|
||||
{ type: "counteractionPlayed", player: playerId, card, cardId: card.cardId, against: stack.attackCard?.cardId ?? stack.sourceName ?? "punch" },
|
||||
{ type: "counteractionPlayed", player: playerId, card, cardId: card.cardId, against },
|
||||
{ type: "attackAbsorbedIntoHand", player: playerId, attackCard },
|
||||
{ type: "attackResolved", attacker: stack.attackerId, defender: stack.defenderId, attackCardId: attackCard.cardId, damageDealt: 0, reflectedDamage: 0, fullyStopped: true, redirected: false },
|
||||
];
|
||||
@@ -5809,7 +5811,7 @@ function doCounteract(
|
||||
return {
|
||||
ok: true,
|
||||
state,
|
||||
events: [{ type: "counteractionPlayed", player: playerId, card, cardId: card.cardId, against: stack.attackCard?.cardId ?? stack.sourceName ?? "punch" }],
|
||||
events: [{ type: "counteractionPlayed", player: playerId, card, cardId: card.cardId, against }],
|
||||
};
|
||||
}
|
||||
|
||||
@@ -5821,7 +5823,7 @@ function doCounteract(
|
||||
takeFromHand(player, instanceId);
|
||||
state.discard.push(card);
|
||||
const events: GameEvent[] = [
|
||||
{ type: "counteractionPlayed", player: playerId, card, cardId: card.cardId, against: stack.attackCard?.cardId ?? stack.sourceName ?? "punch" },
|
||||
{ type: "counteractionPlayed", player: playerId, card, cardId: card.cardId, against },
|
||||
];
|
||||
attachSustained(state, events, "invisible", playerId, playerId, duration);
|
||||
stack.counters.push({ player: playerId, card, nullified: false });
|
||||
@@ -5838,7 +5840,7 @@ function doCounteract(
|
||||
takeFromHand(player, instanceId);
|
||||
state.discard.push(card);
|
||||
const events: GameEvent[] = [
|
||||
{ type: "counteractionPlayed", player: playerId, card, cardId: card.cardId, against: stack.attackCard?.cardId ?? stack.sourceName ?? "punch" },
|
||||
{ type: "counteractionPlayed", player: playerId, card, cardId: card.cardId, against },
|
||||
];
|
||||
attachSustained(state, events, "empathy", playerId, playerId, duration);
|
||||
stack.counters.push({ player: playerId, card, nullified: false });
|
||||
@@ -5877,7 +5879,7 @@ function doCounteract(
|
||||
return {
|
||||
ok: true,
|
||||
state,
|
||||
events: [{ type: "counteractionPlayed", player: playerId, card, cardId: card.cardId, against: stack.attackCard?.cardId ?? stack.sourceName ?? "punch" }],
|
||||
events: [{ type: "counteractionPlayed", player: playerId, card, cardId: card.cardId, against }],
|
||||
};
|
||||
}
|
||||
|
||||
@@ -5897,7 +5899,7 @@ function doCounteract(
|
||||
return {
|
||||
ok: true,
|
||||
state,
|
||||
events: [{ type: "counteractionPlayed", player: playerId, card, cardId: card.cardId, against: stack.attackCard?.cardId ?? stack.sourceName ?? "punch" }],
|
||||
events: [{ type: "counteractionPlayed", player: playerId, card, cardId: card.cardId, against }],
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -191,12 +191,6 @@ export function viewFor(state: GameState, playerId: PlayerId): GameView {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Every cell the viewing player can see from where they stand, by the same
|
||||
* line-of-sight rules the engine enforces — computed from the VIEW, so it
|
||||
* reflects what this player knows (illusion walls they believe in block it).
|
||||
* The basis for the client's "dim the ineligible squares" targeting aid.
|
||||
*/
|
||||
/** Every square inside a living FEAR-bearer's aura — dreadDistance walks
|
||||
* through warps, the engine's own yardstick, so the painted aura and the
|
||||
* movement refusal can never disagree. */
|
||||
@@ -213,6 +207,12 @@ export function fearCells(view: GameView): Set<string> {
|
||||
return out;
|
||||
}
|
||||
|
||||
/**
|
||||
* Every cell the viewing player can see from where they stand, by the same
|
||||
* line-of-sight rules the engine enforces — computed from the VIEW, so it
|
||||
* reflects what this player knows (illusion walls they believe in block it).
|
||||
* The basis for the client's "dim the ineligible squares" targeting aid.
|
||||
*/
|
||||
export function sightedCellsFor(view: GameView): Set<string> {
|
||||
const out = new Set<string>();
|
||||
const me = view.players.find((p) => p.id === view.you);
|
||||
|
||||
Reference in New Issue
Block a user