クルクルブロックの挙動(スーパーマリオワールド)

Page content

スーパーマリオワールドにおけるクルクルブロックの挙動について

クルクルブロックとは、例えばネイティブスターコース1に大量にある、叩くと回転するブロックのことです。このブロックにはいくつか特徴があり、それらについて説明していきます。

先に要点を書いておきます。RTAをするならばこれだけ押さえていれば良いと思います。

・クルクルブロックは同時に4つまでしか回転せず、5つ目を回転させるといずれかのブロックの回転が止まる。ネイティブスターコース1のブロックすり抜けはこの仕様を利用している。

・クルクルブロックの回転を確実に止めたい時は、対象ブロックを回転させた後に他のブロックを7つ以上回転させる。バニラドームコース1の翼錬成で注意のこと。
(このブロック数は、①対象ブロックの回転前に回転しているブロックの数と、②対象ブロックを回転させた後から対象ブロックの回転が止まるまでに、既に回転しているブロックが止まった数に依存する。) 以上です。2つ目に関してはDotsarecool氏の動画を見ればなんとなく掴めると思います。

以下にこれらについての解説を記述しています。なんかよく分からんと思ったら先をどうぞ。

同時に回転できるブロックは4つまで

クルクルブロックは下から叩くか、マントのスピンを当てることで回転させることができます。ただ、いくらでも回転させられるわけではなく、最大4つまでしか同時に回転させることができません。4つ回転している状態で新たにブロックを叩いて回転させると、既に回転しているブロックの内どれか1つの回転が止まります(どのブロックの回転が止まるかについては次の項で説明します)。なお、クルクルブロックを回転させてから自然に停止するまでには256フレーム(255かも?)、約4.3秒かかります。

この仕様はRTAやTASにおいて有効利用されています。ネイティブスターコース1は縦長のステージ内にクルクルブロックが所狭しと並べられており、それをスピンアタックで掘り進んでいくステージになっています。

スピンアタックで掘り進める際、スーパーマリオ、ファイアマリオの場合は真下のブロックを壊しながら進み、マントマリオの場合は周囲のブロックを回転させながら進んでいきます。マントマリオの場合、1ブロック掘り進めるごとに左右の2ブロック回転させていくので、3ブロック真下に掘り進めると4ブロック回転します(1ブロック目は左右にブロックがないので回転ブロック数は増えない)。

3ブロック目を壊して反動で上昇した時に、マリオを右か左かどちらかに動かします(右に移動したとします)。マリオは回転しているブロック内に入り込めるので、1マス分右に動くことになります。スピンは継続しているので、そのまま右のブロックを回転させます。これで回転ブロックが5つ以上になり、どれか1つが止まります。この止まるブロックがマリオと重なっていた時、マリオは止まったブロック内にめり込んでしまいます。

この後はどうなるかというと、ブロックからマリオが押し出され、押し出された先にあるブロックを回転させ、再びめり込み、押し出され…を繰り返し、どんどん下(正確には左下)に落ちていきます。この落ちていくスピードが非常に早いため、掘り進む時間を短縮させる技として利用されています。 RTA動画では、同じ操作をするように心がけると解説されているものがありますが、止まるブロックを固定化…状況再現をするために行っているということですね。

この技を使用する際に注意しておくべき点は2つあります。

めり込み落下中に壁に接触しないようにする

マリオがクルクルブロックに押されながら落ちていく時、ニュートラル状態にしておくと真下ではなく左下方向に落ちていきます。そのため、落下中に地面か左側の壁に接触する可能性が生まれます。もしめり込み中に接触してしまうと、そのまま通り抜けて中に入ってしまいます。こうなってしまうともうどうしようもありません。壁によってはそのまま潰れてしまいますし、壁の中に空間があって助かったとしても、そこから出ることは叶わず、タイムアップまで己の行いを反省するしかありません。壁が近い場所でめり込もうとしない、落下中に右を押して軌道修正をする等で回避しましょう。地面の方は、基本的にクルクルブロックと地面の間には空白があるのでめり込むことはありませんが、ステージによってはそういう場所もあるので注意が必要です。

即死判定ラインを超えないようにする

めり込み落下の速度はカメラのスクロール速度より圧倒的に早く、落下し続けるとあっという間に画面外まで落下してしまいます。画面外には即死判定があるため、この判定ラインを超えないように注意する必要があります。具体的には、めり込む場所を吟味し、即死判定ラインを絶対超えないように調整します。RTA動画を参考にすると良いでしょう。

回転が止まるブロックの選定方法

上の項で、4つ回転している状態で新たにブロックを叩いて回転させると、既に回転しているブロックの内どれか1つの回転が止まる、と説明しました。ここでは、この止まるブロックの選ばれ方について説明します。

先に関係する値について。

○バウンススプライトの数 ○バウンススプライトが格納されるスロットのインデックス ○次に上書きされるスロットのインデックス

全てではないかもしれませんが、これらの値が関係します。

バウンススプライト(bounce sprite)は、直訳するとbounce(はずむ、バウンドする) sprite…はずむスプライトになります。ブロックを叩くと上に少し跳ねますが、このブロックを叩いて跳ねている状態のスプライトをバウンススプライトと呼ぶのでしょう。確認してみたところ、クルクルブロック、ハテナブロック(中身は問わない)、ボーナスブロックはバウンススプライトになり得る、メッセージブロックはなり得ないということがわかりました。

はずむスプライトという名前からすると、ブロックを叩いて弾んでいる間のみバウンススプライトに変わるように感じます。実際、ハテナブロックやボーナスブロックではそのようになりましたが、クルクルブロックに関してはそうでは無いようで、回転している間は常にバウンススプライトとなっていました。

このバウンススプライトが最大4つしか存在できない仕様になっています。1項目目の「同時に回転できるブロックは4つまで」は、バウンススプライトという言葉を使うと「バウンススプライトは同時に4つまでしか存在できない」ということになります。

バウンススプライトが発生したら、そのスプライトはスロットという場所に格納されます。バウンススプライトは4つまでしか存在できないので、用意されているスロットもスロット0~スロット3の4つです(スロット[n]のn部分をインデックスとここでは呼んでいます)。 バウンススプライトが発生すると、それは空いているスロットに格納されます。この時、インデックスが小さい方が優先されます(逆かもしれませんが、この記事ではこれを前提に進めていきます)。では、バウンススプライトがどのように格納されるのか、流れを書いてみます。

  1. クルクルブロックを回転させてバウンススプライトが発生すると、空いているスロットの中でインデックスの小さいスロット…スロット0に格納されます。
  2. 続けてクルクルブロックを3つ回転させます。新たに発生した3つのバウンススプライトは順にスロット1、スロット2、スロット3に格納されます。
  3. さらにクルクルブロックを1つ回転させます。スロットは全て埋まっているため、どれか1つのスロットに、新たに生まれたバウンススプライトが上書き格納されます。

ここで、「どれか1つ」を明確にするために出てくるのが「次に上書きされるスロットのインデックス」です(Overwrite index:OWとします。なお勝手につけた名前なのでご注意を)。OWも0から3の4通りの値を取り、この値が次に上書きされるスロット番号を示します。 OWの初期値は0です。そして、上書きが行われると値が1増え、3の時に上書きが行われると0に戻ります。これを踏まえて上の流れを書き直すと、

  1. さらにクルクルブロックを1つ回転させます。スロットは全て埋まっており、OWは0のため、新たに生まれたバウンススプライトはスロット0に上書き格納されます。OWは1に変わります。

となります。このままバウンススプライトを発生させ続けると、 スロット1に上書き、OWが2に
スロット2に上書き、OWが3に
スロット3に上書き、OWが0に
スロット0に上書き、OWが1に
スロット1に上書き、OWが2に
スロット2に上書き、OWが3に

となります。つまり、普通にクルクルブロックを叩いていくと、上書き格納発生時、回転しているブロックは古い順に止まっていくことになるわけですね。

…とは残念ながらなってくれません。「回転しているブロックは古い順に止まっていく」というのは、操作前のOWが0だから起こるのです。OWの初期値が変われば、ブロックの止まる順番も変わってきます。 OWを変えるには、適当にブロックを叩いて上書き格納を発生させます。例えばブロックを連続で6つ回転させると上書き格納は2回発生し、OWは2となります。この状態で全てのクルクルブロックが停止するのを待ち、再びブロックを叩いていくと…

仕様がこのように複雑であると、普通でないことが時として起こってしまうわけですね。 例えばバニラドームコース1の翼錬成。翼錬成を行う手順の中に、特定の位置にあるクルクルブロック(ブロックAとします)の回転を止めるというものがあります。通常であれば、ブロックAを回転させた後に他のブロックを4つ回転させれば達成することができます。しかし、実際にやってみると4つ回転させてもブロックAが止まらない場合があるのです。

それは、既にいくつかのブロックが回転しており、ブロックAを回転させてからブロックを4つ回転させるまでの間に回転中のブロックが停止してしまう、という場合です。特に、ブロックAを回転させる前の回転ブロック数が多いと発生しやすくなっています。

仮にブロックが4つ回転している時にブロックAを回転させたとすると、既にブロックが4つ回転しているため上書きが発生します。上書き格納されたブロックA自身が上書きの対象となるのは、この後に上書きが4回発生したときです。すなわち、ブロックAを回転させた後、他のブロックを4つ回転させる必要があるということです。 ここまでは普通ですね。では、他のブロックを4つ回転させるまでの間に、既に回転しているブロックが止まると……

もちろん、上書きの発生数が減ってしまいます。1つ止まった場合は上書きの発生回数が1減ってしまうため、追加で1つ回転=全部で5つ回転、3つ止まった場合は全部で7つ回転させなければ、ブロックAが上書きの対象となりません。

ここで、記事の冒頭に貼付したDotsarecool氏の動画をもう1度見てみましょう。

ブロックA(錬成し、ドラゴンコインと被っているブロック)を回転させてから次のブロックを回転させるまでに、他のブロックが3つ止まりました。よって、ブロックAを止めるためにはブロックを7つ回転させる必要がありますが、動画では6つしか回転させていません。そのため、ブロックAは回転したままとなり、ブロックAを止めた後にドラゴンコインを回収する、という手順を行うことができませんでした。ブロックAのスロットインデックスは1、OWも1なので、ここからあと1ブロック回転させれば成功していたことがわかります。

この状態を回避する方法は単純で、素早くブロック増殖を行い、下手に止まらずにブロックを回してしまえば良いのです。こうすれば、4つ回転させればまず間違いなく成功します。もしブロック増殖に手間取ったときにはリカバリーとして確実に7つ回転させる。これで回避できると思います。

説明は以上、まとめは冒頭に書いたとおりです。

バウンススプライトについて詳しく知りたい方は、SMW CentralのSMW RAM MAP / SMW ROM MAPページにバウンススプライトに関するアドレスがいくつか載っていますので、そちらを見ると幸せになるかもしれません(上手くリンクできなかったのでプレーンテキスト)。 https://www.smwcentral.net/?p=memorymap&game=smw&u=0&address=&sizeOperation=%3D&type=*&description=”bounce+sprite”

($7E18CDをメインに見ると良いと思います)