GearHead の迷宮。Mecha, メック, そして Mech / The Labyrinth of GearHead RPG

GearHead RPG に関する落書帳

目次 (Index)




多言語版 GearHead-1 (Internationalization GearHead-1 on SDL & CUI for almost all OSs)

概要・特徴 (Overview and Features of I18N version)

GearHead-1しみてい版 日本語化(v0.835)らふ版 日本語化(v1.010+J0.01alpha4)SDL版 日本語化(v1.100+JP008) の成果の集大成として、 原作最新版(執筆時点で GearHead v1.100)への対応、 「CUI」(原作では「ASCII モード」と呼ばれる)と  「SDL」と  「422氏&らふ(l0ugh)氏によって追加された表示モード(MS-Windows専用GDI使用)」の 表示3モード対応、 多OS対応、 多言語対応、 GearHeadスレ勇士達の助力の元にバグ修正、 各種ちょっと便利かもしれない機能を大量に追加、 任意のスクリーンサイズに対応、 各種チート機能を追加、 GearHead-2 から口径機能のバックポート、 不正なメモリアクセスを行うバグの治療、 を行いました。

I18N GearHead-1 is developped based on the achievement of the Original GearHead-1, the shimitei's branch, l0ugh's branch and a Group of Jpananese Spoilers branch.

I18N GearHead-1 can be used with a lot of languages and a many OS.

"Combining Character" (Devanagri, Thai, Japanese, et al.) are not completely supported. But "Precomposed Character" are supported. Please use "Precomposed Character" instead of "Combining Character", when "Combining Character" cause something incorrects.

And, "Languages written from the right to the left (bidi RTL)" (Arabic, Hebrew, Near Ancient Japanese, et al.) are supported, but not tested enough.

"Languages written from the up to the down" (Mongolian, Another style of Chinese/Japanese/Korean, et al.) are not supported.

CUIモード(ASCIIモード)とSDLモードが、 FreeBSD でも GNU/Linux系でも MS-Windows でも動作する様になりました。 Macintosh や Mac OS X や Solaris や OS/2 等は、 私が所有しておらず、 また開発協力者あるいは動作確認報告も登場していないので、 確認できていません。 GLモードは、やる気が無いので対応しません。 また、従来の日本語版にあったバグを、発見された物は全て修正しました。

I18N GearHead was tested on FreeBSD, GNU/Linux and MS-Windows 2k/XP. But, I18N GearHead was not tested on Mac OS X, Solaris and OS/2, because of I have no such OS or computers.

誤解しない様に長ったらしい注釈:(Features of each branches of GearHead-1)
  • 総本山(英語版)にある オリジナル版の GearHead 1.100(1系列現行最新、最終?) は、 CUIモード(ASCIIモード)と SDLモード共に、 Unix系でも MS-Windowsでも、 英語メッセージで、 動作します。 プロット機能も動きます。
  • GearHead 1.100用(1系列現行最新、最終?) 日本語化 008版 (通称「SDL版」)は、 らふ版を元に作られ、 SDLモードが、 MS-Windows上で、 CP932による日本語メッセージで、 動作します。 プロット機能は動きません。
  • 日本語化の旧総本山にある GearHead 1.010用(ちょっと古い) 日本語化 0.01alpha4版 (通称「らふ版」もしくは「CUI版」もしくは「旧日本語化版」)は、 GDIによる CUI(ASCII)表示のエミュレーションが、 しみてい版を元に作られ、 MS-Windows上で、 CP932による日本語メッセージで、 動作します。 プロット機能は動きません。
  • さらに古い しみてい版は、 ……すみません、ソースは読みましたが動作確認は行っていません。 ざっと見た感じ、 CUIモード(ASCIIモード)が、 Unix系でも MS-Windowsでも、 動くみたいです。 プロット機能も動いているはずです。
  • 拙作の I18N版だと、 GearHead 1.100(1系列現行最新、最終?)が、 CUIモード(ASCIIモード)とSDLモードともに、 Unix系でも MS-Windowsでも、 メッセージデータさえ翻訳すればほぼ世界中どの言語でも (日本語と英語以外では動作確認していないので、バグはあるかもしれません。 あとモンゴル語は縦書き専用の言語なので対応できません)、 動作します。

FreeBSD/i386 6.3-RELEASE では、ビルドして、 CUI, SDL 共に起動する事まで確認済。

FreeBSD/amd64 6.3-RELEASE では、 32ビット互換モードでビルドするか FreeBSD/i386 上でビルドした物が、 CUI, SDL 共に起動する事まで確認済。

FreeBSD/amd64 10-CURRENT では、 CUI, SDL 共に起動する事まで確認済。

MS-Windows win32(32bit系)では、ビルドして、 CUI, SDL 共に起動する事まで確認済。

GNU/Linux/i386 では、ビルドして、 CUI, SDL 共に起動する事まで確認済。

GNU/Linux/amd64 では、ビルドして、 CUI, SDL 共に起動する事まで確認済。

それ以降、プレイ中の挙動等は動作確認中……、 移植作業で力尽きました。

ロケールは EUC-JP と UTF-8 と CP932 を確認済。

Mac とか SunOS とか Solaris とか MS-DOS は、 試験できる環境が無いため未確認。

メックやメッセージのデータを自作する時の注意 (Notices: If you make original mecha data by using Japanese.)

メックのデータや、シナリオのメッセージを自作する時の注意。

GearHead は、様々な計算機や色々なOSで動作する様に作られているので、 互換性の確保の為、注意が必要です。

  • ファイル名には いわゆる半角のアルファベットと数字と ()-=_. のみが 使用できます。
    いわゆる日本語とかいわゆる半角カナは、ファイル名に使用できません。
    これは、 CD や DVD 等にデータを保存した時に問題が起きない様にする為と、 MS-Windows で読み書きができなくなるトラブルが発生しない様にする為と、 Solaris や SunOS 等で扱いにくくならない様にする為と、 原作の英語版との互換性を(一応)確保する為、 です。
  • ファイル内の1行の長さは 255バイトまでに制限されています。 はみ出した部分は切り捨てられます。
    全て英語(ASCII)だと 255文字、 全て日本語(UTF-8除く)だと約127文字、 全て日本語(UTF-8の場合)だと85文字ぐらい、 になります。
    UTF-8 と EUC-JP では、 いわゆる半角カナを使っても消費バイト数を節約する事はできません。
    これは Pascal の仕様です。
    %JF %JS %JG %JA %a %n %t \タグ 等の置換を使用した場合、 置換後のメッセージ本体の長さも 255バイト以内に収まっていないといけません。 はみ出した部分は切り捨てられます。
    PROMPT タグの中身は、 CUIモード(ASCIIモード)だとASCII 45文字ぶんの幅までしか表示できません。 はみ出した部分は切り捨てられます。
  • いわゆる半角カナを使うと、互換性に問題が発生する可能性があります。
    具体的には、CUIモード(ASCIIモード)を、 標準設定の Fedora GNU/Linux や Ubuntu GNU/Linux で動かすと、 表示できない可能性があります。 SDLモードや Mac OS X は不明。
    nkf 等の 変換ツールを使うと、 「いわゆる半角カナ」から「いわゆる全角カナ」への自動変換ができます。
    自分しか使わないデータとか、 MS-Windows以外の OSを使っている人には文字化けさせたい、とかで、 わざとやるなら止めはしませんが。
    あと、「いわゆる半角カナ」を使っても、 画面表示の幅が半分になることは保障されません (文字コードの規格では、 「いわゆる半角カナ」のコードに関して文字の表示幅を定義していないので、 「いわゆる全角」と同じ大きさで表示しても規格違反ではない)。 同様に、「いわゆる全角文字」を使っても、 画面表示の幅が「いわゆる半角」の倍になることは保障されません (例えば、 MS-Windowsで「いわゆる全角」のマイナス「−」を表示すると、 「いわゆる半角」の幅で表示される場合があります)。
  • いわゆる機種依存文字は使えません。
    多言語対応の為の処理の都合、多分、文字化けします。
    丸数字とかギリシャ数字とか数学記号辺りでは、 規格で定められた正当な文字と、 機種依存文字で作られた不正な文字の、 2種類がある為、注意が必要です。
  • ディレクトリ(フォルダ)を表す文字は OS によって異なります。
    なので、ファイル中でディレクトリ(フォルダ)を指定すると、 異なる OS で扱う事ができなくなる場合があります。
  • 拙作の I18N版の日本語用データでは、 文字コードは EUC-JP (JIS X 0212) もしくは eucJP-MS に統一しています。
    建前は、 様々な OSを使っている人同士の間で データの交換を簡単に行える様にする為と、 色々なコンパイラでコンパイルできる様にする為、 です。
    本音は、 OS毎にいちいち文字コードを変えていたら 動作確認やデバッグが非常に面倒になるからと、 ShiftJIS(CP932) だとコンパイルできないコンパイラが実在するから。
    ISO-2022-JP はロッキングシフトの扱いが面倒なので除外。 UTF-8 では文字数制限が厳しくなるのと 日本語のマッピングに問題があるから駄目。 ShiftJIS では特定の文字を使うと必ずコンパイルエラーになるのと 一部のよく使われる文字が未定義だから駄目。 CP932 は特定の文字を使うと必ずコンパイルエラーになるのと 文字コードの定義に問題があるから駄目。
  • 改行コードは FreePascal が適当に処理してくれているので、 よくわかりません。

自分でコンパイルや改造をする人の場合 (Get the Source-code)

  • プログラム自体は多国語対応ですが、 メッセージデータは英語版と日本語版しかありません。 また、プレイ開始後の言語切り替えは無理です。 セーブデータに直接メッセージが記録されているのだもの。
    The binary programs of I18N GearHead-1 support almost all languages, but we have only two data sets, for English and for Japanese. If you want other languages, please translate message & series data set by yourselves. "Memorandum of How to Make Your Language Edition" is wrote in doc/I18N_howto.txt in a archive file GearHead1100i18n.txt.* .
  • svnweb : gearhead1-i18n
    I18N版のソース・データの保管庫。 A repository for sources and data of I18N GearHead-1.

コンパイル時に、よくあるかもしれないトラブル集:FAQ

  • SDLモードで英語だけ表示されそれ以外は □ になる場合、 フォントファイルとして英語専用のフォントが指定されています。 gharena.cfg ファイルにて使用する言語にあったフォントを指定してください。
  • SDLモードでの日本語入力ができるのは、 UNIX系の場合は、 SDLにalissa-sabre氏のパッチ適用済の場合、 もしくは SDL-1.2.12以降(alissa-sabre氏のパッチが本家にマージされている)、 です。
    MS-Windows系の場合は、 SDL では IME からの日本語入力はできませんので、 コンパイルオプションに -dWITHOUT_SDLIM を付けて、 スポイラー公開版作者氏による代替の入力ダイアログを使う必要があります、 その際、コンパイラオプションで -O2 や -O3 を付けると、 入力ダイアログが開いた瞬間にクラッシュしますので (FreePascalはMS-Windows側がレジスタ保存をする事を想定しているのに、 MS-WindowsはFreePascal側がレジスタ保存をする事を想定している為、 結局誰もレジスタを保存せずに壊れるらしい)、 -O1 もしくは最適化無しにして下さい。
    それ以外の言語の場合は不明です。
  • UNIX系の場合、 SDLモードで日本語入力時に、 変換中の内容が画面外にはみ出して見えないことがある。
    ……、これはアプリケーション側ではどうしようもない。
  • SDLモードを MS-Windows にて、非iconv でビルドした場合、 ヘルプメッセージの一部が文字化けします(日本語008版からの仕様)。
    iconv付きでビルドすれば、文字化けしませんが、 別途 iconv.dll が必要になります。
  • 文字列入力時に行編集が、バックスペースか全消去しかできない。 そんな頻繁に使わない部分を多機能にするのは面倒なので。
  • 会話でメッセージが長い時に途中で切られて最後まで表示されないのは、 Pascal の仕様です。
  • 選択メニュー(会話の選択肢とか、アイテム・商品一覧とか)で 1項目の表示内容が長いときに、 途中で切られて最後まで表示されないのは、 オリジナル(英語版)からある仕様です。
  • 漢字圏の言語を使用する場合に 内部処理用の文字コードを UTF-8 に設定した場合、 メッセージが途中で切れている事があります。
    これは、Pascal の仕様です (Pascal文字列は255バイトまでしか扱えず、 UTF-8 で漢字系の言語を使う場合だと1文字で約3バイト必要な為、 約85文字で途切れてしまう)。
    UTF-8 で表示したい場合は、 内部処理用の文字コードには EUC系を選択し、 表示文字コードで UTF-8 を選択して下さい。
  • ISO-2022 は非対応です。
  • CUIモード(ASCIIモード)では、 画面サイズが 80x25 よりも小さいと、正しく表示されません。
    必ず 80x25 か、それよりも大きくして下さい。 オリジナル(英語版)からある仕様です。
  • FreeBSD とか一部の OS にて、CUIモード(ASCIIモード)を WideChar設定で動かすと、 日本語が全く表示されません。
    これは、その OS用の FreePascal が WideChar, WideString 非対応な為です。
  • CUIモード(ASCIIモード)を非WideChar設定で動かすと、 画面表示を script とかでログに記録しようとした時に ログが悲惨な事になります。
    これは非WideCharの時に、 Pascalが多バイト文字の連続表示を正しく実行できなかった為、 1文字毎に表示している為です。
  • CUIモード(ASCIIモード)で表示内容のスクロールが遅いですが、 これは FreeBSD版 FreePascalが多バイト文字のスクロールを 正しく実行できなかった為(スクロールエリアが文字化けする)、 1行スクロールする毎にスクロールエリアを丸ごと書き直している為です。
  • GDIモード(422氏+らふ氏の表示モード)は、MS-Windwos 専用です。 Unix系の CUIモード(ASCIIモード)の表示速度は、 rxvt辺りの高速表示ターミナルを使えば MS-Windows の GDIモード並になるので、 GDIモードいらないし。
  • SDLモードで動かす場合、SDL の loadso と thread を有効にしてあると、 動作が不安定になったりクラッシュして落ちたりします。
    loadso の方は、単なる構造上の問題。
    スレッドの方は、理由は不明、私も知りたい。
  • 香り屋版 iconv.dll を使うと、Runtime error が出て 強制終了してしまう事があります。 これは香り屋版 iconv.dll の仕様です。
    Runtime error を出さない設定になっている Sylpheed版 iconv.dll 等に交換して下さい。
  • patch を実行する時は、改行コードを、 使用しているOS の改行コードに合わせてから実行して下さい。

コンパイルに必要な物:Required Softwares to Compile It

  • unzip (zip が解凍できれば、別の物でも良い)(Uncompresser for zip. Another software is acceptable.)
  • bzip2 (bz2 が解凍できれば、別の物でも良い)(Uncompresser for bz2. Another software is acceptable.)
  • nkf (改行コードが変換できるソフトであれば、別の物でも良い)(End-of-Line Character Converter. Another software is acceptable.)
  • iconv (内部文字コードを CP932 に変更する場合のみ)(Japanese Edition only)
  • patch
  • fpc : Free Pascal Compiler
  • fpc-pthreads (Unix系のみ)(Unix-like OS only)
  • fpc-x11 (CUI(ASCII)モードと MS-Windows では不要)(SDL-mode on Unix-like OS only)
  • libiconv
  • SDL (SDLモードのみ)(SDL-mode only)
  • SDL_image (SDLモードのみ)(SDL-mode only)
  • SDL_ttf (SDLモードのみ)(SDL-mode only)
  • fpc-sdl (SDLモードのみ)(SDL-mode only)
  • xorg か xf86 (CUI(ASCII)モードと MS-Windows では不要)(SDL-mode on Unix-like OS only)

実行に必要なライブラリ: Required Libraries When Running GearHead

  • libiconv
  • SDL (SDLモードのみ)(SDL-mode only)
  • SDL_image (SDLモードのみ)(SDL-mode only)
  • SDL_ttf (SDLモードのみ)(SDL-mode only)
  • png (SDLモードのみ)(SDL-mode only)
  • xorg か xf86 (CUI(ASCII)モードと MS-Windows では不要)(SDL-mode on Unix-like OS only)

コンパイルの仕方: How to Compile

  • オリジナル版総本山から
    • GearHead-1 のソースコード(gh-1100-src.zip)
    • GearHead-1 のSDL用画像データ(gh-1100-sdlimage.zip)(CUI(ASCII)モードでは不要)
    を、 ここのサイトから、
    • ソースコードのオリジナル版からの差分 (gearhead1100i18n.src.diff.bz2) もしくはソースコード丸ごとパッケージ (GearHead1100i18n.src.zip)
    • データのオリジナル版からの差分のうち、使用したい言語の物 (gearhead1100i18n.txt.*.diff.bz2) もしくはデータの丸ごとパッケージ (GearHead1100i18n.txt.*.lzh)
    を、 入手します。
  • 適当な作業領域に展開します。
  • 差分ファイルから必要なファイルを作ります。
    • 丸ごとパッケージを利用する場合は、この段落の作業は不要です。
    • GearHead-1 のソースとデータの文字コードと改行コードを、 内部処理用の物に変換します。
      内部処理用の文字コードには、 UTF-8(漢字圏の言語を使用する場合)や ShiftJIS や CP932 を使用しない事をお薦めします (MS-Windows や、ロケールが UTF-8 の GNU/Linux でも)。 UTF-8 の場合は表示メッセージが途中で途切れたり(Pascalの仕様)、 ShiftJIS や CP932 の場合はコンパイルができなくなったり (使用するコンパイラによって違う)、 する場合があります。
      Unix系OSの場合、まず、オリジナル版の改行コードを変更します。 改行コードを LF にするならば、 Bourne Shell系のシェルからなら、
      $ cd GearHead
      $ for FOO in *.pas *.inc *.pp */*.txt
      > do
      > mv $FOO $FOO.org
      > nkf -Lu < $FOO.org > $FOO
      > touch -r $FOO.org $FOO
      > done
      
      を、csh系のシェルからなら、
      % cd GearHead
      % foreach FOO (*.pas *.inc *.pp */*.txt)
      foreach? mv $FOO $FOO.org
      foreach? nkf -Lu < $FOO.org > $FOO
      foreach? touch -r $FOO.org $FOO
      foreach? end
      
      します。
    • パッチを当てる。
      内部処理用の文字コードを EUC-JP にする場合は、
      % bzip2 -dc gearhead1100i18n.src.diff.bz2 | patch -p1 -N
      % bzip2 -dc gearhead1100i18n.txt.*.diff.bz2 | patch -p1 -N
      
      とします。
      内部処理用の文字コードを UTF-8 にする場合は、
      % bzip2 -dc gearhead1100i18n.src.diff.bz2 | patch -p1 -N
      % bzip2 -dc gearhead1100i18n.txt.*.diff.bz2 | iconv -f eucjp -t utf-8 | patch -p1 -N
      
      内部処理用の文字コードを ShiftJIS にする場合は、
      % bzip2 -dc gearhead1100i18n.src.diff.bz2 | patch -p1 -N
      % bzip2 -dc gearhead1100i18n.txt.*.diff.bz2 | nkf -Lw | iconv -f eucjp -t sjis | patch -p1 -N
      
      内部処理用の文字コードを CP932 にする場合は、
      % bzip2 -dc gearhead1100i18n.src.diff.bz2 | patch -p1 -N
      % bzip2 -dc gearhead1100i18n.txt.*.diff.bz2 | nkf -Lw | iconv -f eucjp-ms -t cp932 | patch -p1 -N
      
      とします。
      I18N版では、 ソースコード内でのメッセージデータの直接記述を完全に排除した為 (ISO8859-1 での記述は一部残留)、 ソースの文字コードを変換する必要はありません。
  • コンパイルする。
    UNIX系のOS では、設定の自動判定スクリプトを用意してあります。
    多言語版 SDLモードならば、
    % /bin/sh ./build.sh sdl clean build
    
    とします。
    標準設定では内部処理用の文字コードは可変になっています。 内部処理用の文字コードを固定したい場合、 1文字1バイトの文字コード固定に変更した場合は encoding_singlebyte を、 EUC-JP 固定に変更した場合は encoding_eucjp を、 EUC-KR 固定に変更した場合は encoding_euckr を、 EUC-CN 固定に変更した場合は encoding_euccn を、 EUC-TW 固定に変更した場合は encoding_euctw を、 UTF-8 固定に変更した場合は encoding_utf8 を、 ShiftJIS 固定に変更した場合は encoding_sjis を、 CP932 固定に変更した場合は encoding_cp932 を、 指定して下さい。
    多言語版 CUIモード(ASCIIモード)ならば、
    % /bin/sh ./build.sh cui clean build
    
    とします。
    GNU/Linux や Solaris 等で、 OS標準添付の gconv等の iconv互換モードを使わず、 別途インストールした libiconv1 を使う場合は、 SDLモード、CUIモード(ASCIIモード)共に、 nolibiconv_plug nolibc_iconv オプションを追加して下さい。
    MS-Windows方面の場合、一般的な環境では コンパイラオプションの自動判定スクリプトの実行に 必要なソフトがインストールされておらず使えませんので、 ./build.sh の初めの方に書いてある能書きを見て、 必要なものをコンパイラオプションとして指定して下さい。
  • ./arena や ./arena.static や .\arena.exe が出来上がったら、 *.pas と *.inc と *.pp と xterm-boxdrawing/* と build.* と *.ppu と *.o は消しても構いません。
  • SDLモードの場合、 gharena.cfg の FontFileBig と FontFileSmall を 使用したいフォントに変更します。 フォントを間違えると、 英語だけしか表示されなかったり(英語以外が□になったり)、 文字が表示されなかったり(□になったり)します。
  • 実行する。
    環境変数 GEARHEAD_LANG か環境変数 LANG に、 画面表示と文字入力に使う文字コード(ロケール)を設定して下さい。 EUC-JP ならば ja_JP.eucJP、 EUC-KR ならば ko_KR.eucKR、 EUC-CN ならば zh_CN.eucCN、 UTF-8 ならば ja_JP.UTF-8、 ShiftJIS ならば ja_JP.SJIS、 ISO8859系ならば ??_??.ISO8859-?、 です。 EUC-TW を使いたい場合は環境変数 GEARHEAD_LANG に zh_TW.eucTW、 CP932 を使いたい場合は環境変数 GEARHEAD_LANG に ja_JP.CP932、 と設定して下さい (環境変数 LANG で指定すると、他のソフトに悪影響が出る恐れがあります)。 ロケール指定を省略した場合、 メッセージデータ内で指定した標準設定が使われます (日本語用メッセージの場合は UNIX系では EUC-JP、MS-Windows系では CP932)。
    あとはプレイするだけ。
    % ./arena
    
    もしくは
    > arena.exe
    
    Let's enjoy.



雑記(Scrawls)

個人的な与太話 (Poor Pieces of Writing)

GearHead の存在を知ったのは 2005年下半期頃。 Roguelike方面で名前が出されていた。 どんな物か調べ始めたのは 2006年2月。 web で検索すると、JunkMetal(鉄屑)方面でも名前が出ていた。 でも手を出したのは 2008年2月だったり。 そして JNetHack for PC-9801 の時と同様、 移植を行う所から始まり……、 そしてまたもや移植で力尽きる。

バトルテックのブームにも メックウォーリアーのブームにも乗れなかったので、 メックのネタが、まるでわからない。

JNetHack に比べて、 日本語化データ集が大きい割に、 日本語化パッチが小さくてコンパイル時間がやたら早いと思ったら、 イベントやシナリオの処理は独自スクリプト言語を使っているのね。 その結果、プログラム本体は小さくなるけれども、 かわりにシナリオ・メッセージデータは大きくなっている。

……、そのキー配置は「ローグライク」では無いと思うのだが。 「ローグライクキー配置」といったら、 hjkl で、ついでに yubn、走る時は大文字。 テンキーを使う様では偽ローグライクキー配置。

そもそも GearHead って、 死ぬ様な目に遭っても死なない (救急病院に担ぎ込まれて助かった事になる)ので、 それは Roguelike ではないと言う話もある。 個人的には、 死んでも死なずにいくらでもやり直せる辺り Roguelike の本流ではないけれども、 ランダムなシナリオ、ランダムなマップ、ランダムな登場人物、と言った辺りで Roguelike の思想を受けているので、 Roguelike の傍流だとは思う。 それ以前に、Roguelike であろうがなかろうが、どうでもいいと思う。

本格派ローグライクキー配置を真面目に検討すると、 Look, Help, UseScenery, AddressBook の4つが、かぶる。 Help は ?、Look は /、UseScenery は a、AddressBook が +。 Attack, CalledShot, FullSpeed が、再びかぶって、 ……きりがないな。 まるっきり最初から再配置した方が良さそう。

……、こんなんでどうだろう。
NormSpeed       g       前進
FullSpeed       G       全速前進
TurnLeft        [       左旋回
TurnRight       ]       右旋回
Stop            @       停止

Dir-UpLeft      y
Dir-Up          k
Dir-UpRight     u
Dir-Left        h
Dir-Right       l
Dir-DownLeft    b
Dir-Down        j
Dir-DownRight   n

ShiftGears      :       ギアチェンジ
Look            /       調べる

AttackMenu      E       攻撃メニュー
QuitGame        Q       ゲーム終了
Talk            c       話す
Help            ?       ヘルプ
SwitchWeapon    w       武器変更

CalledShot      t       狙い撃ち
Recenter        C       中央表示
Get             ,       拾う
Inventory       i       持ち物
Equipment       P       装備

Enter           >       入る
PartBrowser     B       部位表示
LearnSkills     W       スキル習得
Attack          A       攻撃
SelectMecha     M       メック選択

UseScenery      a       周辺物使用
Messages        x       メッセージ
SaveGame        S       セーブ
Enter2          <       出る
CharInfo        \       キャラクター情報

FirstAid        e       応急手当
ApplySkill      Z       スキル使用
Eject           q       緊急脱出
Rest            .       休憩
History         V       メッセージ履歴

FieldHQ         I       (メックの装備を変更)
Search          s       探索
Telephone       T       電話
SwitchBV        z       連射数変更
Reverse         =       後進

SwitchTarget    ;       ターゲット変更
RunToggle       -       速度変更

AddressBook     r       電話帳

ToggleDrawWall  0       壁表示切替

ドアの閉め方が判らなくて、ソースとかシナリオデータとか探した。 UseScenery らしい。 ……、ドアの処理までシナリオマクロになっているのね。

あらためて思うが、日本語版の移植をした方々って、 よくこれだけの量を翻訳したものだと、つくづく驚嘆する。 GearHead の場合、他の Roguelike よりも特にメッセージが多いから……。

オンライン版ギアヘッドが欲しいと言うのは同意。 でもやる余裕など無い。 開発とプレイの両方の意味で。

GearHead-2 を日本語化・多言語化しようとする方へのメモ(Memorandum for future pioneers of I18N GearHead-2)

まず、何はともあれ、ソースコード中に日本語を直接記述すると、 日本人以外には扱えなくなりますし、 違う OS を使っている人が扱えなくなります(再移植が必要になる)。 メッセージ分離型ローグクローンの要領で、 MsgString() 使うか、I18N_MsgString() を実装するかして、 外部ファイルに吐き出す必要があります。

上記の文中でも何度も言っていますが、 漢字を使う言語を UTF-8 で記述すると文字数制限が(略)、 ShiftJIS や CP932 で記述するとコンパイルできなかったり Pos() かますと日本語2バイト目を ASCII と誤判定して文字列データが壊れてしまったり 文字列の先頭からパースしないと文字の区切りが(略)、 ISO2022 はロッキングシフトの扱いが面倒だし 文字列の先頭からパースしないと文字の区切りが(略)、 EUC だと文字列の先頭からパースしないと文字の区切りがわからないし(略)、 UTF-16 な WideChar型はコンパイラの対応が不完全で表示できなかったり(略)、 さあ、どれがマシだ?。 文字列の扱いを、全て C型文字列に交換すれば文字数制限は無くなりますが、 ソースの変更量が莫大な量になります。 覚悟を決めて C型文字列に変更すれば、余計な制限は無くなるのですが。

ソース中の StatName や KeyMap など、 配列変数で記述されているメッセージは、 シナリオデータでの参照用タグとしても使われているため、 直接翻訳してしまうと、 プロット機能が動かなくなるとか、キーカスタマイズができなくなるとか、 問題が発生します。 よって、画面に表示する直前に、翻訳しなくてはなりません。

同様に、メックデータやパーツデータやアイテムデータやモンスターデータでも、 Name <> タグや Caliber <> タグなどは、 名前の定義だけではなく参照用タグとしても使われているため、 タグの内容をそのまま翻訳してしまうとシナリオが動かなくなります。 その為、GearHead-1 I18N では、 オリジナル表記のタグと、翻訳後のタグの両方を持ち、両方のタグを検索する、 と言う方針をとりました。

言語によって語順が違う為、 ReplaceHash() を多要素対応版に交換する必要があります。 オリジナル版の ReplaceHash() は語順固定専用なので注意、 メッセージデータを見ると一見多要素対応にも見えますが、 単に ReplaceHash() をネストして呼び出しているだけです。 ReplaceHash() を多要素対応にした後、 既存のメッセージデータも語順可変用に書き換えないといけません。

gears.pp の SAtt系関数では、< と > を特殊用途に使用しています。 文字列中に < や > が含まれていると、処理がこけます。 それから FormatChatStringByGender() では % を特殊用途に使用しています。

オリジナルの ExtractWord() は、スペース(#$20)を単語の区切りとして処理し、 1つの単語は1行の中で表示しようとします。 従って、日本語の様に、 文の先頭から最後尾まで一切スペースを含まない文字コードの場合、 1文丸ごと1行で表示しようとするか、 多バイト文字コードの途中で切ってしまうかして、 画面からはみ出たり文字化けを起こしたりします。

オリジナルの ExtractWord() の呼び出し側は、 単語毎に分割された文字列を再連結する際にスペースを挿入します。 よって、ExtractWord() を日本語・多言語化するだけでなく、 ExtractWord() を呼び出した側の再連結部分も 日本語・多言語化する必要があります。

オリジナルのままだと、文字列の表示に必要な幅を計算する際に、 Length() の返値をそのまま使っています。 多バイト文字コード対応の処理に書き換える必要があります。

オリジナルのままだと、文字列の表示がはみ出す場合のトリミング処理として、 Length() して Copy() している為、 多バイト文字コードの途中で切ってしまう場合があります。

上に述べてきた様な、「特に危ない処理」は、 texutil.pp に集中していたかと。

FreePascal の Write() や WriteLn() は、 OS によっては2バイト文字コードの表示に対応していない場合があります。 また、多バイト文字コード(UTF-8 や EUC の3バイト文字など)の表示には 一切対応していないと思われます。

ファイル名は、英数以外は適当にエンコーディングした方が無難かと思われます。

これまでのところ、翻訳する時、固有名詞は英語表記のままにする、 と言う方針が立っています。 翻訳担当者によって訳が違うとプレイしていて意味がわからなくなるし、 翻訳単語を決定するにも意見が乱立してまとまらないし、 r と l の違いがわからなくなるとか、 微妙なニュアンスが、とか。 色々あって。

そもそも根本的なプログラムの作り方の問題がありまして。 オリジナルのソースでは、 「とある一群の処理の最初に静的変数にポインタを代入してから、 分岐した先でその静的変数を使って処理を行う」 と言うソースの書き方が頻繁に行われているのですが。 ソースをじっくりと追いかけていくと、

  • 処理の引数として変数が渡される。 取り敢えず、 処理を[処理 P1]、 引数の変数を[変数 V]と呼ぶことにする。
  • [変数 V]へのポインタを静的変数[静的変数 SVP]に代入。
  • 一旦、[処理 P1]の呼び出し側[処理 P0]に戻る、 もしくは、別のソースに書かれている処理[処理 P2]に移動する。
  • [処理 P0]とか[処理 P2]の中の処理で、[変数 V]のメモリを解放。
  • [処理 P1]の続きを呼び出す、もしくは[処理 P1]に戻る。
  • [処理 P1]の続きの処理で[静的変数 SVP]を使って処理を行う……。 ……行うんだけれども、 [静的変数 SVP]の実体である[変数 V]は既に存在していないので、 存在しない領域、あるいは、別の変数に再利用されている領域に対して、 読み書きを行ってしまう。

ということを行っている問題があります。 世に「不正なメモリアクセス」 (英語に訳すと Memory Access Vulnerability かな?) と言われるものです。 ……。 これの完全で簡単な解決方法って……無いのだよね。 「スマートポインタもどき」の処理を実装するか。 地道に全てのソースを読んで治すか。 あるいは諦めて「プレイを終了するまでメモリ解放をしない」 ようにしてしまうか。 ……、 拙作版では、この3種を混合して対策としています。

win32 にて fpc-2.2.4以降を使うと、cui(ASCII)版にて文字化けしました。 fpc-2.2.2 を使って下さい。

すまん、あと何があったか忘れた。


Last modified on Mon,20 Aug,2012.
This contents was founded in Sun,24 Feb,2008.
FENIX ほめぱげ
G-HAL ほめぱげ
roguelike に関するウダウダ
→→ GearHead の迷宮。Mecha, メック, そして Mech / The Labyrinth of GearHead RPG
Mail to, メールはこちらへ
Suggestion Box, 投書箱
BBS, 掲示板 UserName:BBS、Password:BBS
(C) 2008 G-HAL