Lich Survivors -- iterate record
The game that appears publicly on a327ex.com after the goodbye post (#560). Beating it correctly unlocks the gated POSTS (not logs) for that device, as early access until the hiatus ends. Its ending is the lich dream from It Follows (ch. 2) as a 3D third-person Vampire Survivors-like: the lich's accumulated powers kill every snake, the snakes can never reach the egg, and the solution is to remove your own items so they do. Everything before the ending is undecided. Idea and direction: session "Lich Survivors 1" (2026-09-27); see memory project_lich_dream_game.
Settled (owner)
- 2026-09-27: name lich-survivors; repo private (the code holds the solution);
engine three.js first (Brutal Behavior's call: the Sun Court renderer as is, port to
Anchor once settled). The Anchor scaffold (
main.lua,boot.lua,anchor/) waits for it. - 2026-09-27: reward = early access to the gated posts until the return; gated logs stay invisible (a posts-only rung of the gate is new work, later).
- 2026-09-27: style = Sun Court in technical style only (
retro-shooter/STYLE.md: 640x360, 32 texels/m, hard texel-snapped shadows, shafts through the shadow map, 64-level quantize, dither 0.3), darker in general, a brown/dark cave, so the light and the egg stand out. - 2026-09-27: cave colours and surface from the egg cover on /artifacts
(
a327ex-site/media/pages/artifacts/it-follows-3.jpg), not its geometry. - 2026-09-27: the lich: "a lich, all bones, no robe or anything, and its bones are prismatic, like a rainbow glow going through them". No written description exists elsewhere [REDACTED#139|.Xxxxxxx. xxxx xxx .x xxxxxxxx xxxxx xxxx x xxxxx xx xxxx.xxxxxx xxxxxx..|#].
- Work starts from the ending itself: camera, the cave, the lich.
Rounds
01 -- the ending's look (2026-09-27)
Purpose: the ending scene in the Sun Court method with the cover's colours, so he can judge
the cave's mood, the light and the egg, pick a camera, and pick how the lich's bones carry the
rainbow and how dark the cave is. Page: rounds/01-ending-look/index.html (self-contained,
three.js from jsdelivr), sheets cameras.png, lich.png, darkness.png.
- Built: round chamber (lathe shell, vertical-slab noise, faceted), one shaft in the dome leaning with the sun, a shadow-only lid so light enters only down the shaft, the pool and the column are the shadow map's; streaked column + dust motes; tunnel entrance at -z; egg on a low mound, trembling now and then; the lich from primitives (thickened 1.55x, skull 1.3x so it reads at 640x360); 9 placeholder snakes (follow-the-leader sphere chains).
- Cameras: 1 CHASE (over the shoulder, RoR2), 2 HIGH, 3 LOW, 4 OVERHEAD (dome hidden from that camera only), 5 WIDE (cover-like), 6 APPROACH (drifts in from the tunnel), 7 FREE (orbit, prints yaw/pitch/dist).
- Lich readings (P): A rainbow bones; B pale bone, rainbow waves passing up; C prism edges.
- Darkness (D): COVER DARK / DIM (default) / READABLE.
- Not judged yet: snakes (placeholder), attacks, the solution, HUD, sounds.
- Verdict (owner, 2026-09-27):
- Cameras: the whole game uses Resident Evil-like static cameras, one per portion; this room's is fixed, between 2 (HIGH) and 4 (OVERHEAD).
- Lich: A is the idea but far subtler: gem-like, different portions glow as light hits them differently while he moves.
- Darkness: between DIM and READABLE; light must be more realistic ("properly model light reflections"), round 1 looked too videogamey.
- Cave: more rock formations so the floor isn't flat; textures are alright.
- Egg: a bit smaller.
- Lich and snakes: "way more realistic" and more aesthetic. Use references or Astra generations; use him as the judge.
02 -- the light, the room camera, the formations; references (2026-09-27)
Purpose: realistic light (baked bounce), the static room camera, rock formations and the
smaller egg, judged in the scene; plus reference boards for the realistic lich and snakes (the
snake species and the prismatic reading are his picks). Pages: rounds/02-cave-light/index.html
(+ stills.png), rounds/02-references/index.html (Astra run
Anchor/workflow/delegate/runs/*-lich-survivors-refs, images in reference/astra-r02/).
- Light: sun + shadow map for direct;
web/src/gi.jsbakes the indirect (per-triangle hemisphere gathers against a BVH, 3 bounces, 64 rays, the sky through the shaft, and the COLUMN as a scattering emitter -- most of the room's light; denoised within 0.9 m), stored inweb/src/gi_data.jsbytools/store_gi.py(15 s bake; the page loads it in ~0.1 s; a stale key re-bakes at load). Moving things sample a probe grid (up/down irradiance, 3D textures). Rock albedo raised to real cave rock; no fill lights. Physical result: far rock ~1000x dimmer than the pool; the LEVEL of the bounce is an art knob (D: DIMMER / BETWEEN DIM AND READABLE (default, x10) / BRIGHTER). - Camera 1 STATIC: eye (0, 15, -8.8) -> (0, 0, 0.6), fov 50, dome cut away.
- Formations: 7 outcrops, 11 stalagmite clusters (taller toward the walls), 40 stalactites, floor ridges, the floor climbing into the walls; egg 0.8 m.
- Lich: placeholder model with the gem material (
web/src/gem.js: spectral fire on the shadowed specular, thin-film sheen, inner rainbow proportional to arriving light; no emission, no lich light). P = SUBTLE/MEDIUM/STRONG, M = drift through the light. - Self-critique vs Astra's cave refs (for round 3): real caves are darker with a smaller, brighter pool whose edge is broken by rubble; floors much rougher; stalagmites tall and knobbly; rock with strong micro-relief.
- Verdict (owner, 2026-09-27):
- Lich shape = Astra lich 07, "all the others are slightly off": the legs held together (knees nearly touching, feet side by side), the pair swept back on one diagonal, shins angled back a little more than the thighs, toes pointed down, one leg a little behind. Rejected: legs hanging straight down (04, 05), apart (01), half-sitting (02).
- Snakes: species doesn't matter; they must be aesthetic; the game's had the wrong shape; snake 03 (mamba-like: long, slender, wide S-curves, neck lifted, narrow head) "feels fine".
- Cave: a mix of cave 04 (angular fractured blocks, slabs) and cave 06 (dark boulders, a floor strewn with stones and grit). Not 02/05's stalagmites.
- Room camera: "slightly down and slightly angled up so the ceiling/wall is just barely showing".
- Gem: STRONG is the right one. Brightness: the egg and the lit floor too bright.
03 -- the realistic lich and snakes, the 04/06 cave, the lower camera (2026-09-27)
Purpose: the lich as a real skeleton posed like 07, snakes shaped like 03, the rocks of 04/06,
the new room camera, a softer pool; judge the models in the scene. Page:
rounds/03-lich-snakes-cave/index.html, stills.png, compare.png (07 and 03 beside ours).
- Lich:
web/src/skeleton.jssculpts every bone (distance fields meshed by surface nets inweb/src/sdf.js; ribs, cartilage, clavicles swept): skull with orbits, nasal opening, cheekbones, teeth; hinged jaw; 24 vertebrae; 12 rib pairs + cartilage + sternum; scapulae, clavicles; pelvis (curved iliac wings, ring, sacrum); long bones with heads and condyles; patellae; hands with jointed fingers; feet. ~210k triangles, built at load in ~3 s.web/src/lich.js= the joint rig and the 07 pose. Gem STRONG by default, smooth colour. - Snakes: one tube per snake along its trail, radius profile for the head/neck/tail, the front ~1 m lifted, rings crowded toward the snout, serpentine S (~1 m waves), dark olive-bronze glossy with a rim sheen, flush dark eyes; 4.4 m x 16 cm (03's proportions, dream-sized so they read from the room camera; at 12 cm they were 2 px there). They now come into the pool before the placeholder dissolve.
- Cave: rocks are convex hulls (flat fracture faces): wall blocks, leaning slabs, 10 floor piles, 170 stones, big stones breaking the pool's edge; no stalagmites/stalactites.
- Light: direct sun drawn at 55% (the bake keeps the full sun), egg shell darker, beam softer.
- Room camera: eye (-3.6, 9.8, -10.4) -> (0.4, 0.1, 2.4), fov 50, dome kept.
- Known: the skull still reads soft/cartoonish up close; STRONG on the realistic bones gives large pastel zones (P for MEDIUM/SUBTLE); snakes' attack/death are placeholders.
Verdict: pending.
Verdict (owner, 2026-09-27): "most of it is good". Changes: the light should come from further above, further away, so it lands lighter; the light circle's edges softer (find real references); the egg glows too much; the lich is almost invisible, "should be a bit more solid".
04 -- softer, higher light; a solid lich (2026-09-27)
Purpose: the shaft ~46 m tall, soft-edged pool and beam, dimmer landing, a lich that reads
from the room camera; real photographs as the reference for the soft edge. Pages:
rounds/04-soft-light/index.html (+ stills.png), rounds/04-soft-light/real-references.html
(12 Wikimedia Commons photos hotlinked, found by a Sonnet research subagent: Tayos chimney,
Jomblang (~60 m pit), Son Doong, Antelope Canyon, Suytun, Samula...).
- Physics: a shadow edge blurs by (distance to the caster) x (the sun's ~0.5 deg); so a far
opening = a soft pool edge, a near rock = a crisp shadow.
web/src/soft_shadows.jsreplaces three's PCF filter with percentage-closer soft shadows (blocker search -> penumbra width); the beam pass blurs its shadow taps more the further below the opening (soft,top). Sun angle used: 1.6x the real one. - Direct light on the floor 0.42 of the baked sun; egg shell darker; beam colour/density lower.
- Lich: every bone grown 3.2 mm (
build_skeleton_geometry(res, grow)), gem level SOLID (ivory, fire 4, little inner wash; STRONG (ROUND 3) and SUBTLE on P), roughness 0.44; hover at the pool's edge (0, -1.9), facing the egg, so the sun catches his skull and shoulders. Alternative tested: beside the pool against dark floor (reads well too). - Verdict: pending.
Pending decisions
- Round 4: the soft edge against the real photos, the brightness, the solid lich and where he hovers.
Next (planned)
- Realistic lich model: sculpted procedurally from anatomy (signed-distance bones, marching cubes), rigid parts on the existing joint hierarchy, gem material per his pick.
- Realistic snakes: continuous skinned body along the trail, sculpted head, the chosen species' scale pattern.
Tools
tools/shoot.mjs web <script.json> <outdir> --size 1280x720: headless Chrome capture (from retro-shooter's harness).window.GAME: ready, setManual, step(n), cam(i, free), mode(m), dark(i), state(), snakes().tools/bundle.mjs web rounds/<nn>/index.html: one self-contained page per round.tools/tile.py out.png a.png b.png --cols 3 --scale 0.5: contact sheets.