11 Punkte von colus001 2026-03-26 | 3 Kommentare | Auf WhatsApp teilen

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

 
roxie 29 일 전

Und auf dem Spielbildschirm ist richtig der Duft vergangener Zeiten zu spüren;;

 
computerphilosopher 2026-03-26

Scheint ein Spiel wie The Secret of Monkey Island zu sein. Sieht unterhaltsam aus.

 
colus001 2026-03-26

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