update 2003.09.04

ファミコン版「ドラゴンクエスト」 竜王との会話 コンバート


概要
玉座の裏の抜け道から竜王を追跡し、ついに見つけた!…というこの場面。
竜王の「せかいのはんぶんを…」という要求に冗談半分で思わず「はい」を選び、
闇の世界を貰ってしまった人はどれだけいるのやら…

というわけで今回はこの竜王との会話(しかもバッドエンド)をコンバートしてみます。

半角かな→全角かなの変換も含め、各種制御コードの入り混じったテキストです。
比較的レインボーアイランドの項に似た手法を使いますが難易度が少しだけ高くなります。
 半角かな→全角かな
 制御コード→各種画面処理
に変換し、コマンドプロンプト(DOS窓)に出力する変換ツールを作成します。

準備
この解析・変換ツール作成には以下のものを使用します。
・GCCODE 解析ツール無しだとキツイです。
・バイナリエディタ 数列から内容を解析したり、パターンテーブルを作るのに使います。
・VisualC++6.0 ツール作成用です。Borland C++ Compilter(フリー)で代用できます。

解析
ホントは子供の頃にクリアした勇者の名前だったんですが、セーブステートを書き換えて「ああああ」にしちゃいました。
とりあえず竜王と戦うところまでゲームを進めます。
激しく大変ですが、ネットには最強パスワード生成用プログラムなどがたくさんあるので
それらを使うなりしてこの場面まで進んでください。

ここでGCCODEを起動して「よくきた ああああよ」と検索…って当然ヒットしません。
「ああああ」というのはユーザが勝手に決めた名前ですから、制御コードとして処理されます。
ここは素直に「よくきた」のところだけを検索しましょう。

これでオフセット 0000b481 に一件だけ該当しますが、念のためフィルタリング出力します。
「ヨ ク キ タ  ・ヨ ・・ ワ シ ~  オ ウ ノ ナ カ ノ  オ ウ ・ リ ・ウ オ ウ ・・・ v
激しく文字化けしていますが、まあここが初めの一文と見て間違いないでしょう。

この文章とバイナリエディタのデータを比較しながら、文章を見ていくと……はて?
「そなた」とか「じゅもん」といった単語の文字データが見当たりません。
代わりに文字コードにしてはやたら大きい数値の1バイトコードがあります。
(かな文字は0x10〜0x30程度なのに、この数値は0xb1や0xc8など)

実はこれ、頻繁に使われる単語を定義したものらしく、例えば先ほどの該当位置である
オフセット 0000b481 に C7 C7 C7 C7.... と書き込んだものをエミュレータで読み込み、
竜王に話し掛けると「そなたそなたそなたそなたそなた…」
とまあこんな感じです。

実際にコンバータプログラムを組む際には
1.制御コードを無視した基本的な文章出力プログラムを組む。
2.出力結果を保存し、言葉に抜け・文字化けがあったらコードの値を調べる。
3.個別に処理を行い、正しい文章が出力されるように調整する。
といった地道な方法で少しずつ穴を埋めていきます。

変換画面

変換処理プログラムを組む
今回のように半角→全角変換含め多種多様の制御コードが複雑に絡み合った場合は、
パターンテーブルを用いたコード変換と、制御コードを処理を同時に行います。

詳しいことはアーカイブのプログラムソースやドキュメントを参考にしてください。

Cソース
VisualC++ 6.0で作ったコンバートサンプルプログラムです。
コンパイル済みのEXEファイルやドキュメント・パターンテーブルも同封しています。
プロジェクトは Win32 console application の "Hello,World!"アプリケーション を選択し、
丸ごとメインのソースに上書きすればコンパイル&ビルドができます。
Borland C++ Compilerでは1行目の#include "stdafx.h"を消去してからコンパイルしてください。
>>コンバータ本体・Cソースのダウンロード


TOPに戻る