マップデータを解析する(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解析のトップへ戻る

トップへ戻る