Retro-bit Translations: Part Deux

Retro-bit Translations: Part Deux

What is this about?


This is a follow-up to this blog post: Has retro-bit stolen fan translations to put in their repros?

In that first post, I only had screenshots and videos to look at Shockman Zero.

I have since been sent the ROM file. I intend here to do a thorough and exhaustive comparison of Retro-bit’s ROM and the fan translation by Svambo (romhacking) and Anonymousse (translation).

For the sake of simplicity, I’ll sometimes refer to the fan translation as Svambo ROM.

I’ll also refer to the digital release by Ratalaika Games & Shinyuden as the Switch ROM (that’s the version I have) but it should be pretty similar on Xbox or Playstation. To clarify, I mean the SFC ROM contained in the Switch ROM. Unlike GleyLancer, which used an overlay, they actually translated the SFC ROM here.

I’ll refer to the translator hired by Retro-bit as Rod.


Debug menu


If anyone wants to verify for themselves, anything I show here, you’ll want to use the debug menu.

Pause the game, and press Up, Up, Down, Down, Left, Right, Left, Right, X, X, B, B, Y, A, Y, A.

This opens a menu with 2 variables of 8 bits. You can flip the selected bit with Y.

The most useful ones:

  • SW1 bit 1 = Activate the Stage Select menu
  • SW2 bit 2 = Double Jump
  • SW2 bit 5 = Super Attack with A

(more info)

debug1.png

Pause the game, hold B and X, then press R to open the stage select menu.

debug2.png


Overview


I’m going to compare the ROMs with a program called Beyond Compare. It’s a powerful tool used to compare 2 text files or 2 binary files (hex) side by side. First, I will list all the changes made by Svambo compared to the Japanese ROM. Then I will list all the changes between Retro-bit ROM and Svambo ROM. Any of the changes that appear in the first list but not in the second one mean that this content is identical.


Fan translation ROM


Beyond Compare difference report between the fan translation (Svambo) ROM and the Japanese ROM (Columbus Circle): Svambo-Columbus.html


Details of the changes


Address Type Purpose
FFC0 Data ROM Header
28A20-28D90 Text Item names
28E00 Graphics Result Screen tile map (removes kanji)
A1000-A33F0 Graphics Title Screen tileset
B0B10-B0BE0 Code Assembly routine
B39E0-B3EB0 Data Credits Pointers
B3F20-B40A0 Data Alternative First Cutscene Pointers
B4560-B48A0 Text Credits Final Line
B9960-BD750 Data Cutscenes Pointers
C2720 Graphics Title Screen tile map
C5150-C52C0 Graphics Intro ‘SHOCKMAN’ tile map
C5320-C5480 Graphics Intro ‘B.B. CORPS’ tile map
CAE00-CAEE0 Graphics Cutscene Textbox tile map
CAEF0-CB020 Data Latin Characters Encoding
CB230 Graphics Cutscene Font
100000 Text Cutscenes
104000 Text Alternative First Cutscene
104800 Text Credits Names

Retro-bit ROM


Beyond Compare difference report between the Retro-bit ROM and the fan translation ROM: Retrobit-Svambo.html


Details of the changes


Address Type Purpose
FFD0 Data ROM Header
10000 Data Unused byte (Why?)
28AA0-28D90 Text Item names
A0AE0 Graphics Masaya Logo tileset 1
A0C00 Graphics Masaya Logo tileset 2
A0D00 Graphics Masaya Logo tileset 3
A0EE0 Graphics Masaya Logo tileset 4
A1000-A34D0 Graphics Title Screen tileset
A3600-A39C0 Graphics Title Screen ‘RETRO-BIT’ tileset
B4890 Text Credits - Last Screen message
B7010 Text Credits - Last Screen licence
C2D30-C2D90 Graphics Title Screen ‘RETRO-BIT’ tilemap
100000-103BA0 Text Cutscenes
104D40 Text Credits Translator Name

Which means that the following changes are identical (100%, unless specified otherwise) to the fan translation:

  • Result Screen tile map
  • Title Screen tileset (partially, see below)
  • Assembly routine
  • Credits Pointers
  • Alternative First Cutscene Pointers
  • Title Screen tile map (partially, see below)
  • Intro ‘SHOCKMAN’ tile map
  • Intro ‘B.B. CORPS’ tile map
  • Cutscene Textbox tile map
  • Latin Characters Encoding
  • Cutscene Font
  • Cutscenes texts (partially, see below)
  • Alternative First Cutscene texts

Title Screen


Here are the tilemaps (left) and tileset (right) of the 3 ROMs for the title screen. I’ve highlighted the matching tiles between the tilemap and the tileset to show how much the tilemaps between the fan translation and retrobit ROMs are identical (save for the bottom text).



Because the tilemap wasn’t changed, it explains why they couldn’t fit 改造町人 and why the bottom of 零 (zero) is cut off despite the fact there is plenty of empty space in the tileset.

There’s another interesting thing on the title screen. As you can see on the 3rd image above, the tileset of the Japanese ROM doesn’t have a full alphabet, only the letters needed to spell PLAYERS, NCS CORP, EXTREME and COLUMBUS CIRCLE. So if you want to spell anything on the title screen (to replace the copyright/licence), you’d need to add a full alphabet.

Luckily, the tileset in game does have a full alphabet, albeit 2bpp not 4bpp. It’s used for the hud and the item names.

tilemap4.jpeg

If you’re thinking that the easiest thing to do, in order to have a full font on the title screen, is to copy this font, you’re right. That’s exactly what Ratalaika Games did for the digital release (here on Switch):

tilemap5.jpeg

For some reason, that’s not what Svambo did. He added the missing letters manually, either taken from some other font or redrawn. He also modified some existing letters. Namely the letters D, G, H, J, K, N, Q, T, V, W, X, and Z do not match the in-game font:

font2.gif

As you can see, the exact same modified letters appear in the tileset of the Retro-bit ROM. It’s hard to notice when playing the game but the N and D in LICENSED differ from the item name COIN and GOLD, for example.

Talking about fonts, I’d like to correct a thing I said in the first blog post. The cutscene font is not custom, it’s a bitmap font called unholy and the font is not compressed. When I speculated that Rod didn’t change the font because he couldn’t, I was wrong. He chose not to change it, which really doesn’t make it much better. Furthermore, my point was never that Retro-bit had stolen the font from Svambo but that the fonts are identical because the whole fan-translation patched ROM was used.


Assembly Routine


Here’s a side by side comparison of the code that Svambo injected into the ROM and the Retro-bit ROM.

All the modifications done by Svambo appear in Retro-bit’s ROM with the same change at the same addresses.


English Script (Cutscenes text)


Beyond Compare difference report between the Retro-bit script and the fan translation script: retrobit-svambo-comparison.html

For the sake of readability, I replaced the line break with §.

Because the pointers have not been modified, just like in the GleyLancer case, all the lines start and end at the same addresses. Which means that Rod had to add padding with spaces.

padding before the line break (top: Retro-bit) padding-01.jpg

padding at the end of the line (top: Retro-bit) padding-02.jpg

Overall, 208 out of 277 lines are identical. That’s about 75% of the script (not including the alternative intro).

Here’s what Rod wrote about that (source in Spanish):

Regarding the text of Shockman Zero, there are plenty of differences between my translation and the fan translation. Although some sentences coincide because I came to the conclusion that the best way to translate was that way and I didn’t care if it was similar or not to the fan translation because I wasn’t going to force myself to change it forcibly by muddying the translation so that no one would start playing spot the 7 differences. I am interested in the final translation product that I give to my company, for which I get paid, and the final finished product that the player (or collector) who pays for the game and the collector’s edition that comes with it will receive. If one way of translating a sentence is correct and the fan translator is unlucky enough to come to the same conclusion for a given sentence, then tough luck. I’m not going to force myself to say it differently lest the anti-transliteration police come to me and force me to make bureaucratic changes, lest there be words that are the same at some points. Screw them. That’s the way it is. I like to put it this way, and this is how it is put. As long as the text is not copied en masse and not all the sentences are the same, as long as it is a translation made from scratch, it doesn’t matter if some sentences coincide. That’s the way it is. Nobody has the copyright of the language. Nobody has the patent on the language. The ways of saying the same Japanese thing in a given language are not infinite, they are finite. And sometimes only one way is accurate. One way is the right way.

Sometimes there’s only one accurate way to translate, you say?

Just like GleyLancer, we have the chance to have another translation to look at: the digital release by Ratalaika Games and Shinyuden. So I extracted the script from the Switch game.

Here’s the Beyond Compare difference report between the Retro-bit script and the Switch script: retrobit-switch-comparison.html

Only 7 lines are identical (4 of which are a single word). That’s around 2.5%.

If he justifies the 75% similarities with the fan translation by saying that sometimes there’s only one accurate translation, how does he explain the 97.5% differences with the Switch translation?

I want to point that during one of Rod’s live stream (on March 1st), I said to him:

“You have a very restrictive definition of plagiarism” (original: “tienes una definición muy restrictiva del plagio”)

To which he replied:

“I believe that plagiarism is copying 50% or 70%” (original: “Yo creo que plagio es copiar 50% o un 70%”)

Make of that what you will.


Alternative Intro / Alternative First Cutscene / Karaoke


At the start of the first cutscene (before Galko shows up), hold A then press B to trigger an alternative cutscene. In that cutscene, Raita strikes a pose, the main theme music plays and some lyrics pop up.

The lyrics in the Retro-bit ROM are 100% identical to the fan translation and completely different from the Switch translation.

https://youtu.be/wFahyBB5izc

Lyrics Comparison.html

Note that the lyrics, like the credits, use the term “Resident Cyborg” where it should be “Cyborg Townsman” to match the dialogs.


Error in the script


In the Retro-bit script, line 11 is “AolAAitAAightAtAAAe!”.

When I extracted the script, that line came out as {CC81}ol{4090}{1F82}it{1F82}{B990}ight{1F82}t{7D82}{FC83}{B989}e! where all the values in curly braces do not match any character in the encoding.

The game prints these unknown character as the first one, ‘A’.

azuki.png

I think the line is meant to be:

AolAAitAAightAtAAAe!
Hold it right there!

How did this happen? I don’t know. Maybe a copy/paste accident when switching lines 4 and 11.

How did nobody saw that before release? It’s a line that you don’t see on a regular playthrough. This is the first line Azuki says when you play as her in a single player game. You can do that by plugging your controller in port 2 instead of 1.



In the changes made for the Retro-bit ROM, I listed changes for the Masaya logo.

The tileset was modified to remove the Columbus Circle logo:


Japanese Retro-bit
masaya1.png masaya2.png

It seems to look fine. But I was confused because, as listed, there are 4 changes to the tileset (the Columbus Circle is 5x5 tiles) and the change “Masaya Logo tileset 2” is only one tile.

It turns out that one tile in the corner of the Y is messed up:

masaya.png

It’s been that way for a long time, as you can see it in their preview stream, last year and it has never been fixed. It’s the first thing you see when you boot the game…

Retro-bit claimed in their FAQ that the translation had been reviewed by Masaya Games. It makes me wonder what exactly was sent to Masaya Games to be reviewed. The English script? The whole ROM?


Credits


As I mentioned in the other blog post, the credits have been altered in the Retro-bit ROM. The names of two Japanese people credited under Special Thanks have been replaced by Rod’s name.

Fan translation credits-svambo.png

Retrobit credits-retrobit.png

About that, Rod wrote this:

If you think I’m going to make the first official English translation of a game that only existed until now for the Satellaview and never left Japan, and not mention who translated it in the credits…

(source in Spanish)

The gap you see there on the screen does not translate into empty space in the ROM. Where the credits end, there are no more space in the ROM to continue writing, there is data of other stuff. If I write on that, it crashes.

(source in Spanish)

That is not quite true.

The text for the credits are in two places in the ROM.

The names of the people start at address 0x104000 (thanks to Svambo modifications) and it is the very last thing in the ROM. All the 0xFF are empty space and since the ROM has been expanded from 1MB to 2MB there’s exactly 1,028,608 bytes of them.

104000.png

The roles of staff, in the ROM, start around address 0xB3A00.

B3DC0.png

It may seem that there’s no available space but the last block I highlighted is unused. This was the last screen in the Satellaview version. The people at Columbus Circle made a change that moved that screen at address 0xB7000. Something that Rod couldn’t ignore because he had to edit it:

B7000.png

Because that block of data is effectively unused, we can shift the “PRODUCER” and “EXECUTIVE PRODUCER” data a few bytes and insert a new screen (see) and add the new name anywhere at the end of the ROM.

Here’s the result:

Open Video Player

And this did not require any coding at all.


Conclusion


I think I left no stone unturned on this game. Now everyone has the data to have an informed opinion about whether this is a case of plagiarism/theft or not.

There is no doubt in my mind that a ROM patched with the fan translation was used to make Retro-bit’s ROM. It was blatant for GleyLancer, it is also true for Shockman Zero.

In a live stream on March 1st, Rod showcased his methods of romhacking, by modifying a splash screen (developed by someone else). He ended up having to look up how to do it in a forum where someone else was able to do so because Rod hadn’t changed the original code.

While he did answer questions from his chat (where I was active), the whole stream was painful to watch. His way of working is incredibly inefficient and the tools he’s using incredibly archaic (Running DOSBox for a hex editor). Honestly, I don’t think anyone could translate any game with his methods and his tools. That’s why he has to rely on pre-existing works.

At some point during the stream, someone questioned his programming skills, and he replied something along the lines of “you don’t need to be a programmer to be a romhacker”. I fully agree. Many romhacks done with editing tools, not by programmers, are fine and nothing to sneeze at. Plenty of Mario or Zelda hacks are just sprite change and they can fun in their own right.

That being said, that is not the case here. GleyLancer and Shockman Zero (to a lesser extent) required programming that Rod didn’t do (Svambo has shared his custom tool suit for Shockman Zero, it’s a mix of ASM and python). On top of that, Retro-bit promoted him as a “talented programmer”…


One last thing


Before starting this research, I ran a small program to help me decide if there was anything worth looking for. Beyond Compare is fine but I needed a comparator for three files: two roms A and B (translations) and a reference rom (Japanese). For every byte that differs between either rom A or B and the reference rom, it counts how many are the same value in A and B (what I call identical changes).


private static void compareRoms() {
    float changedBytes = 0;
    float changedBytesA = 0;
    float changedBytesB = 0;
    float identicalChangedBytes = 0;
    for (int i = 0; i < dataRef.length; i++) {
        if (dataRef[i]!=dataA[i] || dataRef[i]!=dataB[i]) {
            if (dataRef[i]!=dataA[i]) changedBytesA++;
            if (dataRef[i]!=dataB[i]) changedBytesB++;
            changedBytes++;
            if (dataA[i]==dataB[i]) identicalChangedBytes++;
        }
    }
    System.out.printf("Changed bytes: %s (A:%s\tB:%s)\n", (int)(changedBytes), (int)changedBytesA, (int)changedBytesB);
    System.out.printf(java.util.Locale.US, "Identical changes: %s (%.2f%%)\n", (int)identicalChangedBytes, identicalChangedBytes*100/(changedBytes));
}

Here’s what I get with the different Retro-bit ROMs:


Reference A B Changed Bytes Identical changes
Shockman Zero Svambo Retro-bit 29818 21940 (73.58%)
Shockman Zero Svambo Switch 67834 94 (0.14%)
Shockman Zero Retro-bit Switch 67858 238 (0.35%)
Assault Suits Valken Aeon Genesis Retro-bit 17501 10018 (57.24%)
GleyLancer Mijet Retro-bit 18257 15154 (83.00%)
King Of Demons Aeon Genesis Retro-bit 84751 74757 (88.21%)

Note: I added 0xFF or 0x00 when the ROMs were not the same size, in the most favorable way towards Retro-bit.

I also ran the same code with a few fan translations that are known to be independent.


Reference A B Changed Bytes Identical changes
Bahamut Lagoon Near DeJap 337810 173 (0.05%)
Dragon Ball Z: Hyper Dimension SS4Squall Twilight Translations 52389 243 (0.46%)
Dragon Ball Z: Super Butouden 3 Aeon Genesis DragonBallZ Translations 136339 2583 (1.89%)
Wedding Peach Chaotic Me 91032 763 (0.84%)

It’s a rough metric that doesn’t discriminate code and data (graphics and texts). Code and data is not random, it follows some patterns that’s why there’s bound to be accidental overlaps (which explains there being no 0%).

But the fact that the percentage of identical changes in the Retro-bit ROMs and their respective fan translations is two orders of magnitudes above a “normal” value is pretty telling.

What surprises me is that the “most original” ROM is Assault Suits Valken at 57% and the “least original” is King of Demons at 88%.

Figuring out why we get these values will require a full analysis of these two games.

Stay tuned.


Written By

Krokodyl

Comments