The Stellar Memory system is one of Star Savior's most complex mechanics. It combines three overlapping concepts -- Base Stats, Potentials (passive abilities), and Blessings (inherited stat bonuses) -- into a single UI that many players find confusing. This guide breaks down each system, how they interact, and what actually happens when you start a Journey.
Three Different Things (That Look the Same)
When you open a Stellar Memory detail page, you see tabs for Stats, Potential, and Blessing. These are three distinct systems that share the same data type internally (NKCSePoten class) but serve different purposes:
| Tab | What It Is | Filter Condition | Source |
|---|---|---|---|
| Stats | Base ATK/HP/DEF/SPD from the memory's grade | Always shown | Journey grade + templet base stats |
| Potential | Leveled-up passive abilities (battle effects) | level > 0 | Upgraded with Potential Points (PP) |
| Blessing | Stat bonuses inherited from parent/ancestor units | value > 0 | Server assigns from parent data |
// Tab 0: Stats -- base stats from grade
OBF_31681() -> statBundle calculation
// Tab 1: Potential -- SE passives the player has leveled up
OBF_6179() -> filter by OBF_33437 > 0 (has level)
// Tab 2: Blessing -- stat bonuses from ancestors
OBF_27095() -> filter by OBF_4421 > 0 (has value)
The key difference in plain terms: Potentials (like 25% Damage Up, 15% Crit Rate) are the powerful battle buffs that you actively upgrade using Potential Points (PP). Blessings are small flat stat bonuses (+10 to +50 ATK/HP/DEF) that are automatically assigned by the server when a parent's blessing is inherited during a journey succession event. Both are active at the same time during battle, but only Potentials require your PP investment.
Starting a Journey: Selecting Stellar Memories
Before starting a Journey (Stellar Memory scenario), you must select 2 Stellar Memories from your collection. These become the "ancestors" (parents) for that journey run. For the full journey structure and turn-by-turn breakdown, see the Journey System Guide.
- The selection screen (
NKCSubPageStellarMemorySelector) has exactly 2 slots - An auto-fill button picks the highest-power stellar memories, grouped by unit, sorted descending by power
- A "Gene" button opens a popup showing parent/ancestor blessing info
- The 2 selected memories determine which units and blessings are available during the journey
[RequiredListLength(2)]
public OBF_0495[] OBF_15501_stellarMemories; // exactly 2 slots
// Auto-fill: highest power, grouped by unit, descending
// JourneyStartCondition builds leader list from:
// 1. Default player unit
// 2. Leader unit
// 3. The 2 selected stellar memory units (reversed)
The 4-Slot Battle Deck
During a Journey, you fight battles using a 4-slot deck. The server populates these slots at the start of each journey. Some slots may be locked initially and become unlocked through blessing succession events.
private readonly List<OBF_25083> OBF_24840 = new(4); // 4 deck slots
// Server sends 4 slots at journey start:
OBF_24840.Clear();
OBF_24840.AddRange(OBF_14524.OBF_20430); // from server response
// Filtered view (only non-empty slots):
public IEnumerable<OBF_33715> OBF_2917 => OBF_4055.Where(e => e.OBF_11444 != null);
The BlessJoin popup (NKCPopupBlessJoin) handles the unlock animation: it clears the joining unit's current slot, plays an unlock effect, then places the unit into that slot. Locked slots get a lock visual overlay.
Blessing Succession (Inheritance)
Throughout a Journey, parent blessings can "join" your battle deck. This is the succession system -- it is configured per-turn in the journey templet data.
Succession Types
Each journey turn has a BlessSuccessionType that determines what happens:
| Type | Enum Value | What Happens |
|---|---|---|
| BST_NONE | 0 |
No succession this turn |
| BST_START | 1 |
A parent's blessing joins at journey start (plays BlessSuccessionCutscene, then transitions to Succession scene) |
| BST_JOIN_1 | 2 |
First parent's blessing joins mid-journey (plays BlessJoinCutscene, unlocks deck slot) |
| BST_JOIN_2 | 3 |
Second parent's blessing joins mid-journey (same as JOIN_1 but for second parent) |
public enum OBF_26539 {
BST_NONE, // No succession
BST_START, // Succession at journey start
BST_JOIN_1, // First ancestor joins mid-journey
BST_JOIN_2 // Second ancestor joins mid-journey
}
Battle Score Override
When a parent joins via BST_JOIN_1 or BST_JOIN_2, the battle score is overridden with that parent's score. This means the journey's difficulty/power rating adjusts based on which ancestor joins.
public OBF_22341 OBF_33079() {
if (OBF_21025.OBF_27998 == null) return default;
var ancestors = OBF_29632.OBF_3723.OBF_1860;
switch (OBF_21025.OBF_27998.OBF_1887) {
case BST_JOIN_1:
// Override with ancestor 1's battle score
return OBF_22341.OBF_13265(ancestors[0].unitId);
case BST_JOIN_2:
// Override with ancestor 2's battle score
return OBF_22341.OBF_13265(ancestors[1].unitId);
}
}
SE Potential System
Potentials are passive abilities that trigger during battle. Each stellar memory can have multiple potentials, which you upgrade using Potential Points (PP).
Potential Categories
| Category | Count | ID Range | Description |
|---|---|---|---|
| PTC_UNIQUE | 6 | 11011 - 13002 | Character-specific passives tied to 6 specific characters via CharacterCategoryNum |
| PTC_BASIC | 26 | 20001 - 22010 | Stat passives available to all units. Tier 1 (200xx), Tier 2 (210xx), Tier 3 (220xx) |
| PTC_SPECIAL | 145 | 23001 - 41004 | Special passives: stat combos, role-specific, scenario-specific, infinite buffs |
Role Types
Some potentials are locked to specific roles:
| Role Type | Access | Examples |
|---|---|---|
| PLR_PUBLIC | All units (147 potentials) | Basic stat passives, generic combos |
| PLR_UNIT | Specific character only (6) | PTC_UNIQUE character passives |
| PLR_DEFENDER | Defenders only | 30001 - 30006 |
| PLR_STRIKER | Strikers only | 31001 - 31003 |
| PLR_RANGER | Rangers only | 32001 - 32005 |
| PLR_CASTER | Casters only | 33001 - 33003 |
| PLR_ASSASSIN | Assassins only | 34001 - 34004 |
| PLR_SUPPORTER | Supporters only | 35001 - 35003 |
PP Costs by Tier
| Tier | Levels | PP Cost | Typical Effect per Level |
|---|---|---|---|
| UNIQUE | 1 | 200 PP | Character-specific SE trigger |
| BASIC Tier 1 | 5 | 100 - 300 PP | +1% to +5% rate stat |
| BASIC Tier 2 | 1 | 200 PP | +2% to +4% rate stat, +2 SPD |
| BASIC Tier 3 | 1 | 300 PP | +3% to +6% rate stat, +3 SPD, +1.5% cross/revenge |
| SPECIAL (stat-only) | 1 | 200 PP | Various stat combos (ATK+SPD, HP+SPD, etc.) |
| SPECIAL (SE-triggered) | 1 | 200 PP | Conditional battle effects |
| SPECIAL (infinite) | 3 | 200 PP each | Battle-start permanent buffs |
How Battle Power Calculates with Potentials
The PotenBattlePowerCheck flag on each potential level determines whether upgrading it increases your battle power score. Battle power is calculated as:
totalPotenPoint = sum of all potential levels
battlePowerMultiplier = 1.0 + totalPotenPoint * scaleFactor
Higher battle power affects journey difficulty scaling and succession eligibility.
Battle Buffs from Potentials (BI_POTEN_PASSIVE)
When potentials trigger in battle, they apply buffs defined in the CLIENT_BUFF_TEMPLET.json table. The BI_POTEN_PASSIVE buffs (24 total, BuffID 9001-9024) share common traits:
- TurnInfinite -- lasts the entire battle (permanent)
- CanNotDispel -- cannot be removed by enemy abilities
- IsPositive -- always a beneficial effect
- Most can stack via
IsLevel+BuffLevelMax
Complete BI_POTEN_PASSIVE Reference
| Buff ID | Buff Name | Stat | Value | Max Stacks |
|---|---|---|---|---|
| 9001 | BI_POTEN_PASSIVE_24001 | DEF% | 1% | 5 |
| 9002 | BI_POTEN_PASSIVE_30002 | DEF% | 3% | 5 |
| 9003 | BI_POTEN_PASSIVE_31003 | Crit Rate | 15% | 1 |
| 9004 | BI_POTEN_PASSIVE_31001 | ATK% | 3% | 5 |
| 9005 | BI_POTEN_PASSIVE_31002 | Effect RES% | 3% | 5 |
| 9006 | BI_POTEN_PASSIVE_32001 | Skill ATK% | 15% | 1 |
| 9007 | BI_POTEN_PASSIVE_33001 | Crit DMG | 10% | 3 |
| 9008 | BI_POTEN_PASSIVE_34001 | Crit Rate | 5% | 3 |
| 9009 | BI_POTEN_PASSIVE_34002 | SPD (flat) | +10 | 3 |
| 9010 | BI_POTEN_PASSIVE_35002 | Heal% | 3% | 5 |
| 9011 | BI_POTEN_PASSIVE_35003 | SPD (flat) | +3 | 5 |
| 9012 | BI_POTEN_PASSIVE_110111 | Revenge ATK | 100% | 1* |
| 9013 | BI_POTEN_PASSIVE_110112 | (marker) | -- | -- |
| 9014 | BI_POTEN_PASSIVE_25002 | Special Skill% | 5% | 5 |
| 9015 | BI_POTEN_PASSIVE_32003 | SPD (flat) | +5 | 3 |
| 9016 | BI_POTEN_PASSIVE_32004 | Crit Rate | 5% | 5 |
| 9017 | BI_POTEN_PASSIVE_34003 | ATK% | 5% | 3 |
| 9018 | BI_POTEN_PASSIVE_25003 | Effect RES% | 5% | 6 |
| 9019 | BI_POTEN_PASSIVE_400011 | ATK% | 8% | 5 |
| 9020 | BI_POTEN_PASSIVE_402011 | DEF% | 10% | 5 |
| 9021 | BI_POTEN_PASSIVE_404011 | (unused) | -- | -- |
| 9022 | BI_POTEN_PASSIVE_405011 | Damage Up% | 25% | 1 |
| 9023 | BI_POTEN_PASSIVE_407011 | AddDamage | proc | 1 |
| 9024 | BI_POTEN_PASSIVE_32005 | Crit Rate | 3% | 5 |
* Buff 9012 (Revenge ATK 100%) has a DispelCondition: DC_ATTACK -- it is removed when the unit is attacked.
SE Trigger Mechanics
Potential effects are defined in CLIENT_SE_TEMPLET_POTEN.json. Each entry specifies when and how the buff activates:
Activation Conditions
| Condition | Trigger Timing |
|---|---|
NSEAT_BATTLE_START | At the start of battle (before any turns) |
NSEAT_TURN_START | At the beginning of the unit's turn |
NSEAT_TURN_END | At the end of the unit's turn |
NSEAT_SKILL_START | When the unit uses a skill |
NSEAT_SKILL_END | After the unit's skill resolves |
NSEAT_DAMAGE_START | When dealing damage |
NSEAT_DAMAGE_END | After dealing damage |
NSEAT_HIT | When hitting a target |
Notable Patterns
- Pair buffs: Some potentials come in pairs where one applies a buff and another removes it. For example, buff 3100301 grants a bonus at skill start, and 3100302 removes it at turn end -- creating a conditional effect.
- Crit counters: Some potentials trigger after a specific number of critical hits (e.g., ranger potential 3200501 triggers after 5 crits).
- Infinite buffs: Special potentials use
_INFINITEbuff names that last the entire battle. These come in 3 intensity levels (200 PP each). - Debuff removal: Some potentials use
DeleteSpecificBuffStrIdto remove specific buffs when they expire.
Stat Blessings (Inheritance)
Separate from SE Potentials, the Stat Blessing system (CLIENT_STAT_POTENTIAL_TEMPLET.json) handles flat stat inheritance. There are 45 entries covering 5 stats across 3 difficulty tiers and 3 levels each:
| Tier | Stat Values (Level 1/2/3) | CanSuccessionRatio (Lv1/Lv2/Lv3) |
|---|---|---|
| Easy | 10 / 15 / 20 flat | 30% / 18% / 12% |
| Normal | 25 / 30 / 35 flat | 30% / 18% / 12% |
| Hard | 40 / 45 / 50 flat | 12% / 8% / 4% |
The CanSuccessionRatio is in basis points (divide by 100 for percentage). It determines the probability that a stat blessing is inherited from a parent stellar memory. Hard tier blessings are much less likely to pass down (4-12%) compared to Easy/Normal (12-30%).
The inheritance formula is:
InheritedStat = BaseStat + floor(RawValue * ParentStatBlessApplyRatio)
Blessing Rarity Groups
The server categorizes blessings into 4 rarity groups, defined in two templet tables:
| Group | ID | Poten-to-Bless Name | Succession Name |
|---|---|---|---|
| LOW | 2 | LOW_SE_PotenRarity | LOW_BlessRarity |
| HIGH | 3 | HIGH_SE_PotenRarity | HIGH_BlessRarity |
| MID | 4 | MID_SE_PotenRarity | MID_BlessRarity |
| ZERO | 5 | ZERO_SE_PotenRarity | ZERO_BlessRarity |
Each group covers PotenLv 1-5 with JourneyScoreWeight: 10000. All groups contribute equally to journey scoring. The actual assignment of which PotenId belongs to which group is server-side only -- the client never has this mapping.
Important limitation: The exact algorithm the server uses to select which rarity group a blessing falls into, and which specific blessing you receive, is not present in any client-side code. The client only receives the result and renders cutscenes/popups. This is the one part of the system we cannot verify from decompiled code alone.
Full Journey Blessing Flow (End to End)
Here is the complete flow from journey start to battle:
- Select 2 Stellar Memories at the journey start screen
- Server assigns blessings, succession events, and deck slots via
OBF_20694response packet - BST_START succession (if applicable): Plays BlessSuccessionCutscene, transitions to Succession scene. One parent's blessing joins the deck at journey start.
- Player progresses through journey turns (training, battles, trading, resting)
- BST_JOIN_1/JOIN_2 succession (if configured for this turn): Plays BlessJoinCutscene, shows BlessJoin popup with unlock animation. Parent's blessing is added to the 4-slot deck.
- Battle score overrides to the joining parent's score when BST_JOIN triggers
- Potentials activate in battle based on their SE trigger conditions (battle start, turn start/end, skill use, damage dealt, etc.)
- BI_POTEN_PASSIVE buffs are applied as permanent (TurnInfinite), undispellable stat bonuses
Practical Tips
- Prioritize PTC_SPECIAL potentials for your main DPS units -- they offer the strongest battle effects (25% Damage Up, 15% Skill ATK, etc.). Browse character attributes in the Arcana Database to find your main DPS units
- Stack Crit Rate potentials if you have multiple Crit Rate buffs (3%, 5%, 15% available) -- they stack via BuffLevelMax
- Speed is king -- flat SPD potentials (+3, +5, +10) are rare and extremely valuable since SPD is not reduced by PvP scaling
- Hard tier stat blessings have much lower inheritance rates (4-12%) -- don't rely on them passing down
- Battle Power matters -- potentials flagged with
PotenBattlePowerCheck: trueincrease your score, which affects journey difficulty and succession eligibility - Role-locked potentials (Defender, Striker, etc.) can only appear on units of that role -- factor this into your stellar memory selection. See Character Builds for role information
- The "Gene" button at journey start shows parent blessing info -- use it to plan which ancestors to bring for specific blessing types
Source Code References
- Star.Templets.decompiled.cs -- NKCJourneyTurnTemplet (line 18736-18739), NKMStatPotenTemplet (line 21912-21934)
- NKM.Templets.decompiled.cs -- BlessSuccessionType enum (line 31869-31875)
- NKC.decompiled.cs -- NKCSubPageStellarMemorySelector (line 159879), BlessJoin popup (line 141564), cutscene player (line 99902), battle score override (line 271268), deck initialization (line 272334)
- CLIENT_SE_POTENTIAL_TEMPLET.json -- 177 potential definitions
- CLIENT_SE_TEMPLET_POTEN.json -- SE battle trigger definitions
- CLIENT_POTENTIAL_LEVEL_GROUP_TEMPLET.json -- Level scaling data (209 groups)
- CLIENT_BUFF_TEMPLET.json -- 24 BI_POTEN_PASSIVE buff definitions (BuffID 9001-9024)
- CLIENT_STAT_POTENTIAL_TEMPLET.json -- 45 stat blessing entries with CanSuccessionRatio
- CLIENT_POTEN_TO_BLESS_TEMPLET.json -- Rarity group mappings (20 entries)
- CLIENT_BLESS_SUCCESSION_TEMPLET.json -- Succession group mappings (20 entries)
Full decompiled and deobfuscated source: github.com/boring877/star-savior-decompiled