SFC風来のシレン研究ノート

元々ブロマガでやってたやつ

【上級者向け】突風フラグを利用したマムルマークTASの改善案(未完成)

とりあえずこれは見てもらいたい



最速でマムルマークを付ける一つの方法論として、
「フェイクリアフラグ+突風を起こす」ということが考えられているのは、
前回のTASの通り



そして今回、アドレス7ED606が書き換えられれば、
直接突風が起こせるかもしれない、ということがわかりました。

これが可能なのか?を考察したのが以下の文章になります。
長い内容になってしまいましたが、
結果だけ言えば「難しすぎて、できるかわからない」ので、
暇な時お読みください。



目標:アドレス7ED606のFFを0x80未満(1,2は除く)にする

 より正確には7ED606の意味:
  上位1bitが0のとき、突風イベントの判定を行う。
  判定は下位bit-1が
  ・1:風が吹きそう    
  ・0:強くなってきた
  ・2以上:突風
 なので、下位bitが0または3以上の時は突風が吹く

 よって通常FFの値を持つ7ED606を03~7F(3~127)に変えることが目標になる。

・異常座標における7ED606

a)キャラコードでは座標(255,255)まで行ってもこのメモリにはたどり着かない。

b)道具・罠コードの場合(39,220)が目標
しかし、道具・罠コードは81以上の時は罠関係を意味するが、
通常、最大でもF0までしかとらないためFFは「異常な罠」になる。
具体的には、罠情報の参照先が異常になり、発動するとフリーズしてしまう。

さて、SFCシレンにおいてバグを使わず「罠を消す」という方法はたった一つしか存在しない。
それは「チキンの爆風による肉化(仕様!)」である。
だから、この座標に頑張ってチキンを置いて、うっぷんばらしの壺を吸い出すなどすれば、
罠が肉に書き換わって、めでたく突風フラグが立つ…

とは、ならない。

なぜなら、この周囲に存在する「矢:」は、爆風などの影響に弱く、
「矢:」の周囲で爆風を起こすとフリーズしてしまう。

じゃあ、周囲8マスの「矢:」を取り除くといいか?というと、それも駄目だ。

なぜなら、7ED606の周囲はかなりデリケートなフラグが固まっていて、
その周囲の「矢:」を取り除くということは、すなわち周囲のフラグを全て空白の80(など)に書き換えることを意味する。
結果としては、フラグを書き換えることで多かれ少なかれフリーズしてしまう

だから、「チキン爆風」によるフラグ書き換えは、どうやっても不可能だ

c)地形コードの場合(39,178)
地形コードは種類がかなり少なく、E0の壁かF0の外壁でないかぎり、
どんな数値が入っていても移動は自由だ。
しかし、人力で地形コードを書き換える方法は、「E0の壁を掘る」場合しか存在しない。
だから、「壁を作る」方法でもない限り、このマスの地形情報を書き換えることはできない。

さらに根本的な問題があって、
実はキャラコードの異常座標アドレスのうち、7EC5A3~7EC639まで、
座標で言うと(4,197)~(26,199)までには、
なんだかわからないが0x17という値が埋まっている。

こいつはとんでもなく曲者で、(4,197)~(26,199)っていうことは
少なくともy=198の行は丸々このキャラコード17が埋まっていることになる。

キャラコード17とは、シレンのキャラコード0x13(20)より大きいため、
ステータスの参照先が異常になる。

具体的にはキャラコード4のステータスの一部を参照しているが、
とにかく13より大きいキャラクターはやたらフリーズする。

だから、安定してこいつを消したり、亡霊武者にして乗り移ったり、ということができない。

端的にいうと、「異常座標は、y<198の領域には行くことができない」ことを意味する。

よって、地形コード(39,178)にたどり着くことはそもそも出来ない。

d)マップ化コードの場合(39,136)
実は街でも、異常座標ではマップ化情報は更新されていて、
見える範囲のマップ化コードが81(外壁かつマップに記載あり)に変わっている。

だから、目的の座標にたどり着ければ書き換えの可能性はあった。
しかし、地形コードと同じく、このy座標へはそもそも到達できない。


だから、普通のやり方でマイニングするだけでは、a)~d)のどれを使っても、
7ED606を書き換えることはできない…

が、一つだけ方法がある。

それは、b)罠・地形コード と、回想バグの組み合わせだ。

「罠を取り除く方法」はもう一つだけあって、それは
回想バグによる「不可能足元」を起こすことだ。

現状は階段や出口の取得でしか使われていないが、これを罠に適用すれば、
理論上はバグ罠であっても取り除けるはずだ。

しかし問題は2つある。

1つは、罠を取り除いて、コードが空白の80になった直後に突風が吹くということ。
不可能足元は「回想内でしか起こせない」という不可避な条件があるので、
つまり7ED606のバグ罠を回想内で取り除くことになってしまう。

そうして回想だけで突風が起きてしまうと、ロード時に仕様上倒れた扱いになってしまい、
クリア扱いになることができない。

しかし、これはまだ現実的な解決策がある。

それは、「回想内では一旦、バグ罠と道具番号01(または02)を入れ替える」という方法だ。

こうすれば、ロード時足元にあるのは書き換え可能な道具になり、突風も吹かないので、
これを改めて取り除いてから別の道具を置けば突風が吹くはずだ。
だからこれはなんとかなる。


問題は2つ目で、「そもそも異常座標と回想バグの組み合わせは可能か?」という本質的な壁だ。

すくなくとも、「通常の座標で回想バグを起こして、回想でだけ異常座標に飛ぶ」はうまくいかない。

なぜなら、異常座標ではy軸方向に相当進む必要があるので、
α世界線(プレイ中)ではすぐに壁にぶつかってしまい、更に上に進むことができなくなる。

だから、「異常座標で回想バグを起こし、かつ座標をずらした上で、β世界線でだけ目的の座標に行き着く
という方法を取らざるを得ない。

しかし、どうやら異常座標のメモリの一部(y=230あたり)は、
画面描画時に一時的に使われる領域が存在するらしく、
具体的にはシレンが移動するごと、道具欄を開くごと、などで
値が激しく変化する

α世界線だけで見る分には、仮に隣のメモリが更新されたとしても
改めて亡霊武者の肉を投げるとか進む方向を迂回するとかすれば済む。

しかし、回想中、しかも座標がずれた状態も矛盾なく制御して、
かつ回想での座標を目的の位置に調整する、ということは生半可には行かない。

なぜなら、回想バグの座標そのものと同じように、
β世界線の情報はツールを使ってさえも直接知ることはできないからだ。

言い換えると、「ロード後のメモリ状態」は、
「セーブデータを元にシレンのプログラムを走らせた結果」であるため、
ロードするまでわからない。

これはSFCシレン本質的な問題であって、例えばこれを「ツールで予測する」
とは、「SFCシレンのプログラムそのものを作る」と同義になってしまう。


…とはいえ、原理的に「不可能」ではない。

道具欄描画を最低限に抑え、毎ターンβ世界線を確認しながら、
α世界線でもβ世界線でもフリーズしないよう目標の座標に向かい、
足元のバグ罠と道具番号01を入れ替え、
ロードした後道具を更に入れ替え突風を起こし…

とすれば、時間としてはマムルマークTASはずいぶん早くなる…はずだ。



はずだが…


うーん…