アイテムの落下位置

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

倒れた位置に落下

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

周り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マス落下時の終了条件などを追加