半年以上前に、Super Mario World向けのスプライト挿入ツールを作成したので、
その際に知った情報等をメモしておくことにします。

これを見る人はごくごく少数だとおもいますが。

拙作ツールで、これらのスプライトを使う為の実装をしてます。 気になる方は私のgithubリポジトリから探してください。 詳しくはあまり触れません。


もくじ


スプライトの種類

SMWで使用されているスプライトには、いくつかのタイプがあります。

イニシャライザースプライトを除き、各スプライトは専用にメモリをいくつか持っています。

また、それぞれ名前がついていますが、あくまで既存処理で主にそれ用に使われているという話なので、 LevelASMの代替として使ってもよいかとおもわれます。(枠いっこつぶしますけど)

レギュラースプライト

いわゆる普通のスプライト。

某墓場に詳しいことは書いてあるので、詳細はここでは省略。

各スプライトには、それぞれに、8ビットのメモリがいくつか割り当てられています。 計算用の一時的な値の保持はレジスタやスクラッチメモリ、スタックに保持し、最終的な結果をスプライト用のメモリに保存するという 使い方をするのが一般的かと思われます。

ステージ中に、最大12個配置できます。 ただし、いくつかは予約されていたりするので、実際に1画面内に配置できるスプライトは、 これよりも少なくなります。

1画面に12個以上表示しようと思っても、メモリがないので生成されません。

(※ステージによっては、12個よりも多くスプライトを表示していることがありますが、これは異なるタイプのスプライトを使用しています。 拡張スプライトクラスタースプライトを参照のこと。)

SA-1パッチを導入すると、スプライトを最大22個生成可能になります。

シュータースプライト

一定時間毎にスプライトを生成させることに特化したスプライト。

SMWでは、キラー砲台と、トーピードジェネレータでのみ使われています。

シューターは、上記レギュラースプライトからは独立したメモリを持っており、 画面内に最大8個まで配置することが可能です。

このメモリは、レギュラースプライトとは競合しない為、 レギュラースプライトを12個以上配置しても、シュータースプライト自体はその制約にとらわれず配置できます。 (※ただし、スプライトの生成は行われません)

メモリマッピングがレギュラースプライトとは異なる為、レギュラースプライト用のメモリは使用できません。

ジェネレータスプライト

これは、断続的にスプライトを生成する特殊なスプライトとして使われます。

1つの画面の中に1つだけ配置することができ、複数を同時に使うことはできません。 スプライトの効果は、後から読み込んだものが優先されます。

イニシャライザースプライト

スプライトが画面内に入ったときに一度だけ実行されるスプライト。 ラン-ワンス(Run once)スプライトとか呼ばれてたりします。

レギュラースプライトやシュータースプライト等、他のスプライトは、条件によって処理が実行されない場合がありますが、 このスプライトは、画面内に入った際に必ず処理が実行されるという特性があります。

スプライトのメモリに関しては、他のスプライト以上に制約があり、特に、スクラッチメモリ($00-$0f)はスプライト読み出しループ用の特殊な値が格納されている為、 基本使うことができないと思っておいたほうが良いです。

SMWでは、天井付近でわらわらするテレサの配置や、ぐるぐる回るテレサリングの配置等で使われています。
(※クラスタースプライトの一括配置等でよく使われている印象です)

このスプライト用の拡張は、一部のツールでのみ実装されています。

スクローラースプライト

主に、画面のスクロールの処理で使用されるスプライト。

1つの画面で1つだけ使用でき、後から読み込まれたものは無視されます。

このスプライトの最大の特徴は、処理がレイヤー1用とレイヤー2用の2つ用意されていることで、

  • レイヤー1用のイニシャルルーチン
  • レイヤー1用のメインルーチン
  • レイヤー2用のイニシャルルーチン
  • レイヤー2用のメインルーチン

の4つのルーチンを必要とします。

ジェネレータスプライトとはメモリが別なので、併用が可能です。

このスプライト用の拡張は、一部のツールでのみ実装されています。

その他のスプライト

これらのスプライトは、直接画面に配置して生成することができません。

これらを生成する場合、上で説明したいずれかのスプライトから生成をしなくてはいけません。

拡張スプライト

ファイヤーボールやヨッシーの吐く炎等で使用されているスプライト。

レギュラースプライト程ではありませんが、いくつか専用のメモリを持っています。

最大生成個数は、何個だったかな、忘れました。

あまりまじめにしらべてないので、くわしいことはよー知りません。調べる気もあんまりありません。

クラスタースプライト

ごくごく小機能な、大量生成させることに特化したスプライト。

天井付近でわらわらするテレサや、ボーナスステージの1UPキノコ等で使用されています。

スプライト固有のメモリは、スプライト番号と、X/Y座標に関するメモリしかありません。たぶん。 あとはスプライトのインデックスが取得できる程度。

1つの画面につき最大20個生成できます。 レギュラースプライト等の他のスプライトとは競合しません。
(ビデオメモリ競合等はあるかもわかりませんが、しょーじきそのへんは知りません。)

その他

これ以外にも数種類スプライトタイプが存在します。

詳しいことはあまり調査していないので、特に書くことはありません。

某所に、これらの特殊なスプライトを拡張するパッチがあります。

(拙作ツールにも、そのうち組み込みたいと思ってましたが、その前に飽きました)


スプライトツール拡張仕様

スプライトツールの流れを組むいくつかのツールで追加されている仕様について、てきとうに。

私は、調べるまで知らなかった仕様がいくつかありました。

Extra props

SpriteTool で追加されている、スプライト向けのメモリ。 Extra props1, Extra props2 の2つが用意されています。

ただし、Extra props2 のbit6, bit7は、後述の事情で別の意味を持つので、実際に使用可能なのは14bitsになります。

スプライトの色や属性等を微妙に変化させたい場合に、このメモリを制御して調整したりします。

Extra props2 のbit6, bit7仕様

Extra props2 のbit6およびbit7は、スプライトの状態のハンドリングを追加する為の拡張メモリになっています。 (この仕様は、SpriteTool v1.35から導入されています)

これらのbitをONにすると、スプライトの制御は以下のように変化します。

bit7 スプライトの動作全てをメインルーチン内で制御する
Tweaksの情報等は無視される
bit6 Tweaks情報等を使いつつ、スプライトの全ての状態をメインルーチン内で制御する

(※bit7をONにする場合、bit6は無視されます)

これらを使う場合、より高度なスプライト作成スキルが要求されることになります。

通常は、「Tweaks情報を使いつつ、通常状態含む一部の状態のみをメインルーチン内で制御する」という制御となります。

Extra bytes

一部のツールは、Lunar Magic v1.80で実装されたExtra bytes用の機能拡張を実装しています。

この機能を使用すると、スプライト配置画面から追加の情報を入力でき、従来より柔軟なスプライトコーディング・ステージ作成が可能になります。


情報のでどころ

  • たどころ
  • こうじ

以上、雑多な書き殴り。

半年以上前に調べたり、作ったりした情報なので、間違いあるかもしれません。

やる気があれば、追記・修正等をしたいとこです。 現時点であまりやる気ないですけど。

質問あればてきとーにかいとうします、てきとーにね。



blog comments powered by Disqus

Published

20 September 2018

Tags