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,171 @@
|
||||
# Dialogue Pipeline — D-028, D-062, D-063, D-064, D-075
|
||||
# Four relational layers, two-phase verb computation, invisible locks,
|
||||
# confrontation weight, walk-away consequences.
|
||||
|
||||
vars: {
|
||||
color-bg: "#2a3040"
|
||||
color-stroke: "#333340"
|
||||
color-text: "#c8d0e0"
|
||||
color-accent: "#c8d8f0"
|
||||
color-dim: "#1a1e24"
|
||||
}
|
||||
|
||||
direction: down
|
||||
|
||||
player_action: Player Initiates Interaction {
|
||||
shape: oval
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
|
||||
verb_phase1: Phase 1 — Simulation\n(no KnowledgeGraph read) {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
style.border-radius: 4
|
||||
|
||||
object_type: ObjectType component\n→ max possible verb set {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
}
|
||||
|
||||
verb_phase2: Phase 2 — Observer\n(reads KnowledgeGraph) {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
style.border-radius: 4
|
||||
|
||||
kg_filter: Filter by KG confidence\n(Confront requires KnowsDetails+) {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
poi_flip: POI priority flip\n+ contradiction markers {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
archetype_filter: Archetype filter rules\n(same crate: smuggler→Stash · detective→Flag) {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
}
|
||||
|
||||
layer_filter: Four Relational Layers (D-028) {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
|
||||
l1: Layer 1 — Access Tier\n(RelationshipState only) {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
l2: Layer 2 — Relationship History\n(interaction log: greeting + topic) {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
l3: Layer 3 — Trust-gated Gossip\n(RelationshipState AND KnowledgeConfidence — D-075) {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
l4: Layer 4 — Unprompted Disclosure\n(weighted by trust + mood) {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
}
|
||||
|
||||
invisible_locks: Invisible Locked Options (D-062) {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
style.border-radius: 4
|
||||
|
||||
rule: Locked options = completely invisible\nNo grayed-out · no lock icons · no hints {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
reveal: New options appearing on repeat visits\n= the reward (dopamine) {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
}
|
||||
|
||||
confrontation: Confrontation Weight (D-063) {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
style.border-radius: 4
|
||||
|
||||
voice: Written in character's internal voice\n(italicized first-person) {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
monologue_beat: Pre-delivery monologue beat\n1-2s: "No taking it back." {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
world_reacts: World reacts\n(NPC Tier 2 anim · D-033 fade · monologue spikes) {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
}
|
||||
|
||||
walk_away: Walk-away (D-064)\nWASD during conversation {
|
||||
shape: diamond
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
|
||||
walk_away_phases: Walk-away Consequences {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
|
||||
immediate: 1 — Dialogue fades 300ms\n(no close button) {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
npc_reacts: 2 — NPC reacts\n(animation · may call after player) {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
kg_record: 3 — KG records incompleteness\n(per-seed tolerance: no universal safe-to-leave rules) {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
}
|
||||
|
||||
player_action -> verb_phase1
|
||||
verb_phase1 -> verb_phase2: "max verb set" { style.stroke: ${color-accent} }
|
||||
verb_phase2 -> layer_filter: "filtered verb set" { style.stroke: ${color-accent} }
|
||||
layer_filter.l1 -> layer_filter.l2
|
||||
layer_filter.l2 -> layer_filter.l3
|
||||
layer_filter.l3 -> layer_filter.l4
|
||||
layer_filter -> invisible_locks: "visible options only\n(max 3 shown)" {
|
||||
style.stroke: ${color-accent}
|
||||
}
|
||||
invisible_locks -> confrontation: "if Confront option present" {
|
||||
style.stroke: ${color-stroke}
|
||||
style.stroke-dash: 4
|
||||
}
|
||||
invisible_locks -> walk_away
|
||||
walk_away -> walk_away_phases.immediate
|
||||
walk_away_phases.immediate -> walk_away_phases.npc_reacts
|
||||
walk_away_phases.npc_reacts -> walk_away_phases.kg_record
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 856 KiB |
@@ -0,0 +1,162 @@
|
||||
# Eavesdrop Pipeline — D-071, D-072, D-078
|
||||
# Overheard NPC-to-NPC conversation: occlusion filter (server-authoritative),
|
||||
# ListeningFocus boost, passive dialogue panel, dual-channel principle.
|
||||
|
||||
vars: {
|
||||
color-bg: "#2a3040"
|
||||
color-stroke: "#333340"
|
||||
color-text: "#c8d0e0"
|
||||
color-accent: "#c8d8f0"
|
||||
color-dim: "#1a1e24"
|
||||
}
|
||||
|
||||
direction: down
|
||||
|
||||
npc_convo: NPC-to-NPC Conversation\n(authored at full fidelity by copy team) {
|
||||
shape: oval
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
|
||||
murmur: Universal Murmur Asset (D-072)\nsingle asset plays everywhere {
|
||||
shape: package
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
|
||||
zone_ambient: Zone Ambient Level {
|
||||
shape: diamond
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
|
||||
conspicuousness: Conversation Conspicuousness {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
|
||||
bar: Bar (high ambient)\nhidden in murmur, needs proximity {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
workplace: Workplace (moderate)\nsemi-conspicuous, distance-dependent {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
corridor: Corridor (low ambient)\nconspicuous, audible from distance {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
}
|
||||
|
||||
server_occlusion: Server-side Occlusion Filter (D-078)\nper-word probability roll {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
style.border-radius: 4
|
||||
|
||||
factors: Factors: distance · ambient noise\n· ListeningFocus stance {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
stochastic: Stochastic per word\n(same scene can yield different fragments) {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
seeded: Seedable RNG per tick\n→ deterministic replay (D-010) {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
}
|
||||
|
||||
listen_focus: ListeningFocus Boost (D-071)\nWorld SFX +2 to +3dB\nstationary 30+ ticks {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
style.border-radius: 4
|
||||
}
|
||||
|
||||
no_ambient_dip: No Ambient Dip for Eavesdrop\n(opposite of direct conversation dip) {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
style.stroke-dash: 4
|
||||
}
|
||||
|
||||
occluded_text: Pre-occluded text\n(words → "..." per roll) {
|
||||
shape: page
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
|
||||
passive_panel: Passive Dialogue Panel (D-078)\n(D-061 box, read-only) {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
style.border-radius: 4
|
||||
|
||||
speaker_label: Speaker format (e.g. Kael to Mira) {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
reduced_opacity: Reduced opacity (0.9)\nvs active dialogue {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
no_responses: No response options {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
}
|
||||
|
||||
monologue_channel: Monologue Channel\n(D-016 — separate pipeline) {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
|
||||
witness_trigger: witness_interaction trigger\n→ character's reaction {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
separate: Character reaction\n(thought · never quoted speech) {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
}
|
||||
|
||||
kg_entry: KnowledgeGraph entry\n(KnowsOf confidence unless\nListeningFocus + proximity → KnowsDetails) {
|
||||
shape: cylinder
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
|
||||
npc_convo -> murmur: "audio" { style.stroke: ${color-stroke} }
|
||||
npc_convo -> zone_ambient: "text goes through" { style.stroke: ${color-accent} }
|
||||
murmur -> zone_ambient: "conspicuousness shaped by" { style.stroke: ${color-stroke} }
|
||||
zone_ambient -> conspicuousness
|
||||
zone_ambient -> server_occlusion: "noise penalty" { style.stroke: ${color-stroke} }
|
||||
listen_focus -> server_occlusion: "probability curve shift" { style.stroke: ${color-accent} }
|
||||
no_ambient_dip -> listen_focus: "instead of dip" { style.stroke: ${color-stroke}; style.stroke-dash: 4 }
|
||||
server_occlusion -> occluded_text: "pre-occluded text sent to client" { style.stroke: ${color-accent} }
|
||||
occluded_text -> passive_panel: "client renders exactly what it receives" { style.stroke: ${color-accent} }
|
||||
passive_panel -> monologue_channel: "triggers witness_interaction" {
|
||||
style.stroke: ${color-stroke}
|
||||
style.stroke-dash: 4
|
||||
}
|
||||
passive_panel -> kg_entry: "overheard info enters KG" { style.stroke: ${color-accent} }
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 826 KiB |
@@ -0,0 +1,185 @@
|
||||
# Perception Pipeline — D-011, D-017, D-018, D-019, D-059, D-060, D-067
|
||||
# From simulation ECS through to rendered fog and monologue.
|
||||
# Covers: fog of perception, LOS (D-035), perception modes, three-range sound,
|
||||
# fog layers, cognitive delay, recognition chime.
|
||||
|
||||
vars: {
|
||||
color-bg: "#2a3040"
|
||||
color-stroke: "#333340"
|
||||
color-text: "#c8d0e0"
|
||||
color-accent: "#c8d8f0"
|
||||
color-dim: "#1a1e24"
|
||||
}
|
||||
|
||||
direction: down
|
||||
|
||||
world: ECS World State {
|
||||
shape: hexagon
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
|
||||
los: LOS System\n(Albert Ford symmetric shadowcasting — D-035) {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
style.border-radius: 4
|
||||
|
||||
fov: compute_fov(is_opaque, origin, range, z)\n→ VisibilityMap {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
symmetry: Symmetry guarantee:\nif A sees B → B sees A {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
}
|
||||
|
||||
perception_modes: Perception Modes (D-017) {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
|
||||
natural: Natural Vision\n(walls block, cone model) {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
thermal: Thermal\n(heat through walls, no identity) {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
style.stroke-dash: 4
|
||||
}
|
||||
camera: Camera Feeds\n(remote, spoofable) {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
style.stroke-dash: 4
|
||||
}
|
||||
unisphere: Unisphere Tracking\n(known inserts, maskable) {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
style.stroke-dash: 4
|
||||
}
|
||||
audio_analysis: Audio Analysis\n(signatures, no visual) {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
style.stroke-dash: 4
|
||||
}
|
||||
}
|
||||
|
||||
sound: Sound System (D-018)\nThree-Range Model {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
|
||||
close: Close (in/near LOS)\nHigh accuracy · stereo audio {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
medium: Medium (outside LOS)\nVisual indicators at fog edge + monologue {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
long: Long (across map)\nInsert notifications · spoofable {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
style.stroke-dash: 4
|
||||
}
|
||||
}
|
||||
|
||||
snapshot: ObserverSnapshot {
|
||||
shape: queue
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
|
||||
kg_read: KnowledgeGraph read\n(per-character — what THIS observer knows) {
|
||||
shape: cylinder
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
|
||||
fog: Fog Rendering (D-059)\n5-layer shader system {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
|
||||
clear: Clear (vision cone)\nsoft gradient 6-8 sim tiles {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
light_fog: Light Fog (peripheral)\ndesaturated 40-50%, Perlin noise {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
deep_fog: Deep Fog (explored)\nnear-monochrome + zone tint {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
unexplored_maps: Unexplored (has maps)\ngeometric wireframe outlines {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
unexplored_dark: Unexplored (no maps)\nsolid near-black {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
}
|
||||
|
||||
recognition: Fog Entity Recognition {
|
||||
style.fill: ${color-dim}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
|
||||
chime: Recognition chime fires (D-067)\nat ONSET of cognitive delay {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-accent}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
delay: Cognitive delay (D-060)\n0.6s base · 0.3s for anomaly {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
monologue_fire: Monologue fires DURING delay\n"Those footsteps... that's Kael's walk" {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
transition: Grey blob → D-033 color\n+ silhouette over 0.3s {
|
||||
style.fill: ${color-bg}
|
||||
style.stroke: ${color-stroke}
|
||||
style.font-color: ${color-text}
|
||||
}
|
||||
}
|
||||
|
||||
world -> los: "entity positions + opaque tiles" { style.stroke: ${color-accent} }
|
||||
world -> sound: "sound events" { style.stroke: ${color-stroke} }
|
||||
los -> perception_modes: "VisibilityMap" { style.stroke: ${color-accent} }
|
||||
perception_modes -> snapshot: "observer query result\n(what this sensor reveals)" {
|
||||
style.stroke: ${color-accent}
|
||||
}
|
||||
sound -> snapshot: "sound events" { style.stroke: ${color-stroke} }
|
||||
kg_read -> snapshot: "per-entity recognition data" { style.stroke: ${color-accent} }
|
||||
snapshot -> fog: "visible entities + fog state" { style.stroke: ${color-accent} }
|
||||
snapshot -> recognition: "heard/sensed entity not in LOS" { style.stroke: ${color-stroke} }
|
||||
recognition.chime -> recognition.delay: "concurrent" { style.stroke: ${color-accent} }
|
||||
recognition.delay -> recognition.monologue_fire
|
||||
recognition.delay -> recognition.transition
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 912 KiB |
Reference in New Issue
Block a user