Piで圧縮プロキシテキストコンバータを作ろう※2015.2.22に「変換プログラム開発」を追記しましたゲームラボ2015年3月号54~59ページにおいて『ドラクエ1に含まれているテキスト情報を抽出する方法』=テキストコンバータを解説しています。当コンテンツはそのアシストも含めて、これから挑んでみたい初心者の方向けにテキストコンバータの作り方を解説します。ともえりかとさとるの夢冒険くらい超ド級の隠しメッセージが新たに見つかることを願います。「全角”あ”が16進数0xA082」のように共通仕様になっていますが、ファミコンやスーパーファミコンなどの旧ハードでは独自仕様になっていることが多いため、大抵は解析しなければテキストを読めません。2ゲームソフトが新しすぎるとテキスト変換がそもそも不要PS2あたりになると普通にPCと同じ文字コードだったりします。3暗号がかかっているとアウト排他的論理和(XOR)マスク程度で外せる軽度なものなら大丈夫ですが、シフトを組み合わせた高度なものやGZ圧縮などには太刀打ちできません。エミュレータでゲームを走らせながらemuhasteなどでメモリダンプして平文になった状態のデータを解析すると行ける場合があります。4身につけた知識があらゆるゲームソフト解析の基礎になるテキスト変換に成功し、アイテムリストやモンスターリストを生成できたら、それを元にアイテムの売買価格リストやモンスター能力値リストも作れます。攻略本または攻略サイト、TAS動画を作りたい人は学んでおいて損はありません。<必要なもの>1解析したいゲームソフト元となるゲームが無ければそりゃムリでしょう。8」あたりでROM吸い出し。プレステやサターンはCDからファイルコピーで行けます。3テキストコンバータ支援ツールGCCODE2ウチのダウンロードページから落とせます。0.0.9.0「インストール不要なZIP版」を使う想定で説明します(設定不要なのが楽で良いですね)。<試しにSFCドラクエ5をGCCODE2で開いてみる>gccode2を実行したらF1キーを押してDQ5のROMイメージを開く。GCCODE2は6つの表示エリアから構成されており、それぞれを組み合わせてテキスト情報を解析する仕組みですが、実際には3と6ばっかり使います。1ヘキサダンプROMイメージなどのデータを16進数表示するエリア。バイナリエディタ代わりに。2アスキーダンプヘキサダンプと同じアドレスにある情報をテキスト表示します。3アスキー変換ダンプアスキー情報を半角→全角、カナ→かな変換して表示します。4フォントテーブル設定F2キーを押して後述の「テーブルファイル」を読み込んだ時のみ使います。基本的にココを直接触ることはほとんどありません。「フィルタリング出力を利用する」をチェックすると、2と3のテキスト枠がユーザ操作に基づいてリアルタイムに変動します。「16進表示に反映」をチェックすると1のヘキサダンプの内容が変動します。実はユーザ自身で操作することはほとんど無いです。6テキストサーチ機能ゲーム中に表示されるメッセージ(テキスト)の一部を入力して検索すると、その文字列の法則性を元にデータを解析し、差異を求めます。操作の9割以上はココを触ることになります。<SFC版ドラクエ5のモンスターリストを生成してみる>SFC版ドラクエ5は独自文字コードを採用しており、ROMファイルをバイナリエディタなどで開いてもサッパリ内容が読めません。GCCODE2のテキストサーチ機能で差異情報を抽出すればある程度読めるのですが、手順は下記の通りです。候補をダブルクリックする。2運良く一発で「スライム」らしき情報がヒット一番右上(Dの真下)に「すらいむ」が見つかり、差異6Fに自動でセットされる。「すらいむ」→「スライム」のまま表示させてあげてもOK。~備考~GCCODE2では検索単語を「文字同士の差」で検出しています。-E1スライムは「4文字の間の3つの差が-F6、+25、-E1である」と見なします。62′′...これがDQ5における「スライム」の文字列データです。異なる数列(文字コード)ではあるけど、同じ意味を持つ、と考えます。6Fこれが先ほど「スライム」で検索した時に自動的にセットされた「差異6F」。「本来表示できないはずのDQ5の文字列が読める」のです。゙ト」になっています。本来そこには「とげぼうず」と「せみもぐら」が入ります。゙ルスライム」(濁点で1バイトを使う)になりますが、DQ5は先に「次の文字に濁点を付与する(濁点のデータが文字より先」という処理コードで表現され、濁点は16進数0x84で表現されています。「サーペント」の「横棒(ー)」とカタカナの「ン」の並びがシフトJISと互換性が無いため、数値の差を求めても文字化けしてしまっています。ちなみに横棒は0x78、カタカナの”ン”は0x6Fが割り当てられていました。・「とげぼうず」と「せみもぐら」が見つからない理由GCCODE2で検索した結果は、あくまで「シフトJISの半角カナとDQ5のカタカナ」の差だけに過ぎません。シフトJISには「半角ひらがな」は存在しないため、そちらは個別に検索してやる必要があります。゙す」になると推測されます。GCCODE2にこの文字列を...入れられません。DQ5はひらがなを1バイトで表現していますが、前述の通りシフトJIS(PC)には1バイトでひらがなを表現する規格は無いです。GCCODE2は「あくまで文字同士の差」で検索しますので、ひらがなを調べるのにひらがなを使う必要はありません。濁点の文字コードもシフトJISと互換性が無いので、ワイルドカード(半角ハテナ”?”)で「濁点を無視して検索」します。半角カナで「ト?ケ?ホウ?ス」。上記結果では「アドレス0011C6A2に”差異A1′′」で計算したものが、DQ5のひらがな→シフトJISの半角カナ変換になります。「全角カナ→かな」のチェックを入れておくとアスキー変換ダンプ出力が「全角かな」に変換され、「と%け%ほう%す」と表示されています。※こちらも濁点の差異がシフトJISと互換性が無いため”%”に化けてます。ちなみに「互換性が無い文字を”?”で飛ばす」という考え方は、GCCODE2ではあらゆるシーンに応用できます。記号、制御文字などを”?”で飛ばすことにより、ヒット率を高められます。~備考~プレステやサターンからはメモリ容量が潤沢になり「2バイト文字」を使っている可能性が高くなります。00...」といった感じですね。そこで注意が必要なのは、2バイト文字の検索時に「ワード検索」を使ってもヒットしない場合がある、という点です。GCCODE2のワード検索は「シフトJISの全角と互換性がある文字」を探すので2バイト文字で「あいうえお...」と定義されている場合はヒットしません。(シフトJISは「ぁあぃいぅうぇえぉお」の順で定義されています)。GCCODE2で「独自2バイト文字」を検索したいのであれば「スライム」なら、半角で「ス?ラ?イ?ム」と検索することで「2バイト文字の2バイト目をワイルドカードで無視する」といった対応が必要になります。(備考おわり)<フォントテーブルを作る>これまで説明したように「差異」を用いれば多くの文字を変換できますが、ワイルドカードで飛ばさなければならない文字を個別に処理するのはかなり面倒です。GCCODE2で差異変換した文字を見ていると、DQ5の場合は「あ」が16進数0x10、「い」が0x11...と連続していることに気づきますが、この0x10や0x11をテーブルの番地として使うという考え方があります。イメージはこんな感じ。0x00~0x0Fの内容は不明ですし、「や行」以降のレイアウトもこの段階では不確定なので「ま行」までしか入っていませんが、DQ5で”0x10′′が出てきたら、上の表から「あ」を拾って表示する...このような処理を行うのがGCCODE2の「テーブルファイル機能」です。フォントテーブルのファイル書式は「単に文字を並べるだけ」です。「も」から先の0x33~0xFFの204文字分の全角「?」で埋めればOK。本気でフォントテーブルを完成させたい場合は、どの文字が入るか分からない場所に16進数2桁で番地を書きます。DQ5では0x00~0x0Fが不明なので“000102030405060708090A0B0C0D0E0Fあいうえお...”といった感じです。わからない人は下記ファイルをダウンロードして下さい。試しに「とげぼうず」が該当したアドレスに移動してみると...こんな感じ。