Release summary

v2.32 is a content release. Every v2.31 fix continues to ship intact — the friend-menu / sing / hum / clothing-codec / bug-registering crash fixes from the overlay compressed-flag bug, the leading-§ strip, the 29 song retranslations led by Cottage Cheese → Summer Cottage, the “His Majesty” canon sweep, and the Berry’s shop possessive all carry forward unchanged. On top of that baseline, v2.32 lands hundreds of new player-visible improvements concentrated on the bulletin board, letter mail, song lists, and several smaller translation-canon corrections.

What changed for players

8 change groups in this release. For row-by-row before/after of the bulletin and letter retranslations (~648 entries), see the source data linked at the bottom.

Bulletin board and letter mail — the biggest visible change

648 bulletin and letter posts retranslated to fit the engine’s on-screen caps. Bulletin combined title + body now stays within 80 characters across at most 3 rows of 34 columns each. Letter bodies stay within 80 characters across at most 4 rows of 34 columns, with greetings and signatures preserved verbatim. Names from the official Game 1 English release (Fungi Forest, Yeti, Warashi, Halogen) are applied wherever those characters appear.

Bulletin titles — bracket strip, length cap, all-caps

70 bracketed bulletin titles like [Halloween is Here!] and [Familiar Class] unbracketed so the title can use its full character budget. 86 bulletin titles retranslated to fit the 16-character title cap that the bulletin list display silently clips at — Tyler reviewed every one of the 86 picks in the in-repo bulletin viewer (50 user-picked alternatives, 35 agent proposals accepted, 1 implicit fallback). All 233 bulletin titles set to uppercase for visual distinction from the message body (167 actually changed, 66 were already all-caps).

First-character clipping bug on multiple-choice answer lists

Class quiz questions (Miss Melissa class screenshot was the original repro) and 10 other answer-list entries had been translated with the answer-index opcode at the start rather than the end of each answer. The engine reads that opcode as a list-marker and eats the first visible character, so “Love / Romance / Secret” rendered as “ove / omance / ecret” on screen. All 11 affected entries reordered so the opcode sits after the answer text, matching the JP source.

Song name fixes

Song-name list synced across msg99020, msg99023, and msg99135. Two of the three lists were still carrying the pre-v2.31 song names — most visibly “Cottage Cheese” and “Sister of Mine” — even though the actual song-selection menu in v2.31 had been corrected to “Summer Cottage” and “Happy Town”. All three lists now agree. Seven DLC song names standardized between msg99023 and msg99135 (Chocolate Cosmos, Future with You, Wind’s Lost and Found, Beyond Sadness, That Rainy Day, Road to Tomorrow, On a Lovely Night).

Translation canon corrections

Wizard rank names and profile labels aligned with Magician’s Quest Game 1 (postlist_e.ofs): Apprentice → Apprentice Wizard, Great Wizard → Magnus Wizard, Skilled Wizard → Great Wizard (re-placed at idx 7), Righteous Wizard → Corsair Wizard, A LaMode Wizard → A La Mode Wizard, Bug Wizard → Insect Wizard, Sign → Star Sign. Some first-meeting NPC introduction lines replaced with the original Game 1 dialog.

NPC name typography

Three NPCs (Mr. Vlad, Mr. Oakley, Mr. Graves) had their honorific written as “Mr” with no period; corrected to “Mr.” with a proper space. Two NPCs changed from Mr./Mrs. to Miss: Miss Strawe (was “Mrs. Strawe”) and Miss Melissa (was bare “Melissa”). DB, NpcData.lzs table, and NpcDataOfs.ofs container kept in sync.

Engine-integrity gates (under the hood)

The v2.32 candidate built earlier in the cycle accidentally shipped 4,350 literal DB-representation tokens ([PLAYER_NAME], [NPC_DAT:N], [COLOR:N], etc.) as visible text across 281 OFS files. reemit.py now falls back to a reverse-lookup against the global opcode registry when a per-row inline-tag table is missing a tag. New byte-level placeholder-leakage gate (_check_no_placeholder_leakage.py) scans every rebuilt ROM for ~50 known tag patterns as UTF-16-LE bytes and exits non-zero if any are present; wired automatically as Phase 4b of rebuild_rom.py.

Message-length caps canon (under the hood)

1,077 msg98 DB rows had their max_line_chars, max_total_chars, max_lines, and budget_class columns rewritten to the canonical values the engine actually enforces (34 cols x 80 chars x 3-4 rows). The 71 / 72 / 135 / 66 codepoint cap numbers that had crept into older audit docs are flagged as anti-rules and removed from the active validation path. Canonical reference written up at notes/_message_length_caps_canon.md.

How v2.32 shipped

Released patch — Overlay strings stored re-LZ-compressed with the fixed compressed-flag bookkeeping (matches v2.31 production default). One patch per ROM revision; both produce the same patched ROM byte-for-byte.

v2.32 ships one patch per ROM revision. Both behave identically — pick the one that matches your ROM’s MD5.

Source