Translating Dungeons and Dragons Tower of Doom

Hello everyone, I'm starting this thread to provide my knowledge so far on D&DToD Saturn translation (hacking).
After a long time of analysis, I currently believe I have everything necessary to bring the MAME translation to the Saturn.
I'll add most of the relevant information here at another time.

I think I'm at the ultimate goal, which is to add more space to allocate the large difference in characters between the sentences in the text boxes.

After all the time analyzing the routines and subroutines, my first thought would be to try to create the characters in one of the empty spaces in the main bin file that is always loaded, and delete them after use.

At the end of each .bin file of each "scene" of the game, some codes that I believe to be dummy are always loaded in the empty part of the hwram, they are codes from the main .bin file.
I'll still check if they have any use and possibly where exactly they are created, because in this case I could also write a routine to produce the characters and load them into this "empty" space.

There is perhaps the possibility of extracting the game and adding a file, but I tried it once and failed (I didn't try that much).
As the game is .bin and has compressed sounds I don't even know if it is possible to extract and recompile it, in this case I would like someone experienced to say "it is possible to do this just using the tools available in the community", and I would try this possibility too.

Until the next update.
 
Some info about the game:

#All the font (text, character, texture etc.) is uncompressed;

#There is a .BIN file and a .DAT file for each "screen" of the game, this includes the "press start" screen, the post press start screen, the cutscenes, character selection, name selection and finally, the stages;

#In the prototype there was a character .dat file (the text letters MXXM.DAT) and screen textures (background screen MXX.DAT) however in the final game, both files is in a unique .DAT file).

There is the first file to be loaded: the 0DD_SS.BIN:
#It's located between 0x06010000~0x06043832.
#this file loads all the .bin files and do some other stuff that I probably saw and didn't write a note, but that's not relevant by now.

The "main program" where is almost all subroutines that produce stuff is on DD_SS1.BIN:
#It's located between 0x060440000~060B3520;
#DD_SS1.BIN loads all the .DAT files;
#The character info texture (name, items, exp etc.) is pushed from DD_SS1.BIN;
#The enemies name list is pushed from here;
#The player default name is pushed from here too (probably, I didn't spend time on it);
#The game has a table for upper name (when you get a item or punch some kobold) and a table for bottom name (your name fixed on bottom screen).

#All MPXX.BIN is located on 0x060B8000~variable (some stages loads more than one .bin file if I remember right, or maybe not, whatever).

As said before, the game has a .Dat file for each screen, and by that I mean that there is a FONT TABLE for each screen too.
Basically every screen has it's own font table with the characters and textures that will be used by the .BIN file, the game does not have a main font table.​

16x16 and 8:16 Fonts

#The main font for all the japanese characters that appear on every Text Box (and some other locations) is 16:16;
#There are some archives with 8:16 Alphanumeric characters, but I literally haven't seen them being used anywhere aside for the numbers on some cutscenes;
#The archive with 8:16 font is the MP104.DAT and some others. This file loads on the cutscenes that show the individual characteristics of the four heroes.

Although the 8:16 Alphanumeric characters is not used anywhere, happily there ARE subroutines that can do this with some modifications:
#The 16:16 japanese characters that appear on every Text Box has it's own subroutine;

To swap the text box's text for 8:16, just do 8907 on 0x06046332 and 7601 on 0x06046354.
#This modification will make the file write on VDP2 the first tile of X coordinate and the next tile on Y coordinate, doing
0
1
and not
0 2
1 3.​

8x8 fonts
#The game has 8x8 fonts but for the player's name, player frame, item list on top screen (ALWS.FNT);
#There are 8x8 fonts for basically the same thing but to bottom screen, the "NOW LOADING", the numbers for "continue screen" (FACE.FNT);
#For some cutscenes there is a major Font table (MGMES.FNT);


Until the next update.​
 
Last edited:
This game does some of the word displays the same way it does for SFZero 3 , there's a string of tiles to make the words on screen, but they aren't 16x16 per letter /character.

For example, this text is made of 16x16 tiles BUT
1703344041801.png

they look like this:

1703344318400.png
1703344303624.png
1703344285086.png
1703344265270.png
1703344217683.png
1703344199531.png
1703344178341.png
 
Good news is all those select screen tiles are in MP079.DAT in 16x16 4bpp tiles
View attachment 9184
Yeah, as I said, all japanese characters other than the 8x8 characters of names, items and the highscore is in 16x16, (at least in my knowledge) this includes the select hero screen that you showed. This file and the cutscene info tiles is also in this format (more like manually drawn characters and not some standardized letters).
And I have to say that the select hero screen is partially drawned on vdp1, this includes the letters you mentioned.

You reminded me that I forgot to include notes about 8x8 characters, Thanks Malenko for the reply.

Currently the goal is to insert more 8:16 characters into text box in the most convenient way possible... But maybe I can spend some time "translating" the menus while an idea doesn't come to mind.
 
Hello guys. After a long time without updating the topic, I will post some notes about the evolution of the project, and in the next few days I will post something more graphical.

Currently I already have the translated script (taken from the arcade version, with some translation errors that I found and corrected) and I already have the offsets of the version to be "translated" (Saturn).

I have also written the asm hack that solves the lack of space question. The hack needs some tweaking, but so far it works.

I recreated the fonts for the character descriptions during the selection screen, the fonts for the alphabet to enter your name, and the fonts for the character names that appear at the bottom and top of the screen, and the font for the items that appear at the top.

I'm currently recreating the font for the items that appear at the bottom of the screen, dagger, hammer, etc (first photo).
After creating the fonts, I'll need to adjust the pointers to the new font.
This font in particularar sucks because it is not ASCII, there is no standardization, and each item has its own letter (table), apart from the fact that they are covered by the green bar in the UI.
I'm replicating what they did, but with the translation.
It would be possible to standardize, but it would be more work than leaving it the way it is, and it would create even more problems with space.

The next steps are:
Insert the script with the translation in the new space;
To adjust the offsets for the new space;
To adjust the size of textboxes;
Small adjustments here and there.
 

Attachments

  • Captura de tela 2025-02-07 122702.png
    Captura de tela 2025-02-07 122702.png
    44.6 KB · Views: 0
  • Captura de tela 2025-02-07 122408.png
    Captura de tela 2025-02-07 122408.png
    58.5 KB · Views: 0
  • Captura de tela 2025-02-07 122358.png
    Captura de tela 2025-02-07 122358.png
    6.5 KB · Views: 0
So, I finally finished these weapon tiles.
Damn UI, or maybe I'm the problem here.
It's similar to the original, like 90%.
I had to redo it a few times until it was even minimally good. Living and learning.
If I had known that with this font I wouldn't have enough space in the UI for some names, I would have based it on the original.

I think the tile work ends here. This UI was the last thing I needed to redo, I did it last because I knew it would be the shittiest thing to do.

Now I'll work back on hacking part, probably will do the sinopse first, and later I'll change the text box sizes.

For last, I'll need to create the script thing to dump the original text pointers, and to insert the translation.

Edit: I forgot to leave some notes about these tiles.

The game has a routine that writes part of the background and mainly this entire UI.
This routine uses 1 word and is divided into two subroutines, the first subroutine writes 1 tile at a time, like
1.2
3.4
The second writes 4 tiles at a time, as if it were 16x16, but with 8x8 tiles, like
12
34
The first subroutine basically has as a pointer the location of the font file, like 0x044A;
The second subroutine is activated by starting the word with 8, like 0x844A, then it writes the subsequent 4 tiles in this format:
0x044a,0x044b;
0x044c,0x044d.

Japanese characters use the first subroutine a lot and mix it with the second to write their tiles. I cut the use of the first subroutine as much as I could to have space on the pointers and to make the work easier, and I only used it on certain items to keep them centered and that kind of thing.
 

Attachments

  • UI.mp4
    2.7 MB
Last edited:
Hello.
I've finally done the pre game translation.
I'm reaching the end of the project, now all thats left is the story itself.

Like always, a explanation of how the game handle things off.
I didn't mention it in the other topics (I think), but one fact that really messed things up was the encoding of the 16x16 characters in this game. Normally 16x16 shift jis use 2 bytes (FFFF) per character, but this game/port already has 1 byte (FF) encoding for almost all characters, so there is no "extra" space in the offsets with text. This is because of how they organized the font files, basically every file has its own font with its own table. So the most important part was finding a stable place in the game code where I could apply the translation (and other fun stuff) without having to edit or interfere with the originality of the game, its functions and the script.

The pre game is separated in 6 archives, MP100 until MP106.

Starting with the ranking in the MP100.BIN, the easiest of all: it uses FACE.FNT and the table has the table 00=A, and of course, the letters are 8x8. The ranking is stored in DD_SS1.BIN and is written to HWRAM 0x060E~, a place where the game stores some routines that vdp2 uses.
MP100.BIN pulls this list, decodes the letters and other characters and writes it to vdp2. Simple.

Cutscenes: the "demo play" with skill information was by far the worst part. This text coding has the table 4C=A from the MGMES.FNT. Here has an irregular routine that writes the blue textbox in 8x8 based on a character table from DD_SS1.BIN, and the letters are obviously 16x16. The bad thing about this is the fact that the same table and routine is responsible for writing and "erasing" the letters and the textbox (the routine doesn't actually delete, it writes dummy with a "null" color so we can't see it) this makes it an exclusive routine, but the worst of all is that the routine writes and erases only what was previously written, in other words, if you try to move the letters around, or write more text, they simply won't be erased. Yes, very petty.
So I used part of the hack file and wrote a simple loop-based routine that erases the entire textbox region just below "PRESS START". Fortunately, all the cutscenes (and only the cutscenes) are linked to this routine, so everything was solved at once.

Character info: this part was simple, was here in the MP104.BIN that I discovered that the game had 8x16 routine.
That said, this file does not use the standardized 8x16 routine, part of the routine was pasted into the file itself, but the difference is in the organization of the registers.

Finally, the "synopsis" in MP105.BIN. This part was somewhat fun, because at least the routine was well written. That said, it was harder than I thought it would be, because of the scrolling of the text. Two routines run here, actually the main writing routine and a subroutine that serves to make the text follow the scroll.
The command codes F3, F4, F5, F6, and F7 does the trick here: F3 serves as the "resume" command, this code makes the game continue writing the text at the previously saved offset. F4 serves as the default spacing between lines. F5 acts as a line break.
F6 command was the tricky part, I know what it does but I don't know how it does it (I didn't feel like following this subroutine all the way through). Anyway, it returns the game code to a pre-file routine, and then it returns back to the synopsis file, but the base offset that is written in vdp2 changes to another base offset, it is as if it were a giant line break.
F6 is mainly used to follow the scroll, but these commands were created with this specific text length in mind. Because of this, in this case I had to obey the rules of the original text, and although I could write more text, I had to maintain the number of lines of the original text, or else I would have to change the scroll routine itself. F7 stops the scrolling. I didn't see the F7 subroutine, but its function was quite visible.

That's it for now. I'll probably only update the topic when the translation is ready to be released (so I hope).
 

Attachments

  • 1.png
    1.png
    61.3 KB · Views: 0
  • 2.png
    2.png
    60 KB · Views: 0
  • 3.png
    3.png
    74.8 KB · Views: 0
  • 4.png
    4.png
    62.7 KB · Views: 0
  • 5.png
    5.png
    49 KB · Views: 0
  • 1.mp4
    6.5 MB
  • 2.mp4
    14.8 MB
  • 3.mp4
    9.2 MB
  • 4.mp4
    5.9 MB
Last edited:
Back
Top