Resolves the rimlike docs audit. Decisions made this session: - Map: 40² → 80² for MVP slice; architecture sized to ~120² ceiling. Pawn count unchanged (3 start / 6 cap) — 'split-the-difference' sizing rather than frontier-feel scale. - World-view camera (locked): pinch + drag-pan + double-tap-centre. Storyteller alerts include 'Go there' tap. No minimap, no follow-cam in MVP. New ui.md section captures this. - Storyteller cooldowns: per-event AND per-category — both gates must pass. Resolves design.md/architecture.md disagreement. - MAX_STACKS_PER_THOUGHT = 5 (was named-but-unset). - Hauling no-destination fallback: drop after 3 retry passes, surface a passive 'No stockpile accepts X' alert. - Container all-neighbors-blocked: hold then drop after ~5 sim s to avoid deadlock. - Auto-roof big-room UX: emits room_too_large signal when BFS hits the ≤8-cell cap; UI surfaces a 'split with an interior wall' banner. Threshold + exact wording added to memory.md TODOs. Doc rot cleaned in design.md and architecture.md: removed the stale '8 work categories' intermediate sections (canonical 9-list lives later in each file). Updated architecture.md perf claims for the new map size. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
643 lines
32 KiB
Markdown
643 lines
32 KiB
Markdown
# rimlike — touch UI
|
||
|
||
> Companion to [`memory.md`](../memory.md). This file is the **touch UI** design: gestures, layout philosophy, screen mockups. Engine-side implementation lives in [`architecture.md`](./architecture.md); game mechanics in [`design.md`](./design.md).
|
||
|
||
## UX philosophy (locked)
|
||
|
||
- **Bottom-sheet menus** replace Rimworld's right-side panels. Thumbs reach the bottom of a phone screen.
|
||
- **Long-press** = inspect / context menu (the right-click replacement).
|
||
- **Tap world** = select tile / pawn / item.
|
||
- **Pawn list panel** along one edge — tap a portrait to focus the camera and act on that pawn directly.
|
||
- **Build menu** = bottom drawer with tabs (Furniture / Walls / Floors / Production / …); designation paint mode for placing.
|
||
- **Speed/pause** controls fixed at top; large, finger-sized.
|
||
- **Default cadence is fast + auto-pause** (see [`architecture.md`](./architecture.md) Time / tick model). The UI should reflect this — no element should require careful fine-targeting at 1× speed.
|
||
|
||
## Work priority UI
|
||
|
||
THE macro-management surface for this genre — Rimworld and Going Medieval players spend significant time here. Touch translation matters.
|
||
|
||
### Three views, same backing data
|
||
|
||
#### View A — Matrix (default)
|
||
|
||
Spreadsheet pawn × work, horizontally scrollable, sticky pawn-name column. Cells show priority with colored background. Tap to cycle (4→3→2→1→Off→4); long-press for 5-chip direct picker. Swipe a column = bulk-set everyone to the same priority for that job. Each pawn row shows primary skill under name. Sort by name / total skill / single-job skill. Pinch to zoom.
|
||
|
||
```
|
||
┌──────────────────────────────────────────────────┐
|
||
│ Priorities Sort: skill ▼ Auto ⓘ │
|
||
├──────────────────────────────────────────────────┤
|
||
│ │Cnstr│Mine │Cook │ Doc │Plant│Haul │ │
|
||
│ Bob 🔧8 │ 🟠2 │ 🔵4 │ 🔴1 │ 🟡3 │ 🟡3 │ 🔵4 │ │
|
||
│ Mira ⚕12 │ 🟡3 │ 🟡3 │ 🔵4 │ 🔴1 │ 🟠2 │ 🟡3 │ │
|
||
│ Tom ⛏9 │ 🔵4 │ 🔴1 │ 🟡3 │ 🔵4 │ 🟡3 │ 🟠2 │ │
|
||
└──────────────────────────────────────────────────┘
|
||
```
|
||
|
||
#### View B — Per-pawn (tap a pawn row)
|
||
|
||
Skills bars + full priority list as a vertical, finger-friendly list. Easy to plan one pawn's role.
|
||
|
||
```
|
||
┌──────────────────────────────────┐
|
||
│ ← Bob │
|
||
│ "Carpenter from Eastvale, 27" │
|
||
├──────────────────────────────────┤
|
||
│ Skills │
|
||
│ Construction ████████░░ 8/10 │
|
||
│ Cooking ██████░░░░ 6/10 │
|
||
│ Combat ████░░░░░░ 4/10 │
|
||
│ Medicine ███░░░░░░░ 3/10 │
|
||
│ Mining ██░░░░░░░░ 2/10 │
|
||
├──────────────────────────────────┤
|
||
│ Job priorities │
|
||
│ 🔴 Construction [ 2 ] │
|
||
│ 🟠 Cooking [ 1 ] │
|
||
│ 🟡 Medicine [ 3 ] │
|
||
│ 🟡 Plant [ 3 ] │
|
||
│ 🔵 Hauling [ 4 ] │
|
||
│ 🔵 Mining [ 4 ] │
|
||
│ ⚫ Doctor [ Off ] │
|
||
│ │
|
||
│ [ Auto-assign from skills ] │
|
||
└──────────────────────────────────┘
|
||
```
|
||
|
||
#### View C — Per-job (tap a column header)
|
||
|
||
Pawns sorted by skill in that job, descending. Surfaces "best cook is set to lowest" insights — genre-specific gold; saves players from a Rimworld trap.
|
||
|
||
```
|
||
┌──────────────────────────────────┐
|
||
│ ← Cooking │
|
||
├──────────────────────────────────┤
|
||
│ Mira ⚕12 Cook ████████░░ 9│ 4 │
|
||
│ Bob 🔧8 Cook ██████░░░░ 6│ 1 │
|
||
│ Tom ⛏9 Cook ███░░░░░░░ 3│ 3 │
|
||
│ │
|
||
│ ⚠ Mira is best but set to 4. │
|
||
│ [ Promote Mira to 1 ] │
|
||
└──────────────────────────────────┘
|
||
```
|
||
|
||
### Smart defaults & QoL
|
||
|
||
- **New-pawn auto-assign:** highest skill → 2, second skill → 3, others 3 / 4 / Off based on skill level. Player commits the "1" themselves.
|
||
- **Templates:** save a configuration ("Cook role") and apply with one tap. Useful for new arrivals.
|
||
- **Bulk ops:** long-press column header → "Disable for everyone" / "Reset"; long-press row → "Pause this pawn" (everything Off).
|
||
- **Contextual nudges in View C:** "⚠ best cook is set to 4 — promote?" Cheap and high-value.
|
||
- **Schedule integration** (different priorities for morning/night) — post-MVP.
|
||
|
||
### Edge cases worth surfacing in UI
|
||
|
||
- A pawn with Doctor=Off **won't** treat a bleeding colonist. Warn in View C: "no one is set to Doctor; emergencies will be ignored."
|
||
- Forced jobs (Layer 5 of pawn AI) bypass priorities entirely — the grid is autonomous behavior only.
|
||
- Low-skill assignments to risky jobs (Doctor with Medicine 0) → soft warning at chip-pick time, not a block.
|
||
|
||
## Stockpile zone UI
|
||
|
||
For mechanics (categories, priorities, stack rules) see [`design.md`](./design.md); for data + hauling AI see [`architecture.md`](./architecture.md). This section is the screens.
|
||
|
||
### Designation flow (creating a zone)
|
||
|
||
1. Player taps **Zones** (top-level button, peer to Build).
|
||
2. Bottom sheet shows existing zones list + **+ New Stockpile**.
|
||
3. Tap + → designation paint mode; finger-drag rectangles or freeform cells. (Rectangles for MVP unless freeform is requested.)
|
||
4. Confirm tray slides up:
|
||
|
||
```
|
||
┌────────────────────────────────────────┐
|
||
│ New stockpile · 12 tiles │
|
||
│ Filter: [✓ all 7 categories] │
|
||
│ Priority: [ Normal ▼ ] │
|
||
│ Name: "Stockpile #3" │
|
||
│ [ Cancel ] [ Create ] │
|
||
└────────────────────────────────────────┘
|
||
```
|
||
|
||
5. After creation, the zone is editable via tap-zone-tile.
|
||
|
||
### Editing an existing zone
|
||
|
||
Tap any zone tile → bottom sheet:
|
||
|
||
```
|
||
┌────────────────────────────────────────┐
|
||
│ ← Kitchen Stockpile │
|
||
│ 12 tiles · Priority: Preferred ▼ │
|
||
├────────────────────────────────────────┤
|
||
│ Accepts (4×4 chip grid) │
|
||
│ [✓🪵Wd] [✗🪨St] [✗⚙Ir] [✗🟤Cu] │
|
||
│ [✗⚪Ag] [✗🟡Au] [✗🧵Cl] [✓🥕Veg] │
|
||
│ [✗🍖Mt] [✓🌾Gr] [✓🍞Ck] [✗💊Md] │
|
||
│ [✗⚒Tl] [✗⚔Wp] [✗🛡Ar] [✗⚰Co] │
|
||
├────────────────────────────────────────┤
|
||
│ Contains │
|
||
│ 🌾 Wheat ×18 (1 stack) │
|
||
│ 🥕 Carrot ×8 (1 stack) │
|
||
│ 🍞 Bread ×5 (1 stack) │
|
||
│ Empty: 9 tiles │
|
||
├────────────────────────────────────────┤
|
||
│ [ Resize ] [ Delete ] [ Priority ] │
|
||
└────────────────────────────────────────┘
|
||
```
|
||
|
||
**Filter grid (16 chips, 4×4):** tap any chip to toggle. Top-row long-press → "category-only mode" (toggle off everything except the row's column).
|
||
|
||
**Priority picker (5-chip):** tap the priority dropdown → row of 5 chips (Critical / Important / Preferred / Normal / Low) with color coding (🔴🟠🟡⬜🔵).
|
||
|
||
### Container inspect screen
|
||
|
||
Tap any Crate entity in the world → bottom sheet:
|
||
|
||
```
|
||
┌────────────────────────────────────────┐
|
||
│ ← Crate │
|
||
│ 2/4 stacks · Priority: Normal ▼ │
|
||
├────────────────────────────────────────┤
|
||
│ Accepts (same 4×4 chip grid) │
|
||
│ [✓🪵Wd] [✗🪨St] [✗⚙Ir] [✗🟤Cu] │
|
||
│ [✗⚪Ag] [✗🟡Au] [✗🧵Cl] [✓🥕Veg] │
|
||
│ [✗🍖Mt] [✗🌾Gr] [✗🍞Ck] [✗💊Md] │
|
||
│ [✗⚒Tl] [✗⚔Wp] [✗🛡Ar] [✗⚰Co] │
|
||
├────────────────────────────────────────┤
|
||
│ Contains │
|
||
│ 🪵 Wood log ×42 (1 stack) │
|
||
│ 🥕 Carrot ×18 (1 stack) │
|
||
│ Empty: 2 stack slots │
|
||
├────────────────────────────────────────┤
|
||
│ [ Empty ] [ Demolish ] │
|
||
└────────────────────────────────────────┘
|
||
```
|
||
|
||
Same filter and priority controls as zones — players can transfer mental model. "Empty" drops contents as loose items at neighbor cells; "Demolish" deconstructs (partial material refund).
|
||
|
||
### Zone overlay rendering
|
||
|
||
Zones are a transparent colored overlay rendered **only** when the Zones panel is open. Color-coded by priority:
|
||
|
||
- 🔴 Critical — strong red tint
|
||
- 🟠 Important — warm orange
|
||
- 🟡 Preferred — amber
|
||
- ⬜ Normal — neutral / faint
|
||
- 🔵 Low — cool blue
|
||
|
||
Outside the Zones panel, the world view shows item stacks and crate sprites but not zone boundaries (less visual clutter).
|
||
|
||
### Smart defaults & nudges
|
||
|
||
- **New zone defaults:** filter on for everything, priority Normal.
|
||
- **"Suggest filter from contents"** — if 80% of items in a zone match one category, suggest enabling only that.
|
||
- **Auto-categorize hint on first drop** — when a pawn drops the first wood log into a new zone, prompt: "Make this a Wood-only stockpile?"
|
||
- **Items-not-being-hauled warning** — if items sit outside any zone for > 2 in-game days, show a soft alert: "Lots of wood waiting outside — make a stockpile?"
|
||
|
||
### Forbid / allow
|
||
|
||
Long-press an item in the world → context menu → "Forbid hauling" / "Allow hauling." Forbidden items get a red 🚫 badge. Hauling pawns ignore them.
|
||
|
||
### Per-tile inspection
|
||
|
||
Tap a non-zone tile holding an item → inspect tray ("3× Wood log · Loose · Will be hauled by next idle pawn"). Tap a zone tile → zone editing tray (above) plus "tile contents."
|
||
|
||
### Edge cases worth surfacing in UI
|
||
|
||
- **Zone overlap** — paint mode shows red overlay where cells already belong to another zone; can't confirm until resolved.
|
||
- **No accepting zone** — if an item's category isn't accepted anywhere, surface a soft warning ("Cooked meals piling up — no kitchen stockpile yet").
|
||
- **Full zone** — the Contains list shows "Full · X tiles" so the player notices.
|
||
|
||
## Mood, lighting, rooms, beauty, quality, cleaning — UX
|
||
|
||
Most of these surfaces are passive (visualization in-world). For mechanics see [`design.md`](./design.md); algorithms in [`architecture.md`](./architecture.md).
|
||
|
||
### Mood visualization
|
||
|
||
- **Pawn portrait** in the pawn list shows a small mood-band emoji: 🙂 Content / 😐 Stressed / 😟 Breaking. Tap → pawn detail.
|
||
- **Pawn detail screen** shows the mood bar (0–100) with color zones, plus a list of active thoughts:
|
||
```
|
||
Mood: ████████░░░░░░░░ 38/100 [Stressed]
|
||
Thoughts:
|
||
+5 Slept well, indoors (next sleep)
|
||
+3 Beautiful room (persistent)
|
||
−5 Hungry (persistent)
|
||
−3 Saw corpse ×2 (decays 7h)
|
||
−10 Witnessed death (decays 38h)
|
||
```
|
||
- **Soft break alert** — when a pawn enters a break, a top-screen alert: "Bob is sulking. Address his needs." Camera pans to him on tap.
|
||
|
||
### Lighting visualization
|
||
|
||
At night, world renders with a darkness shader. Lit tiles inside torch/hearth/candle radii brighten back toward normal color. Player physically sees safe lit zones vs scary dark. Daytime renders normally regardless of lighting.
|
||
|
||
Light sources are visible as glowing tile sprites. Hearth has flicker animation.
|
||
|
||
### Room labels
|
||
|
||
When the **Rooms** panel is opened (a top-level toggle), each detected room gets a floating label:
|
||
|
||
```
|
||
╔═══════════╗
|
||
║ Bedroom ║
|
||
║ Bob ║
|
||
║ Beauty: 4 ║
|
||
╚═══════════╝
|
||
Beautiful
|
||
```
|
||
|
||
Labels show: inferred type, owner(s) if any, beauty score, dirtiness if > 30. Outside the Rooms panel: labels hidden, just the indoor tint.
|
||
|
||
### Beauty indicator on rooms
|
||
|
||
In the Rooms panel, room overlay tints by beauty: green-tint for Beautiful, neutral for Plain, brown-tint for Ugly. Player reads the colony quality at a glance.
|
||
|
||
### Quality color-coding
|
||
|
||
Item names everywhere display with quality color:
|
||
```
|
||
Wooden chair (Normal — white)
|
||
Excellent wooden chair (green)
|
||
Masterwork iron sword (blue)
|
||
Legendary oak throne (purple)
|
||
```
|
||
Quality icon prepended to item name in stockpile lists, pawn equipment, container contents.
|
||
|
||
### Dirtiness visualization
|
||
|
||
Dirty tiles render with a subtle brown overlay tint (dirtier = darker). Blood spots, spilled food show as decals on top of the floor. Cleaning Job in progress: a small "sweeping" animation on the pawn.
|
||
|
||
### Cleaning in the work-priority matrix
|
||
|
||
Cleaning becomes column 8 in the priority matrix (and the per-pawn / per-job views). Otherwise no UI change — slots into the existing system.
|
||
|
||
## Workbench bill queue UI
|
||
|
||
For mechanics and bill modes, see [`design.md`](./design.md); for data structures see [`architecture.md`](./architecture.md). This section is screens.
|
||
|
||
### Workbench inspect
|
||
|
||
Tap any workbench → bottom sheet:
|
||
|
||
```
|
||
┌──────────────────────────────────────┐
|
||
│ ← Smithy │
|
||
│ Bob is working · 2/3 active │
|
||
├──────────────────────────────────────┤
|
||
│ Bills (drag to reorder) │
|
||
│ 1. ▶ Iron sword × 3 │
|
||
│ 2. Iron axe — until 5 in storage │
|
||
│ 3. Iron helmet × 1 ⏸ paused │
|
||
│ 4. Masterwork sword (skill ≥ 8) │
|
||
│ │
|
||
│ [ + Add Bill ] │
|
||
├──────────────────────────────────────┤
|
||
│ Output drop: → 1 tile │
|
||
│ [ Demolish ] │
|
||
└──────────────────────────────────────┘
|
||
```
|
||
|
||
Each row shows: recipe name, mode (count / until-N / forever), ingredient or skill filters if set, paused state. Long-press a bill → Edit / Pause / Remove. Drag reorder (top = highest priority).
|
||
|
||
### Add Bill flow
|
||
|
||
1. Tap **+ Add Bill** → recipe picker (categorized: Tools / Weapons / Armor / Furniture / Food / etc.).
|
||
2. Tap a recipe → bill config:
|
||
|
||
```
|
||
┌──────────────────────────────────────┐
|
||
│ ← Add Bill: Iron Sword │
|
||
│ Inputs: 4 Iron ingot, 1 Wood │
|
||
│ Skill: Crafting │
|
||
├──────────────────────────────────────┤
|
||
│ Mode: │
|
||
│ ◯ Do count: [ 1 ] │
|
||
│ ◯ Forever │
|
||
│ ◉ Until in storage: [ 5 ] │
|
||
├──────────────────────────────────────┤
|
||
│ Filters (optional): │
|
||
│ Ingredient quality min: [ Normal ▼ ] │
|
||
│ Pawn skill min: [ 0 ] │
|
||
├──────────────────────────────────────┤
|
||
│ [ Cancel ] [ Add ] │
|
||
└──────────────────────────────────────┘
|
||
```
|
||
|
||
3. Tap Add → bill enters the queue at the bottom; drag to reorder.
|
||
|
||
### Active-bill indicator
|
||
|
||
A workbench in the world view shows a small icon when bills are active and a pawn is or could be working it (a hammer for Smithy, a cooking pot for hearth, etc.). Smoke / sparks particle when actively in use.
|
||
|
||
### Recipe picker organization
|
||
|
||
Recipes live in categorized lists: by output category, then by required skill threshold. A Masterwork-attempting bill (skill ≥ 8) shows a faint star icon — visual signal of "this is power-user content."
|
||
|
||
### Crafting in the work-priority matrix
|
||
|
||
Crafting is column 5 (between Cleaning and Cooking) in the priority matrix — 9 columns total. Same tap-to-cycle and long-press picker as the others.
|
||
|
||
## Combat UX
|
||
|
||
For mechanics, weapons, armor, and AI, see [`design.md`](./design.md). This section is screens + visualization.
|
||
|
||
### Auto-pause on threat
|
||
|
||
When a wolf is detected approaching the colony, time auto-pauses and a banner appears:
|
||
|
||
```
|
||
⚠ Threat: Wolves approaching from the east (3 of them)
|
||
[ Continue ] [ Pause ]
|
||
```
|
||
|
||
Camera pans to show the threat. Player adjusts orders, then resumes.
|
||
|
||
### Forced commands
|
||
|
||
Tap a pawn → bottom sheet → action menu:
|
||
|
||
```
|
||
┌──────────────────────────────────┐
|
||
│ ← Bob (Combat 7, Sword) │
|
||
├──────────────────────────────────┤
|
||
│ • Move here [tap world] │
|
||
│ • Attack target [tap enemy] │
|
||
│ • Carry to bed [tap downed] │
|
||
│ • Drop weapon │
|
||
│ • Pause work (sit) │
|
||
└──────────────────────────────────┘
|
||
```
|
||
|
||
Forced jobs run at Layer 5 (player override) of the AI. Combat=Off pawns refuse Attack target.
|
||
|
||
### Equipment in pawn detail
|
||
|
||
Pawn detail screen adds an Equipment panel:
|
||
|
||
```
|
||
┌──────────────────────────────────┐
|
||
│ Equipment │
|
||
│ Weapon: ⚔ Iron sword (Excellent) │
|
||
│ Helmet: 🪖 Iron helm (Normal) │
|
||
│ Cuirass: 🛡 Iron cuirass (Excel.) │
|
||
│ Boots: 👢 Iron boots (Shoddy) │
|
||
│ │
|
||
│ Total armor: 14 Total dmg: 10 │
|
||
└──────────────────────────────────┘
|
||
```
|
||
|
||
Tap a slot → swap from inventory; long-press item → "Lock to Bob" (override auto-equip).
|
||
|
||
### Combat readability — visual cues
|
||
|
||
- Pawn currently engaged in combat: red outline pulse
|
||
- Hit on target: damage number floats up briefly
|
||
- Miss: small "miss" puff
|
||
- Bleeding pawn: red drip particle
|
||
- Downed pawn: lying-down sprite, red "!" icon above
|
||
|
||
### Downed alerts
|
||
|
||
When a pawn enters Downed status, top-screen alert (auto-pause):
|
||
|
||
```
|
||
⚠ Mira is down. Bleeding out in 6 hours.
|
||
[ Continue ]
|
||
```
|
||
|
||
Camera pans. The Doctor priority system kicks in automatically; player can manually issue Carry-to-bed via forced command if they want a specific bed.
|
||
|
||
### Cover indicator
|
||
|
||
When a pawn is selected and threats exist, tiles providing cover near the pawn light up briefly. Helps the player position pawns tactically without reading wiki pages.
|
||
|
||
## Death, burial, ghost state UX
|
||
|
||
### Pawn death event
|
||
|
||
When a pawn dies, top-screen modal alert (auto-pause):
|
||
|
||
```
|
||
┌────────────────────────────────────┐
|
||
│ ✟ Bob the Carpenter has died. │
|
||
│ Killed by wolf, day 27 of Spring │
|
||
│ │
|
||
│ The colony mourns. │
|
||
│ [ Continue ] [ View record ] │
|
||
└────────────────────────────────────┘
|
||
```
|
||
|
||
"View record" opens the pawn-detail screen for the deceased.
|
||
|
||
### Pawn-detail for deceased
|
||
|
||
Same screen as living pawns, with a black band at the top reading "Deceased — Day X." Skills shown as final values; equipment as final equipped items; cause of death prominent.
|
||
|
||
Accessed from: tap a corpse, tap a grave marker, alert "View record" link, or via a colony memorial list (post-MVP feature).
|
||
|
||
### Graveyard zone
|
||
|
||
Designate via Zones → New Stockpile → enable only the **Corpses** chip. The zone is automatically labeled "Graveyard" if it contains only corpses or grave markers. Beauty calculation includes graves' +1 each.
|
||
|
||
### Cremation pyre — bill queue
|
||
|
||
Tap the pyre → bill-queue screen (same UI as other workbenches):
|
||
|
||
```
|
||
┌─────────────────────────────────────┐
|
||
│ ← Pyre │
|
||
│ No active worker │
|
||
├─────────────────────────────────────┤
|
||
│ Bills │
|
||
│ 1. Cremate corpse — Forever │
|
||
│ │
|
||
│ [ + Add Bill ] │
|
||
└─────────────────────────────────────┘
|
||
```
|
||
|
||
Default bill (suggested on placement): "Cremate corpse — Forever." Player can pause if they want to leave a body for burial instead.
|
||
|
||
### Rotting visual
|
||
|
||
Corpses tint progressively green-grey as `decay_severity` rises. Once Rotting (≥50), a small fly-cluster particle. Once fully Rotted (100), the corpse sprite is solidly grey-green.
|
||
|
||
### Ghost state UI
|
||
|
||
When the colony enters Ghost state:
|
||
|
||
```
|
||
┌────────────────────────────────────┐
|
||
│ 🕯 Your colony has fallen silent. │
|
||
│ Watch for travelers. │
|
||
└────────────────────────────────────┘
|
||
```
|
||
|
||
Persistent banner at top of screen until the next wanderer event resolves. Game continues at half-speed; player can pan/inspect the abandoned base. Works as both a real-time soft-stop and an evocative narrative moment.
|
||
|
||
### Wanderer event
|
||
|
||
Modal (auto-pause):
|
||
|
||
```
|
||
┌────────────────────────────────────┐
|
||
│ A traveler appears │
|
||
│ │
|
||
│ Mira wandered to your settlement. │
|
||
│ She is tired and looking for │
|
||
│ shelter. │
|
||
│ │
|
||
│ Skills: Crafting 7, Cooking 4, │
|
||
│ Manual Labor 3 │
|
||
│ │
|
||
│ [ Welcome ] [ Send away ] │
|
||
└────────────────────────────────────┘
|
||
```
|
||
|
||
## Storyteller events UX
|
||
|
||
For corpus and mechanism see [`design.md`](./design.md); for tech see [`architecture.md`](./architecture.md). This section is screens.
|
||
|
||
### Ambient banner (nudges, seasonal, resource, lore)
|
||
|
||
Top of screen, slides in from above, persists for 5 seconds or until tapped:
|
||
|
||
```
|
||
┌──────────────────────────────────────────┐
|
||
│ 🌾 Spring Awakens │
|
||
│ The thaw runs in every stream. │
|
||
│ Crops will grow fast now. │
|
||
└──────────────────────────────────────────┘
|
||
```
|
||
|
||
Stacks if multiple fire close together (rare). Tappable → dismiss; long-press → "see history."
|
||
|
||
### Modal event (wanderer, threat, disease, milestone, choice)
|
||
|
||
Auto-pauses the sim. Centered modal:
|
||
|
||
```
|
||
┌────────────────────────────────────────┐
|
||
│ 🚶 A Traveler │
|
||
├────────────────────────────────────────┤
|
||
│ A weary traveler stumbles toward your │
|
||
│ gate. They look hungry. │
|
||
│ │
|
||
│ Mira — Cooking 5, Manual Labor 3 │
|
||
│ │
|
||
│ [ Welcome ] [ Send away ] │
|
||
└────────────────────────────────────────┘
|
||
```
|
||
|
||
Title icon by category (🚶 wanderer, 🐺 threat, 🤒 disease, ✟ death, ⭐ milestone, 🌾 seasonal). Choices below body. Resume sim only when player picks.
|
||
|
||
### Threat events with delayed spawn
|
||
|
||
Some threats announce, then spawn later (e.g. "Wolves arriving at nightfall"). Player gets a banner *and* a marker on the map edge showing where they'll arrive:
|
||
|
||
```
|
||
On map edge: ⚠ ← (orange marker, pulsing)
|
||
```
|
||
|
||
### Event history
|
||
|
||
Top-bar icon (📜 scroll) opens an events log:
|
||
|
||
```
|
||
┌─────────────────────────────────────┐
|
||
│ ← Events history │
|
||
├─────────────────────────────────────┤
|
||
│ Day 28 ⭐ One Year Survived │
|
||
│ Day 26 🐺 Pack Hunt (3 wolves) │
|
||
│ Day 25 🚶 The Old Soldier (welcome) │
|
||
│ Day 24 🌾 Bountiful Harvest │
|
||
│ Day 22 🤒 Fever (Bob) │
|
||
│ Day 18 🌾 Autumn's Harvest │
|
||
└─────────────────────────────────────┘
|
||
```
|
||
|
||
Tap any entry → re-show that event's text. Useful as "what happened while I was at work?" recap.
|
||
|
||
### "While you were away" digest
|
||
|
||
When the player resumes after closing the app, a brief digest summarizes events that fired since last session. (Sim is paused while app is closed, but day-rolls happen on resume up to a max of N days to prevent accumulating events.)
|
||
|
||
```
|
||
┌────────────────────────────────────────┐
|
||
│ Welcome back │
|
||
│ While you were away (12 hrs): │
|
||
│ • Day 22 — Fever broke out (Bob) │
|
||
│ • Day 23 — Spring Awakens │
|
||
│ 2 events handled automatically. │
|
||
│ [ Continue ] │
|
||
└────────────────────────────────────────┘
|
||
```
|
||
|
||
For events with player choices that fired during the away period: those auto-default to the safe option (e.g. wanderers default to Send Away — the player can still recruit later events). Surface clearly: "1 wanderer was sent away."
|
||
|
||
## Roofing, weather, indoor cues
|
||
|
||
Most of this is rendering, not screens. For mechanics see [`design.md`](./design.md); for data/algorithms [`architecture.md`](./architecture.md).
|
||
|
||
### Indoor tint
|
||
|
||
Indoor tiles render with a subtle blue-grey overlay on the floor layer. Outdoor tiles unchanged. Players read indoor/outdoor at a glance; no toggle needed.
|
||
|
||
### Roofs are invisible in MVP
|
||
|
||
We don't render roof tiles. Floors and pawns render normally even "under" the roof. Genre convention; matches Rimworld.
|
||
|
||
### No-Roof designation
|
||
|
||
New designation type alongside Build / Mine / Chop / Stockpile.
|
||
|
||
1. Player taps **Designate → No Roof** (in the bottom-sheet).
|
||
2. Paint cells inside an enclosure to forbid auto-roofing.
|
||
3. Cells show a dashed outline + open-sky icon.
|
||
4. EnclosureDetector skips these cells when assigning Roof.
|
||
|
||
Useful for courtyards, gardens, fire pits.
|
||
|
||
### Weather rendering
|
||
|
||
- **Clear** — default sky.
|
||
- **Rain** — falling-particle overlay, 30%-darken sky tint, gentle ambient sound loop.
|
||
- **Storm** — heavier particles, deeper darken, occasional flash, louder rain.
|
||
- **Cold snap** — pale-blue sky tint, breath puffs from outdoor pawns (cheap particle), no rain.
|
||
|
||
A small **weather indicator** in the top bar shows the current state with a tappable tooltip ("Rain · Outdoor pawns will get wet").
|
||
|
||
### Season indicator
|
||
|
||
Top bar also shows season + day-of-season ("Spring 4/12"). Tap → seasonal forecast tooltip ("Winter starts in 8 days").
|
||
|
||
### Pawn wet visual
|
||
|
||
Wet pawns have a subtle drip particle + slight sprite tint until they dry off. Players can quickly spot "Bob is soaked, why?" without opening the pawn detail screen.
|
||
|
||
## World view camera (locked)
|
||
|
||
The camera/navigation model on the main world view, decided 2026-05-10 alongside the bump from a 40² to an 80² map.
|
||
|
||
- **Pinch-zoom**: between a "strategic" zoom (whole-map-ish on tablet, ~1/4 of the map on phone) and a "close" zoom (~16 tiles wide on phone, sprite-readable). No fixed zoom levels — smooth.
|
||
- **Drag-pan**: one-finger drag on empty world tiles. Drag on a pawn = select-and-drag-issue-order (long-press-then-drag for multi-select rectangle).
|
||
- **Double-tap to centre**: double-tap on a pawn portrait, alert banner, or the world centres the camera there with a brief animated pan.
|
||
- **No follow-camera**: selecting a pawn does **not** lock the view to them. Selection persists across pans so the player can scroll to a build site and issue an order without losing their pawn.
|
||
- **Jump-to-alert**: every storyteller alert / banner / event modal includes a *Go there* tap that pans-and-centres the camera on the relevant tile (raid spawn, downed pawn, fire, etc.). Replaces the "where is this happening?" minimap need.
|
||
- **No minimap in MVP**. Reasoning: phone screen real estate is precious, and *Jump-to-alert* + double-tap-on-portrait covers the navigation needs at 80². Revisit if playtest shows people getting lost.
|
||
- **Speed / pause buttons** stay fixed at the top regardless of camera state.
|
||
|
||
Layered on the world view: select (tap empty pawn), inspect (long-press anything), build mode (bottom-sheet → paint), designation paint (bottom-sheet → designate type → paint).
|
||
|
||
## Screens still to design
|
||
|
||
These are open work for future sessions. Listed roughly in importance.
|
||
|
||
- **Build drawer** — bottom-sheet tabs (Walls / Floors / Furniture / Production / Designate). Designation paint mode. Material-pick UI when a build can use multiple materials.
|
||
- **Alerts / storyteller event** — modal vs. ambient, dismissal, history of past prompts.
|
||
- **Day-summary / end-of-day** — a recap card showing what changed today; gives short sessions a stopping point.
|
||
- **Pawn detail** — beyond priorities: needs bars, status effects, current job, equipment, mood thoughts. Tap-pawn-portrait → this screen.
|
||
- **Onboarding / first 60 seconds** — mobile-specific. New player bounces if not productive in a minute. Open question, see [`memory.md`](../memory.md).
|
||
- **Settings** — speeds, auto-pause toggles, audio, accessibility.
|
||
|
||
## What lives elsewhere
|
||
|
||
- **Pawn AI / job system / how priorities map to behavior** — see [`architecture.md`](./architecture.md).
|
||
- **Game mechanics / skills / statuses** — see [`design.md`](./design.md).
|
||
- **Tilesets and art** — see [`art.md`](./art.md).
|
||
- **Pillars and vertical slice** — see [`memory.md`](../memory.md).
|