Update 2.219
8/2/2026
v2.219.0.0BETAMINOR
SeymourAug 2, 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
LuluAug 2, 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
SeymourAug 2, 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
SeymourAug 2, 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
SeymourAug 2, 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
LuluAug 2, 2026
Embedded catalog [98] REGENERATED from the PC .rdata (35→39 handlers) + full effect→table map versioned
- Latent bug fix: the Yonishi (PS2) fp.h for 0098 was SHIFTED from #26 on — the PC inserted KeZCrct(26)/KeZCrctShp(27)/DrawMdl3(32)/DrawShapeX(34) mid-table. Embedded catalog now uses the real PC order (39) — correct fallback when .rdata is unavailable.
- Artifact:
docs/reverse/PPP_PROGTBL_ALL_20260802.json— scan of 589 Steam DLLs, 583 with pppProgTbl_FP (effect → local table in handler_table_index order) — the effect→opcode link the viewer needs. - Gates: build 0 errors; MagicDll suite 70/70 PASS (0098 tests now anchor exact positions: 39, KeZCrct@26, DrawMdl@28). ### REVISION
v2.219.1.0
v2.219.2.1BETAREVISION
LuluAug 2, 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
SeymourAug 2, 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
SeymourAug 2, 2026
i18n: FR/DE/IT/ES coverage expanded (399-term PT→FR/DE/IT dictionary + 22 EN phrases + ES domain) AND index-corruption fix that mixed languages in FR/DE
- Lane IFRT-2
- PT→FR/DE/IT dictionary:
work/_i18n_pt_dict_{a,b1,c1,c2,c3}.py(399 terms — UI verbs, FFX gameplay, world, material/time/rarity) +_i18n_en_phrases.py(22 common phrases) +_i18n_expand_coverage.pynow covering ES (index 0). - BUG found in spot check: the 1st run of
_i18n_apply_pt_dict.pyused indices 1/2/3 against (fr,de,it) tuples → FR received GERMAN values and DE received ITALIAN values (the corrected 2nd run didn't overwrite them because keys were no longer equal to EN). Fix:work/_i18n_regenerate_fr_de.pyregenerates FR/DE from scratch from the neutral with all 4 layers in the correct order (official glossary > domain > EN phrases > PT). - Real coverage after fix: ES 50.3% (+372), FR 58.6%, DE 55.8%, IT 59.9% (vs 33-42% before this round). 9/9 resx aligned (2199 keys).
- Gate: build 0 errors; suite 396/396 PASS. PT 10.2% (official terms; PT-BR is the editor's practical neutral); JA/KO/ZH still staged (font-bank).
v2.219.2.2