docs(diagrams): add decision diagrams across all domains
16 d2 diagrams covering architecture (IPC bridge, system tiers, testability, audio bus), data flow (perception, dialogue, eavesdrop pipelines), entity (knowledge graph, NPC generation, dialogue tags), state (simulation tiers, movement stances, knowledge confidence), and UI (HUD layout, interaction flow, fog layers). PNG output for universal viewer compatibility. Removes test SVG from font debugging. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,108 @@
|
||||
# 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
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 766 KiB |
@@ -0,0 +1,146 @@
|
||||
# HUD Layout and Z-Stack — D-049, D-048, D-061, D-076
|
||||
# 8-layer z-stack, insert overlay, dialogue box constraints.
|
||||
# Dual-scale grid context: 64x64px visual tiles (D-066).
|
||||
|
||||
vars: {
|
||||
color-screen: "#1a1e24"
|
||||
color-panel: "#2a3040"
|
||||
color-text: "#c8d0e0"
|
||||
color-nav: "#c8d8f0"
|
||||
color-stroke: "#333340"
|
||||
}
|
||||
|
||||
direction: down
|
||||
|
||||
zstack: Rendering Z-Stack (D-049)\n8 layers — bottom to top {
|
||||
style.fill: ${color-screen}
|
||||
style.stroke: ${color-nav}
|
||||
style.font-color: ${color-text}
|
||||
|
||||
l0: Layer 0 — Floor Tiles\n(zone identity · movement surface) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
l1: Layer 1 — Floor Objects\n(cosmetic · walked over) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
l2: Layer 2 — Furniture / Placed Objects\n(y-sorted with entities) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
l3: Layer 3 — Entity Sprites\n(y-sorted · D-033 relationship color\n24x32px footprint in 64x64 tile) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-nav}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
l4: Layer 4 — Overhead / Wall Tops\n(pipes · ducts · fixtures · signage\nsemi-transparent partial occlusion) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
l5: Layer 5 — Fog of Perception\n(vision cone mask · fog shader\naffects layers 0-4) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-nav}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
l6: Layer 6 — Insert Overlay\n(lattice HUD · bloom-rendered\nNOT affected by fog\nInteraction labels render here) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-nav}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
l7: Layer 7 — Monologue / UI\n(always visible · top of stack\nDialogue box and response options) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-nav}
|
||||
style.font-color: ${color-text}
|
||||
style.bold: true
|
||||
}
|
||||
}
|
||||
|
||||
insert_overlay: Insert Overlay Design (D-048) {
|
||||
style.fill: ${color-screen}
|
||||
style.stroke: ${color-nav}
|
||||
style.font-color: ${color-text}
|
||||
|
||||
bloom: Soft bloom shader\n~2-3px gaussian · ~40% blend {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
smuggler_overlay: Smuggler\nthinner · sparser (baseline lattice) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
detective_overlay: Detective\ndenser · crisper (augmented lattice) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-nav}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
insert_off: Insert OFF behavior (OQ-07)\nCursor shape changes\nInteraction labels hidden {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
style.stroke-dash: 4
|
||||
}
|
||||
}
|
||||
|
||||
dialogue_box: Dialogue Box (D-061, D-076) {
|
||||
style.fill: ${color-screen}
|
||||
style.stroke: ${color-nav}
|
||||
style.font-color: ${color-text}
|
||||
|
||||
position: Bottom of screen\nmax 20% height {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
max_width: Max-width 1200px\n(centered · ~62% of 1920px) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
log: Unified conversation log\n(active + overheard — chronological) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-nav}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
speaker_format: Speaker to Target format\nper-character name colours {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
responses: Response options below log\nmax 3 visible {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
no_portraits: No portraits\n(NPC is on screen) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
timeout: Entry timeout\n15s + 3s fade (configurable) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
}
|
||||
|
||||
monologue_position: Monologue floats ABOVE dialogue box\n(z-layer 7 — spatial separation\ncharacter thinks while NPC speaks) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-nav}
|
||||
style.font-color: ${color-text}
|
||||
style.border-radius: 4
|
||||
}
|
||||
|
||||
zstack.l5 -> insert_overlay: "does NOT affect" {
|
||||
style.stroke: ${color-nav}
|
||||
style.stroke-dash: 4
|
||||
}
|
||||
zstack.l6 -> insert_overlay: "rendered at" { style.stroke: ${color-nav} }
|
||||
zstack.l7 -> dialogue_box: "rendered at" { style.stroke: ${color-nav} }
|
||||
dialogue_box -> monologue_position: "monologue above" { style.stroke: ${color-nav} }
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 678 KiB |
@@ -0,0 +1,153 @@
|
||||
# Interaction UI Flow — D-056, D-057, D-058
|
||||
# Cursor states, entity interaction list, world radial menu.
|
||||
# All insert-styled: geometric, bloom, diegetic.
|
||||
|
||||
vars: {
|
||||
color-screen: "#1a1e24"
|
||||
color-panel: "#2a3040"
|
||||
color-text: "#c8d0e0"
|
||||
color-nav: "#c8d8f0"
|
||||
color-stroke: "#333340"
|
||||
}
|
||||
|
||||
direction: down
|
||||
|
||||
cursor: Cursor States (D-056)\n(insert's own interface element · z-layer 7) {
|
||||
style.fill: ${color-screen}
|
||||
style.stroke: ${color-nav}
|
||||
style.font-color: ${color-text}
|
||||
|
||||
default_cursor: Default\n4 thin inward ticks + bloom\nWhite-blue · barely visible {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
entity_hover: Entity Hover\nTicks expand outward (150ms)\nCorner brackets · D-033 relationship color\nVerb tooltip in insert styling {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-nav}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
object_hover: Object Hover\nTicks rotate 45° → X-shape\nMuted grey (amber if flagged) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
weapon_aim: Weapon Aim\nTicks extend · center gap widens\nLines 1 to 2px · warm white\nNO bloom · D-033 tint on target {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-nav}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
}
|
||||
|
||||
cursor_rules: Cursor Rules {
|
||||
style.fill: ${color-screen}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
|
||||
los_trigger: Changes on LOS · not just proximity {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
range: Interaction range ~2 sim tiles (= 1m) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
weapon_suppress: Weapon mode suppresses interaction prompts\n(unless Shift held) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
insert_off: Insert OFF: cursor shape still changes\n(body reacts) · verb labels hidden\n(insert doesn't process targets) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
style.stroke-dash: 4
|
||||
}
|
||||
}
|
||||
|
||||
entity_list: Entity Interaction List (D-057)\n(left-click on entity) {
|
||||
style.fill: ${color-screen}
|
||||
style.stroke: ${color-nav}
|
||||
style.font-color: ${color-text}
|
||||
|
||||
format: Compact vertical list\nanchored to entity position\n2-4 options max {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
new_glow: New options: gradient glow background\n(knowledge change signal) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-nav}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
z_layer: Labels on z-layer 6\n(insert data — hidden if insert off) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
phase1: Phase 1 (simulation): max verb set\nfrom ObjectType component {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
phase2: Phase 2 (observer): filter by KG\narchetype variation · POI flip {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-nav}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
}
|
||||
|
||||
world_menu: World Radial Menu (D-058)\n(right-click) {
|
||||
style.fill: ${color-screen}
|
||||
style.stroke: ${color-nav}
|
||||
style.font-color: ${color-text}
|
||||
|
||||
v01_spokes: v0.1: 2 spokes\nObserve (eye) · Insert (phone) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-nav}
|
||||
style.font-color: ${color-text}
|
||||
style.bold: true
|
||||
}
|
||||
future_spokes: Future: up to 6 spokes\n+ Comms (signal) · Wait (clock) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
style.stroke-dash: 4
|
||||
}
|
||||
input: Drag-release (power users)\nClick-click (newcomers) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
why_radial: Fixed categories → spatial memory\n(unlike entity verbs which vary by knowledge) {
|
||||
style.fill: ${color-panel}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
}
|
||||
|
||||
cursor.default_cursor -> cursor.entity_hover: "entity in LOS\n+ proximity" {
|
||||
style.stroke: ${color-nav}
|
||||
}
|
||||
cursor.default_cursor -> cursor.object_hover: "object in LOS\n+ proximity" {
|
||||
style.stroke: ${color-stroke}
|
||||
}
|
||||
cursor.entity_hover -> cursor.weapon_aim: "weapon selected" {
|
||||
style.stroke: ${color-nav}
|
||||
}
|
||||
cursor.weapon_aim -> cursor.entity_hover: "weapon deselected" {
|
||||
style.stroke: ${color-stroke}
|
||||
style.stroke-dash: 4
|
||||
}
|
||||
|
||||
cursor.entity_hover -> entity_list: "left-click\n→ shows interaction list" {
|
||||
style.stroke: ${color-nav}
|
||||
}
|
||||
cursor.default_cursor -> world_menu: "right-click\n→ opens radial" {
|
||||
style.stroke: ${color-nav}
|
||||
}
|
||||
|
||||
cursor -> cursor_rules
|
||||
entity_list.phase1 -> entity_list.phase2: "filtered" { style.stroke: ${color-nav} }
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 868 KiB |
Reference in New Issue
Block a user