特定イベントの処理

しばしば質問に出てくる事柄や個人的に興味を持ったことが、プログラム上でどのように処理されてるかをメモしてみました。
加筆修正などよろしくお願いします。


腕力増加

Q: オカワルの特殊能力や腕力の薬による「腕力増加」って、腕力+5とは思えないぐらいに体感的には強いんだけど?
A: 腕力増加時には腕力+5されるだけでなく"might"状態になり、攻撃のダメージに1-10点が追加される。

you_attack() in fight.cc

               if (you.might > 1)
                   damage_done += 1 + random2(10);


地獄の業火

Q: 地獄の業火って強すぎ。耐火が3段階も付いてるのに。
A: 地獄の業火は"HELLFIRE"属性で通常の火属性とは異なる。そしてHELLFIRE属性に対応するプレイヤー側の耐性は存在しない。

zappy() in beam.cc

   case ZAP_HELLFIRE:                                  // cap 200
(中略)
       pbolt.flavour = BEAM_EXPLOSION;
(後略)

によってZAP_HELLFIREの属性(flavour)が一時的にBEAM_EXPLOSIONにセットされ、爆発を判定するexplosion1()によって、

   if (stricmp(pbolt.beam_name, "hellfire") == 0)
   {
       seeMsg = "The hellfire explodes!";
       hearMsg = "You hear a strangely unpleasant explosion.";
       pbolt.type = SYM_BURST;
       pbolt.flavour = BEAM_HELLFIRE;
   }

と書き換えられる。
一方、プレイヤーの耐性を判定するcheck_your_resists() in ouch.ccには、case BEAM_HELLFIRE が存在しない。


浮遊によるアビス行きの回避

Q: 浮遊状態だとアビスやパンデモニウム、ラビリンスに行くことを回避できるのに、どうして飛行や飛行制御状態ではダメなの?
A: 浮遊状態では階段を下ることが出来ないが、飛行状態では階段を下りることが出来るから。

アビスやパンデモニウム、ラビリンスなどの特殊ダンジョンへの強制移動( banished() in effects.cc )は

  1. キャラクターを(ランダム)テレポートさせる。
  2. キャラクターの足元に特殊ダンジョンの入口を作成する。
  3. (キャラクターの意志とは関係無く)入口の階段を下りる。( down_stairs() in misc.cc )

という仕組みになっているのだが、浮遊状態だとdown_stairs()の中の例外に該当するので特殊ダンジョン行きを回避できる。
結果、コメント"// heh heh"が空しく響くことになる。

banished() in effects.cc

void banished(unsigned char gate_type)
{
    you_teleport2( false );

    // this is to ensure that you're standing on a suitable space (67)
    grd[you.x_pos][you.y_pos] = gate_type;

    down_stairs(true, you.your_level);  // heh heh
    untag_followers(); // safety
}                               // end banished()

down_stairs() in misc.cc

   if (player_is_levitating() && !wearing_amulet(AMU_CONTROLLED_FLIGHT))
   {
       mpr("You're floating high up above the floor!");
       return;
   }


変身能力者の秘密

 イヤな強さを誇る、変身能力者(shapeshifter)と暴走した変身能力者(glowing shapeshifter)。彼らの変身能力を調べようとしてmon-data.hやmon-spell.hを眺めても載っていないことに気付く。

 実は彼らの変身は能力ではなく状態異常(enchantまたはench)として扱われているのだ。彼らの扱いについて調べるときはENCH_SHAPESHIFTERあるいはENCH_GLOWING_SHAPESHIFTERに注目しよう。具体的な変身アルゴリズムはmonstuff.ccのhandle_enchantment()やmonster_polymorph()などを参照のこと。

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2022年11月24日 21:59