トップ «前の日記(2014/12/02) 最新 次の日記(2014/12/04)» 編集

SikabaneWorksが関係するコンテンツ(主に*band系ローグライク)の開発近況・補足から全く個人的な雑記まで。

[WEB:屍の見える丘公園]| [RSS]

Angband | Badiashimshe | C# | CRAUZEL | D'angband/小説草稿 | D'angband/開発 | DarkSouls | Demon'sSouls | DungeonCrawl | ElvenUteruses | Haskell | Hengband | J9シリーズ | LEGO | LineDrawing | MISC | MTG | Mac | Math | Moria | R-18 | Roguelike | Rough | RoughSketch | Ruby | SDL | UNIX | VMware | WarHammer | Zangband | アタシラヂョウヲウ | イラスト | ガジェット | ゲーム | ゲーム紹介 | ゲーム製作技術 | ゲーム論 | スケッチ | ツクール | テクノロジー | ニコニコ動画 | ファルコム | ファンタジー | マリオ | ヴィーヤウトゥムノ | 別記事追加予定 | 変愚蛮怒 | 変愚蛮怒/スポイラー | 変愚蛮怒/元ネタ探訪 | 変愚蛮怒/攻略 | 変愚蛮怒/開発 | 宗教 | 情報 | 政治 | 文字コード | 日ペ昔話 | 東方 | 東方ワンドロ | 東方外法漢女 | 歴史 | 漫画製作 | 版権絵 | 画像処理 | 翻訳 | 自然言語 | 艦隊これくしょん | 落書き | 言語解析 | 読書 | 超人ロック | 追記予定 | 通信 | 鉄獄旅慕情 | 阿片窟 | 馬鹿馬鹿蛮怒/開発 | 魔法少女まどか☆マギカ | 魚類版深夜の真剣お絵描き60分一本勝負


2014/12/03

[変愚蛮怒/スポイラー]基礎ステータスの内部数値処理(Ver2.1.5)

本記事はRoguelike Advent Calendar 2014の3日目として作成しました。しばらく落書きばかりで開発の方に立ち戻れない状態が続いているので、以前まだ解説が抜けていたはずの処理でもさらってみようかと思います。

最初に

プレイヤーの腕力、知力、賢さ、器用、耐久、魅力の各値は、素の値、各修正後の値、現在の値、限界値、他明示されない内部処理値など極めて多種に渡っている。

しかもややこしいのがD&Dの古典的な版の頃と似て非なる「3d6/百分率」の奇妙な数値表現である。一応当時としてはTRPGのシステム上意義のあるものであったはずだが、*bandではこれを実現するためには、単純な加減算にも一つか二つは余計な関数を挟まねばならなくなっている。

最近のバリアントではこれを廃し、単純な3~40程度の数値制に移行する傾向があることも余程の懐古がない限り全く当然のことと思われる。(手前味噌ながら自身のD'ang旧ソースでもかなり初期の段階からこれに手を加えている)

@の能力値を実装する変数群

プレイヤーの能力値はplayer_typeに構造体に保管されている。(一部バリアント実装上の横着でそうなってないものもある)この中で6種の能力値以下の変数で管理されている。

変数名範囲意味
stat_max3~148平常の素値
stat_max_max88~148平常の素値の限界
stat_cur3~148現在の素値
stat_add制限なし種族・職業・性格・変異・一時的魔法効果による増減量
stat_use3~238stat_curにstat_addを加減算した表示用の現在値
stat_top3~238stat_maxにstat_addを加減算した表示用の平常値
stat_ind0~37各種技能修正テーブルの参照先

各変数とゲーム中表示の対応関係

ゲーム中の表示に合わせて、内部上では以下の値を取っている。処理上最も重要なのはstat_indで、ゲーム中のセービング処理、ダメージ修正などの修正値配列はこの値を添え字にして参照している。詳しくは各能力値の影響(変愚蛮怒 Ver2.1.3 rev3401)も参照。

ゲーム中表示stat_max/stat_max_max/stat_cur/stat_use/stat_topstat_ind
330
441
552
663
774
885
996
10107
11118
12129
131310
141411
151512
161613
171714
18/00-18/0918~2715
18/10-18/1928~3716
18/20-18/2938~4717
18/30-18/3948~5718
18/40-18/4958~6719
18/50-18/5968~7720
18/60-18/6978~8721
18/70-18/7988~9722
18/80-18/8998~10723
18/90-18/99108~11724
18/100-18/109118~12725
18/110-18/119128~13726
18/120-18/129138~14727
18/130-18/139148~15728
18/140-18/149158~16729
18/150-18/159168~17730
18/160-18/169178~18731
18/170-18/179188~19732
18/180-18/189198~20733
18/190-18/199208~21734
18/200-18/209218~22735
18/210-18/219228~23736
18/***23837

stat_addによる加減算処理

stat_addには種族、職業、性格の他突然変異や魔法による一時的修正の一切が総計され、その上で、stat_use/stat_topに加算されている。

加減算はmodify_stat_value()関数で行われ、stat_addの値1ずつループ処理で行われ、3~18の間は+1/-1、18/01~18/***の間は+10/-10する形で処理されている。

増強効果、減少攻撃による低下量の決定

能力値の増強はdo_inc_stat()関数とそれがコールするinc_stat()により実装されている。

能力値の減少はdo_dec_stat()関数とそれがコールするdec_stat()関数により実装されている、一部は直接dec_stat()が呼ばれている場合がある。

inc_stat()
  • 現在のstat_cur値が18/00以下の場合75%の確率で1、残り25%の確率で2増やす
  • 18/01以上stat_max_max-2未満の場合gain値を((stat_max_max - 現在値) / 2 + 3) / 2とし、gain / 2 + 1d(gain)だけ百分率値に加算を行う。
  • stat_max_max-1以上の場合百分率値に1増やしてstat_max_maxとなる
dec_stat()

dec_stat関数は別途amountという引数を持っており、これが大きい程低下量が増す。do_dec_statで減らされる場合は一律10である。

また永久的に減らすフラグも設けられており、これがTRUEの場合 stat_curだけでなくstat_maxも減らす。

  • 現在のstat_cur値/stat_max値が18/00以下の場合、
    • amountが90以上の場合-4減らす。
    • amountが50以上の場合-3減らす。
    • amountが20以上の場合-2減らす。
    • amountが20未満の場合-1減らす。
  • 18/01以上の場合、
    • loss値を(([stat_cur/stat_maxの百分率値] / 2 + 1) / 2 + 1)と定める
    • loss'値をさらに1d(loss)+loss*amount/100とする
    • このloss'値がamount/2未満の場合loss'値をamount/2とする。
    • stat_cur/stat_maxの百分率値からloss'値を引く。
    • stat_cur/stat_maxの百分率値がマイナスになった場合amountが20以下なら18、20を超えるなら17まで減らされる。

[ヴィーヤウトゥムノ] ブルー・ゼリー/Blue jelly (Blue 'j')

=== Num:84  Lev:4  Rar:1  Spd:+0  Hp:12d8  Ac:1  Exp:14
それは脈打つ青い肉のような物質の塊だ。
それは通常地下 4 階で出現し、普通の速さで動いている、しかし侵入者を追跡し
ない。このモンスターを倒すことは 1 レベルのキャラクタにとって 約18.67 ポ
イントの経験となる。それは AC1 の防御力と 12d8 の体力がある。それは水を渡
ることができる。それは冷血動物である。それはテレパシーでは感知できない。
それには明るい光でダメージを与えられる。それは冷気の耐性を持っている。そ
れは経験を積むと、グリーン・ゼリーに進化する。それは恐怖を感じないし、混
乱しないし、眠らされない。それは侵入者に対してほとんど注意を払わないが、 20
フィート先から侵入者に気付くことがある。それは 2d5 のダメージで触って凍ら
せる。

2

Romunqualy

鬼畜大佐『ロムンクァリィ』
もうとやかく言うネタがないんですけど(呆れ)

Urwen

アッキ=ニンジャ『ウルウェン』
薬を割るな(投げやり)