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
Pause the game, hold B and X, then press R to open the stage select menu.
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.
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):
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:
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 at the end of the line (top: Retro-bit)
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.
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’.
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.
Error in the logo
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 |
---|---|
![]() |
![]() |
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:
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
Retrobit
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.
The roles of staff, in the ROM, start around address 0xB3A00.
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:
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.
Share this post: