Skip to content
3 Death Saves

midi-qol

Tenacity offers two integration paths. The pre-resolve path interrupts the midi workflow mid-flight and offers a Spend dialog before the outcome lands. The post-hoc path adds Raise Attack and Raise Save buttons to chat cards from finished workflows.

Requires midi-qol active in the world. Both paths use standard midi-qol workflow hooks and degrade gracefully when midi-qol is not running.

Two hook points sit on the live midi-qol workflow.

Attack pathway. After midi finishes the attack roll but before damage is dealt, Tenacity checks whether the attack already hits every target naturally. If it does, nothing happens. If at least one target is missed and the AC is unknown or unmet, the owning player sees the Spend Tenacity on Attack dialog. Confirming sends the new total back to midi, which continues the workflow as if the bumped value was the original roll. Damage is dealt to anyone the new total hits, target hit-state updates, and the chat card shows the raised total.

Save pathway. After midi resolves saves, any target that failed gets a Spend Tenacity on Save prompt. The owning player sees the dialog, or the GM sees it when no player owns the actor. The dialog shows the target’s name, the roll total, and the DC when disclosure allows. Confirming pushes the new total back into midi’s failed-save set. When the bumped total meets the DC, midi marks the save as a success and adjusts damage accordingly.

Either dialog can be canceled. The workflow then continues with the original roll.

Pre-resolve dialogs run on a timer controlled by the Midi Spend Timeout setting. A header bar drains over the duration, and a pause control holds the timer for players who need more time.

When the timer expires, the dialog closes, “Tenacity spend timed out.” appears, and midi continues with the original roll. A timeout behaves the same as canceling. See Settings to disable the timer.

Saves with multiple targets produce one dialog per failed save, presented in sequence. Each prompt names its target and is owned by that target’s actor, or by the GM when no player owns it. Canceling one prompt does not cancel the others. A player can dismiss each prompt in turn to bow out of the remaining saves.

A player who owns multiple failed-save targets sees the dialogs back to back. Refusing on one target does not consume that target’s Tenacity.

When Spend succeeds during pre-resolve, the bumped total is not cosmetic. It replaces the workflow value midi uses for downstream decisions.

  • Attack bumps update workflow.attackTotal and append a flavored Tenacity term to the attack roll. Newly-hit targets take damage as part of the normal workflow.
  • Save bumps update the saving throw. When the new total meets the DC, Tenacity calls workflow.updateSaveFailSets so midi treats the target as having passed, and damage is reduced or canceled according to the activity’s on-save behavior.

The chat card is patched in place. The displayed total, the save row, and any Save This Roll card reflect the bumped value. A summary pill on the card notes the raise.

When a workflow has already finished and Post-Hoc Spend is enabled, Raise Attack and Raise Save buttons are injected onto the midi chat card.

  • Raise Attack appears on cards where the attack missed at least one target and the workflow has not already been bumped. Spending opens a Post-Hoc Attack Raise dialog listing every missed target with its AC and the gap to flip. Confirming spends Tenacity, raises the attack total, and dispatches damage to any target the new total now hits.
  • Raise Save appears on cards with one or more failed saves, one button per failed save the user owns. Spending opens a Post-Hoc Save Raise dialog for that target. Confirming raises the save, and when it meets the DC, restores HP according to the damage-undo mode.

Both buttons honor the Post-Hoc Window setting, which sets how long after the chat card’s timestamp the buttons remain available. Once a card has been flipped post-hoc, the corresponding button disappears so the same card cannot be raised twice.

When a post-hoc save flip turns a failure into a success, damage has usually already been applied. The Post-Hoc Damage Undo setting decides what happens to that HP.

  • Auto. HP is restored silently. The target’s HP and temp HP are written back up to their pre-damage values, capped at max HP.
  • Confirm. A “Restore HP” dialog is shown to whoever triggered the post-hoc save spend, which is the target actor’s owner when a player owns it, or the GM when no player does. The dialog shows the exact values. Choosing Keep Damage leaves the target as-is even though the save flipped.
  • Off. No HP is restored. The save still flips for record-keeping and the chat card shows the new total, but damage stays applied.

The restored amount reflects the activity’s on-save behavior. A half-on-save spell restores the half that was taken. A none-on-save effect restores the full damage. A full-on-save effect restores nothing, because no save reduction applies.

  • Multi-target cleave on post-hoc attacks. When a post-hoc attack raise flips an attack into multiple new hits at once, damage application uses midi’s applyTokenDamage directly. Edge cases involving conditional damage or per-target modifiers may not perfectly replicate what the original workflow would have produced.
  • Workflow garbage collection. midi-qol drops workflow objects from memory after a while, and always on page reload. Post-hoc buttons rely on flag data stored on the chat card rather than the live workflow. Features that need workflow internals degrade when the workflow is gone. A “Workflow data unavailable” notification appears when Tenacity cannot reconstruct enough state to finish a post-hoc flip.
  • Settings for Midi Spend Timeout, Post-Hoc Spend, Post-Hoc Window, and Post-Hoc Damage Undo.
  • Spending Tenacity for the general Spend dialog and how it works outside midi.
  • Refunds and failed raises for what happens when a post-hoc raise does not flip the outcome.