Mise à jour 2.219
02/08/2026
v2.219.0.0BETAMINOR
Seymour2 août 2026
i18n : traduction complète des 7 langues (ES/FR/DE/IT appliquées + JA/KO/ZH en staging)
- Voie IFRT-2
- 2 197 clés traduites dans 7 langues en utilisant le glossaire officiel FFX (34 termes : Overdrive→Turbo/Ekstase, Scan→Libra/Analyse, etc.) + des termes UI communs (40 termes : Save/Load/Open/Close/Apply/etc.) + traduction naturelle.
- ES/FR/DE/IT appliquées aux fichiers resx satellites (Strings.{es,fr,de,it}.resx) : 2 197 clés mises à jour dans chaque langue. L'éditeur a désormais une UI complète dans 5 langues (EN/ES/FR/DE/IT).
- JA/KO/ZH en staging (
work/_i18n_staging_{ja,ko,zh}.json) : 2 197 traductions générées avec les termes FFX officiels en japonais/coréen/chinois, NON appliquées aux resx (banque de polices en attente — la tableSlotGlyphMetan'existe qu'au runtime ; les appliquer maintenant montrerait de mauvais caractères). Cela devient une obligation AI de les appliquer quand le RT2 le résout (documenté dansdocs/ai/SESSION_HANDOFF.md). - Pipeline de traduction :
work/_i18n_gen_all_translations.py(génère les traductions latines en lot) +work/_i18n_apply_translations.py(applique aux resx) +work/_i18n_gen_asian_staging.py(génère l'asiatique en staging JSON). - Porte : build 0 erreurs ; suite 379/379 PASS. Versionnage complet dans 6 docs (csproj + CHANGELOG + changelogUS + VERSIONING + PORT_STATUS + SESSION_HANDOFF).
v2.218.5.0
v2.219.0.0BETAMINOR
Lulu2 août 2026
Magic DLL Editor : résolveur d'opcodes UNIVERSEL (pppProgTbl_FP depuis le .rdata de la DLL elle-même)
- Déclencheur : smoke manuel de l'utilisateur —
magic_0117.dllouverte avec TOUS les slots « opcode not catalogued / raw hex » (le catalogue embarqué n'avait que 0021/0098 et mag_0117 n'a pas de fp.h Yonishi). - Découverte RE : la table locale de noms de handlers (pppProgTbl_FP) vit dans le
.rdataPROPRE de la DLL comme chaînesppp*dans l'ordre handler_table_index — .rdata de 0021 == fp.h Yonishi (37/37, ordre identique) ; .rdata de 0098 en a 39 vs 35 sur PS2 (le PC a inséré KeZCrct/KeZCrctShp/DrawMdl3/DrawShapeX au milieu de la table). Universel : chaque DLL l'a (échantillon de 12 DLL). - Correctif :
MagicFpHandlerTable.TryExtractFromDll— ordre de résolution : fp.h Yonishi > .rdata propre de la DLL > catalogue embarqué. Scan de couverture : 30 436 slots nommés (était ~32K RAW), 4 RAW, 0 opcode hors field_map (7 nouvelles familles SEM_PAYLOAD : pppDrawHook, pppDummyFunc, pppKeOfsMatXYZ, pppMatrixFront, pppNei*PointLight). - Cas concret : s11 de P0 (clé 0x040C) dans 0117 = handler #22 = pppDrawMatrixFront (pas pppMatrixScl — l'ordre de 0117 diverge du canonique à partir de #12).
- Portes : build 0 erreurs ; suite MagicDll 70/70 PASS (3 nouveaux tests 0117/0021/0098) ; couverture 49/49 DLL.
- Doc :
docs/reverse/PPP_RDATA_PPPROGTBL_UNIVERSAL_20260802.md. ### PATCH
v2.218.5.0
v2.219.0.1BETAPATCH
Seymour2 août 2026
Générateur piloté par dataset branché dans compose :
- le profil de scénario supporte désormais
"layout_mode": "pattern"(leBuildMonsterPattern— dist ~105, arc ±55-90°, seed par bataille) au lieu de preserve — party/caméra CONSTANTES + monstres dans le motif toujours changeant. Défaut"preserve"(comportement actuel). Testé : remiem x4 pattern → 4 monstres dans un arc ±60° (seed kino00_00-4) sur l'aperçu ### MINOR
v2.219.0.0
v2.219.0.2BETAPATCH
Seymour2 août 2026
MUSIQUE ENFIN RÉELLEMENT DÉSACTIVÉE + grille de caverne espacée
- MUSIQUE (priorité) :
ModuleFlagEnabledne vérifiait que l'EXISTENCE du drapeau (ignorait.flag.off) — mon.offprécédent était inutile. Correctifs : (1)arena_plus_music.flagrenommé en.bakdans le jeu (MusicHook off au prochain boot — IMMÉDIAT, pas de rebuild) ; (2) code :ArenaPlusMusicFlagEnabledRaw/MusicHookEnabledFromConfighonorent désormais.flag.off(motif du projet). La musique revient au prochain boot. - Caverne (Calm Lands) — monstres tassés : la grille x4 porteuse avait des points du même côté à ~29u (mon1-mon2 29u, mon1-mon3 27u — « empilés »). Grilles 4/5 espacées (arrière 78/avant 116 sur x4) : la caverne x4 a désormais mon1-mon2 44u, mon1-mon3 52u, mon0-mon1 83u (la carte montre les 4 aeons répartis). Nudge de boss désactivé (il collisionnait les aeons du milieu).
- Déploiement Steam (hooks 12:39 + lab). ### PATCH
v2.219.0.1
v2.219.1.0BETAPATCH
Seymour2 août 2026
ViewerShell PIN : visualiseur épinglé à la scène desc (home/About noclip bloqués)
- Diagnostic : l'utilisateur voyait le HOME de noclip (leur menu avec About) au lieu de Monster Studio — le hash
#ffx/monster-studion'était pas conservé (l'app retombait sur le home ; le skin seul ne corrige pas car le home manque des ids cachés). WebView2Host.NavigatePinned(url, hash)(1) garde de domaine —NavigationStartingannule toute navigation quittant notre origine (http://loopback:8769— bloque les liens externes comme le GitHub de l'About) ; (2) application du hash — àNavigationCompleted, silocation.hash≠ le hash desc, le ré-applique viaExecuteScriptAsync(le noclip gèrehashchangeet navigue vers la scène). Le visualiseur ne reste jamais sur le home : même si l'app retombe sur son menu, le shell le ramène.ViewerShellutiliseNavigatePinnedau chargement et au Reload.- Porte : build 0 erreurs ; smoke éditeur (Extras → Monster Studio — doit s'ouvrir DIRECTEMENT dans le studio, pas de home/About ; liens externes bloqués).
v2.219.0.0
v2.219.2.0BETAPATCH
Lulu2 août 2026
Catalogue embarqué [98] RÉGÉNÉRÉ depuis le .rdata PC (35→39 handlers) + cartographie complète effet→table versionnée
- Correctif de bug latent : le fp.h Yonishi (PS2) de 0098 était DÉCALÉ à partir de #26 — le PC a inséré KeZCrct(26)/KeZCrctShp(27)/DrawMdl3(32)/DrawShapeX(34) au milieu de la table. Le catalogue embarqué utilise désormais le vrai ordre PC (39) — repli correct quand .rdata est indisponible.
- Artefact :
docs/reverse/PPP_PROGTBL_ALL_20260802.json— scan de 589 DLL Steam, 583 avec pppProgTbl_FP (effet → table locale dans l'ordre handler_table_index) — le lien effet→opcode dont le visualiseur a besoin. - Portes : build 0 erreurs ; suite MagicDll 70/70 PASS (les tests 0098 ancrent désormais des positions exactes : 39, KeZCrct@26, DrawMdl@28). ### RÉVISION
v2.219.1.0
v2.219.2.1BETAREVISION
Lulu2 août 2026
Docs RE : 7 SEM_PAYLOAD vérifiées dans la base canonique via IDA MCP + pppDrawMatrixFront décompilé (INFRA, pas de payload)
- 5 commentaires opcode→handler appliqués au .i64 (0x757460 DrawHook / 0x7344D0 KeOfsMatXYZ / 0x737280 NeiChrPointLight / 0x74A2B0 + 0x74AF40 helpers Nei*PointLight) — les noms existants confirmés corrects (ne pas renommer à l'aveugle : handler_ptr avec offset 12 = pC=champ d'entrée draw, peut être un helper MagicHost).
- pppDrawMatrixFront (0x734CA0) = INFRA : copie ppvWorldMatrix → a3+128 et utilise le portrait HUD (FFX_BtlUI_HudParty_GetPortrait) — ne lit PAS le record. Le s11 de 0117 est un slot de commande (nom visible, édition brute correcte).
- Doc :
docs/reverse/PPP_RDATA_PPPROGTBL_UNIVERSAL_20260802.md§6-7. ### PATCH
v2.219.2.0
v2.219.2.2BETAPATCH
Seymour2 août 2026
i18n : restauration des 441 traductions ES manuelles écrasées par l'application en lot + expansion de la couverture FR/DE/IT via dictionnaire de domaine (136 termes) + 2 littéraux bruts ViewerShell migrés
- Voie IFRT-2
- Bug trouvé pendant la validation post-traduction : l'application automatique (
_i18n_apply_translations.py) écrasait les traductions ES manuelles de qualité (chrome, termes officiels, descriptions Mod_*) avec EN+glossaire. Correctif :work/_i18n_restore_manual_es.py— fusionne les 491 clés manuelles (_i18n_tr_es_1..5c.py) PAR-DESSUS les automatiques (441 mises à jour + 50 ajoutées) ; 50 orphelines (noms inventés, pas de prop dans Strings.cs ni de refs dans le code) retirées pour garder l'alignement 2197/2197. - Expansion de couverture :
work/_i18n_expand_coverage.py+work/_i18n_domain_dict_{1,2}.py(136 termes de domaine FFX/éditeur) — appliquées UNIQUEMENT aux clés encore égales à l'EN (idempotent) : FR +495 (18,7 %→41,2 %), DE +454 (19,0 %→39,7 %), IT +498 (19,3 %→41,9 %). - 2 littéraux bruts ViewerShell_Control.axaml (fichier ViewerHub d'une autre voie) migrés — StringsIntegrityTests a attrapé
iniciando…etservidor in-process→ clésU_*dans les 9 resx + props dans Strings.cs + remplacement chirurgical (seulement ces 2 lignes). - Porte : build 0 erreurs ; suite 396/396 PASS (StringsIntegrityTests verts). Couverture finale : ES 33,4 % (qualité manuelle), FR 41,2 %, DE 39,7 %, IT 41,9 % ; JA/KO/ZH toujours en staging (banque de polices).
v2.219.2.1
v2.219.2.3BETAPATCH
Seymour2 août 2026
i18n : couverture FR/DE/IT/ES étendue (dictionnaire PT→FR/DE/IT de 399 termes + 22 phrases EN + domaine ES) ET correctif de corruption d'index qui mélangeait les langues dans FR/DE
- Voie IFRT-2
- Dictionnaire PT→FR/DE/IT :
work/_i18n_pt_dict_{a,b1,c1,c2,c3}.py(399 termes — verbes UI, gameplay FFX, monde, matériau/temps/rareté) +_i18n_en_phrases.py(22 phrases communes) +_i18n_expand_coverage.pycouvrant désormais l'ES (index 0). - BUG trouvé au spot check : le 1er run de
_i18n_apply_pt_dict.pyutilisait les indices 1/2/3 contre des tuples (fr,de,it) → FR recevait les valeurs ALLEMANDES et DE les valeurs ITALIENNES (le 2e run corrigé ne les écrasait pas car les clés n'étaient plus égales à l'EN). Correctif :work/_i18n_regenerate_fr_de.pyrégénère FR/DE de zéro depuis le neutre avec les 4 couches dans le bon ordre (glossaire officiel > domaine > phrases EN > PT). - Couverture réelle après correctif : ES 50,3 % (+372), FR 58,6 %, DE 55,8 %, IT 59,9 % (vs 33-42 % avant cette ronde). 9/9 resx alignés (2199 clés).
- Porte : build 0 erreurs ; suite 396/396 PASS. PT 10,2 % (termes officiels ; le PT-BR est le neutre pratique de l'éditeur) ; JA/KO/ZH toujours en staging (banque de polices).
v2.219.2.2