Platformer showcase polish: longer levels, JOINT mechanics, crusher alleys#40
Merged
Merged
Conversation
…s; boulder slides all the way User: longer classic levels with more clouds/coins/enemies/switches; snails used liberally; bring the old chained-weight thwomps back; and the L3 ice boulder should SLIDE ALL THE WAY in its direction (no teleport-reset). - BOULDER: lowered friction (coasts far) and moved its reset line off-screen-left (3050 -> 2300, past the run and below the camera edge while the hero is in it), so a fresh boulder arrives from the source instead of one teleporting back in place. The slide path is clear (the snow cloud is a one-way chain above; the saw is bodiless; the patrol slime sits left of 2300 so the re-park beats it there). - A fourth act on every level, finales shifted whole again (L1 +768 tail, L2 +640, L3 +512, L4 +512): the classic chained-weight THWOMPS return in all four levels (with ride-the-head coins), SNAILS go liberal (L4 now has four), plus more one-way clouds, coins, and decor. - New widths L1 6336 / L2 4672 / L3 5312 / L4 5376. Enemy indices unique per level; flags within bounds. Docs synced. Still zero Kit changes. https://claude.ai/code/session_012A6Dqdr3DPCeC3oWZohjHi
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 929d9d92df
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Reported by the user: the four new "ride the thwomp head" coins were placed at y184, but pfMakeThwomp's body spans y170..230 (centered at 200), so the coin sat INSIDE the block - below the hero riding on top - hidden and unreachable, which would prevent the collect-every-coin gate from opening. Moved all four (L1 5700, L2 3600, L3 4280, L4 4600) to y110: above the block top (170) so never embedded, and within the hero's body as the rising head crests, so it is grabbed by the RIDE itself (no precise hop) - the gate opens reliably. (The original L2 ride coin at y64 is unchanged.) https://claude.ai/code/session_012A6Dqdr3DPCeC3oWZohjHi
…king fix) User found an L3 coin they couldn't reach. The new thwomps' reward coins sat at the crusher's perch height (embedded, then lifted just above it), reachable only by the obscure "hop onto the resting crusher and ride it up" beat - which a player avoiding the hazard never finds, so a REQUIRED collect-every-coin could lock the goal-flag gate. Fix: all four new thwomp coins (L1 5700, L2 3600, L3 4280, L4 4600) moved to y500, directly UNDER each crusher on the critical path. The crusher is too tall to jump over, so the hero must pass beneath it to progress and grabs the coin by passing (timing the crush) - the gate is guaranteed to open. A full coin-reachability audit (every coin vs each level's slabs / clouds / pits / step-plats) confirmed every other coin is reachable via its mechanism (spring arcs, the rope-bridge deck, jump-over-pit arcs, the mound plateau, and L2's original verified ride coin at 1840,64). Static checker passes; zero Kit changes. https://claude.ai/code/session_012A6Dqdr3DPCeC3oWZohjHi
The final completability review (all four levels confirmed finishable, every coin reachable, no softlocks) flagged one minor: L4's finale (slime -> snail -> crusher -> snail) had a ~60px-clear-air pinch, under the ~100px layout law. Nudged the third snail +40 (4400 -> 4440); every gap in that run is now >=100px, with no cascade onto the steps/flag. Static checker passes; zero Kit changes. https://claude.ai/code/session_012A6Dqdr3DPCeC3oWZohjHi
Mirror L1's GREEN CRUSHER ALLEY across L2/L3/L4: a row of four tile-block thwomps the hero dashes BENEATH, then a two-cloud hop to the flag. - New pTileFace param on pfMakeThwomp draws a plain tile-sprite crusher (no mood-face swaps; same armed/drop/rest/rise/re-arm cycle), so the alley never blocks the path for good. Biome-matched blocks: green (L2 grass), blue (L3 ice), red (L4 haunted). - Finales (walled door + steps + flag + bounds) shifted right as whole units by +1280 (tile-aligned): L2 4672->5952, L3 5312->6592, L4 5376->6656. Coins at under-crusher midpoints (y500) and atop each cloud (y392); a new snail in L2 and L3 (snails liberally). - Cloud chains ghost-padded a tile past the art each side (solid span == art span); door-gated coins reachable (keys are early on the path); enemy indices unique per gBlock/gSlime/gPlant namespace per level. Opus correctness/completability review found no blockers across index uniqueness, coin reachability, ghost-padding, spacing, finale consistency, patrol safety, and compile. Static checker clean; zero Kit changes (harness v10 holds). Awaiting the OXT pass. https://claude.ai/code/session_012A6Dqdr3DPCeC3oWZohjHi
An Opus audit of on b2kFrame + all pfTick* against the kit's performance playbook found one regression (introduced by the crusher alleys) and three free wins, all example-side. - pfTickThwomps read b2kPosition over the FFI for EVERY block every frame, even armed ones (static bodies resting at a fixed perch). With the new alleys at ~7-8 blocks/level and only 0-1 ever in motion, that was ~7 wasted FFI round-trips + string splits per frame. Now each perch x is cached (gBlockX) at make/re-arm, the armed->falling trigger uses the cached x + the shared hero snapshot (perch y is invariantly 200), and b2kPosition is read only for the 0-1 blocks in motion. Identical trigger. - shellslide tick reads b2kVelocity once (was twice). - HUD reuses the snapshotted gHeroState and a single camera-scroll read. Every other per-frame tick was already at the playbook's standard. Gotcha scan clean. Example-only, no harness bump (v10 holds). Static checker clean; awaiting the OXT pass. https://claude.ai/code/session_012A6Dqdr3DPCeC3oWZohjHi
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.
Pre-Wave-4 polish of the flagship platformer into a professional demo of the kit as it stands today. All example-side: zero Kit changes, harness v10 holds. Static checker clean (smart quotes, handler/block balance, embedded-Kit sync); awaiting the OXT runtime pass for feel/art facing (statically unverifiable).
What's in this branch
b2kExplodescatters a crate woodpile). A prototyped wrecking ball was cut — a rotating arm can't be sprite art (gotcha 23), and the kit is sprite-only for game visuals.pfMakeCritter: mouse, worm, ladybug, and a fire slime by the L4 lava. L4's piranha row doubled to four burrows.pTileFaceparam onpfMakeThwomp(plain tile sprite, no mood-face swaps; same drop/rest/rise/re-arm cycle, so the alley never blocks for good).Verification
An Opus correctness/completability review of the latest round found no blockers across index uniqueness, coin reachability, cloud ghost-padding, beat spacing, finale consistency, patrol safety, and compile. Decision log:
plan.md(rows through "Showcase round 4").https://claude.ai/code/session_012A6Dqdr3DPCeC3oWZohjHi