tgame/docs/17-foldins-2026-05-12.md
Parley Hatch 2abfe4abd1 Initial commit: design docs
Working title 'tgame' is provisional. Top-level samples/ and
docs/samples/ are gitignored; visual/art pipeline lives outside
this repo.
2026-05-17 11:16:07 -06:00

410 lines
25 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.

# Fold-ins: Brainstorm Session 2026-05-12
Loose notes on what shifted, expanded, or got added during the May 12 brainstorm. Not a spec. May not all make the game. Existing docs (0016) stay as-is; this rolls in the deltas without rewriting them.
## Strategic shifts
### Platform: mobile → Steam-first
[00-concept.md](00-concept.md) opens with "A mobile game." Working assumption now is **Steam (PC) as primary**. Mobile deferred or dropped. Reasons:
- Premium monetization is the *default* on Steam, the exception on mobile
- ~510× revenue per copy at comparable conversion rates
- Wishlist/Next Fest discovery system actually exists on Steam
- Existing design (drag-to-station, info-dense UI, reveal choreography) is structurally Steam-shaped; we were working around mobile constraints
- Pixel art is more welcome on Steam than mobile
- Steam Workshop is a force multiplier given the data-driven architecture
Mobile port stays *possible* later — offline-first / no-live-service architecture choices leave the door open.
### Pacing: real-time idle → session-based, idle-within-session
Existing docs lean Melvor-style real-time idle. Steam shifts this to **session-based, idle-within-session** — expeditions resolve in *in-session minutes*, not real-world hours. Loop Hero / FTL shape. The "AFK" is *within* the session, not while the game is closed.
Numbers throughout existing docs (expedition durations, craft times, rank cadence) need re-scaling against in-session minutes, not real-world hours. Defer the actual rescaling to sim-driven tuning.
### Monetization lane
Premium upfront, ~$1015 on Steam, demo for Steam Next Fest. Off the table: gacha, energy timers, IAP-to-skip-friction, FOMO events.
Realistic envelope: $02k (flop) / $530k (modest indie success) / $50k+ (hit). Designing for the *modest indie success* lane.
### Moral guardrail: the morning-after test
Articulated as a design constraint: *would a player who put 30 minutes in last night wake up and feel fine about it? Not addicted, not wrung out, not "I don't know why I did that"?* If a mechanic only works by failing this test, it's out. Pair with "always something shiny" — both apply.
### Niche positioning (sharpened)
Was: "Melvor meets Darkest Dungeon."
Now: *"A crafting-guild idle with Wartales-style provisioning, CK3-style event streams, and open-ended expedition sessions you recall at will. Pixel-art, single-screen, Steam premium."*
The Wartales/Battle Brothers provisioning lineage is the actual differentiator (see Consumables below). Nothing in the crafting-primary genre does this.
## Stack and tooling (tentative — spike before committing)
Developer fluent in Python, C, C++, Rust, IEC61131, JS/TS — *not* C#. Strongly prefers terminal/code-editor workflows over GUI editors.
Leading candidates:
1. **TypeScript + Phaser (or PIXI) + Tauri** — code-first, peak AI productivity for the developer's stack, web stack is natively brilliant at animated UI, Tauri ships small native binaries to Steam
2. **LÖVE + Lua** — code-first, Balatro-tier shipping track record, smaller corpus
3. **pygame-ce** — deepest Python familiarity, but framework grain doesn't match info-dense animated UI
Out for this project: Godot (GUI-editor primary grain), C# stacks (extra language), Bevy/Rust (compile-time iteration tax), C++/raylib (UI work in C++ is painful), Hazel (teaching engine).
Recommended spike before committing: one weekend in Phaser+TS+Tauri, one in LÖVE+Lua. Same toy each — single workshop screen, drag-an-ingredient-to-station, Master's Touch meter, one card reveal.
## Data pipeline
User owns the visual asset pipeline (ComfyUI + Python scripts) — out of scope for tooling discussions.
The *data* pipeline:
- **Source format**: TOML files per domain (`data/materials/`, `data/recipes/`, `data/patrons/`, etc.), git-versioned, text-editable
- **CSV as bulk-import escape hatch**: for AI-generated or spreadsheet-brainstormed batches; converted to TOML once imported
- **Validation**: Pydantic schemas at the tooling layer
- **Procedural expansion**: templates × materials × quality bands × affixes → expanded item space (potentially 10k+ permutations)
- **Runtime artifact**: SQLite (same engine for content and save state)
- **Simulator**: Python initially; port to TS if/when stack settles there, so sim and game share logic
**Strategic milestone**: sim + recipe scope locked first; *then* game code. Lock the 3060 hour content envelope by simulation before touching the runtime.
## Progression model — substantial revision
[05-economy-progression.md](05-economy-progression.md) correctly rejected per-skill XP grind ("craft 300 daggers to level Smithing"). But it over-corrected — no visible quantified bars means players have nowhere for the "I'm almost there" feeling to live.
### Multiple visible progression surfaces
| Surface | Visible bar | Advances by | Avoids grind because |
|---|---|---|---|
| Guild Rank (spine) | XP toward next rank | Orders + discoveries + masterworks + expeditions | Multiple sources; can't farm one |
| Recipe Library | % discovered (47/200) | First craft of a recipe | Repeats don't count |
| Material Catalog | Found (32/120) | New material drop | Repeats don't count |
| Patron Favor | Per-patron (8/10) | Fulfilling their orders | Bounded per patron |
| Engineer Career Arc | Apprentice → Journeyman → Master | First-Masterwork, first-Legendary, time-served | 3 stages, milestone-gated |
| Quality Records | Best so far per recipe | New quality band on that recipe | Bounded by recipe count |
| Region Map | % explored | Expeditions to new places | Discovery-gated |
A glance at the session opening shows multiple "almost there" hooks at once. None advance by repetition.
### Capability stack — the positive constraint
A craft attempt's success depends on the *sum* of:
| Factor | Gates | Built by |
|---|---|---|
| Engineer career stage | Quality ceiling | Apprentice → Journeyman → Master, milestone-gated |
| Engineer traits | Modifiers (Lucky, Steady, Hasty, Drunk) | Hire pool quality |
| Station tier | Recipes attemptable at all | Crafted upgrades + materials |
| Tools equipped | Discipline-specific bonuses (Masterwork Smith's Hammer) | Crafted in-game |
| Materials provided | Output ceiling (Crude inputs can't yield Masterwork) | Expeditions, market, rewards |
| Target quality band | Difficulty multiplier | Player choice, opt-in |
Effective capability vs. recipe demand → outcome.
### Attempt risk gradient (over-capability attempts)
| Mismatch | Outcome |
|---|---|
| Mild | Result drops one quality band below target; materials consumed |
| Moderate | Chance of total failure, material waste, tool damage |
| Severe | Engineer fatigue/injury, station damage, occasional cursed outcomes |
| Long-shot | Small chance of against-the-odds Masterwork — Library entry, story moment |
Recipe from expedition you're under-capability for? Burn the materials trying now, or save the scroll and build up? Either is a real decision.
### Pillar additions
- **Capability matters.** Items, gear, stations, engineers, and materials compound systemically.
- **Friction is real.** Attempts above capability cost real things. Sends above capability risk real things.
- **Progression visibility.** Players always have 3+ visible bars they're proximate to advancing, each by varied play.
## Expedition system — substantial expansion
[04-expeditions.md](04-expeditions.md) treats expeditions as "AFK timer with procedural narrative report on return." Major shift.
### Risk tiers with visible legibility
Risk is gradient, telegraphed *before* the player commits.
| Tier | Example | Failure modes | Stakes |
|---|---|---|---|
| 1 | Moo-Moo Meadows | Empty haul, minor scrape | Time only |
| 2 | Misty Hollow | Minor injury, scuffed gear | Days off-duty |
| 3 | Burned Hills | Serious injury, gear loss | Weeks off-duty |
| 4 | Ravenwood Crypt | Death, capture, permanent loss | Roster member gone |
| 5 | The Inverted Spire | Party wipe, story consequences | Multiple losses, rep hit |
Pacing principle: **tier 12 frequent and chill**, tier 45 are *campaigns* you prepare for. Before sending: visible math (*"Dora vs. Ravenwood: 60% severe injury, 25% death, 85% return empty-handed."*). Telegraphed deaths are *story*; surprise deaths are *punishment*.
### Interactive event stream (the CK3 layer)
Expeditions surface decision/flavor moments into a queue (sidebar feed), not as modal interrupts. Player works them at their own pace.
Event mix per expedition:
- **~70% flavor pings** — zero-choice texture (*"Brom found clover honey, +1"*). Cheap to author, constant pulse of life-happening-out-there. AI generates these in batches.
- **~25% light decisions** — binary, low stakes
- **~5% substantive decisions / story moments** — real branches, real stakes
Trait- and capability-gated dialog: this is where roster identity matters most. *"Brom's Lucky trait reveals a third option."* *"Read the inscription (requires Lettered — none of your party has it)."* Equipped gear changes available options.
### Auto-resolve via character traits
If the player ignores an event too long, the party defaults to a trait-driven auto-choice. **The auto-choice IS the character.** Cowardly Dora retreats. Brave Brom pushes through. No nag pressure; character expression preserved.
### Player-controlled return (significant shift)
| Pattern | Example | Feel |
|---|---|---|
| A. AFK timer | Melvor mobile | Set duration, get loot |
| B. Active mission | XCOM, Darkest Dungeon | Escort scripted party through run |
| **C. Open-ended + player recall** | **This design** | Adventurer lives in field, you call them home |
Pattern C is new for the crafting-guild genre. Adventurer remains in the field, generating events and loot, until the player recalls them. Closest analog: Stardew daytime exploration + CK3 event streams.
What this enables:
- Open-ended exploration — deep dives in a region searching for specific rare drops
- Time-as-resource — adventurer-hours budget across the roster
- Risk compounds with time — Tier-4 region kept-running is *very* dangerous
- Triage decisions when carry is full (the onyx example)
### Forcing functions for return
Player-controlled recall, but with mandatory-return conditions:
- Fatal injury or near-death
- Out of rations
- Captured (rescue required, not recall)
- Patron deadline pressing on inventory needed at the guild
### Death/loss mixed roll
When things go wrong: not always permadeath. Roll across:
- **Permadeath** (Darkest Dungeon — gone)
- **Captured / ransomed** (recoverable but expensive, time-pressured; possible side-quest)
- **Long-term wounded** (returns eventually, scarred — XCOM)
- **Lost gear/inventory only** (the run was a wash; person survived)
Variance keeps return moments narratively alive. Permadeath stays on the table for severe mismatches.
### Carry capacity
Hybrid slots-with-weight-tiers:
- N normal slots, each 1 item
- Heavy items (large onyx, masterwork weapons, large recipe tomes) take 2 slots
- Bag/saddlebag/cart capacity is another crafted-item axis — cobbler crafts the Pack of Holding
Each rare find when carry is full is its own triage moment.
## Consumables as core economic driver (new framing)
**The expedition envelope.** Every expedition is bounded by what the party brings:
- **Rations** → how long they stay (no food = short auto-return timer)
- **Carry capacity** (saddlebags, pack mules) → how much they bring back
- **Survival kits** (torches, ropes, antitoxins, climbing gear) → what zones they can survive in
- **Combat consumables** (potions, scrolls, bombs) → how many encounters they can stomach
Unprepped trio auto-returns in 5 minutes with rabbit pelts. Same trio with Dark Elven Lumbass Bread, Five-Alarm Chili, Sturdy Saddlebags, and healing draughts stays out an hour and brings back several times the haul.
What this fixes:
1. **Closes the economy loop.** Materials → crafted consumables → expeditions burn them → expeditions yield materials. The economy was open at one end before.
2. **Tradeskill breadth gets *structurally* justified.** Alchemy, Cooking, Leatherworking, Tailoring all feed expedition capability. Pure-smithing guild bottlenecks on expedition depth.
3. **Engineer roster specialization becomes strategic.** "I need an alchemist before tier-3 viability" is a real gate.
4. **Pre-expedition planning** is a real surface (provisioning UI) without a new mini-game.
5. **Everything crafted has a downstream destination.** Nothing is dead loot.
Balance target: **24× net multiplier** (prepped vs unprepped), not 10×. Sim finds the actual number. The user-facing *feel* of "way more loot with prep" can still be true at 3×.
## Named character emergence and titles
A unification that emerged this session: **all named characters in the world — patrons, engineers, adventurers, specialists — start *generic* and crystallize into named identities through specific gameplay moments.** The player doesn't pick from a static roster on day one; they *grow* the cast through play.
### Character lifecycle (unified across roles)
```
generic role → named identity → signature crafts/feats → arc evolution → legacy
"Apprentice "Miles Tannen, Rhinestone Love Handles, Reaches Master, Heirloom items
Leatherworker" Lucky Halfling Studded Doom-Boots, leaves for own bearing his name
Tanner of Sunken The Bag of Holding shop → becomes in the Library
Reach" "Lover's Embrace" a patron
```
The same model produces three patron *origins* as variations on one system, not three separate systems:
- **Encountered patrons** — Dorothy the Undead-Exploder, a rare encounter in Ravenwood Crypt. Survive the encounter; she takes interest in your guild; eventually commissions specialized arms.
- **Groomed-from-roster patrons** — Miles Tannen reaches Master tier; eventually opens his own shop in Goldshore; now *sends* orders to your guild rather than crafting in it.
- **Reputation-unlocked patrons** — At Guild Rank 5, Lord Aldric of Westmark notices you and begins commissioning.
### Naming triggers (generic → named)
| Trigger | Character class | Example |
|---|---|---|
| Crit on a signature craft | Engineers, specialists | Apprentice → "Miles Tannen" on the saddlebags crit |
| Survival of a high-tier expedition | Adventurers | Returns alive from Ravenwood → "Dora the Undaunted" |
| Milestone count | Anyone | First Masterwork / First Legendary / 10 Fine crafts |
| Rare encounter in the field | Future patrons | Dorothy the Undead-Exploder |
| Discovery moment | Adventurers, specialists | First to find Adamantine; first to read a crypt inscription |
| Time-in-roster + activity | Slow-burn | "She's been with us since the beginning…" |
The trigger determines the *flavor* of the identity — crit triggers produce craft-signature names; survival produces adventure-signature names; discovery produces lore-signature names.
### Procedural naming + signature items
Given input traits + heritage + triggering event, AI batches:
- A name with backstory fit ("Miles Tannen, Lucky Tanner of Sunken Reach")
- A *signature variant* of the craft ("Rhinestone Love Handles" replaces "Dusty Saddlebags" as his go-to)
- A short flavor blurb for the Library
Signature items are where whimsy compounds. Generic items are functional; signature items are *characterful*. Same stats, different soul. Players collect characters' signature crafts the way Pokémon trainers collect badges.
### Titles (LotRO-style layer)
Each named character has:
- A *name* (set on crystallization)
- A pool of *earned titles* (accumulated through specific deeds)
- One *displayed title* (player's choice)
- A *locked* flag (set on death/retirement; freezes display state and item attributions)
Display format:
> **Miles Tannen, the Harebrained**
> *Lucky Halfling Tanner of Sunken Reach*
#### Trigger taxonomy (whimsy + serious pair per achievement)
| Trigger type | Example | Whimsy variant | Serious variant |
|---|---|---|---|
| Quantitative count | Crafted 100 saddlebags | "The Saddle-Stuffed" | "The Provisioner" |
| Subject-specific | Collected 50 rabbit pelts | "The Harebrained" | "Keeper of Hares" |
| Quality milestone | First Legendary | "The Touched" | "The Brilliant" |
| Survival | Survived 10 Ravenwood runs | "The Twice-Wraithed" | "The Crypt-Tested" |
| Discovery | First to find Adamantine | "The Lucky Idiot" | "The Bold" |
| Patron | 20 orders for Lord Aldric | "Court Pet" | "Court Favorite" |
| Easter egg | Crafted at midnight | "The Night-Owl" | "The Vigilant" |
Each achievement seeds *two* title options. Player picks per character (or per earn, or with a default setting). Tone register flexes to the player.
### Lost characters become legacy
When `is_locked` flips (death/retire):
1. **Display freezes.** "Miles Tannen the Harebrained" stays that way even if future achievements would've promoted his title.
2. **Item attribution permanence.** Rhinestone Love Handles crafted by Miles stay attributed to "Miles Tannen the Harebrained" forever. Legacy items carry their maker's identity *as it was*.
Dora's +7 Teddy Bear of Banish Undead, after she falls in Ravenwood, can be equipped on another adventurer — but it's never *not Dora's bear*. The death/loss mixed roll now carries item-narrative weight.
### Why this is structurally significant
1. **Player agency in casting.** Two players end up with entirely different rosters and stories. The cast isn't designed by the designer; it's *grown* by the player.
2. **Emergent narrative without authored prose.** "Miles became Miles on day 8" — the player remembers because they were there. Cheap to produce, deeply meaningful.
3. **Investment compounds; losses sting more.** Each named character is *earned*.
4. **AI is the engine.** Procedural names, signature items, title pools, flavor blurbs — all perfectly AI-batched under a spec.
5. **Roster size constraint earns new purpose.** Was a balance number; now a constraint *forcing emotional investment*. You can only develop so many; choose wisely.
6. **Customization without dark patterns.** Title choice is expression, not gating. No premium title pack, no FOMO. Player agency in tone.
### Data model sketch
```
Character {
id
procedural_name // set on crystallization
base_role // Apprentice Leatherworker, Recruit, etc.
heritage // Halfling, Dwarven, ...
traits // [Lucky, Steady, ...]
state // generic | named | retired | dead | legacy
earned_titles // [{title_id, earned_at, variant: whimsy|serious}]
current_title_id // the displayed title
is_locked // becomes true on death/retire; freezes display + item attributions
signature_items // [item_id, ...]
trigger_history // [crafts, expeditions, milestones — for title progress]
}
Item {
...
crafted_by_character_id
crafted_by_attribution_snapshot // captured at craft time; never updates
}
```
The sim has to model emergence rates — strategies that mass-recruit and burn through generics produce very different cast graphs than strategies that invest deeply in a few. Title-earning rates are a sim-tunable lever.
## Tone reinforcement: whimsy is in scope, and a competitive advantage
[10-tone.md](10-tone.md) already cites Machinarium + Quake (silly-meets-heavy). This session reinforces and sharpens:
- Dark Elven Lumbass Bread, Five-Alarm Chili, +7 Teddy Bear of Banish Undead, 90lb-of-arbitrary-weight onyx, Grobb Plaguebringer's spring potpourri
- Voice spans named items, named adventurers, named expeditions, expedition events, titles
- A thousand serious medieval crafting games exist; whimsy is the differentiator
- Lean in: not everything serious, not everything silly. Tonal range *is* the texture.
### Tonal anchor: darker WoW × Shrek
Late-session reframing: the target tonal triangulation is **"darker WoW crossed with Shrek."** WoW was unafraid to put the grim plague-stricken-village quest right next to the goblin punt-yourself-from-a-slingshot quest. Shrek subverted fantasy seriousness while still earning real emotional beats. Both leaned into *"we know this is silly, and also this matters."* That's the range.
Tools of the voice:
- **Play on words** (Lumbass Bread, Plaguebringer's potpourri, Whirligig Crown)
- **Pop-culture jabs** in moderation — winks, not load-bearing references
- **Anachronisms welcome** (rhinestones, propeller hats, teddy bears, the absurd-weight onyx)
- **Earnest emotional beats** when they come — roster grief, character retirement, legacy items
Constraint: **don't get carried away.** The world is mostly serious; whimsy is the *texture on top*. If everything's a joke, nothing lands. If the joke surface is too thin, the whimsy stops being a register and becomes a tic.
### Design tenet: optimization creates absurd outcomes, and we lean in
Most games hide stat-min-maxing behind transmog / glamour systems — "make it look the way you want." This game doesn't. **Crafted gear identity overrides character aesthetic.** If Miles Tannen's Whirligig Crown gives +12 Wisdom, your terrifying necromancer wears the propeller hat. The Archmage shows up in Lucky Bunny Slippers because they're BiS for that slot.
Why this matters as a design choice:
- **Player optimization is honored**, not hidden. The cost is visible silliness; that's the *trade*.
- **Crafter identity persists in worn gear.** "That's clearly Miles's hat" is part of why you remember Miles.
- **Comedy emerges from the system**, not from authored jokes. The propeller-hat-on-the-Archmage moment is funny *because the player chose it for rational reasons.*
- **Signals the game has a sense of humor about itself** — which makes the *serious* beats land harder when they arrive. The grief over Dora's death in Ravenwood works *because* the rest of the game has shown it can laugh.
## Production characteristics (session synthesis)
Observations that emerged late in the session, worth capturing because they validate (or constrain) the production envelope:
### Production feasibility
- **Not asset-heavy.** Everything is procedural — items, characters, signature variants, expedition events, titles, narrative blurbs. AI tooling handles the bulk; no hand-illustrated cutscenes or keyframed animations required.
- **No bespoke animation pipeline.** Shaders + code tricks (tweens, particles, reveal choreography) carry the visual layer. No animator hire, no rig system, no skeleton/IK work.
- **No combat to simulate.** Expedition resolution is dice + capability + traits + narrative events. No real-time combat, no melee/ranged math, no enemy AI. Enormous scope relief.
- **No twitch mechanics, low skill ceiling.** Master's Touch is opt-in skill-timing with auto-resolve. Players who can't or don't want timing aren't locked out.
- **Young-player accessible.** Whimsy + low skill ceiling + emotional investment lets the game work for kids without designing *down*. Adults get the same experience.
- **The retention engine is care, not pressure.** Roster grief, signature items, earned titles, patron arcs — emotional investment carries the long tail.
### Worldbuilding stance: deep lore, shallow world
There is no walking around. No avatar in a town square. No environmental storytelling through level geometry. Lore lives entirely in:
- Item descriptions and flavor blurbs
- Expedition event text and character barks
- Patron and adventurer backstories that surface in event prompts
- Library entries for crafts, characters, regions
- Region descriptions and rumored encounters
This requires **deep written content in narrow places**, but **no expansive world authoring**. The game sits on something that *could* be a larger story — the world *could* have an overarching plot — but the design is intentionally shallow on the macro, rich on the micro. The player imagines the world from textures they encounter; the game doesn't insist on filling it in.
Right tradeoff for solo / AI-augmented production. World-walking would explode scope; lore in flavor text is AI-batchable and fits the established voice.
### The texture, in one sentence
*"Grobb Plaguebringer just returned from the depths of Ravenwood Crypt with essence of nightshade to put the final touches on his spring potpourri mastercrafted skill-up."*
Named character (Grobb), earned title (Plaguebringer — serious variant on a grim subject), tier-4 expedition return (Ravenwood, with named drop), signature craft (spring potpourri), absolute whimsy on grim source material. If we ship 200 sentences with this texture, we have a game.
## Still-open threads (parked for next session)
- **Per-discipline capability vs. single engineer rank** — breadth pillar suggests per-discipline (Master Smith AND Common Loom-worker), but UI/state complexity is real
- **Per-recipe memory** — does the guild remember masterworking the Falchion? Diminishing returns on familiar recipes vs. fresh thrill of new?
- **Simulator structure** — discussed inputs/outputs, haven't designed it
- **Death/loss mixed-roll probabilities** — directional decision made, specific roll weights not pinned
- **Replayability shape** — Steam expects 830 hr; NG+, ascension, sandbox, or "you've seen it"?