From edb3278370e257a5bf7347b78b161e40fe5ad569 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 3 Sep 2026 07:29:55 +0200 Subject: [PATCH] =?UTF-8?q?docs(render):=20chunk=203=20R5=20=E2=80=94=20th?= =?UTF-8?q?e=20second=20sky=20pass=20is=20retail's=20weather=20pass?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GameSky::Draw 0x00506ff0 arg2==1 is the weather pass gated on SmartBox::is_player_outside 0x00451e80, already modeled by RenderWeather; chunk 3 only has to keep it after the last land cell. Co-Authored-By: Claude Fable 5.1 --- .../s3-walk-ownership-map.md | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/docs/research/2026-09-01-overhaul/s3-walk-ownership-map.md b/docs/research/2026-09-01-overhaul/s3-walk-ownership-map.md index 96af78fc..a81ce0b5 100644 --- a/docs/research/2026-09-01-overhaul/s3-walk-ownership-map.md +++ b/docs/research/2026-09-01-overhaul/s3-walk-ownership-map.md @@ -408,16 +408,18 @@ edits the same driver). bisect" wording: the whole-stage terrain event is replaced in THIS chunk (drawing terrain twice would already hide the punch and make the gate meaningless), and chunk 4 loses that deletion. -- **R5 — the sky draws TWICE.** `LScape::draw` @0x00506330 calls - `GameSky::Draw(sky, 0)` @0x0050633c BEFORE `draw_check_blocks`, walks the - blocks (`DrawBlock` @0x00506374), and then calls `GameSky::Draw(sky, 1)` - @0x00506396 AFTER every block. acdream emits one `Sky()` event at the - landscape turn's start. The implementer reads `GameSky::Draw` (grep it) - and reports what the second pass (`arg2 == 1`) draws; if it is a real - post-terrain layer (horizon band, celestial sprites, the far fog dome), - chunk 3 adds the second sky event after the last land cell; if it is - empty at retail defaults, the contract records why with the address. Do - not guess — read it. +- **R5 — the sky draws TWICE, and the second pass is the WEATHER.** + `LScape::draw` @0x00506330 calls `GameSky::Draw(sky, 0)` @0x0050633c BEFORE + `draw_check_blocks`, walks the blocks (`DrawBlock` @0x00506374), then calls + `GameSky::Draw(sky, 1)` @0x00506396 AFTER every block. `GameSky::Draw` + @0x00506ff0's `arg2 == 1` is the weather pass, gated on + `SmartBox::is_player_outside` @0x00451e80 (already Ghidra-arbitrated and + modeled by `RetailPViewPassExecutor.DrawLandscapeSliceLate`'s `RenderWeather` + call — see that method's comment). Chunk 3 keeps the sky at the landscape + turn's start and places the weather pass AFTER the last land cell of the + turn (retail order); the implementer confirms where the late landscape + slice runs relative to the new per-cell events and moves the weather call + only if it currently runs before them. ### 9.2 Production behavior change