Hedges stay in their squares; the eyes turn to the lock they pick

Eric's rosebush-through-a-wall, hunted to two roots. A camera-facing
billboard viewed obliquely rotates out of its square, so cell-bound
volumes are now windowed to the exact segment where their plane
crosses their own cell — no end may paint beyond it. And the real
smoking gun: the near-bias that lets a hedge win the tie against the
wizard standing in it was applied to the OCCLUSION depth too, letting
the hedge cheat a fifth of a cell through any neighboring wall. The
bias now orders sprites among themselves only; walls always judge the
true depth.

Also answered: edge-deeds turn the head. Picking or jamming a lock,
unlocking with the Master Key, raising or razing or drowning a wall —
any edge-bearing deed by the reel's own wizard now aims the camera at
that edge's midpoint before the outcome shows, same as any other
target.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Eric Wagoner
2026-08-23 20:28:24 -04:00
co-authored by Claude Fable 5
parent 285c91b2c8
commit ccb5346a31
3 changed files with 66 additions and 4 deletions
+8
View File
@@ -309,6 +309,10 @@ export interface Billboard {
fallback?: string;
/** Identity for growth animation: a creature's id, or a cell key. */
key?: string;
/** Cell-bound volumes never paint outside their own square: a
* camera-facing hedge viewed obliquely would otherwise poke its ends
* through the neighboring walls. */
clip?: { x: number; y: number };
/** A reflection seen through a warp mouth, not the thing itself —
* visible only through THAT warp's columns, beyond its mouth. */
warped?: boolean;
@@ -402,21 +406,25 @@ export function billboards(
out.push({
...at, src: `/terrain3d/${content.kind}.png`, fallback: content.kind,
scale: 0.5, aspect: 2.1, rise: 0, bias: 0.18, label: content.kind, key: k,
clip: { x: tx, y: ty },
});
} else if (content.kind === "ooze") {
out.push({
...at, src: "/terrain3d/jello.png", fallback: "jello",
scale: 0.96, aspect: 1.04, rise: 0, alpha: 0.6, bias: 0.18, label: "ooze", key: k,
clip: { x: tx, y: ty },
});
} else if (content.kind === "dust") {
out.push({
...at, src: "/terrain3d/dust.png", fallback: "dust",
scale: 0.85, aspect: 1.1, rise: 0, alpha: 0.55, bias: 0.18, label: "dust", key: k,
clip: { x: tx, y: ty },
});
} else if (content.kind === "safe") {
out.push({
...at, src: "/terrain3d/safe.png", fallback: "safe",
scale: 0.55, aspect: 1, rise: 0, bias: 0.18, label: "safe",
clip: { x: Math.floor(at.x), y: Math.floor(at.y) },
});
}
}