14.6.0 (dnd6 branch)
Requirements
- Supports dnd5e 6.x only: 6.0.0 to 6.999 (verified 6.0.5).
- Requires dae 14.6.0 or later.
- Requires Foundry 14.368 (verified 14.368).
- Version reads Foundry-major dot dnd5e-major: 14.0.x is the dnd5e 5.x line, 14.6.x the 6.x line.
Breaking: transfer effects with a duration
- A duration on a transfer effect no longer runs. dnd5e 6.0 does not start one, and transfer effects are passive by design; the old behaviour (toggle the effect on, it expires and disables itself) was times-up/DAE managing the v13 duration schema.
- Legacy items that relied on it — the effect toggled on and expiring on its own — now stay on until toggled off again.
- To restore it, add the effect to the activity's Effects list. dnd5e then applies it to the actor as a copy on use, which carries the duration and expires normally, leaving the item's effect intact. This is how dnd5e's own 2024 content is built.
Changes you will notice
Breaking: saving throw messages and summaries
- midi now posts a message for every saving throw it rolls, linked to its card, as dnd5e 6 does; it used to post one only with Auto check Saves "allShow" or for player rolls, and removed other users' save cards from the log. Each user's dnd5e "Summarize chat cards" setting now decides whether saves show on the card (on, dnd5e's default) or as separate messages (off).
- Save messages are public except with Auto check Saves "whisper" or "gmOnly", which whisper them to the GMs. What players see of an NPC's save still follows Auto check Saves, on the card and on the message: "all" shows the result and total but not the dice, "allNoRoll" only the result, "gmOnly" nothing.
- New setting "Save summary style": "midi" (default) shows midi's saves section as the card's summary and does not draw dnd5e's per-roll summaries; "dnd5e" draws dnd5e's summaries and midi's section lists only saves without one, such as those rolled through Monk's Token Bar, Flash Rolls or Epic Rolls. With "Summarize chat cards" off neither is shown on the card.
Attacks and targeting
- An attack dialog gives its target(s) the targeting reticle and pans the canvas to them, so it is clear which token each dialog is for.
- "Roll a separate attack per target" handles one target at a time: attack dialogs come one after another and targets complete in order.
- "Roll a separate attack per target" applies to attacks whose template type is unset, which it skipped silently.
- A triggered activity no longer inherits the triggering use's target confirmation or per-target attack setting, so "Roll a separate attack per target" no longer suppresses the target prompt on the activity it triggers.
- Target confirmation on an activity sheet shows the effective value and is read-only when the activity forces one; self-target activities report "never", as forward and cast activities already did.
- "Choose Targets" only forces target confirmation when the activity has a template type. dnd5e only offers the checkbox while one is set, so clearing the template left a hidden setting that still forced confirmation.
- An attack of opportunity is classified for every target of a use, not only the first, so "Roll a separate attack per target" no longer judges the first target by different range rules to the rest.
- An attack of opportunity no longer warns that its target is out of range; the check is not enforced for one.
- Closing a reaction dialog stops its countdown, which went on updating the closed window and threw.
- A creature immune to the configured dead condition is marked with the Dead status at 0 HP instead of nothing.
- A trap template's delayed removal no longer throws when template cleanup has already deleted it.
- Template targeting, flanking, range, cover and push direction use where a token has moved to, not where it is drawn: acting straight after a move used a point part-way along it, and in a background browser tab every token counted as being at 0,0.
Templates and regions
- Activity templates have a height, set by their area type around the caster: a sphere is centred on the caster, a cone on its axis, and a cylinder, ring, cube, line or wall stands on the caster (a cylinder, ring or wall to its own height). The flat circle and square areas stay unbounded, and emanations follow their token. A sphere cast on the ground used to reach a flier at any height, for midi's targeting and dnd5e's region effects alike.
- New optional rule "Template Origin Height": templates are measured from the caster's base (default), top, or eye level; an activity can override it in its Region settings.
- AoE template targeting no longer fails for templates with no elevation set.
- Targets update live while a template is dragged, by the activity's auto-target settings.
- An emanation set to attach to the caster or a target ("Attach Region To") is centred on that token.
- Trap templates are the correct size.
- Region effects come off when a token leaves the region, and origin
@values in them are filled in; the caster is still excluded where midi's region settings exclude the source.
Damage and traits
- "Ignore Damage Immunity/Resistance/Vulnerability" for all damage types also covers a creature's "All Damage" trait, which it previously left in force.
- New activity option "Downgrade Immunity": treats damage immunity as resistance rather than ignoring it, which leaves full damage.
- Ignoring or downgrading an immunity, resistance or vulnerability for specific damage types also works against an "All Damage" trait, for midi's options and dnd5e's damage tray alike;
ddi.<type>applies against an "All Damage" immunity.
- Critical damage modes that add extra dice (max crit, explode, max base + roll crit) place them as dnd5e does: inside a term bound by
*,/or%, and with a subtracted term's sign.
- Conditional Spell Sniper and Sharpshooter flags are evaluated; any condition used to count as true.
Advantage, saves and rolls
- Advantage and disadvantage from dnd5e 6.0's own rules are no longer overwritten by midi on tool, skill, check, save and death save rolls.
- midi's noAdvantage and noDisadvantage flags cancel dnd5e's own advantage and disadvantage, not only midi's.
- dnd5e's own roll modes for tools, attacks and ability checks combine with midi's advantage flags instead of being replaced by them.
- dnd5e advantage rules (
dnd5e.advantageeffect changes) combine with midi's advantage flags for saves, checks, skills, tools, attacks, death saves and initiative, and also cancel or force advantage from the concentration and death save roll modes.
- Initiative
advantage/disadvantage.check.<ability>flags use the actor's initiative ability, not always dex.
- A failed save, check, skill or tool roll requested from another player settles instead of leaving the use waiting forever.
- DDB Game Log attack and damage rolls are recognised.
Over-time effects, durations and initiative
- OverTime and ActivityOverTime effects run on the right combatant's turn after initiative is rerolled; a combatant whose turn is skipped gets both its start and end of turn.
- Auto reroll initiative rolls as the round advances (new initiatives and the first turn of the round in one update); a player's round advance is passed to the GM to roll.
- Death saves no longer trigger over-time save effects.
- New special durations:
isMissed(the actor is attacked and missed) and1Miss/1Miss:<actionType>(the actor's attack hits no target), mirroringisHitand1Hit; andisAttacked:<actionType>/isHit:<actionType>, which expire only for that kind of attack (e.g.isHit:mwakon a melee weapon hit).
- Effects set to expire on a failed concentration save now expire.
- The Long Rest, Short Rest and New Day special duration labels display correctly.
- Reaction and bonus action used markers no longer throw "ActiveEffect dnd5ereaction000 does not exist" when they expire.
- A bonus action is recorded when Enforce Bonus Actions is "Display status icon", matching reactions; only the prompt stays conditional on enforcement.
Concentration, consumption and effects
- A recast of a concentration spell is linked to its new concentration, not to an inactive one left from before (expired and awaiting deletion, suppressed, or disabled).
getConcentrationEffectreturns active concentration effects only, as dnd5e 6'sActor#concentrationcounts them.
- Aborting a use for the wrong number of targets, or cancelling target confirmation, refunds the consumed spell slot or uses.
- Concentration begins, and replaces the existing one, only once targeting is complete, so a use cancelled before then keeps the existing concentration.
- Consecutive uses of the same activity no longer pick up the previous use's configuration.
- Activity effects referenced by uuid, such as compendium effects, are applied, including those applied on a save.
- An item's own other activity and its ammunition's activity can both run, and
otherActivityId: "none"no longer silences ammunition.
- Ammunition activity effects are applied whether or not the ammunition supplies the other activity.
- An ammunition activity's damage no longer counts the ammunition's base damage twice.
- Convenient Effects applied by a concentration spell end with the concentration.
- Sample items whose applied effects use the caster's values (OverTime save DCs, Bardic Inspiration, Harm, Branding Smite and others) are marked for DAE's legacy application, so they keep working under DAE's dnd5e 6 default.
- New "Aid" sample item: raises temporary max HP and, through DAE's Also raise current HP, current HP by the same amount, with no healing roll. The SRD Aid's healing is capped at the maximum before its effect raises it, so a creature at full HP gained no current HP.
Chat cards and damage tray
- "Show players when the GM rolls privately" (was "Always display attack/damage cards for hidden merge cards") shows other players the GM's private, self or blind midi card as a "rolled some dice" stand-in. midi no longer posts hidden extra dnd5e attack and damage messages for it, which carried a second damage tray and linked themselves to the card.
- midi's attack and damage rolls are linked to the card as dnd5e links the rolls it posts (
roll.options.originatingMessage,Roll#getOriginatingMessage(),roll.options.rollType), and flags other modules put on those rolls' message configuration (e.g. automated-conditions-5e's tooltip visibility) are kept on the card.
dnd5e.preApplyDamage/dnd5e.applyDamagefired by midi carry the card asoriginandoriginatingMessage, as dnd5e's do, anddnd5e.applyDamagereaches every handler (callAll).
- midi's save, check and tool rolls record the activity and item they were rolled for (
system.activity,system.item), as dnd5e's own save buttons do, and always carry the DC, so dnd5e can tell success from failure (card outcomes, Select Success/Failure, summaries). Who sees the result is still decided when the card is shown; under Auto check Saves "whisper" players see no success or failure, their own saves included.
- Target names hidden by Anonymous or Hide NPC Names are hidden from players everywhere on midi's card - hit and save rows, dnd5e's save summaries and the damage tray - and follow the module's current settings when the card is shown. A player who owns the target sees its real name. Cards no longer store a player name.
- "Hide NPC names" (Misc) is back: the name players see for creatures with no player owner, as speaker (header and card text) and target, when neither Anonymous nor Hide NPC Names is active. Blank, the default, shows real names.
- Target AC on the hits display follows dnd5e's Attack Result Visibility: short of "all", players see only the AC of tokens they own (character targets were always shown).
- A save total's tooltip no longer shows players the dice (or a hidden DC) unless Auto check Saves is "All see Result + Rolls".
- Save summary style "dnd5e": the summaries sit under midi's save heading, which keeps the DC and damage-on-save text, and keep their success/failure icon when colour coding is off.
- Saves requested through Flash Rolls carry the card's message id (
originMessageId), so Flash links them to the card as dnd5e's own save buttons do.
- A cancelled Epic Rolls request no longer leaves the workflow waiting: its saves (and any actor that did not roll) count as failed. midi read
cancelled; Epic Rolls reportscanceled.
- "Select Hit Targets" on a midi card selects the hit targets; both menu entries selected the misses under dnd5e 6.
- An over-time effect's roll request (actionSave=roll) is posted as a dnd5e 6 prompt message, with one button per save ability; the old roll-request card template no longer exists, so the request failed. The roll from its button is still matched to the effect.
- An initiative roll (a check message in dnd5e 6) is no longer taken as a pending save by the same token.
MidiQOL.showItemInfoposts dnd5e's item card (its own template no longer existed); the unused tool card template is removed.
- The weapon mastery line is shown on midi's attack cards again, and midi's success/critical highlight settings apply to dnd5e's own roll cards again; both lived in overrides dnd5e 6 no longer calls.
- Removed CSS for card markup dnd5e 6 no longer has.
- Save and check buttons on midi cards work with dnd5e 6's grouped buttons: choosing an ability, skill or tool from the dropdown rolls that one, against the activity's DC (it rolled the first ability against DC 0). As in dnd5e, the button's data is read from the card, and the roll is made for the card's targets (following its targeted/selected toggle) rather than the selected tokens; a missing DC falls back to the activity's.
- Blind and obscured rolls no longer show their result to players under dnd5e 6. Its compact roll markup (total, d20 face, breakdown popover) is masked, and so are save and check messages that dnd5e draws as summaries inside midi's card: a roll a player may not read shows a "rolled" placeholder there, or nothing with "Really hide private/blind/self rolls" on, and an obscured roll shows ??. A roll forced blind by the roll-blind settings is not shown to players at all, on the card or on its own.
- One damage card serves the GM and the players: each sees their own view of it, so the separate player damage card is gone. The card is public when the player damage card setting shows players a view (and, with "only when damage differs", only then), otherwise whispered to the GMs. The
hidePlayerDamageCardsetting is removed. GMs can see a card as players do with "View as player" on its right-click menu.
- Who sees the damage and effect trays is dnd5e's decision: the GM always, players only when dnd5e's "Allow player damage/effects tray" settings are on. midi's "Add chat damage buttons" setting is removed from the config panel,. A card whose effects midi applies itself with no button ("apply, no button" / "apply and remove") offers no effects tray.
- The damage button says Critical as soon as a critical attack is shown, instead of briefly showing the plain damage label.
- A usage card whose item is deleted loses its buttons.
- The GM and player
Remove chat card buttons after rollsettings both apply.
- Chat buttons use the dnd5e 6.0 style; their labels follow the language setting.
- Damage type icons sit to the left of the total instead of before it, so the total stays centred.
- Bonus damage rolls are shown in the bonus damage section; previously only its label appeared, though the damage was always applied.
- Other and bonus damage rolls no longer render inside the section label.
- The damage tray lists all of the use's targets, rather than whatever was selected before the roll.
- The tray's per-target detail reflects reaction-based effects such as uncanny dodge.
- Resistance and immunity icons are shown on the tray's target row with their state on hover, in addition to dnd5e's right-click menu.
- Smaller chat messages: use card 9.9kB -> 7.2kB; bytes written per attack 19.0kB -> 4.1kB; saves section 4.5kB -> 1.5kB.
Distance
- The distance fudge factor applies on every scene and measurement mode, not only gridless scenes with Gridless Grid enabled. Perimeter measurement still floors at one grid unit; centre and default measurement can reach 0.
Implementation details
Workflow and API
MidiQOL.registerWorkflowOptionsSchema(namespace, schema): a module declares the data it keeps inworkflowOptions.<namespace>as a DataModel schema; midi then sends and stores it losslessly (Sets and other field types come back intact) and does not pass undeclared per-use keys to other clients, chat cards or triggered activities.MidiQOL.encodeWorkflowOptions/decodeWorkflowOptionsexpose the conversion.
- A remote
completeActivityUsereturns its token sets (targets, hitTargets, failedSaves, ...) as Sets of tokens again, as a local use does;MidiQOL.restoreWorkflowTokenSetsdoes the same for other workflow macro data that crossed a socket.
- A use no longer writes its target snapshot into the caller's
workflowOptions; reusing one options object carried the first use's targets into later uses with no targets.
- For "Roll a separate attack per target", each target's use waits for the previous target's workflow (
midi-qol.postCleanup/preAbort, 90s limit), andcompleteItemUse/completeActivityUseresolve after the last target finishes, not the first.
proceedChecks.checkAoOsets whether a use is classified as an attack of opportunity; defaults tocheckReaction.
moveTokenAwayFromPointresolves once the push has landed; it returned before the move.
- Game logic reads a token's committed position (
document._source) rather thantoken.x/y,token.centeror the animated document values; flanking no longer reads the placeable transform.
getDistanceis available in evaluated conditions and macros, and is the preferred call: it honours the Distance Measurement setting, so it includes perimeter measurement and agrees with midi's own range checks.computeDistanceremains available as the centre-based primitive.
- Condition data
riderStatusesincludes a status's own riders, e.g. an effect applying unconscious also lists prone.
- midi only asserts advantage it grants or denies, instead of overwriting dnd5e 6.0's d20 rules on every tool, skill, check, save and death save.
Over-time and special durations
- OverTime and ActivityOverTime effects run from core's turn events, by combatant rather than turn position.
- Auto reroll initiative happens inside the round-advance update.
- Over-time saves read the dnd5e 6.0 message sub-types rather than
flags.dnd5e.roll.
- midi owns the registration of its special durations; the Long Rest, Short Rest and New Day labels use the dnd5e 6.0 keys. DAE registered the concentration option as
isConcentrationSaveFail, which never matched; both spellings are accepted.
- Reaction/bonus action used markers are expired by DAE only; midi deleting them as well caused the error.
Regions and templates
- Templates use regions throughout; the deprecated
AbilityTemplateAPI and therefreshMeasuredTemplate,preCreateMeasuredTemplateanddnd5e.preCreateActivityTemplatehandlers are gone.
- Template regions carry
elevation.bottom/top(top inclusive), fromtemplateElevationindnd5e.createMeasuredTemplateandcreateActivityTemplateRegions: worked out from the activity's template type and sizes (converted with dnd5e'sconvertLength), not the region shape, which iscirclefor both spheres and cylinders. The origin comes fromoptionalRules.templateOriginHeightor the activity'sregionBehavior.templateOrigin(default/base/top/eye; eye usesgetTokenVisionElevation).
- Trap templates convert sizes with dnd5e's
convertLengthfrom the activity's units.
- Region effects (apply/remove effect rules and the over-time fallback's
dontApplyeffects) are applied by dnd5e's apply-effect region behaviour instead of midi's own; midi's region behaviour now only runs activities. Its disposition filter carries over, and apreCreateActiveEffecthook keeps the caster excluded.
- Conditional
flags.dnd5e.spellSniper/sharpShootervalues go throughevalAllConditions; dnd5e's Boolean coercion made any condition true.
Chat card data
- Usage cards are a chat-message sub-type rendered from
dnd5e.card-face; midi no longer builds its own card markup.
usage.chatCard, the_usageChatContextoverride, the content-splicing machinery andactivity-card.hbsare gone.
- Roll sections are stored in
system.midi.sectionsand rendered frommessage.rolls, or from a template plus data.
- Button visibility is resolved per viewer at render rather than stripped from the stored card.
- Save rolls are carried on the card, so macros, Dice So Nice and
getAssociatedRollscan see them.
- The attack roll is located by roll type rather than by position in
message.rolls.
- Target rows carry their token uuid;
data-uuidhad always rendered empty.
- midi's messages carry no
flags.dnd5e: targets are insystem.targets, and save and check rolls name their card insystem.originrather thanflags.dnd5e.originatingMessage.
system.targetsis extended with midi's per-target detail: save results and multipliers, super and semi-super saver, uncanny dodge, recording what the damage calculation applied.
- A synthetic item's snapshot is kept in
flags.midi-qol.itemDatarather thanflags.dnd5e.item.data.
- Convenient Effects applied by a concentration spell depend on the concentration, and effect data carries the use's scaling and spell level.
- Removed
ChatMessage#collectRollsand the hiddenmergeCardMultiDamagesetting.
Removed and deprecated
- Removed checks for times-up, which is not a module in v14.
- Removed the workaround for CAT 0.0.7's OverTime save crash; fixed in CAT 0.0.8.
DocumentSheetConfig,CanvasOcclusionMaskandScene#templatesreplaced with their v14 equivalents.