地形容量を増やす


地形編集をしてFile→Save Roomを押した時、こんなダイアログが出る事があります。



地形情報はサイズが不定で、部屋ごとに使える容量が違いますが
これは最大容量を超えた時に出てきます。

はいを押してセーブしてしまうと、ほとんどの場合プルダウンで選択できる
次の部屋の地形情報を壊してしまいます。
そうなると復旧させるのが手間なので、これが出た時にはセーブしないようにしましょう。

各部屋の地形容量は、Save Roomを押した際タイトルバーに表示される数値で確認ができます。



使用量 / 最大容量を、10進数の単位バイトで表しています。

Level Dataは性質上、入れ替えにはあまり向かないポインタだと思うので
地形情報を未使用領域に移して、最大容量を自由に設定してみます。



では、ボム部屋の容量を増やしてみましょう。

地形情報はPointersのLevel Dataで指定されています。
他のポインタは全て4桁なのに対し、ここだけは6桁で指定されています。
これは地形情報がロムの特定範囲にとらわれず、どこからでも読み込みができる事を表します。

ロムをバイナリエディタで開いた際の最後のアドレスはヘッダなしで2FFFFFです。
2FD4E0以降FFが並んでおり、どうやらこれ以降ファイルの最後まで未使用領域のようです。
わかりやすく2FE000から使ってみましょう。



2FE000以降を使うんですが、ポインタはDFE000に変更します。これについては後述しますので
ひとまず2つは同じアドレスだと思ってください。
変更したらSave Pointersを押すのですが、次のダイアログでは必ず はい を押します。



Level Dataを変更した時にもタイトルバーに数値が出ますが
111 / 4096と表示されるはずです。



使用量はポインタ変更前に地形をいじっていれば
数値が多少増減します。とりあえず最大容量が増えました。


もしダイアログでいいえを押してしまうと、SMILEがエラーを吐いて強制終了してしまい
起動しなおしても部屋が開けなくなってしまいます。
これも復旧が必要になるので、注意してください。


さて、ここで右上にある部屋のイベント状態選択のプルダウンを押してみます。



ここに、E5E6 = STANDARD 1以外の状態がある部屋では
基本的に各状態でのポインタも同じものに変更します。
ボム部屋では3つの状態があるので、Bosses 1・Events 1のいずれもDFE000に変更します。

ポインタを新しい領域に変更した時はSave Pointers→はいと押しますが
2つ目以降の状態を同じポインタに変更する際は、はい・いいえどちらを押してもエラーは出ません。
ポインタを揃えなかった場合、イベント状態によって地形の変わる部屋ができあがります。



次に、最大容量を調節してみます。
SMILEフォルダの中にあるfilesフォルダを開き、level_entries.txtというファイルを開きます。
このファイルには各部屋Level Dataのアドレスが書かれています。

一番下までスクロールしてみましょう。
最後の2行に2FE000と2FF000が書かれていると思うので
間に1行、2FE800と書き加えて保存します。



そしてボム部屋のSave Roomを押してみます。



最大容量が4096からちょうど半分の2048に変わりました。
なぜこうなったのかというと、SMILEはlevel_entries.txtに書かれたアドレスを元に
地形情報の最大容量を算出しているためです。
このテキストファイルは、最大容量を求めるためのいわば計算表です。

  • 1行下に書かれているアドレス - 部屋で指定されているアドレス = 最大容量

これが計算式です。
4096がはじき出された時は

  • 2FF000 - 2FE000 = 1000 = 4096

こうなっていました。
2048の時は、下に書かれたアドレスが変わったため

  • 2FE800 - 2FE000 = 800 = 2048

このようになりました。
なお1000と800が16進数、4096と2048が10進数です。

地形情報を未使用領域に移し変えた際は、最大容量と使っている範囲を明確にしておくためにも
Level Dataで指定したアドレスと、どこまで使えるかを示すアドレスの両方を
level_entries.txtにきちんと書き加えておいた方が無難です。



アドレス変換


さきほど2FE000とDFE000が同じアドレスと書きましたが
アドレス変換という決まり事のためで、指し示している場所は同じなのです。

  • 2FE000 = PC上でのファイルアドレス
  • DFE000 = SNES上でのアドレス

SNES上のアドレスは上2桁がバンクと呼ばれるもので
この場合、DFがバンクにあたります。$DFなどと表記されたりします。

アドレスの変換はある計算式で行うらしいのですが
相互変換ができるLunar Addressという便利なツールがあるので、それを使いましょう。



スーパーメトロイドはLoROMという種類にあたるらしいので
ここのラジオボタンにチェックを入れます。
あとはアドレスを入れるだけで、瞬時に変換してくれます。



ロム拡張


未使用領域はそこまで潤沢にある訳ではないので
使える場所が足りなくなったらロムの拡張を行い、拡張部分に地形情報を移していきましょう。
SMILEのTools→Expand ROMを押すと拡張できます。



これは初めて拡張をした時に出るダイアログです。
$E0という領域が増えました。アドレスでいうと300000~307FFFの範囲です。
以降繰り返し拡張する度に、$E1・$E2と増えていき
最終的に$FFまで拡張する事ができます。



ロムの復旧


Level Dataのポインタ変更で部屋が開けなくなった時と、最大容量を超えてセーブしてしまった時の
復旧手順です。やる事は途中まで同じなので、まとめて説明してしまいます。

  1. 無改造のロムをSMILEで開き、目的の部屋を開く
  2. File→Open New ROMでおかしくなったロムを開く
  3. File→Save Roomを押す

ここまでで、ポインタを変更して開けなくなった部屋は開けるようになります。
以下は最大容量を超えたセーブをした時、さらに必要な手順です。

  1. File→Open New ROMで無改造ロムを再度開く
  2. 目的の部屋からプルダウンで選択できる1つ下の部屋を開く
  3. File→Save Roomを押す

これで崩れた地形が元に戻ります。

ただ元に戻るといっても、これは無改造状態に戻しているだけなので
地形やポインタなどを多く変更していた時には
またさらに改造していた状態まで進める必要があるのでかなりの手間です。

なので、復旧が必要になる状態に陥らないよう注意するのに越したことはありませんし
こまめにバックアップを取っておくのも有効な手段かと思います。