Duplicate Shards — Convert Owned-Again Pulls
When a recruit roll lands on a unit you already own, the duplicate auto-converts to shards based on the unit's Step. Shards are universal within their pool — used to star-up any unit on the same banner side.
Source: decompiled
GeneralDataTables.SummonDataTable.RedundantRoleShardCount/RedundantSkinPointCount+SummonManager.SummonRoleAsync/SummonSkinAsyncindata-session/intermediate/decompiled_summon.cs. Hot-loaded fromMainScripts.dll— re-decompile after every patch (datamine-extractoragent diffs it).
Conversion table
Both pools use the same numbers, but the destination currency differs:
| Step | Display | Standard dup → | Alter dup → |
|---|---|---|---|
| S | 3★ vàng | 50 Standard Shards | 50 Alter exchange points |
| A | 2★ tím | 10 | 10 |
| B | 1★ xanh | 2 | 2 |
| C | 0★ xám | 1 | 1 |
The number is shown live on the summon-result icon (line 2959 of the decompile, SummonResultIconCtr).
Two pools, two destinations
Standard Recruit (SummonDataTable)
- Function:
RedundantRoleShardCount(step) - Pulled at:
SummonRoleAsyncline 1211 (int num8 = RedundantRoleShardCount(roleDataItem2.Step); num += num8;). - Settled into:
save.genericShard += num;(line 1232) — adds directly to the player's Standard Shard inventory. - Currency item:
D00008_031常规碎片 / Standard Shard —SpecialItemDataTablerow "A mystical shard used to Star Up any standard girl."
Alter Recruit (SkinSummonDataTable)
- Function:
RedundantSkinPointCount(step)— note the function name says Point, not Shard. - Pulled at:
SummonSkinAsyncline 1337 (int num8 = RedundantSkinPointCount(result.Step); num += num8;). - Settled into:
poolInfo.summonPoint += num;(line 1358) — adds to the per-banner exchange point counter, NOT directly to a shard inventory. - Player must then redeem points → Alter Shards via the banner's exchange shop (
SkinSummonExchangeAsyncAPI,SummonExchangeReply.ShardCount). - Final currency item:
D00008_032异化碎片 / Alter Shard — "A mystical shard used to Star Up any alter girl." (Stored insave.skinShardafter exchange.)
So Standard is one-step (dup → shard in inventory) while Alter is two-step (dup → banner points → exchange for shards). The exchange ratio inside the shop is configured on the banner side, not in this constant.
What shards are used for
Both shard types are universal star-up fodder within their pool:
- Standard Shard → star-up any standard girl (any unit without the
_NNNsuffix, e.g. M53301). - Alter Shard → star-up any alter girl (any unit with
_NNNsuffix, e.g. M53301_001).
Confirmed by loc strings:
- Text_Loading_06: "Standard Shards can star up any standard girl"
- Text_Loading_07: "Alter Shards can star up any alter girl"
- Role_Upstar_04: "※ All Alter girls share the same Alter Shard pool."
There is no per-unit shard in this game — unlike many gachas where each character has its own shard. One shared pool per banner side.
Worked example
A 10-pull on Standard with these results (rate-up + already-owned mix):
| Slot | Unit | Step | New? | Shards added |
|---|---|---|---|---|
| 1 | M11002 Goblin Scout | C | dup | +1 |
| 2 | M12002 Goblin Hunter | C | dup | +1 |
| 3 | M11102 Shining Maiden | B | dup | +2 |
| 4 | M11201 (some C) | C | new | 0 (creates SaveData.Role) |
| 5 | M12101 (some B) | B | dup | +2 |
| 6 | M11003 (some C) | C | dup | +1 |
| 7 | M21102 (some A) | A | dup | +10 |
| 8 | M11104 (some C) | C | new | 0 |
| 9 | M12102 (some B) | B | dup | +2 |
| 10 | M53301 Astral Fiend | S | dup | +50 |
Total: +69 Standard Shards added to inventory after the 10-pull, plus 2 new units unlocked.
Cross-refs
- recruit-rates — how the roll picks the unit in the first place (Step bucket → unit pick).
data-session/mgg_datamine/SpecialItemDataTable.mdrowsD00008_031/D00008_032— shard item definitions.data-session/mgg_datamine/SpecialItemDataTable.mdrowsD00006_031/D00006_032— recruit ticket items (orthogonal — input cost, not output shard).
Implementation notes
- Both functions live next to each other in
GeneralDataTables.SummonDataTable(lines 130–152 in current decompile). They share the same numeric ladder; if a future patch decouples them (e.g. nerfs Alter S-dup to 30), the diff againstdata-session/back-up/<prev>/intermediate/decompiled_summon.cswill surface it immediately. - The existing
data-session/tools/decompile_summon.py(one-off, but kept on disk) re-runs the decompile on demand. AddSummonDataTableto the diff target after every patch.