Devlog ·
Ocean Restore Plan — April 16, 2026
~2 min read · 544 words
Status: active short-term plan Owner: PS1 prerender pilot
On this page
- Safe baseline
- What just failed
- Goal
- Execution rules
- Step sequence
- Step 1: Lock baseline again
- Step 2: Prove ocean-only initialization in isolation
- Step 3: Put the existing standalone foreground player on top of the proven
- ocean-only base
- Step 4: If Step 3 fails, fix restore semantics before trying more init work
- Step 5: Only after ocean is stable, restore island
- Step 6: Only after static island is stable, restore random island placement
- Immediate next move
Safe baseline
title -> fgpilot fishing1is the current known-good path.fishing1prerender playback is visually correct on the black base.- Timing is close to PC after host-deadline replay and deadline catch-up work.
- The generic foreground runtime path has already been proven on
fishing2.
Reference launch:
./scripts/rebuild-and-let-run.sh fgpilot fishing1
What just failed
These are explicitly not the next step:
- swapping ocean into the standalone prerender loop by changing only the base background load
- routing
fgpilot fishing1through fulladsInitIsland() + adsPlay()
Observed failures:
- repeated Johnny overpaint / ghosting when ocean was forced under the standalone pack player
- partial scene startup and missing Johnny when full ADS scene routing was used
Conclusion:
- ocean cannot be restored safely by brute-forcing a different background into the current standalone playback loop
- full ADS scene routing changes too much behavior at once for this milestone
Goal
Restore the real ocean layer under prerender playback while keeping the foreground pack playback path stable and generic.
Execution rules
- One change at a time.
- Run after every step.
- User validates every step before any commit.
- No Fishing-1-only runtime hacks.
- Do not reintroduce full ADS scene playback as an implicit side effect.
Step sequence
Step 1: Lock baseline again
Goal:
- keep
title -> fgpilot fishing1on the known-good black-base path
Exit criteria:
- visuals match the current baseline
- no ocean yet
- no Johnny ghosting
Step 2: Prove ocean-only initialization in isolation
Goal:
- initialize the ocean/island background machinery without starting scene ADS logic or foreground playback
Requirements:
- no walk thread
- no island animation thread unless explicitly needed for the ocean base to appear
- no foreground prerender overlay yet
Exit criteria:
- ocean appears correctly
- no corruption or title leftovers
- stable for a simple hold run
Step 3: Put the existing standalone foreground player on top of the proven
ocean-only base
Goal:
- reuse the exact current standalone
fishing1foreground playback loop - change only the source of the clean background baseline
Exit criteria:
- ocean visible
- Johnny and props still render correctly
- no cumulative overpaint / ghosting
Step 4: If Step 3 fails, fix restore semantics before trying more init work
Primary suspects:
grRestoreBackgroundRectForFrame()grRestoreAndCompositeDirect16BackgroundRectForFrame()prevDirty/currDirtyadvancement- assumptions in the standalone loop that only happen to work on black
Rule:
- do not add more background setup complexity until restore correctness is proven against a non-black clean baseline
Step 5: Only after ocean is stable, restore island
Goal:
- static island first
- no random placement yet
Step 6: Only after static island is stable, restore random island placement
Goal:
- generic island positioning
- foreground playback still composes correctly
Immediate next move
Build an ocean-only proof path that initializes the real ocean background
without entering full ADS scene playback, validate that by itself, then layer
the current standalone fishing1 foreground playback over that same base.