Aggiornamento 2.219
02/08/2026
v2.219.0.0BETAMINOR
Seymour2 ago 2026
i18n: complete translation of 7 languages (ES/FR/DE/IT applied + JA/KO/ZH in staging)
- Lane IFRT-2
- 2,197 keys translated in 7 languages using official FFX glossary (34 terms: Overdrive→Turbo/Ekstase, Scan→Libra/Analyse, etc.) + common UI terms (40 terms: Save/Load/Open/Close/Apply/etc.) + natural translation.
- ES/FR/DE/IT applied to satellite resx files (Strings.{es,fr,de,it}.resx): 2,197 keys updated in each language. The editor now has complete UI in 5 languages (EN/ES/FR/DE/IT).
- JA/KO/ZH in staging (
work/_i18n_staging_{ja,ko,zh}.json): 2,197 translations generated with official FFX terms in Japanese/Korean/Chinese, NOT applied to resx (font-bank pending —SlotGlyphMetatable only exists at runtime; applying now would show wrong characters). This becomes an AI obligation to apply when RT2 resolves it (documented indocs/ai/SESSION_HANDOFF.md). - Translation pipeline:
work/_i18n_gen_all_translations.py(generates Latin translations in batch) +work/_i18n_apply_translations.py(applies to resx) +work/_i18n_gen_asian_staging.py(generates Asian in JSON staging). - Gate: build 0 errors; suite 379/379 PASS. Complete versioning in 6 docs (csproj + CHANGELOG + changelogUS + VERSIONING + PORT_STATUS + SESSION_HANDOFF).
v2.218.5.0
v2.219.0.0BETAMINOR
Lulu2 ago 2026
Magic DLL Editor: UNIVERSAL opcode resolver (pppProgTbl_FP from the DLL's own .rdata)
- Trigger: user's manual smoke —
magic_0117.dllopened with ALL slots "opcode not catalogued / raw hex" (embedded catalog only had 0021/0098 and mag_0117 has no Yonishi fp.h). - RE discovery: the local handler-name table (pppProgTbl_FP) lives in the DLL's own
.rdataasppp*strings in handler_table_index order — 0021 .rdata == Yonishi fp.h (37/37, identical order); 0098 .rdata has 39 vs 35 on PS2 (PC inserted KeZCrct/KeZCrctShp/DrawMdl3/DrawShapeX mid-table). Universal: every DLL has it (12-DLL sample). - Fix:
MagicFpHandlerTable.TryExtractFromDll— resolver order: Yonishi fp.h > DLL's own .rdata > embedded catalog. Coverage scan: 30,436 named slots (was ~32K RAW), 4 RAW, 0 opcodes outside field_map (7 new SEM_PAYLOAD families: pppDrawHook, pppDummyFunc, pppKeOfsMatXYZ, pppMatrixFront, pppNei*PointLight). - Concrete case: s11 of P0 (key 0x040C) in 0117 = handler #22 = pppDrawMatrixFront (not pppMatrixScl — 0117's order diverges from canonical from #12 on).
- Gates: build 0 errors; MagicDll suite 70/70 PASS (3 new 0117/0021/0098 tests); 49/49 DLL coverage.
- Doc:
docs/reverse/PPP_RDATA_PPPROGTBL_UNIVERSAL_20260802.md. ### PATCH
v2.218.5.0
v2.219.0.1BETAPATCH
Seymour2 ago 2026
Dataset-driven generator plugged into compose:
- the scenario profile now supports
"layout_mode": "pattern"(theBuildMonsterPattern— dist ~105, arc ±55-90°, per-battle seed) instead of preserve — party/camera CONSTANT + monsters in the ever-changing pattern. Default"preserve"(current behavior). Tested: remiem x4 pattern → 4 monsters in a ±60° arc (seed kino00_00-4) on the preview ### MINOR
v2.219.0.0
v2.219.0.2BETAPATCH
Seymour2 ago 2026
MUSIC FINALLY REALLY DISABLED + cavern grid spaced out
- MUSIC (priority):
ModuleFlagEnabledonly checked flag EXISTENCE (ignored.flag.off) — my earlier.offwas useless. Fixes: (1)arena_plus_music.flagrenamed to.bakin the game (MusicHook off on next boot — IMMEDIATE, no rebuild); (2) code:ArenaPlusMusicFlagEnabledRaw/MusicHookEnabledFromConfignow honor.flag.off(project pattern). Music returns on next boot. - Cavern (Calm Lands) — packed monsters: the carrier x4 grid had same-side points at ~29u (mon1-mon2 29u, mon1-mon3 27u — "stacked"). Grids 4/5 spaced (back 78/front 116 on x4): cavern x4 now mon1-mon2 44u, mon1-mon3 52u, mon0-mon1 83u (the map shows the 4 aeons distributed). Boss nudge disabled (it collided the middle aeons).
- Steam deploy (hooks 12:39 + lab). ### PATCH
v2.219.0.1
v2.219.1.0BETAPATCH
Seymour2 ago 2026
ViewerShell PIN: viewer pinned to the desc scene (noclip home/About blocked)
- Diagnosis: the user saw the noclip HOME (their menu with About) instead of Monster Studio — the
#ffx/monster-studiohash was not being kept (the app fell back to home; the skin alone does not fix it because the home lacks the hidden ids). WebView2Host.NavigatePinned(url, hash): (1) domain guard —NavigationStartingcancels any navigation leaving our origin (http://loopback:8769— blocks external links like the About's GitHub); (2) hash enforcement — onNavigationCompleted, iflocation.hash≠ the desc hash, re-applies it viaExecuteScriptAsync(the noclip handleshashchangeand navigates to the scene). The viewer never stays on the home: even if the app drops to its menu, the shell brings it back.ViewerShellusesNavigatePinnedon load and Reload.- Gate: build 0 errors; editor smoke (Extras → Monster Studio — should open DIRECTLY in the studio, no home/About; external links blocked).
v2.219.0.0
v2.219.2.0BETAPATCH
Lulu2 ago 2026
Catalogo incorporato [98] RIGENERATO dal .rdata del PC (35→39 handler) + mappa completa effetto→tabella versionata
- Fix bug latente: lo fp.h Yonishi (PS2) per 0098 era SHIFTATO da #26 in poi — il PC ha inserito KeZCrct(26)/KeZCrctShp(27)/DrawMdl3(32)/DrawShapeX(34) a metà tabella. Il catalogo incorporato ora usa l'ordine PC reale (39) — fallback corretto quando il .rdata non è disponibile. (letterale tecnico: SHIFTED) (letterale tecnico: mid-table)
- Artifact:
docs/reverse/PPP_PROGTBL_ALL_20260802.json— scansione di 589 DLL Steam, 583 con pppProgTbl_FP (effetto → tabella locale nell'ordine handler_table_index) — il link effetto→opcode che serve al viewer. - Gates: build 0 errori; suite MagicDll 70/70 PASS (i test 0098 ora ancorano le posizioni esatte: 39, KeZCrct@26, DrawMdl@28). ### REVISION
v2.219.1.0
v2.219.2.1BETAREVISION
Lulu2 ago 2026
RE docs: 7 SEM_PAYLOAD verified in the canonical DB via IDA MCP + pppDrawMatrixFront decompiled (INFRA, no payload)
- 5 opcode→handler comments applied to the .i64 (0x757460 DrawHook / 0x7344D0 KeOfsMatXYZ / 0x737280 NeiChrPointLight / 0x74A2B0 + 0x74AF40 Nei*PointLight helpers) — existing names confirmed correct (do not blind-rename: handler_ptr with offset 12 = pC=draw entry field, may be a MagicHost helper).
- pppDrawMatrixFront (0x734CA0) = INFRA: copies ppvWorldMatrix → a3+128 and uses HUD portrait (FFX_BtlUI_HudParty_GetPortrait) — does NOT read the record. 0117's s11 is a command slot (name visible, raw editing correct).
- Doc:
docs/reverse/PPP_RDATA_PPPROGTBL_UNIVERSAL_20260802.md§6-7. ### PATCH
v2.219.2.0
v2.219.2.2BETAPATCH
Seymour2 ago 2026
i18n: restoration of the 441 manual ES translations that the batch apply had overwritten + FR/DE/IT coverage expansion via domain dictionary (136 terms) + 2 raw ViewerShell literals migrated
- Lane IFRT-2
- Bug found during post-translation validation: the automatic apply (
_i18n_apply_translations.py) overwrote the quality manual ES translations (chrome, official terms, Mod_* descriptions) with EN+glossary. Fix:work/_i18n_restore_manual_es.py— merges the 491 manual keys (_i18n_tr_es_1..5c.py) ON TOP of the automatic ones (441 updated + 50 added); 50 orphans (invented names, no prop in Strings.cs nor refs in the codebase) removed to keep 2197/2197 alignment. - Coverage expansion:
work/_i18n_expand_coverage.py+work/_i18n_domain_dict_{1,2}.py(136 FFX/editor domain terms) — applied ONLY to keys still equal to EN (idempotent): FR +495 (18.7%→41.2%), DE +454 (19.0%→39.7%), IT +498 (19.3%→41.9%). - 2 raw ViewerShell_Control.axaml literals (other lane's ViewerHub file) migrated — StringsIntegrityTests caught
iniciando…andservidor in-process→U_*keys in all 9 resx + props in Strings.cs + surgical replacement (only those 2 lines). - Gate: build 0 errors; suite 396/396 PASS (StringsIntegrityTests green). Final coverage: ES 33.4% (manual quality), FR 41.2%, DE 39.7%, IT 41.9%; JA/KO/ZH still staged (font-bank).
v2.219.2.1
v2.219.2.3BETAPATCH
Seymour2 ago 2026
i18n: copertura FR/DE/IT/ES espansa (dizionario PT→FR/DE/IT di 399 termini + 22 frasi EN + dominio ES) E fix della corruzione di indice che mescolava le lingue in FR/DE
- Lane IFRT-2
- Dizionario PT→FR/DE/IT:
work/_i18n_pt_dict_{a,b1,c1,c2,c3}.py(399 termini — verbi UI, gameplay FFX, mondo, materiale/tempo/rarità) +_i18n_en_phrases.py(22 frasi comuni) +_i18n_expand_coverage.pyora copre anche ES (indice 0). - BUG trovato nello spot check: il 1° run di
_i18n_apply_pt_dict.pyusava gli indici 1/2/3 contro le tuple (fr,de,it) → FR riceveva valori TEDESCHI e DE valori ITALIANI (il 2° run corretto non li sovrascriveva perché le chiavi non erano più uguali a EN). (letterale tecnico: GERMAN)Fix:work/_i18n_regenerate_fr_de.pyrigenera FR/DE da zero dal neutrale con tutti e 4 i layer nell'ordine corretto (glossario ufficiale > dominio > frasi EN > PT). - Copertura reale dopo il fix: ES 50.3% (+372), FR 58.6%, DE 55.8%, IT 59.9% (vs 33-42% prima di questo giro). 9/9 resx allineati (2199 chiavi).
- Gate: build 0 errori; suite 396/396 PASS. PT 10.2% (termini ufficiali; il PT-BR è il neutrale pratico dell'editor); JA/KO/ZH ancora staged (font-bank).
v2.219.2.2