マップデータを解析する(2):差分データ
前回では、ZANACのマップデータの構成について、「マップデータはマップ片の集まりで構成される」との観点で検証を行ってみましたが、結果、この見方は誤っていたようでした。 今回も引き続き、ZANACのゲーム中のマップ表示の秘密に迫っていきます。

mapview.exeは当初、マップ片を閲覧することを目的に作成しましたが、それ以外にも色々と役立ちます。
例えば、下のほう(ROMアドレスの小さいほう)に移動してゆくと、読んで意味のある文字列が表示されます。
前回の余談で触れましたが、これはパターンの数字と文字がASCIIコードに準拠している為、 ROMファイルの文字列データがそのまま見られるためです。
文字列データの先頭アドレスを控えておき、ソースファイル中でそのアドレスを使って何かしている部分があったら、そこは 「文字列表示ルーチン」かもしれません。

ところで、下のほうに移動する途中、怪しい部分を発見しました。
mapviewを起動し、「1画面下へ」ボタンを一回だけ押してみてください。画面下のほうに、ゲームに登場する「イコン」の絵が見えます。
+a32c(632c)の行の、右端から6パターン(1バイトで1マップパターンを表示している為、)に注目してください。
アドレス増加の方向に追っていくと、ちょうど

  「青背景でイコン下半分の影」「イコン下半分の左」「イコン下半分の右」

その後、無関係な絵が2つあり、

  「青背景でイコン上半分の影」「イコン上半分の左」「イコン上半分の右」

と並んでいますよね?
その後、8パターンほど空け、今度は茶色い背景のイコンの絵が見えます。
また、もう何行か下のほうに下がってみましょう。+a224(6224)行の近辺は、なんだか 地上敵の絵を表しているような・・・

ZANACのゲーム画面を振り返ってみてください。
ZANACの1面で、イコンが初めて表示される画面(左右に1個ずつ、計2個)を良く見てみてください。
前回調べた「緑の24×8」のデータに、先ほどあったイコンのグラフィックを重ねたもの、と捉えられないでしょうか?

ここで新たな推測を行います。

 ・ZANACのマップは、5種類の「デフォルトパターン」と、そこに上書きされる「差分データ」で構成される。
 ・差分データは、グラフィックデータと、そのグラフィックデータの幅や高さ等の情報で構成される。

2番目の推測は、先ほどのイコンのデータにグラフィックデータとしてはおかしな絵が紛れ込んでいた事とも一致します。
早速、調査してみましょう。


マップ差分データの形式
アセンブリソースを開き、先ほどのイコンのデータがあった辺りのデータ(ダンプ表示部)を見てみましょう。
mapviewの左端の、カッコ付きではない方のアドレスです。

まず、イコンの下半分、3つのグラフィックパターンが連続しているところに注目しましょう。
例えば、アセンブリソースのダンプ表示に、

5963: 03 aa   <------aaが下半分の影のパターン番号
5965: bb cc  <------イコン下半分

となっていたら、これを

5963: 03
5964: aa bb cc

このように、グラフィックデータを連続するようにソースを編集してみましょう。
ニーモニック部分は消してしまって構いません。どうせ無意味なニーモニックです。

次に、イコンの上半分の3つのパターンデータ部分を同じく抜き出します。
すると、上半分データと下半分データの間には、2バイトのデータがあります。
"00 xx"となっていて、xx=イコンの横幅になぜか一致しています。
また、下半分データの直前にも同じく"00 xx"があります。
どうやら、グラフィックパターンの前の2バイトは、「続くグラフィックデータの幅」の意味を持つようです。

他のイコン、できれば今のイコンの隣のイコンのグラフィックデータも、同じようにソースを編集してみてください。
これらの2つのイコンのグラフィックデータは、恐らくそれぞれ別の差分データの一部と思われます。
そこで、2つのイコンのグラフィックデータに挟まれた部分は、先ほどの推定で言うところの 『そのグラフィックデータの幅や高さ等の情報』だと推測されます。
いろいろ数字の意味を予測してみましょう。
なぜか、イコンのデータは"00 02"で始まっているようです。

全てのイコンが終わったら、その下のデータも編集してみましょう。
今度は今までの形式と異なり、データ先頭がY方向の高さを表し、2バイト後にグラフィックデータが格納されています。
また、グラフィックデータ直前の2バイトのうちの先頭のものは、どうやら「次の行を描くとき、X方向にいくつ移動するか?」を表すようです。
以上より、差分データのフォーマットの、おおよその見当がつきます。


<マップ差分データフォーマット1:初めの1バイトが00で始まるもの>
  00 yh           :yhはY方向の大きさ(厚さ?)
  ?? ?? ?? ??   :次の4バイト、意味不明。敵キャラクター種別を表す?
  xd xw           :X増分とX方向の幅を示す2バイト
  g1 g2 ・・・    :xwのバイト数のグラフィックデータ
  (以降、「xd xw」とグラフィックデータの組が、「Y方向の大きさyh」だけ続く)


<マップ差分データフォーマット2:初めの1バイトが00でないもの>
  yh               :yhはY方向の大きさ(厚さ?)
  xd xw           :X増分とX方向の幅を示す2バイト
  g1 g2 ・・・    :xwのバイト数のグラフィックデータ
  (以降、「xd xw」とグラフィックデータの組が、「Y方向の大きさyh」だけ続く)


差分データの分割に慣れたら、どんどんソースを編集していきましょう。

ところで、「どの場所に、どの差分データを表示する」というデータは、いったいどこにあるのでしょうか・・・



差分データの分割にも飽きたので、ZANAC解析のトップへ戻る

トップへ戻る