Mann, beim letzten Mal bin ich ja so gar nicht mehr aus dem Schwärmen gekommen. Ist „Pokémon Picross“ denn wirklich so ein tolles Spiel?
Tja, wer weiß das schon. Fans von actiongeladenen Titeln würden diese Frage wohl eher verneinen. Egal, mir hat es jedenfalls gefallen. Warum wollten wir uns das gut 25 Jahre alte Stück Software heute erneut ansehen? Achja, die fehlende deutsche Sprache, ich erinnere mich…
In Artikel 333 bin ich ja schon auf den recht gelungenen Englisch-Patch des Spiels eingegangen. Der Autor des Übersetzungsskript war so nett und hat seine Erkenntnisse auf einer Github-Seite zusammengefasst, welche gleichzeitig Leute dazu animieren soll, das Spiel auch in andere Sprachen zu übersetzen. Ich würde sagen, da hat er meinen Nerv getroffen! 😀
Das Ziel ist also klar: Wir wollen uns einen „Deutschpatch“ für Pokémon Picross bauen! 🙂
Doch wie fangen wir an? Als Erstes müssen wir uns mal eine entsprechende Arbeitsumgebung basteln, mit der wir die Spieldaten modifizieren können. Glücklicherweise hat der Ersteller des Englisch-Patches schon gute Vorarbeit geleistet und die dafür benötigten Tools und Schritte in einer Kurzanleitung zusammengefasst. Im Endeffekt brauchen wir neben der originalen, japanischen Version des Spiels (ROM-Datei) auch einen Game Boy Emulator, einen Assembler zur Modifizierung von Grafik- und Schriftladeroutinen, eine Python 3 Laufzeitumgebung, diverse kleinere Tools wie z.B. Grafikprogramme zur Bearbeitung von Texten und Sprites sowie ROM-Hacking-Programme zur Korrektur der Headerdaten und zum Bauen einer Patchdatei. Klingt erst mal alles spanisch? Ist es auch! 😛
Not so fun Fact: Das „Zusammensuchen“ der Programme in geeigneten Versionen war echt aufwändig, aber so ist das bei Open Source Bastelprojekten leider häufig!
Die ganzen Tools müssen in entsprechende Verzeichnisse installiert, bzw. entpackt werden. Damit auch alle Werkzeuge ordnungsgemäß funktionieren, müssen Systemumgebungsvariablen (Stichwort „PATH“) sowie einige Pfade in Skripten entsprechend angepasst werden.
Fun Fact: Das für die Modifizierung des Spiels verwendete Tool namens „Event Assembler“ ist eigentlich ein von Fans der Fire Emblem-Spieleserie erstelltes Werkzeug, um den strategischen Rollenspielen benutzerdefinierte Inhalte unterzujubeln. Schon interessant, für was so Werkzeuge alles missbraucht, ähm ich meine natürlich verwendet werden können! 😀
Bevor wir irgendwas tun, sollten wir versuchen, den originalen englischen Patch mit Hilfe der bereitgestellten Werkzeuge zu erstellen – quasi ein Funktionstest, ob unsere Umgebung zur Erstellung eines Patches überhaupt funktioniert. Theoretisch sollte das mit dem Skript „MAKE_HACK.cmd“ (bzw. „MAKE_HACK_FULL.cmd“) möglich sein.
Fun Fact: Nicht wundern – ich werde den Vorgang zur Erstellung des Hacks (also die Generierung einer modifizierten ROM-Datei) im Folgenden „Buildprozess“ nennen. Das ist einfach kürzer! 🙂
Allerdings bin ich kein Fan davon, einfach blind irgendwelche Skripte auszuführen. Besser wir schauen uns diese ominöse Build-Datei mal etwas genauer an. Aha! Die englische Übersetzung wurde also mit Hilfe von ein paar Python-Skripten erstellt, welche Fonts und Texte aus dem Spiel ex- und wieder importieren können. Gleiches gilt wohl für irgendwelche Grafiken, die erst konvertiert und dann noch komprimiert werden, bevor sie mit in die ROM geschrieben werden. Abgefahren.
Not so fun Fact: Natürlich geht hier im Hintergrund noch deutlich mehr ab. So wird z.B. mit Hilfe des Event Assemblers die Textausgabe von zwei auf ein Byte verringert, um Platz in der ROM-Datei zu sparen. Ebenso werden mit ein paar Assembler-Hacks dynamisch Grafiken zur Laufzeit geladen oder die Positionierung einzelner Steuerelemente (z.B. Menüs, etc.) modifiziert. Seht es mir nach, dass ich nicht auf all diese Dinge eingehen kann, der Beitrag wird so schon lang genug fürchte ich! 😀
Na, dann drücken wir mal ganz mutig auf den Knopf und schauen, was passiert. An dieser Stelle könnte ich euch jetzt stundenlang irgendwelche kryptischen Fehlermeldungen (sowie entsprechende Handstände, diese zu beheben) zeigen, aber das interessiert keinen und wenn ich ehrlich bin, will ich eigentlich auch gar nicht mehr so genau an die ganze verschwendete Zeit zurückdenken! xD Nur um euch das Ausmaß des Wahnsinns klar zu machen und eine klassische Stolperfalle bei Open Source Projekten anzusprechen: Damit irgendwas lief, musste ich erst mal eine merkwürdige, veraltete „Python Imaging Library“ nachinstallieren. Ein echter Klassiker! 😀
Das alles ist jetzt aber egal, denn tatsächlich funktioniert der Buildprozess und wir können uns mit Hilfe der ganzen Skripte und Tools die englische Version des Spiels selbst erstellen:
Diese läuft dann auch in einem Emulator und gleicht exakt der mit dem fertigen Patch erstellten Version. Ein erster Erfolg! 🙂
So weit so gut, jetzt müssen wir ja „nur noch“ alle englischen Texte durch deutsche ersetzen. Ein Problem könnte dabei sein, dass einige deutsche Wörter mitunter recht lang werden können und wir so ggf. auf Platzprobleme innerhalb der ROM-Datei stoßen könnten. Wir werden sehen…
Fun Fact: Zur Erinnerung: Game Boy Spiele (bzw. ihre digitalen Abbilder in Form von ROM-Dateien) bestehen aus einer, abhängig vom Typ des verwendeten Moduls, fest definierten Größe, welche Speicherbereiche in mehrere Bänke aufteilt. Pokémon Picross ist ein MBC5-Spiel mit 16 Mbit (also 2 Megabyte ROM-Größe) und 32 kB SRAM (zur Erhaltung des Spielstands via Knopfzelle). Dementsprechend sind wir auf 2 MB, bzw. 2.048 kB beschränkt und müssen sämtliche Texte und Grafiken darin unterbringen. Hättet ihr das alles noch gewusst? Im Zweifelsfall kann es nicht schaden, einen Blick in Artikel 215 zu werfen! 😉
Als erstes müssen wir uns mit Hilfe des Skripts „dump_text.py“ die englischen Texte aus der ROM-Datei entladen. Dadurch werden drei Ordner erstellt:
Jeder der drei Ordner enthält hunderte von Textdateien, in denen sich die Textschnipsel für die unterschiedlichen Komponenten im Spiel befinden:
Diese können wir jetzt nach und nach bearbeiten und durch deutsche Sätze ersetzen. Fangen wir mit etwas Leichtem an, um zu testen, ob es wirklich so einfach ist: Wie wäre es, wenn wir z.B. den Namen des ersten Puzzles (also des ersten Pokémons) von „Diglett“ zu „Digda“ ändern?
Nach einem erneuten „make“ wird unsere modifizierte Textdatei mit in das Spiel eingebaut und tatsächlich heißt das erste Puzzle jetzt „Digda“. Oben im Bild der alte Stand (ohne Änderung), unten im Bild das erste Rätsel mit modifizierter Textdatei. Ach, es ist einfach schön, wenn mal etwas auf Anhieb funktioniert! 🙂
Dann geht es ans Eingemachte, denn die ganzen Pokémon übersetzen sich schließlich nicht von selbst. Ob ich noch alle 151 Namen aus dem Kopf hinbekomme? 😛
Während sich die Namen der Taschenmonster noch recht einfach gestalten, gibt es ein paar andere Begriffe, die mehr Probleme bereiten. So wird z.B. aus der „Slot Machine“ der „Spielautomat“, weil „Einarmiger Bandit“ einfach zu lang ist, dadurch die Grafik sprengt (bzw. Grafikfehler bei der Anzeige erzeugt) und in einigen Fällen sogar das ganze Spiel zum Absturz bringt. Top!
Noch schlimmer ergeht es uns beim Versuch, die „Poké Flute“ in „Pokeflöte“ umzubenennen. Sieht so aus, als könnte das Spiel nicht mit dem kleinen „ö“ umgehen und stürzt ab. Das wundert mich nicht, ich kann mir kaum vorstellen, dass der englische Übersetzer sich Gedanken über die Buchstaben „ä“, „ö“ und „ü“ gemacht hat. Puh, das heißt, wir müssen also irgendwie die Verarbeitung von Umlauten implementieren. Deutsche Sprache, schwere Sprache!
Damit das was wird mit den Umlauten, müssen wir erst mal die im Spiel verwendete Schriftart um die drei Buchstaben erweitern. Hierfür braucht es ein geeignetes Tool wie z.B. Usenti, mit welchem sich Bitmap-Grafiken mit Gitternetzlinien bearbeiten lassen.
Die fehlenden Buchstaben sind schnell dazu gepixelt:
Doch das war noch nicht alles, denn auch das Python-Skript „insert_text.py“, welches die Texte importiert, muss an ein paar Stellen angepasst werden, um mit den Umlauten umgehen zu können:
Ganz schön viel Arbeit für drei Schriftzeichen. Der Aufwand hat sich aber gelohnt, denn prompt werden die Buchstaben „ä“, „ö“ und „ü“ erkannt und sauber umgesetzt:
Not so fun Fact: So einfach, wie es sich hier liest war es in der Praxis leider dann doch nicht, weil ich natürlich mit den diversen Codepages (ANSI, UTF-8, etc.) beim Bearbeiten der Textschnipsel, bzw. der Textdateien einige Probleme hatte. Ernsthaft, ich hasse Codepages! 🙁
Prima, dann können wir ja jetzt die restlichen Textzeilen übersetzen. Die Bezeichnungen der Level und Taschenmonster (Verzeichnis „names_eng“) sind, bzw. waren schnell auf Deutsch getippt, aber der „dialogue_eng“-Ordner mit allen weiteren Texten des Spiels stellt uns vor eine größere Herausforderung. Einerseits sind die Textzeilen länger und andererseits ist es nicht gerade leicht, ohne Kontext die eigentliche Bedeutung der Zeilen korrekt zu interpretieren und entsprechend zu übersetzen. Ebenso besteht permanent die Gefahr, dass der Text zu lang für eine Displayzeile wird.
Abhängig von der Situation (bzw. der jeweiligen Textbox im Spiel) sind es meistens irgendwas zwischen 25-32 Zeichen, die pro Zeile erlaubt sind. Hält man sich nicht daran, ist die Wahrscheinlichkeit hoch, dass man irgendwas kaputt macht. Das Ganze gilt es dann bei insgesamt ca. 150 Textdateien zu beachten, die übersetzt werden wollen. Da hilft nur eins – Augen zu und durch!
Not so fun Fact: Ich habe das Spiel bestimmt insgesamt schon über 10 Stunden gespielt, aber in einigen der Dateien befinden sich Zeilen, die ich noch nie zuvor gesehen habe. Ich kann es kaum erwarten, diese im Spiel zu suchen, um zu testen, ob alles funktioniert – NICHT! 😀
Aber auch das ist irgendwann geschafft und als letzte Challenge warten dann noch die Systemmeldungen im Ordner „system_eng“ auf uns:
Darin gibt es auf den ersten Blick nichts spannendes, außer ein paar Fehlermeldungen, welche den „Game Boy Printer“ betreffen. Diese treten wohl immer dann auf, wenn mit einem über das Game Link Kabel angeschlossenen Drucker irgendwas nicht stimmt. Wie man es von Drucker-Fehlermeldungen gewohnt ist, sind die Hinweise absolut nicht hilfreich, missverständlich und alles andere als aussagekräftig. Mein persönliches Highlight ist diese Meldung, welche scheinbar in gleich sieben unterschiedlichen Fehlerszenarien zum Tragen kommt:
Ernsthaft – wie soll ich das bitte übersetzen? „Die Umgebungstemperatur passt nicht?“. „Es ist kein Schaltjahr?“. „Das Sternbild des Orion ist heute Nacht nicht sichtbar?“. Wenn ich eines in Jahrzehnten Informatik gelernt habe, ist es die Tatsache, dass Drucker aus der Hölle kommen! 😀
Gott sei Dank ist auch das irgendwann geschafft und sämtliche Dialoge sind übersetzt. Ich kann euch gar nicht sagen, wie sehr mir dieses „Text eingeben, ROM-Datei bauen, im Emulator laden und prüfen, ob man irgendwas kaputt gemacht hat“ gegen Ende auf den Keks gegangen ist! xD
War es das endlich? Leider nicht, denn die richtig knackigen Baustellen stehen uns noch bevor. Konkret müssen nämlich noch etliche Grafiken des Spiels angepasst werden. Ich hatte gehofft, dass wir das alles heute in einem Aufwasch erledigen können, aber wie es immer so ist mit der Zeit: Sie rennt gnadenlos, wenn man sich auf etwas konzentriert – gerade wenn nicht alles glatt geht und man sich immer wieder mit Rückschlägen und Problemen auseinandersetzen muss.
Dann müsst ihr einfach nächste Woche nochmal rein schauen und den zweiten Teil des Beitrags lesen – sorry! 😛
In diesem Sinne – bis die Tage, ciao!