2014/12/03
■ [変愚蛮怒/スポイラー]基礎ステータスの内部数値処理(Ver2.1.5)
本記事はRoguelike Advent Calendar 2014の3日目として作成しました。しばらく落書きばかりで開発の方に立ち戻れない状態が続いているので、以前まだ解説が抜けていたはずの処理でもさらってみようかと思います。
最初に
プレイヤーの腕力、知力、賢さ、器用、耐久、魅力の各値は、素の値、各修正後の値、現在の値、限界値、他明示されない内部処理値など極めて多種に渡っている。
しかもややこしいのがD&Dの古典的な版の頃と似て非なる「3d6/百分率」の奇妙な数値表現である。一応当時としてはTRPGのシステム上意義のあるものであったはずだが、*bandではこれを実現するためには、単純な加減算にも一つか二つは余計な関数を挟まねばならなくなっている。
最近のバリアントではこれを廃し、単純な3~40程度の数値制に移行する傾向があることも余程の懐古がない限り全く当然のことと思われる。(手前味噌ながら自身のD'ang旧ソースでもかなり初期の段階からこれに手を加えている)
@の能力値を実装する変数群
プレイヤーの能力値はplayer_typeに構造体に保管されている。(一部バリアント実装上の横着でそうなってないものもある)この中で6種の能力値以下の変数で管理されている。
変数名 | 範囲 | 意味 |
stat_max | 3~148 | 平常の素値 |
stat_max_max | 88~148 | 平常の素値の限界 |
stat_cur | 3~148 | 現在の素値 |
stat_add | 制限なし | 種族・職業・性格・変異・一時的魔法効果による増減量 |
stat_use | 3~238 | stat_curにstat_addを加減算した表示用の現在値 |
stat_top | 3~238 | stat_maxにstat_addを加減算した表示用の平常値 |
stat_ind | 0~37 | 各種技能修正テーブルの参照先 |
各変数とゲーム中表示の対応関係
ゲーム中の表示に合わせて、内部上では以下の値を取っている。処理上最も重要なのはstat_indで、ゲーム中のセービング処理、ダメージ修正などの修正値配列はこの値を添え字にして参照している。詳しくは各能力値の影響(変愚蛮怒 Ver2.1.3 rev3401)も参照。
ゲーム中表示 | stat_max/stat_max_max/stat_cur/stat_use/stat_top | stat_ind |
3 | 3 | 0 |
4 | 4 | 1 |
5 | 5 | 2 |
6 | 6 | 3 |
7 | 7 | 4 |
8 | 8 | 5 |
9 | 9 | 6 |
10 | 10 | 7 |
11 | 11 | 8 |
12 | 12 | 9 |
13 | 13 | 10 |
14 | 14 | 11 |
15 | 15 | 12 |
16 | 16 | 13 |
17 | 17 | 14 |
18/00-18/09 | 18~27 | 15 |
18/10-18/19 | 28~37 | 16 |
18/20-18/29 | 38~47 | 17 |
18/30-18/39 | 48~57 | 18 |
18/40-18/49 | 58~67 | 19 |
18/50-18/59 | 68~77 | 20 |
18/60-18/69 | 78~87 | 21 |
18/70-18/79 | 88~97 | 22 |
18/80-18/89 | 98~107 | 23 |
18/90-18/99 | 108~117 | 24 |
18/100-18/109 | 118~127 | 25 |
18/110-18/119 | 128~137 | 26 |
18/120-18/129 | 138~147 | 27 |
18/130-18/139 | 148~157 | 28 |
18/140-18/149 | 158~167 | 29 |
18/150-18/159 | 168~177 | 30 |
18/160-18/169 | 178~187 | 31 |
18/170-18/179 | 188~197 | 32 |
18/180-18/189 | 198~207 | 33 |
18/190-18/199 | 208~217 | 34 |
18/200-18/209 | 218~227 | 35 |
18/210-18/219 | 228~237 | 36 |
18/*** | 238 | 37 |
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 のダメージで触って凍ら せる。
鬼畜大佐『ロムンクァリィ』
もうとやかく言うネタがないんですけど(呆れ)
アッキ=ニンジャ『ウルウェン』
薬を割るな(投げやり)