2015/02/17 部屋の配置
@ffff_furai: 部屋の配置について。URL によると、通常フロアではフロアを5x3のブロックに分割し、中央を除いた14ブロックに部屋を割り当てるのだった。
@ffff_furai: 6Fまでは1つの部屋は1ブロックに割り当てられるが、7F以降は縦横ともに最大2ブロックにまたがる可能性がある。そのため7F以降の部屋の数は少なくなる傾向がある。割り当ての試行をする際、ブロックの幅および高さは等確率で1か2となる。
@ffff_furai: これに基づきシミュレーションで埋蔵金の無いフロアの部屋の数を求めてみたところ、次のようになった。(ソースはURL
@ffff_furai: 6Fまで 0:0 1:0 2:0 3:0 4:0 5:0 6:0 7:228 8:15497 9:246222 10:738053
@ffff_furai: 7Fから 0:0 1:0 2:9 3:998 4:19952 5:117651 6:296356 7:345994 8:180007 9:36913 10:2120
@ffff_furai: 7F以降で10部屋が思ったより少ないのは普段数えていないからだろうか。また、3部屋はたまに見かける気もするが、2部屋は記憶にない。遭遇したら是非教えて下さい。
@ffff_furai: 書き忘れてたけど試行回数はそれぞれ100万回だった。
@ffff_furai: 左上に埋蔵金がある場合に部屋数シミュレートをやってみた(URL。6Fまでは埋蔵金以外で10部屋出る確率が5.8%ほどあるのに対し、2ブロックの部屋がある7F以降は100万回に2回しかなかった。
2015年02月12日 特技使用の決定と状態異常
@ffff_furai: 移動時に攻撃対象が決定され、攻撃時には攻撃対象を持つ敵が攻撃するというのが、敵の行動の原則であった。では特技を使うかどうかはいつ決まるのだろうか。それは敵の種類に依存する。
@ffff_furai: スカイドラゴンやかすみ仙人をはじめとする遠距離系の特技は攻撃対象と同時、すなわち移動時に決まる。遠距離系の敵には専用の移動処理が用意されている。これに対しセルアーマー系やゲイズ系など隣接系の敵の移動処理は特技の無い敵のものと同じであり、攻撃時に特技の使用が決定される。
@ffff_furai: 混乱・封印・キグニ・目潰し状態について考える。これらの状態のときもちろん特技は使用しない。隣接系の特技の使用が攻撃実行時に決まることを考えると、攻撃実行時にこれらの状態異常があるかチェックしてもしあれば通常攻撃をするという判定が必要となる。
@ffff_furai: 場所替えで敵を混乱・封印罠にかける場合、移動時は通常状態であるが攻撃実行時は混乱・封印状態になっている。遠距離系特技の敵に離れた位置から殴られるのはこれが原因だ。対して睡眠・おびえ状態は攻撃実行時のチェックを行わない。場所替えしても特技を使うことになる。
https://twitter.com/ffff_furai
アカウントだけ取りました
ぼうれい武者のバグ
大雑把な下書きです。完全には調べてません。
ぼうれい武者が特定の部屋で左下に向かっていくバグについて。 条件としては、鬼面武者系が召喚ワナで召喚されることで起こる。 召喚ワナによって出現するモンスターを決定する際、まず(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個が配置され、ンドゥバはない。(アイテム数上限のときは除く)
格子・外周マップでの店出現位置
格子マップや外周マップでの店出現位置について調べてみます。
ゲーム内で使われているアルゴリズムをシミュレートし、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マス落下時の終了条件などを追加