using Unity.Entities; using UnityEngine; namespace ProjectM.Client { /// /// Client-only water-column ATMOSPHERE for the LANTERN seabed (deep-sea murk). A managed presentation /// system (SystemBase, main thread, NO Burst) in that OBSERVES the /// follow-camera's world-space X and lerps fog + flat ambient between the /// base-shelf murk (origin) and the deeper out-shelf murk (+1000 X) — mirroring HudSystem's region split /// at camera X > 500. The skybox stays empty and the post-FX volume GLOBAL; only fog colour/density + /// ambient shift per region. Pure presentation: never mutates the simulation. Knobs live in /// (falls back to baked LANTERN-murk defaults when absent). Gated by /// so it never restyles the menu or ArtStaging. Per-room-biome /// murk variants key on the replicated RunInfo.CurrentBiome (re-meant to depth/water flavors — the old /// meadow/arid/blight palettes died in the LANTERN realignment). /// [WorldSystemFilter(WorldSystemFilterFlags.ClientSimulation)] [UpdateInGroup(typeof(PresentationSystemGroup))] public partial class WorldAtmosphereSystem : SystemBase { Camera _cam; protected override void OnUpdate() { if (!ScenePolicy.IsGameplayScene()) return; if (_cam == null) _cam = Camera.main; if (_cam == null) return; var cfg = WorldAtmosphereConfig.Instance; float boundary = cfg != null ? cfg.BoundaryX : 500f; float half = cfg != null ? Mathf.Max(1f, cfg.BlendHalfWidth) : 80f; // LANTERN murk defaults (match the ArtStaging source-of-truth hues; density is the play-readability knob). Color baseFog = cfg != null ? cfg.BaseFogColor : new Color(0.02f, 0.10f, 0.12f, 1f); float baseDen = cfg != null ? cfg.BaseFogDensity : 0.035f; Color baseAmb = cfg != null ? cfg.BaseAmbientSky : new Color(0.03f, 0.055f, 0.08f, 1f); Color expFog = cfg != null ? cfg.ExpeditionFogColor : new Color(0.015f, 0.075f, 0.10f, 1f); float expDen = cfg != null ? cfg.ExpeditionFogDensity : 0.04f; Color expAmb = cfg != null ? cfg.ExpeditionAmbientSky : new Color(0.02f, 0.045f, 0.07f, 1f); // Per-room murk flavors (cosmetic code consts; all stay inside the deep-sea band — hue shifts are // subtle, value stays dark so dynamic lights keep carrying readability). bool haveRun = SystemAPI.TryGetSingleton(out var runInfo); if (haveRun && runInfo.Lifecycle != ProjectM.Simulation.RunLifecycle.Staging) { switch (runInfo.CurrentBiome) { case ProjectM.Simulation.RoomBiomeId.Meadow: // kelp shallows: a touch greener expFog = new Color(0.02f, 0.10f, 0.09f, 1f); expDen = 0.035f; expAmb = new Color(0.025f, 0.06f, 0.06f, 1f); break; case ProjectM.Simulation.RoomBiomeId.Cavern: // crush-dark trench: colder + denser expFog = new Color(0.01f, 0.05f, 0.08f, 1f); expDen = 0.05f; expAmb = new Color(0.015f, 0.035f, 0.06f, 1f); break; case ProjectM.Simulation.RoomBiomeId.Blight: // gloam bloom: a sick green-violet cast expFog = new Color(0.045f, 0.075f, 0.09f, 1f); expDen = 0.045f; expAmb = new Color(0.045f, 0.05f, 0.075f, 1f); break; // default keeps the config/fallback out-shelf murk above. } } float x = _cam.transform.position.x; float t = Mathf.Clamp01((x - (boundary - half)) / (2f * half)); t = t * t * (3f - 2f * t); // smoothstep RenderSettings.fogColor = Color.Lerp(baseFog, expFog, t); RenderSettings.fogDensity = Mathf.Lerp(baseDen, expDen, t); RenderSettings.ambientSkyColor = Color.Lerp(baseAmb, expAmb, t); } } }