Skip to content

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.

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 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.