しばしば質問に出てくる事柄や個人的に興味を持ったことが、プログラム上でどのように処理されてるかをメモしてみました。
加筆修正などよろしくお願いします。
腕力増加
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 )は
- キャラクターを(ランダム)テレポートさせる。
- キャラクターの足元に特殊ダンジョンの入口を作成する。
- (キャラクターの意志とは関係無く)入口の階段を下りる。( 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()などを参照のこと。
最終更新:2022年11月24日 21:59