Amiibo 掉宝
掉落物表格
Idx | Name | Description |
---|---|---|
0 | Normal | |
1 | Normal2 | 没用到 |
2 | SmallHit | |
3 | SmallHit2 | 没用到 |
4 | BigHit | |
5 | BigHit2 | 没用到 |
6 | GreatHit | |
7 | GreatHit2 | 没用到 |
Amiibo 注册
每次使用 amiibo 时,游戏会纪录使用了哪个 amiibo [1]。
- AIDef:Action/CreateEpona 在生成伊波娜后纪录
- AIDef:AI/WolfLinkAmiibo 在生成林克狼后纪录
- AIDef:Action/ItemAmiiboSelectDropTable 在“扫描阶段”时就会纪录(请注意此时宝物还没出现)。
当游戏试图纪录 amiibo 时,会做下面这些事情
- AmiiboMgr 会检查是不是应该清空“今日使用过的 amiibo 列表”(stored in the AmiiboTouchHistory flag)[2]。
- 如果游戏开启后还没过 86400 秒(现实一天),则不做任何事。[check]
- 否则,AmiiboMgr 会计算
10000 * now.year + 100 * now.month + now.day
。如果这个数字不同于 AmiiboLastTouchDate(代表一天过去了),那么 AmiiboTouchHistory 就会被清空。
- 扫描到的 amiibo 的名字(和其他任天堂认为有必要纪录的东西)会被写进 AmiiboTouchHistory 里。这个表只会保留最新的 100 个名字。
- 如果这个 amiibo 是“新的”,那么就把它写进 AmiiboTouchHistoryTotal 这个表里。如果那个表里已经有这个 amiibo 的名字了,那就增加它对应的计数器。这个表只会保留 200 个项目。
- 最后把 AmiiboLastTouchDate 更新成今天的日期。
这两个表格 AmiiboTouchHistory 跟 AmiiboTouchHistoryTotal 用的格式是 "%s_%d_%d_%d" (amiibo UID 名字, amiibo value 1, amiibo value 2, scan count 扫描次数)
运作逻辑
有 20% 的机率出现 SmallHit。
If the amiibo has been scanned 0, 1, 2, 3 or 4 times, you'll get a GreatHit 20% of the time. If you didn't get a GreatHit, the game will ensure you get a BigHit.
If the amiibo has been scanned 5 times or more, you'll always get a GreatHit. In this case, the BigHit table is ignored.
For BigHits and GreatHits, the game uses the 'Remain' tables if Find_4Relic_1stClear is set, 'Parasail' if IsGet_PlayerStole2, and 'Normal' otherwise.
The game then determines the number of drops from each table[3]:
- For a GreatHit:
- GreatHit drops: random number between RepeatNumMin and RepeatNumMax for GreatHit
- SmallHit drops: same, but for SmallHit (if there is a SmallHit).
- Normal drops: random number between RepeatNumMin and RepeatNumMax for Normal, minus the GreatHit drop num
- For a BigHit:
- BigHit drops: random number between RepeatNumMin and RepeatNumMax for BigHit
- SmallHit drops: same, but for SmallHit (if there is a SmallHit).
- Normal drops: random number between RepeatNumMin and RepeatNumMax for the Normal table, minus the BigHit drop num
After a GreatHit, the amiibo's scan count for the amiibo is reset to 0 (0x710064AC8C).
Dropped items receive the IsAmiibo actor parameter.
Special cases
Items with the AmiiboArmorItem tag
If the player hasn't received the complete armor set from an amiibo, armor pieces that they have already received will not be spawned.
Items with the Important tag
The IsGet_ flag for Important items must be false; otherwise they will not spawn.
Items with the AmiiboTreasure tag
Items with the AmiiboTreasure tag are spawned inside of a treasure chest (TBox_Field_Iron).
The chest's "SharpWeaponJudgeType" parameter is set to 2, which causes different weapon bonuses and guarantees the weapon will have at least a blue/white modifier.
Exceptions:
- bdrop resource is Actor/DropTable/Item_Amiibo_DropTable_012 (Daruk), drop name starts with "Item_Ore_" and is not Item_Ore_A (Diamond)
- bdrop resource is Actor/DropTable/Item_Amiibo_DropTable_013 (Revali), drop name starts with "Obj_BombArrow"
- bdrop resource is Actor/DropTable/Item_Amiibo_DropTable_015 (Urbosa), drop name starts with "Obj_ElectricArrow"
Items with a name that starts with GameRomHorse
If it is the first time you are scanning an amiibo that can drop horse equipment (if IsAmiiboDrop_GameRomHorseItem isn't set), the game will always spawn GameRomHorseSaddle_01 and GameRomHorseReins_01.
If you have already received those items, they will not spawn consistently anymore (or not at all[check]).
Items that are marked as amiibo drops
Items that are marked as amiibo drops -- i.e. actors for which the "Amiibo" key exists in the "drops" dictionary in their ActorInfo.product.sbyml entry -- receive an additional DropTable actor parameter. It is set to "Amiibo" for normal drop lists and "Amiibo_After" for Parasail/Remain lists.
Ancient arrows
Obj_AncientArrow_A_01 and Obj_AncientArrow_C_01 can only spawn if you have already received Ancient Arrows at some point (if IsGet_AncientArrow is set).
Divine Beast helms (Armor_181_Head, Armor_182_Head, Armor_183_Head, Armor_184_Head)
When scanning a Champion amiibo, if you've completed any Divine Beast and received a Great Hit, and if you haven't already received the corresponding helm[4], the chest is guaranteed to contain the Divine Helm.
Code
Unless otherwise indicated, all member function names below are unofficial. (Only the class name is official.)
action::ItemAmiiboCreateFromDropTable::getOneDrop
This function is responsible for choosing a drop to be spawned.
https://gist.github.com/leoetlino/a67a874111c1bd97805239f8678e0d00
action::ItemAmiiboCreateFromDropTable::doSpawn
This function is responsible for spawning a drop.
https://gist.github.com/leoetlino/ff246cb5c16b12c5af14a899d1cd8ffd
References
- ↑ 0x710064B564 on Switch 1.5.0
- ↑ 0x710064B3C8
- ↑ AIDef:Action/ItemAmiiboCreateFromDropTable
- ↑ If the corresponding IsGet flag is false