Asset expansion: complete Phase B (block slime + conveyor) + Phase C slice 1 (Stone Keep, L7)#59
Merged
Merged
Conversation
…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
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 kindblock: a cube that hops back and forth across its band (_jumpframe airborne, awalk_a/bsquish idle settled), reversing at the edges and sleeping between hops. Stompable on the classic path (squashes toslime_block_rest) — no new contact case. Debuts in L6.Phase B slice 3 — the CONVEYOR BELT (
6c64b24)The unused
conveyortile 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.py— PASStools/audit-platformer.py— 0 findings across all 7 levels (block slime checked as a walker; conveyor passes a new over-solid-ground check; L7 auto-discovered)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