※ 重要なお知らせ ※
この記事の内容は一部間違いが含まれています
Advent Calendarの記事なのでこのまま残しておきますが、正確性の高い記事はこちらの記事を参照して下さい

この記事は Roguelike advent calendar 2019 20日目の記事です

初めましてこんにちは、みたびHourierでございます
メイジノススメですが、主催のdis-様にコメントを頂きました
どうもありがとうございます!

そしてkanu様もまた、ブログへのコメントありがとうございます!
カレンダーもまもなく完了へ向かいます今日この頃は、kanu様から頂いたコメントを元にソースコードを読み解き、神秘の蓋を開けちゃいましょうという趣旨です
コメントそものはこちら、累計100回以上に渡るランダムクエスト (以下RQ)への突入結果を提供頂きました!
誠にありがとうございます!


まえがき
>dis-様へ
筆者は元々シレンジャーとして「もっと不思議」を最深部までクリアできる腕前になってからPC系のあれやこれやに手を付け始めたというのもあって、特に変愚は序盤の「死んで覚えろ」が簡単でした
メイジやら戦士以前の問題として「そこらの村人っぽいtに殺されたんだけどどうすればいいの……」を解説するのは、筆者のいわば「中途採用」な立場からでは逆に難しい部分もあり、そのレベルの初心者向け情報があまり転がっていないのは憂慮すべきなのかもしれません 言い出しっぺの法則
言われてみると確かに最初の1~2回は余裕で村人に殺されりクローカーから八つ裂きにされた記憶もありますが、同時に数時間もかからずに克服できてしまいました
タイムマシンで20年くらい前の自分を連れてくれば色々書けるんでしょうけどね!
この辺の拡充もいずれ行っていきたいところではありますが、いつになるのやら。。。

(ここまで書いて思い出しましたが、PC系の操作はElonaで覚えました!)
(ToME4と併せて、とっつきやすいゲームの1つであることは間違いなさそうです)

といったところで本題へ!


変愚蛮怒のRQにおけるモンスター選定
残念ながらコード読解力はへなちょこなので、詳細へ立ち入るとイマイチ何をしているのかが分かりませんでした(五体投地
しかしメインの処理は単純で、quest.c のdetermine_random_questor() です
車輪の再発明感が半端ないですが、解読してみましょう

ユニークフラグがあるのは当然として、更に以下の条件を持つモンスターは除外されます
いくつかの条件は既プレイ者 (が読者様のほとんどだと思いますが)の感覚に一致しているはずです
  • クエスト限定のモンスターである(凄いことに、オベロンとサーペントを除くと『ゴルフィンブール』しかいない。街で受けられるクエストかつRQ相当のレベルに該当するのがこいつだけということ……!)
  • Rar値が100を超えている (アリーナ専用ユニークは255で、他に101~254のモンスターは見かけなかった。これらを弾いている模様)
  • 状況に応じて友好的になるユニーク (『ナミ』、『ファンゴルン』等が該当)
  • 水棲モンスター (『ジョーズ』、『カリブディス』等が該当)
  • 荒野にのみ出現するモンスター (『手負いの熊』が該当)
  • 既にRQ討伐対象に選ばれたユニークは、二重には選ばれない
  • 存在自体に特殊なフラグが付与されている『バーノール=ルパート』『摂政バーノール公』『ルパート将軍』 (他にも増やそうか個人的に勘案中)
具体的なモンスター生成方法は以下の通りです。クエスト階層をXとします
ここでYは1~X/10の乱数、端数切り捨てです
  • レベルがX+5+Y 以下のモンスターをランダムに選定する
  • 上記条件に当てはまるユニークを探す
  • ユニークのレベルがX+X/20 (端数切り上げ)以上ならば採用
以上より、最終的に選ばれるユニークの階層は以下の通りです
  • 6F:7~12F
  • 12F:14~19F (但し19Fのユニークはいないので実質18F)
  • 24F:26~30F (但し30Fのユニークは『ジョーズ』のみ、かつ水棲フラグ持ちなので除外され実質29F)
  • 38F:40~46F
  • 44F:47~53F
  • 50F:53~60F
  • 56F:59~66F (一応『ディオ・ブランドー』も出うる)
  • 62F:66~73F
  • 76F:80~88F
  • 88F:93~101F (100Fと101FにRQ討伐対象はいないので、実質99Fの『秩序のユニコーン』まで)
以上の結果より、19Fと30FはRQ空白地帯であることが分かりました
あなたも面白いモンスターを実装すれば、きっとRQでお目にかかれますよ!

なお60Fの連中、すなわち『次のRQ討伐対象が弱いまである』可哀想なユニークちゃん達を以下に列挙します
何故Dとpしかいないんでしょうか……
見かけたら養豚場の豚を見るような目で見てあげて下さい ここらに追加を計画してるpがいるんですがそれは
氷竜『ブラムド』
水竜『エイブラ』
邪竜『ナース』
金鱗の竜王『マイセン』
万色の『サルマン』
灰色の『ガンダルフ』
アンバーの狂気の夢想家『ブランド』

「被らないようにRQを再配置」とか「隙間の空いているエリアにRQを追加」とか夢は膨らみますが、バランスが崩れそうなので難しいところですね!(適当に放り投げつつ〆)

余談1
もちろん「ダンジョンの主」フラグが立っている『シューティングスター』等はRQに出ないんですが、このフラグをどう処理しているかイマイチ分かりませんでした
「このモンスターはダンジョンの主である。」という思い出はGARDIANフラグに由来すると書いてあります (monster1.c のroff_aux() ですが、強烈に長い関数なので注意)
しかし該当のフラグは『混沌のサーペント』にしかついておりません
よく調べたら、モンスター (r_info)ではなくダンジョン情報 (d_info)の方に「ダンジョンの主は○○」と書いてありました
但しd_infoをGUARDIANに変換する具体的な処理はどこにあるか見当たらなかった上に、ちょっとツギハギコードな感じがしてもにょります。。。
その内調べてまた報告します

余談2
悪夢モードだとヤバみが深いですが、調べる気力が尽きたので後日改めて調査しようと思います 今回 まだその時と場所の指定まではしていない そのことをどうか諸君らも思い出していただきたい
なおRQ討伐対象にnasty生成は寄与しません (以前はこんなバグもあったが修正済)

経験則である程度分かっている部分の解析でしたが、空白地帯の存在は意外でした
何かに活かせるんじゃないかと妄想を膨らませつつ、年末に向けて突っ走っていきます!

さて、Advent Calendarのネタはこれにて以上です
とはいえ他にいくつかネタもあるので、それらはカレンダーとは別にあれこれお話してみようと思います
例によって長文になりましたが、お読み頂きありがとうございました!

明日は宮下レベッカ様の「Angbandの隠されたテーマについて」です、お楽しみに!