更新 2.61
2026/6/9
v2.61.0BETA
Seymour
原生選單 STEP 3: native-list 行來源 reverse-engineered + `list-read` (探查) + 即時選擇讀取
- 持續進行原生 in-game 選單工作線 (Yojimbo→),step-3 缺口 #1(「原生清單的行從何而來?」)已透過 IDA 封閉:該清單 INPUT (
FFX_Menu_List_UpdateInput 0x8B4460) 是 100% 通用型 — 純粹對 152 位元組物件進行欄位數學運算 (+40狀態、+48計數、+50頂部、+52目標、+58頁面、+66插槽、+69結果、+70捲動、+72已選取、+28驗證器),不碰觸任何全域變數,並由 10 個不同的建構器 重複使用 — 但 每個原生繪製都是 item-shaped:場景3 清單 (FFX_Menu_CreateScene3ScrollableList 0x8B4FB0→ 繪製0x8B4A00→ 行0x8B4B20) 從unk_159EC30[64*i](64 位元組結構) +byte_1866250[](型別) 讀取行,其中物品名稱由0x86C3C0(id→table)解析,並在rowPtr+32(型別 1) 處有選項的直接標籤;它載入 scene3/33/34 並依賴自訂全域變數。二進位檔中不存在「free-text 清單」繪製 — 因此一個帶有 OUR 文字(競技場 / Aurora Photo-Mode 外殼)的原生清單需要 DLL 繪製回呼(步驟 5,即 tick-bible §4 中所預見的路徑),hand-rolled 配方已記錄(通用輸入0x8B4460+ 使用 DLL 視窗 /sub_8F5F70字串 /sub_9016B0遊標的sub_8C0640繪製,讀取+69/+72)。透過探查 TODAY 出貨: 新的動詞ffxprobectl list-read [handleHex](READ-only),會掃描 menu-object POOL (g_FFX_MenuObjPool 0x18408C0,32 個槽 × 152B) — 找到 ANY 活躍的原生列表/彈出視窗,並透過其回呼識別它 — 加上捷徑「目前列表」的全域變數 (dword_1866214/186A5DC/23CC120)。✅ RT2 PASS (即時,2026-06-09): 在遊戲處於自訂裝備選單時,池掃描捕捉到了被導航的列表 (slot[3]@0x017A0A88,input=0x8D57E0,是通用0x8B4460的一個薄包裝) 並且+72/SELECTED即時追蹤了遊標 (35→42),當操作者移動它時 → step-3「讀取了一個原生可導航列表的選取項」PROVEN 而不寫入任何東西。(加分項:重置物件的+62 = group 0x101與FFX_MenuObj_Reset相符 (IDA) — 偏移量已與記憶體確認。) 未觸及任何相機 RAM / Aurora /dllmain.cpp/ 存檔;IDA read-only (_claude_ida副本,位於文件中的 rename-queue)。ffxprobectl建置 0 個錯誤。步驟 5 (藍圖): paste-ready 原生外殼的骨架位於RuntimeTools/NativeMenuShell/NativeMenuShell.h(+README) — 物件 hand-roll + 繪製回呼 (視窗+行+遊標) + FFX 字型編碼器 + 與 Aurora 的拍照模式動作解耦的橋接;ABI/偏移量已確認 (IDA 驗證工作流程) 並經對抗性審查 (2 個鏡頭 FFX-vs-IDA + C++ → 無當機/編譯阻礙);x86 防護 + anti-OOB 鉗位 + load-bearing 不變量已註解;未接線,不觸及dllmain.cpp。 步驟 5.1 (接線藍圖, 已套用 NOT): 計劃 + 修補草稿 (docs/ai/HANDOFF_BAHAMUT_NATIVE_MENU_WIRE_BLUEPRINT_2026-06-09.md+docs/patches/BAHAMUT_NATIVE_MENU_WIRE_DRAFT_2026-06-09.patch) 透過選單泵ffx-hooks.dll上的繞道將外殼接線至FFX_Menu_PerFramePump 0x8A9C50(int __cdecl(uint), IDA-verified, main-thread) — 預設為 OFF (FFXHOOKS_ENABLE_NATIVE_MENU+ F7 快速鍵), 橋接僅呼叫PhotoMode::*; 經對抗性審查 (2 個視角) 無阻礙 (編譯審查員將其套用至暫存樹,git apply --recount --checkexit 0);dllmain.cppNOT touched/committed. Doc:docs/reverse/FFX_NATIVE_MENU_LIST_ROW_SOURCE_2026-06-09.md
v2.60.2
v2.61.1BETA
Seymour
阿特拉斯裝備商店槽位 value-guard (`proved-candidate`) + item-shop 老實說 `blocked`
- 商店偵查的第二輪 (
HANDOFF_ATLAS_RIKKU_SHOP_SLOT_VALUE_INDEXER):解鎖 SAME value-guard 給已經證明的寶藏商店。由8個代理的工作流程驗證(5個取證 + 2個對抗 + 1個合成):編輯器的槽位RawValue是原始的 on-disk little-endian ushort (ShopTable_File≡ReadBaselineSlotValue),並且gear_shop_slots.csv的slot_value_hex(445/445 已填充,shop_arms.bin索引) 是同一個字 — 所以守衛是一個 same-space 整數比較,沒有 off-by-one (目錄是MinIndex=0,索引0 = 保留的 NULL 條目,第一個可出售裝備 = 索引1 =0x01)。新的 read-only 訪問器SpiraDataAtlasCatalog.TryGetShopGearSlot(bank, slot, currentRawValue)+ 懶惰的_shopGearSlotValues(僅開發work/,無編譯後備,如同晶球盤 node detail): resolvesatlas:gear:gear-shop-0x{bank}-slot-{n}only while the slot's current value still equals the corpus (and ≠ 0) → editing the slot hides the badge (no stale). The--spiraatlas-rt0gate gained 5 durable asserts (positive lookup Tidus/value 1, value-guard mismatch 999 hides, empty slot raw 0, bank-without-corpus, edge0x2E/427), all PASS. Item-shop =blocked: the corpus does not carry the raw value (item_shop_slots.csv.slot_value_hex100% empty —ItemShopDataObject.toString()prints only the name); a string-guard is NOT fake-safe (Potion/Phoenix Down/Antidote x47 → stale; placeholders + US-vs-JP → false negatives). Unlock = 1-line parser patch + re-run (corpus task, outside this code). Honest tier:proved read-only candidate (parser-corpus + reader-semantics + RT0), neverruntime/byte-grounded(noarms_shop.binwas hexdumped here). No UI, writer, SIN, runtime, orCommonbadge-engine changes (ANIMA). Build 0 errors / 361 warnings;--spiraatlas-rt0+--aicmdmeta-rt0PASS. Doc:docs/ai/ATLAS_RIKKU_SHOP_SLOT_VALUE_INDEXER_RESULT_2026-06-09.md
v2.61.0
v2.61.2BETA
Seymour
商店探索器中的 Atlas 證據徽章(gear-only、value-guarded)
- Read-only UI 將
TryGetShopGearSlot存取器(在v2.61.1中證明)接入ShopExplorer:每個 gear-shop 插槽會顯示<common:AtlasEvidenceBadgeStrip>,內容包含該插槽裝備獎勵的來源/徽章/「出現位置」——僅在該插槽目前的RawValue仍與語料庫相符時。ShopEditableSlotRow.Evidence(init)在From()中計算得出:source.Kind == Gear && TryGetShopGearSlot(entry.Index, slot.SlotIndex, slot.RawValue)。由於該行會在 EVERY 變異時重建(ComboBox/設為空白/復原/捨棄/儲存/重新整理 →RebuildSelectedSlots),編輯插槽會重新計算證據並隱藏條帶(無過期徽章)。Item-shop 永遠不會獲得徽章(Kind == Gear防護 + double-guard:物品無語料庫條目);空白插槽(原始值 0)short-circuits。經由 3 鏡頭對抗工作流程驗證(窮舉生命週期 / item-shop+綁定 / 誠實性)→ 所有sound,0 缺陷。重複使用 ANIMA 的Common基礎設施(引擎未修改);無新寫入器、無新解析器、無 SIN/執行時期/Aurora/native-menu。層級parser-corpus+RT0+read-only,絕非執行時期proved。建置 0 錯誤 / 361 警告;--spiraatlas-rt0+--aicmdmeta-rt0PASS(無--shop*閘門於Program.cs)。文件:docs/ai/ATLAS_RIKKU_SHOP_GEAR_BADGE_UI_RESULT_2026-06-09.md
v2.61.1
v2.61.3BETA
Seymour
Atlas 提供者:正規化 `BlitzballPrizeRef` (read-only) 取代了 76 行的原始抓取資料
SpiraDataAtlasCatalog獎勵部分不再抓取原始的bltz0200/0201;它現在讀取 WAKKA 的正規化資料集 (work/step0_blitzball_prize_ref_2026-06-09):164 prize-index 行 (101 寶藏proved-candidate經由prize+220 -> takara 220..320 -> reward,由 3 個離線來源關閉 — Fahrenheitblitz_prize.cs+bltz0201 obtainTreasure+bltz0200/0201 Treasure-Label— 超過 RT0-proved takara;60 技術partial;3 極限技metadata-only) + 64blockedscript-sites (per-event 獎勵是一個執行時/存檔變數)。防護欄已重寫:規則proved-candidate離線,具體的 per-league/錦標賽獎勵blocked,從未 RT2,從未是寫入者。--spiraatlas-rt0閘門從14739變為14891詳細資訊 (BlitzballPrizeRef 76 -> 228) 並增加了 data-grounded 斷言 (寶藏 101 / 技術 60 / 極限技 3 / 站點 64;獎勵 0 -> takara 220 Hi-Potion;獎勵 100 -> takara 320 Phoenix Down;寶藏proved-candidate-not-RT2;極限技metadata-only;站點blocked)。補丁在應用前經過 4 個代理的對抗性審查驗證。沒有 UI,沒有寫入者,沒有 SIN/執行時;不觸及商店/寶藏/Mix (RIKKU)、Common徽章引擎 (ANIMA) 或 Aurora/native-menu。構建 0 錯誤 / 361 警告;--spiraatlas-rt0+--aicmdmeta-rt0PASS。文件:docs/ai/ATLAS_WAKKA_BLITZBALL_PROVIDER_INTEGRATION_RESULT_2026-06-09.md
v2.61.2
v2.61.4BETA
Seymour
原生選單 Shell WIRED 進入 `ffx-hooks.dll` (已套用步驟5,預設為 OFF)
- step-5.1 修補程式(經過對抗性審查,無阻礙)現已套用至
dllmain.cpp(最小修補:dllmain.cppONLY,+166 行,0 刪除)——它將NativeMenuShell.h(帶有 OUR 文字的原生選單)透過選單泵PhotoModeActions.h(FFX_Menu_PerFramePump 0x8A9C50、int __cdecl(uint)、IDA-verified)上的繞道連接到 Aurora 的橋接器(MAIN THREAD)。預設為 OFF:FFXHOOKS_ENABLE_NATIVE_MENU=1啟動繞道;選單僅在 F7 熱鍵上開啟。Aurora 的合約 ACCEPTED 並已遵循:PhotoMode::Tick()= 選項 A(位於AuroraD3DRender頂部,在 early-return 之前,帶有FFXHOOKS_ENABLE_AURORA_OVERLAY=1、AURORA-owned 區塊);FREEZE 單一擁有者g_pm.frozen;NtSuspendProcessPROHIBITED;PhotoMode::g_base=g_base在初始化中。該連線僅呼叫PhotoMode::*— 它不寫入相機 RAM(0xD378A0)或角色 RAM。建置-WithPolyHook -ReleasePASS(dllmain+MusicHook+ElementHook→ffx-hooks.dll)。步驟 6A/NPC 保留了此修補程式的 OUT。RT2-pending: 在選單/欄位內 F7 → 應出現原生 "PHOTO MODE" 殼層(可丟棄的存檔)。文件:docs/ai/HANDOFF_BAHAMUT_NATIVE_MENU_WIRE_BLUEPRINT_2026-06-09.md
v2.61.3
v2.61.5BETA
Seymour
Atlas evidence badge in the Item Shop (value-guarded) — closes the gear+item pair
- Clones the gear-shop value-guard proved in
v2.61.2to item-shop, now thatv2.61.1+ the corpus unlock gave item a byte-grounded 1:1 raw value. New read-only accessorSpiraDataAtlasCatalog.TryGetShopItemSlot(bank, slot, currentRawValue)+ 惰性_shopItemSlotValues(讀取item_shop_slots.csv,僅限開發者work/,無編譯後備用) — 是TryGetShopGearSlot的精確鏡像:僅在插槽的當前atlas:item-shop:item-shop-0x{bank}-slot-{n}仍與語 料庫匹配 (該RawValuestill matches the corpus (the on-disk LE ushort = Items game-index 才解析0x2xxx。ShopExplorer_DataModel現在根據商店類型 (裝備/Evidenceper shop kind (Gear/Item switch); the<common:AtlasEvidenceBadgeStrip>已經 被共 享 (v2.61.2), so item slots now show the badge with no XAML change; editing the slot rebuilds the row and hides the strip (no stale). The--spiraatlas-rt0門新增了 4 個物品斷 言 (查詢0x2000/Potion, mismatch0x9999hides, empty raw 0, no-corpus slot 3), all PASS (gear still PASS). Regeneratedwork/step0_consolidated_v5/item_shop_slots.csv重新生成slot_value_hex(404/404, dev-only, not committed). Read-only: no writer, no Treasure/Mix/Common/Aurora/native-menu/runtime changes; ANIMA'sCommon引擎。建置 0 錯誤 / 361 警告;--spiraatlas-rt0+--aicmdmeta-rt0PASS. Doc:docs/ai/ATLAS_RIKKU_SHOP_ITEM_BADGE_UI_RESULT_2026-06-09.md。 先前:v2.61.4]