Amiibo drops/zh: Difference between revisions

From ZeldaMods (Breath of the Wild)
Jump to navigation Jump to search
(Created page with "==== 古代兵裝‧箭 ====")
No edit summary
 
(8 intermediate revisions by 2 users not shown)
Line 51: Line 51:
如果這個 amiibo 已經連續掃 5 次還沒出過特獎的話,第六次開始就會保證是特獎。
如果這個 amiibo 已經連續掃 5 次還沒出過特獎的話,第六次開始就會保證是特獎。


開頭獎跟特獎的時候,遊戲會檢查玩家的進度,如果 Find_4Relic_1stClear 為真(打完一隻神獸),遊戲會使用 'Remain' 這個表決定掉落物。若否,遊戲會檢查 IsGet_PlayerStole2(拿到滑翔傘),為真則使用 'Parasail' 這個表,否則只用 'Normal' 這個表。
開頭獎跟特獎的時候,遊戲會檢查玩家的進度,如果 Find_4Relic_1stClear 為真(解放過一頭神獸),遊戲會使用 'Remain' 這個表決定掉落物。若否,遊戲會檢查 IsGet_PlayerStole2(拿到滑翔傘),為真則使用 'Parasail' 這個表,否則只用 'Normal' 這個表。


決定好使用哪個表格後,遊戲會決定應該掉落多少東西<ref>[[AIDef:Action/ItemAmiiboCreateFromDropTable]]</ref>:
決定好使用哪個表格後,遊戲會決定應該掉落多少東西<ref>[[AIDef:Action/ItemAmiiboCreateFromDropTable]]</ref>:
Line 103: Line 103:
==== 古代兵裝‧箭 ====
==== 古代兵裝‧箭 ====


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).
Obj_AncientArrow_A_01 Obj_AncientArrow_C_01 只有在你拿過古代兵裝‧箭之後才會出現 (if IsGet_AncientArrow is set)


==== Divine Beast helms (Armor_181_Head, Armor_182_Head, Armor_183_Head, Armor_184_Head) ====
==== 神獸頭盔 (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<ref>If the corresponding IsGet flag is false</ref>, the chest is guaranteed to contain the Divine Helm.
掃描英傑 amiibo 時,如果你解放完「任何一頭」神獸''''''拿到頭獎''''''你還沒拿過相應的神獸頭盔,<ref>If the corresponding IsGet flag is false</ref>,那遊戲 100% 會給你該頭盔。


=== Code ===
=== 程式碼 ===


Unless otherwise indicated, all member function names below are unofficial. (Only the class name is official.)
Unless otherwise indicated, all member function names below are unofficial. (Only the class name is official.)
Line 115: Line 115:
==== action::ItemAmiiboCreateFromDropTable::getOneDrop ====
==== action::ItemAmiiboCreateFromDropTable::getOneDrop ====


This function is responsible for choosing a drop to be spawned.
這個函數會選擇掉落物。


https://gist.github.com/leoetlino/a67a874111c1bd97805239f8678e0d00
https://gist.github.com/leoetlino/a67a874111c1bd97805239f8678e0d00
Line 121: Line 121:
==== action::ItemAmiiboCreateFromDropTable::doSpawn ====
==== action::ItemAmiiboCreateFromDropTable::doSpawn ====


This function is responsible for spawning a drop.
這個函數會生成掉落物。


https://gist.github.com/leoetlino/ff246cb5c16b12c5af14a899d1cd8ffd
https://gist.github.com/leoetlino/ff246cb5c16b12c5af14a899d1cd8ffd
Line 129: Line 129:
<references/>
<references/>


[[Category:Internals]]
[[Category:Internals{{#translation:}}]]
[[Category:Game mechanics]]
[[Category:Game mechanics{{#translation:}}]]

Latest revision as of 00:37, 30 May 2020

Other languages:

Warning: Display title "amiibo drops/zh" overrides earlier display title "Amiibo 掉宝".

掉落物表格

Idx Name Description
0 Normal
1 Normal2 没用到
2 SmallHit
3 SmallHit2 没用到
4 BigHit
5 BigHit2 没用到
6 GreatHit
7 GreatHit2 没用到

Amiibo 注册

每次使用 amiibo 时,游戏会纪录使用了哪个 amiibo [1]

当游戏试图纪录 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。

如果这是第 0, 1, 2, 3, 或 4 次扫描这个 amiibo,游戏有 20% 的几率给你 GreatHit(姑且译作“特奖”)。如果遇到另外 80%,游戏会给你 BigHit(姑且译作“头奖”)。

如果这个 amiibo 已经连续扫 5 次还没出过特奖的话,第六次开始就会保证是特奖。

开头奖跟特奖的时候,游戏会检查玩家的进度,如果 Find_4Relic_1stClear 为真(解放过一头神兽),游戏会使用 'Remain' 这个表决定掉落物。若否,游戏会检查 IsGet_PlayerStole2(拿到滑翔伞),为真则使用 'Parasail' 这个表,否则只用 'Normal' 这个表。

决定好使用哪个表格后,游戏会决定应该掉落多少东西[3]

  • 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
  • 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

开出特奖后,本 amiibo 的扫描次数会重设为 0 (0x710064AC8C).

Dropped items receive the IsAmiibo actor parameter.

特例

标有 AmiiboArmorItem 的掉落物

(属于衣服类的掉落物) 如果玩家还没拿过一整套(头、身、脚)的话,已经拿过的部分不会再出现。


标有 Important 的掉落物

(标记为“重要”的掉落物)如果拿过(The IsGet_ flag 为真)就不会出现。

标有 AmiiboTreasure 的掉落物

这一类掉落物会装在宝箱 (TBox_Field_Iron) 里掉下来。


宝箱的 "SharpWeaponJudgeType" 参数是 2,这代表里面装的东西会有加成 different weapon bonuses,至少蓝标,可以到黄标。

例外

  • 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"

名字是 GameRomHorse 开头的掉落物

如果你是第一次扫描一个会掉落马具的 amiibo(代表 IsAmiiboDrop_GameRomHorseItem 仍是假),那游戏就一定会给你 spawn GameRomHorseSaddle_01 旅人马鞍跟 GameRomHorseReins_01跟旅人缰绳。

如果你拿过这两个东西了,那游戏就不保证一定会给你了。(还是说 100% 一定不会出现?[check]

标记为 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.

古代兵装‧箭

Obj_AncientArrow_A_01 跟 Obj_AncientArrow_C_01 只有在你拿过古代兵装‧箭之后才会出现 (if IsGet_AncientArrow is set)。

神兽头盔 (Armor_181_Head, Armor_182_Head, Armor_183_Head, Armor_184_Head)

扫描英杰 amiibo 时,如果你解放完“任何一头”神兽拿到头奖你还没拿过相应的神兽头盔,[4],那游戏 100% 会给你该头盔。

程式码

Unless otherwise indicated, all member function names below are unofficial. (Only the class name is official.)

action::ItemAmiiboCreateFromDropTable::getOneDrop

这个函数会选择掉落物。

https://gist.github.com/leoetlino/a67a874111c1bd97805239f8678e0d00

action::ItemAmiiboCreateFromDropTable::doSpawn

这个函数会生成掉落物。

https://gist.github.com/leoetlino/ff246cb5c16b12c5af14a899d1cd8ffd

References

  1. 0x710064B564 on Switch 1.5.0
  2. 0x710064B3C8
  3. AIDef:Action/ItemAmiiboCreateFromDropTable
  4. If the corresponding IsGet flag is false