42 lines
1.7 KiB
Markdown
42 lines
1.7 KiB
Markdown
# Event reasons (camera + orange dossier)
|
||
|
||
## Contract
|
||
|
||
Registered **events** own the idle camera.
|
||
`EventStrength` / `TotalScore` ranks who wins.
|
||
Character fill runs only when the pending **EventLed** queue is empty, and uses an empty Label (task chip only).
|
||
|
||
Orange dossier reason = the owning event’s `Label` while the scene is active (`InterestDirector.TryGetOwnedReasonCandidate`).
|
||
Quiet grace / inactive dwell clears the reason even if focus has not switched yet.
|
||
|
||
## EventReason
|
||
|
||
[`IdleSpectator/EventReason.cs`](../IdleSpectator/EventReason.cs) is the sole Label factory for camera candidates.
|
||
Feeds call typed helpers (`Fight`, `BuildingEat`, `SeekingLover`, …) or `Apply(template, a, b, id)`.
|
||
|
||
Rules:
|
||
|
||
- Sentence form with names: `{a} is fighting {b}`, `{a} is eating a beehive`, `{a} is seeking a lover`.
|
||
- Set `RelatedUnit` when the sentence names a second party.
|
||
- Never invent stranger subjects for unit-led events.
|
||
- Never use engine jargon that misstates the action (`Consumes a building` → eating/foraging via `BehConsumeTargetBuilding`).
|
||
|
||
## Removed crumbs
|
||
|
||
Do not author these as orange reasons:
|
||
|
||
- `In action`
|
||
- bare `Duel` / `Fight (N)` without a named sentence
|
||
- identity titles (`King of X`, `Leader of X`, `Lone beetle`)
|
||
- `Consumes a building` / `Damages a building: {a}` crumb form
|
||
|
||
## Ownership enum
|
||
|
||
`InterestOwnership` (Signal/Ambient) is retained on catalogs for compatibility but **ignored** by `EventFeedUtil.Register`.
|
||
Every registration is EventLed and may own the camera.
|
||
Strength is the dial (war ~94 beats seek-lover ~45).
|
||
|
||
## Dossier display
|
||
|
||
`UnitDossier.EventLabelBeat` keeps the authored sentence.
|
||
It only rejects identity/weak crumbs and scrubs living stranger names (`ReasonNamesStranger` / `LeadsWithForeignName`).
|