Proposal for dice-based skill checks

Dice-based skill checks

Many people have requested dice-based skill checks, as it’s a popular TTRPG feature. I’m wondering about how customisable we need the implementation to be, based on people’s needs.

How it would work

A dice-based skill check should be similar to the current system with rolls between 0 and 100, except it’s done with dice. The game throws X dice, adds up the total, and if the total is above a score to pass (+/- modifiers like skill levels), the check is successful.


I’m thinking of a config like this in the skillChecks file:

    mode: 'dice' # instead of "roll"
    diceRange: [1, 6]
    diceCount: 2
    extraPointsPerLevel: 1
    luckyDices: ['66'] # If those combinations are hit, always succeed
    unluckyDices: ['00'] # if those combinations are hit, always fail
    - - 0
      - Very Easy
    - - 4
      - Easy
    - - 6
      - Medium
    - - 8
      - Hard
    - - 10
      - Very Hard
    - - 11
      - Extremely Hard
    - - 12
      - Near Impossible

Similar to the other system, the difficulty text could be based on the number to beat (the engine already takes into account skill level modifiers to add to the potential role for calculating difficulty).

The extraPointsPerLevel would be similar to skillMultiplier in the other system, ie. if it’s set to 1 and you’re level 5 in a skill, then your rolls all get +5

The skill checks themselves shouldn’t need to change as they already have a difficulty number. That number would just be lower in dice-based games compared to a 0-100 roll.

Player feedback widget

Ideally, I’d like rolls to have more player feedback so players can understand what’s going on.
A hover tooltip on the skill check that shows the number to beat, how many dice are thrown and the modifiers from skill level (+ other flag-based modifiers when they get implemented).

It should also probably show what roll you got on your dice in some way when the skill check happens .

This is not a thing yet though, and I’d rather prioritise implementing this feature, and then adding the feedback later.

I think some games might not want to give any info or feedback on how it works though, so it would probably be good to have an option to disable those feedback systems.

Feedback and suggestions

Reply to this thread with feedback and suggestions on how you think this should work, especially if there are special details you think might be needed that I forgot here

The proposed approach would definitely open up a lot of flexibility for the designer. The inclusion of luckyDice and unluckyDice as a form of support for crit success/crit fail mechanics is appreciated, as would be the ability to surface information/feedback about rolls to the player.

In addition to the “roll no. of dice → total result → check result against target number” style suggested, there are a handful of other types of dice mechanic that I think would be worth considering:

  • Roll under - Rather than using a skill-based positive modifier to try and exceed a set value, the player’s skill is represented as a target value that they attempt to roll under. Difficulty modifiers raise or lower the target value. Odds of success or failure are immediately readable if used with a d100 system, as the player’s skill value = their percentile chance of success.
  • Dice pool - A number of dice are rolled and those showing a value above a set threshold are counted as one success each. Difficult checks require higher numbers of successes, and skill values and situational modifiers alter the number of dice in the pool.
  • Keep highest/lowest - A number of dice are rolled and all but the highest or lowest result are discarded. Modifiers such as skill level or situational factors increase or decrease the number of dice rolled.

These would require a not-insignificant amount additional work to implement alongside the proposed dice mechanic. On the other hand, I think that incorporating multiple existing dice mechanics as options could further deepen the RPG design space that Narrat is able to offer.


This is making me realise I forgot to include an option for what kind of dice is used, I’ll add that.
Roll under could just be a boolean option in the config, with the default being roll above.

Those ones are interesting and could be nice to have, once the mechanic is implemented it wouldn’t be too hard to add extra modes for it like that in the future

1 Like

I second dice pool, especially when building on a D10 system like World of Darkness, or building a system similar to Citizen Sleeper.

1 Like

Dicepools, as mentioned, would be great. Thinking especially of the roll X, take Y highest method that BitD/others do. (Like a lot of my systems are roll 3 to 6 d6 and take the highest/lowest 3 combined, for instance.)

On that note, multiple thresholds would be good as well - for example, PbtA’s result bands for 2d6+X (6- failure, 7-9 fine, 10+ good).

it’s definitely possible to add, if enough people are interested I might look at doing it when I’m done with the basic mode

1 Like

I’ve been implementing this and decided it will be a slight breaking change in the config, to avoid maintaining too many old config formats.

The initial plan was to keep the old system and the new dice system, but I realised the old system is a subset of the dice system and it makes no sense to not just have everything use the dice system.

The previous system is just one number rolled, it can simply be replaced by one dice. It also means using the new key names which are clearer than the old ones.

Only downsides is people with games already in development will just need to update their config when they update narrat, but this should only take a minute really.


Released alpha version 2.15.0-alpha.1 with a first version of dice-based skill checks.

To install it, use npm install narrat@alpha.

With this new version, a new skillchecks.yaml file must be created:

  diceRange: [1, 6]
  extraPointsPerLevel: 1
  diceCount: 2
  successOnRollsBelowThreshold: false
    - [2, 'Very Easy']
    - [4, 'Easy']
    - [6, 'Medium']
    - [8, 'Hard']
    - [10, 'Very Hard']
    - [11, 'Extremely Hard']
    - [12, 'Near Impossible']
skillChecks: {}

A new line needs to be added to config.yaml to point the game to the new file:

skillChecks: data/skillchecks.yaml

The old skillChecks section from skills.yaml can be deleted.

Preview branch of the docs with the new changes:

1 Like

As it’s been suggested on Discord, we want to add options to control the difficulty text that appears. At the moment it looks like this:

Games may want to show:

  • just the difficulty text
  • just the difficulty number (currently not shown at all)
  • both
  • same options but with the modifiers not taken into account to show the “original” target difficulty (right now the difficulty text takes into account your level to calculate the “real” difficulty

So I will add those options to the skillChecks.yaml file:

  showDifficultyText: true
  showDifficultyNumber: true
  showDifficultyWithoutModifiers: true

I’ve also added options relating to other suggestions with dice pools and being able to keep higher or lowest roll:

  extraDicePerLevel: 1 # This will give the player 1 extra dice for each skill level
  finalRollIsHighest: false # If true, this would use the highest roll from all dice roll as the final score
  finalRollIsLowest: false # Same thing but using the lowest one

I’m also adding an extra option to individual skillcheck configs where they can have both a difficulty, and an amount of successes required, to allow future dice pool features (for now this option won’t be used).

    skill: 'agility'
    difficulty: 3 # This is the usual difficulty number normally passed in the roll command
    winsNeeded: 2 # This is the new option specifying how many of the dice rolls need to succeed
    hideAfterRoll: false
    repeatable: false

narrat alpha 2.15.0-alpha.2 is up for testing. You can install it with npm install narrat@alpha

It has the new dice-based skill check options, as well as a bunch of extra new options for more customised skill check roles (effectively everything that was suggested in this thread should be possible now). See the docs for the new config options: Skills System | Narrat Docs

Example skillchecks.yaml config file:

  diceRange: [1, 6] # Dice rolls will be between those 2 numbers, inclusive
  diceCount: 2 # How many dice are rolled by default on skill checks
  extraPointsPerLevel: 1 # How many extra points to your rolls are given per level in the skill
  extraDicePerLevel: 0 # How many extra dice the player gets per level in the skill (Default 0)
  successOnRollsBelowThreshold: false # Inverts the skillcheck behaviour so that success is when the roll is *below* the difficulty threshold
  showDifficultyText: true # Whether to show the difficulty text on the skill check
  showDifficultyNumber: true # Whether to show the difficulty number on the skill check
  showDifficultyWithoutModifiers: false # Whether to show the original difficulty without modifiers applied on the skill check
  totalRollIsHighest: false # Uses only the highest roll to do the final skill check comparison, instead of adding up all rolls
  totalRollIsLowest: false # Uses only the lowest roll to do the final skill check comparison, instead of adding up all rolls
  difficultyText: # Text to show for each band of difficulty level
    - [2, 'Very Easy']
    - [4, 'Easy']
    - [6, 'Medium']
    - [8, 'Hard']
    - [10, 'Very Hard']
    - [11, 'Extremely Hard']
    - [12, 'Near Impossible']
    skill: agility # skill id
    difficulty: 6 # score to beat during rolls
    winsNeeded: 2 # [Optional] How many rolls need to beat the score (uses total of all rolls if this option isn't present)
    hideAfterRoll: false # [Optional] Whether to hide the skill check from options after it happened once
    repeatable: false # [Optional] Whether the skill check can be repeated if failed