BBH100赤&親方テレサ アイクンの仕様とビーム回避法まとめ

解説120枚RTA

テレサのホラーハウスの『8まいコインはどこだ+100枚コイン』と『おやかたテレサをさがせ』では、アイクンとちびテレサのいる部屋に入るパートがある。

このパートにて、扉を開けた時にアイクンのビームが当たる場合があるが、このビームは回避可能なのか・仕様はどのようなものなのかを調べたのでその結果を紹介する。

アイクンがビームを打つ部分の仕様

100赤を前提に、該当アイクンがビームを打つまでの流れは以下のようになっている。

※RTAルート的に関係しなさそうな仕様は省略。

 

★ 超ざっくりフロー

まずは以下のフローと動画を照し合わせるとおおよそ理解できると思う。

人によっては、【実践編】セクションから確認したほうが理解が早いかもしれない。

(1) Room IDが20になる
↓ 1フレーム後
(2) (1)時点で特定の2条件を満たすとアイクンがアクティブになる
↓ 1フレーム後
(3) (2)時点で距離の条件を満たすとアイクンがAction=1(マリオを探す状態)になる
↓ 1フレーム後
(4) ここで特定の3条件を満たしているとアイクンがAction=2(マリオを発見した状態)になる

(5) Action=2になってからはShot Maxに応じたタイミングでビームを打ってくる

 

(1) 以下2条件の両方を満たしたら、その次のフレームでアイクンがActiveとなる。

① マリオ⇔アイクンの距離が3000ユニット未満。
② マリオのいるRoom ID(部屋番号)が該当アイクンに関連するRoom IDである。

①に関しては、該当パートにおいては、1つ前の扉を開ける段階で約1439ユニットなので気にしなくて良い(以下画像)。

②に関しては、該当パートにおいては、Room IDが1→20に切り替わるタイミングから満たす状態になる。

bbh-eyes-shot-5

参考動画では、36.36の時点で距離(①)が約783ユニットなので、①の条件は既に満たしていることが分かると思う。

bbh-eyes-shot-1

次のフレーム(36.40)になるとRoom IDが1→20に切り替わり、①②の両方を満たす状態になるが、仕様上このタイミングではまだアイクンはActiveにならない。

bbh-eyes-shot-2

次のフレーム(36.43)になるとActiveが36→37に変わっていること(アイクンがActiveになっていること)が分かる。

※画像では、Active=37と表記されているが、このうちの下位1bit(0 or 1)がActiveのフラグとなっている。

bbh-eyes-shot-3

 

(2) (1)後、マリオ⇔アイクンの距離が1500ユニット未満の時にアイクンはマリオを探す状態(Action=1)に変わる。

該当パートにおいては、アイクンがActiveに切り替わった時点でこの条件を満たすため、その次のフレームでAction=1となる。

参考動画の場合は、(1)の次のフレームである36.46でAction=1となっている。

bbh-eyes-shot-4

 

(3) Action=1になった次のフレームで以下のパラメータが設定される。

① Shot Timer: アイクンがビームを打つまでをカウントするタイマー。最初は30が設定される。基本は1フレームごとに1ずつ加算されていく。

② Shot Max: アイクンがいつビームを打つかのパラメータ。乱数値に応じて0~19が設定される。

参考動画では、(2)の次のフレームである36.50でShot Max=18が設定されている。

乱数値が高いほど高い数値が設定される仕様であるため、乱数値が高かったことが分かる。

bbh-eyes-shot-6

 

(4) Action=1の時に以下3条件の全てを満たすとアイクンがマリオを発見した状態(Action=2)に変わる。

① 角度差の条件: アイクンの向きとアイクンから見たマリオの位置の角度の差が1024未満。
② 向き差の条件: アイクンの向きとマリオの向きの差が16385以上=90°を超える。
③ 距離の条件: マリオ⇔アイクンの距離が700ユニット未満。

角度差の条件(①)は、アイクンがマリオのいる方向を向いているという意味。向き差の条件(②)は、アイクンとマリオが向かい合っているという意味。

※向き差の条件は仕様的には『90°を超える』だが、直感的(ゲームを上から見た時)には『90°以内だと条件を満たす』と考えたほうが分かりやすいかも。

 

参考動画をベースにそれぞれを確認する。まずは角度差の条件(①)から。

参考動画では『DAngle Eye to Mario』で表示されている数値で、107となっている。1024未満なので満たしていることが分かる。

bbh-eyes-shot-7

少し掘り下げて説明すると、該当アイクンは初期状態で真下(角度値0)に向いている点と、マリオが扉に近づくほどマリオがアイクンの真下付近の位置にいる状態になる点から、角度差がほぼなくなり1024未満を満たしている形となる。

続いて距離の条件(③)は、Room IDが切り替わった1~2フレーム後で達成されるため、該当パートにおいては気にしなくて良い条件だと思う。※親方テレサスターの時は気にする必要あり。

参考動画では『Dist Eye to Mario』で表示されている数値で、約683ユニットであることが分かる=700ユニット未満を満たしている。

そして最後、最も重要なのが向き差の条件(②)だ。

該当アイクン(真下向き)で考える場合、マリオが同じく真下を向いていたとしたら差が0°なので満たさないことになる。

逆に、マリオが真左側~真上~真右側(270.1°~0°~89.9°)を向いていた場合は、差は90°を超えるので満たすことになる。マリオの角度値でいうと16385~49151だと条件を満たす。

参考動画では、マリオが上側(角度値30600)を向いているため、差は30600となり満たしていることが分かる。

bbh-eyes-shot-8

以上から、参考動画では、①②③全てを満たしてAction=2へと移行している。

 

(5) Action=2の時にShot Timer=Shot Maxになると20フレーム後にビームを打つ。

ここでようやく(3)で紹介したパラメータが出てくる。

例えば、Shot Max=18である場合は、Shot Timerが1フレーム毎に1,2,3,4…と増えて18になった20フレーム後にビームを打つ仕様となっている。

参考動画を確認してみると、Action=2になってからShot Timerが1ずつ増え、37.10でShot Timer=18を迎えていることが分かると思う。

bbh-eyes-shot-9

ここから20フレーム後(Shot Timer=38の次フレーム)にアイクンがビームを打っている。

bbh-eyes-shot-10

bbh-eyes-shot-11

 

以上が100赤を例にしたアイクンの仕様説明となる。

まとめると、RTAルートにてビームに当たる条件は、該当アイクンが持つShot Maxの範囲0~19のうち、運悪く高い値を引いてしまった時だ。

Shot Maxの値が高い=ビームを打つまでが遅くなり当たってしまうことになる。

一段ジャンプで扉にこする理由

100赤の該当パートでは、最速で一段ジャンプを出したり歩きながらそのまま扉を開けたりすると、アイクンがマリオを発見していない状態になる。

以下は1フレーム歩きから最大一段ジャンプをした動画(最速で一段ジャンプをした動画)である。アイクンがマリオを発見していないのが分かると思う。

扉を開けた段階でアイクンがマリオを発見できない場合、アイクンに見つけてもらうまでがロスとなる。

そのため、RTAでは、多少歩いてから一段ジャンプし扉にこすることでアイクンがマリオを発見している状態にする小技を導入している。

この小技の内部的な流れは『アイクンがビームを打つ部分の仕様』で紹介したので割愛するが、そもそもなぜ最速一段ジャンプだとマリオを発見できないのだろうか。

最速一段ジャンプだとマリオを発見できない理由

先に結論を話すと、最速一段ジャンプ等だとAction=1時の条件のひとつ『アイクンの向きとマリオの向きの差が16385以上=90°を超える』を満たさないためだ。※(4)の向き差の条件。

ゲーム上の見た目でいうと、Action=1時にアイクンとマリオが向かい合っていないため、アイクンがマリオを発見できない形(Action=2に移行しない)となる。

この理由を理解するためにも、RTA向けの知識のためにも、以下のフローを覚えておくと良い。

該当パートにおいて、Room IDが20に変わってからアイクンがAction=2になるまでには3フレームかかる。

1. Room IDが20になる
↓ 1フレーム後
2. アイクンがアクティブになる
↓ 1フレーム後
3. アイクンのActionが1になる
↓ 1フレーム後
4. ここで(4)の3条件を満たしているとアイクンのActionが2になる

そして、先で述べた通り、最速一段ジャンプの場合、4.の段階で向き差の条件を満たさないためにアイクンがマリオを発見できない結果となる。

ではなぜ条件を満たさないのか――これを理解する上で重要なのは、マリオが扉を開けている時のマリオの向きだ。

マリオが扉を開ける際、ゲーム上ではマリオは正面を向いているように見えるが、実は内部的には逆向き(下向き)になっている。

※逆向きマリオは、扉に吸い込まれたフレーム(カメラxより前)から始まる。

bbh-eyes-shot-12

この仕様を踏まえてRoom IDが20に変わったフレームから見ていく。まず最初にRoom IDが20になったフレームが以下(1.)。

bbh-eyes-shot-13

次のフレームでアイクンがアクティブになる(2.)。

bbh-eyes-shot-14

次のフレームでアイクンがAction=1になる(3.)。この時点でマリオが扉に吸い込まれているため、下向きになっていることが分かると思う。

bbh-eyes-shot-15

そして最後、先のフローの4.にあたるフレームでは、向き差の条件を満たせずにAction=1が維持される(Action=2にならない)。

bbh-eyes-shot-16

まとめると、最速一段ジャンプの場合、扉前でこする等のタイムロスがないため、4.時点でマリオが扉に吸い込まれている状態=マリオは下向きとなる。

その結果、初期状態で真下を向いているアイクンとマリオとの向き差は0°になり、向き差の条件(90°超え)を満たさないのである。

ちなみに、2フレーム歩きからの最大ジャンプの場合も、4.のフレームでマリオが扉に吸い込まれるため、向き差の条件を満たせずにAction=1が維持される。

3フレーム歩きからの最大ジャンプになると、『アイクンがビームを打つ部分の仕様』で紹介した通り、4.のフレームではマリオが扉を押しているため、向き差の条件を満たすことができる。

※RTA的な理解としては、Room IDが変わったフレームから3フレーム以内に扉に吸い込まれるとダメ、4フレーム以降であれば成功。

※Room IDは日本語初期版で0x8035FEE0(s16)。

扉にこするのはタイムロスを作るため

上記説明から分かったと思うが、昔から使われている小技『扉にこする』の本質は、(4)の向き差の条件を満たすために扉前で多少ロスらせ、扉を開けるモーションの開始を遅くすることにある。

つまり、扉にこすることが条件なのではなく、扉前でタイムロスを発生させる手段として扉にこすっているというのが正しい解釈となる。

従って、例えば、一段ジャンプ後に扉前で一瞬停止→扉を開ける、といった方法でも同じことができる。

実際の方法については、いくつかアイデアが考案されたので、別セクションで紹介しよう。

【実践編】扉の真ん中~右側を狙うのは必須!

100赤の該当パートでは、扉に向けて一段ジャンプすると思うが、扉の左側を狙うとアイクンがマリオを発見できないのが基本なので注意が必要だ。

その理由は、実はアイクンは扉から見て気持ち右側にいるため、扉の左側を狙うとAction=1時の条件のひとつ『アイクンの向きとアイクンから見たマリオの位置の角度の差が1024未満である』を満たさないためである。※(4)の角度差の条件。

ゲーム上の見た目でいうと、Action=1時にアイクンがマリオのいる方向を向いていないため、アイクンがマリオを発見できない形(Action=2に移行しない)となる。

実際に扉の左側を狙った動画が以下で、うまくいっていないことが分かる。扉の真ん中狙いであれば大丈夫なので、意図的に真ん中~右側を狙うことをオススメする。

補足: アイクンが時計回りでもダメ?

上記のFAQとして「アイクンの回転が時計回りでもダメなのか?」と思う人もいるかもしれない。

アイクンが時計回りか・反時計回りかは乱数値により50%ずつで決まるが、この時に時計回りを引いた場合はアイクンがよりマリオのほうに向くことになるので、角度差の条件を満たしそうだと感じるだろう。

この答えとしては、時計回りを引いたとしてもマリオを発見できない結果となるのが基本だ。※多めに遅延させればいけるため"基本"としている。

その理由は、時計回りを引けばアイクンの向きがマリオ側になるので差は縮まるものの、差が1024未満になる前に扉を開けるモーションに入ってしまうからである。

以下は、4フレーム歩きからの最大一段ジャンプで時計回りを引いた例(動画時間43秒から)となる。

扉に吸い込まれる2フレーム前の角度差は1277なので、条件を満たしていないことが分かる。

bbh-eyes-shot-17

続いて、1フレーム前になると表示上は角度差が823となる。1024未満なので条件を満たしている……ように見えるが、実は満たしていない。

bbh-eyes-shot-18

というのも、アイクンの角度を変える処理が実行されるのは、角度差の条件(①)と向き差の条件(②)をチェックした後であるためだ。

具体的には、Action=1時、アイクンは1フレームにつき256(固定値)の角度を変える仕様だが、これが角度差と向き差の条件をチェックした後に条件を満たしていない場合に実行される。

そのため、実際にゲーム内部で起こっている角度差の計算処理は以下となる。

  • アイクンから見たマリオの位置の角度: 現フレームの64201
  • アイクンの向き(角度): 1フレーム前の65280
  • 計算結果: 差は1079となり、1024未満の条件を満たさない

もしここの実行順序が違っていたとしたらこのフレームで条件を満たしていた、という事実は個人的に面白いポイントだと思っている。

ちなみに、先で紹介した通り、アイクンは1フレームにつき256の角度を変えるため、もう1フレーム遅延させた場合は角度差が1024未満となりマリオを発見できると予想できる。

【実践編】ビームを100%回避するための方法

これまでの知識をもとに、100赤の該当パートにて100%ビームを回避する方法を考えた&考案された。

それを紹介する前に、まずは、そもそも現状の方法の確率がどれぐらいなのかを紹介しよう。

現状の方法の確率は?

現在RTAで使っている扉をこする方法は、3フレーム歩きからの最大一段ジャンプが最速となる。

この時、Shot Maxが15以下の時はビームを回避できて、16以上の時はビームに当たってしまう。

つまり、79.99%の確率で回避できるということになる。乱数値でいうと0~52428だと回避できて、52429~65535だと当たる。

また、2割の確率を引いてビームに当たってしまった場合は、0.7~0.8秒程度のロスになるらしい。

アイクンがビームを打つ部分の仕様』で紹介した参考動画では、3フレーム歩きからの最大一段ジャンプでShot Max=18を引いている。

結果、ビームを回避できずにぶつかっていることが分かる。

ビーム回避方法の有力候補3つ

QJK二段なども含めて色々試した結果、以下3つがRTA向けの候補として挙がった。ビームを100%回避したい人はここから選ぶのが良いと思う。

個人的なオススメは方法3のジャンプキック法だ。1フレーム歩きからジャンプキックできると1フレーム速いタイムを出せる可能性があるからである。

ちなみに、Shot Timer=5の時にマリオが扉に吸い込まれるのが最速だ。気になる人は、スターセレクト画面から開始前提で0x80342CFC(s32, 日本語初期版)を見てみると良いだろう。

 

方法1: 最大一段+ニュートラル停止法

最大で一段ジャンプした後、扉の前で一瞬だけ停止して調整する方法。

以下の動画(動画時間0秒から)は、3フレーム歩きから最大ジャンプし、扉前で4フレーム停止している。これがビームを100%回避できる場合の最速となる。

※おまけ: 『現状の方法の確率は?』で話した通り、停止無しだと16以上でビームに当たる。

ここから+1フレームで17以上、+2フレームで18以上、+3フレームで19以上、+4フレームで100%回避なので、4フレーム停止が最速となる。

 

方法2: 7f歩き+最大一段法

7フレーム歩いてから最大で一段ジャンプする方法(動画時間7秒から)。

扉前で止まらなくて良いのがメリットだが、8フレーム歩きになると壁にぶつかってしまうためあまりオススメしない。

 

方法3: ジャンプキック法

少し大きめのジャンプキックをする方法。

以下の動画(動画時間13秒から)では、地面ぎりぎりでキックを出しているが、高い位置でキックを出してもOK。

以下2点がメリットなので、個人的にはオススメ(RTA的なやりやすさは不明)。

  • 扉前で止まらなくて良い。
  • 1フレーム歩きからジャンプキックを出せた場合、Room IDの切り替わりが1フレーム早くなるため、結果的に1フレーム速いタイムが出せる。

【実践編】親方テレサスターでのビーム回避方法

ここまでは100赤を例に色々見てきた。この知識をもとに今度は親方テレサスターを見てみる。

具体的なパートは、3匹目のテレサに向かうパートとなる。

当スターの場合、アイクンがマリオを発見せずにビームを打ってこないのがベストだが、わざとビームを打たせて100%回避する発想もある。

これら発想を踏まえて色々試した結果出てきた方法を紹介する。

方法1: 2f以内に扉タッチする方法(オススメ)

おさらいすると、該当パートでは、Room IDが20に変わってからアイクンがAction=2になるまでには3フレームかかる。

1. Room IDが20になる
↓ 1フレーム後
2. アイクンがアクティブになる
↓ 1フレーム後
3. アイクンのActionが1になる
↓ 1フレーム後
4. ここで(4)の3条件を満たしているとアイクンのActionが2になる

なので、ビームを回避する1つ目の方法は、Room IDが20に変わってから3フレーム以内にマリオが扉に吸い込まれる→アイクンがマリオを発見しない、という方法である。

この方法を実現したのが以下の参考動画(動画時間0秒から)となる。

スティックを真左より少し下に倒し、1フレーム歩きから最小ジャンプダイブで扉にタッチしている。

参考動画では、21.33でアイクンがAction=1となり、

bbh-eyes-shot-19

その次のフレーム(21.36)でマリオが扉に吸い込まれていることが分かる。

つまり、4.の段階でマリオが逆向き(真下向き)になるため、向き差の条件を満たさずに発見されない状態となっている。

bbh-eyes-shot-20

この方法(スティック)はすでに知られていると思うが、扉を開けるモーション中にスティックを仕込めば良い点&最速タイムを出せる点からオススメのひとつとなっている。

ただし、ジャンプダイブが大きくなり扉を超えるような形になると、3フレーム以内に扉に吸い込まれずにアイクンに発見されてしまう点には注意が必要だ。

方法2: 向き差の条件を回避する方法(オススメ)

こちらは個人的に面白いと思った方法となる。

おさらいすると、Action=2になる条件として、『アイクンの向きとマリオの向きの差が16385以上=90°を超える』がある。この条件を満たさないようにするのがこの方法だ。

この方法を実現したのが以下の動画(動画時間28秒から)となる。

スティックを真左に倒し、1フレーム歩きからの最小ジャンプダイブ→着地前に左下くぼみに倒して扉にタッチしている。

※真左のままだと向き差が90°を超えるため注意。

参考動画では、21.33でアイクンがAction=1となり、

bbh-eyes-shot-21

Action=2の判定が入る次のフレームでは、向き差が90°以内(16384以内)になるため、向き差の条件を満たさずに発見されない状態となっている。

bbh-eyes-shot-22

そして、その次のフレームでマリオが扉に吸い込まれるため、条件を満たさない状態を維持したまま扉を開けることができる。

bbh-eyes-shot-23

この方法の面白い点は、最後にスティックを左下くぼみに倒しているため、扉にタッチするまでの間アイクンとの距離が遠くなり、距離の条件(700ユニット未満)も満たしていないことだ。

先の画像を見ると分かる通り、21.33が703.892ユニット、21.36が704.356ユニットとなっている。こんな感じで、扉を開けるまでの間は700ユニット未満にならないのがこの方法となる。

この方法は、全てくぼみ入力で完結する上、方法1と比べて1フレームロスで済むのでオススメのひとつとなっている。

ちなみに、最大ジャンプダイブでも、壁沿いに寄った後にスティックを緩めて扉の少し手前に着地できるようにし、着地前に左下くぼみに倒せば成功させることができる。(動画時間55秒から)

方法3: 2f以内に扉タッチする方法 その2(迂回法)

迂回法は、壁から離れて移動し最後に扉に向かう方法だ。メジャーな回避法なので、多くの人が知っていると思う。

この方法は、距離の条件を直前まで満たさない点がポイントだと思われがちだが、実は導線の関係でRoom IDの切り替わりが扉タッチ直前となるため、方法1と同じ話が本質となる。

要するに、Room IDが20に変わってから3フレーム以内に扉にタッチしているという意味だ。

参考例が以下の動画となる(動画時間1分22秒から)。

参考動画では、21.36でRoom IDが切り替わった後、21.40でアイクンがActiveとなり、

bbh-eyes-shot-24

21.43でアイクンがAction=1になると同時にマリオが扉に吸い込まれている。結果、アイクンから発見されない状態となっている。

bbh-eyes-shot-25

個人的には、方法1もしくは方法2が安定するのであれば、タイム的にも迂回法は使わないほうが良いと考えている。

ただし、ジャンプダイブ時にジャンプキックに化けてしまった場合などは、リカバリとして迂回してから扉にタッチする手はアリだと思う。

補足: 迂回するとRoom IDの切り替わりが扉直前になる理由

ちなみに、迂回するとRoom IDの切り替わりタイミングが扉直前になる理由は、Room IDが切り替わるための床判定への入り方が壁沿いを移動する場合と迂回する場合とで異なるからである。

具体的には、以下画像の青色の三角形が床判定となっている。扉から見てやや右側に伸びていることが分かるはずだ。

なので、方法1などで行っている壁沿いを通る場合は、三角形の右側から床判定に入りRoom ID=20に切り替わるため、扉まで少し距離がある形になる。

bbh-eyes-shot-26

一方、迂回する場合は、三角形の下辺から床判定に入りRoom ID=20に切り替わるため、その時点で扉の目の前まで来ている。この違いが理由となっている。

bbh-eyes-shot-27

方法4: あえてビームを打たせる方法

最後は、100赤の時と同じで、扉前で遅延させてビームを100%回避する方法だ。具体的には、扉前で少しだけ停止してから扉にタッチする方法となる。

この方法を実現したのが以下の動画(動画時間1分51秒から)となる。

スティックを真左に倒し、1フレーム歩きからの最大ジャンプダイブ→2フレーム停止してから扉にタッチしている。

参考動画では、21.36でアイクンがAction=1となり、

bbh-eyes-shot-28

21.40でアイクンがAction=2となる(アイクンがマリオを発見している)。

bbh-eyes-shot-29

(100赤と同じ理屈だが)このまま扉にタッチした場合、乱数が悪いとビームにぶつかってしまうので、2フレーム停止させている。

Shot Timer=5の時にマリオが扉に吸い込まれている(=100%回避できる)のが分かると思う。

bbh-eyes-shot-30

この方法はタイムが遅いのと、こちらをやるのなら迂回法で良いと思うので、オススメはしない。

ただ、アイデアとして存在しているのでここで紹介した。

おわりに

今回は、BBH100赤と親方テレサにおけるアイクンのビーム回避方法に関してまとめた。

その他、RTAにおけるBBHの仕様に関するあれこれも調べたので、そのうちまとめるかもしれない。

ちなみに、棺桶の部屋にいるアイクンに関しては、扉タッチ段階でマリオ⇔アイクンの距離が700ユニット以上になっており、どう頑張っても距離の条件を満たすことができない。

そのため、今回紹介したアイクンとは違い、扉タッチ時点でマリオを発見させることは仕様上不可能であることも分かっている。

今回の調査の延長でこういった事実も知れたので、実りのある調査だったと思う。

メモ: 日本語初期版向け、スターセレクト前提
roomid 0x8035FEE0(s16)
active 0x80342BFB(s8)
action 0x80342D46(s16)
shot timer 0x80342CFC(s32)
shot max 0x80342D00(s32)
※activeは下位1bitがフラグ