D&D 5e HPカリキュレーター


11

D&Dキャラクターをレベルアップするときにやらなければならないことすべてを思い出すのに苦労しています。なんらかの理由で、私を困らせることの1つは、新しい最大HP値がどうあるべきかを理解することです。この課題では、正しい値を自動的に計算するプログラムまたは関数を作成します。

用語

最大HPを計算するために最初に知っておく必要があるのは、「構成修飾子」です。各DNDキャラクターには、6つの整数アビリティスコアがあり、1つは憲法のものです。この課題に必要な唯一の関連知識は、憲法の能力スコアが別の統計値、つまり憲法修正因子にどのように影響するかです。つまり、修飾子はに等しくなりfloor( (ability_score - 10) / 2 )ます。冒険者は、1〜20の能力スコアのみを持つことができます。コードがその範囲外のスコアを処理する必要はありません。つまり、-5未満または+5より大きい修飾子を処理する必要はありません。Constitution修飾子はキャラクターがレベルアップするにつれて変化する可能性がありますが、HPへの影響は遡及的に適用されるため、現在の最大HPを計算するには現在の値のみが必要です。

(これは、チャレンジとは全く無関係であるが、それは最大HPにどのような影響を与えるかについて、あなたがしている好奇心の場合:あなたは、それはだから「タフ」偉業は、HPの計算の目的のために、文字の憲法の修正に2を加えると仮定することができます効果的にそれが何をしますか。それは偉業のテキストではありませんが、数学はまったく同じになるように機能します。答えでこの偉業を処理する必要はありません。)

次に、すべてのクラスには「ヒットダイ」タイプが割り当てられており、HPの計算に関与しています。次の表に、各クラスのヒットダイスを示します。

Sorcerer:  d6
Wizard:    d6
Bard:      d8
Cleric:    d8
Druid:     d8
Monk:      d8
Rogue:     d8
Warlock:   d8
Fighter:   d10
Paladin:   d10
Ranger:    d10
Barbarian: d12

最後に、キャラクターのレベル。これが影響するのは、次のセクションで積算合計に値を追加する回数だけです。キャラクターのレベルは包括的、1〜20の整数である1。コードがその範囲外のレベルを処理する必要はありません。レベルnに到達するには、キャラクターはレベル1から始まり、n-1時間を増やします。たとえば、レベル3のキャラクターは、レベル1のキャラクターになり、2回レベルアップすることで、現在の位置に到達しました。

最大HPの計算方法

キャラクターの最大HPは、レベル1のHPと各レベルで受け取った増加の合計に等しくなります。

レベル1

レベル1では、キャラクターのHPは、ヒットダイス(ダイスの名前に含まれる数字で、6面以上のサイコロに不慣れな方)の可能な限り高いロールに、憲法修正値を加えたものに等しくなります。後のレベルでHPを計算するとき、計算のこの部分は憲法が変わるたびにやり直されるため、キャラクターの憲法は常に同じであると仮定することができます。

レベルアップするとき

キャラクターがレベルアップするたびに、2つのオプションがあります。彼らは、ヒットしたサイコロの1つを振るか、そのサイコロの平均のロールを取る(切り上げ)ことができます。どちらを選択しても、構成修飾子が結果に追加されます。この合計は、HPが増加する量です。この課題では、常に平均ロールが取られるため、出力は決定的です。(繰り返しますが、6面以上のサイコロに慣れていない場合は、切り上げた平均ロールをとして計算できます(highest_possible_roll / 2) + 1。)

注目すべき例外が1つあります。キャラクターの最大HPは、レベルが上がるたびに少なくとも1増加します2。上記の段落の指示がレベルアップ時に0以下の増加をもたらす場合、代わりに1増加します。

チャレンジ

プログラムまたは関数は3つの入力を受け取ります。

  • 文字列としてのキャラクターのクラス
  • キャラクターのレベル
  • キャラクターの憲法能力スコア(修飾子ではない)

出力されるのは、キャラクターの現在の最大HPです。

例

入力とそれに関連する出力の可能な組み合わせはすべて、このリンクで見つけることができます。このページで確認するために、ランダムに選択された30のテストケースを以下に示します。

Barbarian, 15th level, 13 CON: 125
    Rogue, 10th level, 18 CON: 93
   Wizard, 15th level, 18 CON: 122
   Wizard, 16th level,  1 CON: 16
Barbarian, 15th level,  7 CON: 80
  Warlock, 15th level,  3 CON: 18
   Ranger, 14th level,  1 CON: 18
  Warlock,  3rd level, 14 CON: 24
    Druid,  3rd level,  4 CON: 9
   Cleric, 11th level,  5 CON: 25
     Bard, 20th level, 11 CON: 103
Barbarian, 11th level, 13 CON: 93
     Bard,  8th level, 19 CON: 75
     Bard, 16th level, 17 CON: 131
  Fighter, 10th level,  6 CON: 44
     Monk, 10th level,  2 CON: 13
   Cleric, 14th level, 17 CON: 115
   Cleric,  6th level,  5 CON: 15
    Rogue,  7th level, 13 CON: 45
   Cleric,  4th level, 14 CON: 31
    Rogue, 19th level, 15 CON: 136
  Paladin, 13th level, 13 CON: 95
   Cleric, 13th level, 15 CON: 94
     Bard,  8th level,  5 CON: 19
     Monk, 20th level, 11 CON: 103
Barbarian,  8th level, 20 CON: 101
     Monk,  1st level,  4 CON: 5
     Bard,  5th level, 17 CON: 43
     Monk, 18th level,  7 CON: 57
   Wizard, 17th level,  5 CON: 19

1.厳密に言えば、20が最大レベルであるというルールはないと思います。ただし、21は、ルールに含まれるさまざまな数値の一部(その到達に必要な経験の量など)を示すために、本の表を停止するポイントです。それは私にとって十分なレベルの上限です。

2.私は実際にこれがRAWに当てはまるとは思わない。私はrpg.seで尋ねましたが、そのようなことはどこにも書き留められていないようです。ただし、D&Dの主任デザイナーであるマイク・ミアーズは、2015年3月にツイートしました。これは、リードルールの開発者であるJeremy Crawfordからのツイートを議論する方法とは異なりますが、それが彼らが意図したものである証拠であるため、このチャレンジに使用します。


クラスは文字列として指定する必要がありますか、それがクラスに関連する唯一の情報である場合、ヒットダイの数として指定できますか。それ以外の場合は、「これらのクラスがこの場合死ぬ、これらのクラスが死ぬ場合」などの汎用テーブルが必要になります
— 。– Skidsdev

また、レベルと構成は整数として、または「xthレベル」と「y CON」という文字列として渡されますか?
— Skidsdev

1
まあ、私は古いです、私はまだこのテーブルを覚えています:ancientscrossroads.com/adnd_tools/con_table.htm
— ニール

@Mayubeおそらく質問をして、すぐにピザを食べに行くべきではなかったでしょう?:Pクラスを文字列にする必要があります。これらの文字列には、テーブルを短縮するためのパターンを見つけるのに十分なデータがあると思うからです(これまでの回答に基づきます)。レベルと憲法はintです。
— 地下

3
私に投げられたすべての情報から関連情報を解析するのはかなり難しいと思いました。
— ジョナサンアラン

回答:


2

ゼリー、34 バイト

OSị“#®Ʋ?[’ṃ6¤ð+‘»1×⁵’¤+⁸Ḥ¤+ð⁹_10:2

クラス、スコア、レベルの3つのコマンドライン引数を取る完全なプログラム。

オンラインでお試しください!

どうやって?

ðs で区切られたコードの中央は、以前に計算された値から結果を計算するダイアディックリンクです。

+‘»1×⁵’¤+⁸Ḥ¤+ - maxHitPoints(halfDieValue, modifier)
+             - add: halfDieValue + modifier
 ‘            - increment
  »1          - maximum of that and 1: this is the level-up delta
       ¤      - nilad followed by links as a nilad:
     ⁵        -   program's 3rd argument, level (5th command line argument)
      ’       -   decrement: this is the number of level-ups
    ×         - multiply: level-ups * level-up delta
           ¤  - nilad followed by links as a nilad:
         ⁸    -   link's left argument: halfDieValue
          Ḥ   -   double: dieValue
        +     - add: level-ups * level-up delta + dieValue
            + - add: level-ups * level-up delta + dieValue + modifier

修飾子は右側で計算されます:

⁹_10:2 - getModifier(class, score)
⁹      - link's right argument, the 2nd argument, the score
 _10   - minus 10
    :2 - integer divide by 2

ダイスの値の半分は左側で計算されます:

OSị“#®Ʋ?[’ṃ6¤ - getHalfDieValue(class)
O             - cast to ordinals
 S            - sum
            ¤ - nilad followed by link(s) as a nilad:
   “#®Ʋ?[’    -   base 250 literal 140775266092
          ṃ6  -   convert to base 6 but with 6s in place of 0s
  ị           - index into (1-indexed and modular)

クラス名の序数の合計を考慮して、(ダイによる)分類がyieldsに衝突しないmようにm最小限に抑えますm=15。長さ15のリストのそれらのインデックスに必要な値(ハーフダイロール)を配置すると、Jellyのモジュラーインデックスを使用したルックアップが可能になりますị。単独で6aに置き換えられたベース6の数値としてリストを圧縮すると、ベース07圧縮またはベース4圧縮の代替よりも1バイト短くなり、値が増加します(チェーンで余分なniladを使用することに関連するバイトオーバーヘッドがあります) 。7でなく6の解凍は、ṃ(ベース変換ではなく)ベース解凍がb正しい引数の場合に暗黙の範囲構築を行うという事実を使用することにより達成されます。rは整数です。つまり、ベースに変換してから、すべてを一度にr変更するようなものです。0r

あれは:

         class: Sorcerer,Wizard,Bard,Cleric,Druid,Monk,Rogue,Warlock,Fighter,Paladin,Ranger,Barbarian
   Ordinal sum: 837,     625,   377, 594,   504,  405, 514,  723,    713,    697,    607,   898
        mod 15:  12,      10,     2,   9,     9,    0,   4,    3,      8,      7,      7,    13
required value:   3,       3,     4,   4,     4,    4,   4,    4,      5,      5,      5,     6

リストに再配置し、インデックス13の6をゼロに変換し、ベース6で最小にします。

mod 15:    2   3   4           7   8   9  10      12  13      0  
 value: 1, 4,  4,  4,  0,  0,  5,  5,  4,  3,  0,  3,  0,  0,  4

コードを作る

                list: [1,4,4,4,0,0,5,5,4,3,0,3,0,0,4]
         from base 6: 140775266092
         to base 250: [36,9,154,64,92]
code page characters:   # ®   Ʋ  ?  [
          final code: “#®Ʋ?[’ṃ6

8

JavaScript(ES6)、81 78 76 74バイト

入力を(class、level、constitution_ability_score)として受け取ります。クラスは大文字と小文字を区別しません。

(c,l,s,h=(d=parseInt(c,34)*59.9%97%77%6|4)+(s-10>>1))=>(h>0?h*l:h+l-1)+d-2

これは基本的に私の初期バージョンと同じ数学を使用していますが、dはルックアップテーブルなしで計算されるようになりました。

テストケース


初期バージョン、87 84バイト

(c,l,s,h=(d=+'55654607554506'[parseInt(c,35)%24%15])+(s-10>>1))=>(h>0?h*l:h+l-1)+d-2

使い方

トリッキーな部分は、クラス文字列cを対応するヒットダイスに変換することです。より正確には、保存する値はd = dice / 2 + 1です。

次の式を使用しparseInt(c, 35) % 24 % 15ます。

Class       | Base 35 -> decimal | MOD 24 | MOD 15 | d
------------+--------------------+--------+--------+---
"Sorcerer"  |      1847055419467 |     19 |      4 | 4
"Wizard"    |               1138 |     10 |     10 | 4
"Bard"      |             484833 |      9 |      9 | 5
"Cleric"    |          662409592 |     16 |      1 | 5
"Druid"     |           20703143 |     23 |      8 | 5
"Monk"      |             973475 |     11 |     11 | 5
"Rogue"     |           41566539 |      3 |      3 | 5
"Warlock"   |        59391165840 |      0 |      0 | 5
"Fighter"   |        28544153042 |      2 |      2 | 6
"Paladin"   |        46513817828 |     20 |      5 | 6
"Ranger"    |         1434103117 |     13 |     13 | 6
"Barbarian" |     25464249364423 |      7 |      7 | 7

dの値を対応する位置に文字列に挿入し、未使用のスロットにゼロをパディングすると、次のようになります。

00000000001111
01234567890123
--------------
55654607554506

したがって、最終的な式:

d = +'55654607554506'[parseInt(c, 35) % 24 % 15]

dを取得したら、次を計算します。

h = d + ((s - 10) >> 1))

これは、各レベルアップで獲得される理論上のポイント数です。

hが正の場合、単純に計算します:

h * l

そうでない場合は、各レベルアップで少なくとも1ポイントが獲得されるという事実を考慮する必要があります。したがって、代わりに計算します。

h + l - 1

どちらの場合も、d-2を追加して結果を調整し、最初のポイント数が正しく統合されるようにします。

テストケース


コードに何か問題があるようです。CONが1のバード、またはCONが2または3のウィザードは、レベルに関係なく同じ数のヒットポイントを獲得します。
— ニール

1
@Neil気づいてくれてありがとう。私が考えて、これは固定されています。
— アーナルド

3

バッチ、172バイト

@set/aa=1-%3/2,h=4-a
@for %%c in (-1.Sorcerer -1.Wizard 1.Fighter 1.Paladin 1.Ranger 2.Barbarian)do @if %%~xc==.%1 set/aa-=c=%%~nc,h+=c*2
@cmd/cset/a"a*=(a>>9),-~a*~-%2+h

クラス、レベル、および構成をコマンドライン引数として取ります。説明:HPは、(レベル1のHP)+(レベル-1)+ min(レベルごとのHP、0)*(レベル-1)として計算できます。レベルごとのさらなるHPは、ヒットダイの半分と構成修正を加えたものです。ほとんどのクラスはd8を使用するため、これは構成の半分(%3/2-1)未満になりますが、レベル1のHPはそれより3大きくなります。その後、レベルごとのHPおよびレベル1のHPは、d8を使用しない6つのクラスに対して調整されます。レベルごとのそれ以上のHPは0に制限されます(この方法では、ややゴルファーが多いため、実際には負の値が使用されます)。


2

R、181163バイト

function(s,n,t){a=Hmisc::Cs(rc,za,rd,er,ui,mk,gu,rl,gh,la,ng,rb)
b=c(6,6,rep(8,6),rep(10,3),12)
d=b[a == substr(s,3,4)]
m=floor((t-10)/2)
d+m+(n-1)*max(d/2+1+m,1)}

無名関数。として実行されf(class, level, CON)ます。

説明:クラス名の3番目と4番目の文字(私が見つけた最小の一意のマッピング)を使用して、クラスのベクトルを作成してs最大値をダイスしますd。

CON mod mは仕様からそのままで、HP =最初のレベル(d + m)+残りのレベル((n-1) * max(average_die + m, 1)。

> f("Barbarian", 15, 13)
[1] 125
> f("Rogue", 10, 18)
[1] 93
> f("Wizard", 15, 18)
[1] 122
> f("Wizard", 16, 1)
[1] 16
> f("Barbarian", 15, 7)
[1] 80
> f("Warlock", 15, 3)
[1] 18
> f("Ranger", 14, 1)
[1] 18
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.