Yuda Dazotikuy Shrine
首頁 / 主題解說 / 黏手與並列 / 深入了解
Tears of the Kingdom · 09

Zuggle 技術原理

統整修正版

基本資訊

  • 發現者:Zvleon
  • 發現時間:2023 年 5 月 16 日
  • 主要效果:讓多件裝備的攻擊判定(hitbox)或裝備效果異常疊加在 Link 身上,藉此堆疊武器攻擊力、盾牌效果等。

核心定義

Zuggle 是裝備 actor 的 EquipmentUserComponentActorLink 狀態與 actor 層 calculation dependency 狀態不同步的結果。裝備不再是正常裝備槽中的裝備,也不再處於「進行中的丟棄 / smuggle」狀態,但仍保留對 Link 的計算依賴,因此能以異常狀態附著、持續存在,並在讀檔或場景切換後依然保持。

白話來說,遊戲原本要把「裝備某件武器」這件事同步記在兩個地方:

  • Menu 端:選單、背包、目前裝備資料。
  • World / actor 端:場景中的實體裝備 actor,以及它和 Link 之間的運算連結。

正常丟棄、切換或解除裝備時,這兩邊應該一起更新並清理乾淨。Zuggle 發生時,這些資料沒有同步完成。

正常流程 vs. Zuggle 流程

正常裝備一件武器、弓或盾時,裝備會透過 EquipmentUserComponent 裡的 ActorLink 連到 Link 身上。

當裝備被丟棄、切換或解除裝備時,遊戲理論上要同步完成以下幾件事:

  1. 更新背包資料(GameData)。
  2. 更新目前裝備槽狀態。
  3. 移除或替換舊裝備的 ActorLink
  4. 解除裝備 actor 對 Link 的計算依賴(calculation dependency)。

Zuggle 發生時,ActorLink、裝備狀態與丟棄佇列的更新時序彼此錯開;即使其中一部分資料已經被移除、覆蓋或判定完成,裝備 actor 對 Link 的 calculation dependency 仍可能殘留。

這也是為什麼 Zuggle 不能簡單歸類為「背包錯位」或「卡在 drop 佇列裡」:真正讓 Zuggle 成立的關鍵,是帳面狀態已經改變,但 actor 層的依賴關係仍殘留。

Map Zuggle 的形成時序

以下以 Map Zuggle 作為說明範例。裝備被丟棄時,不會立即解除與 Link 的連結,而是先進入 PouchMgr 的丟棄佇列,並暫存被丟棄裝備的連結。

  1. 在地圖開啟前,從快速選單丟棄目前裝備。
  2. 快速重新開啟選單,切換到另一件裝備。
  3. 關閉選單,讓地圖開啟,使換裝與丟棄請求在不同時間點被處理。
  4. 再從背包丟棄目前裝備,讓兩次丟棄請求進入後續處理。

這個過程會讓背包資料、目前裝備狀態,以及 PouchMgr 暫存的裝備連結發生不同步。當後續丟棄流程判定暫存裝備與目前裝備為同一件時,遊戲可能跳過正常的解除或刪除流程。

最後形成「多件裝備仍保留對 Link 的 calculation dependency,但 EquipmentUserComponent 只剩一個有效 ActorLink」的狀態,這就是 Map Zuggle。

四個系統各自的狀態

系統Zuggle 發生時的狀態
GameData(背包 / 選單)認為裝備已被切換、丟棄,或不再是目前裝備
PouchMgr(丟棄佇列處理)丟棄請求已處理完畢,或判定失敗後已退回背包
EquipmentUserComponent目前裝備槽的 ActorLink 已被移除、覆蓋,或改指向另一件裝備
actor 層 dependency裝備 actor 對 Link 的 calculation dependency 仍殘留,沒有同步解除

mPendingDrop:決定 Zuggle 表現形式的關鍵值

dt-12345/zuggle 的逆向工程說明指出,被 zuggle 的裝備身上,DynamicEquipmentComponent 裡有一個布林值,暫稱為 mPendingDrop。它用來標記「這件裝備目前是否還在等待被丟棄」,並會影響 Zuggle 之後呈現的型態。

mPendingDrop裝備行為型態
true忽略幾乎所有外部狀態變更請求,只接受丟棄類指令Static Zuggle(標準型)
false拒絕丟棄請求,但仍接受其他裝備狀態變更Dynamic Zuggle

※ 訂正:先前整理曾把這兩種行為寫反;正確版本以此表為準。

Zuggle 與 Smuggle 的差異

狀態性質一句話定義
Smuggle 丟棄 / 裝備處理仍在進行中 裝備仍保留 active drop / smuggle relation,系統還把它當成正在丟棄中的裝備
Zuggle 丟棄 / 裝備處理已被結案、覆蓋或遺忘,但依賴沒清 選單與裝備槽的帳面狀態已改變,但裝備 actor 對 Link 的 calculation dependency 沒有同步解除

簡單說:

Smuggle 抓的是「正在丟棄中」那個階段的矛盾;Zuggle 抓的是「丟棄 / 裝備流程已經跑完或被覆蓋」之後,依賴關係仍然殘留的落差。

※「active / 已結束」是整理時的歸納講法,方便理解,但不是原始資料中的正式術語。

一句話總結

Zuggle 的本質,是把「丟棄或切換裝備」這個看似單一的動作拆成兩條沒有同步完成的路徑:

  • Menu / GameData / PouchMgr 這條「帳面狀態」路徑。
  • EquipmentUserComponent / actor dependency 這條「實體依賴」路徑。

當帳面狀態已經被處理、覆蓋或結案,但實體 actor 對 Link 的 calculation dependency 沒有同步解除時,系統就會留下一件「選單或裝備槽不再正常承認,但世界端仍異常依附 Link」的裝備。

mPendingDrop 則決定這件殘留裝備之後更接近 Static Zuggle,還是 Dynamic Zuggle。