Warum gab es das bisher nicht?
- Die 35 Jahre alte Point-and-Click-Adventure-Reihe Legend of Kyrandia. Von der Serie war nur Teil 2, Hand of Fate, nie auf Koreanisch lokalisiert worden.
- Bei den in ScummVM implementierten Engines gibt es für Lucas’ SCUMM oder Sierras SCI ziemlich viele Fan-Übersetzungen ins Koreanische, aber für Westwoods Kyra-Engine nur sehr wenige.
- Eigenständiges Binärformat, Font-Rendering nur für 1 Byte, nicht alle benötigten Fonts vorhanden
- Für die Lokalisierung reichten simples Extrahieren und Übersetzen nicht aus; stattdessen mussten die Text-Rendering-Codes der Kyra-Engine in ScummVM geändert werden.
Übersetzung
- Die Übersetzung selbst war nicht besonders schwierig; die extrahierten Skripte wurden durch ein LLM geschickt und so übersetzt.
- Es wurde nur ein einfacher Prompt eingegeben, um den Ton des Spiels beizubehalten, und insgesamt scheint es keine größeren Probleme zu geben.
- Feine Nuancen wie Wortspiele oder Sprachwitz lassen sich allerdings offenbar nicht gut übersetzen.
Reverse Engineering
- Westwoods eigene Spielformate: PAK (Paket), EMC (Szenen-Skript), DLG (Dialog), ENG (UI-Text)
- Jedes Format wurde per Reverse Engineering analysiert und als Python-Tool umgesetzt.
- EMC -> KMC, DLG -> DLK, ENG -> KOR wurden jeweils als Übersetzungen erzeugt und in
OTHER.PAK gespeichert.
- Der ScummVM-Code wurde so angepasst, dass bei einer Fan-Übersetzung die übersetzten Dateien aus
OTHER.PAK geladen werden.
- Ohne externe Abhängigkeiten lässt sich alles mit einer einzigen Zeile bauen:
$ python tools/build_korean.py; anschließend wird eine .zip-Datei erzeugt, die man einfach über das Originalspiel kopiert.
Fonts
- Standardmäßig gab es keinen koreanischen Font, also musste einer beschafft werden.
- Aus dem in Korea offiziell veröffentlichten Klassikerspiel „The Dig“ gab es einen koreanischen Font, der bereits gesichert worden war.
- Da die Font-Struktur leicht anders war, wurde der Header entfernt.
- Ein koreanischer Font-Renderer wurde zu ScummVM hinzugefügt.
- Glücklicherweise brachte das Font-System für chinesische Fan-Übersetzungen bereits Bitmap-Laden, 1bpp-Rendering, Outline-Behandlung und das Zusammenführen von 1-Byte- und 2-Byte-Zeichensätzen (
MultiSubsetFont) mit.
- Außerdem gab es aus Kyrandia 1 bereits ein zusammengesetztes koreanisches Font-System, sodass auch die Logik zum Lesen von 2-Byte-Zeichen schon vorhanden war.
- Es musste nur noch die Logik ergänzt werden, um EUC-KR-Bytepaare in Glyph-Indizes umzuwandeln.
- Eigentlich sollte der japanische Font aus der FM-Towns-Version irgendwie genutzt werden, aber das Problem ließ sich einfacher lösen.
Krieg gegen Bugs
- Der „gagagaga“-Bug
- Die Funktion
preprocessString(), die lange Dialogzeilen an die Bildschirmbreite anpasst, war auf Basis von 1-Byte-Fonts implementiert.
- Dadurch wurde mitten in ein 2-Byte-Zeichen ein
\r eingefügt, sodass der restliche Text komplett beschädigt wurde und als „gagagaga“ erschien.
- Beim Laden des Szenen-Skripts trat ein Fehler an der Stelle auf, die auf
_scriptLangExt verweist, sodass stattdessen Japanisch geladen wurde.
- Weil auch dafür der passende Font fehlte, wurde ebenfalls „gagagaga“ angezeigt.
- In beiden Fällen lag die Ursache darin, dass
getFontOffset bei einem unbekannten Zeichen 0 zurückgab; es musste also korrigiert werden, damit alles richtig funktionierte.
Game data not found
- Ab dem zweiten Start kam es seltsamerweise zu einem Crash.
- Beim Beenden des Spiels speicherte ScummVM die Sprache als Koreanisch, wodurch die Erkennung anschließend nicht mehr funktionierte.
- Vorerst wurde die Erkennung auf Englisch belassen; wenn
KOREAN.FNT vorhanden ist, wird dies in fanLang gespeichert und so verarbeitet. Das ist die richtige Vorgehensweise.
Chunk overread-Bug
- Beim Parsen des lokalisierten Szenen-Skripts KMC erzeugte der ScummVM-IFFParser den Fehler
Chunk overread.
- Beim Verpacken von KMC gemäß IFF-Standard wurde
form_size = file_size - 8 gespeichert, aber nur Westwood speichert form_size = file_size.
- Dadurch passten die Offsets nicht und es kam zum Fehler.
Zu ScummVM beitragen
- Fan-Übersetzungen werden von ScummVM offiziell in der Form
FLAGS_FAN(KO_KOR, EN_ANY) unterstützt.
- Der erste Teil steht für die Fan-Übersetzung, der zweite für die Originalsprache.
- Nach dem Start der Engine wird in
kyra_hof.cpp umgeschaltet, sodass der eigentliche Koreanisch-Modus unterstützt und die Übersetzungsdateien geladen werden.
- Das System der Dateiendungen unterscheidet sich je nach Sprache; bei DLG-Dateien ist unter DOS Englisch
DLE, Deutsch aber DLG.
- Während zunächst auf Basis der FM-Towns-Version gearbeitet wurde und später auch die DOS-Version hinzukam, tauchte plötzlich unerwartet Deutsch auf.
- Wenn kein KMC vorhanden ist, wird EMC verwendet, sodass das Spiel auch dann läuft, wenn noch nicht alles übersetzt wurde.
- Ein PR wurde eingereicht; die Reaktionen waren weit weniger kritisch als befürchtet, am Ende mussten nur die Commits aufgeräumt werden.
Das Potenzial von AI
- Tatsächlich wurde der Großteil davon von OpenCode und Opus / Sonnet erledigt.
- Die eigene Rolle bestand eher darin, wie ein Projektleiter anzutreiben, zu testen, zu debuggen und zu unterstützen (also Prompts einzugeben).
- Alle Materialien waren schon vorhanden, und theoretisch hätte man es selbst machen können, aber vermutlich hätte man gar nicht gewusst, wo man anfangen soll.
- Es wurde fast keine einzige Zeile Python- oder C++-Code selbst geschrieben, und genau das fühlte sich wie Engineering gemeinsam mit AI an.
- Dadurch ist die Haltung gegenüber AI Coding wohl deutlich positiver geworden.
3 Kommentare
Und auf dem Spielbildschirm ist richtig der Duft vergangener Zeiten zu spüren;;
Scheint ein Spiel wie The Secret of Monkey Island zu sein. Sieht unterhaltsam aus.
Genau. Zwar wäre es übertrieben, von einem Rivalen zu sprechen, aber The Legend of Kyrandia war dank der koreanischen Lokalisierung auch einigermaßen beliebt. Haha