Aggiornamento 2.224
06/08/2026
v2.224.0.0BETAMINOR
Seymour2 ago 2026
OPERATION DEMON WAVE 1+2: F8 DASHBOARD RIPRISTINATO + ARBITRAZIONE CHIAVI F7/F8. (letterale tecnico: F8 DASHBOARD RESTORED) (letterale tecnico: F8 KEY ARBITRATION)
- Dashboard F8 ripristinato (il source era già nell'albero; mancava il cablaggio):
StartInGameMenuDashboard()+StartUnXBoosterHook()inInstallHooks(gate[dashboard] enableddefault ON — aggiunto akDefaultIniin Config.cpp);InGameMenuDashboard.cpp/UnXBoosterHook.cpp/Config.cppri-aggiunti al vcxproj (Config.cpp (letterale tecnico: re-added)non era mai nel progetto — il gatedashboard.enablednon veniva mai letto). - Arbitrazione chiavi (Wave 2): con
dashboard.enabled, F8/INSERT appartengono al DASHBOARD (unico owner);InGameMenuProcessKeyconsuma F8/INSERT senza toggle (fallback con dashboard off). F7 (NativeMenu/F7_LeverApply) NON TOCCO. (letterale tecnico: UNTOUCHED) - UnX legacy RIMOSSO dal deploy (INC-002 — provato 3/3 crash): (letterale tecnico: REMOVED)
unx.dll/dxgi.dll/dxgi.ini/dxgi.dll.055508/dinput8 - Copia.dllspostati inmodules\_unx_legacy_removed_20260802_*(backup reversibile) in Steam E (letterale tecnico: AND)_isolated. - Nuovi define in ffx_addresses.h:
RVA_FFX_DEBUG_FLAGS(0xD2A8F8),RVA_FFX_PERMANENT_SENSOR,RVA_FFX_BATTLE_PARTICIPATION/RVA_FFX_AP_EARN(0x1F10EA0/0x1F10EC4 da UnX). Seymour giocabile OFF (indirizzo struct party non validato — RE in sospeso; apply rimosso dal booster). - Regola Hooks-EN applicata alla dashboard: "F8 close", "On/Off", "Open/Closed";
Logdella dashboard →DashLog(OutputDebugStringA — ilLogdel dllmain è statico). - Modello ffx-hooks.ini creato in
RuntimeTools/FfxHooksDll/ffx-hooks.ini(con[dashboard] enabled=1). - Gate: build Release 0 errori; stringhe dashboard nel binario (4/4); deploy Steam +
_isolated(backup.bak_20260802_184354). RT2 in sospeso: F8 apre la dashboard, F7 intatto, i cheat della dashboard funzionano. ### MINOR
v2.223.1.0
v2.224.0.1BETAPATCH
Seymour2 ago 2026
OPERATION DEMON WAVE 3: DIALOG SKIP portato in sicurezza (hook, non patch)
DialogSkipHook.{h,cpp}(nuovo): port sicuro della patch legacy UnX hardcodedret 8(RVA 0x30B040 —FFX_FmodVoice_ReadEventData@ 0x70B040, __thiscall validato in IDA): MinHook/PolyHook2 sul target; coninput.dialog_skip=1restituisce 0 subito (stesso effetto del ret 8, REVERSIBILE e dietro gate di config). (letterale tecnico: REVERSIBLE) (letterale tecnico: config-gated)- Dashboard:
Dialog Skip (voices)item in the Input tab (input.dialog_skip, default off). - Cablaggio:
InstallDialogSkipHook(g_base, LogLine)in InstallHooks (dentro il gate della dashboard). - Define:
RVA_FFX_FMODVOICE_READ_EVENT_DATA(0x30B040) in ffx_addresses.h. - Gate: build Release 0 errori; stringhe nel binario; deploy Steam +
_isolated(backup185543). RT2: con la voce ON, i dialoghi parlati vengono saltati (nessun crash); OFF = comportamento vanilla. ### MINOR
v2.224.0.0
v2.224.0.2BETAREVISION
Seymour2 ago 2026
OPERATION DEMON: chiusura documentazione Wave 4 + script RT2
run_f8_rt2.ps1(nuovo): smoke boot + check F8 (dashboard/F7/cheat/dialog skip) — richiede editor chiuso, save usa-e-getta, hash prima/dopo.F8_UNX_INCONSISTENCY_REGISTER(sessione 3): INC-002/005 + P1/P2/P5/P7 RISOLTI; P3 parziale (v2.flag già assente); mai-portare registrato (KillMeNow/auto-update/texture inject/sig-scan). (letterale tecnico: P7 RESOLVED) (letterale tecnico: never-port)- SESSION_HANDOFF + PORT_STATUS: F8
Needs Testing— RT2 in-game in sospeso con l'utente (editor chiuso). - Cleanup:
ingame_menu_v2.flaggià assente dal deploy (P3 confermato pulito). ### PATCH
v2.224.0.1
v2.224.0.3BETAREVISION
Seymour2 ago 2026
OPERATION DEMON: piano post-F8 — Tier 2 via ffx-probe (§9) + check RT2
- F7F8_RECONCILIATION_PLAN §9: con UnX fuori dal deploy, vtable[9] (GetDeviceState) torna a ffx-probe.dll — la probe in-process sul main-thread (FORCEBATTLE/SETINPUT/SOUNDCMD/READ/WRITE/CALL — Tier 2: a_ability/arms_rate/Encounter Table/IA/calibrazione Aurora). Stato attuale: OFF nel deploy (
.RT2OFF); loader presente; la dashboard ha già la voceplugins.ffx_probe. run_f8_rt2.ps1: check heartbeat probe (hooked=1) quando la probe è attiva.- Gate: solo doc (REVISION); deploy non toccato. (letterale tecnico: doc-only) ### REVISION
v2.224.0.2
v2.224.0.3BETAREVISION
Seymour2 ago 2026
TABELLA DISPATCH PPP: CICLO CHIUSO (consumer + tabella principale). (letterale tecnico: PPP DISPATCH TABLE) (letterale tecnico: CYCLE CLOSED)
- Consumer PROVATO (letterale tecnico: PROVEN):
FFX_MagicHost_RelocatePppSection(0x7121D0) —a2 + 40*index(stride 40 = 0x28 nel codice); i chiamanti passano&pppSysProgTbl(0x72a8eapush offset pppSysProgTbl→ 0xC3A500; 0x761b72). L' (letterale tecnico: on-disk)handler_table_indexsu disco di ogni slot diventa il puntatore alla voce della tabella; lo slot runtime = 16B ([0]=index, [1]/[2]=ptr rilocati; count in*(int16*)(record+0x26)) — corrisponde alla finestra T3 di pppSclMove. - pppSysProgTbl @0xC3A500 = la tabella PRINCIPALE (letterale tecnico: MAIN) — layout "progtbl" (name@+0x00, fnMain@+0x08, fnExtra@+0x20), 418 voci (corrisponde alla doc MAGIC del 2026-07-31); slot 0-11 = pppAccele..pppColor con gli handler del ranking Yonishi (pppSclMove T3 = 0x75C090 @ slot 6; pppScale = 0x75D0D0 @ slot 10; pppAngle = 0x75CF20 @ slot 9; pppSclAccele = 0x75B9F0 @ slot 2).
- Correzione rispetto al passaggio precedente: 0xC3A500 NON è un vettore nomi (il blocco 0xC3A4E0 = stringhe debug END/CHR/MAP-G/MAT; rename (letterale tecnico: NOT)
FFX_PppNameVectorREVERTITO). (letterale tecnico: REVERTED) - Rename MAGIC del 2026-07-31 propagati AL DB CANONICO: 0x716D20→FFX_Render_PppProgramProcessor_2, 0x75B830→FFX_PppHandler_Accele, 0x75B900→FFX_PppHandler_Accele_SetFromGlobalQ, 0xC3E798→FFX_PppHostDispatchTable_AltQ, 0xC86080→FFX_PppKeyholeDispatchTable. (letterale tecnico: TO THE CANONICAL DB)
- L'estrattore ha guadagnato il layout progtbl + la tabella principale: 5 tabelle, 1191 handler in
scripts/ppp_dispatch_table.json. Doc:docs/reverse/PPP_DISPATCH_TABLE_RECONCILED_2026-08-02.md(2° passaggio). (Ricevitore Albhed) - C2 con la catena completa: indice su disco → pppSysProgTbl + 40*index → voce (name+fn). Prossimo: la finestra slot 16B disco→runtime (T3) e i 145 alias. (letterale tecnico: on-disk) ### PATCH
v2.224.0.2
v2.224.0.4BETAPATCH
Seymour2 ago 2026
F8 DISABILITATO (gate (letterale tecnico: F8 DISABLED)`dashboard.enabled=false`) + doc consolidata F8+probe
- Flip del gate in 2 punti (kDefaultIni in Config.cpp +
GetBool×2 nel dllmain) — dashboard/booster/DialogSkipHook non partono; InGameMenu torna owner di F8/INSERT (fallback naturale). Reversibile (riattivare = flip + deploy). docs/reverse/FFX_F8_PROBE_CONSOLIDADO_2026-08-02.md(nuovo): F8 (Waves 1-3 + chiusura) + ffx-probe (Tier 2) + come riattivare + voci in sospeso.- Deploy Steam +
_isolated(backup191908); build Release 0 errori. Reiki di nuovo su F7. ### REVISION
v2.224.0.3
v2.224.0.5BETAPATCH
Seymour2 ago 2026
F7: FLICKER CORRETTO (causa radice nel cablaggio leve) + niente numeri stepper grezzi + leva Difficulty REALE. (letterale tecnico: FLICKER FIXED)
- FLICKER (RT2 utente — causa radice con evidenza log): confermare una riga chiudeva il menu (
CloseMenu→m.obj=0) MA (letterale tecnico: BUT)g_forceSubsystemrestava ON — il gioco bloccato in modalità menu (0x13407E4=1) senza menu disegnato = render alternato = schermo flickerante (log:open→ confirm →close (force-gate off)solo al 2° F7 →open...). Fix: il cablaggio ora pulisceg_forceSubsystemal confirm (stesso comportamento dig_nativeWantClose). - Debounce toggle F7 (250ms) in PresentTick — tenere premuto F7 (o tasto bloccato) faceva toggle del menu a ogni edge = flicker.
- "Numero dove non dovrebbe essere": le righe RT_STEPPER mostravano il
[0]grezzo prima dell'edit. Fix:g_rowEdited[]— il valore dello stepper appare SOLO dopo L/R (il toggle [ON]/[OFF] resta sempre visibile). (letterale tecnico: AFTER L) - Leva Difficulty REALE (era uno stub): nuova
F7_SetDifficultyLevel(0..5)(F7InLive) — impostag_cfg.diffGlobal(hpMul 1000/1150/1300/1500/1750/2000 — x1.00..x2.00) +F7_SaveConfig()— l'auto-apply all'inizio battaglia la raccoglie. (letterale tecnico: battle-start) - Gate: build Release 0 errori; deploy Steam +
_isolated(backup193746). RT2 in sospeso: F7 → confirm → il menu si chiude SENZA flicker; niente [0] iniziale; la Difficulty si applica in battaglia. (letterale tecnico: WITHOUT)
v2.224.1.0
v2.224.1.0BETAPATCH
Seymour2 ago 2026
F3.5 PARTE 2: GIZMO DI DRAG in Aurora (trascina il mostro sul canvas) + RE: finestra T3 provata + alias decodificati. (letterale tecnico: DRAG GIZMO)
- Gizmo in noclip (
scenes.ts,?edit=1): il click seleziona l'attore più vicino (picking per proiezione —clipFromWorldMatrix+ divisione w), drag sul piano del terreno (unproject sul piano-y dell'attore, conversione FFX↔noclip via inversa della matrice), overlay (anello giallo + istruzioni), tasti (letterale tecnico: w-divide) (letterale tecnico: y-plane)S = save (POST/api/edits/<encId>— l'endpoint dell'hub — con il delta dello slot) e R = reset (torna alla vanilla). Base vanilla per slot memorizzata in (letterale tecnico: Per-slot)setUpMonsters(delta corretti anche con un sidecar precedente). - ViewerShell: checkbox "Gizmo 3D (arrastar no canvas)" nel pannello edit +
&edit=1/0nell'URL battle-preview + status che mostra lo stato del gizmo. - RE (3° passaggio): finestra T3 16B PROVATA (letterale tecnico: PROVEN) nell'handler pppSclMove (0x75C090 =
FieldMap_AccumulateDoubleLayerDelta_C): legge i 4 float aa2+16..+28(la finestra T3record+0x10..+0x1F) e li accumula ina1+160..+172. Alias decodificati: le 418 voci pppSysProgTbl = 273 nomi unici + 145 ri-registrazioni (letterale tecnico: re-registrations) (i "145 alias" della doc MAGIC = handler ripetuti, non nomi alternativi); l'estrattore ha guadagnatofind_all_strings(368 stringhe nella regione) + il campoisAlias. - Gate: typecheck noclip pulito;
rsbuildOK; bundle461.7bf8f17f.jsdeployato nella serve-dir (contieneeditUpdate+ POST); build C# 0 errori; test ViewerHub 17/17 PASS. - F3.5 COMPLETO (letterale tecnico: COMPLETE): sidecar (parte 1) + gizmo (parte 2) — il ciclo edit → vedi → salva → riapri è chiuso. ### REVISION
v2.224.1.0
v2.224.1.2BETAPATCH
Seymour2 ago 2026
F7 RT2 ROUND 2: "NON SI APRE NIENTE" CORRETTO (il cablaggio rubava il confirm) + Force Battle senza numero + etichetta cheat chiara + i submenu sbloccano la musica. (letterale tecnico: NOTHING OPENS) (letterale tecnico: FIXED)
- BUG 4 (critico — NON SI APRE NESSUN MENU): (letterale tecnico: NO MENU OPENS) il mio cablaggio PumpHook consumava
g_ourClosedPRIMA del pump originale — (letterale tecnico: BEFORE)PollMenunon vedeva mai il confirm → i submenu NON si aprivano mai. (letterale tecnico: NEVER)Fix definitivo: il cablaggio è stato RIMOSSO (letterale tecnico: REMOVED) — il pump originale (CloseMenu →DispatchConfirm→NativeMenu_OnEdge→ submenu/riapertura/force-off) torna a girare intatto. - BUG 3 (Force Battle con numero): la riga era RT_STEPPER (0..250) — ora RT_NONE (nessun valore; fa il lavoro il submenu FORCE —
F7_MENU_FORCE). - BUG 2 (Battle Cheats confuso): rinominato in "Party Invincible (debug)" — la leva (0xD2A8F8+1) è il flag invincibilità party del gioco.
- BUG 1 (menu senza musica): il submenu Music (che il Bug 4 impediva di aprire) ora si apre — l'utente sceglie la traccia nel submenu (
F7_MENU_MUSIC). - Leva spostata:
F7_LeverApplyora è chiamata daNativeMenu_OnEdge(casi ACT_AI_SWAP/ACT_BATTLE_CHEATS — azioni dirette senza submenu; val dag_ourResult). - Gate: build Release 0 errori; deploy Steam +
_isolated(backup200713). RT2: Arena+ si apre, i submenu Music/Force/Difficulty si aprono, il toggle Party Invincible si applica. ### PATCH
v2.224.1.1
v2.224.1.3BETAPATCH
Seymour2 ago 2026
F7 RT2 ROUND 3: MUSIC TRACK 0 = NONE (titolo silenzioso + CRASH entrando in battaglia)
- Bug 1 (schermata titolo/intro senza musica):
music_lock: 0inf7_inlive.json(salvato dal submenu Music) —F7_MusicApplyLockapplicava l'override traccia 0 (silenzio/fuori contesto) al boot. - Bug 2 (Custom Cocktail CRASH entrando in battaglia): (letterale tecnico: CRASHED)
music_battle: 0—F7_ApplyMusicBattle(auto-apply all'inizio battaglia) faceva (letterale tecnico: battle-start)SetArenaBattleMusicPending(0)→ MusicHook applicava la traccia 0 → crash (log: FAULT rva 0x4FB05E subito dopo il compose). - Fix: la traccia 0 diventa none in entrambi i setter (
F7_SetMusicLock/F7_SetMusicBattleTrack:<= 0 → -1) +f7_inlive.jsonpulito (music_lock/music_battle= -1). - Gate: build Release 0 errori; deploy Steam +
_isolated(backup202945). RT2: la musica del titolo torna; Custom Cocktail entra in battaglia senza crash. ### PATCH
v2.224.1.2
v2.224.1.4BETAPATCH
Seymour2 ago 2026
F7 RT2 ROUND 4: feedback Preview + crash Custom Cocktail INVESTIGATO (UpdateWindowTitle/DrawUITextElement). (letterale tecnico: PREVIEW) (letterale tecnico: INVESTIGATED)
- Bug 2 (Preview "non fa nulla"):
F7_MusicPreviewcon lock-1(none — stato config corrente) restituiva SENZA SUONARE (la guardia (letterale tecnico: WITHOUT PLAYING)track < 0). Fix: confermare Preview con val<= 0mostra lo status a schermo (letterale tecnico: on-screen)"Ajuste a faixa (L/R) antes do Preview"; con un val valido suona. (Il flusso: L/R su "Music Lock" → confirm sullo stepper = preview — esisteva già.) - Bug 1 (crash costruendo la battaglia — PERSISTE): (letterale tecnico: PERSISTS) il FAULT (stessa RVA
0x4FB05E) mappato in IDA:FFX_System_UpdateWindowTitle(0x4FAE40) →DrawUITextElement(0x640810,void(ctx, text, x, y, slot)— disegna il testo SAVE nel titolo della finestra; calleeFFX_Save_SystemSaveGame) — the crash is in the menu 2D ctx ("NoTexture"/ResolveTextureNameForUI). The composed bin is OK (24272 B vs 24080 vanilla — 192 B grow with adjusted header). Isolation pending (user): (a) normal battle without compose → crash? (b) compose with 1 aeon → crash? (c) compose with the menu CLOSED before Launch → crash? - Gate: Release build 0 errors; Steam +
_isolateddeploy (backup205601). ### PATCH
v2.224.1.3
v2.224.1.5BETAPATCH
Seymour2 ago 2026
F7 RT2 ROUND 5: PREVIEW CRASH FIXED (probe OFF = MMF 0xCD) + "Preview" becomes "Save + Open Custom Mix"
- (nome ufficiale: Cocktail)
- CRASH Preview (riprodotto dall'utente — "Enter su Preview = crash ORA"): (letterale tecnico: NOW)
F7_MusicPreviewchiamava il soundcmd via probe (ArenaPlus_MusicHookProbeSoundCmd→LabProbeSoundCmd→ MMFFFXProbeBlock_v1) — la probe è OFF nel deploy (.RT2OFF) — l'MMF esiste ma i dati sono il pattern 0xCD (memoria liberata/non inizializzata) →AV READ accessed=0x10CDCDCDdentro ffx-hooks. Fix: SEH (__try/__except) inF7_MusicPreview(il soundcmd non può più crashare il gioco — solo override) + il confirm dello stepper traccia ora SALVA (non suona). (letterale tecnico: SAVES) - UX (richiesta utente): il "Preview" del submenu Music è diventato "Save + Open Custom Cocktail" — Enter salva la config (f7_inlive.json) + riapre il menu nativo per Arena+ → Custom Cocktail (il flusso standard che FUNZIONA). La musica resta memorizzata nella config (lock/battle) e si applica nel contesto giusto (inizio battaglia), senza playback probe. (letterale tecnico: WORKS)
- Gate: build Release 0 errori; deploy Steam +
_isolated(backup214436). RT2: Enter su "Save + Open Custom Cocktail" NON crasha; config salvata; Custom Cocktail si apre. (letterale tecnico: NOT) ### PATCH
v2.224.1.4
v2.224.1.6BETAPATCH
Seymour2 ago 2026
i18n: letterali grezzi migrati a {x:Static} (gate StringsIntegrityTests verde)
- Debito gizmo F3.5 corretto: la checkbox "Gizmo 3D (arrastar no canvas)" e l'hint ("Clique num monstro para selecionar... S = salvar · R = reset") usavano letterali grezzi negli attributi (
Content=/Text=) — il testNoXamlHasRawHardcodedUiLiteralbecca gli attributi. Migrati a{x:Static res:Strings.U_gizmo_3d_drag_on_canvas_1aa7857f}+U_click_monster_to_select_drag_hint_fe907a09(neutrale EN + PT + props Strings.cs). - Debito di un'altra lane (MonsterAi):
MonsterAiPhaseRotationAdvanced_Window.axamlaveva 2 letterali grezzi ("Foco ativo" / "Limpar foco") — migrati aU_active_focus_d59334a6/U_clear_focus_91699d35(il test è l'arbitro a livello progetto). (letterale tecnico: project-wide) - Gate:
StringsIntegrityTests3/3 PASS; build 0 errori.
v2.224.1.5
v2.224.1.7BETAPATCH
Seymour2 ago 2026
Visualizzazione Aurora: nomi dei mostri in battaglia (etichette + gizmo)
export const MONSTER_NAMESinmonster_studio.ts(284 nomi reali — "Rarth", "Bunyips"...).- scenes.ts: la modalità edit (
?edit=1) ora disegna etichette su TUTTI i mostri della battaglia (letterale tecnico: ALL) (nome reale in bianco; il selezionato in giallo) + l'overlay del gizmo mostra il nome del mostro selezionato (es. "Budino oscuro (slot 6)") invece di solo "slot N". (letterale tecnico: e.g) - Gate: typecheck noclip pulito;
rsbuildOK; bundle461.0fe1690d.jsdeployato (contiene "Rarth"/"Bunyips"); patch versionata indocs/patches/noclip/(scenes.ts + monster_studio.ts).
v2.224.1.6
v2.224.1.8BETAPATCH
Seymour2 ago 2026
Aurora: l'AURORA CHAMBER torna come Aurora principale (battle preview pensionata) + i18n PT→EN dei moduli Aurora
- Aurora Chamber RIATTIVATA come catalogo "Aurora" (letterale tecnico: REACTIVATED):
MenuItem_AuroraeMenuItem_AuroraChamberora apronoAuroraChamber_Control(catalogo BIANCA + MapViewer + Open RealGame — la battaglia vera). Nuovo helperOpenAuroraChamber(). Il battle preview (noclip) diventa codice legacy (voce "aurora" disabilitata nel catalogo; la desc ViewerHub/aurora resta congelata). - ModuleCatalogPolicy: voce
aurora-chamberriattivata ("Aurora Chamber");aurora(battle preview) marcata 🚫 LEGACY (commentata). Aggiunto il dispatchcase "aurora-chamber". - i18n PT→EN dei moduli Aurora: il neutrale (Strings.resx) aveva valori PT (l'editor EN mostrava PT) — corretto a EN: 12 chiavi esistenti (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 nuove chiavi (pulsanti Chamber e Field Explorer: Re-scan, Mount missing, Remount all, Open EditViewer, Open RealGame, Save positions, Add/Remove monster, Export anchors, Restore RealGame, Reload battle, Re-export and open, Remount scene, Export folder, Save camera, Save camera params, Publish Scout, Update markers, Publish and open field, Validate visual, Open field, Re-export, Browser). EN nel neutrale + PT nel satellite (verificato: già presente in PT) + props Strings.cs.
- Gate:
StringsIntegrityTests3/3 PASS; build 0 errori.
v2.224.1.7
v2.224.1.9BETAPATCH
Seymour2 ago 2026
Bugfix: Open RealGame (404) + mappa Aurora sottosopra
- Bug 1 — RealGame 404:
Aurora3DLauncher.BuildBattleUrl(usato dall'"Open RealGame" della Chamber) avviava un python http.server at the noclip root (Downloads) — but the noclip index.html is indist/, so/index.htmlreturned 404 ("page not found"). Fix:BuildBattleUrlnow usesViewerHubService.BuildUrl("aurora", ...)(the in-process StudioWebServer with the noclip serve-dir — the correct index.html). RemovedEnsureViewerServer/IsPortListening(legacy python — retired in F2). The MODULE (RealGame with monsters) keeps working — only the battle-preview PAGE is legacy. - Bug 2 — mappa sottosopra:
applyAssetOrientationinRuntimeTools/FFXMapViewerWeb/app.jsapplicavarotation.x = Math.PI(flip π su X) perbtlmap(l'arena dell'Aurora Chamber) — capovolgendo la mappa. Il glTF della mappa è già Y-up. Fix:rotation.set(0,0,0)(nessun flip) per tutto — terreno in basso, cielo in alto. - Gate: build 0 errori;
node --checkOK on app.js; the MapViewer is served directly from the repo (prefix /map/) — the fixed app.js is already served.
v2.224.1.8
v2.224.1.10BETAPATCH
Seymour2 ago 2026
Bugfix: {x:Static} come contenuto elemento mostrava il letterale grezzo (e crashava aprendo l'editor)
- Bug: i 25 pulsanti dei moduli Aurora (Chamber + Field Explorer) che avevo migrato a i18n usavano (letterale tecnico: I)
{x:Static res:Strings.X}come contenuto elemento (<Button>{x:Static}</Button>). Avalonia non risolve{x:Static}come contenuto elemento — mostra il letterale grezzo ("{x:Static res:Strings.U_...}") e può crashare a runtime usando il pulsante (il motivo per cui "la mappa crashava aprendo l'editor"). - Fix: convertiti tutti i 25 all'attributo
Content="{x:Static res:Strings.X}"(il pattern corretto).{x:Static}si risolve solo come attributo (Content=,Text=,Header=,Watermark=,ToolTip.Tip=). - Gate: build 0 errori;
StringsIntegrityTests3/3 PASS;node --checkOK.
v2.224.1.9
v2.224.1.11BETAPATCH
Seymour3 ago 2026
F7: pannello vetro nel submenu (finestra singola) + crash compose CORRETTO (force-gate prima del launch). (letterale tecnico: CRASH)
- Bug 2 (UX — l'utente ha chiesto "una nuova finestra"):
F7Sub_DrawCb(dllmain ~11580) ha ricevuto il grande pannello vetro (DrawMenuGlassPanel(NX(0.047f), NY(0.20f), NW(0.906f), NH(0.62f), F, 1)) — il submenu Sound ora è una FINESTRA (sfondo + titolo + righe DENTRO), stile compose-pick. (letterale tecnico: WINDOW) (letterale tecnico: INSIDE) - Bug 1 (crash all'inizio battaglia Custom Cocktail — causa radice): (letterale tecnico: battle-start)
ArenaPlus_LaunchComboBattleFromPump(la MsBattleEncountExe) girava con il force-gate ON (g_forceSubsystem = 0era SOLO dopo il launch) — il gioco entrava in battaglia con 0x13407E4=1 (modalità menu) → l'inizio battaglia crashava in (letterale tecnico: AFTER)UpdateWindowTitle→DrawUITextElement(rva 0x4FB05E — AV WRITE 0xBD). Fix:g_forceSubsystem = 0+ 0x13407E4 azzerati DIRETTAMENTE (letterale tecnico: DIRECTLY)BEFORE diArenaPlus_LaunchComboBattleFromPump(Launch + LaunchCached — il relaunch). - Gate: build Release 0 errori; deploy Steam +
_isolated(backup095551). RT2 in sospeso: Custom Cocktail → Build + Launch → la battaglia entra SENZA crash; submenu Sound = finestra singola. (letterale tecnico: WITHOUT) ### INFRA (CI) ci.ymleseguiva la CI su qualsiasi push amainecodexclaudiocodeffxeditor(il branch di lavoro dove le lane committano in continuazione) — 2 job su runner Windows ($0.010/min) esaurivano la quota gratuita di 3.000 min/mese (Actions $22.70).- Fix: il trigger push ora è solo
main(branches: [main]). La CI valida ancoramain(e le PR versomain); il branch di lavoro non ha CI automatica (validare localmente condotnet build). - Risparmio stimato: ~90% dei run Actions (taglia il costo ricorrente dei minuti). ### PATCH
v2.224.1.10
v2.224.1.12BETAPATCH
Seymour3 ago 2026
LOG: auto-rotazione per conteggio aperture (max 10, storico (letterale tecnico: auto-rotation)`.old1..old9`)
OpenLog(dllmain ~173) ora conta le aperture (file%TEMP%\ffx-hooks.log.cnt); a ogni 10ª apertura, sposta il log corrente inffx-hooks.log.oldN(accumula lo storico.old1..old9;.old1viene sovrascritto dopo 9 rotazioni) e azzera il contatore. Il log principale non accumula più di ~10 sessioni; l'utente cancella i.old*come serve.- Gate: build Release 0 errori; deploy Steam +
_isolated(backup102648). ### PATCH
v2.224.1.11
v2.224.1.13BETAPATCH
Seymour2 ago 2026
Fix RealGame (battaglia vs campo) + EditViewer si apre sempre + regola generale DEBUG LOG (Fasi 1-4) + mappa analisi editor completo (Fase 5). (letterale tecnico: full-editor)
- Fix RealGame (la battaglia torna):
BuildBattleUrlpassava l'extraQuery CON (letterale tecnico: WITH)?aViewerHubService.BuildUrl(che aggiunge già?) → l'URL diventavaindex.html??battle=...→ gliURLSearchParamsdel noclip non leggevanobattle→ solo il campo (mappa), niente battaglia. Ora l'extraQuery è senza?→?battle=<encId>&map=&actors=1→ la battaglia con i mostri torna. - EditViewer non "non fa nulla" mai più: il fallback
RenderSceneora apre la scena vuota (griglia + overlay) anche SENZA ancora quando l'export glTF fallisce (prima richiedeva le ancore — senza, il render restituiva errore e il pulsante non faceva nulla). Il log cattura il motivo dell'export. (letterale tecnico: WITHOUT) - DEBUG LOG — REGOLA GENERALE (letterale tecnico: GENERAL RULE) (
FFXProjectEditor/Diagnostics/DebugLog.cs): helper centraleInfo/Warn/Errorcon[Conditional("DEBUG")](rimosso in Release — zero overhead). Output: debugger +%LOCALAPPDATA%\FFXProjectEditor\debug.log+work/editor-debug.log. Strumentati: RealGame (URL generato), EditViewer (render), SelectSceneByMapKey (bika00_10), ExportSceneGeometry (fallimenti), ViewerHub (BuildUrl/EnsureServer). - Regola permanente: aggiunta a
AGENTS.md+CLAUDE.md— ogni nuovo modulo DEVE avere risposte di debug. Doc: (letterale tecnico: MUST)docs/ai/DEBUG_LOGGING_RULES.md(la regola) +docs/ai/DEBUG_LOGGING_MAP_2026-08-02.md(Fase 5 — analisi editor completo (letterale tecnico: full-editor): ~51 moduli + infra + confini; dove/quali tabelle campi debug per dominio; priorità implementazione; UI vs log). - Gate i18n: 5 letterali grezzi da
MagicDllEditor_Control.axaml(frecce + tooltip Back/Forward — debito di un'altra lane) migrati a{x:Static}(il test è l'arbitro a livello progetto). (letterale tecnico: project-wide) - Gate: build Debug + Release 0 errori; test 20/20 PASS (StringsIntegrityTests 3/3 + ViewerHub 17/17).
- L'hook cattura lo stdout del lab via pipe (CreatePipe + STARTF_USESTDHANDLES — il job compose legge l'output ed estrae le righe PREV|) e disegna il pannello puntini nel menu (pannello vetro a sinistra — il layout che entrerà in battaglia).
- Nuovo pulsante "Build Preview (layout bolinhas)" in Custom Cocktail: compone SENZA launch (il menu resta aperto — status "Preview pronto — layout acima. Fight Last Cocktail p/ entrar.") → l'utente (letterale tecnico: WITHOUT)vede i puntini PRIMA di entrare (letterale tecnico: BEFORE) → "Fight Last Cocktail" (esistente) lancia il bin già composto. (letterale tecnico: already-composed)
- Flusso: scegli aeoni + scenario → Build Preview → vedi la mappa (P a destra / mostri a sinistra / cam h) → Fight Last Cocktail → battaglia.
- Build lab 0 errori + ffx-hooks (con PolyHook) 1,113,600 B; LabDeploy a Steam (lab reale + hook).
- RT2
Needs Testing: Custom Cocktail → 4 aeoni → Build Preview → controlla la mappa nel pannello sinistro → Fight Last Cocktail → battaglia con il layout mostrato. ## [Unreleased] ### MINOR
v2.224.1.12
v2.224.1.14BETAPATCH
Seymour2 ago 2026
DEBUG LOG v2: flag 3+1 per area + global auto/dev/prod + UI Event Tracer + ponte console WebView + eccezione globale + voce menu "Open debug log". (letterale tecnico: per-area)
- DebugLog v2 (
FFXProjectEditor/Diagnostics/DebugLog.cs): flag GLOBALE (auto=Debug→dev/Release→prod;FFX_DEBUG_MODE=dev|prodforza) + flag per area (letterale tecnico: per-area) (debug_flags.json:0=OFF,1=ACTIVElogga mentre l'area viene gestita,2=ALWAYSlogga su qualsiasi errore,3=FORCEDEBUGlogga ANCHE in Release). (letterale tecnico: EVEN)LOG SEMPRE IN ENGLISH (fuori i18n) (letterale tecnico: LOGS ALWAYS IN ENGLISH). Rotazione 5MB +.old1..old9(allineato alla lane hook C++). - UI Event Tracer:
Main_Windowintercetta TUTTI i click dei pulsanti (AddHandler Button.ClickEvent) e logga automaticamente con il modulo attivo ( (letterale tecnico: ALL)UiTracer) — nessun logging per-click necessario. - ActiveScope:
SetModuleattiva/disattiva l'area del modulo aperto (il flag 1 lo usa). - Ponte console WebView:
WebView2Hostinietta uno script che reindirizzaconsole.error/warn/logdel JS ospitato (noclip/MapViewer) →WebMessageReceived→DebugLog(WebView.Console) — i bug del JS viewer ora finiscono nel log. - Eccezione globale:
AppDomain.CurrentDomain.UnhandledException+TaskScheduler.UnobservedTaskException→DebugLog.Error("Global", ...). - Menu: voce "Open debug log" nel flyout del selettore lingua (apre il debug.log).
- Test:
DebugLogTests(3/3 — scrittura EN, formato timestamp+area+tipo, eccezione con tipo). - Doc:
DEBUG_LOGGING_RULES.mdaggiornata (modello flag + EN + tracer + il minimo manuale richiesto). - Gate: build Debug + Release 0 errori; test 23/23 PASS (i18n 3/3 + ViewerHub 17/17 + DebugLog 3/3).
v2.224.1.13
v2.224.1.15BETAPATCH
Seymour3 ago 2026
Crash battaglia Custom Cocktail: draw compose-pick disabilitato DURANTE il compose. (letterale tecnico: DURING)
- Meccanismo (confermato in IDA): il FAULT (AV WRITE
accessed=0xBD) atterra dentroDrawUITextElement(0x640810, pc 0x6409A5) — ilctx(viaFFX_Menu2D_ResolveCaptureCtxCore) è null/corrotto —UpdateWindowTitle(0x4FAE40) crasha disegnando il testo save. Il crash avviene DURANTE il compose (il runner ArenaMultiBossLab), con il nostro menu (compose pick) aperto. (letterale tecnico: DURING) - Fix:
ComposePick_Draw(il DrawCb del compose-pick) ora restituisce subito quandog_jobState == JOB_RUNNING— il nostro menu NON accoda testo nel menu 2D del gioco durante il compose ( (letterale tecnico: NOT)EncodeLabel/DrawStringcorrompevano il pool/cache dei testi: cache-hit → pool[cursor-1] senza bound check → handle invalido). Il menu si blocca 1-2s (il compose è veloce) e torna normale dopo. - FIRST WHY COMMENT — questo fix parte già con il why-comment (in inglese) nel codice.
- Gate: build Release 0 errori; deploy Steam +
_isolated(backup140132). RT2 in sospeso: Custom Cocktail → Build + Launch → il crash del compose dovrebbe essere sparito. ### PATCH
v2.224.1.14
v2.224.1.16BETAREVISION
Seymour3 ago 2026
REGOLA WHY-COMMENT per gli hook + 1° pass WHY. (letterale tecnico: WHY-COMMENT RULE)
- Nuova regola (CLAUDE.md): tocchi un hook → lascia il WHY nel codice (in inglese) —
// WHY: ...(il razionale, non il cosa),// FIX <date>: ...(con il perché),// KEY <date>: ...(insight RE). Concentrarsi sui punti non ovvi (gate, offset, ordine critico, collisione pool/ctx, decisione architetturale) — niente spam, niente bibbia delle basi. (Reiki) (letterale tecnico: non-obvious) - 1° pass WHY: dllmain (flusso conferma menu nativo — perché il cablaggio è stato rimosso; lancio compose — force-gate prima di MsBattleEncountExe) + ArenaPlusComposePick (ComposePick_Draw disabilitato durante il compose — il crash del pool 2D). (letterale tecnico: native-menu)
- Gate: build Release 0 errori (i commenti non cambiano il comportamento); nessun deploy (REVISION — doc/commento codice). (letterale tecnico: code-comment) ### PATCH
v2.224.1.15
v2.224.1.18BETAPATCH
Lulu3 ago 2026
Magic DLL Editor: schema `pppVertexApAt` decomposto (4 campi reali) + cleanup `pppMatrixLoc` (solo host) + DebugLog in (letterale tecnico: host-only)`Magic.Parse`/`Magic.Writer`
- Decomposizione (decompile IDA 0x7583D0):
pppVertexApAtora ha 4 campi editabili (model_indexu16@+4,vertex_countu8@+6,delay_framesu8@+7,order_modeu8@+8; finestra{4,5},editable=true). Applicato afield_map.json+MagicFieldMapEmbeddedData.cs. - Cleanup onesto:
pppMatrixLoc(decompile 0x734200) opera solo sullo stato host (zero letturea2/record) — i 3 campiparam_s32_64/68/72erano offset inventati → rimossi,payload_consumer=false,SEM_PAYLOAD(corretto). - Non applicato (finding RE):
pppKeThRes32/48—a2+12è un puntatore risorsa (costruttore di catena), non una manopola numerica; editarlo come u32 corromperebbe il puntatore. Documentato. - DebugLog v2:
TryLoad(Magic.Parse) +TryGrowRecord(Magic.Writer) strumentati conDebugLog.Info/Warn/Error(inglese, monolingue). - Gate: build Release 0 errori; test MagicDll 76/76 + StringsIntegrity 3/3 (79/79).
- Il crash (riprodotto SENZA compose): (letterale tecnico: WITHOUT) apri F7 + naviga il menu (dopo un preview/battaglia) → FAULT AV WRITE
pc=0x2409A5accessed=0xBD(lo STESSO del compose) — (letterale tecnico: SAME)UpdateWindowTitle(0x4FAE40) crasha inDrawUITextElementcon il pool/ctx del menu 2D corrotto dal nostro menu (disegna MOLTI testi a ogni frame: cache-hit → pool[cursor-1] senza bound check). (letterale tecnico: MANY) - Fix (definitivo): hook su
FFX_System_UpdateWindowTitle(0x4FAE40) — con il nostro menu nativo attivo (F7/submenu/compose pick), l'hook restituisce 0 — il gioco NON disegna il testo del titolo (cosmetico) e non tocca il pool corrotto → nessun crash. Il titolo riprende ad aggiornarsi quando il menu si chiude. (letterale tecnico: NOT) - Gate: build Release 0 errori; deploy Steam +
_isolated(backup144123). RT2: F7 aperto + uscita dalla battaglia → nessun crash. ### REVISION
v2.224.1.17
v2.224.1.19BETAPATCH
Seymour3 ago 2026
EDIT POSIZIONE LIVE (Parte 1): finestra "mappa puntini" nell'hook (mostri + giocatori). (letterale tecnico: LIVE POSITION EDIT) (letterale tecnico: dot-map)
- La finestra: nel compose pick (Custom Cocktail), con Build Preview fatto, premi E → entra in modalità edit griglia (la mappa puntini 16×8 — ogni bicho = una
P, quello attivo =X). - Interazione: le frecce muovono il cursore (la
Pdel bicho attivo); TAB cambia bicho; ENTER salvamodules\arena_positions.json(il gx/gy in griglia di ogni bicho); Annulla torna indietro. SavePositions/ResolvePositionsPath: il JSON in modules (la griglia 16×8 — il runner compose lo leggerà dopo e applicherà ilBattleArenaPositionWriterC# al bin — il link della parte successiva). (letterale tecnico: next-part)- WHY (nel codice): il gioco legge le posizioni dei bicho dalle ancore chunk3 del bin (
pos = bin + chunk3 + 16×a5) — salvare la griglia editata permette al compose di applicare il posizionamento custom. - Gate: build Release 0 errori; deploy Steam +
_isolated(backup153130). RT2: E nel compose pick (con preview) → la finestra puntini si apre; muovi + ENTER salva il JSON. ### PATCH
v2.224.1.18
v2.224.1.20BETAPATCH
Lulu3 ago 2026
Magic DLL Editor: breadcrumb (indietro/avanti) spostato FUORI dalla cartella/campo split — ora appare anche quando raggiungi una foglia (item/campo). (letterale tecnico: FORA)
- Prima: il pulsante indietro appariva solo nella vista cartella (
IsContainer); raggiungendo un campo/foglia spariva — e non potevi tornare indietro. - Ora: il breadcrumb (⬅ indietro · ➡ avanti · path) è mostrato sempre quando c'è una selezione (cartella O foglia), permettendo la navigazione indietro/avanti da qualsiasi voce. (letterale tecnico: OU)
- Gate: build Release 0 errori; StringsIntegrityTests 3/3.
- Una finestra: (letterale tecnico: A) nel compose pick (il Custom Cocktail), con Build Preview fatto, premi E → entra in modalità edit griglia (la mappa puntini 16×8 — ogni entità = una
P, quella attiva =X). - Interazione: le frecce muovono il cursore (la
Pdell'entità attiva); TAB cambia entità; ENTER salva ilmodules\arena_positions.json(il gx/gy in griglia di ogni entità); Annulla torna indietro. SavePositions/ResolvePositionsPath: il JSON in modules (la griglia 16×8 — il runner compose lo leggerà dopo e applicherà ilBattleArenaPositionWriterC# nel bin — il link per la parte successiva).- WHY (nel codice): il gioco legge le posizioni delle entità dalle ancore chunk3 del bin (
pos = bin + chunk3 + 16×a5) — salvare la griglia editata permette al compose di applicare il posizionamento custom. - Gate: build Release 0 errori; deploy Steam +
_isolated(backup153130). RT2: E nel compose pick (con preview) → la finestra puntini si apre; muovi + ENTER salva il JSON. ### PATCH
v2.224.1.19
v2.224.1.21BETAPATCH
Seymour3 ago 2026
link edit posizione live: il runner compose applica la griglia custom al bin. (letterale tecnico: LINK)
BattleComposeRunner(Parte 2 del posizionamento live): nuovoReadCustomPositionsJson(modRoot)(legge l'arena_positions.jsonsalvato nell'hook) +ApplyCustomPositions(...)(converte la griglia 16×8 → X/Z reali — X ±28, Z 30→46 — e applica viaBattleArenaPositionWriter.WritePositions, preservando Y/W).- In compose: se
arena_positions.jsonesiste, il runner usa la griglia custom (primiactorCount= mostri in MonsterLive; il resto = party in PartyFront) invece dell'auto-layout camera. Log:[custom-positions] grid do hook aplicado em .... - Flusso completo (Parte 1 + 2): compose pick → Build Preview → E → muovi le
P(frecce/TAB) → ENTER salva il JSON → Launch → compose applica la griglia custom al bin → la battaglia parte con il posizionamento editato. - Gate: build lab (C#) 0 errori;
ArenaMultiBossLab.dlldeployato nel gioco (backup180311). RT2: edita la posizione nell'hook → Launch → la battaglia con il posizionamento custom. ### PATCH
v2.224.1.20
v2.224.1.26BETAPATCH
Lulu3 ago 2026
Magic DLL Editor: Fase 1 (clone) + Fase 2 (override magia noclip) + Fase 3 (anteprima 3D incorporata bloccata)
- Fase 1 — pulsante Clone: nuovo
CloneMagicCommand+TryCloneMagic(copia i byte di lavoro con le edit in una nuovamagic_<id>.dll; backup .bak; id validato). Pulsante "Clone" nella toolbar. - Fase 2 —
MagicOverrideService: sovrascrivedata/FinalFantasyX/11/<id>.binnel noclip con la DLL custom (backup vanilla.magic3d.bak; restore). Il noclip rende già la magia viaBIN.parseMagicFile— nessuna RE profonda necessaria. - Fase 3 — Anteprima 3D incorporata: il pulsante "Preview" apre il WebView2Host incorporato (mini browser) nell'editor, bloccato sulla magia in edit (override di
11/<id>.bin+ URL magic-studio). Pulsante chiudi (✕). - Gate: build Release 0 errori; MagicDll 76/76 + StringsIntegrity 3/3.
- Fase A — umanizzazione tipo reale: il campo
DetailTextora mostra SOLO la descrizione umana (niente (letterale tecnico: ONLY)[u16], offset, larghezza) — il tipo grezzo che vedevi è sparito. Avviso read-only anche nella vista cartella (gli slot non editabili come pppDrawMatrix mostrano "Read-only" + motivo). (letterale tecnico: Read-only) (letterale tecnico: non-editable) - Fase B — ricerca IDA di massa (23 handler decompilati): riclassificati 3 SEM_PAYLOAD → FECHADO con campi reali:
pppKeLnsLpSft(110 DLL, 2 float lens-shift),pppDrawHook(10 DLL, callback),pppKeAcmCic(mode). Confermati gli altri (KeShpTail*, KeDMat*, Matrix*, DrawMatrixWood) come host-only/stub (nessuna decomposizione) — documentato. - Fase C — catalogo espanso: +19 descrizioni umane (totale ~94 opcode) che coprono i nuovi FECHADO + i SEM_PAYLOAD host-only.
- Gate: build Release 0 errori; MagicDll 76/76 + StringsIntegrity 3/3 (79/79).
- Vista campo ridisegnata: un campo ora mostra nome + descrizione umana + tipo leggibile (es. "decimal (float)") + valore editabile in una card. (letterale tecnico: e.g)Offset e tipo grezzo (
u16) nascosti — il giocatore non li tocca. - Sola lettura chiara: (letterale tecnico: read-only) i campi non modificabili mostrano un avviso evidenziato "Sola lettura" + il motivo (es. "dati grezzi — l’editor non è ancora in grado di scomporli"). (letterale tecnico: non-editable) (letterale tecnico: Read-only) (letterale tecnico: e.g)
- Catalogo descrizioni umane (
MagicPppDescriptionCatalog.cs): ~60 opcode ppp con cosa fanno nel linguaggio del giocatore (basato su decompile IDA + doc RE). Mostrato nel DetailText dello slot. - Tooltip grow-size: (letterale tecnico: Grow-size) spiega che 4B/8B/12B/16B = byte extra di spazio (1/2/3/4 valori).
- Gate: build Release 0 errori; StringsIntegrity 3/3 + MagicDll 76/76 (79/79).
v2.224.1.25
v2.224.1.28BETAREVISION
Lulu4 ago 2026
Magic DLL: Fase 4 ? RE profonda dell'Anteprima 3D (layout noclip mappato a fonte)
- Nuova doc:
docs/reverse/magic_dlls/NOCLIP_PREVIEW_LAYOUT_MAPPING_2026-08-03.md? mappa il percorsoparseMagicFile?sniffMagic?parseParticleDatadi noclip.website (fonte reale). - Verdetto: le edit dei campi confinate alla finestra = SICURE per l'anteprima (noclip rilegge gli stessi offset; stride fissi 0x28/0x10 invariati); la grow strutturale nel mezzo di un record su cui noclip cammina sopra = ROMPE l'anteprima; grow sicura = estensione della lista guidata dal count in coda + bump del count. (letterale tecnico: SAFE) (letterale tecnico: re-reads) (letterale tecnico: BREAKS) (letterale tecnico: count-driven)
- Caveat clone: noclip rende solo gli id presenti nella sua
magicTable; id fuori dalla tabella ? (letterale tecnico: outside)sniffMagicnull ? emettitori vuoti (limitazione noclip, non dell'override). - Doc/RE solo (REVISION) ? NESSUN cambio comportamento. — CUSTOMMIX MUSIC SOLVED: la traccia 145 "Challenge" suona in battaglia.** Lane Jarvis-HOOK (letterale tecnico: NO). [precedente:
v2.224.1.26] - La vittoria: dopo 4 rotte fallite (
SetArenaBattleMusicPending→ solo interceptor Arena+;PrepBattleTrack→ layer engine, non FMOD;PlayTrackWithPreload→ impostavaevent_indexma non popolavatracks_array[].event_ptr),SwitchCrossfade(self, 145, 0, 1)l'ha sbloccata — via IDA MCP suffxoficial.exe.i64(FFX.exe pid=49476). - Scoperta chiave (RE, commit
d4fdbc6c): l'albero audio FFX ha 3 layer —PlayTrackByIndex(0x7097E0) salta in silenzio setracks_array[track].event_ptr == 0;PlayTrackWithPreload(0x886980) imposta soloevent_indexnella sub-struct engine;SwitchCrossfade(0x7089F0, percorso B) è l'UNICA che popola (letterale tecnico: ONLY)event_ptrviaReadEventByRuntimeId→MapRuntimeIdToFevIndex(tabella0xB4F1C8) →EventSystem->GetEvent. - Check che provano che 145 deve suonare:
dword_B4F1C8[145] = 0x48(indice FEV 72, valido ≤181);unk_CEC164 = 0(il gate di load non blocca);IsValidTrackIndex(145) = true(145 ≤ 0xB5). - Fix in
MusicHook_Shim: su override, chiamaSwitchCrossfade(overrideTrack, 0, 1)(fade=0, load_flag=1) invece diPlayTrackWithPreload; preferisce il trampolineg_trampolineSwitch(salta lo shim, evita ricorsione). - RT2 confermato dall'utente: "NOW TRACK 145 WORKS! I'M IN BATTLE WITH THE NEW MUSIC!" — Challenge suona in CustomMix.
- Gate: build Release 0 errori; deploy Steam +
_isolated; commitd4fdbc6cpushato.
v2.224.1.27
v2.224.1.30BETAPATCH
Seymour5 ago 2026
CustomMix Soldi: costo battaglia MAI addebitato (bug race condition) + il compose non sovrascrive mai i bin vanilla. (letterale tecnico: NEVER)
- CustomMix Soldi:
ArenaPlusComposePick_Close()azzeravag_pendingLaunchGilCostPRIMA che (letterale tecnico: BEFORE)LaunchComboBattleFromPumppotesse leggerlo — il Soldi era validato nel menu ma mai addebitato (x3/x4/x5, da quando il compose è stato implementato). La somma era corretta (es. 325000G per Trio) ma (letterale tecnico: e.g)gilCost=0nel log. Fix: lo zero spostato daClose()aOpen()(reset a inizio sessione, non alla chiusura). (letterale tecnico: session-open) - Il compose sovrascriveva i bin vanilla (d5e56701): 5 scenari cross-map (macalania_forest x3, remiem x3/x4/x5, bikanel x4) deployavano sul bin template (
mcfr00_00,kino00_00,bika02_01) invece del carrier dedicato (mcyt00_22,nagi05_23,nagi05_22) — l'engine caricava gli incontri casuali invece del team composto. C#:ResolveOutputBattleIdrestituiscecarrier.BattleId. C++: il pin dell'hook usaroute.battleId(carrier) per il nome dell'incontro. Bin vanilla intatti. - Deploy: DLL hook ricompilata + deploy Steam. Gate:
arena_plus_charge_gil.flag(attivo). - Fase 3 ? RE id incorporato: confrontando magic_0140 vs magic_0141 (stessa dimensione, 22 diff), trovato che l'id NON esiste come u32 LE nel .data ? solo come (letterale tecnico: does) (letterale tecnico: NOT)3 stringhe UTF-16LE ("magic_0140" / "magic_0140.dll") agli offset 0x07E3C6, 0x07E4B2, 0x07E4F2.
- Fase 3 ?
MagicDllNameRewriter: riscrive le 3 stringhe al nuovo id inTryCloneMagic(4 cifre zero-padded = stessa lunghezza = nessuno shift di offset). Validato contro la DLL reale: 3 occorrenze riscritte, delta dimensione = 0 (RT0 byte-fedele fuori dalle stringhe). (letterale tecnico: byte-faithful) - Fase 4 ?
MagicCommandAssociation: associa una riga di command.bin al clone impostandoAnim1Id = newId(catena provata: command.Anim1Id ? magic_%04d.dll). EDIT di campo (non grow) viaAbility_Command.WriteList(preserva il text pool). Limitazione onesta: sostituisce l'effetto visivo della skill originale; una NUOVA skill (che preservi l'originale) richiederebbe la grow (riferimento: (letterale tecnico: NEW)CommandGrowWriter.AppendElementWards). - Deploy: build LAB in
FFX\Mods\FFXProjectEditor-v2.224.1.29\. offline_ci: 8 fails (all PhaseManager/battle pre-existing ? NONE from Magic/PPP).
v2.224.1.29
v2.224.1.31BETAPATCH
Seymour6 ago 2026
F7 Marathon: 6 bugs + CustomMix Ultra + controller
- 6 bugs fixed: black screen on F7 exit (0x13407E4 cleared in all close paths), Challenge music leaking on EVERY battle (F7_ApplyMusicBattle default=145 removed), double-input FSM vs menu (ClaimModal/ReleaseModal in F7 submenus), input spam holding confirm/cancel (cooldown also on cancel), True Nightmare wrong elements (now HP 3x, stats ~2x, Haste+Regen+Protect+Shell, no Weak/Resist/Absorb), Force Battle captured Dark Aeons/Combos (F7_SetSkipForceCapture filter).
- CustomMix Ultra Phase 1+2: Compose engine C# (RunUltra — 1-8 monsters, auto-layout, deploy) + F7 menu integrated (Arena+ → CustomMix Ultra → Build+Launch). Carrier zzzz00_240, token 0x00F000F0. 13 debug logs.
- Controller in ComposePick: L2=edit grid, R2=camera, R1=next, L1=prev via PadDir edge detection + keyboard fallback. PS+Xbox dual labels (L2-LT, R2-RT, L1-LB, R1-RB).
- Deploy: Hook DLL + Lab C# deployed to Steam. Plans: Monster AI Swap, Ultra Phases 3-4.
v2.224.1.30