- Grow climax admit heat with arc age and re-stamp while theater holds - Let prolonged stranger fights challenge Cap so Active chrome can light - Add soak_probe that dumps roster vs focus without wiping saga state - Gate with saga_hard_arc_escalates; bump mod to 0.29.59
137 lines
7.4 KiB
Markdown
137 lines
7.4 KiB
Markdown
# Life-saga roster
|
|
|
|
Dynamic top-10 cast of interesting lives (MCs). Owns the dossier rail and soft camera bias.
|
|
Chronicle stays a history book and never drives the camera.
|
|
Short combat/love/war arcs stay in [`StoryPlanner`](../IdleSpectator/Story/StoryPlanner.cs) as chapter beats.
|
|
Durable observed facts live in [`LifeSagaMemory`](../IdleSpectator/Story/LifeSagaMemory.cs) and survive roster churn.
|
|
|
|
## Ownership
|
|
|
|
| Concern | Owner |
|
|
|---------|--------|
|
|
| Top-10 MCs, diversity, Prefer | `LifeSagaRoster` |
|
|
| Durable observed facts | `LifeSagaMemory` |
|
|
| Adaptive presentation | `LifeSagaPresentation` |
|
|
| Dossier / Saga tabs + hover preview | `LifeSagaViewController` |
|
|
| Saga body UI | `LifeSagaPanel` |
|
|
| Rail icons / Prefer click | `LifeSagaRail` |
|
|
| Camera read-pause lease | `InterestDirector` |
|
|
| Short climax → aftermath → epilogue | `StoryPlanner` (thinned) |
|
|
| Spine under tip | `StoryPlanner.FormatSpineLabel` |
|
|
| Full history | Chronicle / Lore |
|
|
|
|
## Admission
|
|
|
|
Live discovery (no tip-string allowlists):
|
|
|
|
- Game favorite, king, city leader, kills/renown floors (`InterestScoring.IsNotable`)
|
|
- Pack alpha, clan chief, army captain, active plot author, founder, species singleton
|
|
|
|
Standing is recomputed from live roles each refill.
|
|
Heat comes from chapter stamps / featured tips and decays with idle time.
|
|
Each slot keeps its original admission reason even when its live role later changes.
|
|
Hard-arc admissions also retain the arc kind and chapter context that brought the life onto the roster.
|
|
|
|
## Dynamic top-10
|
|
|
|
- Cap stays 10; order follows Effective = Standing + Heat + pin bonuses.
|
|
- Prefer and WorldBox favorites are hard pins and fully count toward Cap.
|
|
- Admission-role units always compete on the periodic scan.
|
|
- Non-admission "nobodies" challenge Cap only via hard-arc chapter stamps (Combat / War / Plot / Love / Grief).
|
|
- Hard-arc admit heat escalates with climax age (re-stamped while the arc holds) so a prolonged stranger duel can displace dull Cap slots and light Active chrome.
|
|
- Soft `NoteFeatured` heats existing MCs only.
|
|
- Newcomers need a small challenger margin over the weakest non-pin so the rail does not thrash.
|
|
|
|
## Camera (soft)
|
|
|
|
- No rail camera lock. Prefer is a toggle soft-favorite for idle scoring.
|
|
- Score ladder: crisis ownership > active short-arc ownership > Prefer soft > MC soft > MC cast > CausalHeat.
|
|
- `nearTieEpsilon` (8) picks #1 for ordinary gaps; Prefer/MC/cast may still win within `sagaNearTieEpsilon` (28).
|
|
- Soft ranks: Prefer > MC > MC cast (lover/friend/kin/earned rival of a roster MC).
|
|
- Tips that touch two or more roster MCs get `sagaCrossMcBonus`.
|
|
- Mid-fight follow uses Prefer/MC/cast soft weight in `CombatFocusWeight` (spectacle floors can still win).
|
|
- Ambient / character-fill yields immediately to Prefer/MC tips (not vs crisis/combat/short-arc holds).
|
|
- Soft-fill quiet still suppresses anonymous crumbs; Prefer/MC tips may break quiet.
|
|
- Glyph hover acquires a camera read-pause lease: feeds/story/roster continue, but selection and focus repair are deferred until release.
|
|
|
|
## Rail UX
|
|
|
|
- Up to 10 slots with live inspect-UI sprites (refreshed ~3x/sec for animation frames).
|
|
- Egg forms and tiny/blank atlas crops fall back to the species icon (letter last).
|
|
- Active chrome = camera follow MC; Involved chrome = other tip-touched MCs (subject/related/follow/pair/short-arc cast only - not mass `ParticipantIds`).
|
|
- Prefer uses a star pip / distinct border.
|
|
- Click toggles saga Prefer (does not mutate WorldBox unit favorite).
|
|
- While on the **Saga** tab, click also pins that life as the persistent Saga subject (panel only; director bias stays Prefer/MC/cast).
|
|
- Tabs sit above the cast rail; the rail is a **horizontal strip under the tabs** so Dossier↔Saga body swaps cannot move the glyphs.
|
|
- **Dossier** shows the watched unit dossier; **Saga** shows the adaptive saga panel for the watched MC when on the roster.
|
|
- If the watched unit is not an MC and nothing is pinned, Saga shows an empty *Pick a life from the rail* state (never a stale first-roster filler).
|
|
- Hovering a glyph temporarily previews that life in the Saga body and pauses camera switching.
|
|
- Leaving the glyph restores the prior tab (usually Dossier) immediately and releases the pause lease.
|
|
- Hover-exit re-applies dossier reason/traits/status/history so the orange tip does not wait for a tip change.
|
|
- Moving onto the panel or empty rail chrome does not keep the preview - only glyph hover does.
|
|
- Relayout / glyph-to-glyph exits are ignored while the pointer is still over a glyph.
|
|
- Clicking a tab during hover cancels the preview immediately and applies that tab.
|
|
- Tabbed chrome locks a constant outer width so Dossier↔Saga hover cannot slide glyphs.
|
|
- Saga body is a story card: lens eyebrow + name + title beside the portrait; stake, Cast, and Legacy wrap full-width under it.
|
|
- No Evidence stats dump (kills/realm live on Dossier). No Open Lore button (press L).
|
|
- Body height sizes to content up to a cap; Legacy beats stack as separate lines (no · soup).
|
|
- Dossier story spine (`Kind · Phase`) is hidden when the orange reason already names the same kind and phase is Climax.
|
|
- Never show live task/status/trait rows or call a live attack target a rival.
|
|
|
|
## Earned rivals
|
|
|
|
Notable only:
|
|
|
|
- Living rematches (≥ `sagaRivalEncounterThreshold`, default 3) while both are alive (sticky combat hook; kill/death do not count).
|
|
- Kin blood (`killed_kin` / `kin_slain`).
|
|
- War / plot opposition (opposing principals on the same war/plot tip).
|
|
- MC↔MC living rematches earn rivalry one encounter sooner; a single MC kill is crossover Legacy, not automatic RivalEarned.
|
|
- Cast shows living credible rivals only; weak kill-cycle `repeated_encounters` facts are pruned.
|
|
- Likely succession is omitted unless a game-authored heir API probe succeeds.
|
|
- Pack / kin lenses fill remaining Cast slots with live family peers (`Packmate` / `Kin`) after lover/friend/parents/children/heir/rival.
|
|
|
|
## Cross-MC moments
|
|
|
|
When subject and other are both roster MCs, facts are flagged `McCrossover` (named stake/legacy prose + heat on both).
|
|
Both rail glyphs light (Active + Involved) when the current tip touches multiple MCs.
|
|
|
|
## Soft-fill quiet (AFK hygiene)
|
|
|
|
After hard story/crisis closers, soft-fill quiet suppresses soft-life crumbs and short interrupt FX (`stunned` / `invincible`).
|
|
`FamilyPack` does not break quiet (ambient cluster fill).
|
|
Combat / war / plot / outbreak / earthquake / story beats / epic strength / Prefer/MC still cut in.
|
|
Quiet can refresh briefly when a soft crumb ends (bounded).
|
|
|
|
## Session
|
|
|
|
- `StoryPlanner.Clear` does not wipe the roster or saga memory.
|
|
- Lore browse / brief idle-off keeps the roster and memory.
|
|
- World replacement, harness batch end, and `interest_saga_clear` wipe roster + memory.
|
|
- Read-only soak dumps use `soak_probe` (or `snapshot` with `value=preserve`) and skip the batch-end wipe.
|
|
|
|
## Harness
|
|
|
|
- `saga_roster_diversity`
|
|
- `saga_camera_prefers_mc`
|
|
- `saga_prefer_soft_bias`
|
|
- `saga_wins_moderate_gap`
|
|
- `saga_combat_follow_mc`
|
|
- `saga_cast_soft_bias`
|
|
- `saga_cross_mc_light`
|
|
- `saga_cross_mc_kill`
|
|
- `saga_rival_not_single_kill`
|
|
- `saga_rival_rematch`
|
|
- `saga_prefer_cuts_ambient`
|
|
- `saga_hard_arc_escalates`
|
|
- `saga_overview_has_mc`
|
|
- `saga_adaptive_dossier`
|
|
- `saga_memory_survives`
|
|
- `saga_hover_read_pause`
|
|
- `saga_replace_on_death`
|
|
- `saga_admit_roles`
|
|
- `saga_replace_weaker`
|
|
- `saga_rail_active_highlight`
|
|
- `saga_rail_prefer_click`
|
|
- `saga_soft_fill_no_pack`
|
|
|
|
See also: [story-planner.md](story-planner.md).
|