上に戻る
jsr $0001;マップをちょこっとだけ弄る
概要
 ゲームソフトの改造にもイロイロありますが、私個人としては、マップ改造は欲しい点だと思っています。
 ということで、ちょこっとだけ弄る方法を考えてみます。
マップ構造
 X3において、マップは、ファミコンロックマンと似たような形式で保管されていました。
 すなわち、8x8のグラフィックを、2x2組み合わせて、16x16のカタマリ(以下、チップと呼ぶ)を作り、チップを2x2組み合わせて、32x32のカタマリ(以下、タイルと呼ぶ)を作り、タイルを8x8組み合わせて、256x256のカタマリ(以下、ページと呼ぶ)を作り、それを並べていました。まとめると……
ドット数一つ↑の部品を
いくつ並べたか
このウェブサイトでの呼称
8x8--グラフィック(※普通コレをタイルと言います……)
16x162x2チップ(ちなみにこの段階で判定情報を持ちます)
32x322x2タイル
256x2568x8ページ
8192x409632x16マップ
 ファミコンロックマンと違う点が2つあります。
 まず、「ページ」は、32x16分配置されて広いマップを構成するという点。
 もう一つは、ステージをロードしたときに「チップ」単位に展開された状態でRAMに抱えるという点。
 前者ですが、32x16のうち、エックスが行かない部分は、大抵真っ黒なベタ塗りであり、行く部分だけ有効なページが存在しています。
 イメージですが、↓こんな感じです。数字は「ページ」の番号を表します。(※こんなステージありません)
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 00 00 0E 0F 10 11 13 15 00 00 00 00 00 1D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 00 00 0D 00 00 12 14 16 17 18 19 1A 1B 1C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 00 00 0C 00 00 00 00 00 00 00 00 00 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 00 00 0B 00 00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 00 00 0A 00 00 00 00 00 00 00 00 00 21 22 24 26 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 05 07 09 00 00 00 00 00 00 00 00 00 00 23 25 27 28 29 2A 2B 00 00 00 00 00 00 00 00 00
 01 02 03 04 06 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
(※ちなみに、最大で3E?ページ使っているステージがありました(ホーネックステージ))
 非等角フォントで微妙にずれているとか気にしてはいけません。あと、実際は、上から順番に番号が埋まっていく仕様のようです。

 後者ですが、「チップ」単位に展開されたことで、変化する地形が容易に実装可能になっています。
 実際、エックスシリーズには、地形が破壊されたり、変化するシーンが多く存在します。
 ファミコンロックマンシリーズでも、一応あるにはあったのですが、そうじゃなくても遅いプロセッサで、地形判定に例外的な処理をかけていたりしたので、処理が重くなる原因にもなっていました。
何処を弄りましょ?
 諸事情があり、「マップ」すなわち、「ページ」の配置を弄ることは少々面倒です。
 諸事情とは、まず、スクロール制御の都合上あまりページの配置を変えて、全体のマップの形を変えられないことと、あと、「マップ」データだけなぜか少し微妙に圧縮がランレングス法?でかかっている点もあります。
 ということで、「ページ」を構成する、「タイル」をチマチマ弄っていけたらいいなーと思うわけです。
 つまり、32x32単位でマップを操作します。こう書くと、ファミコンロックマンで、それを行った経験がある人が結構居るのではないでしょうか……
で、どーすんのよ
 アドレス068A22から、ステージ毎に3バイトずつ、「ページを構成するタイル」へのアドレスがあります。アドレス表記については、前書きを見てください。
 イレギュラーハンター本部ステージはそのまま068A22、ホーネックステージなら、3を足した068A25から3バイトがアドレスになっています。
 その3バイトですが、そのまま、このコンテンツで使うアドレス表記で読めます。本部ステージであれば、00 80 38とデータが並んでいるので、388000です。
 こういう事が多いので、このアドレス表記を激しく推奨しております。

 こうして判明したアドレスをたどると、タイル配置のデータにぶつかります。これを書き換えてやりましょう。ただし、タイルは16bitで指定されています。そのため、最初のタイルは00 00、次のタイルは01 00と指定します。1ページのタイル数は8x8=64個ですので、サイズとしては更に2倍の128バイトを1ページ毎に消費します。
 00ページ目は、00 00で埋まっていることが多いでしょう。これは、画面外用のデータなので、書き換えても見かけ上変化がありません。また、本部ステージでは、01ページ目も、画面外用のデータです。02ページ目以降を書き換えると、実際に変化を見ることが出来ます。
 という事で、388100からを16bit単位で適当な値に書き換えてやってみてください。本部ステージボスの前のあたりのマップが書き変わります。
ここまでやって絶望するよねー
 こうやって書き換えるのは、あまりに非現実的です。タイル指定が16bitなので、65536個(正確にはそのほんの一部しか使えないけど)のタイルから選んでページを作っていく事になります……絶対に無理ですねw
 ファミコンロックマンのように既存のタイルを組み合わせてのステージ構築は、理論上は可能で、実際は不可能という事が出来るでしょう。何らかの工夫をしないと先に進むことは出来ません。
 今回は、ちょこっとだけ弄るという題材ですので、ここで手を引くことになります。
簡易書き換えだけなら……
 一つ上で公開されている、RockMac002は、このレベルでの書き換えをサポートしています。使いづらさが半端ないですが、非常に不自由にマップを少し弄ることが可能です。もし興味がございましたら、お試しください。
(190)2011年10月8日 プレさ兵衛
inserted by FC2 system