Aggiornamento 2.209
02/08/2026
v2.209.0.0BETAMINOR
Seymour1 ago 2026
Aurora × noclip: 3D battle bridge (the editor now renders the REAL game field with the edited formation)
- Discovery: noclip's
parseEncounter(bin.ts:2494) uses EXACTLY ourBattle_Filelayout (script@0x4, monster ids i16@+0xC, float32 16B positions) —0e/<id>.binis byte-identical tobtl_*.bin(hash proof: 0e/0002 == bjyt02_00). EncounterIndexBridge(FfxLib/Battle): SHA-256 battleId↔encounterId index — 614/858 battles match (azit03_00→0e/00EF, klyt00_00→0e/001E, mihn00_00→0e/002F); 244 unmatched reported honestly.Aurora3DLauncher+ "🐉 View battle in 3D (noclip)" button in Aurora Chamber: overwrites0e/<encId>.binwith the CURRENT btl (.aurora3d.bakvanilla backup, "↩️ Restore 3D" button) and opensindex.html?battle=<encId>#ffx/b<mapIndex>(mapIndex from EncounterTable battlefield&0xFF) — the noclip native PS2 render shows the edited formation/positions.- Additive noclip patch (scenes.ts
selectEncounter, ~20 lines):?battle=param forces the exact encounter (skips weight selection); dist rebuilt + refreshed in the 8769 serve-dir (verified in the served bundle). - Gates:
--filter AuroraOverlayEnrichment9/9 PASS; full suite 357/357 PASS;Aurora3DLinkLab --override azit03_00copy=True/restore=True; HTTP E2E: 8769 serves the override byte-for-byte. Doc:docs/reverse/FFX_AURORA_NOCLIP_3D_BATTLE_BRIDGE_2026-08-01.md. - Phase 2 (next): drag/camera in noclip → POST to the editor (AuroraDragBridge pattern) → write to bin → reload. Per-field visual smoke pending. ### PATCH
v2.208.0.1
v2.209.1.0BETAPATCH
Seymour1 ago 2026
Aurora: viewer DENTRO l'editor (WebView2) + naming RealGame/EditViewer + battle-preview senza il menu del gioco
- Integrati: Aurora Chamber ha guadagnato una colonna
WebView2Host— "Renderizar EditViewer" e "🐉 Ver no RealGame (ingame)" ora si aprono DENTRO l'editor (niente browser); pulsante ⟳ Reload viewer; (letterale tecnico: INSIDE)EmbeddedReloadRequestedricarica automaticamente dopo i salvataggi. (letterale tecnico: auto-reloads) - Azioni in alto: ActionBar fissa (Renderizar EditViewer · Ver no RealGame · Restaurar · Salvar posições · +/- monster · Exportar âncoras) — niente più nascosto nello scroll.
- Rinominazione UI:
noclip→ RealGame (ingame);MapViewer→ EditViewer (testi, status, banner). - Niente menu gioco: fix della desc scena
battle-previewnel catalogo FFX noclip — l'URL?battle=<encId>&map=<mapIndex>#ffx/battle-previewrisolve sempre dritto a FFX (mapIndex non deve essere tra i 55 catalogati); dist ricostruita + verificata nel bundle servito (battle-preview+get("battle")presenti). - Auto-sync: SaveDraggedPositions/SaveCameraShots/SaveCameraFloats/AddMonster/RemoveMonster riapplicano l'override RealGame + ricaricano il viewer (la posizione salvata appare in-game senza ricliccare). (letterale tecnico: re-apply) (letterale tecnico: re-clicking)
- Gates: suite completa 359/359 PASS; build Release 0 errori; bundle servito verificato. ### MINOR
v2.209.0.0
v2.209.2.0BETAPATCH
Seymour1 ago 2026
Aurora UI/UX: dashboard pulita + viewer pop-up dedicati
- Dashboard: la schermata principale ora è la selezione mappa — lista con badge ([ gLTF ] [ N tex ] [ N/N submeshes ] [ STUB ] [ map-only ], colorati per tono), (letterale tecnico: tone-colored)card scura premium per il luogo (#16121F bg + testo bianco), Azioni in UN solo posto (letterale tecnico: ONE) (sotto la card: Renderizar EditViewer · 🐉 Ver no RealGame · 💾 Salvar posições · ➕/➖ Monster · Exportar âncoras · ↩️ Restaurar) — duplicazione pulsanti rimossa.
- Pop-up (nuova architettura): (letterale tecnico: Pop-ups)
AuroraViewerWindowdedicato (WebView2) per EditViewer (editing raw) e RealGame (sola lettura) — NON interagiscono tra loro; (letterale tecnico: read-only) (letterale tecnico: NOT)cambiare mappa/battaglia nella dashboard chiude tutte le finestre automaticamente (previene l'editing dei mostri sulla mappa sbagliata / i leak). - Overlay sidebar: il pannello viewer fluttuante è diventato una sidebar collassabile (❮ Hide → striscia 58px) — non blocca più la vista 3D.
- Testi enormi → [?] con tooltip (HonestyBanner spostato nel tooltip del pulsante "?").
- Gates: suite completa 360/360 PASS · build Release 0 errori ·
node --checkOK. ### PATCH
v2.209.1.0
v2.209.3.0BETAPATCH
Seymour2 ago 2026
Custom Mix / Arena+ sbloccato: percorso lab corretto + ArenaMultiBossLab deployato nel gioco + vanilla-root configurato
- Lab path fix (
ArenaPlusComposePick.cppResolveLabExe): added the candidate..\data\modules\tools\ArenaMultiBossLab\ArenaMultiBossLab.exe— the project's tools pattern (data\modules\tools, where SinScaleInject lives). Before, the hook only looked inmodules\tools\...— the lab was never found → CreateProcess failed → Custom Mix never composed anything in-game. - Lab deployed to the game:
ArenaMultiBossLabbuilt (Release, 0 errors/0 warnings) and copied (exe+dll+deps+recipes) todata\modules\tools\ArenaMultiBossLab\. - Vanilla-root configurato:
modules\config\arena_plus_compose_vanilla_btl.txtcreato puntando aFFX Extracted\FFX\ffx_ps2\ffx\master\jppc\battle\btl(i txt di config erano vuoti prima →--vanilla-root ""→ lab falliva). Default mod-root OK ( (letterale tecnico: Mod-root){gameRoot}\data\mods\...\btlesiste). - Rollback v6 assorbito: il dllmain di HEAD è già allo stato v5 (crash DrawString
0x9016B0in DIFF — la nuova navigazione verrà reintrodotta con IDA disponibile). Nota sulla voce del changelog 2.207.6.0. - RT2
Needs Testing(Custom Cocktail): F7 → Arena+ → Custom Cocktail → scegli gli aeoni → Launch → battaglia composta (es. Bikanel + 4 Dark Aeons, battle_id bika02_01). Il relaunch usa il manifest creato dal 1° Launch. (letterale tecnico: e.g) ### PATCH
v2.209.2.0
v2.209.4.0BETAPATCH
Seymour2 ago 2026
SIN sbloccato: percorso SinScaleInject corretto (data\modules\tools) + dir roster corretta + roster Macalania/Thunder ripristinati da git + tool deployato
- Fix percorso exe (
SinCurseHook.cpp):{DLL_DIR}\tools\SinScaleInject\→..\data\modules\tools\SinScaleInject\SinScaleInject.exe(project tools pattern — before, CreateProcessA failed and SIN never ran in-game). - Roster dir fix (
SinScaleInject/Program.cs): default now{gameRoot}\data\modules\tools\SinScaleInject\data\rosters(wasmodules\tools\...— one level off). - Rosters restored from git (commit
eb2e93ed):spira-sin-area-rosters/withmacalania_all/bosses/field/woods.csv+thunder_plains.csv(monster_id,role,note,allowed_presetswith UNI-001..006 allowlist) + README. - Deployed to game:
SinScaleInjectbuilt (Release, 0 errors) and copied todata\modules\tools\SinScaleInject\+ roster indata\modules\tools\SinScaleInject\data\rosters\. - RT2
Needs Testing(SIN): area transition withsin_curse.flag→ SinScaleInject runs (logSinCurseHook SinScaleInject SUCCESS) → area monsters with scaled HP/stats (T) +[UNI]kernel names + ATEL handler in AiFile → battle. - ffx-hooks with the SIN path fix: build ready, deploy pending (game was open at commit time — deploy when closed). ### PATCH
v2.209.3.0
v2.209.5.0BETAPATCH
Seymour2 ago 2026
Musica boss Custom Mix/Arena+ sbloccata: il gate heartbeat non blocca più MusicHook
- Il problema: MusicHook (che applica l'override della musica di battaglia) era bloccato dal gate (letterale tecnico: battle-music)
WaitForProbeHeartbeat— l'heartbeat della ffx-probe non sale mai (probe senza GetDeviceState hookato) →MusicHook install skipped: ffx-probe heartbeat gate failed→ la musica Arena+ non suonava mai. - La musica:
ARENA_PLUS_MUSIC_TRACK_DEFAULT 145 = "Challenge"(traccia boss-battle — tutte le righe F7 di Arena+: Dark Aeons + Der Richter; override viaarena_plus_music_<row>.txt/FFXHOOKS_ARENAPLUS_MUSIC_TRACK_<N>). - Fix: il gate ora è non-blocking — aspetta 10s la probe (se risponde, si attiva anche il SOUNDCMD extra) e installa MusicHook anche senza heartbeat (l'override via FFXHooksBlock + gli hook di ingresso battaglia Prep/PlayTrackWithPreload/SwitchCrossfade funzionano senza la probe; solo il trigger SOUNDCMD degrada — WARN nel log). (letterale tecnico: battle-entry)
- RT2
Needs Testing: Custom Cocktail → Launch → la battaglia composta dovrebbe suonare Challenge (145) invece del tema battaglia comune. - In sospeso annotato: l'heartbeat della ffx-probe non sale mai (dinput8 66.560 dal 07-19) — investigare perché GetDeviceState non è hookato (influisce su SOUNDCMD/FORCEBATTLE via probe; la musica non dipende più da esso). ### MINOR
v2.209.4.0
v2.209.6.0BETAPATCH
Seymour2 ago 2026
Musica Custom Mix senza silenzio/leak + ripristino del bin composto (non sovrascrive mai i canonici per sempre)
- Fix silenzio/leak (
MusicPlayWithPreload_Shimin MusicHook.cpp): con SOUNDCMD degradato (nessun heartbeat probe), lo shim sopprimeva la musica vanilla e si affidava a soundcmd per suonare l'override → battaglia in silenzio + override leakato alla PlayTrack successiva (la musica "desiderata" suonava all'uscita). Ora, senza soundcmd: sostituisce la traccia e suona la vanilla (niente silenzio, niente leak); con soundcmd: mantiene la recipe del lab (suppress + recipe). (Novox) - Ripristino bin composto sul percorso Custom Cocktail normale: (letterale tecnico: Composed-bin)
ArmDeferredFileRestoreera armato solo sul percorso 781D60 (cross-map) — il percorso normale (es. bika02_01 composto) lasciava il bin nella mod-root per sempre (sovrascrivendo le battaglie canoniche dell'area). Ora anche il percorso normale arma il ripristino (~30s). (letterale tecnico: e.g) - Boot restore (
ArenaPlus_RestorePendingComposeOnBoot): se una sessione precedente si è chiusa prima del ripristino differito (~30s), il boot ripristina il canonico da.spiraforge.bak(leggebattle_iddalcompose_last.jsondel gameRoot) — il compose non resta mai permanente. - Build PASS + LabDeploy a Steam.
- RT2
Needs Testing: Custom Cocktail → Launch → battaglia composta con la musica giusta (niente silenzio) → ~30s dopo il bin canonico è ripristinato → gli incontri casuali dell'area tornano normali; chiudendo il gioco prima dei 30s → il prossimo boot ripristina. ### PATCH
v2.209.5.0
v2.209.7.0BETAPATCH
Seymour2 ago 2026
Musica Custom Mix: callback soundcmd impostata solo quando la probe è viva (nessun soundcmd → lo shim sostituisce la traccia e suona la vanilla)
- Perché il fix 2.209.6.0 non bastava:
g_arenaSoundCmdFnnon era null (il dllmain impostavaArenaPlus_MusicHookProbeSoundCmdquando l'hook si installava) — falliva solo a runtime (nessun heartbeat della probe) → lo shim vedeva la callback → usava il percorso lab (suppress + recipe) → soundcmd falliva → silenzio + leak persistiti. - Fix: il dllmain ora tiene
probeAlive = FFXHOOKS_SKIP_PROBE_WAIT || WaitForProbeHeartbeat(10000)e imposta la callback soundcmd solo se la probe è viva (3 punti di install). Probe morta → callback null → lo shimPlayTrackWithPreloadsostituisce la traccia e suona la vanilla → Challenge (145) suona nella battaglia composta, niente silenzio, niente leak all'uscita. - Verdetto crash-idle (investigato in IDA via MCP 13337): (letterale tecnico: Idle-crash) l'AV fmodex è pre-existing —
AsyncTask_InvokeCallbackThunk(0x691480) chiama(*(this+4))(*(this+8))con this+4/this+8 = heap liberato (0x10CDCDCD); il puntatore thunk vive nella tabella0xB46FA0(regione audio). Nessuno dei nostri hook tocca questo percorso (AsyncTask/0x691480/0xB46FA0) — gli AV precedono la F7. Il VEH globale lo cattura e lo logga (diagnostica). Risolverlo = trovare chi libera l'AsyncTask audio (focus separato). (Niente) - Build PASS + LabDeploy a Steam (20:09). ### MINOR
v2.209.6.0
v2.209.8.0BETAPATCH
Seymour2 ago 2026
Boot restore corretto (manifest reale in `modules\compose_last.json`) + bin composto del test ripristinato + scenari supportati da Custom Mix confermati
- Boot restore corretto: il manifest reale è scritto dal lab in
modules\compose_last.json(relativo al modulo) — il boot restore cercava solo nel gameRoot → (letterale tecnico: module-relative)il bin composto di una sessione interrotta restava su disco. Ora cerca in ordine:modules\compose_last.json→{gameRoot}\compose_last.json→{gameRoot}\mods\Spira Reforge\arena\compose_last.json. - Pulizia disco: il
bika02_01.bincomposto dal test (19:37) è stato ripristinato alla vanilla (.spiraforge.bakdel 09/06/2024, 24.016 byte) — confermato da dimensione/timestamp. - Scenari supportati da Custom Cocktail (verificati via dry-run del lab --compose): bikanel (bika02_01), macalania_forest/open/open2 (mcfr00_00/mcyt00_00/mcyt00_21), remiem (kino00_00), cavern/cavern_alt (nagi05_50/24/25). Mushroom Rock NON è uno scenario supportato (letterale tecnico: NOT) (il compose ricade su cavern — per questo la x4 "non si apriva" lì). Le x3/x4 (3-4 attori) compongono perfettamente sugli scenari supportati (dry-run provato: 4 slot, chunk2/chunk3 ok).
- Build PASS + LabDeploy a Steam. ### PATCH
v2.209.7.0