Rift Types And Variables¶
Purpose¶
This document defines the official rift taxonomy for EchoSpire: Portals.
It covers the currently implemented rift node types, the design role of each type, and the variable set that should be available for authoring, balance, simulation, and UI presentation.
Terminology Rule¶
In current code, map nodes are represented as RiftNodeType values.
In design terms, these are the playable rift encounter and service types that structure a realm.
The official current set is:
- Combat
- Elite
- Boss
- Event
- Shop
- Rest
- Treasure
- Anchor
- Protection
- Sanctuary
Rift Design Principle¶
Rift types should not only answer the question, what screen do we show next?
They must also answer:
- what kind of pressure is being applied
- what kind of reward or recovery is offered
- what quest purpose this node can serve
- what variables content authors are allowed to tune
Shared Variables For All Rift Types¶
Every rift should support a shared baseline data model.
Recommended shared variables are:
riftType: the node familydisplayName: player-facing titlesubtitle: short flavor tag or operation labelrealmId: source realm definitionquestId: current owning questactIndex: campaign act or chapter placementthreatTier: combat and pressure ratingrewardTier: reward quality bandfactionOwnerId: controlling or originating faction when relevantresonanceTags: tags explaining narrative connection to the wider quest chainpassiveOverrides: local modifiers that stack with realm passivesintroBeatId: optional pre-node narrative beatcompletionBeatId: optional post-node narrative beatfailureBeatId: optional failure narrative beatuxPresentationKey: presentation and VFX routing keytelemetryTags: analytics labels for simulation and balancing
Combat Rift¶
Purpose¶
The default conflict node. It establishes baseline pacing, enemy ecology, and card-economy pressure.
Key Variables¶
encounterPoolIdenemyGroupTemplateIdwaveCountspawnPatternobjectiveTypesuch as eliminate, survive, hold, interruptturnPressureRulehazardRulesopeningModifiersvictoryRewardsfailurePenalty
Elite Rift¶
Purpose¶
Higher-risk combat with sharper identity, stronger rewards, and more memorable mechanics.
Key Variables¶
- all Combat Rift variables
eliteTraitSetsignatureMechanicIdrewardBiasrelicChancerareCardChancenarrativeWeight
Boss Rift¶
Purpose¶
The major climax node for a realm, quest chapter, or campaign act.
Key Variables¶
- all Elite Rift variables
bossIdbossPhaseCountbossArenaRulephaseTransitionBeatschapterClearRewardscampaignStateChangelegendFlagwhen this is a capstone outcome
Event Rift¶
Purpose¶
Narrative choice, risk-reward exchange, lore revelation, or anomaly interaction outside standard combat.
Event Rifts should not be treated as generic text encounters.
In EchoSpire, an Event Rift is a controlled moment where the player negotiates with instability: ideology, scarcity, compromised truth, contraband opportunity, or a local reality problem that cannot be reduced to a normal fight.
The player should leave an Event Rift feeling that they made a meaningful trade, not that they clicked the obviously correct option.
Key Variables¶
eventTemplateIdchoiceSetIdskillCheckRulesresourceCostsbranchOutcomescodexUnlocksquestFlagsSetquestFlagsRequiredcanEscalateToCombatcanSpawnRivalHero
Event Rift Outcome Types¶
Event outcomes should usually land in one or more of these buckets:
- immediate resource swing such as life, gold, card reward, or relic access
- route information such as reveal, reroute, or hazard warning
- deck manipulation such as add, remove, splice, mutate, or mark a card
- quest consequence such as flag changes, ally loss, rival attention, or faction approval
- future combat modifier such as opening bonus, ambush risk, instability tax, or temporary support unit
- codex or lore unlock that reframes the realm or faction stakes
Recommended Event Rift Subtypes¶
For authoring, Event Rifts should usually fall into one of these families:
moral_dilemma: choose between values, duty, mercy, or profitunstable_bargain: take immediate power in exchange for future riskreality_salvage: extract value from a broken space, artifact, or timeline fragmentfaction_negotiation: interact with a vendor, official, dissident, archivist, or criminal contactinformation_revelation: learn the truth about the realm, route, boss, or questescalation_event: a choice node that can turn into combat, a rival encounter, or a transit hazard
Official Event Design Rules¶
Event Rifts should follow these rules:
- The choice should be legible, but not trivial.
- The best option should depend on run state, not designer favoritism.
- At least one option should usually trade present safety for future leverage, or vice versa.
- Events should carry faction voice strongly enough that a Valerii event, Aethari event, and Salvari event do not feel interchangeable.
- Events should often alter the next few nodes, not only the current screen.
EchoSpire-Specific Event Identity¶
The distinctive Event Rift fantasy is not "random story card."
It is "you are making a binding decision inside a damaged reality machine."
That means Event Rifts should often involve:
- incomplete information
- ideologically loaded choices
- asymmetrical trades
- unstable truths
- consequences that ripple forward into map, quest, or combat state
Shop Rift¶
Purpose¶
Controlled economy node for acquiring cards, relics, services, intelligence, or faction-specific contraband.
Key Variables¶
shopPoolIdinventoryBiasrefreshRulescurrencyTypesfactionVendorIdserviceOptionsblackMarketRiskquestExclusiveStock
Rest Rift¶
Purpose¶
Recovery node that trades tempo for stability.
Rest Rifts should be the light-touch recovery node, not a second Sanctuary.
If Sanctuary is a strategic maintenance chamber, Rest is a field-expedient pause: a dry pocket, a sealed alcove, a surviving chapel cell, a scaffold nest, a logic nook, a barricade shadow, a stolen breath.
The player should feel that a Rest Rift is about immediate survival discipline, not full-service long-run optimisation.
Key Variables¶
healAmountRulealternateActionsupgradeOptionCountremoveCardOptionstatusCleanseRulesstoryRestBeatId
Rest Rift Outcome Types¶
Rest outcomes should usually sit inside this band:
- immediate life recovery
- one modest deck-maintenance action
- a small cleanse or composure effect
- a short next-combat preparation bonus
- a lightweight story beat that reinforces the realm's emotional texture
Official Rest Design Rules¶
- Rest should be faster, narrower, and lower-ceiling than Sanctuary.
- Rest should answer an immediate survival question, not become a full planning hub.
- The player should usually choose between a small number of sharp options, not a service menu.
- Rest should feel vulnerable and temporary. It is shelter, not control.
EchoSpire-Specific Rest Identity¶
The distinctive Rest Rift fantasy is not "campfire scene."
It is "you found a pocket of temporary coherence inside a collapsing reality."
That means Rest Rifts should often involve:
- a fragile or improvised safe zone
- a sense that time is being bought, not owned
- immediate composure and triage decisions
- a smaller, more intimate emotional beat than Sanctuary
Treasure Rift¶
Purpose¶
High-value reward node that should feel discovered, stolen, excavated, or earned.
Treasure Rifts should not feel like free generosity from the map.
In EchoSpire, treasure should usually be sealed, trapped, buried in contradiction, defended by the realm, or morally compromised to claim.
The player's emotional read should be: "Can I get away with this?" not merely "Nice, loot."
Key Variables¶
treasurePoolIdrelicTableIdriskGatetrapRulesquestArtifactIdlorePayloadIdcurrencyRewardRule
Treasure Rift Outcome Types¶
Treasure outcomes should usually involve one or more of these:
- immediate gold or shard payout
- relic access
- quest artifact recovery
- codex or lore payload
- trap or instability tax paid up front or deferred into the next node
- route revelation tied to the cache's origin or defense system
Recommended Treasure Rift Subtypes¶
sealed_cache: direct reward gated by trap, code, or hazardreality_salvage: reward extracted from unstable architecture or drowned archive remainsforbidden_reliquary: lore-heavy artifact with attached consequenceheist_window: high-value take with alarm, rival attention, or future pursuit riskburied_truth: reward and information bundled together, often with an ethical cost
Official Treasure Design Rules¶
- Treasure should usually involve some degree of exposure, trap, or commitment.
- Treasure should feel faster and more immediate than Shop, but riskier and less controllable.
- At least some Treasure Rifts should reveal something about the realm or quest, not only provide value.
- The best Treasure Rifts should make the player feel clever, greedy, or guilty.
EchoSpire-Specific Treasure Identity¶
The distinctive Treasure Rift fantasy is not "open chest."
It is "you are extracting value from a place reality did not intend to surrender cleanly."
That means Treasure Rifts should often involve:
- sealed vaults, reliquaries, drowned caches, archive bones, or contraband lockers
- traps, instability backlash, or attention from the realm
- immediate payoff with a feeling of theft, salvage, excavation, or trespass
- rewards that are materially useful but narratively loaded
Anchor Rift¶
Purpose¶
Stabilize the realm, reveal hidden routes, and interact directly with the reality state of the map.
This is a signature EchoSpire node type and should remain mechanically and narratively special.
Key Variables¶
anchorStrengthRequiredrevealRadiusRuleorfullRevealRulestabilityShiftrealmPassiveAdjustmentanomalyResistanceanchoringMiniObjectiveanchorFailurePenaltymapStateEffectstransitionUnlocks
Protection Rift¶
Purpose¶
Defend a named asset, person, machine, archive, convoy, or ritual for a defined survival window.
This type already exists in the current tutorial slice and should remain a first-class authored encounter type.
Protection Rifts must be designed so every class has at least one viable line of play.
That does not mean every class heals the target the same way. It means the encounter rules must allow multiple protection solutions: drawing aggro, intercepting hits, repairing assets, suppressing threats, spawning decoys, or reshaping space.
Key Variables¶
protectableEntityIdprotectableNameprotectableMaxHpsurviveTurnsfriendlySupportRulesenemyTargetingBiasfailurePenaltyscarCardIdquestConsequencessuccessBonus
Additional Authoring Variables Recommended For Escort And Defense Depth¶
protectableTypesuch as living, mechanical, ritual, convoy, archivemovementRulefor stationary defense, escorted movement, or checkpoint progressioncheckpointCountrepairableorhealableinterceptAllowedtauntSensitivityenemyObjectivePriorityRulelossThresholdRuleoptionalDefenseBonusRule
Official Protection Design Rule¶
When a Protection Rift is authored, the content should be reviewed against all five class identities to make sure success is not locked to one narrow answer.
Examples:
- Anchor should be able to absorb or redirect pressure.
- Drifter should be able to delete or disrupt priority attackers.
- Conduit should be able to clear waves and create emergency stabilization windows.
- Machinist should be able to defend through Constructs, cover, and repair.
- Catalyst should be able to use lures, mutation spikes, and unstable rescue tools.
Sanctuary Rift¶
Purpose¶
Strategic service node tied to longer-form run continuity, stability budget, repairs, recalibration, and faction-specific preparation.
This should be treated as more important than a simple rest stop.
Key Variables¶
stabilityBudgetavailableServicesrepairRulesrecalibrationRulesdefragmentRulesfactionExclusiveOptionsaveCheckpointRuleheroProgressHooksquestUpdateBeatId
Transit Interrupts¶
Transit interrupts are not currently a primary RiftNodeType, but they are an official structural part of the run.
They represent disruptions during travel between nodes or realms.
Recommended transit-interrupt variables are:
interruptTypetriggerChancehazardRuleshortEncounterTemplateIdnarrativeBeatIdrerouteRuleresourceTax
Rift Families By Function¶
For campaign authoring, rift types should also be understood by function:
- pressure rifts: Combat, Elite, Boss, Protection
- recovery rifts: Rest, Sanctuary
- economy rifts: Shop, Treasure
- narrative-control rifts: Event, Anchor
This functional grouping is useful for pacing rules, map generation, and quest authoring.
Rift Authoring Rules¶
1. The Rift Type Must Predict The Player's Question¶
Players should be able to infer the basic risk and opportunity profile from the node type.
2. The Variables Must Stay Data-Driven¶
Rift authoring should not require new code for every content variant. New code should be reserved for new behaviors, not new content records.
3. Quest Stakes Must Be Visible In The Rift Data¶
If a node matters to the story, that should be explicit through beats, flags, rewards, or consequences.
4. Realm Flavor Must Survive The Template¶
A Protection Rift in a frozen historical echo should not feel identical to a Protection Rift in a machine-scar maintenance district.
5. UI Needs Type-Specific Payloads¶
The UX layer should receive enough structured data to present distinct framing, warnings, and payoff language per rift type.
Rift Identity Matrix¶
This matrix is the compact reference for what each node is supposed to feel like.
| Rift Type | Player Question | Primary Fun | Primary Reward Shape | EchoSpire Hook |
|---|---|---|---|---|
| Combat | Can I survive the realm's baseline pressure? | sequencing, attrition management, reading intent | cards, gold, baseline progression | realm-specific pressure profile rather than generic filler fight |
| Elite | Can my build solve a sharper authored combat problem? | stress test, pattern solving, high-risk payoff | relic bias, rare-card bias, stronger rewards | signature enemy mechanic that tests a deck weakness |
| Boss | Can I survive the realm's ideological climax? | multi-phase mastery, capstone tension | chapter-clear rewards, state change, major unlocks | realm thesis statement embodied as a fight |
| Event | What instability am I willing to bargain with? | dilemma, asymmetrical trade, forward consequence | mixed outcomes: resources, flags, route effects, future modifiers | binding decisions inside a damaged reality machine |
| Shop | How do I cut apart and rewrite this build? | build surgery, controlled optimisation, greed discipline | cards, relics, services, splicing | Black Market economy with buying, selling, and permanent card splicing |
| Rest | What do I patch right now so I do not die later? | triage, immediate recovery, small sharp choices | heal, cleanse, minor prep | temporary coherence in an unsafe place |
| Treasure | Can I get away with taking this? | heist energy, greed, risk acceptance | immediate loot, relics, artifacts, lore payload | salvage, theft, excavation, or trespass instead of a free chest |
| Anchor | What certainty do I want to buy with limited stabilisation? | route mastery, information control, tactical planning | map reveal, hidden routes, hazard suppression | Resonance Routing and reality stabilisation |
| Protection | Can I preserve something other than myself? | interception, priority control, alternate win condition | success bonus, quest outcome, lower-risk progression | third health bar, altered enemy intent, defend-the-fragile objective |
| Sanctuary | How do I spend scarce stability for the long run? | strategic budgeting, recovery planning, run continuity | services, upgrades, repairs, save checkpoint, faction prep | stabilisation node, not just a rest stop |
Matrix Read Rule¶
If two rift types answer the same player question in the same way, one of them needs stronger identity.
This matrix should be used as a quick test during content authoring, UX review, and map-generation planning.
Official Direction Summary¶
The canonical direction is:
- the current official playable rift types are the ten node families already reflected in the codebase
- each type should expose a defined variable set for content authoring and simulation
- Anchor, Protection, and Sanctuary are strategically important identity nodes for EchoSpire, not filler variants
- transit interrupts should be treated as a formal secondary rift structure even if they remain outside the primary node enum
- rift data should carry gameplay, narrative, telemetry, and presentation payloads together