# Fog System — Five Layers + Entity Rendering in Fog — D-059 # Shader-based, knowledge-graph-driven. Covers all five fog states # and the entity types rendered within fogged areas. vars: { color-screen: "#1a1e24" color-panel: "#2a3040" color-text: "#c8d0e0" color-nav: "#c8d8f0" color-stroke: "#333340" } direction: right kg_read: KnowledgeGraph\n(per character — D-041) { shape: cylinder style.fill: ${color-panel} style.stroke: ${color-nav} style.font-color: ${color-text} } fog_layers: Five Fog Layers { style.fill: ${color-screen} style.stroke: ${color-nav} style.font-color: ${color-text} l1: Layer 1 — Clear (vision cone)\nSoft gradient edge 6-8 sim tiles\n(= 3-4 visual tiles per D-066)\nNo hard line · Darkwood approach { style.fill: ${color-panel} style.stroke: ${color-nav} style.font-color: ${color-text} style.bold: true } l2: Layer 2 — Light Fog (peripheral)\nDesaturated 40-50% · brightness -30%\nAnimated Perlin noise (8-10s cycle)\nD-033 entity colors visible but reduced { style.fill: ${color-panel} style.stroke: ${color-stroke} style.font-color: ${color-text} } l3: Layer 3 — Deep Fog (explored)\nNear-monochrome + ~10% zone tint\n(bar=warm dark · hub=cool dark)\nMore pronounced noise (15-20s cycle)\nzone_id from ObserverSnapshot (D-077) { style.fill: ${color-panel} style.stroke: ${color-stroke} style.font-color: ${color-text} } l4: Layer 4 — Unexplored (has maps)\nGeometric wireframe outlines\nInsert data aesthetic { style.fill: ${color-panel} style.stroke: ${color-stroke} style.font-color: ${color-text} } l5: Layer 5 — Unexplored (no maps)\nSolid near-black\nInformation zero { style.fill: ${color-screen} style.stroke: ${color-stroke} style.font-color: ${color-text} } } fog_entities: Entities in Fog { style.fill: ${color-screen} style.stroke: ${color-stroke} style.font-color: ${color-text} sound_ping: Sound Ping\n2-3 concentric expanding rings\n(sonar-style · insert white-blue)\nLoud=3 rings bright · quiet=1 ring faint\nFade over 1.5s { style.fill: ${color-panel} style.stroke: ${color-nav} style.font-color: ${color-text} } recognized: Recognized Entity\nD-033 color glow + silhouette feature\n(e.g. identifying clothing detail)\n0.8s breathing pulse\n+/-0.5 tile position drift { style.fill: ${color-panel} style.stroke: ${color-nav} style.font-color: ${color-text} } unrecognized: Unrecognized Entity\nneutral grey blob\nno silhouette · no identity { style.fill: ${color-panel} style.stroke: ${color-stroke} style.font-color: ${color-text} } } divergence: "Same fog, different information per character\nSmuggler: recognizes dock workers = green icons\nDetective: same entities = grey blobs\n\nFog is not darkness —\nit is the absence of your attention." { shape: page style.fill: ${color-screen} style.stroke: ${color-nav} style.font-color: ${color-text} style.italic: true } perf: Performance Budget\n<1ms/frame total\nVision cone = PointLight2D\nFog = CanvasGroup noise shader (Layer 5)\nSound pings = 0-5 sprites\nEntity ghosts = 0-10 sprites typical { shape: package style.fill: ${color-screen} style.stroke: ${color-stroke} style.font-color: ${color-text} } kg_read -> fog_layers: "determines entity recognition\n(which observer sees which entities)" { style.stroke: ${color-nav} } kg_read -> fog_entities.recognized: "KnowsOf+ → recognized" { style.stroke: ${color-nav} } kg_read -> fog_entities.unrecognized: "Suspects / none → blob" { style.stroke: ${color-stroke} } fog_layers -> fog_entities: "entities rendered within fog state" { style.stroke: ${color-stroke} } fog_layers -> divergence: "same shader, per-character KG" { style.stroke: ${color-nav} style.stroke-dash: 4 } fog_layers -> perf