Last week, as I was enjoying some well-deserved vacation near La Manche, I decided to immerse myself into CyberConnect2's first game ever. I didn't know much about it except that it's supposed to be part of the same universe as the wonderful Solatorobo (cute kemono designs included!). I'd also heard that the US version published by Atlus has a somewhat infamous English dub, censors/replaces some bonus artworks, takes a fair amount of liberties with the script, and goes as far as replacing For Little Tail with a new song... your usual English localization shenanigans basically. The French release on the other hand, keeps the Japanese voicelines. I couldn't tell much about the quality of each translation in comparison to the Japanese release of course, but one thing I quickly noticed by playing the intro of both versions is that the English release tends to feature many animalistic onomatopea and wordplays where the French one has nothing of the kind.
After finishing the game, I wanted to see whether any translation project about it existed, and sure enough an Italian and a Spanish translation did. Those used the NTSC release, which I saw as a questionable choice for the reasons mentioned above, though the difficulty mode and the post-game Jukebox bonus could be reasons enough to use that release as a basis (that, and the 60Hz, though the latter could be forced in most emulators and PS1 ISO Loaders). I wondered if the French game wasn't simply unhackable because of an obfuscated file structuration. As per usual, I prepared my copies of makepsxiso/dumpsxiso, as well as Ghidra, and we were all set!
It was a slight surprise to see that the whole game's data is contained within 3 archives and a single executable. The names were also straightforward:
Both the audio and the video files could be decrypted to WAV/AVI with jPSXdec, then back to XA/STR with the tool's CLI commands. The -replaceframes command in particular will be of use for us. The .xml files jpsxdec could use to automate the process have been uploaded by rari-teh, the English Undub project's main developer, same for the .ass subtitles files one could use to quickly bake subs into the videos with ffmpeg.
I don't have much to say about the way the .BIN files are actually structured this time, the reason for that is fairly simple: I see no use in extracting the files when they're already decrypted and decompressed. Plus, unlike for Magical Date, I don't think I'll find any .TIM to expand so the original archive structure is more than enough: jPSXdec handles audio/video replacement while respecting/modifying when needed the original data alignment.
After throwing the executable file into Ghidra, I was quickly able to find some strings, mostly related to the Memory Card and the game's locations. The ASCII characters were recognized as such without much trouble, so all I had to figure out was the French/extended Latin ones. My first assumption was that the encoding would follow an ISO standard, but I was wrong. An é is encoded with the hexadecimal code 0x82, an à is 0x85. Because I didn't want to waste much time on this, I asked my good friend GPT, who accurately matched the used Charset as the IBM437 standard, commonly used on IBM PCs. Just like Magical Date, the best hex editor to use here would be wxMEdit, as it recognizes the charset.
The game retrieves every line of text by using pointers all over the place, sometimes with multiple pointers for the same string. If it encounters a NUL character, the current line of text is considered finished. If the character '@' is encountered, then we mark the end of a paragraph. This usually results in the game prompting the player to press a button to close the current dialog/load the next paragraph. More often than not, a paragraph's lines are stored in reverse order within the game's files.
For some reason, the strings which are meant to indicate Waffle's whereabouts on the save screen have to be 16 characters in length, not more, not less. Using too little or too many characters ends up showing broken graphics, and an incorrect playtime. The French translation team knew that, and padded out the small strings with spaces where needed. Each string of the kind is also automatically put in all caps, no matter if it was initially in lowercase or not. An exception to this rule is the string the game shows when a savefile is yet to contain any data. That one isn't set to be in all caps, go figure.
This will be it for now. I don't know what will be done of this information, but if some kind Portuguese/German is reading this post, I hope they'll consider using the French version as a starting point, since accented letters are included in the game's font by default unlike the US release.