Skip to content

Encounter Calculator Options and Usage

Dice Monster currently uses an MCDM-style CR budget calculator for encounter difficulty.

The active calculator returns:

  • difficulty tier (Easy, Medium, Hard, Deadly)
  • CR cap guidance for the party level
  • budget usage metadata used by the encounter UI

The encounter list and preview surfaces this difficulty automatically based on party setup and monster groups.

Difficulty is derived from:

  • average party level
  • number of players
  • each monster group’s CR
  • monster role handling (including special handling for minions and solo monsters)
  1. Go to Encounters.
  2. Create a new encounter and select a campaign you own.
  3. Confirm or adjust party level and player count.
  4. Add monster groups.
  5. Use the displayed difficulty label to tune encounter pressure.

The run encounters list supports:

  • search by name
  • filter by average player level
  • Start Encounter opens initiative setup and restarts the encounter run state.
  • Resume jumps back into an active running encounter.
  • If no run is active, Resume shows a warning and keeps your encounter data unchanged.

Encounter run state (initiative, turn/round, ability usage tracking, etc.) is stored separately from your encounter definition.

To avoid keeping inactive run state indefinitely, encounters with no activity for 31 days may have their run state cleared. If that happens, Resume will no longer work for that run and you can use Start Encounter to begin a fresh run.

Only one difficulty model is currently wired in the app.

Support for multiple selectable calculators is planned, but not yet available in the UI.

Calculator calls now go through a strategy interface in @repo/dnd-lib/difficulty-calculators.

  • getEncounterDifficultyCalculator() returns the active strategy.
  • setEncounterDifficultyCalculator(calculator) swaps the active strategy.
  • resetEncounterDifficultyCalculator() restores the default MCDM strategy.

Future calculators can plug in by implementing EncounterDifficultyCalculator and registering it with setEncounterDifficultyCalculator(...).