さて、前回スペランカーの赤いクスリにまつわる裏技を一通り説明したが、ページ数の関係上スペランカー体内で起きている現象を大分省略して説明した。 そこで、今回はその補足講義を、スペランカー考古学チームの協力を得て解説する。
Spelunker D・N・A
アルゴ解説
左の図は遺跡から発掘されたスペランカーのDNAに関する古文書のうち、 オクレモードが”OFF”になる仕組みをフローチャート化したものである。
オクレを取得すると
オクレ兄さん(赤いクスリ)を取得した場合、スペランカー内部では OkureTimerの値を1引く処理が行われる。 スペランカーが通常モードの場合、OkureTimerの値は0である。OkureTimerは符号無し8bitのため1を引くと255となる。 これを念頭において、なぜオクレモードがOFFになるのか説明していこう。
オクレモードがOFFになるまで
さて、スペランカー体内では左の図のルーチンを4フレームに1回(約0.067秒に1回)実行している。 このルーチンが実行されると、まずスペランカーはOkureTimerの値をチェックする。 OkureTimerの値が0より大きい場合は"N"に分岐しオクレモード処理を続行する。
スペランカーはオクレに関して処理の高速化のため(?)2つの変数でオクレを管理している。
- オクレモードフラグ
- オクレタイマー
である。オクレタイマーはオクレモードかどうかの判定にもちいられ、 オクレモードフラグは実際の移動量の増加に使われる。
さて、オクレモード中と判定されると、オクレモードフラグがONになり、 次にオクレタイマーを1引く処理が行われる。 その後オクレタイマーが0になったかどうかチェックされる。 このときオクレタイマーが0になるとオクレモード終了ルーチンが呼ばれる("Y"分岐)。 まだオクレタイマーの時間が残っている場合はオクレモードのまま処理を続行する。
オクレ兄さん永久持続理論とは?
それでは、オクレ理論を用いるとスペランカーはなぜオクレモードのままなのだろうか?これには先ほど述べた2つ法則が関係している。
- オクレを取得するとOkureTimerが1引かれる。
- オクレモードフラグが実際の移動量に関係する。
さて、オクレが切れる最後の瞬間(上の図中の赤い矢印の位置)でのパラメータは
- OkureTimer = 1
- OkureMode = on
となっている。しかし、この瞬間に2つ目のオクレを取得するとどうなるのだろうか? オクレ取得ルーチンはオクレを取得した瞬間からオクレ効果を出すために、OFFにするルーチンよりも前に実行される。
つまり OkureTimerを1引いてしまうのだ。つまり赤い矢印の位置の時パラメータが
- OkureTimer = 0
- OkureMode = on
となってしまう。するとスペランカー体内ではOkureTimerが0のため、 な〜んだオクレ取ってないじゃん。と勘違いし、オクレタイマー減算及び
オクレモードフラグをOFFにするルーチンをスキップしてしまう
そのため、音楽こそ通常に戻るもののオクレ効果は持続する。以上がオクレ理論発動の原理である。
結局オクレ理論って?
かなり暴走気味に解説してしまいましたが、結局のところオクレ理論って スペランカーのバグなんじゃ、、、 なんて思ったとしたら、即座にその考えを捨てること。 条件が超限定された上に特定の1フレームのみでしか起きないという、 まさにスペランカー的難しさを誇る奥義と理解してほしい。
でもバグだよな、、、(ボソ
補足の補足
さて、ここまで読んでくれた人で、同様にして永久無敵とか、 永久点数2倍とかも実現するのではと思い必死に1フレームを狙って努力している人がいたら悪いので、 永久無敵、永久点数2倍は起きない事もここで触れておこう。 無敵と点数2倍はタイマーの値自身をフラグとして用いているため、 オクレ理論を適用することはできないのだ、、、無念。
こうして、またしてもスペランカー無敵技は否定されたのであった。 真のスペランカー無敵技を求めて、スペランカー考古学チームは今日も遺跡の発掘を黙々と進めるのであった(涙)