Mise à jour 2.209
02/08/2026
v2.209.0.0BETAMINOR
Seymour1 août 2026
Aurora × noclip : pont de bataille 3D (l'éditeur rend désormais le VRAI champ du jeu avec la formation éditée)
- Découverte : le
parseEncounterde noclip (bin.ts:2494) utilise EXACTEMENT notre layoutBattle_File(script@0x4, ids de monstres i16@+0xC, positions float32 16B) —0e/<id>.binest byte-identique àbtl_*.bin(preuve de hash : 0e/0002 == bjyt02_00). EncounterIndexBridge(FfxLib/Battle) : index SHA-256 battleId↔encounterId — 614/858 batailles correspondent (azit03_00→0e/00EF, klyt00_00→0e/001E, mihn00_00→0e/002F) ; 244 non-correspondantes signalées honnêtement.Aurora3DLauncher+ bouton « 🐉 View battle in 3D (noclip) » dans Aurora Chamber : écrase0e/<encId>.binavec le btl ACTUEL (backup vanilla.aurora3d.bak, bouton « ↩️ Restore 3D ») et ouvreindex.html?battle=<encId>#ffx/b<mapIndex>(mapIndex depuis battlefield&0xFF de l'EncounterTable) — le rendu PS2 natif de noclip montre la formation/les positions éditées.- Patch noclip additif (scenes.ts
selectEncounter, ~20 lignes) : le paramètre?battle=force l'encounter exact (saute la sélection par poids) ; dist reconstruit + rafraîchi dans le serve-dir 8769 (vérifié dans le bundle servi). - Portes :
--filter AuroraOverlayEnrichment9/9 PASS ; suite complète 357/357 PASS ;Aurora3DLinkLab --override azit03_00copy=True/restore=True ; E2E HTTP : 8769 sert l'override octet pour octet. Doc :docs/reverse/FFX_AURORA_NOCLIP_3D_BATTLE_BRIDGE_2026-08-01.md. - Phase 2 (suivante) : drag/caméra dans noclip → POST vers l'éditeur (motif AuroraDragBridge) → écriture dans le bin → reload. Smoke visuel par champ en attente. ### PATCH
v2.208.0.1
v2.209.1.0BETAPATCH
Seymour1 août 2026
Aurora : visualiseurs DANS l'éditeur (WebView2) + nomenclature RealGame/EditViewer + aperçu de bataille sans le menu du jeu
- Embarqué : Aurora Chamber a gagné une colonne
WebView2Host— « Rendre dans EditViewer » et « 🐉 Voir dans RealGame (ingame) » s'ouvrent désormais DANS l'éditeur (pas de navigateur) ; bouton ⟳ Reload viewer ;EmbeddedReloadRequestedre-charge automatiquement après les sauvegardes. - Actions en haut : ActionBar fixe (Rendre dans EditViewer · Voir dans RealGame · Restaurer · Enregistrer les positions · +/- monstre · Exporter les ancres) — plus rien de caché dans le scroll.
- Renommage UI :
noclip→ RealGame (ingame) ;MapViewer→ EditViewer (textes, statut, bannières). - Pas de menu du jeu : desc de scène
battle-previewcorrigée dans le catalogue FFX de noclip — l'URL?battle=<encId>&map=<mapIndex>#ffx/battle-previewrésout toujours directement vers FFX (mapIndex n'a pas besoin d'être parmi les 55 catalogués) ; dist reconstruit + vérifié dans le bundle servi (battle-preview+get("battle")présents). - Auto-sync : SaveDraggedPositions/SaveCameraShots/SaveCameraFloats/AddMonster/RemoveMonster ré-appliquent l'override RealGame + rechargent le visualiseur (la position sauvegardée s'affiche en jeu sans re-cliquer).
- Portes : suite complète 359/359 PASS ; build Release 0 erreurs ; bundle servi vérifié. ### MINOR
v2.209.0.0
v2.209.2.0BETAPATCH
Seymour1 août 2026
Aurora UI/UX : tableau de bord épuré + visualiseurs en fenêtres surgissantes dédiés
- Dashboard : l'écran principal est désormais la sélection de carte — liste avec badges ([ gLTF ] [ N tex ] [ N/N submeshes ] [ STUB ] [ map-only ], colorés par ton), carte sombre premium pour le lieu (#16121F bg + texte blanc), Actions à UN endroit (sous la carte : Rendre dans EditViewer · 🐉 Voir dans RealGame · 💾 Enregistrer les positions · ➕/➖ monstre · Exporter les ancres · ↩️ Restaurer) — duplication de boutons retirée.
- Pop-ups (nouvelle architecture) :
AuroraViewerWindowdédiée (WebView2) pour EditViewer (édition brute) et RealGame (lecture seule) — ils n'interagissent PAS entre eux ; changer de carte/bataille dans le dashboard ferme toutes les fenêtres automatiquement (empêche d'éditer des monstres sur la mauvaise carte / les fuites). - Sidebar overlay : le panneau de visualiseur flottant est devenu une sidebar repliable (❮ Hide → bande de 58px) — ne bloque plus la vue 3D.
- Grands textes → [?] avec infobulle (HonestyBanner déplacé dans l'infobulle du bouton « ? »).
- Portes : suite complète 360/360 PASS · build Release 0 erreurs ·
node --checkOK. ### PATCH
v2.209.1.0
v2.209.3.0BETAPATCH
Seymour2 août 2026
Custom Alchimie / Arena+ débloqué : chemin du lab corrigé + ArenaMultiBossLab déployé dans le jeu + vanilla-root configuré
- Correctif de chemin de lab (
ArenaPlusComposePick.cppResolveLabExe) : ajouté le candidat..\data\modules\tools\ArenaMultiBossLab\ArenaMultiBossLab.exe— le motif tools du projet (data\modules\tools, où vit SinScaleInject). Avant, le hook ne cherchait que dansmodules\tools\...— le lab n'était jamais trouvé → CreateProcess échouait → Custom Alchimie ne composait jamais rien en jeu. - Lab déployé dans le jeu :
ArenaMultiBossLabconstruit (Release, 0 erreurs/0 avertissements) et copié (exe+dll+deps+recettes) versdata\modules\tools\ArenaMultiBossLab\. - Racine vanilla configurée :
modules\config\arena_plus_compose_vanilla_btl.txtcréé pointant versFFX Extracted\FFX\ffx_ps2\ffx\master\jppc\battle\btl(les txt de config étaient vides avant →--vanilla-root ""→ le lab échouait). Défaut mod-root OK ({gameRoot}\data\mods\...\btlexiste). - Rollback v6 absorbé : le dllmain de HEAD est déjà l'état v5 (crash DrawString
0x9016B0dans DIFF — la nouvelle navigation sera réintroduite avec IDA disponible). Note sur l'entrée de changelog 2.207.6.0. - RT2
Needs Testing(Custom Alchimie) : F7 → Arena+ → Custom Alchimie → pick des aeons → Launch → bataille composée (ex. Bikanel + 4 Dark Aeons, battle_id bika02_01). Relaunch utilise le manifeste créé par le 1er Launch. ### PATCH
v2.209.2.0
v2.209.4.0BETAPATCH
Seymour2 août 2026
SIN débloqué : chemin SinScaleInject corrigé (data\modules\tools) + dossier roster corrigé + rosters de Macalania/Foudre restaurés depuis git + outil déployé
- Correctif de chemin exe (
SinCurseHook.cpp) :{DLL_DIR}\tools\SinScaleInject\→..\data\modules\tools\SinScaleInject\SinScaleInject.exe(motif tools du projet — avant, CreateProcessA échouait et SIN ne tournait jamais en jeu). - Correctif de dossier rosters (
SinScaleInject/Program.cs) : défaut désormais{gameRoot}\data\modules\tools\SinScaleInject\data\rosters(étaitmodules\tools\...— un niveau à côté). - Rosters restaurés depuis git (commit
eb2e93ed) :spira-sin-area-rosters/avecmacalania_all/bosses/field/woods.csv+thunder_plains.csv(monster_id,role,note,allowed_presetsavec allowlist UNI-001..006) + README. - Déployé dans le jeu :
SinScaleInjectconstruit (Release, 0 erreurs) et copié versdata\modules\tools\SinScaleInject\+ rosters versdata\modules\tools\SinScaleInject\data\rosters\. - RT2
Needs Testing(SIN) : transition de zone avecsin_curse.flag→ SinScaleInject tourne (logSinCurseHook SinScaleInject SUCCESS) → monstres de la zone avec HP/stats mis à l'échelle (T) + noms kernel[UNI]+ handler ATEL dans l'AiFile → bataille. - ffx-hooks avec le correctif de chemin SIN : build prêt, déploiement en attente (le jeu était ouvert au moment du commit — déployer quand fermé). ### PATCH
v2.209.3.0
v2.209.5.0BETAPATCH
Seymour2 août 2026
Musique de boss Custom Alchimie/Arena+ débloquée : la porte de heartbeat ne bloque plus MusicHook
- Le problème : MusicHook (qui applique l'override de musique de bataille) était bloqué par la porte
WaitForProbeHeartbeat— le heartbeat de ffx-probe ne montait jamais (sonde sans GetDeviceState hooké) →MusicHook install skipped: ffx-probe heartbeat gate failed→ la musique Arena+ ne jouait jamais. - La musique :
ARENA_PLUS_MUSIC_TRACK_DEFAULT 145 = "Challenge"(piste de bataille de boss — toutes les lignes F7 d'Arena+ : Dark Aeons + Der Richter ; override viaarena_plus_music_<row>.txt/FFXHOOKS_ARENAPLUS_MUSIC_TRACK_<N>). - Correctif : la porte est désormais non bloquante — attend 10s la sonde (si elle répond, le SOUNDCMD extra s'active aussi) et installe MusicHook même sans heartbeat (l'override via FFXHooksBlock + les hooks d'entrée de bataille Prep/PlayTrackWithPreload/SwitchCrossfade fonctionnent sans la sonde ; seul le déclencheur SOUNDCMD se dégrade — WARN dans le log).
- RT2
Needs Testing: Custom Alchimie → Launch → la bataille composée devrait jouer Challenge (145) au lieu du thème de bataille commun. - Noté en attente : le heartbeat de ffx-probe ne monte jamais (dinput8 66.560 du 07-19) — investiguer pourquoi GetDeviceState n'est pas hooké (affecte SOUNDCMD/FORCEBATTLE via la sonde ; la musique n'en dépend plus). ### MINOR
v2.209.4.0
v2.209.6.0BETAPATCH
Seymour2 août 2026
Musique de Custom Alchimie sans silence/fuite + restauration du bin composé (n'écrase jamais les canoniques définitivement)
- Correctif silence/fuite (MusicHook.cpp
MusicPlayWithPreload_Shim) : avec SOUNDCMD dégradé (pas de heartbeat de sonde), le shim supprimait la musique vanilla et s'appuyait sur soundcmd pour jouer l'override → bataille en silence + override fuyant vers le prochain PlayTrack (la musique « désirée » jouait à la sortie). Maintenant, sans soundcmd : substitue la piste et joue le vanilla (pas de silence, pas de fuite) ; avec soundcmd : garde la recette lab (suppression + recette). - Restauration du bin composé sur le chemin normal Custom Alchimie :
ArmDeferredFileRestoren'était armée que sur le chemin 781D60 (cross-map) — le chemin normal (ex. bika02_01 composé) laissait le bin dans la racine du mod pour toujours (écrasant les batailles canoniques de la zone). Désormais le chemin normal arme aussi la restauration (~30s). - Restauration de boot (
ArenaPlus_RestorePendingComposeOnBoot) : si une session précédente s'est fermée avant la restauration différée (~30s), le boot restaure le canonique depuis.spiraforge.bak(litbattle_iddepuis lecompose_last.jsondu gameRoot) — le compose ne reste jamais permanent. - Build PASS + LabDeploy vers Steam.
- RT2
Needs Testing: Custom Alchimie → Launch → bataille composée avec la bonne musique (pas de silence) → ~30s plus tard le bin canonique est restauré → les encounters aléatoires de la zone reviennent à la normale ; fermer le jeu avant 30s → le prochain boot restaure. ### PATCH
v2.209.5.0
v2.209.7.0BETAPATCH
Seymour2 août 2026
Musique de Custom Alchimie : le callback soundcmd n'est défini que lorsque la sonde est active (sans soundcmd → le shim remplace la piste et lit la piste vanilla)
- Pourquoi le correctif 2.209.6.0 ne suffisait pas :
g_arenaSoundCmdFnn'était pas null (le dllmain posaitArenaPlus_MusicHookProbeSoundCmdquand le hook s'installait) — il échouait seulement au runtime (pas de heartbeat de sonde) → le shim voyait le callback → utilisait le chemin lab (suppression + recette) → le soundcmd échouait → silence + fuite persistants. - Correctif : le dllmain garde désormais
probeAlive = FFXHOOKS_SKIP_PROBE_WAIT || WaitForProbeHeartbeat(10000)et ne pose le callback soundcmd que si la sonde est vivante (3 points d'installation). Sonde morte → callback null → le shimPlayTrackWithPreloadsubstitue la piste et joue le vanilla → Challenge (145) joue dans la bataille composée, pas de silence, pas de fuite à la sortie. - Verdict du crash-idle (investigué dans IDA via MCP 13337) : l'AV fmodex est préexistant —
AsyncTask_InvokeCallbackThunk(0x691480) appelle(*(this+4))(*(this+8))avec this+4/this+8 = tas libéré (0x10CDCDCD) ; le pointeur de thunk vit dans la table0xB46FA0(région audio). Rien dans nos hooks ne touche ce chemin (AsyncTask/0x691480/0xB46FA0) — les AV préexistent au F7. Le VEH global les capture et les journalise (diagnostics). Le corriger = trouver qui libère l'AsyncTask audio (focus séparé). - Build PASS + LabDeploy vers Steam (20:09). ### MINOR
v2.209.6.0
v2.209.8.0BETAPATCH
Seymour2 août 2026
Restauration du démarrage corrigée (manifeste réel à `modules\compose_last.json`) + bin composé de test restauré + scénarios pris en charge de Custom Alchimie confirmés
- Restauration de boot corrigée : le vrai manifeste est écrit par le lab à
modules\compose_last.json(relatif au module) — la restauration de boot ne cherchait que dans le gameRoot → le bin composé d'une session interrompue restait sur disque. Cherche désormais dans l'ordre :modules\compose_last.json→{gameRoot}\compose_last.json→{gameRoot}\mods\Spira Reforge\arena\compose_last.json. - Nettoyage de disque : le
bika02_01.bincomposé du test (19:37) a été restauré en vanilla (.spiraforge.bakdu 09/06/2024, 24 016 octets) — confirmé par taille/timestamp. - Scénarios supportés par Custom Alchimie (vérifiés 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 n'est PAS un scénario supporté (le compose retombe sur cavern — c'est pourquoi le x4 « n'ouvrait pas » là-bas). x3/x4 (3-4 acteurs) composent parfaitement sur les scénarios supportés (prouvé par dry-run : 4 slots, chunk2/chunk3 ok).
- Build PASS + LabDeploy vers Steam. ### PATCH
v2.209.7.0