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