2013/11/17
■ [変愚蛮怒/開発]変愚蛮怒開発日誌part9…*破壊*中のクエストモンスター処理を確認
#hengband ダンジョンの主って*破壊*したらその階が再生成されるまで出てこない?クトゥルフが見当たらない。
— 二の足踏みのコウヤ (@koya__) November 17, 2013
@koya__ 暫く待ってると出てきますよー
— Clock / 鳴神 (@ClocQ) November 17, 2013
@koya__ 基本完全回復ですぐ再生成されます。再生成先が見つかりにくいことはままあります。
— なまくらと申したか (@deskull) November 17, 2013
参考:[変愚蛮怒/スポイラー]*破壊*の発動ケースとその処理の流れ(変愚蛮怒 Ver2.1.2 rev3303)
- 該当のマスに敵がいた場合、
- in_generate=TRUEなら無条件にその敵をdelete_monster()関数で消す。
- そうでなく、そのモンスターがクエストモンスターなら、HPを最大まで回復させた上で、*破壊*半径*2+1だけ、テレポートアウェイさせる。
- そうでない場合、delete_monster()関数で消す。ペットは消滅した旨を日記に記録される。
アッキ=ニンジャ『ウルウェン』
普通だったら、テレポ扱いのはずなのに時間経過で再生成とか、 いつまでも出ないとか色々言われてるゾ、おう調べろよ、あくしろよ。
鬼畜大佐『ロムンクァリィ』
という訳で処理の流れを再調査しましたところ…
(以下spell2.c:4643) if (in_generate) /* In generation */ { /* Delete the monster (if any) */ delete_monster(y, x); } else if (r_ptr->flags1 & RF1_QUESTOR) { /* Heal the monster */ m_ptr->hp = m_ptr->maxhp; /* Try to teleport away quest monsters */ if (!teleport_away(c_ptr->m_idx, (r * 2) + 1, TELEPORT_DEC_VALOUR)) continue; } else { if (record_named_pet && is_pet(m_ptr) && m_ptr->nickname) { char m_name[80]; monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE); do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_DESTROY, m_name); } /* Delete the monster (if any) */ delete_monster(y, x); }
アッキ=ニンジャ『ウルウェン』
なんだこの分岐!?(驚愕)
鬼畜大佐『ロムンクァリィ』
*破壊*対象になった各マスのモンスターをすっ飛ばすための処理よ。 クエスト・モンスターの場合処理に入るのは真ん中ね。 teleport_away()関数は所定の範囲内ですっとばす先の候補があった場合、 そこに飛ばしてTRUEを、ない場合はすっ飛ばさずFALSEを返すわけよ。 で、FALSE返した場合はcontinueかましてそのマスの*破壊*処理を キャンセルする≒オブジェクトと地形の破壊を起こさないわけ。
アッキ=ニンジャ『ウルウェン』
はえ~
鬼畜大佐『ロムンクァリィ』
で、この流れ見た結果、どう逆立ちしてもQUESTORフラグが ついてるモンスターはdelete_monster()の対象にならないのよね。 テレポで飛ばされればテレポ先へ、 万一飛ぶ先がなければ、その場に留まるだけのはずだから… クエスト・モンスターが消えるはずはないんだけどなあ。
アッキ=ニンジャ『ウルウェン』
テレポアウェイの距離がモンスターのいる位置から、 破壊半径*2+1となると存外遠くに飛ぶ可能性もあるよな。
鬼畜大佐『ロムンクァリィ』
そう、だから「後になってから再生成されている」とか 「いつまでも出てこない」ってのも単に探すのに時間がかかったか、 いつまでも見つけられなかったって可能性が割りと大。
アッキ=ニンジャ『ウルウェン』
階の雰囲気がよくなったってのも階層の主自身よりは*破壊*に 伴って消えたアイテムや他のモンスターの可能性があるか。
鬼畜大佐『ロムンクァリィ』
というわけで、とりあえずバグではなさそうって結論になりそう。 てか結局メンテナ自身もアウェイ処理じゃなくて、再生成って勘違いしてる件。
アッキ=ニンジャ『ウルウェン』
ちゃんと確認しとけよ、メンテナの屑がこの野郎。