FallingBehind the build
From ideas, art, and sound to a working product and release. Explore each chapter, its challenges, and the solutions.
Project imageRevised concept with corrected Booster names and roles; displayed numbers belong to the concept.
Supporting media
Turn concepts into assets that match the game
Where it started
Start with the city and its objects, then turn concepts into scenes, controls, and addressable item sprites.
What went wrong
Concept art invented Boosters such as Magnet and Shield. Implementing it literally would introduce mechanics outside the design.
The solution
Check art against the rules, correct the Boosters, and pack individual item sprites into deterministic slots.
- Compare concepts with actual mechanics and Boosters before using them as UI references.
- Produce individual transparent item cutouts with size-specific art boxes and padding.
- Pack deterministic 5×5 sheets with explicit sprite rects and pivots for Unity.
Technical details & evidence
Development process
The visual direction begins with an industrial city and storied objects, then separates into scenery, controls, icons, and sprites for 452 ID-addressed items.
- Compare concepts with actual mechanics and Boosters before using them as UI references.
- Produce individual transparent item cutouts with size-specific art boxes and padding.
- Pack deterministic 5×5 sheets with explicit sprite rects and pivots for Unity.
Recorded problem
Concept art introduced Magnet, Slow Time, and Shield, plus invented wall slogans. Implementing the image literally would add mechanics outside the design.
Implementation
Correct the mismatched content to 2× Coins, Soft Liner, and Contract Radar, preserve the art direction, and let deterministic tools—not an image model—assemble final sheets.
Evidence & limits
Correction prompts and a 22-sheet manifest cover 452 items. The illustration is a revised concept, not a runtime screenshot.
Source: Docs/DesignConcepts/StoryGrounded/correction-prompts.md + Docs/SpriteSheets/item_sprite_sheet_manifest.md
A UI migration must reconnect its sounds
Where it started
Map sounds to falling objects, story events, and reward counters, then verify that the new UI actually triggers them.
What went wrong
After the UI migration, some item-summary, bonus, and payout sounds were disconnected even though their clips still existed.
The solution
Reconnect cues at the new UI events, preserve their timing, and distinguish originally empty slots from migration regressions.
- Compare the original SoundCueCatalog with active frontend call sites.
- Check decoding, nonzero signal, and preserved volume, pitch, and cooldown settings.
- Exercise real AudioSources, independent Music/SFX mute, and duck/recovery behavior.
Technical details & evidence
Development process
Moving the frontend to UI Toolkit must preserve music, story cues, and reward-count feedback. A clip existing in the project does not mean the new UI still triggers it.
- Compare the original SoundCueCatalog with active frontend call sites.
- Check decoding, nonzero signal, and preserved volume, pitch, and cooldown settings.
- Exercise real AudioSources, independent Music/SFX mute, and duck/recovery behavior.
Recorded problem
Some events lost their playback connections: story text, item summaries, payout counters, and bonus panels, despite the original clips and catalog remaining intact.
Implementation
Reconnect cues at the new UI’s state/events, retain counter cooldowns, and distinguish 19 originally unassigned slots from migration regressions.
Evidence & limits
The 6 Oct audit reports 63 assigned cues from 36 files and 32 passing tests. The A17 audio capture failed because of battery state, so it does not certify handset speaker playback.
Source: Docs/AudioAudit-20261006.md
Physics continues into the ending presentation
Where it started
Separate catching, timeout, and claiming, checking that physics and counted objects remain consistent throughout the run.
What went wrong
Items were reported bouncing out while swiping at timeout. Retention damping stopped immediately, while physics continued for three seconds before the pile was counted.
The solution
Keep normal basket and Soft Liner damping active during the ending, then test through claiming and upgrading.
- Separate active play, timeout presentation, and claiming into testable states.
- Check collisions and retention damping for normal baskets and Soft Liner across the state transition.
- Exercise the production-scene journey from play through claim and upgrade.
Technical details & evidence
Development process
At timeout the basket stops accepting input, but item physics continues for three seconds before the final pile is evaluated. The fix must preserve retention damping throughout that interval.
- Separate active play, timeout presentation, and claiming into testable states.
- Check collisions and retention damping for normal baskets and Soft Liner across the state transition.
- Exercise the production-scene journey from play through claim and upgrade.
Recorded problem
The build-18 fix keeps basket damping active through the three-second ending presentation, avoiding an immediate change in retention behavior at timeout.
Implementation
Retain normal and Soft Liner damping during the ending phase and include horizontal, upward, and angular retention tuning in the release source.
Evidence & limits
The build-18 report records 3/3 passing regressions and production-scene checks, without a fresh physical installation or cold-start measurement for that release.
Source: Docs/RunEndingPhysics-20261012.md + Docs/ProductionRelease-v18-20261013.md
Project imageThai Settings QA render after row alignment, using test-scene values.
Supporting media
Fix misaligned buttons at the layout rule
Where it started
Use consistent button edges and gaps across pages, then check Thai, English, and several screen widths.
What went wrong
Story extended beyond Workshop because row gaps differed and the last button retained extra trailing space.
The solution
Fix the shared rule with equal columns and gaps only between buttons, aligning the affected pages together.
- Measure row edges, column widths, and gaps.
- Use equal flex columns, zero minimum widths, and gaps only between buttons.
- Check geometry across pages, locales, and widths, capturing only after transitions settle.
Technical details & evidence
Development process
Story, Workshop, and footer actions need consistent edges and proportions across Thai, English, and screen widths. Nudging one button would not fix the shared layout rule.
- Measure row edges, column widths, and gaps.
- Use equal flex columns, zero minimum widths, and gaps only between buttons.
- Check geometry across pages, locales, and widths, capturing only after transitions settle.
Recorded problem
Story extended past Workshop because rows used different 6-, 8-, and 10-unit gaps and the final button retained a right margin.
Implementation
Apply one equal-column/inter-column-gap rule, remove trailing margins, and reuse it for tabs, language, analytics, and Booster slots.
Evidence & limits
The 12 Oct record covers 42 page/locale/width combinations; the complete run plus gameplay journey passed 2/2. A supplementary Editor shutdown crash was recorded separately from passing assertions.
Source: Docs/ButtonRowAlignment-20261012.md
Avoid repeat work and duplicate rewards
Where it started
Reuse Collection rows and handle rewarded-ad returns without issuing a duplicate reward.
What went wrong
Virtualized rows still repeated setup and text measurements, while ad callbacks could arrive in different orders.
The solution
Cache reusable controls, remeasure only after changes, and resolve reward-earned plus ad-closed callbacks exactly once.
- Cache row controls at creation and install click handlers once.
- Use RefreshItems instead of Rebuild and remeasure marquees only when content or geometry changes.
- Wait for both reward-earned and ad-closed in either order, guarding duplicate callbacks.
Technical details & evidence
Development process
Collection scrolling and returning from a rewarded ad are frequent paths, requiring both bounded UI work and correct rewards.
- Cache row controls at creation and install click handlers once.
- Use RefreshItems instead of Rebuild and remeasure marquees only when content or geometry changes.
- Wait for both reward-earned and ad-closed in either order, guarding duplicate callbacks.
Recorded problem
Virtualization still repeated control lookups and handler creation on bind, while marquees remeasured every 50 ms without changes. Ad return also needed protection against duplicate rewards.
Implementation
Cache reusable data, invalidate only when needed, clear recycled card state, and resolve the paired ad callbacks exactly once.
Evidence & limits
The 12 Oct records report 3/3 Collection and 4/4 startup/ad-return checks. Updated native iPad frame times were still pending.
Source: Docs/CollectionPerformance-20261012.md + Docs/StartupAndAdReturn-20261012.md
Bring it together before release
From individual parts to one app
Build Android 0.0.18 (18) with the timeout physics fix, checking the AAB, signature, and native libraries before submitting it with symbols.
The app and listing must agree
A fresh artifact is required because build 17 lacks this physics fix. Build 18 records 3/3 passing PlayMode checks, with no fresh physical installation or cold-start measurement.
Recorded release status
Build 18 was submitted for full-rollout Production review on 13 Oct. Build 17 was still live at that point, so submission and publication remain distinct.
Dated project evidence, not a live Store lookup.
Build details & records
Integration
- Author items, stories, quests, and drop rules as JSON, validate against schemas, then build the runtime bundle.
- Connect the data to Unity and audit scene references, tables, and translations instead of scattering content values through code.
- Build 18 keeps normal basket and Soft Liner damping active through the three-second ending presentation.
Evidence
The 13 Oct 2026 build-18 report records 3/3 passing PlayMode regressions and run/claim/upgrade checks, plus validation of 452 items, 24 stories, and eight scenes. No fresh physical installation or cold-start measurement was claimed for that build.
Store submission
Version 0.0.18 (18) used an Android IL2CPP ARM64 build, with bundle, signature, and native-library checks before uploading the AAB and symbols for full-rollout Production review. Version 17 was live at the time of the record; version 18 was not yet confirmed live.
Project records
- Docs/DesignConcepts/StoryGrounded/correction-prompts.md + Docs/SpriteSheets/item_sprite_sheet_manifest.md
- Docs/AudioAudit-20261006.md
- Docs/RunEndingPhysics-20261012.md + Docs/ProductionRelease-v18-20261013.md
- Docs/ButtonRowAlignment-20261012.md
- Docs/CollectionPerformance-20261012.md + Docs/StartupAndAdReturn-20261012.md
- README.md
- Docs/ProductionRelease-v18-20261013.md