D&D 5e HP Hesap Makinesi


11

Bir D&D karakterini yükseltirken yapmam gereken her şeyi hatırlamakta zorlanıyorum. Her ne sebeple olursa olsun, beni rahatsız eden şeylerden biri, yeni maksimum HP değerlerinin ne olması gerektiğini bulmaktır. Bu zorluk için, doğru değeri otomatik olarak hesaplamak üzere bir program veya işlev yazacaksınız.

terminoloji

Maksimum HP'yi hesaplamak için bilmeniz gereken ilk şey "Anayasa değiştiricisidir". Her DND karakteri, biri Anayasa için olmak üzere altı tamsayı yetenek puanına sahiptir. Bu zorluk için gerekli olan tek bilgi Anayasa yeterlilik puanının, Anayasa değiştiricisi olan başka bir statüyü nasıl etkilediğidir. Kısacası, değiştirici eşittir floor( (ability_score - 10) / 2 ). Maceracılar sadece 1'den 20'ye kadar yetenek puanlarına sahip olabilir. Kodunuzun asla bu aralığın dışındaki puanları işlemesi gerekmez; bu da, asla -5'ten düşük veya +5'ten büyük bir değiştiriciyi işlemesi gerekmeyeceği anlamına gelir. Anayasa değiştiricisi bir karakter yükseldikçe değişebilse de, HP üzerindeki etkileri geriye dönük olarak uygulanır, bu nedenle mevcut maksimum HP'yi hesaplamak için yalnızca geçerli değerine ihtiyaç vardır.

(Bu, tamamen meydan okumayla ilgisizdir, ancak maksimum HP'yi nasıl etkilediğini merak ediyorsanız: "Zor" başarının, HP hesaplaması amacıyla bir karakterin Anayasa değiştiricisine 2 eklediğini varsayabilirsiniz, çünkü etkili bir şekilde yaptığı budur Bu başarı metninin metni değil ama matematik tam olarak aynı şekilde çalışıyor. Cevabınızdaki bu başarı ile başa çıkmak zorunda değilsiniz.)

Daha sonra, her sınıfta HP'nin hesaplanmasında yer alan atanmış bir "hit die" türü vardır. Aşağıdaki tabloda her sınıf için isabet verilen zarlar listelenmiştir.

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

Sonunda karakterin seviyesi. Bunun tek etkisi, bir sonraki bölümde çalışan toplama kaç kez değer ekleneceğidir. Bir karakterin seviyesi 1'den 20'ye ( 1 dahil) bir tamsayıdır . Kodunuzun asla bu aralığın dışındaki bir düzeyi işlemesi gerekmez. Seviyeye ulaşmak için nbir karakter seviye 1'den başlar ve n-1zamanları yükseltir . Örneğin, 3. seviye bir karakter, 1. seviye bir karakter olarak ve iki kez seviye atlayarak bulundukları yere ulaştı.

Max HP Nasıl Hesaplanır?

Bir karakterin maksimum HP seviyesi 1'deki HP'lerine ek olarak her seviyede aldığı artışın toplamına eşittir.

Seviye 1'de

Seviye 1'de, bir karakterin HP vuruş vuruşlarında mümkün olan en yüksek ruloya (6'dan fazla kenarı olan zarlara aşina olmayanlar için kalıp adındaki sayı) artı Anayasa değiştiricisine eşittir. HP'yi daha sonraki bir düzeyde hesaplarken, bir karakterin Anayasası'nın her zaman aynı olduğunu varsayabilirsiniz, çünkü bu hesaplama kısmı Anayasa her değiştiğinde yeniden yapılır.

Seviye atlarken

Bir karakterin seviye atlayışında iki seçeneği vardır. İsabet zarlarından birini yuvarlayabilir ya da o kalıbın ortalama atışını alabilirler (yuvarlanır). Hangisini seçerse seçsinler, Anayasa değiştiricileri sonuca eklenir. Bu toplam, HP'lerinin arttığı miktardır. Bu zorluk için ortalama rulo her zaman alınır, bu nedenle çıktı belirleyicidir. (Yine,> 6 taraflı zarlara aşina değilseniz, yuvarlanan ortalama rulosu olarak hesaplayabilirsiniz (highest_possible_roll / 2) + 1.)

Dikkate değer bir istisna vardır. Bir karakterin maksimum HP daima en az 1 ile seviye yukarı her zaman artar 2 . Yukarıdaki paragraftaki talimatlar, seviyelendirme sırasında 0 veya daha az bir artışla sonuçlanırsa, bunun yerine 1 artar.

Meydan okuma

Programınız veya işleviniz üç giriş alacaktır :

  • Bir dize olarak karakterin sınıfı
  • Karakterin seviyesi
  • Karakterin Anayasa yetenek puanı ( değiştirici değil )

Olacak çıktı tek bir şey: Karakterin geçerli maksimum HP.

Örnekler

Girdilerin ve ilişkili çıktıların olası her birleşimi bu bağlantıda bulunabilir. Bu sayfada bakılacak bir şey olması uğruna, rastgele seçilen 30 test örneği:

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. Açıkçası, 20'nin maksimum seviye olduğunu söyleyen bir kural olduğunu düşünmüyorum. Bununla birlikte, 21, kitapta, tablolara ulaşmak için edinmeniz gereken deneyim miktarı da dahil olmak üzere, çeşitli sayıların ne olması gerektiğini söylemek için tablolar olmayı bıraktığı noktadır. Bu benim için yeterince iyi bir başlık.

2. Aslında bunun RAW için geçerli olduğunu düşünmüyorum. Ben rpg.se sordum ve böyle bir şey hiçbir yerde yazılı görünmüyor. Ancak, D&D baş tasarımcısı Mike Mearls, Mart 2015'te tweet attı . Bu, lider kural geliştiricisi Jeremy Crawford'un bir tweet'ini tartışmanın yolu değil, ancak amaçladıkları şeyin kanıtı, bu yüzden bu meydan okuma için kullanacağım.


Sınıf bir dize olarak verilmeli midir, yoksa bir sınıfla ilgili tek bilgi verildiği takdirde, isabet kalıbının sayısı olarak verilebilir. Aksi takdirde insanlar sadece "Bu sınıflar o zaman bu ölürse, bu sınıflar o zaman bu ölürse" gibi genel bir tabloya ihtiyaç duyacaktır.
Skidsdev

Ayrıca seviye ve anayasa tamsayılar mı, yoksa “x. Seviye” ve “y CON” diyen dizeler olarak mı aktarılır?
Skidsdev

1
Tanrım, ben yaşlıyım, hala bu tabloyu hatırlıyorum: ancientscrossroads.com/adnd_tools/con_table.htm
Neil

@Mayube Muhtemelen bir soru sormamalı ve hemen pizzaya gitmeliydim, ha? : P Sınıfın bir dize olması gerekiyor, çünkü bu dizelerde tabloyu kısaltmak için kalıpları bulmak için yeterli veri olduğunu düşünüyorum (şimdiye kadar gelen cevaplara dayanarak). Seviye ve anayasa ints.
undergroundmonorail

3
Bana atılan tüm bilgilerden ilgili bilgileri ayrıştırmak oldukça zor buldum.
Jonathan Allan

Yanıtlar:


2

Jöle , 34 bayt

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

Üç komut satırı argümanı alan tam program: sınıf, puan, seviye.

Çevrimiçi deneyin!

Nasıl?

Kodun ortası, ðs ile ayrılmış, daha önce hesaplanmış bazı değerlerden sonucu hesaplayan ikili bir bağlantıdır:

+‘»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

Değiştirici sağ tarafta hesaplanır:

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

Kalıp değerinin yarısı sol tarafta hesaplanır:

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)

Sınıf isimleri sıra toplamı modulo göz önüne alındığında mbu tür mçarpışan verimleri (kalıpla) sınıflandırmaları tutarken minimumdur m=15. Gerekli değerlerin (yarım kalıp rulosu) bu indekslere uzunluk 15 listesinde yerleştirilmesi, Jelly'in modüler indekslemesini kullanarak aramaya izin verir . Listeyi bir taban ile 6 numara olarak 6değiştirmek , yalnız yerine a 0ile basmak baz-7 sıkıştırma veya baz-4 sıkıştırma alternatiflerinden daha kısa bir bayttır ve değerleri arttırmak (zincirde ekstra bir nilad kullanılmasıyla ilişkili bayt ek yükü ile) . Taban 6, 7 yerine dekompresyon, taban dekompresyonunun (taban dönüşümden ziyade b) doğru argüman olduğunda örtülü aralık yapısına sahip olması,r, Tabana dönüştürme gibi olan bir yöntemdir, bir tamsayıdır rve daha sonra herhangi bir değiştirme 0bir için rtek seferde tüm.

Yani:

         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

Listeye yeniden düzenleyerek, indeks 13'teki 6'yı sıfıra dönüştürerek ve taban 6'da en aza indirerek:

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

Kodu yapma

                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 bayt

Girdiyi (sınıf, düzey, anayasa_sellik_score) olarak alır . Sınıf büyük / küçük harfe duyarlı değildir.

(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

Bu aslında ilk sürümümle aynı matematiği kullanıyor, ancak d artık herhangi bir arama tablosu olmadan hesaplanıyor.

Test senaryoları


İlk sürüm, 87 84 bayt

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

Nasıl çalışır

Zor kısmı, sınıf dize c'yi karşılık gelen isabet zarına dönüştürmektir. Daha doğrusu, depolayacağımız değer d = zar / 2 + 1'dir .

Biz aşağıdaki formülü kullanıyoruz 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

Karşılık gelen konumlardaki d değerlerini bir dizeye ekleyerek ve kullanılmayan yuvaları sıfırlarla doldurarak şunları elde ederiz:

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

Dolayısıyla son formül:

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

Biz sonra d , biz hesaplamak:

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

her seviye yükselmede kazanılan teorik puan sayısıdır.

Eğer h olumlu, biz sadece hesaplamak:

h * l

Değilse, her seviye yükselişinde en az 1 puan kazanıldığını dikkate almalıyız. Bunun yerine hesaplıyoruz:

h + l - 1

Her iki durumda da, d - 2 ekleyerek sonucu ayarlıyoruz , böylece ilk nokta sayısı doğru bir şekilde entegre ediliyor.

Test senaryoları


Kodunuzla ilgili bir sorun var gibi görünüyor; CON 1 veya B ile 2 veya 3 CON ile sihirbazlar seviyesi ne olursa olsun aynı sayıda puan alırsınız.
Neil

1
@Neil Fark ettiğiniz için teşekkürler. Ben düşünüyorum bu sabittir.
Arnauld

3

Toplu, 172 bayt

@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

Sınıf, seviye ve anayasayı komut satırı argümanları olarak alır. Açıklama: HP, (seviye 1'de HP) + (seviye - 1) + dakika (seviye başına daha fazla HP, 0) * (seviye - 1) olarak hesaplanabilir. Seviye başına daha fazla HP, vuruş kalıbının yarısı ve anayasa değiştiricisidir. Çoğu sınıf d8 kullanır, bu nedenle bu anayasanın ( %3/2-1) yarısından daha az olurken, 1. düzeydeki HP bundan 3 daha fazladır. Seviye başına daha fazla HP ve seviye 1'deki HP d8 kullanmayan altı sınıf için ayarlanır. Seviye başına daha fazla HP daha sonra 0 ile sınırlıdır (bu şekilde negatif değeri kullanır, çünkü bu şekilde biraz daha golfçedir.)


2

R, 1811163 bayt

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)}

Anonim işlev. Olarak çalışır f(class, level, CON).

Açıklama: Sınıf adındaki 3. ve 4. harfleri (bulduğum en küçük benzersiz eşleme) kullanarak, sınıftan sen fazla zarlara kadar vektörler oluşturur d.

CON mod mdoğrudan spesifikasyondan ve HP = birinci seviye ( d + m) + diğer seviyeler ( (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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.