入店と退店に関する判定

以下の記述では ターンの順番モンスターの移動と目的地 の内容を前提としています。

属性とどろぼうとその辺の適当な推論 :ブログマガずン - ブロマガ を踏まえて、店の出入りの判定について説明してみます。リンク先の「属性」という用語をここでは ダンジョン編集 に倣い「地形」と呼びます。

店の出入りに関する判定は2つあり、それらを入店判定・退店判定と呼ぶことにします。両者を合わせて入退店判定とも呼びます。入退店判定では1つの地形を保存していて、これをシレンのいる地形と比較することで入退店を判定しています。この保存される値を前回入退店地形ということにします。ちなみに、通常の入退室判定も同様に前回の地形を保存して判定していますが、入退店判定とは独立した変数を使用します。

入店判定では、前回入退店地形とシレンのいる地形が異なり、かつシレンのいる地形と店主のいる地形が等しいとき、入店と判断します。前回入退店地形は入店時のみシレンのいる地形に設定します。

退店判定では、前回入退店地形とシレンのいる地形が異なり、かつ前回入退店地形が店のとき、退店と判断します。入店判定と違い、退店時でなくても前回入退店地形をシレンのいる地形に設定します。前回入退店地形が店かどうかの判定は店主の位置等とは無関係であることに注意してください。

擬似コードでは、入退店判定は次のように表されます。

入店判定:
  前回入退店地形 ≠ シレンのいる地形 かつ シレンのいる地形 == 店主のいる地形:
    入店(いらっしゃいませ・BGMを変更)
    前回入退店地形 = シレンのいる地形

退店判定:
  前回入退店地形 ≠ シレンのいる地形:
    前回入退店地形が部屋で店:
      退店(請求状態ならどろぼう、そうでないならBGMを戻すなど)
    前回入退店地形 = シレンのいる地形

入店判定は店主の移動時に行われ、退店判定は敵移動と罠発動の間に行われます(つまり退店判定と通常の入退室判定はほぼ同じタイミング)。店主がいない場合・状態異常で店主固有の移動ができない場合・シレンが倍速で店主が行動できないターンの場合等にBGMが変わらないのはこれによります。また、入退室判定と同様、シレンが通常の移動以外で移動した場合、退店判定は即座に実行されます。ただし、その場合前回入退店地形は変更されません。

sm16111601 で泥棒にならない理由を考えてみましょう。店主が通路にいる状態でシレンが店から通路に出た場合、入店判定で入店扱いになり、前回入退店地形が通路に設定されます。退店判定では、前回入退店地形とシレンのいる地形がともに通路であるため、退店となりません。店主が状態異常等の場合、入店判定が実行されないため、退店判定において前回入退店地形は店の部屋、シレンのいる地形は通路となるため泥棒になります。通常の移動以外で店から出たときは即座に退店判定が実行されるため、こちらも泥棒になります。

店主と身代わりが店内にいる場合を考えます。身代わりがいるとき、入店判定では(より一般的に言うと敵移動時には)身代わりのいる地形をシレンのいる地形とみなして判定を行います。それに対し退店判定では身代わりがいてもシレンのいる地形は影響されません。そのため毎ターン入店と退店が繰り返されることになります。

シレンが透明のとき(つまりエーテルデビルへの変身時)を考えます。入店判定時(敵移動時)にシレンのいる地形は通路と見なされますが、退店判定時は実際にシレンがいる地形が使用されます。さらに店主が通路にいる場合の挙動もこれで説明できます。ただし、シレンが透明のときはマスの地形の判定とは関係なく泥棒扱いにしないという例外処理が行われていることに注意する必要があります。