Mise à jour 2.224
06/08/2026
v2.224.0.0BETAMINOR
Seymour2 août 2026
OPÉRATION DÉMON VAGUES 1+2 : F8 DASHBOARD RESTAURÉ + ARBITRAGE DES TOUCHES F7/F8
- F8 dashboard restauré (la source était déjà dans l'arbre ; le câblage manquait) :
StartInGameMenuDashboard()+StartUnXBoosterHook()dansInstallHooks(porte[dashboard] enableddéfaut ON — ajoutée aukDefaultInide Config.cpp) ;InGameMenuDashboard.cpp/UnXBoosterHook.cpp/Config.cppre-ajoutés au vcxproj (Config.cpp n'était jamais dans le projet — la portedashboard.enabledn'était jamais lue). - Arbitrage des touches (Vague 2) : avec
dashboard.enabled, F8/INSERT appartiennent au DASHBOARD (propriétaire unique) ;InGameMenuProcessKeyconsomme F8/INSERT sans toggle (repli avec dashboard off). F7 (NativeMenu/F7_LeverApply) INTACT. - UnX hérité RETIRÉ du déploiement (INC-002 — crash prouvé 3/3) :
unx.dll/dxgi.dll/dxgi.ini/dxgi.dll.055508/dinput8 - Copia.dlldéplacés versmodules\_unx_legacy_removed_20260802_*(backup réversible) dans Steam ET_isolated. - Nouvelles defines dans ffx_addresses.h :
RVA_FFX_DEBUG_FLAGS(0xD2A8F8),RVA_FFX_PERMANENT_SENSOR,RVA_FFX_BATTLE_PARTICIPATION/RVA_FFX_AP_EARN(0x1F10EA0/0x1F10EC4 depuis UnX). Playable Seymour OFF (adresse de struct party non validée — RE en attente ; apply retiré du booster). - Règle Hooks-EN appliquée au dashboard : « F8 close », « On/Off », « Open/Closed » ;
Logdu dashboard →DashLog(OutputDebugStringA — leLogde dllmain est statique). - Modèle ffx-hooks.ini créé à
RuntimeTools/FfxHooksDll/ffx-hooks.ini(avec[dashboard] enabled=1). - Porte : build Release 0 erreurs ; chaînes du dashboard dans le binaire (4/4) ; déploiement Steam +
_isolated(backups.bak_20260802_184354). RT2 en attente : F8 ouvre le dashboard, F7 intact, les cheats du dashboard fonctionnent. ### MINOR
v2.223.1.0
v2.224.0.1BETAPATCH
Seymour2 août 2026
OPÉRATION DÉMON VAGUE 3 : SKIP DE DIALOGUE porté en toute sécurité (hook, pas patch)
DialogSkipHook.{h,cpp}(nouveau) : port sûr du patch codé en durret 8de l'UnX hérité (RVA 0x30B040 —FFX_FmodVoice_ReadEventData@ 0x70B040, __thiscall validé dans IDA) : MinHook/PolyHook2 sur la cible ; avecinput.dialog_skip=1renvoie 0 immédiatement (même effet que le ret 8, RÉVERSIBLE et gardé par config).- Dashboard : item
Dialog Skip (voices)dans l'onglet Input (input.dialog_skip, défaut off). - Câblage :
InstallDialogSkipHook(g_base, LogLine)dans InstallHooks (dans la porte du dashboard). - Define :
RVA_FFX_FMODVOICE_READ_EVENT_DATA(0x30B040) dans ffx_addresses.h. - Porte : build Release 0 erreurs ; chaînes dans le binaire ; déploiement Steam +
_isolated(backup185543). RT2 : avec l'item ON, les dialogues parlés se sautent (pas de crash) ; OFF = comportement vanilla. ### MINOR
v2.224.0.0
v2.224.0.2BETAREVISION
Seymour2 août 2026
OPÉRATION DÉMON : clôture de documentation Vague 4 + script RT2
run_f8_rt2.ps1(nouveau) : smoke de boot + vérifications F8 (dashboard/F7/cheats/dialog skip) — exige un éditeur fermé, une sauvegarde jetable, des hashs avant/après.F8_UNX_INCONSISTENCY_REGISTER(session 3) : INC-002/005 + P1/P2/P5/P7 RÉSOLUS ; P3 partiel (v2.flag déjà absent) ; jamais-porté enregistré (KillMeNow/auto-update/texture inject/sig-scan).- SESSION_HANDOFF + PORT_STATUS : F8
Needs Testing— RT2 en jeu en attente de l'utilisateur (éditeur fermé). - Nettoyage :
ingame_menu_v2.flagdéjà absent du déploiement (P3 confirmé propre). ### PATCH
v2.224.0.1
v2.224.0.3BETAREVISION
Seymour2 août 2026
OPÉRATION DÉMON : plan post-F8 — Tier 2 via ffx-probe (§9) + check RT2
- F7F8_RECONCILIATION_PLAN §9 : avec UnX hors du déploiement, vtable[9] (GetDeviceState) revient à ffx-probe.dll — la sonde main-thread in-process (FORCEBATTLE/SETINPUT/SOUNDCMD/READ/WRITE/CALL — Tier 2 : a_ability/arms_rate/Encounter Table/IA/calibration Aurora). État actuel : OFF dans le déploiement (
.RT2OFF) ; loader présent ; le dashboard a déjà l'itemplugins.ffx_probe. run_f8_rt2.ps1: vérification du heartbeat de sonde (hooked=1) quand la sonde est active.- Porte : doc-only (RÉVISION) ; déploiement intact. ### RÉVISION
v2.224.0.2
v2.224.0.3BETAREVISION
Seymour2 août 2026
TABLE DE DISPATCH PPP : CYCLE FERMÉ (consommateur + table principale)
- Consommateur PROUVÉ :
FFX_MagicHost_RelocatePppSection(0x7121D0) —a2 + 40*index(stride 40 = 0x28 dans le code) ; les appelants passent&pppSysProgTbl(0x72a8eapush offset pppSysProgTbl→ 0xC3A500 ; 0x761b72). Lehandler_table_indexsur disque de chaque slot devient le pointeur d'entrée de table ; slot runtime = 16B ([0]=index, [1]/[2]=pointeurs relocalisés ; compte à*(int16*)(record+0x26)) — correspond à la fenêtre T3 de pppSclMove. - pppSysProgTbl @0xC3A500 = la table PRINCIPALE — layout « progtbl » (name@+0x00, fnMain@+0x08, fnExtra@+0x20), 418 entrées (correspond au doc MAGIC du 2026-07-31) ; slots 0-11 = pppAccele..pppColor avec les handlers du classement Yonishi (pppSclMove T3 = 0x75C090 @ slot 6 ; pppScale = 0x75D0D0 @ slot 10 ; pppAngle = 0x75CF20 @ slot 9 ; pppSclAccele = 0x75B9F0 @ slot 2).
- Correction de la passe précédente : 0xC3A500 n'est PAS un vecteur de noms (le bloc 0xC3A4E0 = chaînes de debug END/CHR/MAP-G/MAT ; le rename
FFX_PppNameVectorANNULÉ). - Renames MAGIC du 2026-07-31 propagés À LA BASE CANONIQUE : 0x716D20→FFX_Render_PppProgramProcessor_2, 0x75B830→FFX_PppHandler_Accele, 0x75B900→FFX_PppHandler_Accele_SetFromGlobalQ, 0xC3E798→FFX_PppHostDispatchTable_AltQ, 0xC86080→FFX_PppKeyholeDispatchTable.
- Le Piégeur Al Bhed a gagné le layout progtbl + la table principale : 5 tables, 1191 handlers dans
scripts/ppp_dispatch_table.json. Doc :docs/reverse/PPP_DISPATCH_TABLE_RECONCILED_2026-08-02.md(2e passe). - C2 avec la chaîne complète : index sur disque → pppSysProgTbl + 40*index → entrée (name+fn). Suivant : la fenêtre de slot disque→runtime de 16B (T3) et les 145 alias. ### PATCH
v2.224.0.2
v2.224.0.4BETAPATCH
Seymour2 août 2026
F8 DÉSACTIVÉ (porte `dashboard.enabled=false`) + doc consolidée F8+sonde
- Bascule de porte à 2 endroits (Config.cpp kDefaultIni +
GetBoolde dllmain ×2) — dashboard/booster/DialogSkipHook ne démarrent pas ; InGameMenu redevient propriétaire de F8/INSERT (repli naturel). Réversible (réactiver = bascule + déploiement). docs/reverse/FFX_F8_PROBE_CONSOLIDADO_2026-08-02.md(nouveau) : F8 (Vagues 1-3 + clôture) + ffx-probe (Tier 2) + comment réactiver + éléments en attente.- Déploiement Steam +
_isolated(backup191908) ; build Release 0 erreurs. Concentrer de retour sur F7. ### RÉVISION
v2.224.0.3
v2.224.0.5BETAPATCH
Seymour2 août 2026
F7 : SCINTILLEMENT CORRIGÉ (cause racine dans le câblage de levier) + pas de numéros bruts de stepper + VRAI levier Difficulté
- SCINTILLEMENT (RT2 utilisateur — cause racine avec preuve de log) : confirmer une ligne fermait le menu (
CloseMenu→m.obj=0) MAISg_forceSubsystemrestait ON — le jeu restait en mode menu (0x13407E4=1) sans menu dessiné = rendu alterné = écran scintillant (log :open→ confirmer →close (force-gate off)seulement au 2e F7 →open...). Correctif : le câblage efface désormaisg_forceSubsystemà la confirmation (même comportement queg_nativeWantClose). - Debounce du toggle F7 (250ms) dans PresentTick — maintenir F7 (ou une touche coincée) togglait le menu à chaque front = scintillement.
- « Numéro là où il ne devrait pas être » : les lignes RT_STEPPER montraient le
[0]brut avant l'édition. Correctif :g_rowEdited[]— la valeur du stepper n'apparaît qu'APRÈS L/R (le toggle [ON]/[OFF] reste toujours visible). - VRAI levier Difficulté (était un stub) : nouveau
F7_SetDifficultyLevel(0..5)(F7InLive) — poseg_cfg.diffGlobal(hpMul 1000/1150/1300/1500/1750/2000 — x1,00..x2,00) +F7_SaveConfig()— l'auto-apply au début de bataille le récupère. - Porte : build Release 0 erreurs ; déploiement Steam +
_isolated(backup193746). RT2 en attente : F7 → confirmer → le menu se ferme SANS scintillement ; pas de [0] initial ; la Difficulté s'applique en bataille.
v2.224.1.0
v2.224.1.0BETAPATCH
Seymour2 août 2026
F3.5 PARTIE 2 : GIZMO DE DRAG dans Aurora (déplacer le monstre sur le canvas) + RE : fenêtre T3 prouvée + alias décodés
- Gizmo dans noclip (
scenes.ts,?edit=1) : clic sélectionne l'acteur le plus proche (picking par projection —clipFromWorldMatrix+ division-w), drag sur le plan du sol (unproject sur le plan-y de l'acteur, conversion FFX↔noclip via matrice inverse), overlay (anneau jaune + instructions), touches S = sauvegarde (POST/api/edits/<encId>— l'endpoint du hub — avec le delta de slot) et R = réinitialiser (retour au vanilla). Base vanilla par slot stockée danssetUpMonsters(deltas corrects même avec un sidecar précédent). - ViewerShell : case « Gizmo 3D (faire glisser sur le canevas) » dans le panneau d'édition +
&edit=1/0dans l'URL du battle-preview + statut montrant l'état du gizmo. - RE (3e passe) : fenêtre T3 de 16B PROUVÉE dans le handler pppSclMove (0x75C090 =
FieldMap_AccumulateDoubleLayerDelta_C) : lit les 4 floats àa2+16..+28(la fenêtre T3record+0x10..+0x1F) et accumule dansa1+160..+172. Alias décodés : les 418 entrées de pppSysProgTbl = 273 noms uniques + 145 ré-enregistrements (les « 145 alias » du doc MAGIC = handlers répétés, pas des noms alternatifs) ; l'extracteur a gagnéfind_all_strings(368 chaînes dans la région) + le champisAlias. - Porte : typecheck noclip propre ;
rsbuildOK ; bundle461.7bf8f17f.jsdéployé dans le serve-dir (contienteditUpdate+ POST) ; build C# 0 erreurs ; tests ViewerHub 17/17 PASS. - F3.5 COMPLÈTE : sidecar (partie 1) + gizmo (partie 2) — le cycle éditer → voir → sauvegarder → rouvrir est fermé. ### RÉVISION
v2.224.1.0
v2.224.1.2BETAPATCH
Seymour2 août 2026
F7 RT2 RONDE 2 : « RIEN NE S'OUVRE » CORRIGÉ (le câblage volait la confirmation) + Forcer le combat sans numéro + label de cheat clair + sous-menus débloquent la musique
- BUG 4 (critique — AUCUN MENU NE S'OUVRE) : mon câblage PumpHook consommait
g_ourClosedAVANT le pump original —PollMenune voyait jamais la confirmation → les sous-menus ne s'ouvraient JAMAIS. Correctif définitif : le câblage a été RETIRÉ — le pump original (CloseMenu →DispatchConfirm→NativeMenu_OnEdge→ sous-menus/reopen/force-off) tourne intact de nouveau. - BUG 3 (Forcer le combat avec numéro) : la ligne était RT_STEPPER (0..250) — désormais RT_NONE (pas de valeur ; le sous-menu FORCE fait le travail —
F7_MENU_FORCE). - BUG 2 (Battle Cheats déroutant) : renommé « Party Invincible (debug) » — le levier (0xD2A8F8+1) est le drapeau d'invincibilité de party du jeu.
- BUG 1 (menu sans musique) : le sous-menu Music (que le Bug 4 empêchait de s'ouvrir) s'ouvre désormais — l'utilisateur choisit la piste dans le sous-menu (
F7_MENU_MUSIC). - Levier relocalisé :
F7_LeverApplyest désormais appelé parNativeMenu_OnEdge(cas ACT_AI_SWAP/ACT_BATTLE_CHEATS — actions directes sans sous-menu ; val depuisg_ourResult). - Porte : build Release 0 erreurs ; déploiement Steam +
_isolated(backup200713). RT2 : Arena+ s'ouvre, les sous-menus Music/Force/Difficulty s'ouvrent, le toggle Party Invincible s'applique. ### PATCH
v2.224.1.1
v2.224.1.3BETAPATCH
Seymour2 août 2026
F7 RT2 RONDE 3 : PISTE MUSIQUE 0 = NONE (écran titre silencieux + CRASH à l'entrée en bataille)
- Bug 1 (écran titre/intro sans musique) :
music_lock: 0dansf7_inlive.json(sauvegardé par le sous-menu Music) —F7_MusicApplyLockappliquait l'override de piste 0 (silence/hors contexte) au boot. - Bug 2 (Custom Alchimie a CRASHÉ à l'entrée en bataille) :
music_battle: 0—F7_ApplyMusicBattle(auto-apply au début de bataille) faisaitSetArenaBattleMusicPending(0)→ MusicHook appliquait la piste 0 → crash (log : FAULT rva 0x4FB05E juste après compose). - Correctif : la piste 0 devient none dans les deux setters (
F7_SetMusicLock/F7_SetMusicBattleTrack:<= 0 → -1) +f7_inlive.jsonnettoyé (music_lock/music_battle= -1). - Porte : build Release 0 erreurs ; déploiement Steam +
_isolated(backup202945). RT2 : la musique de l'écran titre revient ; Custom Alchimie entre en bataille sans crash. ### PATCH
v2.224.1.2
v2.224.1.4BETAPATCH
Seymour2 août 2026
F7 RT2 RONDE 4 : retour de Preview + crash Custom Alchimie INVESTIGUÉ (UpdateWindowTitle/DrawUITextElement)
- Bug 2 (Preview « ne fait rien ») :
F7_MusicPreviewavec verrou-1(none — état de config actuel) retournait SANS JOUER (la gardetrack < 0). Correctif : confirmer Preview avec val<= 0montre le statut à l'écran « Ajuste a faixa (L/R) antes do Preview » ; avec une val valide elle joue. (Le flux : L/R sur « Music Lock » → confirmer sur le stepper = preview — existait déjà.) - Bug 1 (crash à la construction de la bataille — PERSISTE) : le FAULT (même RVA
0x4FB05E) mappé dans IDA :FFX_System_UpdateWindowTitle(0x4FAE40) →DrawUITextElement(0x640810,void(ctx, text, x, y, slot)— dessine le texte SAVE dans le titre de fenêtre ; calleeFFX_Save_SystemSaveGame) — le crash est dans le ctx 2D du menu (« NoTexture »/ResolveTextureNameForUI). Le bin composé est OK (24272 B vs 24080 vanilla — croissance de 192 B avec en-tête ajusté). Isolement en attente (utilisateur) : (a) bataille normale sans compose → crash ? (b) compose avec 1 aeon → crash ? (c) compose avec le menu FERMÉ avant Launch → crash ? - Porte : build Release 0 erreurs ; déploiement Steam +
_isolated(backup205601). ### PATCH
v2.224.1.3
v2.224.1.5BETAPATCH
Seymour2 août 2026
F7 RT2 RONDE 5 : CRASH DE PREVIEW CORRIGÉ (sonde OFF = MMF 0xCD) + « Preview » devient « Save + Open Custom Alchimie »
- Crash de Preview (reproduit par l'utilisateur — « Enter sur Preview = crash MAINTENANT ») :
F7_MusicPreviewappelait le soundcmd via la sonde (ArenaPlus_MusicHookProbeSoundCmd→LabProbeSoundCmd→ MMFFFXProbeBlock_v1) — la sonde est OFF dans le déploiement (.RT2OFF) — le MMF existe mais les données sont le motif 0xCD (mémoire libérée/non initialisée) →AV READ accessed=0x10CDCDCDdans ffx-hooks. Correctif : SEH (__try/__except) dansF7_MusicPreview(le soundcmd ne peut plus jamais crash le jeu — override seulement) + la confirmation du stepper de piste SAUVEGARDE désormais (ne joue pas). - UX (demande utilisateur) : le « Preview » du sous-menu Music est devenu « Save + Open Custom Alchimie » — Enter sauvegarde la config (f7_inlive.json) + rouvre le menu natif pour Arena+ → Custom Alchimie (le flux standard qui FONCTIONNE). La musique reste stockée dans la config (lock/battle) et s'applique dans le bon contexte (début de bataille), sans playback de sonde.
- Porte : build Release 0 erreurs ; déploiement Steam +
_isolated(backup214436). RT2 : Enter sur « Save + Open Custom Alchimie » ne crash PAS ; config sauvegardée ; Custom Alchimie s'ouvre. ### PATCH
v2.224.1.4
v2.224.1.6BETAPATCH
Seymour2 août 2026
i18n : littéraux bruts migrés vers {x:Static} (porte StringsIntegrityTests verte)
- Dette gizmo F3.5 corrigée : la case « Gizmo 3D (faire glisser sur le canevas) » et l'indice (« Cliquez sur un monstre pour le sélectionner... S = enregistrer · R = réinitialiser ») utilisaient des littéraux bruts dans des attributs (
Content=/Text=) — le testNoXamlHasRawHardcodedUiLiteralattrape les attributs. Migrés vers{x:Static res:Strings.U_gizmo_3d_drag_on_canvas_1aa7857f}+U_click_monster_to_select_drag_hint_fe907a09(neutre EN + PT + props Strings.cs). - Dette d'une autre voie (MonsterAi) :
MonsterAiPhaseRotationAdvanced_Window.axamlavait 2 littéraux bruts (« Foco ativo » / « Limpar foco ») — migrés versU_active_focus_d59334a6/U_clear_focus_91699d35(le test est l'arbitre à l'échelle du projet). - Porte :
StringsIntegrityTests3/3 PASS ; build 0 erreurs.
v2.224.1.5
v2.224.1.7BETAPATCH
Seymour2 août 2026
Visualisation Aurora : noms de monstres dans la bataille (labels + gizmo)
export const MONSTER_NAMESdansmonster_studio.ts(284 vrais noms — « Cujo », « Bunyips »...).- scenes.ts : le mode édition (
?edit=1) dessine désormais des labels sur TOUS les monstres de bataille (vrai nom en blanc ; le sélectionné en jaune) + l'overlay du gizmo montre le nom du monstre sélectionné (ex. « Flambos noir (slot 6) ») au lieu de juste « slot N ». - Porte : typecheck noclip propre ;
rsbuildOK ; bundle461.0fe1690d.jsdéployé (contient « Cujo »/« Bunyips ») ; patch versionné dansdocs/patches/noclip/(scenes.ts + monster_studio.ts).
v2.224.1.6
v2.224.1.8BETAPATCH
Seymour2 août 2026
Aurora : l'AURORA CHAMBER revient comme Aurora principale (battle preview retiré) + i18n PT→EN des modules Aurora
- Aurora Chamber RÉACTIVÉE comme catalogue « Aurora » :
MenuItem_AuroraetMenuItem_AuroraChamberouvrent désormaisAuroraChamber_Control(catalogue BIANCA + MapViewer + Open RealGame — la vraie bataille). Nouveau helperOpenAuroraChamber(). Le battle preview (noclip) devient code hérité (entrée « aurora » désactivée dans le catalogue ; la desc ViewerHub/aurora reste gelée). - ModuleCatalogPolicy : entrée
aurora-chamberréactivée (« Aurora Chamber ») ;aurora(battle preview) marqué 🚫 LEGACY (commenté). Ajouté le dispatchcase "aurora-chamber". - i18n PT→EN des modules Aurora : le neutre (Strings.resx) avait des valeurs PT (l'éditeur EN montrait du PT) — corrigé en EN : 12 clés existantes (AURORA·Battle Maps, Selected place, Visualization, Editing, Session, Open arena in Aurora Chamber, Filter by field..., Selected field, Exports map/..., Field Picker, overworld, MapViewer 3D) + 23 nouvelles clés (boutons Chamber et Field Explorer : Re-scan, Mount missing, Remount all, Open EditViewer, Open RealGame, Save positions, Add/Remove monster, Exporter anchors, Restore RealGame, Reload battle, Re-export and open, Remount scene, Exporter folder, Save camera, Save camera params, Publish Scout, Update markers, Publish and open field, Validate visual, Open field, Re-export, Browser). EN dans le neutre + PT dans le satellite (vérifié : déjà là en PT) + props Strings.cs.
- Porte :
StringsIntegrityTests3/3 PASS ; build 0 erreurs.
v2.224.1.7
v2.224.1.9BETAPATCH
Seymour2 août 2026
Bugfix : Open RealGame (404) + carte Aurora à l'envers
- Bug 1 — RealGame 404 :
Aurora3DLauncher.BuildBattleUrl(utilisé par l'« Open RealGame » de la Chamber) démarrait un python http.server hérité à la racine noclip (Downloads) — mais l'index.html de noclip est dansdist/, donc/index.htmlrenvoyait 404 (« page not found »). Correctif :BuildBattleUrlutilise désormaisViewerHubService.BuildUrl("aurora", ...)(le StudioWebServer in-process avec le serve-dir noclip — le bon index.html). RetiréEnsureViewerServer/IsPortListening(python hérité — retiré en F2). Le MODULE (RealGame avec monstres) continue de fonctionner — seule la PAGE battle-preview est héritée. - Bug 2 — carte à l'envers :
applyAssetOrientationdansRuntimeTools/FFXMapViewerWeb/app.jsappliquaitrotation.x = Math.PI(flip π sur X) pourbtlmap(l'arène d'Aurora Chamber) — retournant la carte. Le glTF de carte est déjà Y-up. Correctif :rotation.set(0,0,0)(pas de flip) pour tout — sol en bas, ciel en haut. - Porte : build 0 erreurs ;
node --checkOK sur app.js ; le MapViewer est servi directement depuis le dépôt (préfixe /map/) — l'app.js corrigé est déjà servi.
v2.224.1.8
v2.224.1.10BETAPATCH
Seymour2 août 2026
Bugfix : {x:Static} en contenu d'élément montrait le littéral brut (et crashait à l'ouverture de l'éditeur)
- Bug : les 25 boutons des modules Aurora (Chamber + Field Explorer) que j'ai migrés vers i18n utilisaient
{x:Static res:Strings.X}comme contenu d'élément (<Button>{x:Static}</Button>). Avalonia ne résout PAS{x:Static}en contenu d'élément — il montre le littéral brut (« {x:Static res:Strings.U_...} ») et peut crash au runtime à l'utilisation du bouton (la raison du « la carte crash à l'ouverture de l'éditeur »). - Correctif : convertis les 25 en attribut
Content="{x:Static res:Strings.X}"(le bon motif).{x:Static}ne se résout qu'en attribut (Content=,Text=,Header=,Watermark=,ToolTip.Tip=). - Porte : build 0 erreurs ;
StringsIntegrityTests3/3 PASS ;node --checkOK.
v2.224.1.9
v2.224.1.11BETAPATCH
Seymour3 août 2026
F7 : panneau de verre dans le sous-menu (fenêtre unique) + crash compose CORRIGÉ (force-gate avant le launch)
- Bug 2 (UX — l'utilisateur a demandé « une nouvelle fenêtre ») :
F7Sub_DrawCb(dllmain ~11580) a reçu le grand panneau de verre (DrawMenuGlassPanel(NX(0.047f), NY(0.20f), NW(0.906f), NH(0.62f), F, 1)) — le sous-menu Sound est désormais une FENÊTRE (fond + titre + lignes À L'INTÉRIEUR), style compose-pick. - Bug 1 (crash de début de bataille Custom Alchimie — cause racine) :
ArenaPlus_LaunchComboBattleFromPump(le MsBattleEncountExe) tournait avec le force-gate ON (g_forceSubsystem = 0n'était qu'APRÈS le launch) — le jeu entrait en bataille avec 0x13407E4=1 (mode menu) → le début de bataille crashait dansUpdateWindowTitle→DrawUITextElement(rva 0x4FB05E — AV WRITE 0xBD). Correctif :g_forceSubsystem = 0+ 0x13407E4 mis à zéro DIRECTEMENT AVANTArenaPlus_LaunchComboBattleFromPump(Launch + LaunchCached — le relaunch). - Porte : build Release 0 erreurs ; déploiement Steam +
_isolated(backup095551). RT2 en attente : Custom Alchimie → Build + Launch → la bataille entre SANS crash ; sous-menu Sound = fenêtre unique. ### INFRA (CI) ci.ymllançait la CI sur tout push versmainetcodexclaudiocodeffxeditor(la branche de travail où les voies committent constamment) — 2 jobs sur des runners Windows ($0,010/min) ont épuisé le quota gratuit de 3 000 min/mois (Actions $22,70).- Correctif : le déclencheur de push est désormais seulement
main(branches: [main]). La CI valide toujoursmain(et les PRs versmain) ; la branche de travail n'a plus de CI automatique (valider localement avecdotnet build). - Économies estimées : ~90 % des runs Actions (réduit le coût récurrent en minutes). ### PATCH
v2.224.1.10
v2.224.1.12BETAPATCH
Seymour3 août 2026
LOG : rotation automatique par compte d'ouvertures (max 10, historique `.old1..old9`)
OpenLog(dllmain ~173) compte désormais les ouvertures (fichier%TEMP%\ffx-hooks.log.cnt) ; à chaque 10e ouverture, déplace le log actuel versffx-hooks.log.oldN(accumule l'historique.old1..old9;.old1est écrasé après 9 rotations) et réinitialise le compteur. Le log principal n'accumule plus plus de ~10 sessions ; l'utilisateur supprime les.old*au besoin.- Porte : build Release 0 erreurs ; déploiement Steam +
_isolated(backup102648). ### PATCH
v2.224.1.11
v2.224.1.13BETAPATCH
Seymour2 août 2026
Correctif RealGame (bataille vs field) + EditViewer s'ouvre toujours + RÈGLE GÉNÉRALE de debug log (Phases 1-4) + carte d'analyse de tout l'éditeur (Phase 5)
- Correctif RealGame (la bataille revient) :
BuildBattleUrlpassait l'extraQuery AVEC?àViewerHubService.BuildUrl(qui ajoute déjà?) → l'URL devenaitindex.html??battle=...→ leURLSearchParamsde noclip ne lisait pasbattle→ seulement le field (carte), pas de bataille. Désormais l'extraQuery est sans?→?battle=<encId>&map=&actors=1→ la bataille avec monstres revient. - EditViewer ne « ne fait plus rien » : le repli
RenderSceneouvre désormais la scène vide (grille + overlay) même SANS ancres quand l'export glTF échoue (avant, exigeait des ancres — sans elles, le rendu renvoyait une erreur et le bouton ne faisait rien). Le log capture la raison de l'export. - DEBUG LOG — RÈGLE GÉNÉRALE (
FFXProjectEditor/Diagnostics/DebugLog.cs) : helper centralInfo/Warn/Erroravec[Conditional("DEBUG")](retiré en Release — zéro surcoût). Sortie : débogueur +%LOCALAPPDATA%\FFXProjectEditor\debug.log+work/editor-debug.log. Instrumenté : RealGame (URL générée), EditViewer (rendu), SelectSceneByMapKey (bika00_10), ExportSceneGeometry (échecs), ViewerHub (BuildUrl/EnsureServer). - Règle permanente : ajoutée à
AGENTS.md+CLAUDE.md— chaque nouveau module DOIT avoir des réponses de debug. Docs :docs/ai/DEBUG_LOGGING_RULES.md(la règle) +docs/ai/DEBUG_LOGGING_MAP_2026-08-02.md(Phase 5 — analyse de tout l'éditeur : ~51 modules + infra + frontières ; où/quelles tables de champs de debug par domaine ; priorité d'implémentation ; UI vs log). - Porte i18n : 5 littéraux bruts de
MagicDllEditor_Control.axaml(flèches + infobulles Back/Forward — dette d'une autre voie) migrés vers{x:Static}(le test est l'arbitre à l'échelle du projet). - Porte : builds Debug + Release 0 erreurs ; tests 20/20 PASS (StringsIntegrityTests 3/3 + ViewerHub 17/17).
- Le hook capture le stdout du lab via pipe (CreatePipe + STARTF_USESTDHANDLES — le job compose lit la sortie et extrait les lignes PREV|) et dessine le panneau de points dans le menu (panneau de verre gauche — le layout qui entrera en bataille).
- Nouveau bouton « Aperçu de compilation (layout bolinhas) » dans Custom Alchimie : compose SANS launch (le menu reste ouvert — statut « Preview pronto — layout acima. Fight Last Alchimie p/ entrar. ») → l'utilisateur voit les points AVANT d'entrer → « Fight Last Alchimie » (existant) lance le bin déjà composé.
- Flux : pick des aeons + scénario → Aperçu de compilation → voir la carte (P à droite / monstres à gauche / h cam) → Fight Last Alchimie → bataille.
- Build lab 0 erreurs + ffx-hooks (avec PolyHook) 1 113 600 B ; LabDeploy vers Steam (vrai lab + hooks).
- RT2
Needs Testing: Custom Alchimie → 4 aeons → Aperçu de compilation → vérifier la carte dans le panneau gauche → Fight Last Alchimie → bataille avec le layout montré. ## [Unreleased] ### MINOR
v2.224.1.12
v2.224.1.14BETAPATCH
Seymour2 août 2026
DEBUG LOG v2 : drapeaux 3+1 par zone + global auto/dev/prod + UI Event Tracer + pont console WebView + exception globale + item de menu « Open debug log »
- DebugLog v2 (
FFXProjectEditor/Diagnostics/DebugLog.cs) : drapeau GLOBAL (auto=Debug→dev/Release→prod ;FFX_DEBUG_MODE=dev|prodforce) + drapeaux par zone (debug_flags.json:0=OFF,1=ACTIVEjournalise pendant que la zone est traitée,2=ALWAYSjournalise à toute erreur,3=FORCEDEBUGjournalise MÊME en Release). LOGS TOUJOURS EN ANGLAIS (hors i18n). Rotation de 5MB +.old1..old9(aligné avec la voie de hooks C++). - UI Event Tracer :
Main_Windowintercepte TOUS les clics de boutons (AddHandler Button.ClickEvent) et journalise automatiquement avec le module actif (UiTracer) — pas de logging par clic nécessaire. - ActiveScope :
SetModuleactive/désactive la zone du module ouvert (le drapeau 1 l'utilise). - Pont console WebView :
WebView2Hostinjecte un script redirigeant lesconsole.error/warn/logdu JS hébergé (noclip/MapViewer) →WebMessageReceived→DebugLog(WebView.Console) — les bugs JS du visualiseur atterrissent désormais dans le log. - Exception globale :
AppDomain.CurrentDomain.UnhandledException+TaskScheduler.UnobservedTaskException→DebugLog.Error("Global", ...). - Menu : item « Open debug log » dans le flyout du sélecteur de langue (ouvre le debug.log).
- Test :
DebugLogTests(3/3 — écriture EN, format timestamp+zone+type, exception avec type). - Docs :
DEBUG_LOGGING_RULES.mdmis à jour (modèle de drapeaux + EN + tracer + le minimum manuel requis). - Porte : builds Debug + Release 0 erreurs ; tests 23/23 PASS (i18n 3/3 + ViewerHub 17/17 + DebugLog 3/3).
v2.224.1.13
v2.224.1.15BETAPATCH
Seymour3 août 2026
Crash de bataille Custom Alchimie : draw de compose-pick désactivé PENDANT le compose
- Mécanisme (confirmé dans IDA) : le FAULT (AV WRITE
accessed=0xBD) atterrit dansDrawUITextElement(0x640810, pc 0x6409A5) — lectx(viaFFX_Menu2D_ResolveCaptureCtxCore) est null/corrompu —UpdateWindowTitle(0x4FAE40) crashe en dessinant le texte de sauvegarde. Le crash arrive PENDANT le compose (le runner ArenaMultiBossLab), avec notre menu (compose pick) ouvert. - Correctif :
ComposePick_Draw(le DrawCb de compose-pick) retourne désormais tôt quandg_jobState == JOB_RUNNING— notre menu n'engueule PAS de texte dans le menu 2D du jeu pendant le compose (EncodeLabel/DrawStringcorrompaient le pool/cache de texte : cache-hit → pool[cursor-1] sans vérification de borne → handle invalide). Le menu se fige 1-2s (le compose est rapide) et revient à la normale après. - PREMIER COMMENTAIRE WHY — ce correctif est déjà livré avec le commentaire why (anglais) dans le code.
- Porte : build Release 0 erreurs ; déploiement Steam +
_isolated(backup140132). RT2 en attente : Custom Alchimie → Build + Launch → le crash de compose devrait disparaître. ### PATCH
v2.224.1.14
v2.224.1.16BETAREVISION
Seymour3 août 2026
RÈGLE DU WHY-COMMENT pour les hooks + 1re passe WHY
- Nouvelle règle (CLAUDE.md) : toucher un hook → laisser le WHY dans le code (en anglais) —
// WHY: ...(la raison, pas le quoi),// FIX <date>: ...(avec le pourquoi),// KEY <date>: ...(insight RE). Concentrer l’analyse sur les endroits non évidents (porte, offset, ordre critique, collision pool/ctx, décision d'architecture) — pas de spam, pas de bible des basiques. - 1re passe WHY : dllmain (flux de confirmation du menu natif — pourquoi le câblage a été retiré ; lancement compose — force-gate avant MsBattleEncountExe) + ArenaPlusComposePick (ComposePick_Draw désactivé pendant le compose — le crash du pool 2D).
- Porte : build Release 0 erreurs (les commentaires ne changent pas le comportement) ; pas de déploiement (RÉVISION — doc/commentaire de code). ### PATCH
v2.224.1.15
v2.224.1.18BETAPATCH
Lulu3 août 2026
Magic DLL Editor : schéma `pppVertexApAt` décomposé (4 vrais champs) + nettoyage `pppMatrixLoc` (host-only) + DebugLog dans `Magic.Parse`/`Magic.Writer`
- Décomposition (décompile IDA 0x7583D0) :
pppVertexApAta désormais 4 champs éditables (model_indexu16@+4,vertex_countu8@+6,delay_framesu8@+7,order_modeu8@+8 ; fenêtre{4,5},editable=true). Appliqué àfield_map.json+MagicFieldMapEmbeddedData.cs. - Nettoyage honnête :
pppMatrixLoc(décompile 0x734200) opère uniquement sur l'état hôte (zéro lecturea2/record) — les 3 champsparam_s32_64/68/72étaient des offsets inventés → retirés,payload_consumer=false,SEM_PAYLOAD(correct). - Non appliqué (constat RE) :
pppKeThRes32/48—a2+12est un pointeur de ressource (builder de chaîne), pas un bouton numérique ; l'éditer en u32 corromprait le pointeur. Documenté. - DebugLog v2 :
TryLoad(Magic.Parse) +TryGrowRecord(Magic.Writer) instrumentés avecDebugLog.Info/Warn/Error(anglais, monolingue). - Porte : build Release 0 erreurs ; tests MagicDll 76/76 + StringsIntegrity 3/3 (79/79).
- Le crash (reproduit SANS compose) : ouvrir F7 + parcourir le menu (après un preview/bataille) → FAULT AV WRITE
pc=0x2409A5accessed=0xBD(le MÊME que compose) —UpdateWindowTitle(0x4FAE40) crashe dansDrawUITextElementavec le pool/ctx du menu 2D corrompu par notre menu (dessinant BEAUCOUP de textes à chaque frame : cache-hit → pool[cursor-1] sans vérification de borne). - Correctif (définitif) : hook sur
FFX_System_UpdateWindowTitle(0x4FAE40) — avec notre menu natif actif (F7/sous-menu/compose pick), le hook renvoie 0 — le jeu ne dessine PAS le texte de titre (cosmétique) et ne touche pas au pool corrompu → pas de crash. Le titre reprend sa mise à jour à la fermeture du menu. - Porte : build Release 0 erreurs ; déploiement Steam +
_isolated(backup144123). RT2 : F7 ouvert + quitter la bataille → pas de crash. ### RÉVISION
v2.224.1.17
v2.224.1.19BETAPATCH
Seymour3 août 2026
ÉDITION LIVE DE POSITION (Partie 1) : fenêtre « dot-map » dans le hook (monstres + joueurs)
- La fenêtre : dans le compose pick (Custom Alchimie), avec Aperçu de compilation fait, appuyez sur E → entre dans le mode d'édition de grille (la dot map 16×8 — chaque bicho = un
P, l'actif =X). - Interaction : les flèches déplacent le curseur (le
Pdu bicho actif) ; TAB bascule de bicho ; ENTER sauvegardemodules\arena_positions.json(le gx/gy de grille de chaque bicho) ; Annuler revient en arrière. SavePositions/ResolvePositionsPath: le JSON dans modules (la grille 16×8 — le runner compose le lira plus tard et appliquera leBattleArenaPositionWriterC# dans le bin — le lien de la partie suivante).- WHY (dans le code) : le jeu lit les positions des bichos depuis les ancres chunk3 du bin (
pos = bin + chunk3 + 16×a5) — sauvegarder la grille éditée permet au compose d'appliquer le placement personnalisé. - Porte : build Release 0 erreurs ; déploiement Steam +
_isolated(backup153130). RT2 : E dans compose pick (avec preview) → la fenêtre de points s'ouvre ; déplacer + ENTER sauvegarde le JSON. ### PATCH
v2.224.1.18
v2.224.1.20BETAPATCH
Lulu3 août 2026
Magic DLL Editor : fil d'Ariane (back/forward) déplacé HORS du split dossier/champ — apparaît désormais aussi à une feuille (item/champ)
- Avant : le bouton back n'apparaissait qu'en vue dossier (
IsContainer) ; à une feuille/champ, il disparaissait — et on ne pouvait pas revenir. - Maintenant : le fil d'Ariane (⬅ back · ➡ forward · chemin) est affiché toujours quand il y a une sélection (dossier OU feuille), permettant la navigation back/forward depuis n'importe quel item.
- Porte : build Release 0 erreurs ; StringsIntegrityTests 3/3.
- Une fenêtre : dans le compose pick (le Custom Alchimie), avec Aperçu de compilation fait, appuyez sur E → entre dans le mode d'édition de grille (la map de points 16×8 — chaque entité = un
P, l'active =X). - Interaction : les flèches déplacent le curseur (le
Pde l'entité active) ; TAB bascule d'entité ; ENTER sauvegarde lemodules\arena_positions.json(le gx/gy de grille de chaque entité) ; Annuler revient en arrière. SavePositions/ResolvePositionsPath: le JSON dans modules (la grille 16×8 — le runner compose lira plus tard et appliquera leBattleArenaPositionWriterC# dans le bin — le lien pour la partie suivante).- WHY (dans le code) : le jeu lit les positions des entités depuis les ancres chunk3 du bin (
pos = bin + chunk3 + 16×a5) — sauvegarder la grille éditée permet au compose d'appliquer le positionnement personnalisé. - Porte : build Release 0 erreurs ; déploiement Steam +
_isolated(backup153130). RT2 : E dans le compose pick (avec preview) → la fenêtre de points s'ouvre ; déplacer + ENTER sauvegarde le JSON. ### PATCH
v2.224.1.19
v2.224.1.21BETAPATCH
Seymour3 août 2026
LIEN d'édition live de position : le runner compose applique la grille personnalisée au bin
BattleComposeRunner(Partie 2 du positionnement live) : nouveauReadCustomPositionsJson(modRoot)(lit learena_positions.jsonsauvegardé dans le hook) +ApplyCustomPositions(...)(convertit la grille 16×8 → X/Z réels — X ±28, Z 30→46 — et applique viaBattleArenaPositionWriter.WritePositions, préservant Y/W).- Dans le compose : si
arena_positions.jsonexiste, le runner utilise la grille personnalisée (premieractorCount= monstres dans MonsterLive ; le reste = party dans PartyFront) au lieu de l'auto-layout de caméra. Log :[custom-positions] grid do hook aplicado em .... - Flux complet (Partie 1 + 2) : compose pick → Aperçu de compilation → E → déplacer les
P(flèches/TAB) → ENTER sauvegarde le JSON → Launch → le compose applique la grille personnalisée au bin → la bataille démarre avec le placement édité. - Porte : build lab (C#) 0 erreurs ;
ArenaMultiBossLab.dlldéployée dans le jeu (backup180311). RT2 : éditer la position dans le hook → Launch → la bataille avec le placement personnalisé. ### PATCH
v2.224.1.20
v2.224.1.26BETAPATCH
Lulu3 août 2026
Magic DLL Editor : Phase 1 (clone) + Phase 2 (override de magie noclip) + Phase 3 (aperçu 3D embarqué verrouillé)
- Phase 1 — Bouton Clone : nouveau
CloneMagicCommand+TryCloneMagic(copie les octets de travail avec les éditions vers une nouvellemagic_<id>.dll; backup .bak ; id validé). Bouton « Clone » dans la barre d'outils. - Phase 2 —
MagicOverrideService: écrasedata/FinalFantasyX/11/<id>.bindans noclip avec la DLL personnalisée (backup vanilla.magic3d.bak; restauration). noclip rend déjà la magie viaBIN.parseMagicFile— pas de RE profonde nécessaire. - Phase 3 — Aperçu 3D embarqué : le bouton « Preview » ouvre le WebView2Host embarqué (mini navigateur) dans l'éditeur, verrouillé sur la magie en cours d'édition (override de
11/<id>.bin+ URL magic-studio). Bouton de fermeture (✕). - Porte : build Release 0 erreurs ; MagicDll 76/76 + StringsIntegrity 3/3.
- Phase A — humanisation des types réels : le champ
DetailTextmontre désormais SEULEMENT la description humaine (plus de[u16], d'offset, de largeur) — le type brut que vous voyiez a disparu. Avis lecture seule aussi dans la vue dossier (les slots non éditables comme pppDrawMatrix montrent « Read-only » + la raison). - Phase B — recherche IDA de masse (23 handlers décompilés) : reclassés 3 SEM_PAYLOAD → FECHADO avec de vrais champs :
pppKeLnsLpSft(110 DLL, 2 floats de shift de lentille),pppDrawHook(10 DLL, callback),pppKeAcmCic(mode). Confirmé le reste (KeShpTail*, KeDMat*, Matrix*, DrawMatrixWood) comme host-only/stubs (pas de décomposition) — documenté. - Phase C — catalogue élargi : +19 descriptions humaines (total ~94 opcodes) couvrant les nouveaux FECHADO + les SEM_PAYLOAD host-only.
- Porte : build Release 0 erreurs ; MagicDll 76/76 + StringsIntegrity 3/3 (79/79).
- Vue de champ redessinée : un champ montre désormais nom + description humaine + type lisible (ex. « decimal (float) ») + valeur éditable dans une carte. Offset et type brut (
u16) cachés — le joueur n'y touche pas. - Read-only clair : les champs non éditables montrent un avis « Read-only » surligné + la raison (ex. « raw data — the editor can't decompose it yet »).
- Catalogue de descriptions humaines (
MagicPppDescriptionCatalog.cs) : ~60 opcodes ppp avec ce qu'ils font en langage joueur (basé sur décompile IDA + docs RE). Affiché dans le DetailText du slot. - Infobulle grow-size : explique que 4B/8B/12B/16B = octets extra d'espace (1/2/3/4 valeurs).
- Porte : build Release 0 erreurs ; StringsIntegrity 3/3 + MagicDll 76/76 (79/79).
v2.224.1.25
v2.224.1.28BETAREVISION
Lulu4 août 2026
Magic DLL : Phase 4 ? RE profonde de l'aperçu 3D (layout noclip mappé à la source)
- Nouveau doc :
docs/reverse/magic_dlls/NOCLIP_PREVIEW_LAYOUT_MAPPING_2026-08-03.md? mappe le cheminparseMagicFile?sniffMagic?parseParticleDatade noclip.website (vraie source). - Verdict : les éditions de champs confinées à la fenêtre = SÛRES pour l'aperçu (noclip relit les mêmes offsets ; strides fixes 0x28/0x10 inchangés) ; un grow structurel au milieu d'un record que noclip stride par-dessus = CASSÉ l'aperçu ; grow sûr = extension de liste pilotée par compte à la queue + bump de compte.
- Mise en garde clone : noclip ne rend que les ids présents dans sa
magicTable; id hors table ?sniffMagicnull ? émetteurs vides (limitation noclip, pas l'override). - Doc/RE seulement (RÉVISION) ? AUCUN changement de comportement. — MUSIQUE CUSTOMMIX RÉSOLUE : piste 145 « Challenge » qui joue en bataille.** Voie Jarvis-HOOK. [précédent :
v2.224.1.26] - La victoire : après 4 routes échouées (
SetArenaBattleMusicPending→ seulement les intercepteurs Arena+ ;PrepBattleTrack→ couche moteur, pas FMOD ;PlayTrackWithPreload→ posaitevent_indexmais ne peuplait pastracks_array[].event_ptr),SwitchCrossfade(self, 145, 0, 1)l'a débloqué — via IDA MCP surffxoficial.exe.i64(FFX.exe pid=49476). - Découverte clé (RE, commit
d4fdbc6c) : l'arbre audio de FFX a 3 couches —PlayTrackByIndex(0x7097E0) saute silencieusement sitracks_array[track].event_ptr == 0;PlayTrackWithPreload(0x886980) ne pose queevent_indexdans la sous-struct du moteur ;SwitchCrossfade(0x7089F0, chemin B) est le SEUL qui peupleevent_ptrviaReadEventByRuntimeId→MapRuntimeIdToFevIndex(table0xB4F1C8) →EventSystem->GetEvent. - Vérifications prouvant que 145 devrait jouer :
dword_B4F1C8[145] = 0x48(index FEV 72, valide ≤181) ;unk_CEC164 = 0(la porte de chargement ne bloque pas) ;IsValidTrackIndex(145) = true(145 ≤ 0xB5). - Correctif dans
MusicHook_Shim: à l'override, appelerSwitchCrossfade(overrideTrack, 0, 1)(fade=0, load_flag=1) au lieu dePlayTrackWithPreload; préférer le trampolineg_trampolineSwitch(saute le shim, évite la récursion). - RT2 confirmé par l'utilisateur : « NOW TRACK 145 WORKS! I'M IN BATTLE WITH THE NEW MUSIC! » — Challenge joue dans CustomMix.
- Porte : build Release 0 erreurs ; déploiement Steam +
_isolated; commitd4fdbc6cpoussé.
v2.224.1.27
v2.224.1.30BETAPATCH
Seymour5 août 2026
Gils CustomMix : coût de bataille JAMAIS facturé (bug de course) + le compose n'écrase jamais les bins vanilla
- Gils CustomMix :
ArenaPlusComposePick_Close()mettaitg_pendingLaunchGilCostà zéro AVANT queLaunchComboBattleFromPumppuisse le lire — le Gils était validé dans le menu mais jamais facturé (x3/x4/x5, depuis l'implémentation du compose). La somme était correcte (ex. 325000G pour Trio) maisgilCost=0dans le log. Correctif : le zéro déplacé deClose()versOpen()(réinitialiser à l'ouverture de session, pas à la fermeture). - Le compose écrasait des bins vanilla (d5e56701) : 5 scénarios cross-map (macalania_forest x3, remiem x3/x4/x5, bikanel x4) déployés vers le bin modèle (
mcfr00_00,kino00_00,bika02_01) au lieu de la porteuse dédiée (mcyt00_22,nagi05_23,nagi05_22) — le moteur chargeait des encounters aléatoires au lieu de l'équipe composée. C# :ResolveOutputBattleIdrenvoiecarrier.BattleId. C++ : le pin du hook utiliseroute.battleId(porteuse) pour le nom d'encounter. Bins vanilla intacts. - Déploiement : DLL de hook rebuildée + déploiement Steam. Porte :
arena_plus_charge_gil.flag(active). - Phase 3 ? RE de l'id embarqué : en comparant magic_0140 vs magic_0141 (même taille, 22 diffs), l'id n'existe PAS comme u32 LE dans .data ? seulement comme 3 chaînes UTF-16LE (« magic_0140 » / « magic_0140.dll ») aux offsets 0x07E3C6, 0x07E4B2, 0x07E4F2.
- Phase 3 ?
MagicDllNameRewriter: réécrit les 3 chaînes vers le nouvel id dansTryCloneMagic(rembourrage à 4 chiffres = même longueur = aucun décalage d'offset). Validé contre la vraie DLL : 3 occurrences réécrites, delta de taille = 0 (RT0 fidèle aux octets hors des chaînes). - Phase 4 ?
MagicCommandAssociation: associe une ligne de command.bin au clone en posantAnim1Id = newId(chaîne prouvée : command.Anim1Id ? magic_%04d.dll). Édition de CHAMP (pas de grow) viaAbility_Command.WriteList(préserve le pool de texte). Limite honnête : remplace l'effet visuel de la compétence d'origine ; une NOUVELLE compétence (préservant l'originale) exigerait un grow (référence :CommandGrowWriter.AppendElementWards). - Déploiement : build LAB dans
FFX\Mods\FFXProjectEditor-v2.224.1.29\. offline_ci : 8 échecs (tous PhaseManager/bataille préexistants ? AUCUN de Magic/PPP).
v2.224.1.29
v2.224.1.31BETAPATCH
Seymour6 août 2026
Marathon F7 : 6 bugs + CustomMix Ultra + manette
- 6 bugs corrigés : écran noir à la sortie de F7 (0x13407E4 effacé dans tous les chemins de fermeture), musique Challenge qui fuyait sur CHAQUE bataille (défaut F7_ApplyMusicBattle=145 retiré), FSM à double-entrée vs menu (ClaimModal/ReleaseModal dans les sous-menus F7), spam d'entrée en maintenant confirm/cancel (cooldown aussi sur cancel), Cauchemar absolu avec mauvais éléments (désormais HP 3x, stats ~2x, Haste+Regen+Protect+Shell, pas de Weak/Resist/Absorb), Force Battle capturant Dark Aeons/Combos (filtre F7_SetSkipForceCapture).
- CustomMix Ultra Phase 1+2 : moteur Compose C# (RunUltra — 1-8 monstres, auto-layout, déploiement) + menu F7 intégré (Arena+ → CustomMix Ultra → Build+Launch). Porteuse zzzz00_240, token 0x00F000F0. 13 logs de debug.
- Manette dans ComposePick : L2=éditer la grille, R2=caméra, R1=suivant, L1=précédent via détection de front PadDir + repli clavier. Double labels PS+Xbox (L2-LT, R2-RT, L1-LB, R1-RB).
- Déploiement : DLL de hook + Lab C# déployés vers Steam. Plans : Monster AI Swap, Ultra Phases 3-4.
v2.224.1.30