Files
settled-reach/docs/design/text-display-hierarchy.md
T
jpmschweitzer 23d9ff0a58 Merge remote-tracking branch 'origin/main' into planning
# Conflicts:
#	CHANGELOG.md
#	content/_meta/README.md
#	content/_meta/npc-authoring-style-guide.md
#	wiki/_templates/cultural-group.md
#	wiki/_templates/institution.md
#	wiki/_templates/star-system.md
#	wiki/characters/devra.md
#	wiki/characters/drin.md
#	wiki/characters/harek.md
#	wiki/characters/lera-sessik.md
#	wiki/characters/maret-korr.md
#	wiki/characters/naia-tamm.md
#	wiki/characters/nils-davan.md
#	wiki/characters/pell.md
#	wiki/characters/renn.md
#	wiki/characters/resha.md
#	wiki/characters/sabel.md
#	wiki/characters/sera-venn.md
#	wiki/characters/torek-lintar.md
#	wiki/characters/voss.md
#	wiki/star-systems/krenn/index.md
2026-03-14 00:24:53 +01:00

260 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: "Text Display Hierarchy"
description: "Visual specification for four text pipelines: dialogue, monologue, observation, and environmental text"
type: design
status: active
ticket: "#316"
decision_refs: [D-016, D-036, D-049, D-061, D-062, D-064, D-076, D-078]
author: "Araminta"
created: 2026-02-20
updated: 2026-02-20
---
# Text Display Hierarchy — Visual Specification
**Version:** v0.1 (Sprint 14)
**Author:** Araminta (Visual Designer)
**Date:** 2026-02-20
**Ticket:** #316
**Status:** Active — extends monologue display spec (#315); constrains client #122 implementation
**Foundation:** [Visual Grammar v0.1](visual-grammar-v01.md) (§5), [Monologue Display Spec](monologue-display-spec.md) (#315)
---
## 1. Overview — Four Content Pipelines
The game has four distinct text channels, each with different visual identity, screen position, z-layer, and content source. They must be immediately distinguishable from each other at a glance — not through decoration but through consistent placement, size, and color rules.
| Pipeline | Source | Screen position | Z-layer | Content register |
|----------|--------|----------------|---------|-----------------|
| **Dialogue** | NPC speech + player response options | Bottom of screen | 7 | External — what is said aloud |
| **Internal monologue** | Player character's inner voice | Lower-left, above dialogue | 7 | Internal — what the character thinks |
| **Observation / overheard** | Perceived NPC speech, passive panel | Bottom of screen, passive mode | 7 | Filtered external — what the player overhears |
| **Environmental text** | Signage, terminals, news tickers | World layer, in-scene | 24 | Diegetic — part of the physical world |
The dialogue and observation pipelines share the same screen container (bottom panel) but in different modes. Internal monologue occupies the lower-left quadrant. Environmental text lives in the world, not in any HUD layer.
---
## 2. Pipeline 1 — Dialogue
### 2.1 Layout
Per D-061 and D-076:
| Property | Value | Notes |
|----------|-------|-------|
| Screen position | Bottom center | Centered horizontally, anchored to bottom edge |
| Max height | 20% of screen height | 216px at 1080p |
| Max width | 640px | Per D-076. Grid-aligned (20 × 32px tile). Centered. |
| Layout direction | NPC speech on top, response options below | Left-aligned within the box |
| Max visible response options | 3 | Locked options invisible — D-062 |
| Portraits | None | NPC is on screen. Portrait is redundant. |
### 2.2 Typography
| Element | Size | Hex | Opacity | Weight |
|---------|------|-----|---------|--------|
| NPC speech | 16px Michroma | `#e8eaf0` | 100% | Regular 400 |
| NPC speaker name | 14px Michroma | D-033 color of NPC | 90% | Regular 400 |
| Player response option | 14px Michroma | `#c0c8d8` | 90% | Regular 400 |
| Confrontation option | 15px Michroma, italic | `#e0e8f0` | 100% | Regular 400 |
**Speaker name treatment:** The NPC's name renders in their current D-033 relationship color — teal, green, amber, or red. This is the one place where the D-033 color system bleeds into the text layer and it is intentional: the player sees "Kael" in green and "Sera" in amber and reads that immediately.
**Confrontation options** are italicized and 1px larger than standard response options. They express the character's internal voice speaking aloud — they should feel heavier than regular dialogue choices. No bold. Italic alone signals the weight.
### 2.3 Box Framing
The dialogue box has minimal framing — not a heavy panel, not floating text:
- Thin 1px border at `#333340` (standard outline color) at 60% opacity
- Background: `#0e1218` at 75% opacity (matches Terminal zone ambient, cool neutral dark)
- No rounded corners — geometric, insert-styled
- Box is full max-width (640px) even when content is shorter — consistent spatial expectation
### 2.4 Passive Mode (Overheard Conversation — D-078)
When the player is overhearing an NPC-to-NPC conversation, the same box renders in **passive mode**:
- No response options rendered
- Header row: `[NPC_A] → [NPC_B]` in their respective D-033 colors, at 13px, 70% opacity
- Overheard speech line at 16px, but at 70% opacity (vs 100% for direct dialogue)
- 1px border at `#333340` at **40% opacity** (dimmed vs interactive 60%) — visual signal that this is passive
- Occluded words rendered as `...` in `#555566` (fog blob grey) — the player sees the gap
Walking out of earshot dismisses the panel naturally (no close button, same as direct dialogue).
### 2.5 Walk-Away Fade
When the player walks away (WASD during dialogue), the dialogue box fades over **300ms** (D-064). No close button. No "dismiss" verb. Walking away is the action.
---
## 3. Pipeline 2 — Internal Monologue
Per the full specification in [Monologue Display Spec](monologue-display-spec.md) (#315). This section summarizes the key positioning rules for hierarchy legibility.
### 3.1 Position Summary
| Property | Value |
|----------|-------|
| Horizontal anchor | Left edge + 5% screen width margin |
| Vertical anchor | 25% from screen bottom (above dialogue box + 5% gap) |
| Max text width | 50% screen width (960px at 1920px) |
| Z-layer | 7 |
| Font | 13px Michroma |
| Stack direction | Bottom-up (newest line at bottom) |
| Max visible lines | 3 |
### 3.2 Relationship to Dialogue Box
Monologue floats **above** the dialogue box, always. When dialogue is inactive, monologue remains anchored at 25% from bottom — it does not slide down into the vacated space. Consistent lower-left positioning trains the player to read the lower-left as inner thought.
### 3.3 Character Colors
| Character | Standard | Urgent |
|-----------|----------|--------|
| Detective | `#d0d4e0` at 85% | `#e0e8f8` at 100% |
| Smuggler | `#d8d0c4` at 85% | `#f0e4d4` at 100% |
Full fade/timing specification is in the Monologue Display Spec. These values are restated here for hierarchy reference only.
---
## 4. Pipeline 3 — Observation / Overheard
The observation pipeline has two sub-modes:
**Overheard NPC-to-NPC conversation:** Rendered in the passive dialogue panel (see §2.4). Same screen container, different visual mode (dimmed border, no response options, header speaker attribution, stochastic word-drop via `...`).
**Non-conversation observation text:** When the player perceives something worth narrating — an NPC's behavior, environmental detail, non-verbal event — this routes through the **internal monologue system** via the `observe_npc`, `observe_anomaly`, or `witness_interaction` triggers. These render as standard monologue lines (§3) per the Monologue Display Spec. They are NOT a separate visual element.
**Design note:** Observation and monologue share the same rendering pipeline because from the character's POV, observation IS internal monologue. The character notices something → the character thinks about it → the same text appears in the same position. The authoring side distinguishes them via trigger type; the rendering side does not.
---
## 5. Pipeline 4 — Environmental Text
Environmental text is part of the **world layer**, not the HUD. It renders as if physically present in the scene — on surfaces, above terminals, in scrolling tickers.
### 5.1 Z-Layer Assignment
| Sub-type | Z-layer | Notes |
|----------|---------|-------|
| Floor signage (painted markings) | 01 | On the floor, walked over |
| Wall signage | 2 (with furniture/objects) | On object layer, y-sorted |
| Terminal ambient display | 4 (overhead layer) | Above entities. Semi-transparent. |
| News ticker | 4 (overhead layer) | Same as terminal ambient |
Environmental text is in the world, not in the HUD layers (67). It **must not occlude entities**: anything on z-layer 4 renders at semi-transparent (~70% opacity per the overhead occlusion rule, D-049 §4.4). If an entity passes behind a sign, the sign's opacity means the entity remains partially visible.
### 5.2 Typography
All environmental text uses **Michroma** — no exceptions. The fiction is that all text is mediated through the character's neural insert perception layer. Even handwritten signs are rendered in Michroma at appropriate size/opacity.
| Sub-type | Size | Hex | Opacity | Notes |
|----------|------|-----|---------|-------|
| Zone signage (short) | 11px | `#8899aa` | 70% | 13 words, spatial label |
| Terminal ambient ID | 11px | `#8899aa` | 60% | Equipment identifier, visible at range |
| Terminal active (readable) | 13px | `#a8b8c8` | 85% | When player is adjacent and interacts |
| News ticker | 10px | `#8899aa` | 55% | Scrolling. Ambient, not blocking. |
| Informal signage | 11px | `#9aa890` | 65% | Slightly warmer/greener hue for social zones |
The environmental text color range (`#8899aa` to `#9aa890`) sits clearly below entity saturation — muted blue-greys and grey-greens. They are legible without competing with entities.
### 5.3 Two-State Terminals
Terminals have two visual states:
**Ambient state (player at range):**
- Terminal displays an ambient identifier — short text, equipment type or designation
- 11px Michroma at `#8899aa`, 60% opacity
- Rendered on z-layer 4 (overhead) above the terminal sprite
- Visible from up to ~4 visual tiles (sufficient to plan approach)
**Active state (player adjacent, Observe/Interact verb triggered):**
- Full terminal text readable
- 13px Michroma at `#a8b8c8`, 85% opacity
- Displayed in a small floating text block anchored above the terminal sprite
- Max width: 200px. Text wraps. Capped at ~12 lines of content.
- Same z-layer 4, but increased opacity signals active state
- Dismissed when player moves away (same as dialogue walk-away — no close button)
### 5.4 Bilingual Treatment (D-036)
Van Maanen's Star has two linguistic registers:
**Concordat Standard** — the colonial lingua franca. Neutral, bureaucratic, formal. Written in normal Michroma weight.
**Van Maanen's Star vernacular** — the local dialect. Compact, consonant-heavy, social. Rendered in the same Michroma but at slightly lower opacity (60% vs 70%) and, when design calls for it, in the informal signage color (`#9aa890` greener hue). This subtle warmth distinguishes the local voice from the colonial layer.
| Context | Language | Color | Opacity |
|---------|----------|-------|---------|
| Formal facility signage | Concordat Standard | `#8899aa` | 70% |
| Equipment identifiers | Concordat Standard | `#8899aa` | 60% |
| Social zone informal signs | Van Maanen's Star vernacular | `#9aa890` | 65% |
| Bar menu, worker notices | Van Maanen's Star vernacular | `#9aa890` | 65% |
| Mixed audience (official but social) | Concordat Standard primary, Van Maanen's Star secondary at 50% opacity | Both | Stacked, smaller |
| News ticker | Concordat Standard | `#8899aa` | 55% |
**Where both languages appear together:** Formal signage targeting mixed audiences renders the primary language at standard opacity, with a smaller Van Maanen's Star vernacular translation at 50% opacity below it. The two-layer approach communicates the bilingual reality of the district without requiring two UI elements — it is one sign with two registers.
### 5.5 News Tickers
News tickers are ambient environmental text elements attached to specific terminal or screen fixtures in the scene. They are **not** HUD overlays.
| Property | Value |
|----------|-------|
| Position | Anchored above the emitting fixture sprite |
| Z-layer | 4 |
| Width | Width of the fixture sprite (typically 64128px) |
| Font size | 10px Michroma |
| Color | `#8899aa` at 55% opacity |
| Scroll behavior | Right-to-left. Speed: ~30px/second. Loops. |
| Pause on player proximity | When player within 2 visual tiles, scroll pauses. |
| Language | Concordat Standard |
News tickers are ambient information — not intended to be read at a glance. The player has to choose to stand near one to catch the scrolling text. This is intentional: news is environmental texture, not tutorial.
---
## 6. Hierarchy Clarity Rules
These are the rules that keep the four pipelines visually distinct without active management:
1. **Position is identity.** Lower-left = inner thought. Bottom center = speech (active or overheard). In-world = physical reality. Players learn this in 510 minutes and stop reading position consciously.
2. **Opacity descends from HUD to world.** HUD text (monologue, dialogue): 85100%. Environmental text: 5585%. The world is legible but subordinate to what the character is actively processing.
3. **Size descends from speech to environment.** Dialogue speech: 16px. Monologue: 13px. Environmental text: 1013px. The most important active channel is always the largest.
4. **Color temperature signals register.** Cool grey-blue (`#c0c8d8` and variants) = system/HUD/player-facing. Warm cream variants = character voice (smuggler). Muted blue-grey (`#8899aa`) = world/environment.
5. **D-033 colors in text only for speaker names.** NPC name in dialogue rendered in their relationship color. No other text element uses D-033 colors — those are reserved for entity sprites.
---
## Appendix A — Decision Cross-References
| Decision | Relevance |
|----------|-----------|
| D-016 | Internal monologue as core perception system. Source for monologue pipeline. |
| D-036 | Sova Transit District + Van Maanen's Star vernacular. Bilingual treatment basis (§5.4). |
| D-049 | Z-level rendering stack. Z-layer assignments for all four pipelines. |
| D-061 | Dialogue box layout. Source for §2. |
| D-062 | Invisible locked dialogue — no locked options visible. |
| D-064 | Walk-away — 300ms dialogue fade, WASD dismissal. |
| D-076 | Dialogue max-width = 640px. |
| D-078 | Overheard NPC conversation — passive dialogue panel with occlusion filter. |
## Appendix B — Quick Reference for Stig
| Pipeline | Position | Z-layer | Font size | Primary hex |
|----------|----------|---------|-----------|------------|
| Dialogue — NPC | Bottom center, 640px wide | 7 | 16px | `#e8eaf0` |
| Dialogue — player response | Bottom center, below NPC | 7 | 14px | `#c0c8d8` |
| Dialogue — passive header | Bottom center, header row | 7 | 13px | D-033 colors |
| Monologue — standard | Lower-left, 25% from bottom | 7 | 13px | Per character |
| Environmental — signage | World / object layer | 24 | 11px | `#8899aa` |
| Environmental — terminal active | World / overhead layer | 4 | 13px | `#a8b8c8` |
| Environmental — news ticker | World / overhead layer | 4 | 10px | `#8899aa` |