Home | Forums | What's new | Resources | |
Translating/hacking 3x3 Eyes Seima Densetsu for Mega CD |
Ginza - Aug 19, 2025 |
Ginza | Aug 19, 2025 | |||
Hi all! Long time lurker. I've been doing small time rom-hacking for a while, and for some reason I just love the Mega CD. It just seems to have had a lot of potential which was unused, and/or not available to non-japanese audiences. Lately I've been researching Illusion City a bit - though I don't want to spend too much time on that, as the MSX version is just about completed by a MSX group. So, I changed over to 3x3 Eyes Seima Densetsu. It's an interesting RPG made by Sega themselves, with lots of Sega references (I even noticed the Sonic "ring" sound at one point). You can also find a Game Gear White in-game and sell it, and there are many references to contemporary games (Streets of Rage 2, Puyo Puyo etc.) and much more... It is also one of the better (the best?) 3x3 Eyes games for any console, according to some Japanese sources. So - worth investigating for any Sega fan! My main problem is that I have a busy personal life, and progress will be very slow. It seems to be a huge game (it has 231 unique files (!) with scenario/event text, but also lots of text describing items, side quests, in-game hint system etc.). On the plus side, the scenario files seem to have lots of unused space between separate blocks of data, and should easily fit an English translation. Also they used the standard Sega LZ (Kosinski) compression for graphics and tilemaps, which is very well researched already. Status for now is * Completed table file * 8x16 font function assembly hacked/expanded from only numbers to complete ASCII alphabet. * Static menu text tilemap translation underway * Documentation of control codes underway * Lots of research of files, functions and compressed data done Major hurdle is that to display text the game uses a pointer table which points to one of many control codes. These control codes can do many things, including display text (not always) according to another pointer (embedded pointer I guess you could call it, though it is not neccessarily within the text data). This means you need to track pointers when you dump the script, and recalculated them when you insert (recompile?) it. I don't know any programming, but have gotten by ChatGPT programmed tools. Inserted text pointers have been hand calculated so far, but I won't finish in 100 years doing this for the whole game Also all translation is AI based for now - this is not the goal, but just to have some temp text to test with... I try to keep things as open as possible, as there is a large chance I cannot continue researching at some point, or it will go way too slow - so I hope someone else will pick up the work and contribute. I am a huge believer in open sourcing translations. Long term goal would be to have more Mega CD games translated. Here you can find my published notes so far on Github: https://github.com/Ginza25/3x3eyesMCD/... My hope is mostly to get others interested in contributing, so that it can become more of a collective effort - this is definitely not a project with a any deadline in mind. |
Toppis | Aug 21, 2025 | |||
Oh, this looks so good! I will definitely try it when it’s released |
Ginza | Sep 22, 2025 | |||
Progressing slowly. Started to understand the "event opcodes" the game uses to move around sprites/NPCs and sprites during events/cutscenes, which are separate from the "text opcodes" which relate to which text is displayed etc (conditions) and text control codes which deal with presentation/formatting of text. There are about 80 event opcodes, which would be very tedious to try to understand, however with the wonders of ChatGPT, I just fed it all 80 opcode functions in 68000 assembly, and it analyzed and provided name suggestions for all of them. Checking a few of the manually it seems the AI hit rate was pretty OK. Hard to overestimate how useful AI can be when looking at these old games... |
Ginza | Sep 23, 2025 | |||
Now thanks to ChatGPT, Ghidra and BlastEm, I have a small program which "decompiles" the text opcodes in Event files. Currently successfully decompiles the whole Hong Kong start scenario (EV00006.DAT). Opcodes are specified in a YAML file, e.g. like this: 0x56: name: SubtractImmediateFromLastResult arg_count: 1 arg_widths: [1] arg_is_offset: [false] continues: true I know its not obvious, but this seems amazing to me, with no actual programming skills, just "Vibe coding" - first steps towards a dumper, including embedded offsets! You can find the code on the Github repository: https://github.com/Ginza25/3x3eyesMCD... |
derek (ateam) | Sep 23, 2025 | |||
Whether you can write this code yourself or not, to have the resolve to try and use all the tools at your disposal and actually make progress deserves commending. Best of luck in your project! |
Ginza | Sep 24, 2025 | |||||
Thanks for the encouragement! Still hoping someone interested in Sega Mega CD will want to investigate/help out. Would be fun to have the first Mega CD exclusive (not counting the Phantasy Star compilation) games being translated! Though for now I'll try to post everything on github and update along the way. Without going into politics, I was actually encouraged by the Princess Crown translation, where someone else was able to pick up the work after it became dormant... I thought that was a great result, as long as everyone is credited, of course. I will be unhappy if all my work goes to waste, because I couldn't finish, but we'll see how far I get. I think making a dumper is realistic with what I know now, and then a translator could go through the script. The main challenge to my abilities (remember - vibe coding) is to make a re-insertion utility, as there is a lot of offsets which needs re-calculating, but I'm kind of optimistic. |
derek (ateam) | Sep 24, 2025 | |||||
I have written dozens of such tools for games at this point, and I honestly can't envision using an LLM to write a text injector for complicated text-heavy games with scripting engines full of control codes and pointer tables. For the sake of your project, I'd be happy to be proven wrong though! That said, if you make really good progress, you may be able to attract the attention of some programmers/romhackers who'd be happy to step in and assist. |
Ginza | Sep 24, 2025 | |||||
I will use the opportunity to pitch the project a bit for anyone reading with experience and/or motivation to join forces!
As a progresss update: I've asked ChatGPT to update the dumper to follow opcode jumps, and it seems to work. It still stops on unrecognized opcodes, but it's not that hard to find the arguments and add it to the YAML opcode file which the dumper reads, and then progress further. The game has 121 text opcodes and 80 event opcodes, but many overlap and most are not used often it seems. I have managed clean opcode "dumps" of some of the scenario files already. I just feel the difficult part is to re-insert and update all these layers upon layers of offsets... Though I also was skeptical I could get this far... UPDATE: In 15 minutes I got ChatGPT to add an "text offset" argument to the opcodes in the YAML file, and print if encountered according to the table file... It works... very nice! Basically this is a working dumper - I think. It's not designed for re-insertion, but curious if I'm missing something in the dump which is included/needed for translating. For context I guess it would be nice to have a description of each flag - not only hex values - and possibly actual graphics portraits of the relevant characters, but I think that might not be worth the effort, more quality of life than anything else... |