Skip to contents

Ability Score Rolling

The most fundamental aspect of a character–besides how you role play their actions–are their ability scores. In fifth edition (“5e”) Dungeons & Dragons, there are six ability scores: strength, dexterity, constitution, intelligence, wisdom, and charisma.

There are a few common ways of rolling for these scores and the ability_scores function accepts three of them. You can (A) roll four six-sided dice drop the lowest value and sum the remaining three dice, (B) roll three six-sided dice, or–for the truly wild–(C) roll a single d20 and trust the dice gods to still give reasonable good scores.

Regardless of your chosen rolling method, if any score is less than 8 or the total of all six scores is less than 70, a message will be printed to let you know that you might be justified in re-rolling for your character’s abilities. There is an optional quiet argument you can set to TRUE if you don’t want that message to print regardless of the roll outcomes.

# Roll for ability scores using the '4d6 drop lowest' method
dndR::ability_scores(method = "4d6")
#>   ability score
#> 1      V1    16
#> 2      V2    15
#> 3      V3    16
#> 4      V4    14
#> 5      V5    14
#> 6      V6    13

Detailed Character Creation

If you are creating a player character and already have your desired class and race in mind, you can go one step further and use pc_creator to roll for ability scores, include racial modifiers to those scores, assign your highest two scores to the “most important” abilities for that class, and return final ability scores and modifiers as a dataframe.

# Create a half orc barbarian
dndR::pc_creator(class = 'barbarian', race = 'half orc', score_method = "4d6")
#>   ability raw_score race_modifier score roll_modifier
#> 1     STR        14             2    16            +3
#> 2     DEX        10             0    10             0
#> 3     CON        14             1    15            +2
#> 4     INT        11             0    11             0
#> 5     WIS        14             0    14            +2
#> 6     CHA        11             0    11             0

Note that to it does require under the hood tweaks to accept various class/race information so not all character races or classes are necessarily supported. I’m always happy to add support for new ones though so feel free to open a GitHub Issue and I can add support for the missing class(es)/race(s) in the next version of dndR.

You can check currently supported character races and classes with the dnd_races and dnd_classes functions respectively.

# Identify supported character races
dndR::dnd_races()
#>  [1] "aarakocra"          "bugbear"            "changeling"        
#>  [4] "dark elf"           "dragonborn"         "drow"              
#>  [7] "forest gnome"       "goblin"             "half elf"          
#> [10] "half-elf"           "half orc"           "half-orc"          
#> [13] "high elf"           "hill dwarf"         "hobgoblin"         
#> [16] "human"              "kalashtar"          "lightfoot halfling"
#> [19] "mountain dwarf"     "orc"                "plasmoid"          
#> [22] "shifter"            "rock gnome"         "stout halfling"    
#> [25] "tiefling"           "warforged"          "wood elf"

# Identify supported character classes
dndR::dnd_classes()
#>  [1] "artificer" "barbarian" "bard"      "cleric"    "druid"     "fighter"  
#>  [7] "monk"      "paladin"   "ranger"    "rogue"     "sorcerer"  "warlock"  
#> [13] "wizard"

Ability Modifiers

If you have a single ability score and want to remind yourself what roll modifier that translates to, you can use the mod_calc function.

# What is the roll modifier for an ability score of 15?
dndR::mod_calc(score = 15)
#> [1] "+2"

Player Level Calculation

If your party uses experience point (XP)-based leveling, you can quickly determine your current level for your earned XP with the pc_level_calc function. This function also returns what your proficiency bonus should be and the minimum XP threshold for your current level.

Big thanks to Humberto Nappo for contributing this function!

# What level is a player character that earned 8,250 XP?
dndR::pc_level_calc(player_xp = 8250)
#>   player_level xp_threshold proficiency
#> 5            5         6500          +3

Non-Player Characters (NPCs)

DM: “You walk into the tavern and glance around the poorly-lit, grimy room. In a corner booth, you catch sight of the traitor you’ve been hunting these past two weeks–Tymoth Grissel. You nearly had him in the Sootpile mountains but that rockslide allowed him to escape by the skin of his teeth. He won’t escape this time.”

Player: “Cool, cool, cool…but who else is in the tavern?

DM:

When I’m DMing, I sometimes struggle with improvising background non-player characters (NPCs) that aren’t relevant to the current questlines when my player ask about them. To hopefully help fellow DMs, dndR includes a function to let you quickly respond in situations like the one I’ve described above. The npc_creator function quickly selects a random race and job for however many NPCs you need.

# Make three NPCs
dndR::npc_creator(npc_count = 3)
#>         Race            Job
#> 1    bugbear     ambassador
#> 2 rock gnome         urchin
#> 3   half-elf anthropologist

If your players decide to go chat with the goblin carpenter passing them on the street (or whoever else they cross paths with) you can then improv more details about that particular NPC as needed. Hopefully this function helps you skip the “uh…” step of trying to on-the-fly come up with some brief NPC descriptions that give depth to your world.

Note that because both NPC race and job are selected randomly you may wind up with some unusual combinations. I hope that adds to the fun but feel free to re-run the function until you get NPCs that fit your world and intended tone.