11 ポイント 投稿者 colus001 2026-03-26 | 3件のコメント | WhatsAppで共有

なぜ今まで存在しなかったのか?

  • 35年前に発売されたポイント・アンド・クリック型アドベンチャーシリーズ『キランディアの伝説』シリーズ。シリーズの中で唯一、2作目『Hand of Fate』だけが日本語化されていなかった
  • ScummVM に実装されているエンジンのうち、Lucas の SCUMM や Sierra の SCI はかなりファン翻訳されたゲームがある一方、Westwood の Kyra エンジンはファン翻訳されたゲームがあまりない
    • 独自のバイナリフォーマット、1 byte だけを前提にしたフォントレンダリング、必要なフォントが揃っていない
  • 日本語化するには単純な抽出と翻訳だけでは足りず、ScummVM の Kyra エンジンのテキストレンダリングコードを変更する必要があった

翻訳

  • 翻訳自体はそれほど難しくなく、抽出したスクリプトを LLM にかけて翻訳した
  • ゲームのトーンを保つための簡単なプロンプトだけを入力し、今のところ大きな問題はなさそうだった
    • ダジャレや言葉遊びのような微妙な部分は、やはり翻訳がうまくいかないようだ

リバースエンジニアリング

  • Westwood 独自のゲームフォーマット PAK(パッケージ)、EMC(シーンスクリプト)、DLG(ダイアログ)、ENG(UI テキスト)
  • 各フォーマットをリバースエンジニアリングして Python ツールを作成
    • EMC -> KMC、DLG -> DLK、ENG -> KOR とそれぞれ変換して翻訳版を作り、OTHER.PAK に保存
  • ScummVM のコードを修正し、ファン翻訳の場合は OTHER.PAK から翻訳済みファイルを読み込むようにした
  • 外部依存なしで $ python tools/build_korean.py の1行だけですべてビルドでき、.zip ファイルを作成して元のゲームに上書きすれば完了

フォント

  • そもそも日本語フォントがないため、用意する必要があった
    • 韓国で正規発売されたクラシックゲーム『The Dig』にハングルフォントがあり、以前に入手していた
    • フォント構造が少し違っていたため、ヘッダーを削除した
  • ScummVM に日本語フォントレンダラーを追加
    • 幸い、中国語ファン翻訳向けのフォントシステムにビットマップ読み込み、1bpp レンダリング、アウトライン処理、1バイト+2バイト結合(MultiSubsetFont)まで揃っていた
    • 『キランディア1』にあったハングル組み合わせ型フォントシステムのおかげで、2バイト読み取りロジックもすでに存在していた
    • EUC-KR のバイトペアをグリフインデックスへ変換するロジックだけを追加した
    • FM-Towns 版に日本語フォントがあり、これをどうにか使おうと思っていたが、簡単に解決できた

バグとの戦い

  • 「ガガガガ」バグ
    • 長いセリフを画面幅に合わせて調整する preprocessString() 関数が 1 byte フォント基準で実装されていた
      • 2バイト文字の途中に \r が入ってしまい、その後のテキストがすべて壊れて「ガガガガ」と表示された
    • シーンスクリプト読み込み時に _scriptLangExt を参照する箇所でエラーが出て、日本語の代わりに別言語が読み込まれていた
      • やはり該当フォントがないため「ガガガガ」と表示された
    • どちらも getFontOffset で該当文字がない場合に 0 を返していたことが原因で、正しく動作させるために修正が必要だった
  • Game data not found
    • 2回目の実行以降、なぜかクラッシュした
    • ScummVM がゲーム終了時に言語を韓国語として保存してしまい、検出できなくなる現象だった
    • とりあえず detection は英語のままにし、KOREAN.FNT があればこれを fanLang に保存して処理するようにした。これが正しいやり方だった
  • Chunk overread バグ
    • 日本語化したシーンスクリプト KMC を ScummVM の IFFParser が解析中に Chunk overread エラーを出した
    • IFF 標準どおりに KMC をパッケージ化する際 form_size = file_size - 8 と保存したが、Westwood だけは form_size = file_size で保存していた
      • オフセットが合わずエラーになった

ScummVM への貢献

  • ファン翻訳は ScummVM が公式に FLAGS_FAN(KO_KOR, EN_ANY) という方式でサポートしている
    • 前者がファン翻訳、後者が元の言語
  • エンジン起動後に kyra_hof.cpp で切り替え、実際の韓国語モードをサポートして翻訳ファイルを読み込めるようになった
  • ファイル拡張子の体系が言語ごとに異なり、DLG ファイルは DOS では英語が DLE、ドイツ語が DLG だった
    • FM Towns ベースで作業していて、その後 DOS 版にも対応していたところ、突然ドイツ語が出てきた
  • KMC がなければ EMC を使うようにして、翻訳が完了していなくても動くようにした
  • PR を出したが、心配したほど厳しい反応はなく、コミットを整理した程度だった

AI の可能性

  • 実際、この大部分は OpenCode と Opus / Sonnet がやってくれた
  • 自分がやったのは、プロジェクトリーダーのように促し、テストし、デバッグし、励ますこと(プロンプトを入れること)だった
  • 材料はすべて揃っていて自力でもできたかもしれないが、どこから手を付けるべきか見当もつかなかったと思う
  • Python と C++ のコードはほとんど1行も書いておらず、これが AI とともに進めるエンジニアリングなのかと思った
  • そのおかげで、AI コーディングに対して少し前向きになれた気がする

3件のコメント

 
roxie 29 일 전

わあ、ゲーム画面から感じられる昔の時代の空気がすごい;;

 
computerphilosopher 2026-03-26

『モンキーアイランドの秘密』みたいなゲームのようですね。面白そうです。

 
colus001 2026-03-26

その通りです。ライバルと呼ぶには無理がありますが、『キランディアの伝説』も韓国語化のおかげでそれなりに人気がありましたね。笑