マップデータを解析する(3):境界パターンデータ 〜A River Runs Through It〜
前回の最後で、差分データのフォーマットについて例を紹介しました。
しかし、ZANACのマップには、この差分データ形式では表現が難しそうなものがあるのです。
できればここでゲームを実行してみてください。
1面の初めから、イコン×2、茶色い土の上のイコン、1番と2番の特殊兵器コンテナが順に表示されていきますが・・・
(ちなみにこれらは全て、差分データにより表示されています)
それらに加え、画面の左から青い川が出て来ますね。
このような川を表現するには、どのようなデータ形式が最も有効なのでしょうか?
差分データ方式を使う方法(川全体のグラフィックを保持しておいて描く方法)では、川の長さが数画面にも及んだ場合、データ量も膨大になってしまいそうです。
ただし、ゲーム画面をじっくりみると気づきますが、川のグラフィックにおいても、デフォルトパターン同様に一定の繰り返しが見られます。
そのため、最初は「川は一定の長さで差分データに区切られる」という仮定の元、川の差分データを探してみましたが、そのようなデータは存在しないようでした。
川岸を辿る
次に着目したのが、川岸のパターンデータ列です。
1面で初めて出現する川の、川岸(陸地と川、川と陸地の境界線)に注目してみます。
先ほど、「川は一定パターンの繰り返しのようだ」と書きましたが、川岸についても同様に、パターンの繰り返しがあるようです。
一旦、エミュレータの画面をハードコピーに取った後、川岸を8×8ドットのパターンに分け、パターン番号を控えてゆきました。
ここで重要なのが、「川岸を下から辿る」ということです。
なぜなら、画面は下に向かってにスクロールしているので、早くに描かれた絵ほど画面下に行くことになります。
早く描かれるデータほど、マップデータの格納順序も前に来ることになるでしょう。
上の図は、川岸のパターン番号を画面下から、両岸について調べた結果のサンプルです。
(パターン番号は変えてあります。)
川岸のデータを下から読み上げ、川岸のデータ列を得ます
(右の岸なら、1B, 2D, 27, 2D, 2B, 29, 27・・・)。
そのデータ列を、ROMファイルの中から検索機能を使って探してみますが、見つかりません。
岸のデータ列がそのまま格納されているのではないようです・・・
と、ここで、『マップデータを解析する(1):マップデータ形式調査』のmapview.exeを実行してみてください。
実行したら、「1画面下へ」を4〜5回押し、アドレスの+9b64からのデータの並び方を見てください。
この辺りからのデータは、なぜか水面と緑の平地の境界のパターンが多いようです。
また、境界のパターンとパターンの間に、「必ず」2バイトのデータが挟まっているようです。怪しい!
ということで、次にアセンブリソースを開き、この辺りのデータを見てみます。
「00か01が2バイト並んで、その次に5B〜6Fが1バイト」
という感じで並んでいませんか?
先ほど調べた、川岸のデータ列もきっとこの中にあるはずです。
ちなみに、『コードはどこだ?データはどこだ? 視覚的にコード/データを区別する』で出てきた
patview.exeで調べると、パターン番号5B〜6Fは、緑の地面と水面の境界線に使われるパターンです。
以上から、これらのデータを「境界パターンデータ」と呼ぶことにします。
境界パターンデータ
<マップ境界パターンデータフォーマット>
xd xw :X増分とX方向の幅を示す2バイト
g1 g2 ・・・ :xwのバイト数のグラフィックデータ
境界パターンデータのフォーマットは、前回出てきた差分データフォーマットと似ています。
最も大きな違いは、Y方向の大きさ(厚み)が1に固定されていることです。
この近辺では、xd(X増分)=0 or 1, xw(X方向の幅)=1のデータが多いようです。
今回の調査では、差分データで描くのが難しいと思われる、マップを流れる川に注目し、
境界線を表すマップデータの形式を「境界パターンデータ」と名付けました。
ただし、「川岸の描き方は判ったけれども、川のもっとまん中の部分は?」と思われる方も多いでしょう。
次回はその辺りを調査したいと思います。
ZANAC解析のトップへ戻る
トップへ戻る