Atualização 2.209
02/08/2026
v2.209.0.0BETAMINOR
Seymour1 de ago. de 2026
Aurora × noclip: ponte de batalha 3D (o editor agora renderiza o campo de jogo REAL com a formação editada)
- Descoberta: o
parseEncounterdo noclip (bin.ts:2494) usa EXACTLY nosso layoutBattle_File(script@0x4, ids de monstro i16@+0xC, posições float32 16B) —0e/<id>.biné byte-identical parabtl_*.bin(prova de hash: 0e/0002 == bjyt02_00). EncounterIndexBridge(FfxLib/Battle): SHA-256 battleId↔índice encounterId — 614/858 batalhas batem (azit03_00→0e/00EF, klyt00_00→0e/001E, mihn00_00→0e/002F); 244 sem match reportadas honestamente.Aurora3DLauncher+ botão "🐉 View battle em 3D (noclip)" na Aurora Chamber: sobrescreve0e/<encId>.bincom o btl CURRENT (backup vanilla.aurora3d.bak, botão "↩️ Restore 3D") e abreindex.html?battle=<encId>#ffx/b<mapIndex>(mapIndex de EncounterTable battlefield&0xFF) — o render nativo PS2 do noclip mostra a formação/posições editadas.- Patch aditivo do noclip (scenes.ts
selectEncounter, ~20 linhas): o param?battle=força o encontro exato (pula a seleção por peso); dist reconstruído + atualizado no hub 8769 serve-dir (verificado no bundle servido). - Gates:
--filter AuroraOverlayEnrichment9/9 PASS; suíte completa 357/357 PASS;Aurora3DLinkLab --override azit03_00copy=True/restore=True; HTTP E2E: 8769 serve o override byte-for-byte. Doc:docs/reverse/FFX_AURORA_NOCLIP_3D_BATTLE_BRIDGE_2026-08-01.md. - Fase 2 (próxima): drag/câmera no noclip → POST para o editor (padrão AuroraDragBridge) → escrever no bin → recarregar. Per-field smoke visual pendente. ### PATCH
v2.208.0.1
v2.209.1.0BETAPATCH
Seymour1 de ago. de 2026
Aurora: viewers DENTRO do editor (WebView2) + nomenclatura RealGame/EditViewer + preview de batalha sem o menu do jogo
- Embedded: a Aurora Chamber ganhou uma coluna
WebView2Host— "Renderizar EditViewer" e "🐉 Ver no RealGame (ingame)" agora abrem INSIDE o editor (sem browser); botão ⟳ Reload viewer;EmbeddedReloadRequestedauto-reloads após saves. - Ações no topo: ActionBar corrigido (Renderizar EditViewer · Ver no RealGame · Restaurar · Salvar posições · +/- monster · Exportar âncoras) — nada escondido no scroll.
- Renomeação UI:
noclip→ RealGame (ingame);MapViewer→ EditViewer (textos, status, banners). - Sem menu do jogo: desc de cena
battle-previewcorrigida no catálogo FFX do noclip — URL?battle=<encId>&map=<mapIndex>#ffx/battle-previewsempre resolve direto para FFX (mapIndex não precisa estar entre os 55 catalogados); dist reconstruído + verificado no bundle servido (battle-preview+get("battle")presentes). - Auto-sync: SaveDraggedPositions/SaveCameraShots/SaveCameraFloats/AddMonster/RemoveMonster re-apply o override RealGame + recarregam o viewer (posição salva mostra in-game sem re-clicking).
- Gates: suíte completa 359/359 PASS; build Release 0 erros; bundle servido verificado. ### MINOR
v2.209.0.0
v2.209.2.0BETAPATCH
Seymour1 de ago. de 2026
Aurora UI/UX: dashboard limpo + viewers pop-up dedicados
- Dashboard: a tela principal agora é seleção de mapa — lista com badges ([ gLTF ] [ N tex ] [ N/N submeshes ] [ STUB ] [ map-only ], tone-colored), card escuro premium para o lugar (#16121F bg + texto branco), Ações em ONE lugar (abaixo do card: Renderizar EditViewer · 🐉 Ver no RealGame · 💾 Salvar posições · ➕/➖ Monster · Exportar âncoras · ↩️ Restaurar) — duplicação de botões removida.
- Pop-ups (nova arquitetura): viewers dedicados
AuroraViewerWindow(WebView2) para EditViewer (edição raw) e RealGame (read-only) — eles NOT interagem entre si; trocar mapa/batalha no dashboard fecha todas as janelas automaticamente (previne editar monstros no mapa errado / leaks). - Sidebar overlay: o painel flutuante do viewer virou uma sidebar recolhível (❮ Hide → faixa de 58px) — não bloqueia mais a view 3D.
- Textos grandes → [?] com tooltip (HonestyBanner movido para o tooltip do botão "?").
- Gates: suíte completa 360/360 PASS · build Release 0 erros ·
node --checkOK. ### PATCH
v2.209.1.0
v2.209.3.0BETAPATCH
Seymour2 de ago. de 2026
Custom Mix / Arena+ desbloqueado: caminho do lab corrigido + ArenaMultiBossLab implantado no jogo + vanilla-root configurado
- Fix de caminho do lab (
ArenaPlusComposePick.cppResolveLabExe): adicionado o candidato..\data\modules\tools\ArenaMultiBossLab\ArenaMultiBossLab.exe— o padrão de tools do projeto (data\modules\tools, onde SinScaleInject vive). Antes, o hook só olhava emmodules\tools\...— o lab nunca era encontrado → CreateProcess falhava → o Custom Mix nunca compunha nada in-game. - Lab deployado no jogo:
ArenaMultiBossLabconstruído (Release, 0 erros/0 avisos) e copiado (exe+dll+deps+recipes) paradata\modules\tools\ArenaMultiBossLab\. - Raiz Vanilla configurada:
modules\config\arena_plus_compose_vanilla_btl.txtcriada apontando paraFFX Extracted\FFX\ffx_ps2\ffx\master\jppc\battle\btl(os arquivos de configuração estavam vazios antes →--vanilla-root ""→ o laboratório falhou). A raiz padrão do mod está OK ({gameRoot}\data\mods\...\btlexiste). - v6 rollback incorporado: o dllmain do HEAD já está no estado da v5 (DrawString
0x9016B0trava em DIFF — a nova navegação será reintroduzida quando a IDA estiver disponível). Observação sobre a entrada de changelog 2.207.6.0. - RT2
Needs Testing(Custom Mix): F7 → Arena+ → Custom Mix → escolher aeons → Launch → batalha composta (e.g. Bikanel + 4 Dark Aeons, battle_id bika02_01). Relaunch usa o manifest criado pelo 1º Launch. ### PATCH
v2.209.2.0
v2.209.4.0BETAPATCH
Seymour2 de ago. de 2026
SIN desbloqueado: caminho de SinScaleInject corrigido (data\modules\tools) + diretório de roster corrigido + rosters de Macalania/Thunder restaurados do git + ferramenta implantada
- Fix de caminho do exe (
SinCurseHook.cpp):{DLL_DIR}\tools\SinScaleInject\→..\data\modules\tools\SinScaleInject\SinScaleInject.exe(padrão de ferramentas do projeto — antes, CreateProcessA falhava e SIN nunca era executado no jogo). - Correção do diretório de roster (
SinScaleInject/Program.cs): o padrão agora{gameRoot}\data\modules\tools\SinScaleInject\data\rosters(eramodules\tools\...— um nível abaixo do correto). - Rosters restored de git (commit
eb2e93ed):spira-sin-area-rosters/commacalania_all/bosses/field/woods.csv+thunder_plains.csv(monster_id,role,note,allowed_presetscom UNI-001..006 allowlist) + README. - Implantado no jogo:
SinScaleInjectcompilado (Release, 0 erros) e copiado paradata\modules\tools\SinScaleInject\+ rosters paradata\modules\tools\SinScaleInject\data\rosters\. - RT2
Needs Testing(SIN): area transition comsin_curse.flag→ SinScaleInject runs (logSinCurseHook SinScaleInject SUCCESS) → area monsters com scaled HP/stats (T) +[UNI]nomes de kernel + handler ATEL em AiFile → batalha. - ffx-hooks com o fix de caminho SIN: build pronto, deploy pendente (o jogo estava aberto no commit — deploy quando fechar). ### PATCH
v2.209.3.0
v2.209.5.0BETAPATCH
Seymour2 de ago. de 2026
Música de chefe do Custom Mix/Arena+ desbloqueada: o gate de heartbeat não bloqueia mais o MusicHook
- O problema: MusicHook (que aplica o override battle-music) era bloqueado pelo gate
WaitForProbeHeartbeat— o heartbeat ffx-probe nunca sobe (probe sem GetDeviceState hookado) →MusicHook install skipped: ffx-probe heartbeat gate failed→ a música do Arena+ nunca tocava. - A música:
ARENA_PLUS_MUSIC_TRACK_DEFAULT 145 = "Challenge"(trilha boss-battle — todas as linhas F7 do Arena+: Dark Aeons + Penance; override viaarena_plus_music_<row>.txt/FFXHOOKS_ARENAPLUS_MUSIC_TRACK_<N>). - Fix: o gate agora é non-blocking — espera 10s pelo probe (se responder, o SOUNDCMD extra também ativa) e instala MusicHook mesmo sem heartbeat (override via FFXHooksBlock + hooks battle-entry Prep/PlayTrackWithPreload/SwitchCrossfade funcionam sem o probe; só o trigger SOUNDCMD degrada — WARN no log).
- RT2
Needs Testing: Custom Mix → Launch → a batalha composta deve tocar Challenge (145) em vez do tema de batalha comum. - Notado pendente: o heartbeat ffx-probe nunca sobe (dinput8 66.560 de 07-19) — investigar por que GetDeviceState não está hookado (afeta SOUNDCMD/FORCEBATTLE via probe; a música não depende mais disso). ### MINOR
v2.209.4.0
v2.209.6.0BETAPATCH
Seymour2 de ago. de 2026
Música do Custom Mix sem silêncio/vazamento + restauração do bin composto (nunca sobrescreve os canônicos permanentemente)
- Fix de Silence/leak (MusicHook.cpp
MusicPlayWithPreload_Shim): com SOUNDCMD degradado (sem heartbeat do probe), o shim suprimia a música vanilla e dependia do soundcmd para tocar o override → batalha em silêncio + override vazava para o próximo PlayTrack (a música "desejada" tocava no exit). Agora, sem soundcmd: substitui a trilha e toca a vanilla (sem silêncio, sem leak); com soundcmd: mantém a recipe do lab (suppress + recipe). - Restore Composed-bin no caminho normal do Custom Mix:
ArmDeferredFileRestoresó era armado no caminho 781D60 (cross-map) — o caminho normal (e.g. composto bika02_01) deixava o bin no mod-root para sempre (sobrescrevendo batalhas canônicas da área). Agora o caminho normal também arma o restore (~30s). - Restore de boot (
ArenaPlus_RestorePendingComposeOnBoot): se uma sessão anterior fechou antes do restore adiado (~30s), o boot restaura o canônico de.spiraforge.bak(lêbattle_iddo gameRootcompose_last.json) — o compose nunca fica permanente. - Build PASS + LabDeploy para Steam.
- RT2
Needs Testing: Custom Mix → Launch → batalha composta com a música certa (sem silêncio) → ~30s depois o bin canônico é restaurado → encontros aleatórios da área voltam ao normal; fechar o jogo antes de 30s → próximo boot restaura. ### PATCH
v2.209.5.0
v2.209.7.0BETAPATCH
Seymour2 de ago. de 2026
Música do Custom Mix: o callback soundcmd só é definido quando a probe está ativa (sem soundcmd → o shim substitui a faixa e reproduz a versão vanilla)
- Por que o fix 2.209.6.0 não bastou:
g_arenaSoundCmdFnnão era null (o dllmain setavaArenaPlus_MusicHookProbeSoundCmdquando o hook instalava) — só falhava em runtime (sem heartbeat do probe) → o shim via o callback → usava o caminho do lab (suppress + recipe) → soundcmd falhava → silêncio + leak persistiam. - Fix: o dllmain agora mantém
probeAlive = FFXHOOKS_SKIP_PROBE_WAIT || WaitForProbeHeartbeat(10000)e só seta o callback de soundcmd se o probe estiver vivo (3 pontos de instalação). Probe morto → callback null → o shimPlayTrackWithPreloadsubstitui a trilha e toca a vanilla → Challenge (145) toca na batalha composta, sem silêncio, sem leak no exit. - Veredito Idle-crash (investigado em IDA via MCP 13337): o AV do fmodex é preexistente —
AsyncTask_InvokeCallbackThunk(0x691480) chama(*(this+4))(*(this+8))com this+4/this+8 = heap liberado (0x10CDCDCD); o ponteiro thunk vive na tabela0xB46FA0(região de áudio). None dos nossos hooks tocam esse caminho (AsyncTask/0x691480/0xB46FA0) — os AVs precedem o F7. O global VEH captura e loga (diagnóstico). Corrigir = achar quem libera o AsyncTask de áudio (foco separado). - Build PASS + LabDeploy para Steam (20:09). ### MINOR
v2.209.6.0
v2.209.8.0BETAPATCH
Seymour2 de ago. de 2026
Restauração do boot corrigida (manifesto real em `modules\compose_last.json`) + bin composto de teste restaurado + cenários compatíveis com Custom Mix confirmados
- Restore de boot corrigido: o manifest real é escrito pelo lab em
modules\compose_last.json(module-relative) — o restore de boot só olhava em gameRoot → o bin composto de uma sessão interrompida ficava no disco. Agora olha na ordem:modules\compose_last.json→{gameRoot}\compose_last.json→{gameRoot}\mods\Spira Reforge\arena\compose_last.json. - Limpeza de disco: o
bika02_01.bincomposto do teste (19:37) foi restaurado para vanilla (.spiraforge.bakde 09/06/2024, 24.016 bytes) — confirmado por tamanho/timestamp. - Cenários suportados do Custom Mix (verificados via lab --compose dry-run): 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 NOT é um cenário suportado (o compose cai na caverna — por isso o x4 "não abria" lá). x3/x4 (3-4 actors) compõem perfeitamente nos cenários suportados (dry-run provado: 4 slots, chunk2/chunk3 ok).
- Build PASS + LabDeploy para Steam. ### PATCH
v2.209.7.0