えりかとさとるの夢冒険で学ぶ、隠しメッセージの探し方

・はじめに

 本記事は4STさんのYouTubeコンテンツ「あなたの知らない隠しメッセージシリーズ」の応援も兼ねて、自力でゲームソフトの隠しメッセージを探してみたい初心者人向けの技術テキストです。

 既に当サイトでは「テキストコンバータを作ろう」という、プログラマ向けコンテンツをアップ済みですが、今回は隠しメッセージを探すために、ROM内に格納されたテキストデータを得るまでをゴールとした簡易版です。

解析ターゲット「えりかとさとるの夢冒険」
 理由は言わずもがな。
 伝説となった「あのセリフ」を元にROMイメージからテキストを得てみましょう。

必要なもの

1.文字コード変換ツールGCCODE type II
 パソコンのプログラムには「半角英数A=16進数41」「半角カナの”ア”=16進数B1」「全角かなの”あ”=シフトJISで16進数82 A0」など、文字コードと呼ばれる値が割り当てられています。
 一方、昔のゲームソフトは「ひらがなの”あ”=16進数0B」など、パソコンとは全く互換性の無い文字コードが使われているため、そのままでは読めません。
 ふつうは文字コードの変換法則を探すのは大変なのですが、それを補助するツール
「GCCODE2」を用意してますので、ご活用ください。
https://i486.mods.jp/ichild/get-character-code-type-ii-gccode2

2.ファミコンソフト「えりかとさとるの夢冒険」
 ソフトはハードオフのジャンクで500円くらい。
ちゃんと動作テスト済みのものは駿河屋で1,500円くらいです(2021年現在)。

3.カセット吸い出しツール
 昔はメチャクチャ大変でしたが、今はAmazonでたったの5800円でファミコンのROM吸い出しツール買えるので、それを使ってROMダンプしてください。
https://www.amazon.co.jp/dp/B087GGBVMV

 ファミコンだけに限らずいろんなゲームを吸い出したい人は、トータルコスト的に「レトロベースダンパー」をオススメします(※)。
https://www.amazon.co.jp/dp/B084CDGQX3
※本来メガドライブ用の吸い出しツールですが、別売りのレトロアダプターと組み合わせてファミコンやワンダースワンにも対応できます。

 ちなみに、ダンパー公式サイトには「ちゃんと説明書を見ろ!」的なコトが書かれていますし、逆挿ししたり使い方を誤ると普通にハードウェアがぶっ壊れるリスクが高いので、公式サイトで説明を読みながら慎重に作業しましょう
 まあ、普通にカセットを挿して公式サイトのFCダンパーでInfo→Dump→保存、だけなんですけどね。

3.エミュレータ
 個人的にはFCEUXが好きですが、ターゲットとなるゲームソフトが動くのであれば何を使ってもOKです。

4.テキストエディタ
 詳しくは後述しますが「テーブルファイル」を作るのに使います。
昔はWindows付属のメモ帳でも良かったのですが、最近はデフォルトでUTF-8保存になっていて色々面倒くさいので「EmEditor Free」などがオススメです。
https://jp.emeditor.com/text-editor-features/history/emeditor-free/

~ 隠しメッセージを探す作業スタート ~

1.エミュレータ上でゲームを進行し「文章が表示されているシーン」で停止。

2.GCCODE2を起動したらF1キーを押して、ROMイメージを選択。
 16進数の数列や文字化けしたテキスト情報が表示されたらOK。

3.ウインドウ右下の「検索用文字列」に【半角カナ】で表示されているテキスト内容の一部を入力する。

(例)
これからのひととき→コレカラノヒトトキ

 ※GCCODE2 v1.30で「全角かな→半角カナ変換ボタン」が追加されたので、そのまま「これからのひととき」と入力して変換してもOKです。

4.「バイト検索」を押して、直下のサーチ欄に項目が出てくれば成功。
 該当した行をダブルクリックすると自動的に変換パラメータ(差異A6)がセットされ、文字列の格納されているアドレスまでジャンプ。
 ここで、文字化けしていた表示が「そこそこ読める内容になれば成功」です。

5.この状態でF3キーを押し、ダンプファイル保存ウインドウが開いたら適当に「dump.txt」とでも名前を付けて保存。
 これをテキストエディタで開いて「えりかとさとる」とでも検索すれば、特徴的な文章がヒットします。

<TIPS>別のゲームを解析する時のコツ

 今回は「コレカラノヒトトキ」と検索して一発でヒットしましたが、ゲームによっては文字の並びがPCと不一致していて、見つからない場合があります。
 その時は半角の「?」で読み飛ばす=ワイルドカードが使えるので、うまく活用してください。

(入力例)
コ?カ?ノヒトトキ
=ら行をわざと検索対象から外すテクニック。

~ 隠しメッセージの精度をもっと上げる ~

「さあ、このまま禁断のひでむし氏のメッセージを……!」
そう思ってテキストを見ると

 なんとなく「例のメッセージ」であることはわかるものの、歯抜けだらけで文章として読めるかと言うと微妙です。
 この理由は記事冒頭で紹介した別記事「テキストコンバータを作ろう」で詳しく説明していますが、文字コードの並ぶ順番がパソコンと共通していない文字は全て化けます。
 ここで、GCCODE2の「16進数表示に反映」のチェックを外し、えりかとさとるの夢冒険の「例のメッセージ」冒頭に注目してみましょう。

表示「なつかしいKき く か な かれてる し ないか.」
本来「なつかしい きょく゛か改な゛かれてる゛しゃないか。」(改=改行)
16進「1F1C10160CA5113C123E10F01F3E10341D333E163A1F0C1079」

 これで各文字に割り当てられている文字コードが判明し、スペースがKに化けていたり、濁点がうまく表示できていないことが分かります。
※本来「か゛」となるべきが「゛か」とひっくり返っているのは「えりかとさとるの夢冒険」のプログラム仕様なので、ここはどうにもならないです。

 この文章を正しく変換するには「A5はKではなくスペースにする」「3Eはスペースではなく濁点にする」のように、正しい置き換えパターンをこちらから指示する必要がありますが、これはGCCODE2に同梱している「フォントテーブル(テンプレート).txt」というファイルを用いることで実現できます。
 このファイルをテキストエディタで開くと、下記のような16行のテキストデータで構成されています。

000102030405060708090A0B0C0D0E0F
101112131415161718191A1B1C1D1E1F
202122232425262728292A2B2C2D2E2F
303132333435363738393A3B3C3D3E3F
404142434445464748494A4B4C4D4E4F
505152535455565758595A5B5C5D5E5F
606162636465666768696A6B6C6D6E6F
707172737475767778797A7B7C7D7E7F
808182838485868788898A8B8C8D8E8F
909192939495969798999A9B9C9D9E9F
A0A1A2A3A4A5A6A7A8A9AAABACADAEAF
B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF
C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF
E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF
F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF

 大半の人は「なんのこっちゃ?」になると思いますが、このテーブルファイルは00 01 02 03……という文字コードを密集させた構造になっており、ここに正しい文字を入れてやることで、明示的に「正しい文字コード」を指定することができます。

・テーブルファイルを完成させる手順

1.ひでむし氏のメッセージの「あのころ」は「0B 23 14 35」だったので「あ=0B」と確定。文章を読むと「わ=36」もおおよそ特定できる。

2.テーブルファイル1行目の0Bから「あいうえおかきくけこ…」をひたすら入れる。
 今回の場合は、下記の4行をテーブルファイルの上4行に上書きコピペすればOK。

000102030405060708090Aあいうえお
かきくけこさしすせそたちつてとな
にぬねのはひふへほまみむめもやゆ
よらりるれろわ3738393A3B3C3D3E3F

3.ここまで入力したところでテーブルファイルを保存。GCCODE2でF2キーを押してテーブルファイルを読み込ませる。

 これまでのような文字化けの代わりに「なつかしいA5き3Cく3EかF0な3Eかれてる」のように、適切な文字が割り当てられていない箇所に16進数2桁の値が入りました。
 勘の良い人は気づいたと思いますが、テーブルファイル11行目11文字目のA5を全角スペースに置き換え、4行目25文字目の3Cを「ょ」に、2つ隣の3Eを濁点に置き換えて「テーブルファイルを再読み込み」ボタンを押すと「なつかしいきょく゛か」を得られます。
 そして、穴埋め→読む→穴埋め→読む~~をひたすら繰り返して得られたのが下記のテーブルです(コピペして使ってね)。

000123456780Aあいうえお
かきくけこさしすせそたちつてとな
にぬねのはひふへほまみむめもやゆ
よらりるれろわをんぁゃゅょっ゛゜
アイウエオカキクケコサシスセソタ
チツテトナニヌネノハヒフヘホマミ
ムメモヤユヨラリルレロワヲンァィ
ゥェャュョッ!?・。、CDEFG
HIJKLMNOPQRS8C8D8E8F
909192939495969798999A9B9C9D9E9F
A0A1A2A3A4 ーA7A8A9AAABACADAEAF
B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF
C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF
E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF
   F3F4F5F6F7F8F9FAFBFCFDFE 

・他のゲームで隠しメッセージを探すには?

 えりかとさとるの場合、ひでむし氏がめちゃくちゃ凝り性だったゆえにゲームの隠しコマンドとして埋め込まれていましたが、一般的には「テーブルファイルを作成→ダンプファイルに出力→ひたすら目視!!」のような、アナログな方法で見つかるかと思います。
 そもそも英語で隠しメッセージを忍ばせてる場合は、ふつうにパソコンで読める文字コードの場合もあったりしますので。

 ただし、ファミコンソフト後期になるとROM容量を極限まで削り落とすためにデータ圧縮が用いられるケースも多いので、見つからない時はスパッと諦めて次を探しましょう。
 ……あと、稀に「これは表に出したらアカンやつ」みたいな隠しメッセージが見つかる場合もありますので、そういった時限爆弾を見つけてしまった際は、自分の心の中にだけそっと留めておきましょう。

・ちゃんと読めるテキストデータに変換したい!

 GCCODE2は単純に文字を置き換える機能しかないため、ゲームによっては正しい変換結果を得られない場合があり、今回の「えりかとさとるの夢冒険」においても、濁点や半濁点が逆になる(「か゛」が「゛か」になるなど)の問題もありました。

 たとえばドラクエ1などは「F2=勇者の名前、B1=じゅもん、など1バイトに単語を格納しているパターン」があり、そういったゲームは「読めるけど文章としてはおかしい」結果になります。
 また、GCCODE2では全範囲を切り出してダンプ保存するので、当然ながら関係の無いゴミデータもまとめて変換してしまいます。

「俺は隠しメッセージを探すだけじゃなくて、ストーリーも読みたいんだよ!」

 ……という人のために下記ツールを作りましたのでご活用ください。

スクリプト実行式テキストコンバータ「TECONVS」
https://i486.mods.jp/ichild/teconvs

 同ツールであれば単語置換や改行挿入、濁点の順番入れ替えにも対応できます。
 サンプルスクリプトに「えりかとさとるの夢冒険の変換スクリプト」を同梱していますので、そちらもあわせてご覧ください。



以下、もっと踏み込んで行きたいマニア向け。

家庭用ゲームのテキストコンバータを作る!
https://i486.mods.jp/old/convert/convmain.html
 2003年に書いた超絶大昔のコンテンツで、GCCODE2の前身となる旧GCCODEを使っているため解析手順は異なりますが、概念そのものは今も応用が利きます。