Localizing Daisenryaku Sakusen File (Iron Storm Expansion)
Hello, This thread will document my first ROM-hacking/localization project, which I started in December 2024.
I’m localizing Daisenryaku Sakusen File into English. This title is a sequel/expansion to Iron Storm (localized by Working Designs for Sega Saturn), which is often regarded as one of the best turn-based WWII strategy games on the system. Personally, I’d argue it also borders on a tactical RPG because of its strong RPG mechanics in the unit upgrade system.
What the sequel (Daisenryaku: Sakusen File) is
Learning process
The first two to four months were mostly spent grasping technical basics, guided by Malenko’s documentation (which really opened the door to this project). Starting with changing all the VPD1 graphics.
Reverse-Engineering Goals
“Need-to-Haves”
Rule out compression/encryption of text assets early on
Discover font encodings (16×16 and 8×8)
Manipulate background graphics
Pointer tables
Expand the textures width for in game action menu items (such as "attack", "convert", "upgrade")
Find extra space in binaries for english text for the game engine translation
Scripting tools, learn to script in python to write coder/encoder programs for handling text.
“Nice-to-Haves”
- Not stored alongside the text data in the binaries
- Not in the calls that places text strings on screen for example fx 25E1E084. Identical calls are found coding both 16x16 and 8x8 font strings, even on the same game page.
- Not stored along the low ram pointer
- Not determined by the location where the string is placed on the screen. Moving a 16x16 string to the location of one that is 8x8 achieves nothing.
i have enough space for text to produce a worthwhile result for the campaigns already, however if anyone has suggestions for where to look, im all ears
Current Progress
Translating some parts of the game engine was more complex than others. For text, it was rarely just a matter of pasting an asset from Iron Storm into the correct location in the corresponding binary of the sequel (this only happened once, with the list of weapon names that was just a long string with identical length).
For example, translating the names of units was far more complicated because the game allows for creating multiple scenarios on the same map asset by separating the map data (map files) from the unit data (tanks, planes, and their properties), which are stored in “unitpack” files. Unique scenarios are generated by matching the two.
To change the name of a unit—say, a tank—from Japanese to English, the name had to be edited separately in every “unitpack” file where that unit appeared. This meant that some units, like the supply truck, needed to be renamed in several hundred different files. Since the game also contains hundreds of unique units, I initially calculated that up to 17,000 individual entries would need to be systematically rewritten with the English names.
In practice, the number was somewhat lower, since many maps use smaller unit libraries than the game engine supports. Even so, this task was dominated by Python scripts, which I used to extract the strings from the English release and insert them into the correct locations in the sequel’s binaries. Also the batch processing tools in wxMedit came much in handy.
Remaining Work
Alterations to Source Material, i try to stay true to the original, however sometimes that would create an inferior result.
the missing screw and stalins face hiding behind the russian campaign text, cluttering the text.
Hello, This thread will document my first ROM-hacking/localization project, which I started in December 2024.
I’m localizing Daisenryaku Sakusen File into English. This title is a sequel/expansion to Iron Storm (localized by Working Designs for Sega Saturn), which is often regarded as one of the best turn-based WWII strategy games on the system. Personally, I’d argue it also borders on a tactical RPG because of its strong RPG mechanics in the unit upgrade system.
What the sequel (Daisenryaku: Sakusen File) is
- Runs on the same engine as the original japanese release (Daisenryaku: Koutetsu no Senpuu), that was translated into the english release Iron storm.
- Adds two new campaigns, new playable armies (USSR and UK), a 1–5 player multiplayer mode (multitap), in total about 30 additional custom maps.
- Feels more like an expanded re-release than a true sequel.
- Production seems rushed in places — I’ve had to rework more than just text in some menus.
- My working title is "Iron Storm: Operation Files", don´t love it but thats what the direct translation is. Perhaps i could go for Iron Storm 2, but thats a stretch.
- And I have plenty of game time on Iron storm.
- Not chosen for popularity, but because it seemed like perfect beginner’s project.
- I assumed I could migrate much of the Working Designs translation over since the expansion features the same game engine.
- The existing translation eased the reverse-engineering side of things, especially in the early stages.
Learning process
The first two to four months were mostly spent grasping technical basics, guided by Malenko’s documentation (which really opened the door to this project). Starting with changing all the VPD1 graphics.
Reverse-Engineering Goals
“Need-to-Haves”
Rule out compression/encryption of text assets early on
- None encountered.
- Found ~10 variants, for 16x16 font many variants are based on one main custom format that exist in one and two byte versions. For 8×8 font there is one custom encoding as well as Shift-JIS, rarely used).
- Initially discovered by isolating the ram read screen and sequentially overwriting data. Also cross patching files from the base Japanese and English releases helped narrowing down where in the binaries I could find encoded text.
- Handled as 8×8 tiles. Discovered in the ram read screen while looking for text.
- Found trying to apply malenkos Ghidra guide. Was never successful with this, but I found all pointers directly reference low RAM locations, bypassing the need for ghidra entirely.
- Needed for fitting English strings. Bytes for doing this were found right next to the low ram pointers for the corresponding text.
- Working Designs’ English text uses about two to three times more space than the Japanese. By mining redundant/unused assets in binaries and redirecting pointers i have freed up just enough space to get by.
- Complete fail in learning to script since python is by now a trivial task for everyones favourite chatbot.
- Repositioning text on screen –
- achieved by manipulating calls that set X/Y coordinates for text strings. The calls were found as they often reside right next to the pointers to low ram. (25E1E084002D80BA) The screen placement values (E0(vertical)84(horizontal)) can be systematically manipulated. However manipulating the rest of the call does not seem to achieve anything meaningful (hoped for 25E7 flipping the font or color which it does not).
- Palette manipulation-
- Going from CRAM to pallet using CRAM2PAL. After researching the crystal tile 2 and Saturn CRAM pallet encoding format, I also managed to write custom pallets to CRAM using python scripts.
- (dream state goal) Font/encoding switching (16×16 vs 8×8). – not achieved
- Attractive, since Iron storm uses 8x8 font (1byte) for the longer mission descriptions, which the japanese does not, making me stuck on the larger 16x16 (2 byte) font. Probably requires deeper Ghidra work I cannot do, and doubt I will as I don’t have programming skills. Though I have excluded several possibilities.
- Not stored alongside the text data in the binaries
- Not in the calls that places text strings on screen for example fx 25E1E084. Identical calls are found coding both 16x16 and 8x8 font strings, even on the same game page.
- Not stored along the low ram pointer
- Not determined by the location where the string is placed on the screen. Moving a 16x16 string to the location of one that is 8x8 achieves nothing.
i have enough space for text to produce a worthwhile result for the campaigns already, however if anyone has suggestions for where to look, im all ears
Current Progress
- “Need to have” and “nice to have goals” except for font switching are achieved, which let me translate the full game engine and menus.
- Result on the engine is essentially 1:1 with Iron Storm, though with some compromises (e.g., error messages shortened due to a 20-character limit in the Japanese engine).
Translating some parts of the game engine was more complex than others. For text, it was rarely just a matter of pasting an asset from Iron Storm into the correct location in the corresponding binary of the sequel (this only happened once, with the list of weapon names that was just a long string with identical length).
For example, translating the names of units was far more complicated because the game allows for creating multiple scenarios on the same map asset by separating the map data (map files) from the unit data (tanks, planes, and their properties), which are stored in “unitpack” files. Unique scenarios are generated by matching the two.
To change the name of a unit—say, a tank—from Japanese to English, the name had to be edited separately in every “unitpack” file where that unit appeared. This meant that some units, like the supply truck, needed to be renamed in several hundred different files. Since the game also contains hundreds of unique units, I initially calculated that up to 17,000 individual entries would need to be systematically rewritten with the English names.
In practice, the number was somewhat lower, since many maps use smaller unit libraries than the game engine supports. Even so, this task was dominated by Python scripts, which I used to extract the strings from the English release and insert them into the correct locations in the sequel’s binaries. Also the batch processing tools in wxMedit came much in handy.
Remaining Work
- Campaign mission descriptions – still in progress. One campaign is multipath with 8 maps and five playable armies, branching into countless combinations of maps and scenario files.
- Long-form text – English is often 3× longer than Japanese, requiring rewrites or trimming. Luckily, redundant Japanese text freed up some space. I have a total space of about 16000 letters to work with, which after rewiewing the remaingin text assets, is enough to get by, but is far from enough to fit the entirety of the original script in.
- Quite a bit of 8x8 text coding auxiliary info such as names of armies and that sort of thing
- I have still spent no time working on the gameplay wise less important aspects such as win screens, end titles and the like.
Alterations to Source Material, i try to stay true to the original, however sometimes that would create an inferior result.
- Menu graphics: A few assets seemingly were rushed to get the release out the door. There is litterally a screw missing in one graphic. Several have stretched text, questionable english word choises, cluttered images, and even misspellings. There is a need to fix the worst offenders, however its almost easier to do a bigger overhaul for an even better result. Not yet done with this.
- The “Cenozoic Campaign”:
- The map assets are worthwhile playing, but the narrative diverges completely from WWII, with a bizarre fantasy setting (set in year 464, evil queens/emperors, made up nations while gameplay uses ww2 military tanks and planes) that clashes with the rest of the game. If anyone can tell me what the word "cenozoic" is supposed to mean and how it makes any sense to decribe that wierd campaign storyline, i for sure want to know.
- Docs suggest it was meant to be a German North Africa campaign but was scrapped due to time constraints. I believe the content was then repurposed into this rushed/ game universe breaking form.
- I do have plans for how to localize this in a meaningful way, but i wont go into that yet.