ワープ

すぐ近くにはワープしない、かと言って近くにしかワープできなくてもフリーズしない、というあのワープの仕組みを調べてみました。

まず、以下のトライを最大100回繰り返します。
1回目の乱数の下位4ビットと、2回目の乱数を合わせて0000~0FFFの乱数を作り、これを0980未満になるまで繰り返して0000~097Fの乱数を得ます。
これは座標(0,0)~(37,63)に対応するので、対応する座標を調べます。そこが店でない部屋で、尚かつキャラがいなければそこに決定し、そうでない場合はリトライします。

100回繰り返しても店でない部屋に当たらなかった場合(そうなるのは全部通路のシャッフルダンジョンくらいでしょう)はもう少し条件を緩めて、今度は成功するまで何度でも繰り返します。
やはり店には飛ばないようですが、今度はそこにキャラがいなければ通路にも飛ぶようです(隠し部屋・隠し通路の中にも飛ぶようです。私は経験がないので分かりませんが、その後は一体どうなるのでしょうか)。

こうして決まったワープ先とワープ元の、X方向の距離とY方向の距離の和(なぜか単なる距離ではない)を調べて、それが19以下なら今までの処理をもう一度最初からやり直します。次は18以下なら、その次は17以下なら、……と1ずつ条件を緩めていきます。
ワープするキャラがシレンで、尚かつ町の場合、更にワープ先が屋外でなければ最初からやり直す処理も加わります。

ということで、単にワープするだけなのに無駄にトライ回数が多いワープ処理でした。
通常はあり得ませんが、シレンとその隣の2マス以外が全部壁のフロアだと、5秒程かかって隣のマスにワープします。シレンのマス以外が全部壁の場合は、0以下ならやり直し、の次に255以下ならやり直し、となり無限ループ、すなわちフリーズしてしまいます(Windows版は修正されていましたが)。
[PR]
by oyasen | 2010-02-21 12:27 | 改造・解析
<< web拍手への返信 その6 1つのフロアができるまで その3 >>