Raal's Tome of Destruction

主にroguelikeのことを書くブログです

財宝ドロップ仕様(Beta22)

この記事はRoguelike Advent Calendar 202420日目の記事です。

旧来の財宝ドロップ仕様について

変愚蛮怒の財宝生成ロジックには主に歴史的経緯により重大な欠陥があった。
かつての仕様についてはHourier氏の記事に詳細があるので、興味のある方はご一読を。

ざっくりと以下のような問題があった

・財宝の生成階層を指定するのに特殊な制約がある
・財宝の生成確率を画一的にしか設定できない
・財宝の種類が増える度に生成バランスが大きく変化する

Beta22のドロップ仕様

現行の財宝定義は以下のようなものとなっている。

    {
      "id": 494,
      "name": {
        "ja": "ダイヤモンド",
        "en": "diamonds"
      },
      "symbol": {
        "character": "$",
        "color": "White"
      },
      "itemkind": {
        "type_value": 127,
        "subtype_value": 15
      },
      "parameter_value": 0,
      "level": 1,
      "weight": 0,
      "cost": 56,
      "allocations": [
        {
          "depth": 1,
          "rarity": 15
        },
        {
          "depth": 10,
          "rarity": 12
        },
        {
          "depth": 20,
          "rarity": 8
        },
        {
          "depth": 28,
          "rarity": 6
        }
      ]
    },

生成に関するのは"allocations"の中身。他のアイテムと同様に生成階層と希少度を最大4組定義する。
生成パワーXで財宝が生成されるとき、X>=生成階層となる組の(100/希少度)の重みが生成テーブルに追加される。
ダイヤモンドの場合であれば、生成パワー20のとき生成テーブルには(100/15)+(100/12)+(100/8)=26が加わる。

これを全ての財宝に対して行い、生成テーブルを生成する。そして重みに応じた確率で財宝が抽選される。
生成パワー20であればだいたいこのような生成比率になる。


結局どう変わったのか?

生成階層と生成率を自由に定義できるようになり、階層の深さによって生成率の変化をつけられるようになった。
具体的には浅い階層から低確率で出現する財宝を定義できるようになった。
現状では高額な宝石類を低確率で生成するようになっているが、無駄に希少度の高いクズ財宝を定義することも可能だ。
希少度の設定が自在になったのでネタ財宝を導入してもゲームバランスへの影響を極小にできるようになったのも加点要素と言えるかもしれない。

ゲームバランスへの影響について

財宝のドロップ期待値を全体的に良くして金回りが少し楽になるように調整した。
武器防具のドロップが良くなった影響でゲーム展開が早くなり、資金が不足しがちになる現象への補填の意味合いがある。
同時期に追加したクリーピング宝石類と宝石ゴーレム類と合わせて序盤の資金不足が少しは解消されることと思われる。

落とす財宝の種類は金銀銅の三種が大半を占めるように調整している。
低確率で宝石類がドロップし、さらに低確率でミスリルとアダマンタイトがドロップする。
あらゆる財宝生成にアダマンタイトまでの可能性を与えたので、1Fにミスリルが落ちていたり地上の酔っぱらいがアダマンタイトを抱えていたりもする。

総じて「少し金回りが良くなる」「たまに高い財宝が出る」程度でゲームへの大きな影響はない。
少し増えた資金でいつもより一本多く致命傷治癒の薬でも買って鉄獄ライフを楽しんでほしい。

変愚にJSONがやってきた ~モンスターデータをJSONで書いてみた~

この記事はRoguelike Advent Calendar 2024の13日目の記事です。



変愚蛮怒にモンスターを追加したい、既存のモンスターのパラメータを変更したい、そういう要望は昔から多かった。
しかしながら、歴史的経緯による難解すぎる記法がそれらの要望を阻んできていた。
時は令和。定義ファイルがほんの少し大きくなることに目を瞑って人類にも読める形式に変換してみた

歴史的記法の闇

まず、変更前の姿を見ていただこう。

#J0#(コメント)
#J0# 「ドロレム」という読み方も聞きました
#JZ#(コメント) GPS さん
#JZ#ドラゴン型のゴーレムなので、読みはドローレムがいいかと思います。
N:691:ドローレム
E:Drolem
G:g:g
I:120:30d100:25:130:30
W:44:8:12000:0:0
B:BITE:HURT:5d8
B:BITE:HURT:5d8
B:CLAW:POISON:3d3
B:CLAW:POISON:3d3
F:PREVENT_SUDDEN_MAGIC | FORCE_MAXHP | RES_TELE |
F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | 
F:DRAGON | IM_FIRE | IM_COLD | 
F:IM_ELEC | IM_POIS | CAN_SWIM |
F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | RIDING
S:1_IN_6 | 
S:BLIND | SLOW | CONF | SHOOT | 
S:BR_POIS
D:$A constructed dragon, the drolem has massive strength.  Powerful spells 
D:$weaved during its creation make it a fearsome adversary.  Its eyes show 
D:$little intelligence, but it has been instructed to destroy all it meets.
D:人工的に作られたドラゴンであるドローレムは屈強な力強さを持っている。
D:その創造に際しては強力な呪文が用いられ、それがこのモンスターを恐るべき
D:強敵に仕立て上げているのだ。その目には知性のかけらも見いだすことはできず、
D:唯一知っていることは、出会ったもの全てを倒すということだけだ。


まず、IとWの行については*訓練*されていなければ何がなんだか分からない。
一応この定義ファイルの先頭にコメントで説明されてはいるのだが、お世辞にも分かりやすいとは言い難い。
速度が+10と読み解くことはこの記法を理解した上で内部値が110の下駄を履いていることを知らなければ無理だ。
射撃威力が打撃の一つ目の威力を参照して5d8であることなど開発者ですらほとんど知らない暗黒の仕様であった。

(打撃定義の読込を最大4回にしていた + 射撃定義と打撃定義で同じ領域を使っていたことに由来する。)


当然ながらヒューマンエラーの温床になっていたし、モンスターに相応しくない謎の値が設定される一因ともなっていた。
不可解な感知範囲、警戒度のモンスターは未だに残っているので興味があれば調べてみると面白いかもしれない。
(そして修正案を出すと採用されるかもしれない)

JSON

では、この暗黒記法をどのように更新したのか見ていこう。

    //#J0#(コメント)
    //#J0# 「ドロレム」という読み方も聞きました
    //#JZ#(コメント) GPS さん
    //#JZ#ドラゴン型のゴーレムなので、読みはドローレムがいいかと思います。
    {
      "id": 691,
      "name": {
        "ja": "ドローレム",
        "en": "Drolem"
      },
      "symbol": {
        "character": "g",
        "color": "Green"
      },
      "speed": 10,
      "hit_point": "30d100",
      "vision": 25,
      "armor_class": 130,
      "alertness": 30,
      "level": 44,
      "rarity": 8,
      "exp": 12000,
      "blows": [
        {
          "method": "BITE",
          "effect": "HURT",
          "damage_dice": "5d8"
        },
        {
          "method": "BITE",
          "effect": "HURT",
          "damage_dice": "5d8"
        },
        {
          "method": "CLAW",
          "effect": "POISON",
          "damage_dice": "3d3"
        },
        {
          "method": "CLAW",
          "effect": "POISON",
          "damage_dice": "3d3"
        }
      ],
      "flags": [
        "FORCE_MAXHP",
        "RES_TELE",
        "EMPTY_MIND",
        "COLD_BLOOD",
        "OPEN_DOOR",
        "BASH_DOOR",
        "DRAGON",
        "IM_FIRE",
        "IM_COLD",
        "IM_ELEC",
        "IM_POIS",
        "CAN_SWIM",
        "NO_CONF",
        "NO_SLEEP",
        "NO_FEAR",
        "NONLIVING",
        "RIDING"
      ],
      "skill": {
        "probability": "1_IN_6",
        "list": [
          "BLIND",
          "SLOW",
          "CONF",
          "BR_POIS"
        ],
        "shoot": "5d8"
      },
      "flavor": {
        "ja": "人工的に作られたドラゴンであるドローレムは屈強な力強さを持っている。その創造に際しては強力な呪文が用いられ、それがこのモンスターを恐るべき強敵に仕立て上げているのだ。その目には知性のかけらも見いだすことはできず、唯一知っていることは、出会ったもの全てを倒すということだけだ。",
        "en": "A constructed dragon, the drolem has massive strength.  Powerful spells weaved during its creation make it a fearsome adversary.  Its eyes show little intelligence, but it has been instructed to destroy all it meets."
      }
    },

縦に間延びしてはいるが、この圧倒的な可読性からすれば些事と言ってさしつかえない。
各数字が何を意味しているのか一目瞭然。速度はどう見ても+10だし、射撃威力もどこからどうみても"5d8"と定義されていて間違えようがなくなった。
モンスターを追加・編集するハードルは格段に下がったと言える。
具体的には、この程度の変更でモンスターを追加することができる。

開発にモンスター案を送る方法

GitHubにてPull Requestを送るのが一番採用されやすい。
そのためにはまずgitを導入して自分のGitHubアカウントを作り、forkして自分のリポジトリを作って、そこに自分のbranchを作って変更をpushしてPull Requestを送るという手順になる。

不慣れな人には結構大変だと思うので分からないことはDiscordで聞いてほしい。
なお、バランスなど様々な問題から変更する必要があったり、採用できないこともある。悪しからず。

JSON schemaの導入

これは実際にデータを弄ってみたり、開発にモンスター案を送ってみたい人向け。
VS codeを使って便利にJSONを記述することができる。導入方法はこちら
最初は若干面倒ではあるが、導入すればオートコンプリートやエラーチェックなど便利機能が使えるようになる。


また、マウスオーバーで各項目のちょっとした説明も見ることができる。

送ったデータが完璧に近いほどすんなり採用されやすいので、モンスター案を送りたい人は是非導入してほしい。

結び

変愚蛮怒のモンスター定義が大幅に整理され、追加・編集が格段にやりやすくなった。
修正案を開発にぶつける、自分で弄って遊んでみる、どちらも手を出しやすくなったはずだ。
気になった人は lib/edit/MonraceDefinitions.jsonc を覗いてみてほしい。
ただし、モンスター定義を弄ったらスコア送信はしないように。

クエスト:宝物庫を色統一してみた

この記事はRoguelike Advent Calendar 2024の4日目の記事です。

エスト:宝物庫について

かつて宝物庫には『つらぬき丸』が必ず配置されていたため非常に重要なクエストであった。
しかしながら、37F相当のランダムモンスターが大量に配置されていたため強烈な運ゲーを強いられていた。
狭く遮蔽物が少なくそれでいて十分な召喚スペースがある地形は凶悪で、少し運が悪いと容易に無理ゲーが発生しうるものであった。
確実に殲滅するには非常に高い戦闘力が要求されたため、隠密を頼りテレポートに運を任せる攻略スタイルが主流であった。
過激派は「どうせ運ゲーなら」と初期隠密を高める組み合わせから低レベル特攻を繰り返し、試行回数で突破していたとさえ聞く。
(ランダムの機嫌次第ではLv.20にも満たない序盤から突破が可能ではあった。生存率は推して知るべし。)


時は流れ、とあるメンテナが宝物庫の中身を一新した。
ランダムモンスターを減らし、四部屋に四属性のモンスターを配置、各部屋の中央に起きているミミックを設置してテレポ特攻にリスクを持たせた。
激しすぎたランダム性を減らし、難易度をある程度固定する方針の調整だった。
このときから報酬が『つらぬき丸』固定からランダムになった。
無理ゲーは発生しにくくなったが、報酬が安定しなくなったこと、従来のテレポ特攻が決まりにくくなったことから賛否両論であった。


この後何度かの修正を経て徐々に難易度が下がっていき現在の姿に至る。
報酬が安定しなくなったことを踏まえてランダム配置モンスターや召喚持ちモンスターを排除し、敵密度を減らした。
現状では「敵が固いが全滅させると経験値と現金収入がそこそこ美味しく、たまに報酬の★も使える」クエストになっている。


今回の変更点

ここしばらくの変更で序盤のドロップが劇的に良くなった影響で、宝物庫に挑む段階でのキャラクタの強さが不足しがちなケースが目立つようになった。
(必須耐性が揃いやすくなり、十分にキャラクタが育たずとも進行可能となった)
加えて宝物庫の報酬に頼らずとも進行可能なケースが増え、固くて面倒な宝物庫は無視されたり後回しにされることが増えてきた。
よって、また少し難易度を下げることにした。目指すところは序盤戦の一連のクエスト群の〆。


せっかくなので四方の部屋をそれぞれの色で染めてみた。
実際に行った作業は以下。

・各部屋に合わせた色のゴーレムを作り、配置 (ゴーレムが一回り弱くなり、難易度低下)
・各部屋に合わせたクリーピング宝石を作り、配置 ($が一回り弱くなり、難易度低下)
・暗黒担当のボルテックスを作り上の部屋へ、ウォーター・ボルテックスは属性違いだけど青いから右の部屋へ。
・各部屋中央のキノコを色の合った固定砲台へと変更 (少しだけの意地悪ポイント)
・各部屋のトラップを色のあったものに変更




白い固定砲台で適当なものがいなかったためミミック(巻物) になっており、ここだけ召喚されうる。
黒い固定砲台のローパーはこの階層にしてはかなり固く、悲鳴と麻痺があるので対処に一工夫必要かもしれない。最初は寝ているので無理に倒さなくても良い。


全体的に敵が柔らかくなっているため正面突破もそれなりに通用する。飛び道具とテレポート・アウェイ、そしてLOSを駆使すれば戦闘力がかなり低くても突破できる作りだ。
ゴーレムと宝石類から大量にお小遣いがもらえるので、金欠の序盤に嬉しいクエストになったように思う。
3.0.1.22-Betaからこのバージョンになる予定なので、ぜひ遊んでみて感想を聞かせてほしい。


待ちきれない人はGit Hubから develop を入手して自力ビルドすれば遊べる。
ビルド方法に困ったらDiscordで聞いてみてほしい。

変愚蛮怒オススメキャラメイク6選

この記事はRoguelike Advent Calendar 2022の24日目の記事です。

簡単に検索してみて、意外と「このキャラクタを使え」の類が残ってないなと思ったので文章化してみます。
変愚蛮怒に面白い組み合わせはいくらでもありますが、その大半はプレイヤーの熟練を要求してきます。
初心者でも扱いやすいものを6つ選出して軽く紹介します。

ファーストプレイ

  • ちからじまん+ゾンビ+戦士

某所にて「ちゾ戦」と呼ばれる組み合わせ。
圧倒的なタフネスがウリで、右も左も分からない状況でもそれなりに生存できます。
レベル30前に死んでしまうならまずはこれでゲームに慣れるのがオススメ。

50Fを目指す

  • ちからじまん+クター+アーチャー

アーチャーは戦闘能力が非常に高く、困難の大半を正面からぶち抜くことが可能です。
エゴ追尾の矢まで考慮するとトップクラスの火力が出ます。
種族はなんでもいいけどタフな奴にしとく方が安定します。

  • がまんづよい+幽霊+鏡使い

魔法職から比較的扱いやすい鏡使いをピックアップ。
序盤は光のしずくが使いやすく、中盤はスーパーレイの火力でごり押しできます。
魔法職の時点で難易度高めなので最強種族の幽霊をチョイス。

初勝利を目指す

  • ちからじまん+ゴーレム+修行僧(自然)

マーシャルアーツは優遇されており、序盤を抜けると無双できます。
感知力を補ってくれる自然魔法がベストパートナー。
種族は毒耐性があると装備の融通が効き、タフであればなお良しといったところ。

  • ちからじまん+クター+忍者

育った忍者はほとんど攻撃を受けずにありとあらゆる敵を葬り去ることができます。
汚いなさすが忍者きたない。
火力だけ控え目ですが圧倒的な感知能力で強装備を見つけるだけなので問題になりません。

  • きれもの+幽霊+スペルマスター

育ったスペルマスターはなんでもできます。
反攻に籠る難易度を考えると地獄無効の幽霊が一番楽です。

結び

太古の昔にやたら見かけた「ハイエルフレンジャー(仙術)」とかは私の推しじゃないので入れませんでした。
このゲーム器用貧乏タイプよりも一点特化型の方が話が簡単になる傾向があります。
あと、最終戦に溜め込んだ魔力復活をがぶ飲みしてなんとかする職業も意図的に外してあります。ちょっとだけ難しいからね。

いや初心者には○○がオススメだ、みたいな持論がある方は是非記事にして公開してみてくださいね。ぼちぼち需要あるらしいです。

戦士の基本戦術概論1

この記事はRoguelike Advent Calendar 2021の記事にする予定でしたが、多数ご参加いただいたので裏番組になりました。


変愚蛮怒の基礎戦術を説いているサイトは意外なほどに少ない。
検索すると「メイジの基本戦術概論1 - Raal's Tome of Destruction」が上位に出てきてしまう程度には。

メイジ系のノウハウはずいぶん昔の記事だがそれなりに残してあるので、今回は近接攻撃を主体とする職業向けに解説してみる。
代表して戦士の名前を冠することにしたい。語呂も良いし。

基本1 : 1対1で戦う

基本にして極意。圧倒的な戦力差がなければ複数を同時に相手取るべきではない。

####..ooo.....
......o@o.....
####..ooo.....
##############

一撃で屠ることができる雑魚が相手でも8方を囲まれれば一つ落とす間に7方からの攻撃を受けることとなる。
もう一つ落とす間に6回の攻撃を受け、全滅させるまでに28回も攻撃を受けてしまうこととなる。

####oo........
.@oooo........
####ooo.......
##############

通路に誘い込み1対1の状況を作れば被弾なしで全滅させることが可能だ。
雑魚であっても丁寧に対処して無用な消耗を避ける方が望ましい。

基本2 : 無駄に射線を通さない

基本にして極意。遠距離攻撃を受ける位置取りをしない。

#.#..............
#.###############
#@.............u.
#################

遠距離攻撃を持つ敵を相手に射線を通して棒立ちすれば、攻撃機会を無償提供していることになる。

#@#..............
#.###############
#..............u.
#################

射線の通らない場所で待ち伏せして距離を詰めるのが基本。
立ち位置をほんの少し変えるだけで被弾回数を劇的に減らすことになる。

#################
.@...ZZZZZZZZZZZ.
#################


ハウンドの類はなかなか寄ってこないが、雑に突撃するとブレスの雨で物資をボコボコにされることだろう。
少し長めの穴熊を掘ると寄ってきやすいので比較的スムーズに処理することができる。

#################
###Z#Z#Z#Z#Z#Z#Z#
#@.#Z#Z#Z#Z#Z#Z#Z
#################

基本3 : 敵前で手番を消費しない

当然ながら、敵の目の前で回復行動をすると先手を取られてもう一発殴られることとなる。
回復に限らず二重耐性を張る、加速するなどバフをかける行動も同様。
よほど死にそうでどうしようもないときと余裕綽々で多少の手損が関係ない場合を除き、一旦射線を切って視界外で準備行動をするのが基本となる。

序盤はテレポートで大きく距離を取って仕切り直せば十分なことが多い。
中盤以降で下手にテレポートしたくない場合は深めに穴熊を掘ってショートテレポートで切り返すのが手固い。

#################
###.#.#.#.#.#.#.#
#@D#.#.#.#.#.#.#.
#################

こうすると視線が通る事故は防げるし、再度射線が通る前に致命傷治癒の薬など安価な回復手段を連打する暇もつくれる。

結び

近接戦闘職はタフなので多少雑に動いても死ににくいのが魅力の一つ。
とはいえ変愚蛮怒は敵攻撃力のインフレが激しいため、中盤以降はそれなりの立ち回りを求められることとなる。
被弾を減らす動きが身につけば頓死する機会も減るので、序盤から意識して動いてみてほしい。



明日のRoguelike Advent Calendar 2021はらすね氏で「ディアボロの大冒険が令和3年にもなって新バージョンになった話」の予定です。

変愚メンテナ日誌 - 魔術属性攻撃について

この記事はRoguelike Advent Calendar 202121日目の記事です。


少し前に追加された魔術属性攻撃についてざっくり解説する。
なお、hengband spoiler wikiに載せた解説と内容は同じ。
解析/魔術属性攻撃 - PukiWiki

元ネタ

NetHackの強力アーティファクトであるところのマジックベーン。
(WikiHack: https://nethackwiki.com/wiki/Magicbane)
これを再現するために魔術属性攻撃フラグBRAND_MAGICが導入された。

効能

追加効果が決定したら以降の処理は行わない。

・1/10で運の徳が1上昇する
・1/5で追加効果 : 朦朧 (MagicalBrandEffectType::STUN)
・1/5で追加効果 : 恐怖 (MagicalBrandEffectType::SCARE)
・1/10で追加効果 : 無力化 (MagicalBrandEffectType::DISPEL)
・1/16で追加効果 : 調査 (MagicalBrandEffectType::PROBE)
・ここまで追加効果なしなら追加効果 : 威力増加 (MagicalBrandEffectType::EXTRA)

追加効果 : 威力増加

ダイス数増加は1。XdY→(X+1)dYとなる。
それ以外の効果はなし。

追加効果 : 朦朧

ダイス数増加は2。XdY→(X+2)dYとなる。
朦朧無効のモンスターには効果がない。
そうでない場合、9+1d(プレイヤーレベル/5)の朦朧値を与える。

追加効果 : 恐怖

ダイス数増加は2。XdY→(X+2)dYとなる。
恐怖無効のモンスターには効果がない。
そうでない場合、9+1d(プレイヤーレベル/5)の恐怖値を与える。

追加効果 : 無力化

ダイス数増加は2。XdY→(X+2)dYとなる。
RF_ABILITY_ATTACK_MASKかRF_ABILITY_INDIRECT_MASKに該当するモンスターにのみ追加効果がある。
ざっくり言うと魔法を使うモンスターに追加効果を与える。

MPを2d8回復する。モンスターが減速中はさらに+1d8のMP回復。加速なら+2d8。無敵なら+3d8。
魔力消去と同様の効果を与え、モンスターの一時的魔法効果を解除する。

追加効果 : 調査

ダイス数増加は2。XdY→(X+2)dYとなる。
調査する。

総評

追加効果の朦朧が非常に強力。5回攻撃なら67%、7回攻撃なら79%で朦朧が入る。
MP回復もそこそこ嬉しい。加えてダイス目増加の威力も馬鹿にならない。

この強力な効果はほぼ★マジックベーン専用だが、ランダムアーティファクトに付与されることがある。
また、鍛冶師は呪文失敗率減少フラグから魔術属性のエッセンスを抽出して自作することが可能だ。
高威力武器に魔術属性が付与された場合、終盤でも通用する強力な選択肢となる。



明日はRoguelike Advent Calendar 2021の22日目、argrath氏の「T-Engine 4でローグライクゲームを作る(3)」の予定です。