Narrat 2.15.0 is released | New dice-based skill checks system

Narrat 2.15.0 is live!

Narrat 2.15.0 includes the new dice-based skillcheck system, which incorporates most of the requests and feedbacks people have asked for.

Specifically, this changes the old skill check rolling system into a dice-based system.

  • Instead of one roll, you can specify a number of dice to be rolled
  • There are new methods for calculating final score of a skill check, like only getting the highest roll out of a number of rolls, or running a pool of dice and adding up the amount of successes.

To get the latest version, simply run npm install narrat@latest

Breaking Change

Due to the amount of changes in the skill checks config, I decided to make this one a breaking change. It’s pretty quick to update though.

In skills.yaml, the skillChecks object previously contained general skill checks options. This can now be deleted and instead:

Create a skillChecks.yaml config file, using this example file:

Config example
options:
  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']
skillChecks:
  testDicePool:
    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

Then in your config.yaml, add the info about that new file:

skillChecks: data/skillChecks.yaml

The config options available have different names, but you should be able to reproduce the same effect as your old settings. For example, to match the default settings where rolls are between 0 and 100:

options:
  diceRange: [1, 100]
  diceCount: 1
  extraPointsPerLevel: 10
  extraDicePerLevel: 0
  successOnRollsBelowThreshold: false
  showDifficultyText: true
  showDifficultyNumber: false
  showDifficultyWithoutModifiers: false
  totalRollIsHighest: false
  totalRollIsLowest: false
  difficultyText:
    - [0, 'Very Easy']
    - [10, 'Easy']
    - [30, 'Medium']
    - [50, 'Hard']
    - [70, 'Very Hard']
    - [80, 'Extremely Hard']
    - [90, 'Near Impossible']

More details

This updates also includes configuration for individual skill checks in yaml. This allows the new option winsNeeded for skill checks (which is what enables doing skill checks that use a pool of dice and need to win x times to succeed).

More generally, this new skillchecks config system will enable adding more options and complexity to them in the future as people’s needs grow. Previously, all options for a skill check had to be specified in one line of code, and this was getting out of hand. For example:

choice:
  roll myTestRoll agility 50 "Text of the roll" hideAfterRoll if (== $data.allowed true):
    // Rest of the code

Instead can now have the skill check config specified in skillChecks.yaml

skillChecks:
  myTestRoll:
    skill: agility
    difficulty: 50
    winsNeeded: 2 # This wasn't possible before
    hideAfterRoll: true

The script then becomes:

choice:
  roll myTestRoll "Test of the roll" if (== $data.allowed true):
  // Rest of the code
skillChecks: data/skillChecks.yaml`

Those new skill check options replace the old skillChecks options in the skills.yaml file. You can still make it do the exact same thing as before, some of the options have just been renamed.