diff --git a/src/AcDream.App/Rendering/RetailPViewPassExecutor.cs b/src/AcDream.App/Rendering/RetailPViewPassExecutor.cs index 633ba405..0f3df8ca 100644 --- a/src/AcDream.App/Rendering/RetailPViewPassExecutor.cs +++ b/src/AcDream.App/Rendering/RetailPViewPassExecutor.cs @@ -470,7 +470,16 @@ internal sealed partial class RetailPViewPassExecutor : // DrawLandscapeStaticParticles after the slice loop (retail: one // unclipped alpha-list insertion per emitter), not per slice here. EnableClipDistances(); - if (frame.RenderSky && frame.RenderWeather) + // Retail GameSky::Draw @0x00506ff0 gates the WEATHER pass (arg2==1) + // on SmartBox::is_player_outside @0x00451e80 — Ghidra-arbitrated: + // (player objcell_id & 0xFFFF) < 0x100. The sky pass always draws; + // the rain draws ONLY while the PLAYER stands in an outdoor cell. + // That one boolean is retail's entire rain confinement (the + // owner-reported indoor/seam rain at the cathedral: rain on the + // ledges, none the instant the player crosses into an interior + // cell) — no depth or view-clip mechanism is involved. + bool playerOutside = (frame.PlayerCellId & 0xFFFFu) < 0x100u; + if (frame.RenderSky && frame.RenderWeather && playerOutside) { _sky?.RenderWeather( frame.Camera,