2015/02/17 部屋の配置

2015年02月12日 特技使用の決定と状態異常

ぼうれい武者のバグ

大雑把な下書きです。完全には調べてません。

ぼうれい武者が特定の部屋で左下に向かっていくバグについて。
条件としては、鬼面武者系が召喚ワナで召喚されることで起こる。

召喚ワナによって出現するモンスターを決定する際、まず(0,0)の位置にモンスターを1体発生させ、
種族を取得し、そのモンスターをすぐに消去するという処理が行われる。
出現するモンスターが鬼面武者系の場合、(0,0)でぼうれい武者出現フラグが設定される。
ぼうれい武者は(0,FF)か(1,FF)に出現する。(出現後どこまで動く?)
このときぼうれい武者は部屋番号0の部屋にいて、フロアのどこからでも左下の位置にいると認識される。(常にそうか?)
そのため、部屋番号0にいるぼうれい武者は左下にいる(と認識される)ぼうれい武者に向かおうとする。

(2016/2/21追記)
参考: 【資料】 ぼうれいバグ@天馬峠 - ニコニコ動画

ぼうれい発生時、X座標がFFのマスが選択されることがある。しかしその場合失敗と見なされるため、通常より発生が遅くなる X座標がFFのマスは選択されない。(2016/4/9修正)

(0,FF)で参照されるマスの地形のアドレスは$7EE920となり、未使用領域なのでおそらく通常は0(=部屋番号0の部屋)になると思われる。(1,FF)も同様。

(0,FF)にいるキャラはアドレス$7ED41Fで参照され、これは倉庫の39番目のアイテム、すなわち山頂の町の10番目のアイテムの呪いの値を表す。そのため山頂の町の10番目と11番目の位置にアイテムがあり、呪いの値が0x80未満の場合バグは発生しない?

通常状態では移動先のX座標ないしY座標の最上位ビットが立っているとき(=0x80以上のとき)は移動できないため、発生地点から移動できない。多分
目潰し状態の場合、X座標については同じだがY座標については0x80以上でも移動できる。

ぼうれいが(2,FD)にいて右上を向いている時を考えると、正面の座標は(3,FC)で、この座標にいるキャラは$7ED362によって参照される。これはイベント進行度CEの値だが未使用のため0になる。よって目潰し状態のぼうれいはキャラ番号0のキャラに攻撃対象を設定し、この際ダッシュも妨げられる。

店のアイテムについて

結構前に書いたけど出してなかったやつです。あけましておめでとうございます。

アイテムとンドゥバの個数

店には店売りアイテム5〜9個(ランダム) + ンドゥバ1個がアイテム優先で配置される。
例えばアイテムを配置できるスペースが9マスで8個アイテムが並んでいるとき、店売りアイテム7個+ンドゥバが配置されているとわかる。
アイテムスペースが9マスでアイテムも9個並んでいるとき、店売り9個ンドゥバなしか店売り8個+ンドゥバのどちらか。
アイテムスペースが4マスしかないときは必ずアイテム4個が配置され、ンドゥバはない。(アイテム数上限のときは除く)

アイテムスペースについて

店部屋の中央を中心とする3x3のマス。
ただし、部屋の幅や高さが偶数のときどちらに寄るかはランダム。
例えば次のような場合、1か2を中心とする3x3のマスになる。
1の場合9マス配置できるが、2の場合は店主スペースによって7マスしか配置できない。

■■■■■■
■□□□□■
■□□□□■
■□12□■■■■■■■
■□□□□□□□□□□□
■□□□□■■■■■■■
■■■■■■

格子・外周マップでの店出現位置

格子マップや外周マップでの店出現位置について調べてみます。
ゲーム内で使われているアルゴリズムをシミュレートし、10000回ずつ店の位置を集めてみました。
https://gist.github.com/1768143

格子:
   0  720  285  289  763    0
   0  275    0    0  315    0
   0  389    0    0  465    0
   0 3429 2023  288  759    0
no shop: 0

外周:
   0    0    0    0    0    0
   0 1277    0    0 1802    0
   0 2385    0    0 3881    0
   0    0    0    0    0    0
no shop: 655

格子マップでは左下が出やすく、外周マップでは右下、左下、右上、左上の順に出やすいようです。

外周フロアでは、四隅の部屋はそれぞれ1/2の確率で隣の部屋と繋がります。
この4部屋がすべて隣の部屋と繋がっている場合、そしてその場合に限り、店は出現しません。
そのため外周フロアで店が出ない確率は1/16としてよいと思われます。

アイテムの落下位置

アイテムの落下位置について考えます。
モンスターがアイテムをドロップした場合を想定しますが、投げて落ちた場合なども同様です。

倒れた位置に落下

モンスターが倒れた位置にアイテムが落下できる、つまり壁や水脈でなく既にアイテムや罠が無い場合、そのマスにドロップします。

周り1マスに落下

倒れた位置に落下できない場合、周り1マスから落下位置を決定します。

モンスターが倒れた位置を中心として、次の表のように番号を振ります。
つまり、倒れた位置が(5)、左上が(1)、上が(2)、...とします。

(1) (2) (3)
(4) (5) (6)
(7) (8) (9)

このとき、落下位置は次のように決まります。

(1)から(9)の中からランダムにマスを取得。
そのマスにアイテムが落下できるなら落下位置をここに決め終了。
落下できないなら次のマス((1)なら(2)、(2)なら(3)、(9)なら(1)など)を順次調べ、最初に落下できる位置を落下位置とする。
どの位置も落下できないなら落下位置を無しとする。

これから分かるように、周り1マスのそれぞれのマスにドロップする確率は均等ではありません。
例えば次の場合、地雷にかかったトドのアイテムが左に落ちる確率は7/9、右に落ちる確率は2/9になります。

■■■■■           ■:壁
□□雷□□           □:通路
■■■■■           雷:地雷

周り2マスに落下

周り1マスに落下できない場合、周り2マスから落下位置を次のように決定します。

ステップ1:
(1)から(9)の中からランダムにマスを取得し、そのマスをCとする。

ステップ2:
Cが壁・水脈でないとき:
  Cを中心として周り1マスの落下位置を求める。
  落下位置が無いか、モンスターが倒れた位置が部屋かつ落下位置が部屋でないならCを次のマスに設定し、ステップ3へ。
  そうでなければ落下位置をそのマスに定め終了。
Cが壁・水脈のとき:
  Cを次のマスに設定し、ステップ3へ。

ステップ3:
Cが(1)から(9)すべての場合にステップ2を実行していたとき: 落下位置を無しとして終了
それ以外のとき: ステップ2へ

ステップ2は最大9回繰り返されます。

例として次のような場合を考えます。

◇◇■■        ◇:部屋
矢◇□■        □:つるはし穴
水矢矢■        ■:壁
水▲矢□        ▲:落とし穴
水矢矢■        矢:矢
矢矢■■        水:水脈

このとき、落とし穴にかかった敵がアイテムを持っていても落下できず消えてしまうことがあります。

2018/11/25 周り2マス落下時の終了条件などを追加