Consent Tracker¶
The Invisible Spine¶
The consent tracker is NOT a morality system with a different name. A morality system assigns values to actions (good +10, evil -10). The consent tracker records facts about what happened. The facts have no score. The facts are history.
The endings, the factions, and the world read the history and draw their own conclusions — different conclusions depending on who's reading. The same absorption history that makes one faction welcome the player makes another faction hostile. The same history that produces a devastating Elevation ending produces a triumphant one on a different path. The data is neutral. The interpretation is everywhere.
This is the mirror. The tracker reflects. The world concludes.
The tracker is the backend. The player never sees it directly. What the player sees is the faction reputation system — the 27 different readings of the same actions. The tracker feeds the reputation. The reputation feeds the world. The world feeds the player. The player feeds the tracker. One loop.
What Gets Recorded¶
Every absorption produces one record. The record captures observable facts — things a witness could see, things the physics produced, things the game world knows happened. No internal judgments. No hidden scores. Just what occurred.
The Being¶
| Field | What It Stores | Why It Matters |
|---|---|---|
| Race | Angel, demon, human, hybrid (+ subtype) | Factions care about WHO was absorbed, not just that someone was |
| Faction | Which of the 27 factions, or unaffiliated | The faction loses a member. Their response depends on their values. |
| Significance | Fodder, mini-boss, boss | The weight of the perspective gained. A boss absorption reshapes the Judas composition more than a fodder absorption. |
| Name | Named beings carry identity | Absorbing "an angel soldier" is different from absorbing Metatron. The release ending puts them back with their name. |
| Relationship | How much the player knew them before absorption | Talked to? Researched? Traveled with? Total stranger? The gap between knowledge and destruction. |
The Consent State¶
Not a binary. Not a score. A state — the observable condition of the being at the moment of absorption. Determined by the physics and the interaction history. The game records what it saw.
| State | What Happened | Determined By |
|---|---|---|
| Offered | The being approached and volunteered unprompted | The being initiated contact. The player didn't close the gap — the being did. |
| Willing | The being accepted after conversation. The player asked or the topic arose. The being agreed. | Talk preceded absorption. The being had time and information. |
| Surrendered | The being stopped fighting. Dropped weapons. The player absorbed a non-combatant by choice. | Combat ended before absorption. The being was no longer a threat. |
| Defeated | The being was beaten in fair combat — staggered, disarmed, or exhausted. The player absorbed after winning the fight. | Combat preceded absorption. The player won. The being was still conscious. |
| Merciful | The being was suffering — dying, corrupted, in unresolvable pain. Absorption ends the suffering. | The being's condition made continuation cruel. The Unchosen dying from internal war. A mortally wounded soldier. |
| Fleeing | The being was attempting to escape. The player pursued and absorbed. | The being's physics state was moving away from the player. The gap was closing against the being's movement. |
| Helpless | The being was incapacitated — pinned, restrained, unconscious, trapped. | The being had no ability to resist or flee. Zero agency. |
| Ambushed | The player initiated absorption without the being's awareness. No combat. No conversation. | The being didn't see the player approach. First contact was absorption. |
| Betrayed | The being trusted the player — faction ally, welcomed the player, shared hospitality. The player absorbed them. | The relationship state was positive. Trust preceded absorption. |
The states are determined by the physics and the game systems — not assigned by a designer per encounter. The combat system produces the combat state (defeated, surrendered, fleeing, helpless). The Talk system produces the relationship state (offered, willing, betrayed). The world state produces the context (merciful, ambushed). The tracker reads the systems. It doesn't override them.
The Context¶
| Field | What It Stores | Why It Matters |
|---|---|---|
| Initiation | Who started the violence — the player, the being, a third party, or nobody (non-combat absorption) | "They attacked first" reads differently from "the player attacked first." Both are facts. |
| Witnesses | Which entities observed the absorption — entity references with faction affiliations | Information propagates through witnesses to factions. No witnesses = the faction doesn't know. See faction reputation. |
| Location | Where — faction territory, neutral ground, Eden, a specific circle | Absorbing someone in their own home reads differently from a battlefield. |
| Act | When in the story — Act 1 through Act 7 | Early absorptions carry different weight than late ones. The player's knowledge at the time matters. |
| Prior kills | How many non-absorption kills happened in the same encounter | A player who killed ten and absorbed one tells a different story than one who absorbed one and spared nine. |
What Gets Derived¶
The raw records are the database. Everything else is a query — a perspective reading the facts and drawing conclusions. Different perspectives read differently. The same data produces different results depending on who's asking.
The Absorption Counter¶
The simplest derivation. A count. The number on screen.
The counter doesn't know about consent. It counts. The player decides what the number means — achievement or guilt. The counter is the only piece of the tracker the player sees directly during gameplay. And it tells them almost nothing about what the tracker actually contains.
When God enters The River, the counter drains to zero. The records don't drain — they persist. The counter is a UI element. The history is permanent. The number can go to zero. The facts can't.
Judas composition¶
Every absorption flows through Judas. The Judas personality model is a function of what was absorbed — weighted by significance.
The composition vector:
| Dimension | Fed By | Effect on Judas |
|---|---|---|
| Angel weight | Sum of angel absorptions × significance | Higher → Judas speaks with more structure, certainty, duty. Guidance feels like orders. |
| Demon weight | Sum of demon absorptions × significance | Higher → Judas speaks with more analysis, edge, rage. Guidance feels like strategy. |
| Human weight | Sum of human absorptions × significance | Higher → Judas speaks with more uncertainty, empathy, doubt. Guidance feels like questions. |
| Consent skew | Ratio of forced to willing absorptions | More forced → Judas becomes more acquisitive. "Take more. You need it." More willing → more contemplative. "They gave you everything." |
| Total volume | Raw count | Higher → more noise. More contradictory perspectives. The signal degrades. Judas becomes harder to parse. |
Significance multipliers:
| Significance | Multiplier |
|---|---|
| Fodder | 1x |
| Mini-boss | 5x |
| Boss | 25x |
Absorbing Lucifer (boss, demon, 25x) shifts the demon weight dramatically. Judas after Lucifer's absorption carries Samael's wound — the rage, the loss, the blindness. A player who absorbed mostly angels and then absorbs Lucifer gets a Judas that lurches. The companion the player knew becomes someone else.
The restraint baseline: Minimal absorptions = baseline Judas — the default personality from birth. Low volume. Low noise. Familiar. Reliable. The Judas the player trusts. The Judas whose resistance at The River is the most effective betrayal — because the player trusts that voice.
Faction Reputation¶
The tracker feeds the faction reputation system. Each faction reads the absorption records they're aware of (through witness propagation) and calculates independent fear and trust values. The same record produces different reactions from different factions.
World Awareness¶
Aggregate of all faction stances. How the merged world as a whole perceives the player — a composite of 27 independent readings, propagated through rumor and cross-faction contact.
What the Endings Read¶
At the Throne, the full record is available — every absorption, every consent state, every context field. True God has complete information. Real God has extensive information. Both read the tracker.
The Pattern¶
Not any single entry — the shape of the entire history. A player who started forced and shifted to willing over 80 hours tells a different story than a player who started willing and shifted to forced. The trajectory matters as much as the total.
The Composition¶
Who was absorbed. How many angels, demons, humans, hybrids. The player who absorbed mostly one race has a different relationship to that race's ending. Annihilating the angels and demons hits differently when you've been inside most of them.
The Consent Distribution¶
The ratio of states. A player whose record is 80% offered/willing and 20% defeated has a different moral position than a player whose record is 80% ambushed/betrayed and 20% willing. Not a better position. A different one.
The Specific Entries¶
Was Lucifer willing or forced? Was Gabriel absorbed or spared? Was Metatron's sacrifice accepted? These specific entries directly change the narrative framing of specific endings.
The Gaps¶
What the player DIDN'T absorb. The beings who are alive because the player chose restraint. The factions intact because the player walked past. The absence of records is itself a record. A player with 50 absorptions and a player with 500 absorptions have different relationships to every ending — and the 50-absorption player's gaps mean less information at the Throne. The restraint that spared lives also limited understanding.
The Release Query¶
If the player releases beings, the system reads the original absorption record for each. The released being's response is informed by their consent state. A being who offered themselves responds differently from one who was ambushed. The record persists through release — the history doesn't change when the being returns. The release ending IS the consent tracker made visible — every being walks out carrying the facts of how they were taken, and those facts determine what they say to the God who took them.
ECS Architecture¶
The first game-layer system specified for HellspawnEngine.
Components¶
AbsorptionRecord — event component, one per absorption:
| Field | Type | Description |
|---|---|---|
| Race | enum | Angel, Demon, Human, Hybrid |
| HybridSubtype | enum (nullable) | AngelHuman, DemonHuman, AngelDemon |
| Faction | enum | The 27 factions + Unaffiliated |
| Significance | enum | Fodder, MiniBoss, Boss |
| Name | string (nullable) | Named beings only |
| ConsentState | enum | Offered, Willing, Surrendered, Defeated, Merciful, Fleeing, Helpless, Ambushed, Betrayed |
| Initiator | enum | Player, Being, ThirdParty, None |
| Witnesses | entity[] | References to witness entities with faction IDs |
| Location | WorldPosition + TerritoryID | Where it happened |
| Act | int (1–7) | When in the story |
| PriorKillsInEncounter | int | Non-absorption kills in the same fight |
| RelationshipDepth | enum | Unknown, Seen, Talked, Researched, Traveled |
| Timestamp | float | Game time |
JudasState — singleton, updated on every absorption:
| Field | Type | Description |
|---|---|---|
| AngelWeight | float | Cumulative angel absorption weight |
| DemonWeight | float | Cumulative demon absorption weight |
| HumanWeight | float | Cumulative human absorption weight |
| ConsentSkew | float | -1.0 (all forced) to +1.0 (all willing) |
| TotalVolume | int | Raw absorption count |
| PersonalityVector | float[] | Derived from weights — drives dialogue selection, warning style, River resistance |
Systems¶
AbsorptionRecordingSystem — triggers at the moment of absorption. Reads combat state, relationship state, witness list, and location from the ECS. Creates the AbsorptionRecord. This is the bridge between the combat physics and the narrative consequence.
JudasCompositionSystem — triggers after recording. Updates Judas weights based on the new absorption. Recalculates the personality vector. The voice selection system reads the personality vector to determine dialogue.
ConsentStateResolver — determines the consent state from the current game state at the moment of absorption. Reads: - Combat system: is the being fighting, staggered, disarmed, fleeing, incapacitated? - Talk system: did the player speak to this being? Did the being offer themselves? - Relationship system: does the being's faction trust the player? - World state: is the being suffering, dying, corrupted?
The resolver doesn't assign morality. It reads the observable state and selects the matching consent enum. The physics produces the state. The resolver names it.
The Principle¶
The consent tracker IS the game's morality — not as a system that judges, but as a history that remembers. The player acts. The tracker records. The factions react. The endings read. The player reflects.
No score. No meter. No alignment. No karma. Just what happened, stored honestly, read differently by every perspective that encounters it.
The same architecture as the game's theology: one truth, multiple interpretations, none endorsed.
The game is a mirror, not a judge. The consent tracker is the mirror's memory. It remembers what stood in front of it. It doesn't decide what it saw.