Star-Up — Gear Upgrade Progression
How equipment scales when you star up (升星) from ★0 → ★1 → ★2 → ★3.
Source: reverse-engineered from
MainScripts.dll(HybridCLR HotUpdate). Full decompiled C# indata-session/intermediate/decompiled_equip.cs(EquipHelper.GetEquipAttr+EquipHelper.GetEquipBond). The math is NOT stored in any DataTable — it's hot-loaded code, so re-extract + re-decompile after every patch (datamine-extractoragent does this automatically).
Star cap
EquipHelper.GetMaxStarByIDs(string IDs) returns 3 for every gear in the game. So max star = ★3 across all rarities (SS / S / A / B / C). No per-step cap variation, no per-IDs override.
To star up gear: collect duplicates of the same gear (same IDs), spend the duplicates + gold per EquipHelper.GetUpgradeRequireNum(step, currentStar):
GetUpgradeRequireNum:
if Step ∈ {SS}: 1 dup per star (always)
else: 1 + currentStar × 4 → ★0→★1: 1 dup, ★1→★2: 5 dups, ★2→★3: 9 dups
Gold cost is per-step lookup via PriceDataTable.UpgradePrice(step) (not yet decompiled — values shown in-game directly).
Stat scaling formula
Each gear has an UpgradeAttr field listing 1–3 stat names (CN keys, e.g. 精神,生命,初始魔力 → SPI/HP/Mana). At star s, the game cycles through that list and adds +1 to each named stat per iteration. Iteration count depends on the gear's Step:
| Step | equipUpgTimes |
Iters at ★1 | Iters at ★2 | Iters at ★3 |
|---|---|---|---|---|
| SS | 8 | 8 | 16 | 24 |
| S | 4 | 4 | 8 | 12 |
| A | 2 | 2 | 4 | 6 |
| B | 1 | 1 | 2 | 3 |
| C | 1 | 1 | 2 | 3 |
The cycle is round-robin — at ★3 SS, 24 iterations across 3 stats means +8 to each stat in UpgradeAttr. At intermediate stars the distribution can be uneven (e.g. SS at ★2: 16 iters across 3 stats → 6/5/5).
Stat dispatch (Attr.Add(string type, int value))
CN key in UpgradeAttr maps to Attr field as follows:
UpgradeAttr (CN) |
Attr field | Display |
|---|---|---|
| 生命 | CONS | HP |
| 力量 | STR | STR |
| 精神 | INT | SPI |
| 敏捷 | DEX | AGI |
| 速度 | SPD | SPD |
| 幸运 | Luck | LUK |
| 韧性 | Tough | Toughness |
| 全属性 | STR + INT + DEX | All Stats (3 fields at once) |
| 魔力上限 | MaxMagic | Max Mana |
| 初始魔力 | InitialMagic | Starting Mana |
| 行动回魔 | ActionMagic | Action Mana |
| 受击回魔 | HitMagic | Hit Mana |
These CN keys are the canonical lookup keys in source data — wiki output displays the EN equivalent in the right column.
Bond scaling formula
Each gear has 3 bond slots: Pure (basic), Title (theme), Enhance (skill). Each slot stores Name[BaseLevel] (e.g. Eternal[1]). On star up, the slot at index i gets +1 if star > i:
| Slot | Index | Unlocks at |
|---|---|---|
| Pure | 0 | ★1 |
| Title | 1 | ★2 |
| Enhance | 2 | ★3 |
So at ★3 every bond slot gets +1 to its base level. Final bond level is then capped by the bond's max tier (= number of comma-separated entries in BondDataTable.Value1, e.g. Sharp/Sturdy = 6 tiers max, Fair Trade = 2 tiers max).
Legacy/Heritage adds another +1 to every bond on top of the star-up bonus (same MaxLevel cap applies). Legacy does NOT modify raw stats.
Verification examples
Live decompile-verified at all 4 stars:
Z00000_942 Philosopher's Stone — SS · UpgradeAttr = SPI/HP/Mana · base INT 10 / CONS 5 / Mana 5
| ★ | INT | CONS | Mana | Pure | Title | Enhance |
|---|---|---|---|---|---|---|
| 0 | 10 | 5 | 5 | Eternal[1] | World[1] | Fair Trade[1] |
| 1 | 13 | 8 | 7 | Eternal[2] | World[1] | Fair Trade[1] |
| 2 | 16 | 10 | 10 | Eternal[2] | World[2] | Fair Trade[1] |
| 3 | 18 | 13 | 13 | Eternal[2] | World[2] | Fair Trade[2] |
Z50006_131 Hero Sword — S · UpgradeAttr = STR/HP/Tough · base STR 6 / CONS 2 / Tough 2
| ★ | STR | CONS | Tough | Pure | Title | Enhance |
|---|---|---|---|---|---|---|
| 0 | 6 | 2 | 2 | Frustrate[1] | Heroine[1] | Heroine's Blessing[1] |
| 1 | 8 | 3 | 3 | Frustrate[2] | Heroine[1] | Heroine's Blessing[1] |
| 2 | 9 | 5 | 4 | Frustrate[2] | Heroine[2] | Heroine's Blessing[1] |
| 3 | 10 | 6 | 6 | Frustrate[2] | Heroine[2] | Heroine's Blessing[2] |
For per-gear progression tables across all 1234 gear: see <span class="broken-link" title="missing: starup-gear-info">starup-gear-info</span> (split into 5 per-tier files: <span class="broken-link" title="missing: ss-gear">ss-gear</span>, <span class="broken-link" title="missing: s-gear">s-gear</span>, <span class="broken-link" title="missing: a-gear">a-gear</span>, <span class="broken-link" title="missing: b-gear">b-gear</span>, <span class="broken-link" title="missing: c-gear">c-gear</span>).
Implementation notes
- Formula constants live in
visualise-session/tools/generate_starup_gear_info.py(EQUIP_UPG_TIMES,MAX_STARS,ATTR_DISPATCH). - After a patch where
decompile_equip.pyshowsEquipHelperchanged: update those constants, then re-run the gear generators. generate_gear_pages.pyshows base (★0) values only — does NOT depend on this formula.