~~ Introduction: ~~
Hello! I've translated Kyuutenkai or "Fantastic Pinball" for the Sega Saturn. This is my first game translation. I'm a game programmer by day. I read and speak a little bit of Japanese with some formal education, but most of my recent progress in understanding the language has come from playing untranslated Sega Saturn games and reading Japanese gaming magazines from the 90's with a translator app for help.
I love Kyuutenkai and have played it many hours. It is one of my favorite Saturn games. Because of its simple design and low text content I chose it as my first translation project. However, it turned out to be quite challenging as there are no text strings in game data at all. All of the game text is sprite art in one form or another, and in addition to this the sprite art is compressed by an algorithm Technosoft used 30 years ago.
~~ Translation Details: ~~
All known Japanese text is converted to English 100%.
Only voice lines are remaining to be translated.
~~ Disclaimer: ~~
I used Claude code to make my game patch. I sympathize with the negative sentiment around LLM development and its real world effects. Recently, however, I realized I had no choice but to learn the Claude tools to protect my own livelihood and I thought that hacking Saturn games and hardware would be a fun place to test Claude's capabilities. I tried to produce a high quality faithful translation and didn't rely solely on machine translated text.
I've set up a project to translate Saturn games generally and one of the things I asked Claude to do was to keep a document up to date for the Saturn community that would contain any fun or interesting things that we stumbled across while developing patches for these games. I'm sharing this document, along with scripts, tools, and reference that were generated along the way and I hope that the community will find them valuable.
Please keep in mind that Claude makes mistakes. I did my best to proofread the community doc before release but some things may have slipped past me. Particularly no matter how many times I remind Claude to use python to check its math it still sometimes forgets so be particularly wary of any hex addresses.
~~ What We Did: ~~
First I asked Claude to start taking apart Hyper Duel before pivoting to Kyuutenkai. This turned out to be a good thing for us as we partially cracked Technosoft's PAC data compression format for Hyper Duel and Technosoft used the same or a similar toolset to build Kyuutenkai so this got our foot in the door.
After cracking the PAC compression we started looking for strings in the game data, but found none, and started the process of going screen by screen to hunt for untranslated text and locate the sprites for the text in game data. We built a bridge so that Claude could launch the game in Bizhawk and use scripts to dump VDP memory, RAM, send commands, ect. We used Ghidra as well to dump information about specific parts of code we needed to look at.
We built a disassembler, disassembled the game code, and then I had Claude exhaustively reverse engineer the game code so that we could have something to reference when hunting down translation sources, bugs, or adding new features. My hope was that eventually Claude could write new code for the project like any other programming solution, but things didn't exactly turn out this way.
We found a way to hack the game to jump directly to the end game sequence so we could translate and iterate on it quickly, however, we tried for a long time to figure out how to jump directly to the 5 boss stages and failed except by loading a save state captured just as a boss stage was loading and inject RAM values to choose the boss we wanted. At the end of the project we accidentally stumbled onto how to trigger boss stages when I was trying to build a continue feature to add to the game but haven't fully worked out all the bugs with continue or the boss stage jump.
~~ Fun Stuff We Found And Did ~~
# Project Timeline And Ghost Files
Claude guessed at the project development timeline based on timestamps it found on the development files. It found some original names for the files, as well as some unused files for what looks to be a new game mode that was cut.
Excerpt:
More info is in the community doc.
# Easter Eggs
Technosoft put in some easter eggs and other things hinting at their other projects in the game data.
Excerpt:
Details in the document.
# Password System
The game gives the player a password at game over they can use to resume the game with and also submit to Technosoft's high score contest at the time. I had Claude tear this system apart and write a python script to make passwords. We found the secret phrases Technosoft used to salt the passwords. I'll provide the python script to generate passwords as well as some example passwords.
Excerpt:
The details on this system are in the doc.
# Insight into Technosoft Tools
Technosoft's tools used a nibble swapping technique that caused us a lot of trouble. They also used a proprietary PAC data format to compress their sprite data. Claude was able to make some guesses at what Technosoft's tool pipeline was like. Info is in the docs.
# Code Injection
The most interesting technical thing we did that I'm proud of was that in order to deliver some of our patches we had to add extra assembly instructions to the game code, but we were shoving them into occupied game data in RAM. This led to corruption and we were constantly needing more instructions, but that meant finding more room. Finally I thought we should try building a piece of code that just loads and interprets commands from disk, that way we could fit the interpreter in as few lines of code as possible injected in RAM and load as many new instructions as we wanted from anywhere on disc.
We got this working, but still encountered corruption from where our interpreter code was sitting in the high score screen's data. First we tried to have the interpreter run, patch everything, then re-write the original game data over on top of itself. This worked, but was a little touchy, so we finally moved it to a place in RAM we felt was actually free and not stomping any real game data.
There's more information in the docs on the final interpreter's operation but the basic idea is that the game loads, jumps to our interpreter code, the interpreter patches data by reading commands from our command list, changes pointers, ect. and then jumps back to the main game code.
# Custom Shine Effect on Main Menu
I thought the main menu with english text needed a little something and I decided to push Claude to see what it could do so I challenged it to add a classic 90's "shine wipe" effect to the custom english text we built. We ended up pulling it off by using our interpreter to load a bunch of new instructions, modify the main menu loop, and inject our shine effect logic.
Technosoft put an english translation of the game title on the original game manual and disc. I tried really hard to mimic the color scheme and font that the english translation on the original game content uses in the translated game title. Details are in translation notes.
# Direct RAM Writes for Sprite Iteration
Claude wrote a script to identify where sprites were in VDP and then as we were iterating on translation text, colors, or other visuals, Claude would just write the updated sprite back to the game via Bizhawk and a python script. This way we could iterate fast without constantly rebuilding a patched disc and reloading Bizhawk.
~~ Files Provided in this Release ~~
- Kyuutenkai v1.0 English SSP Patch.
- PAC tools python scripts to decompress/compress Technosoft PAC files.
- Kyuutenkai password cracker/creator python script.
- iso9660 python script to dump game files from Sega Saturn discs.
- Kyuutenkai technical anaylsis and community doc.
- Translation notes doc.
!!!! IMPORTANT !!!!
The SSP patcher has a known bug with games that have 10+ audio tracks like Kyuutenkai. Just applying the SSP patch will result with the game audio being incorrect. In order to work around this issue you can use version V1.95 of the SSP patcher or later. I tested with V1.95 but the audio tracks are all a little bit late, which is apparently a known issue. Newer versions may solve this. Alternatively you can apply the SSP patch and just grab the first track which is the data track, combine it with the original audio tracks, and make your own .CUE file.
If you want to get really wild I've included a apply_ssp_kyuutenkai.py script you can run to patch your original game files with my SSP patch and avoid the audio bug. I tested this, but use at your own risk.
Hello! I've translated Kyuutenkai or "Fantastic Pinball" for the Sega Saturn. This is my first game translation. I'm a game programmer by day. I read and speak a little bit of Japanese with some formal education, but most of my recent progress in understanding the language has come from playing untranslated Sega Saturn games and reading Japanese gaming magazines from the 90's with a translator app for help.
I love Kyuutenkai and have played it many hours. It is one of my favorite Saturn games. Because of its simple design and low text content I chose it as my first translation project. However, it turned out to be quite challenging as there are no text strings in game data at all. All of the game text is sprite art in one form or another, and in addition to this the sprite art is compressed by an algorithm Technosoft used 30 years ago.
~~ Translation Details: ~~
All known Japanese text is converted to English 100%.
Only voice lines are remaining to be translated.
~~ Disclaimer: ~~
I used Claude code to make my game patch. I sympathize with the negative sentiment around LLM development and its real world effects. Recently, however, I realized I had no choice but to learn the Claude tools to protect my own livelihood and I thought that hacking Saturn games and hardware would be a fun place to test Claude's capabilities. I tried to produce a high quality faithful translation and didn't rely solely on machine translated text.
I've set up a project to translate Saturn games generally and one of the things I asked Claude to do was to keep a document up to date for the Saturn community that would contain any fun or interesting things that we stumbled across while developing patches for these games. I'm sharing this document, along with scripts, tools, and reference that were generated along the way and I hope that the community will find them valuable.
Please keep in mind that Claude makes mistakes. I did my best to proofread the community doc before release but some things may have slipped past me. Particularly no matter how many times I remind Claude to use python to check its math it still sometimes forgets so be particularly wary of any hex addresses.
~~ What We Did: ~~
First I asked Claude to start taking apart Hyper Duel before pivoting to Kyuutenkai. This turned out to be a good thing for us as we partially cracked Technosoft's PAC data compression format for Hyper Duel and Technosoft used the same or a similar toolset to build Kyuutenkai so this got our foot in the door.
After cracking the PAC compression we started looking for strings in the game data, but found none, and started the process of going screen by screen to hunt for untranslated text and locate the sprites for the text in game data. We built a bridge so that Claude could launch the game in Bizhawk and use scripts to dump VDP memory, RAM, send commands, ect. We used Ghidra as well to dump information about specific parts of code we needed to look at.
We built a disassembler, disassembled the game code, and then I had Claude exhaustively reverse engineer the game code so that we could have something to reference when hunting down translation sources, bugs, or adding new features. My hope was that eventually Claude could write new code for the project like any other programming solution, but things didn't exactly turn out this way.
We found a way to hack the game to jump directly to the end game sequence so we could translate and iterate on it quickly, however, we tried for a long time to figure out how to jump directly to the 5 boss stages and failed except by loading a save state captured just as a boss stage was loading and inject RAM values to choose the boss we wanted. At the end of the project we accidentally stumbled onto how to trigger boss stages when I was trying to build a continue feature to add to the game but haven't fully worked out all the bugs with continue or the boss stage jump.
~~ Fun Stuff We Found And Did ~~
# Project Timeline And Ghost Files
Claude guessed at the project development timeline based on timestamps it found on the development files. It found some original names for the files, as well as some unused files for what looks to be a new game mode that was cut.
Excerpt:
Code:
| File | Status | Purpose (confirmed via dispatch table) |
| ---------- | ---------------------------- | --------------------------------------------------------- |
| NOPEN.BIN | Ghost (no file data on disc) | N-mode opening sequence |
| NOEND.BIN | Ghost (no file data on disc) | N-mode ending sequence |
| NS.BIN | Ghost (no file data on disc) | N-mode gameplay stage |
| PLSEL.BIN | Ghost (no file data on disc) | N-mode player select (separate from QT.BIN's char select) |
| NO.SYS | Ghost (no file data on disc) | N-mode system configuration (counterpart to QT.SYS) |
| DB.BIN | Ghost (no file data on disc) | Debug/development boot tool |
| NO_EFC.MAP | Ghost (no file data on disc) | N-mode effect parameter map (counterpart to QT_EFC.MAP) |
- **February 1995:** Earliest assets — `SYMBALL.PAC` (character pinball sprites) and `TS_LOGO.PAC` (Technosoft logo)
- **June 1995:** Main production burst — opening, ending, and menu graphics all built June 18-27
- **July 7, 1995:** Retail release date
More info is in the community doc.
# Easter Eggs
Technosoft put in some easter eggs and other things hinting at their other projects in the game data.
Excerpt:
Code:
**Technosoft Game References:**
- `THUNDER FORCE V!` — Announcing their next game a year before release
- `HERZOG ZWEI & ..` — Referencing their classic Genesis strategy game
- `HYPER DUEL IIda!` — Teasing Hyper Duel (released the following year)
Details in the document.
# Password System
The game gives the player a password at game over they can use to resume the game with and also submit to Technosoft's high score contest at the time. I had Claude tear this system apart and write a python script to make passwords. We found the secret phrases Technosoft used to salt the passwords. I'll provide the python script to generate passwords as well as some example passwords.
Excerpt:
Code:
| Password | Score | Credits | Bosses | Meaning |
| ------------ | ----------- | ------- | --------- | ----------------------------- |
| `C66H1QEM14` | 0 | 2 | 0 (0000) | Fresh start (default credits) |
| `C6XPAQGM1A` | 500,000 | 0 | 0 (0000) | No credits or bosses |
| `C6XPAQEHCA` | 500,000 | 2 | 5 (0101) | 2 credits, bosses 1+3 |
| `C6J1Y7GR2F` | 999,999 | 0 | 15 (1111) | All 4 bosses defeated |
| `C6XPAQ7MAA` | 500,000 | 9 | 0 (0000) | Max credits |
| `C6XPAQ7R99` | 500,000 | 9 | 15 (1111) | Max credits + all bosses |
| `H393G7G6DA` | 999,999,999 | 0 | 0 (0000) | Max score |
The details on this system are in the doc.
# Insight into Technosoft Tools
Technosoft's tools used a nibble swapping technique that caused us a lot of trouble. They also used a proprietary PAC data format to compress their sprite data. Claude was able to make some guesses at what Technosoft's tool pipeline was like. Info is in the docs.
# Code Injection
The most interesting technical thing we did that I'm proud of was that in order to deliver some of our patches we had to add extra assembly instructions to the game code, but we were shoving them into occupied game data in RAM. This led to corruption and we were constantly needing more instructions, but that meant finding more room. Finally I thought we should try building a piece of code that just loads and interprets commands from disk, that way we could fit the interpreter in as few lines of code as possible injected in RAM and load as many new instructions as we wanted from anywhere on disc.
We got this working, but still encountered corruption from where our interpreter code was sitting in the high score screen's data. First we tried to have the interpreter run, patch everything, then re-write the original game data over on top of itself. This worked, but was a little touchy, so we finally moved it to a place in RAM we felt was actually free and not stomping any real game data.
There's more information in the docs on the final interpreter's operation but the basic idea is that the game loads, jumps to our interpreter code, the interpreter patches data by reading commands from our command list, changes pointers, ect. and then jumps back to the main game code.
# Custom Shine Effect on Main Menu
I thought the main menu with english text needed a little something and I decided to push Claude to see what it could do so I challenged it to add a classic 90's "shine wipe" effect to the custom english text we built. We ended up pulling it off by using our interpreter to load a bunch of new instructions, modify the main menu loop, and inject our shine effect logic.
Technosoft put an english translation of the game title on the original game manual and disc. I tried really hard to mimic the color scheme and font that the english translation on the original game content uses in the translated game title. Details are in translation notes.
# Direct RAM Writes for Sprite Iteration
Claude wrote a script to identify where sprites were in VDP and then as we were iterating on translation text, colors, or other visuals, Claude would just write the updated sprite back to the game via Bizhawk and a python script. This way we could iterate fast without constantly rebuilding a patched disc and reloading Bizhawk.
~~ Files Provided in this Release ~~
- Kyuutenkai v1.0 English SSP Patch.
- PAC tools python scripts to decompress/compress Technosoft PAC files.
- Kyuutenkai password cracker/creator python script.
- iso9660 python script to dump game files from Sega Saturn discs.
- Kyuutenkai technical anaylsis and community doc.
- Translation notes doc.
!!!! IMPORTANT !!!!
The SSP patcher has a known bug with games that have 10+ audio tracks like Kyuutenkai. Just applying the SSP patch will result with the game audio being incorrect. In order to work around this issue you can use version V1.95 of the SSP patcher or later. I tested with V1.95 but the audio tracks are all a little bit late, which is apparently a known issue. Newer versions may solve this. Alternatively you can apply the SSP patch and just grab the first track which is the data track, combine it with the original audio tracks, and make your own .CUE file.
If you want to get really wild I've included a apply_ssp_kyuutenkai.py script you can run to patch your original game files with my SSP patch and avoid the audio bug. I tested this, but use at your own risk.