u/RadMageIRL

Image 1 — Dragon Quest IV (PSX) English translation released - native engine, no executable graft
Image 2 — Dragon Quest IV (PSX) English translation released - native engine, no executable graft
Image 3 — Dragon Quest IV (PSX) English translation released - native engine, no executable graft
Image 4 — Dragon Quest IV (PSX) English translation released - native engine, no executable graft
Image 5 — Dragon Quest IV (PSX) English translation released - native engine, no executable graft

Dragon Quest IV (PSX) English translation released - native engine, no executable graft

Complete English translation of the 2001 PlayStation DQ4, running on the original Japanese executable.

Download and hashes: dq4translation.com

Public Format library, MIT: github.com/RadMageIRL/DQIV_PSX_TOOLS

In case it is useful to anyone working on the HeartBeat engine:

Text is stored as per-block Huffman trees with per-block phrase dictionaries. Strings are reached through five distinct reference forms, two of which are built across two instructions and cannot be found by scanning for a word. Changing one line means re-encoding its block and rewriting every pointer into it.

The interface draws through two font tables keyed differently, with proportional advance in dialogue and fixed cells in menus, so every window had to be measured rather than assumed. Longer party names needed the name buffer and every display path widened. Equipment names only fit because the category is carried by an icon rather than a word. Lifted same from DW7 EN disc in my release.

Two latent bugs in the original engine, harmless in Japanese, had to be fixed before English would render at all. A similar oddity I found in DQVI work, also documented on Github in my relevant repo for same.

Built on HBD archive research published by Markus Schroeder, and text extraction work by Mandy Wilkens. Hardware documentation by Martin Korth. Using the NoPrgress DQVI English translation as research I was able to review his work and learn a lot from finishing/refilling his translation, also available on my repo with some analysis write-ups if anyone is interested in same. And thanks to everyone that helped test, provide feedback and clymax of FFVCentral for his contributions in learning/identifying DQVI issues that helped in my DQIV work.

-RadMageIRL

u/RadMageIRL — 11 days ago

Dragon Quest IV (PlayStation/PSX/PS1) English translation - complete, v1.0

The 2001 PlayStation version of DQ4 has never had an English release on any console. This is a complete translation of it, running on the game's own Japanese engine with code modification to handle English text display.

All six chapters and the prologue. Every NPC, the casino, Immigrant/Settler Town, the monster arena, the full menu system, item and spell names, monster names, battle text, the save prompts, the title screen and the chapter cards.

You supply your own disc image of the Japanese release, SLPM-86916. The patch is an xdelta applied to it. No game data is distributed.

Download the public release, apply instructions and verification hashes: dq4translation.com

Tested on DuckStation and Beetle PSX.

-RadMageIRL

u/RadMageIRL — 11 days ago

Dragon Quest 4 PS1 (PSX) - JP findings and testing - building on markus-project findings

Based on findings from markus I was able to further map out Font tables/Menus as well as some other info regarding DQ IV JP PSX.

Some functional tooling and info can be found at: https://github.com/RadMageIRL/DQIV_PSX_TOOLS

Credits: http://markus-projects.net/dragon-hackst-iv/ (initial entry points/mappings/hypothesis)

Credits: https://github.com/mwilkens (regarding the LZS compression/decompression findings)

u/RadMageIRL — 2 months ago

Fixed the Info > All hang, the Forget crash, and the missing gold window in the NoPrgress DQ6 SNES translation

The NoPrgress/DeJap translation is the current most complete SNES translation, and it ships with three long standing defects. RHDN's own entry tells people to keep savestates ready for the Info > All crash. I diagnosed all three and published patches.

https://github.com/RadMageIRL/DQVI_NOPRGRESS_MENU_FIX

Info > All hang.

`STA $3AC2` at `$C3:3538` was deleted during translation and the gap backfilled with a duplicated RTL epilogue so downstream addresses stayed aligned. Without it the party slot loop compares its index against the `0xFF` "not applicable" sentinel rather than the party count, so every index passes, the loop reads an unpopulated slot, and `LDY $3EEE,X` with X=1 hits a byte that is never written. That trips a debug assertion Enix shipped in the retail ROM at `$C4:560F`, a two byte branch to itself. There are 835 of those traps in the ROM.

Measured across traces of the same screen in both ROMs: the Japanese reads `0001` at all 20 executions of the comparison, the English reads `00FF` at 4 of 5 including the fatal one.

Forget crash.

A WRAM allocation collision. NoPrgress built word wrapping for proportional English and put the buffer and its length counter at `$7E:37A0` and `$7E:37A2`, inside a 112 byte block the original game clears wholesale at `$C5:CF90`. Four routines touch that block, all original code, none aware the buffer exists.

The clear fires mid message, the bound is zeroed under a live cursor, the loop reads an unwritten slot and returns `$0000`, that underflows at `SBC #$00AB` into a negative table index, reads backwards into the inserted routine as if it were a jump table, and lands in open bus. Open bus reads as `BRK`, which pushes a garbage return address, and it cascades to a black screen.

Divergence against the Japanese ROM is a single measured event: JP 0 underflows in 109 executions, EN healthy 0 in 9, EN failing 1 in 85.

Fix relocates three variables out of the cleared block. 19 operand sites, no new code.

Missing gold window.

The gold draw at `$C3:3593` was deleted, same padding technique as the Info > All deletion four bytes earlier. Not an oversight: they widened the status window for English labels, which moved gold from columns 22-30 to 16-23 and buried it. Fix moves the window descriptor to columns 1-9 and restores the call using the same string entry they substituted at their other gold site.

Versions

v1 Info > All only, v2 adds Forget, v3 adds gold. Choices not a sequence, and v3 is the only one that changes layout. All targets are stock NoPrgress `B545C548`.

Repo

Patches, a stdlib only build script, and full analysis including the refuted hypotheses, which was most of the work. No ROMs.

Credit to NoPrgress and DeJap. Four years, the entire technical foundation, and both of these are invisible without tooling that did not exist when they were working.

u/RadMageIRL — 2 months ago
▲ 21 r/romhacking+1 crossposts

Fixed the broken 4 Party Member Patch for Dragon Quest V (SNES/SFC) NoPrgress / DeJap Translation

Note on Community Rules: This project is strictly open-source documentation and a delta patch file ( .ips / .bps ). It contains zero copyrighted game code, or ROM files.

TL;DR: The popular 4 party member hack for DQ5 SNES (NoPrgress/DeJap) hosted on RHDN (#7430) has been broken for years due to a 512-byte header offset error baked directly into the released patch. I’ve re-derived the conversion directly from Mr. 45's original 2007 Japanese hack, verified it, and published a working patch.

What Was Broken?

The original hack was created by Mr. 45 back in 2007 for the Japanese release. In 2022, AustNerevar released an English conversion for the DeJap translation (RHDN Hack #7430).

However, virtually everyone who tried using it hit the exact same wall: the game boots, titles, and lets you enter your name, but permanently hangs right after the initial config prompts with a door-opening sound effect. Most assumed they had a bad ROM header or patched incorrectly, but the patch file itself was flawed and off by 512 bytes (0x200).

1,140 of the 1,210 changed bytes landed at +0x200, writing modified values onto completely unrelated code while leaving the target code untouched.

Links & Code

The GitHub repo contains the full byte-level analysis, Mr. 45's original Japanese notes (with translations), and an automated build script that runs the patch chain against a Japanese base ROM with hash verification. (No ROMs included, bring your own clean files).

u/RadMageIRL — 2 months ago