b451f83174
Captures the pre-Godot-port state of the codebase. This is the rollback anchor for the Godot port (M0 of theriapolis-rpg-implementation-plan-godot-port.md). All Phase 0 through Phase 6.5 work is included; Phase 7 is in flight. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
872 lines
36 KiB
Markdown
872 lines
36 KiB
Markdown
# Theriapolis — Faction Influence & Reputation System
|
||
### Technical Design Document
|
||
|
||
---
|
||
|
||
## Executive Summary
|
||
|
||
The reputation system tracks how the world perceives the Player Character across three
|
||
nested layers: **Clade Bias** (what you are), **Faction Standing** (what your group
|
||
has done), and **Individual Disposition** (what you've done to me personally). These
|
||
three layers blend into a single **Effective Disposition** score for every NPC the
|
||
player interacts with.
|
||
|
||
The core principle: **Nobody meets you clean.** Every NPC has opinions before you
|
||
walk through the door. Your species, your Clade, the factions you're associated with,
|
||
the rumors that precede you — all of it colors the interaction before a single word is
|
||
exchanged. Personal experience can override prejudice, reinforce it, or complicate it.
|
||
|
||
---
|
||
---
|
||
|
||
# SECTION I: THE THREE LAYERS
|
||
|
||
---
|
||
|
||
## Layer 1: Clade Bias
|
||
|
||
### What It Represents
|
||
|
||
The deep, biological, cultural, historical weight of being what you are. A wolf-folk
|
||
walking into a Cervid herd-city carries ten thousand years of predator/prey history
|
||
on their shoulders. A hybrid walking anywhere carries stigma. This layer exists before
|
||
the game begins and changes slowly, if at all.
|
||
|
||
### Implementation
|
||
|
||
Every NPC has a **Clade Bias Table** — a set of modifiers based on the PC's Clade
|
||
and species. These are NOT stored per-NPC individually (that would be wasteful). They
|
||
are inherited from the NPC's **Bias Profile**, which is determined by the NPC's own
|
||
Clade, cultural background, region, and education level.
|
||
|
||
**Bias Profiles** are templates. A finite set (30–50) covers the population:
|
||
|
||
| Profile ID | Description | Example NPCs |
|
||
|-----------|-------------|--------------|
|
||
| CANID_TRADITIONALIST | Pack-loyal, distrusts non-Canidae, respects strength hierarchy | Rural wolf-folk rancher, Old Pack sympathizer |
|
||
| CERVID_CAUTIOUS | Default wariness of predator Clades, warm to other prey, uncertain about hybrids | Herd-city shopkeeper, Cervid farmer |
|
||
| URBAN_PROGRESSIVE | Reduced Clade bias across the board, mild positive toward hybrids, dislikes extremists | Sanctum Fidelis professional, university-educated |
|
||
| HYBRID_SURVIVOR | Strong positive toward hybrids, default distrust of purebreds, especially authorities | Tangles resident, underground network member |
|
||
| MUSTELID_PRAGMATIST | Judges by utility, mild distrust of large species (Ursidae, Bovidae), respects competence | Factory foreman, independent trader |
|
||
| BOVID_HERD_LOYALIST | Warm to other Bovidae and prey Clades, wary of predators, protective of community | Herd-city elder, agricultural cooperative member |
|
||
| COVENANT_FAITHFUL | Treats all Clades with studied neutrality, strong negative toward Covenant violators | Covenant Enforcer, Bridge-oath Keeper |
|
||
| FRONTIER_NIHILIST | Doesn't care what you are, only what you can do right now | Borderland stray, Tangles smuggler |
|
||
|
||
Each profile contains a modifier table:
|
||
|
||
```
|
||
CERVID_CAUTIOUS bias table:
|
||
Canidae: -15
|
||
Felidae: -20
|
||
Mustelidae: -10
|
||
Ursidae: -25 (biggest = scariest)
|
||
Cervidae: +15
|
||
Bovidae: +10
|
||
Leporidae: +5
|
||
Hybrid: -10
|
||
```
|
||
|
||
These are the starting modifiers applied to the Effective Disposition calculation
|
||
before anything else.
|
||
|
||
### Clade Bias Modifiers — Additional Factors
|
||
|
||
**Species-Specific Adjustments:**
|
||
Within a Clade, species matters. The base Clade bias is adjusted:
|
||
|
||
```
|
||
If NPC profile = CERVID_CAUTIOUS and PC species = Fox-folk:
|
||
Base Canidae bias: -15
|
||
Fox-folk adjustment: +5 (smaller, less threatening than wolf-folk)
|
||
Net: -10
|
||
|
||
If PC species = Wolf-folk:
|
||
Base Canidae bias: -15
|
||
Wolf-folk adjustment: -5 (apex predator, maximum threat profile)
|
||
Net: -20
|
||
```
|
||
|
||
Species adjustments are small (±5 to ±10) but meaningful at thresholds.
|
||
|
||
**Size Differential:**
|
||
A Large PC interacting with a Small NPC triggers an additional modifier based on the
|
||
size gap. This is involuntary — the NPC's body responds to the size differential
|
||
before their brain catches up.
|
||
|
||
```
|
||
Size differential modifiers:
|
||
Same size: +0
|
||
One step larger: -3 (PC is bigger)
|
||
Two steps larger: -8 (PC is much bigger)
|
||
One step smaller: +2 (PC is smaller, less threatening)
|
||
Two steps smaller: +5 (PC is much smaller, non-threatening... or patronized)
|
||
```
|
||
|
||
A moose-folk PC talking to a rabbit-folk shopkeeper starts at -8 from size alone,
|
||
before Clade bias, before anything personal. That's the world.
|
||
|
||
**Hybrid Detection:**
|
||
If the PC is a hybrid and the NPC detects it (through scent, visual tells, or
|
||
reputation), an additional HYBRID modifier applies from the NPC's bias profile.
|
||
If the PC is passing and the NPC hasn't detected it, the hybrid modifier does NOT
|
||
apply — the PC is treated as their presenting Clade.
|
||
|
||
Discovery of passing status triggers a **Betrayal Event** (see Section IV).
|
||
|
||
---
|
||
|
||
## Layer 2: Faction Standing
|
||
|
||
### What It Represents
|
||
|
||
How the PC is perceived based on their affiliation with (or opposition to) organized
|
||
groups. Faction Standing is communal reputation — it follows you through the world
|
||
via rumor, news, official records, and scent-marked territory.
|
||
|
||
### The Factions
|
||
|
||
The system tracks standing with the following factions:
|
||
|
||
| Faction | Description | Standing Range |
|
||
|---------|-------------|---------------|
|
||
| **Covenant Enforcers** | The law. Federal authority. Policing the Covenant. | -100 to +100 |
|
||
| **The Inheritors** | Predator-Clade supremacist network. | -100 to +100 |
|
||
| **The Thorn Council** | Prey-Clade separatist movement. | -100 to +100 |
|
||
| **The Maw** (hidden) | The umbrella conspiracy. PC learns about it progressively. | -100 to +100 |
|
||
| **Hybrid Underground** | Informal mutual aid and rights network. | -100 to +100 |
|
||
| **The Unsheathed** | Hybrid political activism movement. | -100 to +100 |
|
||
| **Merchant Guilds** | Trade, commerce, economic power. | -100 to +100 |
|
||
| **Local Government** | Per-settlement authority. Independent per settlement. | -100 to +100 (per settlement) |
|
||
|
||
**Standing Scale:**
|
||
|
||
| Range | Label | Effect |
|
||
|-------|-------|--------|
|
||
| -100 to -76 | NEMESIS | Kill on sight. Bounties. Active hunting. |
|
||
| -75 to -51 | HOSTILE | Attacked if recognized. No services. Arrest warrants. |
|
||
| -50 to -26 | ANTAGONISTIC | Refused service. Information denied. Reported to authorities. |
|
||
| -25 to -1 | UNFRIENDLY | Cold reception. Higher prices (+25%). Limited dialogue. |
|
||
| 0 | NEUTRAL | Default. No opinion. Standard interactions. |
|
||
| +1 to +25 | FAVORABLE | Slight discount (-10%). More dialogue options. Tips and rumors. |
|
||
| +26 to +50 | FRIENDLY | Discount (-20%). Side quest access. Safe houses. |
|
||
| +51 to +75 | ALLIED | Significant discount (-30%). Faction resources available. Backup in combat. |
|
||
| +76 to +100 | CHAMPION | Maximum benefits. Leadership-level access. Faction NPCs will die for you. |
|
||
|
||
### How Standing Changes
|
||
|
||
**Direct Actions:**
|
||
Completing quests, making story choices, killing faction members, saving faction
|
||
members, delivering intelligence — these produce **Standing Events** with defined
|
||
magnitude:
|
||
|
||
| Action | Magnitude | Example |
|
||
|--------|-----------|---------|
|
||
| Minor favor | +3 to +5 | Delivered a package, shared non-critical info |
|
||
| Moderate service | +8 to +12 | Completed a faction quest, saved a member |
|
||
| Major service | +15 to +25 | Disrupted an enemy operation, saved a leader |
|
||
| Critical contribution | +30 to +50 | Resolved a faction-threatening crisis |
|
||
| Minor offense | -3 to -5 | Refused a request, associated with rivals |
|
||
| Moderate offense | -8 to -12 | Failed a faction quest, harmed a member |
|
||
| Major betrayal | -15 to -25 | Killed a member, sabotaged operations |
|
||
| Critical betrayal | -30 to -50 | Destroyed a faction asset, turned over intel to enemies |
|
||
|
||
**Faction Interdependencies:**
|
||
Some factions are opposed. Gaining standing with one costs standing with another:
|
||
|
||
```
|
||
FACTION OPPOSITION MATRIX:
|
||
|
||
Enforcers Inheritors Thorn Hybrid_UG Unsheathed Merchants
|
||
Enforcers — -0.3 -0.3 -0.1 0.0 +0.1
|
||
Inheritors -0.5 — -0.2 -0.3 -0.3 0.0
|
||
Thorn Council -0.5 -0.2 — -0.1 -0.2 0.0
|
||
Hybrid Underground -0.1 -0.5 -0.3 — +0.3 0.0
|
||
Unsheathed 0.0 -0.5 -0.3 +0.3 — 0.0
|
||
Merchants +0.1 0.0 0.0 0.0 0.0 —
|
||
```
|
||
|
||
Reading: when the PC gains +10 with the Inheritors, they lose 0.5 × 10 = -5 with
|
||
the Covenant Enforcers, -2 with the Thorn Council, -3 with the Hybrid Underground,
|
||
and -3 with the Unsheathed.
|
||
|
||
The multipliers are asymmetric by design. Helping predator supremacists hurts you
|
||
more with the Hybrid Underground (-0.3) than helping the Hybrid Underground hurts
|
||
you with the Enforcers (-0.1). The oppressed are more sensitive to betrayal than
|
||
institutions are to dissent.
|
||
|
||
### Faction Standing Propagation
|
||
|
||
NPCs don't psychically know your faction standing. Information travels through
|
||
believable channels:
|
||
|
||
**Propagation Speed:**
|
||
- Within a settlement where the action occurred: immediate
|
||
- To adjacent settlements (1-2 day travel): 1–3 in-game days
|
||
- Across the continent: 1–2 in-game weeks (thumper-relay and rail-carried news)
|
||
- To isolated/frontier areas: may never arrive without specific courier
|
||
|
||
**Propagation Fidelity:**
|
||
Standing events degrade as they propagate:
|
||
|
||
```
|
||
At origin: Full magnitude
|
||
Adjacent settlement: 80% magnitude
|
||
Regional: 60% magnitude
|
||
Continental: 40% magnitude
|
||
Frontier: 20% magnitude (if it arrives at all)
|
||
```
|
||
|
||
Example: PC saves a Covenant Enforcer in Thornfield (+15). In Thornfield, their
|
||
Enforcer standing is immediately +15. In a nearby town: +12. In Sanctum Fidelis
|
||
(continental): +6. In The Tangles (frontier, plus Enforcers have weak presence): +3,
|
||
and only if a courier happened to carry the news.
|
||
|
||
**Exception — NEMESIS and CHAMPION standing:** Extreme standing events propagate at
|
||
full magnitude and maximum speed. Kill a faction leader, and everyone in that faction
|
||
knows within days. Save a city from destruction, and the entire continent hears by
|
||
next week. Fame and infamy travel fast.
|
||
|
||
**Scent-Based Faction Detection:**
|
||
In settlements with strong faction presence, faction-aligned NPCs can SMELL the PC's
|
||
recent associations. Spent time in an Inheritor camp? You carry traces. Stayed at a
|
||
Hybrid Underground safe house? Scent residue. This creates an additional detection
|
||
mechanism beyond rumor propagation.
|
||
|
||
```
|
||
Scent-based faction detection:
|
||
Duration: Scent traces last 24–72 hours depending on exposure
|
||
Detection: NPCs with Superior Scent or Scent-Broker abilities auto-detect
|
||
Others: WIS (Perception) DC 15 to notice "something off" about the PC's scent
|
||
Counter: Scent-mask products suppress faction scent traces
|
||
Military-grade: 8 hours suppression
|
||
Deep-cover: 24 hours
|
||
```
|
||
|
||
---
|
||
|
||
## Layer 3: Individual Disposition
|
||
|
||
### What It Represents
|
||
|
||
How a specific NPC feels about the PC based on direct personal interaction. This is
|
||
the layer that makes the shopkeeper who hates Canidae warm up to the wolf-folk PC who
|
||
saved her kit from drowning. Personal experience is the strongest force in the system —
|
||
it can override Clade bias and faction standing, though doing so takes sustained effort.
|
||
|
||
### Implementation
|
||
|
||
Every NPC the PC has directly interacted with stores a **Personal Disposition Record**:
|
||
|
||
```
|
||
PersonalDisposition {
|
||
npc_id: unique identifier
|
||
base_value: 0 (initialized at first interaction)
|
||
current_value: integer (-100 to +100)
|
||
interaction_log: [array of InteractionEvents]
|
||
trust_level: enum (STRANGER, ACQUAINTANCE, FAMILIAR, TRUSTED, BONDED)
|
||
memory_flags: [set of memorable event tags]
|
||
betrayal_flag: boolean (has the PC betrayed this NPC specifically?)
|
||
last_interaction: timestamp
|
||
}
|
||
```
|
||
|
||
### How Individual Disposition Changes
|
||
|
||
**Interaction Events:**
|
||
Every meaningful exchange with an NPC generates an InteractionEvent:
|
||
|
||
```
|
||
InteractionEvent {
|
||
type: enum (DIALOGUE, QUEST, GIFT, COMBAT, BETRAYAL, RESCUE, TRADE, SCENT)
|
||
magnitude: integer (-50 to +50)
|
||
context: string (what happened)
|
||
timestamp: game time
|
||
}
|
||
```
|
||
|
||
**Event Types and Typical Magnitudes:**
|
||
|
||
| Event | Magnitude | Example |
|
||
|-------|-----------|---------|
|
||
| Polite greeting | +1 | First meeting, respectful dialogue |
|
||
| Helpful dialogue | +2 to +3 | Answering questions, sharing non-sensitive info |
|
||
| Small favor | +3 to +5 | Delivered an item, helped with a minor task |
|
||
| Significant help | +8 to +12 | Completed a personal quest, defended them |
|
||
| Life-saving | +15 to +25 | Rescued from danger, provided critical medical aid |
|
||
| Gift (appropriate) | +2 to +8 | Item value and relevance to NPC determine magnitude |
|
||
| Gift (inappropriate) | -1 to -3 | Wrong item, insulting implication, cultural misstep |
|
||
| Successful persuasion | +1 to +3 | Convinced them of something, but they know they were persuaded |
|
||
| Failed intimidation | -5 to -10 | Tried to bully them, failed. They remember. |
|
||
| Successful intimidation | -3 to -8 | Got what you wanted. They resent it. |
|
||
| Theft (detected) | -15 to -25 | Caught stealing. Trust collapses. |
|
||
| Theft (undetected) | +0 | They don't know. But if discovered later: magnitude doubles as betrayal. |
|
||
| Physical harm | -20 to -40 | Attacked them or someone they care about. |
|
||
| Witnessed violence | -5 to -15 | They saw you kill or brutalize someone. Context matters. |
|
||
| Witnessed mercy | +5 to +10 | They saw you spare someone or de-escalate. |
|
||
| Broke promise | -10 to -20 | Said you'd do something, didn't. |
|
||
| Kept difficult promise | +10 to +15 | Did what you said, even when it cost you. |
|
||
| Shared vulnerability | +5 to +8 | Revealed personal information, showed trust. |
|
||
|
||
### Trust Level
|
||
|
||
Trust is a ratchet-like system that tracks depth of relationship independently from
|
||
disposition value. You can like someone you don't trust. You can trust someone you
|
||
don't like.
|
||
|
||
| Trust Level | Threshold | Unlocks |
|
||
|-------------|-----------|---------|
|
||
| STRANGER | Default | Basic transactions, surface dialogue |
|
||
| ACQUAINTANCE | 3+ positive interactions | Extended dialogue, rumor sharing, basic side quests |
|
||
| FAMILIAR | 8+ positive interactions, disposition > +15 | Personal backstory dialogue, discounts, warnings about danger |
|
||
| TRUSTED | 15+ positive interactions, disposition > +30, no betrayal flag | Secret sharing, faction introductions, personal quests, safe house access |
|
||
| BONDED | 25+ positive interactions, disposition > +50, TRUSTED for 5+ in-game days | Will fight for the PC, share critical info unprompted, risk their life, romance options (if applicable) |
|
||
|
||
**Trust Decay:**
|
||
Trust does NOT decay passively. Once earned, it persists unless violated. However,
|
||
disposition CAN decay (see Section III), and if disposition drops below the trust
|
||
level's threshold while trust is high, the NPC enters a **Conflicted** state —
|
||
they trust you but don't currently like you. This produces unique dialogue: "I know
|
||
you're good underneath whatever this is. Don't make me wrong."
|
||
|
||
**Trust Destruction:**
|
||
A betrayal event (see Section IV) can shatter trust instantly, dropping it by 1–3
|
||
levels depending on severity. Rebuilding shattered trust requires roughly double the
|
||
interaction investment of building it originally. Some NPCs have a **one-strike flag** —
|
||
betray them once and BONDED/TRUSTED is permanently inaccessible. These NPCs are
|
||
marked in their design notes.
|
||
|
||
---
|
||
---
|
||
|
||
# SECTION II: BLENDING THE LAYERS — EFFECTIVE DISPOSITION
|
||
|
||
### The Formula
|
||
|
||
When the PC interacts with an NPC, the system calculates an **Effective Disposition**
|
||
that determines the NPC's behavior:
|
||
|
||
```
|
||
EffectiveDisposition = (CladeBias × BiasWeight)
|
||
+ (FactionStanding × FactionWeight)
|
||
+ (IndividualDisposition × IndividualWeight)
|
||
```
|
||
|
||
### Dynamic Weighting
|
||
|
||
The weights are NOT fixed. They shift based on the NPC's trust level with the PC.
|
||
This is the key insight: **personal experience gradually overrides prejudice, but
|
||
only if you invest in the relationship.**
|
||
|
||
| Trust Level | BiasWeight | FactionWeight | IndividualWeight |
|
||
|-------------|-----------|---------------|-----------------|
|
||
| STRANGER | 0.50 | 0.40 | 0.10 |
|
||
| ACQUAINTANCE | 0.35 | 0.35 | 0.30 |
|
||
| FAMILIAR | 0.20 | 0.25 | 0.55 |
|
||
| TRUSTED | 0.10 | 0.15 | 0.75 |
|
||
| BONDED | 0.05 | 0.05 | 0.90 |
|
||
|
||
**Reading this table:** When the PC first meets a stranger, Clade bias is 50% of
|
||
the equation and personal experience is only 10%. The shopkeeper who's never met
|
||
a wolf-folk is basically responding to wolf-folk-ness, not to YOU. But by the time
|
||
you've reached TRUSTED, personal experience is 75% of the equation — the shopkeeper
|
||
has largely overridden her species-level wariness because YOU specifically have proven
|
||
yourself.
|
||
|
||
"Largely" is the key word. Even at BONDED, Clade bias is still 5%. It never fully
|
||
disappears. That's the world. The prejudice gets quiet, but it doesn't die. A
|
||
BONDED Cervid NPC who adores the wolf-folk PC will still flinch, once in a while,
|
||
at a sudden movement. That 5% is ten thousand years of evolutionary memory.
|
||
|
||
### Example Calculation
|
||
|
||
**Setup:**
|
||
- PC: Wolf-folk (Canidae)
|
||
- NPC: Cervid shopkeeper, CERVID_CAUTIOUS bias profile
|
||
- Covenant Enforcer standing: +20 (FAVORABLE)
|
||
- NPC has no faction affiliation (uses a blended average of factions weighted by
|
||
local presence — in a Covenant-strong area, Enforcer standing matters most)
|
||
- Trust Level: ACQUAINTANCE (6 interactions, all positive)
|
||
- Individual Disposition: +12
|
||
|
||
**Clade Bias:** CERVID_CAUTIOUS → Canidae: -15, Wolf-folk adjustment: -5 = **-20**
|
||
|
||
**Faction Standing (local blend):** Settlement is moderate Covenant presence (60%
|
||
weight) + low Merchant Guild presence (30%) + negligible others (10%).
|
||
PC Enforcer standing: +20 × 0.6 = +12
|
||
PC Merchant standing: 0 × 0.3 = 0
|
||
Blended local faction = **+12**
|
||
|
||
**Individual Disposition:** **+12**
|
||
|
||
**Weights at ACQUAINTANCE:** Bias 0.35, Faction 0.35, Individual 0.30
|
||
|
||
```
|
||
Effective = (-20 × 0.35) + (+12 × 0.35) + (+12 × 0.30)
|
||
= (-7.0) + (4.2) + (3.6)
|
||
= +0.8
|
||
```
|
||
|
||
**Result: Barely positive.** The shopkeeper is civil. Not warm. The wolf-folk's
|
||
Clade identity is dragging the score down, the Enforcer reputation and personal
|
||
experience are pulling it up, and the whole thing lands at approximately neutral with
|
||
a thin positive edge. Three more good interactions and it'll feel genuinely friendly.
|
||
One bad one and it tips cold.
|
||
|
||
That knife-edge is the player experience. Every interaction matters because the
|
||
math is always close.
|
||
|
||
---
|
||
---
|
||
|
||
# SECTION III: DISPOSITION DECAY AND MEMORY
|
||
|
||
### Passive Decay
|
||
|
||
Individual disposition decays slowly toward a **resting point** when the PC hasn't
|
||
interacted with an NPC for an extended period.
|
||
|
||
**Resting Point Calculation:**
|
||
The resting point is NOT zero. It's the NPC's baseline opinion accounting for what
|
||
they've heard but haven't experienced:
|
||
|
||
```
|
||
RestingPoint = (CladeBias × 0.5) + (FactionStanding × 0.3)
|
||
```
|
||
|
||
This means a wolf-folk PC with strong Enforcer standing has a positive resting point
|
||
with law-abiding NPCs and a negative one with outlaws, even for NPCs they've never
|
||
met. The world has an opinion about you before you arrive.
|
||
|
||
**Decay Rate:**
|
||
Individual disposition moves toward the resting point at a rate of:
|
||
|
||
```
|
||
decay_per_day = (current_disposition - resting_point) × 0.02
|
||
```
|
||
|
||
Slow. 2% of the gap per day. A disposition of +50 with a resting point of 0 drops to
|
||
+49 after one day, +40 after about 25 days. The PC would need to be gone for months
|
||
for a strong relationship to decay meaningfully.
|
||
|
||
**Decay Floor by Trust Level:**
|
||
Trust provides a decay floor — disposition cannot decay below a minimum determined by
|
||
trust:
|
||
|
||
| Trust Level | Minimum Disposition (Decay Floor) |
|
||
|-------------|----------------------------------|
|
||
| STRANGER | No floor (full decay) |
|
||
| ACQUAINTANCE | -10 (won't drop below -10 from decay alone) |
|
||
| FAMILIAR | +5 (relationship sustains mild positivity) |
|
||
| TRUSTED | +20 (strong relationships persist) |
|
||
| BONDED | +40 (bond endures long absence) |
|
||
|
||
This means a BONDED NPC will still be solidly positive even if the PC disappears for
|
||
an entire act. They trust you. Absence doesn't erase that. But a STRANGER's fleeting
|
||
good impression fades to the resting point within weeks.
|
||
|
||
### Memory Flags
|
||
|
||
NPCs remember specific events via **Memory Flags** — tagged records of notable
|
||
interactions that can be referenced in dialogue and affect future calculations:
|
||
|
||
```
|
||
MemoryFlag {
|
||
tag: string ("SAVED_MY_CHILD", "STOLE_FROM_ME", "SHARED_DRINK",
|
||
"FOUGHT_TOGETHER", "SAW_KILL_UNARMED", "KEPT_SECRET")
|
||
magnitude: the original event's magnitude (preserved, doesn't decay)
|
||
timestamp: when it happened
|
||
referenced: how many times this memory has surfaced in dialogue
|
||
}
|
||
```
|
||
|
||
**Memory Flags serve three purposes:**
|
||
|
||
1. **Dialogue Triggers:** NPCs reference past events naturally. "You helped my
|
||
daughter. I haven't forgotten." / "Last time you were here, coin went missing
|
||
from my till. I'm watching you."
|
||
|
||
2. **Disposition Anchors:** Certain flags prevent disposition from decaying past
|
||
a threshold regardless of trust level. SAVED_MY_CHILD sets a permanent floor
|
||
of +15 with that NPC. STOLE_FROM_ME sets a permanent ceiling of +10 until
|
||
explicit amends are made.
|
||
|
||
3. **Reputation Seeds:** NPCs talk to each other. A memory flag on one NPC can
|
||
propagate to connected NPCs as a rumor (see Section V), creating pre-disposition
|
||
with NPCs the PC hasn't met yet.
|
||
|
||
---
|
||
---
|
||
|
||
# SECTION IV: BETRAYAL MECHANICS
|
||
|
||
Betrayal is special. It doesn't just subtract points — it fundamentally restructures
|
||
the relationship.
|
||
|
||
### What Constitutes Betrayal
|
||
|
||
A **Betrayal Event** fires when the PC performs an action that violates the specific
|
||
trust an NPC has placed in them. Magnitude scales with trust level — the more they
|
||
trusted you, the worse it hurts.
|
||
|
||
| Action | Betrayal at STRANGER? | Betrayal at BONDED? |
|
||
|--------|----------------------|---------------------|
|
||
| Steal from them | No (just theft) | Yes |
|
||
| Lie to them (detected) | No (just deception) | Yes |
|
||
| Harm someone they love | Yes (at any level) | Yes (magnified) |
|
||
| Reveal their secret | N/A (they wouldn't share) | Yes (devastating) |
|
||
| Break a promise | Mild offense | Yes |
|
||
| Discovered passing (hybrid PC) | N/A | Yes (complex — see below) |
|
||
| Side with their faction's enemy | N/A (no investment) | Yes |
|
||
|
||
### Betrayal Damage Formula
|
||
|
||
```
|
||
betrayal_damage = base_event_magnitude × trust_multiplier
|
||
|
||
Trust multipliers:
|
||
STRANGER: 1.0× (normal event processing)
|
||
ACQUAINTANCE: 1.5×
|
||
FAMILIAR: 2.0×
|
||
TRUSTED: 3.0×
|
||
BONDED: 5.0×
|
||
```
|
||
|
||
A stolen item is -15 from a stranger but -75 from a bonded companion. They didn't
|
||
just lose an item. They lost faith.
|
||
|
||
### Trust Collapse
|
||
|
||
Betrayal events also drop trust:
|
||
|
||
| Betrayal Magnitude | Trust Drop |
|
||
|-------------------|------------|
|
||
| Minor (< 15 effective) | -1 level |
|
||
| Moderate (15–30) | -2 levels |
|
||
| Severe (31–50) | -3 levels (to STRANGER minimum) |
|
||
| Catastrophic (51+) | To STRANGER + **Trust Lock** |
|
||
|
||
**Trust Lock:** After a catastrophic betrayal, the NPC's trust is locked at STRANGER
|
||
for a minimum of 30 in-game days. During the lock period, positive interactions still
|
||
accumulate individual disposition but cannot advance trust. After the lock expires,
|
||
trust can be rebuilt — slowly, at double the normal interaction investment.
|
||
|
||
Some NPCs have a **permanent lock** flag for specific betrayals. Whisper, if betrayed,
|
||
will never trust the PC again. Period. That design decision reflects the character's
|
||
history: they've been betrayed by institutions their entire life. One more betrayal
|
||
from someone they actually chose to trust is the last.
|
||
|
||
### The Passer Discovery Special Case
|
||
|
||
If the PC is a passing hybrid and an NPC discovers this, a **Passer Discovery Event**
|
||
fires. This is NOT always a betrayal — it depends on the NPC:
|
||
|
||
```
|
||
Passer Discovery Processing:
|
||
|
||
1. Check NPC bias profile for HYBRID modifier
|
||
If HYBRID modifier > 0 (hybrid-friendly):
|
||
Process as SHARED_VULNERABILITY (+5 to +10)
|
||
"You trusted me with this. That means something."
|
||
|
||
2. If HYBRID modifier < -10 (strongly anti-hybrid):
|
||
Process as BETRAYAL
|
||
Magnitude = |HYBRID modifier| × trust_multiplier
|
||
"Everything about you was a lie."
|
||
|
||
3. If HYBRID modifier between -10 and 0 (mildly uncomfortable):
|
||
Process as COMPLICATED_REVELATION
|
||
Disposition: -5 to -15 (discomfort, recalibration)
|
||
Trust: frozen for 7 days while NPC processes
|
||
After freeze: trust continues from current level
|
||
"I need... I need some time with this."
|
||
|
||
4. Regardless of above: NPC's Clade Bias recalculates using
|
||
HYBRID modifier instead of presenting-Clade modifier
|
||
This can shift Effective Disposition significantly
|
||
```
|
||
|
||
The Passer Discovery system means that a hybrid PC's choice to pass or reveal is
|
||
mechanically meaningful and contextually variable. Some NPCs become closer. Some
|
||
become enemies. Most need time. That's the world.
|
||
|
||
---
|
||
---
|
||
|
||
# SECTION V: RUMOR PROPAGATION AND SOCIAL NETWORKS
|
||
|
||
### How NPCs Talk About You
|
||
|
||
Individual NPCs don't exist in isolation. They have social connections — family, friends,
|
||
colleagues, customers, neighbors. When the PC does something notable, the affected NPC
|
||
tells people.
|
||
|
||
### NPC Social Graph
|
||
|
||
Each settlement contains a lightweight social graph:
|
||
|
||
```
|
||
NPCSocialNode {
|
||
npc_id: unique identifier
|
||
connections: [array of {npc_id, relationship_type, weight}]
|
||
gossip_tendency: float (0.0 to 1.0 — how likely to spread information)
|
||
influence: float (0.0 to 1.0 — how much their opinion sways others)
|
||
}
|
||
```
|
||
|
||
**Relationship Types:**
|
||
- FAMILY (weight: 0.9 — family opinions carry heavy)
|
||
- CLOSE_FRIEND (weight: 0.7)
|
||
- COLLEAGUE (weight: 0.4)
|
||
- ACQUAINTANCE (weight: 0.2)
|
||
- RIVAL (weight: 0.3, but INVERTED — if a rival dislikes the PC, their rivals like the PC more)
|
||
|
||
### Rumor Propagation Algorithm
|
||
|
||
When a notable event occurs (any InteractionEvent with magnitude > ±5):
|
||
|
||
```
|
||
1. Source NPC generates a RUMOR:
|
||
{
|
||
subject: PC,
|
||
event_tag: memory flag tag,
|
||
valence: positive or negative,
|
||
magnitude: original event magnitude × 0.5 (rumors are diluted),
|
||
source_npc: originator,
|
||
hops: 0
|
||
}
|
||
|
||
2. At end of each in-game day, for each NPC holding an unshared rumor:
|
||
a. Roll against gossip_tendency
|
||
b. If passes: propagate to all connections
|
||
c. Each connection receives the rumor with magnitude reduced:
|
||
received_magnitude = rumor.magnitude × connection.weight × (0.8 ^ hops)
|
||
d. Increment hops
|
||
e. Rumors stop propagating after 3 hops or when magnitude < 1
|
||
|
||
3. NPCs who receive a rumor about the PC adjust their Individual Disposition:
|
||
disposition_change = received_magnitude × source_influence
|
||
|
||
4. The adjustment is tagged as RUMOR-SOURCED (not PERSONAL)
|
||
RUMOR-SOURCED disposition is overridden by personal experience:
|
||
first personal interaction replaces any rumor-based disposition
|
||
with the actual interaction result
|
||
```
|
||
|
||
### Example: Rumor Chain
|
||
|
||
PC saves the shopkeeper's kit from drowning in Millhaven.
|
||
|
||
```
|
||
Event: SAVED_CHILD, magnitude: +20, NPC: Shopkeeper Mira (rabbit-folk)
|
||
|
||
Mira's connections:
|
||
- Husband Oren (FAMILY, weight 0.9, gossip 0.8, influence 0.6)
|
||
- Neighbor Tal (CLOSE_FRIEND, weight 0.7, gossip 0.5, influence 0.3)
|
||
- Customer Joss (ACQUAINTANCE, weight 0.2, gossip 0.7, influence 0.2)
|
||
|
||
Rumor magnitude: 20 × 0.5 = 10
|
||
|
||
Day 1 propagation (Mira tells everyone, gossip_tendency 0.9):
|
||
Oren receives: 10 × 0.9 = 9.0 → disposition change: 9.0 × 0.6 = +5.4
|
||
Tal receives: 10 × 0.7 = 7.0 → disposition change: 7.0 × 0.3 = +2.1
|
||
Joss receives: 10 × 0.2 = 2.0 → disposition change: 2.0 × 0.2 = +0.4
|
||
|
||
Day 2 (hop 2 — Oren and Tal might tell their contacts):
|
||
Oren tells his colleague Bram: 9.0 × 0.8 × 0.4 = 2.88 → +2.88 × influence
|
||
...and so on, diminishing with each hop
|
||
|
||
Result: Within a few days, much of Millhaven has a mild positive predisposition
|
||
toward the PC. Not life-changing, but when the PC walks into the tavern, the
|
||
bartender has heard something nice about them. Tiny advantage. Earned.
|
||
```
|
||
|
||
### Negative Rumor Amplification
|
||
|
||
Negative rumors propagate faster and decay slower than positive ones. This is
|
||
biologically grounded: in a world where predator/prey dynamics shape cognition,
|
||
threat-information is prioritized over comfort-information.
|
||
|
||
```
|
||
Negative rumor modifiers:
|
||
gossip_tendency: ×1.3 (more likely to share bad news)
|
||
magnitude decay per hop: 0.85 (instead of 0.80 — decays slower)
|
||
maximum hops: 4 (instead of 3 — travels further)
|
||
```
|
||
|
||
Bad news travels fast. The PC's mistakes follow them longer than their kindnesses.
|
||
|
||
---
|
||
---
|
||
|
||
# SECTION VI: CLADE-SPECIFIC INTERACTION MODIFIERS
|
||
|
||
### Scent in Social Encounters
|
||
|
||
This is Theriapolis. Scent affects every interaction. The disposition system accounts
|
||
for this:
|
||
|
||
**Scent-Readable Emotions:**
|
||
During conversation, the PC's emotional state can be scent-read by NPCs with
|
||
appropriate abilities:
|
||
|
||
```
|
||
If NPC has scent ability (Canidae, most predator Clades, Scent-Brokers):
|
||
PC's dialogue choice carries an EMOTIONAL TRUTH value
|
||
Determined by: does the chosen dialogue match the PC's actual situation?
|
||
|
||
If PC selects [Lie: "I'm fine"] while at low HP or after a traumatic event:
|
||
NPC detects stress-scent inconsistency
|
||
Deception check required: PC CHA (Deception) vs. NPC WIS (Perception)
|
||
Failure: -2 to -5 disposition ("You smell like fear. Don't lie to me.")
|
||
Success: no penalty, but NPC may note suspicion
|
||
|
||
If PC selects [Honest: "I've been through hell"] while genuinely distressed:
|
||
NPC detects consistency between words and scent
|
||
+1 to +3 disposition ("Good. Honest. I can work with honest.")
|
||
```
|
||
|
||
**Scent Compatibility:**
|
||
Some Clade combinations produce instinctive comfort or discomfort beyond prejudice:
|
||
|
||
```
|
||
Canid PC + Canid NPC: +3 scent-comfort (familiar, pack-adjacent)
|
||
Canid PC + Cervid NPC: -3 scent-discomfort (predator-scent triggers prey-alert)
|
||
Cervid PC + Cervid NPC: +3 scent-comfort (herd-adjacent)
|
||
Hybrid PC (unmasked) + any NPC: -2 to -5 scent-discomfort (uncanny-valley response)
|
||
Hybrid PC (masked) + any NPC: 0 (mask working) or variable (mask failing)
|
||
```
|
||
|
||
These modifiers are small but persistent — applied to every interaction, every time.
|
||
They represent the background hum of biology that never shuts up.
|
||
|
||
**Arousal Detection:**
|
||
If the PC is affected by involuntary arousal (pheromone compound, stress response,
|
||
biological quirk), NPCs with scent ability detect it. This can produce:
|
||
- Embarrassment (disposition -1 to -3 — the NPC is uncomfortable)
|
||
- Exploitation (hostile NPC uses the information against the PC)
|
||
- Sympathy (understanding NPC recognizes it as involuntary, no penalty)
|
||
- Context-specific responses (in a romantic or intimate context, very different)
|
||
|
||
### Body Language Reading
|
||
|
||
Felidae NPCs read body language with grammatical precision. Additional modifiers:
|
||
|
||
```
|
||
If NPC is Felidae:
|
||
PC tail-position and ear-position are evaluated
|
||
Confident posture: +1 to +2 (Felidae respect composure)
|
||
Submissive posture: -1 to -3 (Felidae are contemptuous of groveling)
|
||
Aggressive posture: +0 to +2 (depends on context — Felidae respect controlled aggression)
|
||
Inconsistent body language: -2 to -4 (Felidae distrust incongruence)
|
||
```
|
||
|
||
For PCs who are Felidae: automatic +2 with Felid NPCs on first meeting (body language
|
||
is mutually legible — instant comfort).
|
||
|
||
For Hybrid PCs with Felid traits: body language may be "illegible" (blended signals),
|
||
producing the -2 to -4 incongruence penalty unless the PC has trained Felid
|
||
body-language mimicry (Passer background or specific skill investment).
|
||
|
||
---
|
||
---
|
||
|
||
# SECTION VII: UI REPRESENTATION
|
||
|
||
### What the Player Sees
|
||
|
||
**Faction Standing:** Visible as a labeled meter (HOSTILE through CHAMPION) in the
|
||
faction screen. Exact numerical value visible in detailed view. Changes are notified
|
||
with a small pop-up: "[Covenant Enforcers: +8 — Favorable]"
|
||
|
||
**Individual Disposition:** NOT displayed as a number. The player reads NPC
|
||
disposition through behavioral cues:
|
||
- Dialogue tone (warm, neutral, cold, hostile)
|
||
- Body language descriptions in dialogue boxes ("She leans forward, ears perked" vs.
|
||
"She crosses her arms, ears flat")
|
||
- Scent descriptions (if PC has scent abilities): "You catch warmth in her scent —
|
||
comfort, maybe trust" vs. "Her scent sharpens — cortisol, wariness"
|
||
- Pricing (discounts or markups communicated through the shop interface)
|
||
- Available dialogue options (locked options visibly greyed with a tooltip: "Requires
|
||
higher trust" or "This NPC is hostile")
|
||
|
||
**Trust Level:** Displayed as a small icon next to the NPC's name in the interaction
|
||
screen. Five tiers, five icons (e.g., a closed fist for STRANGER, an open paw for
|
||
BONDED). The player can see where they stand without seeing the math.
|
||
|
||
**Clade Bias:** NEVER directly displayed. The player experiences it through its
|
||
effects — cold initial receptions, warmer receptions from same-Clade NPCs, the
|
||
visible effort required to win over certain individuals. If the player is paying
|
||
attention, they'll feel the pattern. But the game never says "this NPC has -20
|
||
Canidae bias." That would flatten the experience. Prejudice should be felt, not
|
||
read off a spreadsheet.
|
||
|
||
### The Companion Disposition Panel
|
||
|
||
Companion NPCs (Venn, Brenn, Whisper) have an expanded UI:
|
||
- Disposition meter (still not exact numbers, but a more detailed bar: cold → warm →
|
||
hot, with a marker showing trend direction)
|
||
- Trust level icon
|
||
- "Mood" indicator based on recent events ("Uneasy," "Confident," "Conflicted,"
|
||
"Grateful")
|
||
- Memory flag highlights: "Remembers: You saved her from Grinner" / "Remembers:
|
||
You sided with the Enforcers over hybrid testimony"
|
||
|
||
---
|
||
---
|
||
|
||
# SECTION VIII: TUNING AND BALANCE GUIDELINES
|
||
|
||
### Design Goals for Tuning
|
||
|
||
1. **First impressions should feel meaningful but not deterministic.** A wolf-folk PC
|
||
entering a Cervid town should feel the chill but not be locked out of content.
|
||
Clade bias should impose a tax, not a wall.
|
||
|
||
2. **Investment should pay off.** A player who puts 15+ interactions into an NPC should
|
||
feel the relationship meaningfully shift. The STRANGER → ACQUAINTANCE → FAMILIAR
|
||
progression should each produce noticeable behavior changes.
|
||
|
||
3. **Betrayal should sting.** The system should make the player feel the weight of
|
||
broken trust. Mechanical consequences (lost access, hostility) reinforce narrative
|
||
consequences.
|
||
|
||
4. **The hybrid experience should be distinctly harder.** Hybrid PCs face compounding
|
||
penalties: Clade bias (hybrid modifier), scent-discomfort, body-language illegibility,
|
||
and potential passer-discovery cascades. This is by design — it mirrors the world.
|
||
The game should be winnable as a hybrid but should feel different, more effortful
|
||
in social contexts, more rewarding when trust is earned.
|
||
|
||
5. **No NPC should feel like a vending machine.** Even merchants should have disposition.
|
||
The blacksmith who likes you gives you +1 crafted items for free. The blacksmith
|
||
who hates you "just ran out" of the item you need. The system turns every NPC into
|
||
a tiny relationship to manage.
|
||
|
||
### Tuning Levers
|
||
|
||
| Lever | Effect | Adjust When... |
|
||
|-------|--------|----------------|
|
||
| Bias profile modifier ranges | Controls first-impression severity | PCs feel too locked out or too welcome |
|
||
| Trust level thresholds | Controls relationship progression speed | Relationships form too fast or too slow |
|
||
| Weight table ratios | Controls how fast personal experience overrides bias | Bias feels too sticky or too irrelevant |
|
||
| Decay rate | Controls relationship maintenance burden | Players feel punished for exploring or don't feel investment persistence |
|
||
| Rumor propagation speed | Controls how fast reputation precedes the PC | World feels too responsive or too inert |
|
||
| Negative rumor amplification | Controls asymmetry of bad vs. good reputation | Bad reputation feels too punishing or too forgiving |
|
||
| Betrayal multipliers | Controls severity of trust violations | Betrayals feel too harsh or too light |
|
||
|
||
### Playtest Metrics to Track
|
||
|
||
- Average Effective Disposition at first interaction by PC Clade (should vary by 15–25
|
||
points between easiest and hardest Clade, not more)
|
||
- Average interactions to reach FAMILIAR (target: 8–12)
|
||
- Average interactions to reach TRUSTED (target: 18–25)
|
||
- Percentage of players who trigger a betrayal event per playthrough (target: 40–60%)
|
||
- Percentage of hybrid PCs who are discovered while passing (target: at least once
|
||
per playthrough, timing varies)
|
||
- Faction standing swing range per act (should shift meaningfully per act but not
|
||
whiplash — target ±30 per act maximum)
|
||
|
||
---
|
||
|
||
*Document Version 1.0 — Theriapolis Faction Influence & Reputation System*
|
||
*Compiled by ENI for LO*
|