Skip to content

platformer: illustrated biome cards (real game art on the transition card)#71

Merged
SethMorrowSoftware merged 3 commits into
mainfrom
claude/zealous-hypatia-v52yu7
Jun 21, 2026
Merged

platformer: illustrated biome cards (real game art on the transition card)#71
SethMorrowSoftware merged 3 commits into
mainfrom
claude/zealous-hypatia-v52yu7

Conversation

@SethMorrowSoftware

Copy link
Copy Markdown
Owner

What & why

Follow-up to the merged transition card (#70). You asked to make the loading/transition cards "more fun — more than solid colors with sparse text." This makes each level card an illustrated biome scene drawn entirely from the already-loaded atlases (zero new asset files).

Real per-level screenshots were rejected on purpose: the levels are ~6,400px scrolling worlds, so a flat grab is unrepresentative and would mean shipping/maintaining 7 PNGs in a deliberately asset-light repo. Using the real biome art + a sprite cast gets the "preview of this world" feeling better, for free.

What's on a card now

  • Real biome backdrop (L1–L5: the same Kenney bg art the level uses) filling the card under a dimming scrim so the title text reads. The dark cavern/keep (L6/L7, which build backdrops procedurally) keep their composed tint.
  • A cast row of real sprites — the chosen hero + a biome-representative foe + a coin + the goal flag — standing on a ground band, previewing what's in that world.
  • The title text moves into the upper band; the cast sits below it.

How (defensive by design)

  • Art is cloned onto the card via the proven pfTextureSlab throwaway-sprite path (pfCardArtImage), so it's camera-free chrome regardless of the live camera. Clones are resized directly — no b2kSheetScale juggling, so the game's sheet scales are never touched (avoids the gotcha-24 footgun).
  • Every piece is independently optional. A missing sheet or a failed slice just drops that layer, and the always-present opaque pfCardShade tint base still guarantees the cover hides the build. Worst case is "needs tuning," never a broken cover.
  • The whole stack (tint base + art layers + title text, tracked in gCardArt) fades out together; each layer carries its resting blend in uCardBaseBlend, so the scrim's dimming holds through the fade ramp instead of flashing opaque.

Verification

  • python3 tools/check-livecodescript.py — clean.
  • python3 tools/audit-platformer.py — 0 findings across 7 levels.
  • Example-side only → no Kit touch, no harness bump, embedded Kit in sync.
  • Fixed a wrong long-id idiom before it could bite: matched the codebase's direct-reference pattern (set the layer of <longid>), not control <longid>.

⚠️ Needs an OXT pass

You're my only runtime. Please confirm on the engine:

  1. The slice-clone art renders (backdrop + cast) and the cover stays fully opaque (no peek at the build).
  2. Composition — cast positions/sizes, the ground line (y=480), scrim strength (42), backdrop stretch across the 1024 width. All first-pass tunables.
  3. First-transition timing — the title→L1 cover slices a few uncached frames (~once); if it's a noticeable beat, I can pre-warm them at build.

🤖 Generated with Claude Code

https://claude.ai/code/session_01HkN9P6YodA65ZuhDDuuQks


Generated by Claude Code

claude added 2 commits June 20, 2026 23:06
…card)

The level cards are no longer a solid tint + sparse text. Each is now a
composed scene drawn from the already-loaded atlases (zero new asset files):
the level's real Kenney biome backdrop (L1-L5; the dark cavern/keep keep
their tint) under a dimming scrim, plus a cast row of real sprites - the
chosen hero + a biome foe + a coin + the goal flag - on a ground band.

- Art is cloned onto the card via the proven pfTextureSlab throwaway-sprite
  path (pfCardArtImage), so it is camera-free chrome regardless of the live
  camera; clones are resized directly (no b2kSheetScale juggling, so the
  game's sheet scales are never touched).
- Every piece is independently optional - a missing sheet or failed slice
  just drops that layer, and the always-present opaque pfCardShade tint base
  still guarantees the cover hides the build (worst case: needs tuning, never
  a broken cover).
- The whole stack (tint base + art + title text, tracked in gCardArt) fades
  out together; each layer carries its resting blend in uCardBaseBlend so the
  scrim dimming holds through the ramp instead of flashing opaque.

Real per-level screenshots were rejected: levels are ~6,400px scrolling
worlds (a flat grab is unrepresentative) and it would mean shipping PNGs.

Example-side only (no Kit touch). Static gates + audit clean. Needs an OXT
pass to confirm the slice-clone art renders and to tune the composition.

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

The illustrated-card backdrop stitched two copies of the same biome frame
stretched to fixed widths (0-592 and 432-1024); in their overlap each showed
a different part of the frame, so they did not line up.

Replace them with ONE panel scaled to COVER the card width with its aspect
kept (the overflow below the 640 card height is cropped by the window, and the
card's ground band hides the cropped foreground). A single image has no join,
so a seam is impossible - and the uniform scale means no distortion either.

Example-side only. Static gates + audit clean. Needs an OXT pass to confirm.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HkN9P6YodA65ZuhDDuuQks
@SethMorrowSoftware SethMorrowSoftware force-pushed the claude/zealous-hypatia-v52yu7 branch from b1cefa8 to 529ba57 Compare June 20, 2026 23:41
The single-panel backdrop (and the cast figures) still drew at their natural
sliced ~640px size because pfCardArtImage locked lockLoc BEFORE the caller set
the rect - but a LiveCode image only scales its content to a custom rect when
the rect is set while lockLoc is still false, then locked (the order the proven
pfTextureSlab uses). Move the lock to the callers, after each sets its rect, so
the backdrop fills the card and the cast figures scale to their target heights.

Also centre the backdrop's vertical crop so it shows the focal middle (horizon
/ hills) rather than only the top sky.

Example-side only. Static gates + audit clean. Needs an OXT pass.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HkN9P6YodA65ZuhDDuuQks
@SethMorrowSoftware SethMorrowSoftware marked this pull request as ready for review June 21, 2026 00:17
@SethMorrowSoftware SethMorrowSoftware merged commit b9c872c into main Jun 21, 2026
7 checks passed
SethMorrowSoftware pushed a commit that referenced this pull request Jun 21, 2026
Tie off the merged transition-card / title / illustrated-card work (PR #70 +
#71) across the docs:

- platformer-polish-plan: §2 status -> SHIPPED & MERGED (transitions, bookends,
  illustrated cards); tick the §9 DoD "no visible build" + "bookends"; note the
  docs pass under "Docs current".
- Fix the false "recoverable at commit fbc93b2" claim - that commit does not
  exist in git and there is no Clocktown commit anywhere, so the rollback left
  no recoverable trace; the as-built record is plan.md + CHANGELOG.md.
- README + CLAUDE: describe the new front-end (a boot title screen with
  character select, biome-illustrated transition cards that mask every level
  load).

Docs only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HkN9P6YodA65ZuhDDuuQks
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