Mise à jour 2.61
09/06/2026
Menu natif ÉTAPE 3 : source de lignes de liste native rétro-ingénierée + `list-read` (sonde) + lecture de sélection en direct. Continuant la voie du menu natif en jeu (Yojimbo→Jarvis-BAHAMUT), l'écart étape-3 #1 (« d'où viennent les lignes de la liste native ? ») est fermé via IDA : l'INPUT de la liste (`FFX_Menu_List_UpdateInput 0x8B4460`) est 100% générique — pur calcul de champs sur l'objet 152-octets (`+40` état, `+48` compte, `+50` top, `+52` cible, `+58` page, `+66` slots, `+69` résultat, `+70` scroll, `+72` sélectionné, `+28` validateur), ne touche aucun global, et est réutilisé par 10 builders distincts — mais chaque draw natif est en forme d'item : la liste scene3 (`FFX_Menu_CreateScene3ScrollableList 0x8B4FB0` → draw `0x8B4A00` → row `0x8B4B20`) lit les lignes depuis `unk_159EC30[64i]` (structs 64 octets) + `byte_1866250[]` (type), avec le nom d'item résolu par `0x86C3C0(id→table)` et un label direct optionnel à `rowPtr+32` (type 1) ; elle charge scene3/33/34 et dépend des globals Customize. Il n'y a aucun draw de « liste texte libre » dans le binaire — donc une liste native avec NOTRE texte (l'arène / la coquille Aurora Photo-Mode) nécessite un callback de draw DLL (étape 5, le chemin prévu dans tick-bible §4), avec la recette hand-rolled documentée (input générique `0x8B4460` + un draw DLL utilisant la fenêtre `sub_8F5F70` / la chaîne `sub_9016B0` / le curseur `sub_8C0640`, lisant `+69`/`+72`). Livré via sonde AUJOURD'HUI : nouveau verbe `ffxprobectl list-read [handleHex]` (lecture seule) qui scanne le POOL d'objets menu (`g_FFX_MenuObjPool 0x18408C0`, 32 slots × 152B) — trouve TOUTE liste/popup native active et l'identifie par ses callbacks — plus le raccourci globals « liste courante » (`dword_1866214`/`186A5DC`/`23CC120`). ✅ RT2 PASS (live, 2026-06-09) : avec le jeu dans le menu Customize equipment, le scan du pool a attrapé la liste naviguée (slot[3] `@0x017A0A88`, `input=0x8D57E0`, un wrapper fin du générique `0x8B4460`) et `+72`/`SELECTED` a suivi le curseur en temps réel (35→42) pendant que l'opérateur le déplaçait → étape-3 « lire la sélection d'une liste native navigable » PROUVÉ sans rien écrire. (Bonus : le `+62 = group 0x101` de l'objet réinitialiser correspond à `FFX_MenuObj_Reset` (IDA) — offsets confirmés contre la mémoire.) Pas de RAM caméra / Aurora / `dllmain.cpp` / save touchés ; IDA en lecture seule (copie `_claude_ida`, rename-queue dans le doc). `ffxprobectl` build 0 erreurs. Étape 5 (blueprint) : squelette paste-ready de la coquille native à `RuntimeTools/NativeMenuShell/NativeMenuShell.h` (+README) — objet hand-roll + callback draw (fenêtre+rangs+curseur) + encodeur de police FFX + pont découplé vers les actions Photo Mode d'Aurora ; ABIs/offsets confirmés (workflow IDA) et revu adversarially (2 lenses FFX-vs-IDA + C++ → pas de bloqueur crash/compile) ; garde x86 + clamp anti-OOB + invariants porteurs annotés ; pas câblé, ne touche pas `dllmain.cpp`. Étape 5.1 (blueprint de câblage, PAS appliqué) : plan + brouillon de patch (`docs/ai/HANDOFF_BAHAMUT_NATIVE_MENU_WIRE_BLUEPRINT_2026-06-09.md` + `docs/patches/BAHAMUT_NATIVE_MENU_WIRE_DRAFT_2026-06-09.patch`) câblant la coquille dans `ffx-hooks.dll` via un detour sur la pompe menu `FFX_Menu_PerFramePump 0x8A9C50` (`int __cdecl(uint)`, IDA-vérifié, main-thread) — OFF par défaut (`FFXHOOKS_ENABLE_NATIVE_MENU` + touche F7), le pont appelle seulement `PhotoMode::` ; revu adversarially (2 lenses) pas de bloqueur (le reviewer compile l'a appliqué à un arbre scratch, `git apply --recount --check` exit 0) ; `dllmain.cpp` PAS touché/committé. Doc : `docs/reverse/FFX_NATIVE_MENU_LIST_ROW_SOURCE_2026-06-09.md`.
Lire les notes