2022-10-14: Der Langrisser -- The Lost Final Fan Translation

This is a bit of a different one. I'm going to talk a lot about the technical stuff behind fan translations, code building, and Linux as part of discussing the history of a fan translation project. This is important to me so I hope you'll bear with for a bit.

The Final Patch

I finished Shining Force last night. It's the first SRPG I actually liked unabashedly and it left me wanting more. Recommendations and research landed me on the Langrisser series, which twinged an old memory. Back in 2019, Peebs was playing Der Langrisser (Langrisser II, more or less) on the SNES as part of his "Play every SNES game" challenge. Der Langrisser was never officially localized (though now there's a shoddy mobile-quality remake on PC, ugh), but was localized unofficially through the combined work of Near, D, and several other contributors.

It's a solid patch that "punches up" some of the dialogue to further hammer home the crass nature of some characters. This is a matter of debate on the purity of localizations and not really a problem. The problem is it also contains a very out of place homophobic slur. I was in the stream when Peebs found this, we had a discussion, and eventually news of this being hit upon got to Near them self.

Near pushed a script change immediately to the work repository on Github and provided an updated patch personally. Really cool of them.

Near passed away in 2021. Since then, their website has gone down and D has seemingly moved on, having deleted their Github account and any means of contacting them. In addition, no one submitted the updated patch to romhacking.net; the site still lists the original v1.3 patch with the old dialogue in it as the newest version. When I tried to find the new patch last night, I was unable to, and neither were any of my preservationist or SNES nerd friends. It was presumed it might possibly be lost.

Internet Archaeology

I put out an ask on various social networks to see if anyone might have the patch or project files. I didn't get much in the way of direct assistance, but someone pointed out a rather clever little suggestion: check the GitHub Arctic Vault warm archive. Some bouncing around later, I landed at the Software Heritage archival website where I was able to dig in and locate a complete snapshot of the GitHub repository for the project. Paydirt!

Sidenote: This is an archive of the Der Langrisser translation toolkit repository owned by Sobodash, which is the account listed for D in D's romhacking.net profile.

For documentation purposes you can see the exact commit of the change (CW: homophobic slur included) here. In addition, a commit just before HEAD has a built IPS file in it, which was removed in a subsequent commit for some reason. The commit with a built IPS file (dl.ips) in it is here.

So I had the project files and a built IPS file. I still needed to verify this random IPS file represents the newest script, and to do that I had two options: apply it and extract the script and check, or build an IPS myself and compare. I chose the latter route.

Building The Project

Downloading a mothballed repository from the Software Heritage archive isn't as trivial as clicking a button. You have to request the package and wait for the servers to actually prepare a download, but that's no big deal. It took about ten minutes. That gets you a zip file with an incredibly obtuse name like swh_1_dir_f2b2e9a63a5a5247591e83dac91e1e57bfc73f36.tar.gz but that's the repo dump indeed. Actually using the translation toolkit requires a few things:

One note: the project README claims you can use GCC on Linux. The Makefile doesn't properly detect this; use Clang. A problem though: the toolchain build process is broken; or at least it was on my machine. Two problems here actually.

First, the method the Makefile uses to check the md5sum of the dump is MacOS specific. If you get errors about checksums despite knowing you have the right dump and you're using Linux, edit the Makefile and change line 4 from this...

MD5=$(shell md5 -q $(DLROM))

To this...

MD5=$(shell md5sum $(DLROM) | cut -d ' ' -f 1)

Second problem: after successfully extracting the script, the toolchain tries to execute PHP files to do parsing and fails with Error 127 on line 71 of the Makefile. I don't know why or how, but the Makefile calls out the wrong filename here for running the PHP tools. Simply change line 71 in the Makefile from calling decompev.php to calling evdecomp.php.

With those edits done, if you do this, the toolchain will build a patched rom file for you in the build/ directory:

make toolchain
make dump
make

You can also do make ips to get an IPS patch in the project root. That's what I'm working with going forward.

Verifying The Patch

At this point I had a patch, and checking its md5sum, it matched the IPS I extracted from the GitHub repository a couple of sections ago. So we verified that random IPS patch floating around in the repo was indeed the result of a build using the newest script. But I still needed to double-check it. I wanted to check two things: that the game even works, and that the script change didn't somehow break the dialogue. Problem is that scene is about three quarters of the way into the game.

I took the dl.ips patch created with the toolchain and patched an unmodified Japanese dump of Der Langrisser with it. It booted right up, intro and first gameplay moments looked good, but I didn't have a save to verify the script edit I was concerned about. What do?

Fortunately the original project team had my back here. In the reference directory in the project there's a series of notes and tables outlining what scenario references what script, and a dev code to warp between scenarios. I found the scenario I was looking for was No61. Activating the warp code involved going to the load screen, selecting one of the bottom three files, and inputting Up, Down, Up, Down, Left, Right, Select, A, selecting scenario 61, and hitting start.

The intro for scenario 61 played and sure enough, the edit I was looking for showed up perfectly. No ill effects from the script change (not that I expected any, it was a simple change in a well established toolkit). It was, honestly, pretty satisfying to see.

dlpatch

The important thing here is I've established this IPS patch I now have is built from the project's scripts, works, and reflects the newest script changes.

Now What?

Here's where we are: I have a patch for Der Langrisser that is newer than what the common community considers "the final one". I know the translation team intended for this edit to go out to the public, but it seems to have not been built and distributed anywhere that's still around. Who am I to show up at romhacking.net and claim this is the true definitive final fan localization?

That's part of why I wrote this long technical screed: hopefully this establishes a chain of authority on this being legit and, if I'm not trusted, someone who is can execute the build too.

Ideally getting a hold of D would solve this, but D seems to have taken steps to move on and cut contact-ability. If not that, talking to the romhacking.net admins might get me some insight, if I can get an inroad there.

My fallback plan is to build a BPS patch from the differences between v1.3 and this final one, and distribute that as an overlay patch for v1.3 with an explanation and proper credit attached. I'm not sure what the ethics of this would be within the fan translation community though.

This is a problem I'm still trying to solve.

But Why?

This was a lot of work for a two line script edit. Why did I go to all this effort? I'm asking myself that too.

I guess part of it is Near made this script change on a nine year old project immediately upon being told about the slur in the text. This is clearly something they cared about to some degree, and having the update be forgotten now that they're not around anymore just seems like a disservice.

More importantly, people change over time. Having something with their name on it contain something that I honestly believe did not reflect who they were later in life, that they wanted to redact, just feels wrong. If I could try to correct that oversight with a couple hours of work and some social tree-shaking, I'm pretty happy to do that.

Anyway, so it's not lost again, the patch I'm calling 1.3.1-rebuild can be grabbed below. It applies to v1.1 of Der Langrisser J and is exactly the same as the 1.3 on romhacking.net except that one line is changed to remove an unfortunate thing the original hacker regretted putting in later on.

Update: 2023-02-08

Romhacking.net rejected my submission on the grounds that I'm not the original author. They suggested I upload a new project myself and claim credit for the work. I refused to do this and have largely been left in a grey area unsure what to do going forward.

Today, RHDN made a policy change that states you must be the author or project lead on a work to submit it, so they'll never accept the patch now. Would they have if I submitted it in the interim? Probably. So this is my fault. I'm going to talk to them again and at the same time I'm going to see if I can get the pre-patches on CDRomance updated with this new patch so it at least exists somewhere besides my blog.

I also uploaded the full ZIP to archive.org.

I'm just really disappointed in this.

Update: 2023-02-10

Hi anyone landing here from CDRomance. As you can see I was able to reach out to that site and they updated the pre-patch there with the patch I built. The response I got was cordial, to the point, and closely matches my own opinion on the situation. I have quite some respect for the person/people who run the site now.

I think this is the best I can do. I just wanted it somewhere and I wagered CDRomance is at least a place people land when they twinge on the urge of "I want to play this game, where can I grab it now?"

A small detail but a win for preservation.

Files

tags: langrisser, tech, preservation, srpg