Skip to content

Asset expansion: complete Phase B (block slime + conveyor) + Phase C slice 1 (Stone Keep, L7)#59

Merged
SethMorrowSoftware merged 10 commits into
mainfrom
claude/wizardly-brown-1lgjrx
Jun 18, 2026
Merged

Asset expansion: complete Phase B (block slime + conveyor) + Phase C slice 1 (Stone Keep, L7)#59
SethMorrowSoftware merged 10 commits into
mainfrom
claude/wizardly-brown-1lgjrx

Conversation

@SethMorrowSoftware

@SethMorrowSoftware SethMorrowSoftware commented Jun 18, 2026

Copy link
Copy Markdown
Owner

What this is

Three example-side slices of the asset-expansion plan, building on the merged Cavern Depths (L6). All are example-side — no Kit change, no harness bump — and ride the existing slime-family / per-frame / level-builder machinery.

Phase B slice 2 — the BLOCK SLIME (b49c487)

The unused slime_block_* foes art becomes a slime-family kind block: a cube that hops back and forth across its band (_jump frame airborne, a walk_a/b squish idle settled), reversing at the edges and sleeping between hops. Stompable on the classic path (squashes to slime_block_rest) — no new contact case. Debuts in L6.

Phase B slice 3 — the CONVEYOR BELT (6c64b24)

The unused conveyor tile becomes a polled surface zone (pfMakeConveyor) that adds vx to the grounded hero on top of his walking (you can power against it; jumping over is unaffected). No body. The art is a single frame (no scroll animation), flipped to face the push direction. A leftward treadmill in L6. This completes Phase B.

Phase C slice 1 — LEVEL 7 "STONE KEEP" (f0115c5)

A seventh level on the previously-unused terrain_stone_* set over a built dark stone backdrop (pfBuildStoneBackdrop): a watchtower (wall-jump), a wide spiked moat (256px, four spikes), a rubble ramp, a one-way stone battlement, two slimes + a snail, a bonus gem, torchlit halls, carved stone steps to the flag. The win moves to L7 (gLevel >= 7); L6's flag now advances. Built on the proven L6 geometry in stone — the spinner hazard and the multi-key/switch puzzles (the keep's real identity) land in Phase C slices 2-3.

Verification

  • tools/check-livecodescript.pyPASS
  • tools/audit-platformer.py0 findings across all 7 levels (block slime checked as a walker; conveyor passes a new over-solid-ground check; L7 auto-discovered)
  • All new frame names verified against the atlas.

Statically verified — needs an OXT pass. Header verify items 20 (Cavern Depths additions) and 21 (Stone Keep) have the per-level checklists. The art-orientation items (block-slime hop frames, conveyor direction cue, torch/chain/stalactite facing) are the things I can't confirm statically.

🤖 Generated with Claude Code

https://claude.ai/code/session_01X92APxUJUMue3bAzXiX9V2

claude added 3 commits June 18, 2026 00:06
…e 2)

The unused slime_block_* foes art becomes a new slime-family kind "block": a
cube that arcs back and forth across its band in hops (the _jump frame in the
air, a walk_a/b squish idle when settled), reversing at the band edges and
sleeping between hops. Stompable on the classic path (a stomp squashes it to
slime_block_rest, a side touch knocks back) - no new b2kContact case, like the
frog.

- new pfMakeBlockSlime maker (hopper, modeled on pfMakeFrog) + "blockidle" anim
- new case "block" in pfTickSlimes (hop on a timer when grounded; jump frame
  airborne; reuses gFrogAir as the per-index airborne flag)
- debuts in L6 "Cavern Depths" (replaces a plain slime, 2440..2680 band)
- audit-platformer.py gains the pfMakeBlockSlime parse branch

Example-side only (no Kit change, no harness bump). check-livecodescript passes;
audit clears all 6 levels (L6 still 0 findings, block slime parsed as a walker
on solid ground). Statically verified; needs an OXT pass.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X92APxUJUMue3bAzXiX9V2
The unused `conveyor` tile becomes a polled surface zone (pfMakeConveyor pL,pR,
pDir) that adds a steady vx to the GROUNDED hero on top of his own walking, so
you can power against it; jumping over it is unaffected and a hero on a higher
platform at the same x is excluded. No body - the level's ground slab still owns
the collision. Built example-side per the plan (no Kit "surface velocity"
feature). The conveyor art is a single frame (no scroll animation), flipped to
face the push direction.

- new pfMakeConveyor maker + pfTickConveyor (added to the frame fan-out; one
  compare when no belts exist; reads the per-frame hero snapshot)
- gConv* zone arrays (declared + reset in pfStartGame)
- debuts in L6 as a leftward treadmill (2176..2368) before the block slime
- audit-platformer.py: conveyor parse branch + an over-solid-ground check (a
  belt may not run over a pit); also corrected the now-stale spike-tiling comment

Completes asset-expansion Phase B (dirt biome L6 + block slime + conveyor; torches
landed in slice 1's polish). Example-side only (no Kit change, no harness bump).
check-livecodescript passes; audit clears all 6 levels. Statically verified.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X92APxUJUMue3bAzXiX9V2
…Phase C, slice 1)

A seventh level on the previously-unused terrain_stone_* tile set, over a built
dark stone backdrop (pfBuildStoneBackdrop, gray-blue): a watchtower (wall-jump,
slot coin), a wide spiked MOAT (256px, four spikes) to leap, a rubble RAMP, a
one-way stone BATTLEMENT high route, two slimes + a snail, a bonus GEM atop the
tower, torchlit halls, and carved stone steps to the flag.

- new pfL7Scene/pfL7Cast (proven L6 geometry in stone; 256px moat) + a new
  pfBuildStoneBackdrop; both pfStartGame switches wire case 7
- win moves to gLevel >= 7 (L6's flag now ADVANCES); help/splash/win strings +
  header walkthrough/verify updated to seven levels

Built on the proven L6 geometry; the SPINNER hazard and the multi-key/switch
PUZZLES (the keep's real identity) land in slices 2-3. Example-side only (no Kit
change, no harness bump); audit-platformer auto-discovers and clears L7 (9 coins,
3 walkers, 0 findings across 7 levels). Stone frame names verified against the
atlas. Statically verified; needs an OXT pass (header verify item 21).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X92APxUJUMue3bAzXiX9V2
@SethMorrowSoftware SethMorrowSoftware changed the title Platformer Phase B slices 2–3: block slime + conveyor belt (completes Phase B) Asset expansion: complete Phase B (block slime + conveyor) + Phase C slice 1 (Stone Keep, L7) Jun 18, 2026
claude added 7 commits June 18, 2026 16:22
A top-right option-menu dropdown jumps straight to any level so the levels
already approved need not be replayed after every update.

- new pfbtn_level option menu in buildPfUI (top-right; the title field shrinks
  to make room), listing all 7 levels
- on menuPick -> pfJumpToLevel: a fresh run-state rebuild (banks zeroed) to the
  chosen level; pfStartGame already hides the win dialogue + clears the win
  latches, so it works from play, pause, or the win screen
- pfStartGame syncs the menu to the current level; pfChromeFront keeps it on top
- kPfUIVersion "7" -> "8" (chrome changed; older pasted stacks rebuild the UI)

Not part of the normal coin-gated progression. Example-side only (no Kit change,
no harness bump). check-livecodescript passes. Update the menu list when a level
is added.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X92APxUJUMue3bAzXiX9V2
…inned L6)

OXT pass flagged the Stone Keep as "a shorter version of the previous level" -
it had reused L6's exact geometry (wall-jump shaft, rubble mound, one-way cloud,
goal steps in the same spots) just reskinned to stone. Rebuilt as its own level:
a CASTLE climbed not crossed.

- a spiked MOAT (192px) at the gate, leapt into a BAILEY (a slime + a snail)
- a RAMPART STAIRCASE: three solid stone tiers (pf_plat1/2/3, block_top tops +
  block_center bodies down to the floor - a massive keep wall, not floating
  ledges) climbing to a high PARAPET
- a BLOCK SLIME guards the battlements; windows + torches set into the keep wall
- the bonus gem hangs above the parapet's edge; the flag waits up top
- no wall-jump shaft / mound / cloud (L6's signature beats) - structurally
  distinct
- pfShowSlabs learned the new pf_plat3 tier (no-art fallback stays correct)

Example-side only (no Kit change, no harness bump). check-livecodescript passes;
audit-platformer clears L7 (8 coins, 3 walkers, 0 findings across 7 levels).
Frame names verified. Statically verified; needs an OXT pass (verify item 21).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X92APxUJUMue3bAzXiX9V2
…lls up)

The user asked for an actual vertical level (jump UP to progress, not left-to-
right). The Stone Keep is now a tall tower you CLIMB, with the camera scrolling
UP as the hero jumps one-way stone ledges to the flag at the top - the first
level in the game that scrolls vertically.

New gated VERTICAL-CAMERA mode, parameterized so L1-L6 are byte-for-byte
unchanged:
- gCamTopY / gCamBotY / gKillPlaneY globals; pfBounds pins them (320/320/780 =
  no vertical scroll, as before), pfBoundsV opens them for a tall world
- the per-frame camera follows the hero's Y clamped to gCamTopY..gCamBotY, and
  centres X when the world is no wider than the viewport (the tower)
- the hero spawns at gRespawnX/gRespawnY (L1-L6 still 120/480; L7 = the tower
  bottom); the kill plane sits far below (a fall drops you to a lower ledge)
- pfBoundsV: a tall positive-coord world (walls + ceiling), camera bounds, no
  respawn-on-fall (contained)

The level: pfMakeLedge builds one-way stone climb platforms (b2kSmoothGround +
stone_cloud); a zig-zag of 8 ledges, 8 coins, a summit gem, the flag atop the
keep. tools/audit-platformer.py learned to skip a vertical level (the y=576
ground model doesn't apply); L1-L6 still 0 findings.

Example-side only (no Kit change, no harness bump). check-livecodescript passes.
THE VERTICAL CAMERA SCROLL is the one thing untested on the OXT engine (every
other level only scrolls horizontally) - flagged in verify item 21.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X92APxUJUMue3bAzXiX9V2
The vertical Stone Keep's camera was left-aligned: the play column (x64..960,
896px) is narrower than the 1024px viewport, and pfBoundsV set the camera's X
bounds to pLeft..pRight, so the camera clamped its LEFT edge to 64 and showed
dead space out to x1088 on the right (HUD: "view 64-1088") - the whole tower
sat shoved left.

Fix: pfBoundsV now sets the camera's X bounds to a viewport-WIDE range centred
on the play column ((cx-512)..(cx+512), e.g. 0..1024), so the camera centres the
tower instead of left-aligning. The Y bounds stay the full world height (the
vertical scroll is unchanged). Horizontal levels are untouched (they use
pfBounds).

check-livecodescript passes; audit unaffected (L7 still skipped).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X92APxUJUMue3bAzXiX9V2
The vertical keep's play column (x64..960) is narrower than the 1024px
viewport, so a centred camera leaves a 64px margin each side that read as
dead backdrop (the user saw it as "dead space on the right at ground
level"). The side-wall colliders existed but were invisible.

pfBoundsV now DRESSES each margin via a new pfDressWall helper: solid
stone blocks (terrain_stone_block_center, matching the floor/ledges) tiled
the full world height, lowest layer so torches/coins/ledges draw in front;
the flat collider slab made visible is the no-art fallback. The shaft now
reads as an enclosed keep edge-to-edge - no dead backdrop at ground level
or up the climb.

Example-side only (no Kit change, no harness bump). Static gates clean
(check-livecodescript PASS, audit-platformer 0 findings, L7 still skipped
as vertical). Needs the OXT pass to confirm the walls fill the margins.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X92APxUJUMue3bAzXiX9V2
The two keep windows were placed at hardcoded x16/x912 - chosen when the
side walls were invisible - so against the now-solid stone columns they
straddled the wall/shaft edge instead of sitting in the stone. Move each
to its wall column's tile origin (0 for the left column, 960 for the
right) so the window centres flush in the stone, matching the wall tiles.

Example-side only; static gates clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X92APxUJUMue3bAzXiX9V2
The keep's hazard: pfMakeSpinner registers a bodiless spooks-sheet sprite
(spinner.png / spinner_spin.png) that spins via ANIMATION - not body
rotation (gotcha 23) - and sweeps a horizontal sine path, hurting by
plain proximity exactly like the saw. An UNKILLABLE "saw-rule" hazard:
you TIME it, never stomp it (knockback through pfOuch in pfTickMovers,
never a respawn). Built on the existing mover table, so no new per-frame
tick. pHalf selects the wall-mounted spinnerHalf for slice 3's puzzle wing.

L7 deploys two full blades sweeping the shaft across a climb gap each
(lower L1->L2 at y986, upper L4->L5 at y602), placed standing-SAFE on
both adjacent ledges (the hero half-height is 38; each blade sits ~66px
clear of a hero on either ledge) so you wait on the lower ledge and time
the jump. Optional art (gated on gSpooksOK): no enemies.png = the maker
no-ops and the spots are simply safe - the climb never depends on a hazard.

Example-side only (no Kit change, no harness bump). Static gates clean
(check-livecodescript PASS, audit-platformer 0 findings, L7 still skipped
as vertical). The blade timing needs the OXT feel-pass (tune pPerX).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X92APxUJUMue3bAzXiX9V2
@SethMorrowSoftware SethMorrowSoftware marked this pull request as ready for review June 18, 2026 17:58
@SethMorrowSoftware SethMorrowSoftware merged commit 2d0b0c1 into main Jun 18, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants