diff --git a/daggerheart.mjs b/daggerheart.mjs index 48f4a615..644d6d86 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -17,6 +17,7 @@ import { socketRegistration } from './module/systemRegistration/_module.mjs'; import { placeables } from './module/canvas/_module.mjs'; +import { registerRollDiceHooks } from './module/dice/dhRoll.mjs'; import './node_modules/@yaireo/tagify/dist/tagify.css'; import TemplateManager from './module/documents/templateManager.mjs'; @@ -53,8 +54,6 @@ CONFIG.Canvas.rulerClass = placeables.DhRuler; CONFIG.Canvas.layers.templates.layerClass = placeables.DhTemplateLayer; CONFIG.MeasuredTemplate.objectClass = placeables.DhMeasuredTemplate; -CONFIG.Scene.documentClass = documents.DhScene; - CONFIG.Token.documentClass = documents.DhToken; CONFIG.Token.prototypeSheetClass = applications.sheetConfigs.DhPrototypeTokenConfig; CONFIG.Token.objectClass = placeables.DhTokenPlaceable; @@ -90,94 +89,34 @@ Hooks.once('init', () => { makeDefault: true }); - const sheetLabel = typePath => () => - game.i18n.format('DAGGERHEART.GENERAL.typeSheet', { - type: game.i18n.localize(typePath) - }); - const { Items, Actors } = foundry.documents.collections; Items.unregisterSheet('core', foundry.applications.sheets.ItemSheetV2); - Items.registerSheet(SYSTEM.id, applications.sheets.items.Ancestry, { - types: ['ancestry'], - makeDefault: true, - label: sheetLabel('TYPES.Item.ancestry') - }); - Items.registerSheet(SYSTEM.id, applications.sheets.items.Community, { - types: ['community'], - makeDefault: true, - label: sheetLabel('TYPES.Item.community') - }); - Items.registerSheet(SYSTEM.id, applications.sheets.items.Class, { - types: ['class'], - makeDefault: true, - label: sheetLabel('TYPES.Item.class') - }); - Items.registerSheet(SYSTEM.id, applications.sheets.items.Subclass, { - types: ['subclass'], - makeDefault: true, - label: sheetLabel('TYPES.Item.subclass') - }); - Items.registerSheet(SYSTEM.id, applications.sheets.items.Feature, { - types: ['feature'], - makeDefault: true, - label: sheetLabel('TYPES.Item.feature') - }); - Items.registerSheet(SYSTEM.id, applications.sheets.items.DomainCard, { - types: ['domainCard'], - makeDefault: true, - label: sheetLabel('TYPES.Item.domainCard') - }); + Items.registerSheet(SYSTEM.id, applications.sheets.items.Ancestry, { types: ['ancestry'], makeDefault: true }); + Items.registerSheet(SYSTEM.id, applications.sheets.items.Community, { types: ['community'], makeDefault: true }); + Items.registerSheet(SYSTEM.id, applications.sheets.items.Class, { types: ['class'], makeDefault: true }); + Items.registerSheet(SYSTEM.id, applications.sheets.items.Subclass, { types: ['subclass'], makeDefault: true }); + Items.registerSheet(SYSTEM.id, applications.sheets.items.Feature, { types: ['feature'], makeDefault: true }); + Items.registerSheet(SYSTEM.id, applications.sheets.items.DomainCard, { types: ['domainCard'], makeDefault: true }); Items.registerSheet(SYSTEM.id, applications.sheets.items.Loot, { types: ['loot'], - makeDefault: true, - label: sheetLabel('TYPES.Item.loot') - }); - Items.registerSheet(SYSTEM.id, applications.sheets.items.Consumable, { - types: ['consumable'], - makeDefault: true, - label: sheetLabel('TYPES.Item.consumable') - }); - Items.registerSheet(SYSTEM.id, applications.sheets.items.Weapon, { - types: ['weapon'], - makeDefault: true, - label: sheetLabel('TYPES.Item.weapon') - }); - Items.registerSheet(SYSTEM.id, applications.sheets.items.Armor, { - types: ['armor'], - makeDefault: true, - label: sheetLabel('TYPES.Item.armor') - }); - Items.registerSheet(SYSTEM.id, applications.sheets.items.Beastform, { - types: ['beastform'], - makeDefault: true, - label: sheetLabel('TYPES.Item.beastform') + makeDefault: true }); + Items.registerSheet(SYSTEM.id, applications.sheets.items.Consumable, { types: ['consumable'], makeDefault: true }); + Items.registerSheet(SYSTEM.id, applications.sheets.items.Weapon, { types: ['weapon'], makeDefault: true }); + Items.registerSheet(SYSTEM.id, applications.sheets.items.Armor, { types: ['armor'], makeDefault: true }); + Items.registerSheet(SYSTEM.id, applications.sheets.items.Beastform, { types: ['beastform'], makeDefault: true }); Actors.unregisterSheet('core', foundry.applications.sheets.ActorSheetV2); - Actors.registerSheet(SYSTEM.id, applications.sheets.actors.Character, { - types: ['character'], - makeDefault: true, - label: sheetLabel('TYPES.Actor.character') - }); - Actors.registerSheet(SYSTEM.id, applications.sheets.actors.Companion, { - types: ['companion'], - makeDefault: true, - label: sheetLabel('TYPES.Actor.companion') - }); - Actors.registerSheet(SYSTEM.id, applications.sheets.actors.Adversary, { - types: ['adversary'], - makeDefault: true, - label: sheetLabel('TYPES.Actor.adversary') - }); + Actors.registerSheet(SYSTEM.id, applications.sheets.actors.Character, { types: ['character'], makeDefault: true }); + Actors.registerSheet(SYSTEM.id, applications.sheets.actors.Companion, { types: ['companion'], makeDefault: true }); + Actors.registerSheet(SYSTEM.id, applications.sheets.actors.Adversary, { types: ['adversary'], makeDefault: true }); Actors.registerSheet(SYSTEM.id, applications.sheets.actors.Environment, { types: ['environment'], - makeDefault: true, - label: sheetLabel('TYPES.Actor.environment') + makeDefault: true }); Actors.registerSheet(SYSTEM.id, applications.sheets.actors.Party, { types: ['party'], - makeDefault: true, - label: sheetLabel('TYPES.Actor.party') + makeDefault: true }); DocumentSheetConfig.unregisterSheet( @@ -190,8 +129,7 @@ Hooks.once('init', () => { SYSTEM.id, applications.sheetConfigs.ActiveEffectConfig, { - makeDefault: true, - label: sheetLabel('DOCUMENT.ActiveEffect') + makeDefault: true } ); @@ -200,10 +138,9 @@ Hooks.once('init', () => { // Make Compendium Dialog resizable foundry.applications.sidebar.apps.Compendium.DEFAULT_OPTIONS.window.resizable = true; - DocumentSheetConfig.unregisterSheet(foundry.documents.Scene, 'core', foundry.applications.sheets.SceneConfig); DocumentSheetConfig.registerSheet(foundry.documents.Scene, SYSTEM.id, applications.scene.DhSceneConfigSettings, { makeDefault: true, - label: sheetLabel('DOCUMENT.Scene') + label: 'Daggerheart' }); settingsRegistration.registerDHSettings(); @@ -240,6 +177,7 @@ Hooks.on('ready', async () => { ui.compendiumBrowser = new applications.ui.ItemBrowser(); socketRegistration.registerSocketHooks(); + registerRollDiceHooks(); socketRegistration.registerUserQueries(); if (!game.user.getFlag(CONFIG.DH.id, CONFIG.DH.FLAGS.userFlags.welcomeMessage)) { @@ -255,9 +193,9 @@ Hooks.on('ready', async () => { Hooks.once('dicesoniceready', () => {}); -Hooks.on('renderChatMessageHTML', (document, element) => { +Hooks.on('renderChatMessageHTML', (_, element, message) => { enricherRenderSetup(element); - const cssClass = document.flags?.daggerheart?.cssClass; + const cssClass = message.message.flags?.daggerheart?.cssClass; if (cssClass) cssClass.split(' ').forEach(cls => element.classList.add(cls)); }); @@ -310,70 +248,51 @@ Hooks.on('chatMessage', (_, message) => { } }); -const updateActorsRangeDependentEffects = async token => { - const rangeMeasurement = game.settings.get( - CONFIG.DH.id, - CONFIG.DH.SETTINGS.gameSettings.variantRules - ).rangeMeasurement; - - for (let effect of token.actor?.allApplicableEffects() ?? []) { - if (!effect.system.rangeDependence?.enabled) continue; - const { target, range, type } = effect.system.rangeDependence; - - // If there are no targets, assume false. Otherwise, start with the effect enabled. - let enabledEffect = game.user.targets.size !== 0; - // Expect all targets to meet the rangeDependence requirements - for (let userTarget of game.user.targets) { - const disposition = userTarget.document.disposition; - if ((target === 'friendly' && disposition !== 1) || (target === 'hostile' && disposition !== -1)) { - enabledEffect = false; - break; - } - - // Get required distance and special case 5 feet to test adjacency - const required = rangeMeasurement[range]; - const reverse = type === CONFIG.DH.GENERAL.rangeInclusion.outsideRange.id; - const inRange = - required === 5 - ? userTarget.isAdjacentWith(token.object) - : userTarget.distanceTo(token.object) <= required; - if (reverse ? inRange : !inRange) { - enabledEffect = false; - break; - } - } - - await effect.update({ disabled: !enabledEffect }); - } -}; - -const updateAllRangeDependentEffects = async () => { +Hooks.on('moveToken', async (movedToken, data) => { const effectsAutomation = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).effects; if (!effectsAutomation.rangeDependent) return; - const tokens = canvas.scene.tokens; - if (game.user.character) { - // The character updates their character's token. There can be only one token. - const characterToken = tokens.find(x => x.actor === game.user.character); - updateActorsRangeDependentEffects(characterToken); - } else if (game.user.isActiveGM) { - // The GM is responsible for all other tokens. - const playerCharacters = game.users.players.filter(x => x.active).map(x => x.character); - for (const token of tokens.filter(x => !playerCharacters.includes(x.actor))) { - updateActorsRangeDependentEffects(token); + const rangeDependantEffects = movedToken.actor.effects.filter(effect => effect.system.rangeDependence?.enabled); + + const updateEffects = async (disposition, token, effects, effectUpdates) => { + const rangeMeasurement = game.settings.get( + CONFIG.DH.id, + CONFIG.DH.SETTINGS.gameSettings.variantRules + ).rangeMeasurement; + + for (let effect of effects.filter(x => x.system.rangeDependence?.enabled)) { + const { target, range, type } = effect.system.rangeDependence; + if ((target === 'friendly' && disposition !== 1) || (target === 'hostile' && disposition !== -1)) + return false; + + const distanceBetween = canvas.grid.measurePath([ + { ...movedToken.toObject(), x: data.destination.x, y: data.destination.y }, + token + ]).distance; + const distance = rangeMeasurement[range]; + + const reverse = type === CONFIG.DH.GENERAL.rangeInclusion.outsideRange.id; + const newDisabled = reverse ? distanceBetween <= distance : distanceBetween > distance; + const oldDisabled = effectUpdates[effect.uuid] ? effectUpdates[effect.uuid].disabled : newDisabled; + effectUpdates[effect.uuid] = { + disabled: oldDisabled || newDisabled, + value: effect + }; } + }; + + const effectUpdates = {}; + for (let token of game.scenes.find(x => x.active).tokens) { + if (token.id !== movedToken.id) { + await updateEffects(token.disposition, token, rangeDependantEffects, effectUpdates); + } + + if (token.actor) await updateEffects(movedToken.disposition, token, token.actor.effects, effectUpdates); } -}; -const debouncedRangeEffectCall = foundry.utils.debounce(updateAllRangeDependentEffects, 50); - -Hooks.on('targetToken', () => { - debouncedRangeEffectCall(); -}); - -Hooks.on('refreshToken', (_, options) => { - if (options.refreshPosition) { - debouncedRangeEffectCall(); + for (let key in effectUpdates) { + const effect = effectUpdates[key]; + await effect.value.update({ disabled: effect.disabled }); } }); diff --git a/lang/en.json b/lang/en.json index a78ed588..d2386744 100755 --- a/lang/en.json +++ b/lang/en.json @@ -36,7 +36,6 @@ }, "DAGGERHEART": { - "CharacterSheet": "Character Sheet", "ACTIONS": { "TYPES": { "attack": { @@ -226,7 +225,6 @@ "confirmText": "Would you like to level up your companion {name} by {levelChange} levels at this time? (You can do it manually later)" }, "viewLevelups": "View Levelups", - "viewParty": "View Party", "InvalidOldCharacterImportTitle": "Old Character Import", "InvalidOldCharacterImportText": "Character data exported prior to system version 1.1 will not generate a complete character. Do you wish to continue?", "cancelBeastform": "Cancel Beastform" @@ -327,7 +325,6 @@ "equip": "Equip", "sendToChat": "Send To Chat", "toLoadout": "Send to Loadout", - "recall": "Recall", "toVault": "Send to Vault", "unequip": "Unequip", "useItem": "Use Item" @@ -588,7 +585,6 @@ }, "OwnershipSelection": { "title": "Ownership Selection - {name}", - "noPlayers": "No players to assign ownership to", "default": "Default Ownership" }, "ReactionRoll": { @@ -615,9 +611,6 @@ "insufficientHope": "The initiating character doesn't have enough hope", "createTagTeam": "Create TagTeam Roll", "chatMessageRollTitle": "Roll" - }, - "TokenConfig": { - "actorSizeUsed": "Actor size is set, determining the dimensions" } }, "CLASS": { @@ -627,6 +620,11 @@ } }, "CONFIG": { + "ActionType": { + "passive": "Passive", + "action": "Action", + "reaction": "Reaction" + }, "AdversaryTrait": { "relentless": { "name": "Relentless", @@ -1035,12 +1033,6 @@ "description": "" } }, - "FeatureForm": { - "label": "Feature Form", - "passive": "Passive", - "action": "Action", - "reaction": "Reaction" - }, "Gold": { "title": "Gold", "coins": "Coins", @@ -1154,14 +1146,6 @@ "rect": "Rectangle", "ray": "Ray" }, - "TokenSize": { - "tiny": "Tiny", - "small": "Small", - "medium": "Medium", - "large": "Large", - "huge": "Huge", - "gargantuan": "Gargantuan" - }, "Traits": { "agility": { "name": "Agility", @@ -1802,9 +1786,7 @@ "label": "Long Rest: Bonus Long Rest Moves", "hint": "The number of extra Long Rest Moves the character can take during a Long Rest." } - }, - "target": "Target", - "targetSelf": "Self" + } }, "maxLoadout": { "label": "Max Loadout Cards Bonus" @@ -1819,7 +1801,6 @@ "plural": "Costs" }, "Damage": { - "massive": "Massive", "severe": "Severe", "major": "Major", "minor": "Minor", @@ -2112,7 +2093,6 @@ "fear": "Fear", "features": "Features", "formula": "Formula", - "general": "General", "gm": "GM", "healing": "Healing", "healingRoll": "Healing Roll", @@ -2185,12 +2165,10 @@ "plural": "Targets" }, "title": "Title", - "tokenSize": "Token Size", "total": "Total", "traitModifier": "Trait Modifier", "true": "True", "type": "Type", - "typeSheet": "System {type} Sheet", "unarmed": "Unarmed", "unarmedAttack": "Unarmed Attack", "unarmored": "Unarmored", @@ -2243,7 +2221,6 @@ "tokenRingImg": { "label": "Subject Texture" }, "tokenSize": { "placeholder": "Using character dimensions", - "disabledPlaceholder": "Set by character size", "height": { "label": "Height" }, "width": { "label": "Width" } }, @@ -2269,9 +2246,7 @@ "hybridizeFeatureTitle": "Hybrid Features", "hybridizeDrag": "Drag a form here to hybridize it.", "mainTrait": "Main Trait", - "traitBonus": "Trait Bonus", - "evolvedTokenHint": "An evolved beastform's token is based on that of the form you evolve", - "evolvedImagePlaceholder": "The image for the form selected for evolution will be used" + "traitBonus": "Trait Bonus" }, "Class": { "hopeFeatures": "Hope Features", @@ -2465,12 +2440,9 @@ }, "currency": { "title": "Currency Overrides", - "changeIcon": "Change Currency Icon", "currencyName": "Currency Name", "coinName": "Coin Name", "handfulName": "Handful Name", - "iconName": "Icon Name", - "iconNameHint": "Icons are from fontawesome", "bagName": "Bag Name", "chestName": "Chest Name" }, @@ -2532,11 +2504,6 @@ "hint": "Apply variant rules from the Daggerheart system", "name": "Variant Rules", "actionTokens": "Action Tokens" - }, - "SpotlightRequestQueue": { - "name": "Spotlight Request Queue", - "label": "Spotlight Request Queue", - "hint": "Adds more structure to spotlight requests by ordering them from oldest to newest" } }, "Resources": { @@ -2550,10 +2517,6 @@ "actionTokens": { "enabled": { "label": "Enabled" }, "tokens": { "label": "Tokens" } - }, - "massiveDamage": { - "title": "Massive Damage", - "enabled": { "label": "Enabled" } } } }, @@ -2781,9 +2744,7 @@ "gmRequired": "This action requires an online GM", "gmOnly": "This can only be accessed by the GM", "noActorOwnership": "You do not have permissions for this character", - "documentIsMissing": "The {documentType} is missing from the world.", - "tokenActorMissing": "{name} is missing an Actor", - "tokenActorsMissing": "[{names}] missing Actors" + "documentIsMissing": "The {documentType} is missing from the world." }, "Sidebar": { "actorDirectory": { @@ -2826,9 +2787,7 @@ "companionPartnerLevelBlock": "The companion needs an assigned partner to level up.", "configureAttribution": "Configure Attribution", "deleteItem": "Delete Item", - "immune": "Immune", - "middleClick": "[Middle Click] Keep tooltip view", - "tokenSize": "The token size used on the canvas" + "immune": "Immune" } } } diff --git a/module/applications/dialogs/beastformDialog.mjs b/module/applications/dialogs/beastformDialog.mjs index 09a9222b..3dd88d6c 100644 --- a/module/applications/dialogs/beastformDialog.mjs +++ b/module/applications/dialogs/beastformDialog.mjs @@ -278,26 +278,19 @@ export default class BeastformDialog extends HandlebarsApplicationMixin(Applicat 'close', async () => { const selected = app.selected.toObject(); - const evolved = app.evolved.form ? app.evolved.form.toObject() : null; const data = await game.system.api.data.items.DHBeastform.getWildcardImage( app.configData.data.parent, - evolved ?? app.selected + app.selected ); if (data) { if (!data.selectedImage) selected = null; else { - const imageSource = evolved ?? selected; - if (imageSource.usesDynamicToken) imageSource.system.tokenRingImg = data.selectedImage; - else imageSource.system.tokenImg = data.selectedImage; + if (data.usesDynamicToken) selected.system.tokenRingImg = data.selectedImage; + else selected.system.tokenImg = data.selectedImage; } } - resolve({ - selected: selected, - evolved: { ...app.evolved, form: evolved }, - hybrid: app.hybrid, - item: featureItem - }); + resolve({ selected: selected, evolved: app.evolved, hybrid: app.hybrid, item: featureItem }); }, { once: true } ); diff --git a/module/applications/dialogs/d20RollDialog.mjs b/module/applications/dialogs/d20RollDialog.mjs index 34ca02cd..b28a3ffb 100644 --- a/module/applications/dialogs/d20RollDialog.mjs +++ b/module/applications/dialogs/d20RollDialog.mjs @@ -104,7 +104,7 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio context.roll = this.roll; context.rollType = this.roll?.constructor.name; context.rallyDie = this.roll.rallyChoices; - const experiences = this.config.data?.system?.experiences || {}; + const experiences = this.config.data?.experiences || {}; context.experiences = Object.keys(experiences).map(id => ({ id, ...experiences[id] @@ -185,7 +185,7 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio extKey: button.dataset.key, key: this.config?.data?.parent?.isNPC ? 'fear' : 'hope', value: 1, - name: this.config.data?.system.experiences?.[button.dataset.key]?.name + name: this.config.data?.experiences?.[button.dataset.key]?.name } ]; this.render(); @@ -195,9 +195,9 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio if (this.config.roll) { this.reactionOverride = !this.reactionOverride; this.config.actionType = this.reactionOverride - ? 'reaction' - : this.config.actionType === 'reaction' - ? 'action' + ? CONFIG.DH.ITEM.actionTypes.reaction.id + : this.config.actionType === CONFIG.DH.ITEM.actionTypes.reaction.id + ? CONFIG.DH.ITEM.actionTypes.action.id : this.config.actionType; this.render(); } diff --git a/module/applications/dialogs/downtime.mjs b/module/applications/dialogs/downtime.mjs index f03524f0..96e06446 100644 --- a/module/applications/dialogs/downtime.mjs +++ b/module/applications/dialogs/downtime.mjs @@ -93,7 +93,7 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV } getRefreshables() { - const actionItems = this.actor.items.filter(x => this.actor.system.isItemAvailable(x)).reduce((acc, x) => { + const actionItems = this.actor.items.reduce((acc, x) => { if (x.system.actions) { const recoverable = x.system.actions.reduce((acc, action) => { if (refreshIsAllowed([this.shortrest ? 'shortRest' : 'longRest'], action.uses.recovery)) { @@ -181,17 +181,12 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV .filter(x => category.moves[x].selected) .flatMap(key => { const move = category.moves[key]; - const needsTarget = move.actions.filter(x => x.target?.type && x.target.type !== 'self').length > 0; return [...Array(move.selected).keys()].map(_ => ({ ...move, - movePath: `${categoryKey}.moves.${key}`, - needsTarget: needsTarget + movePath: `${categoryKey}.moves.${key}` })); }); }); - const characters = game.actors.filter(x => x.type === 'character') - .filter(x => x.testUserPermission(game.user, 'LIMITED')) - .filter(x => x.uuid !== this.actor.uuid); const cls = getDocumentClass('ChatMessage'); const msg = { @@ -211,9 +206,7 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV `DAGGERHEART.APPLICATIONS.Downtime.${this.shortrest ? 'shortRest' : 'longRest'}.title` ), actor: { name: this.actor.name, img: this.actor.img }, - moves: moves, - characters: characters, - selfId: this.actor.uuid + moves: moves } ), flags: { diff --git a/module/applications/dialogs/itemTransfer.mjs b/module/applications/dialogs/itemTransfer.mjs index ad3cf103..aba43d27 100644 --- a/module/applications/dialogs/itemTransfer.mjs +++ b/module/applications/dialogs/itemTransfer.mjs @@ -1,61 +1,69 @@ const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; export default class ItemTransferDialog extends HandlebarsApplicationMixin(ApplicationV2) { - constructor(data) { + constructor(item) { super({}); - this.data = data; + + this.item = item; + this.quantity = item.system.quantity; } get title() { - return this.data.title; + return this.item.name; } static DEFAULT_OPTIONS = { tag: 'form', classes: ['daggerheart', 'dh-style', 'dialog', 'item-transfer'], - position: { width: 400, height: 'auto' }, + position: { width: 300, height: 'auto' }, window: { icon: 'fa-solid fa-hand-holding-hand' }, actions: { finish: ItemTransferDialog.#finish - } + }, + form: { handler: this.updateData, submitOnChange: true, closeOnSubmit: false } }; static PARTS = { - main: { template: 'systems/daggerheart/templates/dialogs/item-transfer.hbs', root: true } + main: { template: 'systems/daggerheart/templates/dialogs/item-transfer.hbs' } }; + _attachPartListeners(partId, htmlElement, options) { + super._attachPartListeners(partId, htmlElement, options); + + htmlElement.querySelector('.number-display').addEventListener('change', event => { + this.quantity = isNaN(event.target.value) ? this.quantity : Number(event.target.value); + this.render(); + }); + } + async _prepareContext(_options) { const context = await super._prepareContext(_options); - return foundry.utils.mergeObject(context, this.data); + context.item = this.item; + context.quantity = this.quantity; + + return context; + } + + static async updateData(_event, _element, formData) { + const { quantity } = foundry.utils.expandObject(formData.object); + this.quantity = quantity; + this.render(); } static async #finish() { - this.selected = this.form.elements.quantity.valueAsNumber || null; - this.close(); + this.close({ submitted: true }); } - static #determineTransferOptions({ originActor, targetActor, item, currency }) { - originActor ??= item?.actor; - const homebrewKey = CONFIG.DH.SETTINGS.gameSettings.Homebrew; - const currencySetting = game.settings.get(CONFIG.DH.id, homebrewKey).currency?.[currency] ?? null; + close(options = {}) { + if (!options.submitted) this.quantity = null; - return { - originActor, - targetActor, - itemImage: item?.img, - currencyIcon: currencySetting?.icon, - max: item?.system.quantity ?? originActor.system.gold[currency] ?? 0, - title: item?.name ?? currencySetting?.label - }; + super.close(); } - static async configure(options) { + static async configure(item) { return new Promise(resolve => { - const data = this.#determineTransferOptions(options); - if (data.max <= 1) return resolve(data.max); - - const app = new this(data); - app.addEventListener('close', () => resolve(app.selected), { once: true }); + const app = new this(item); + app.addEventListener('close', () => resolve(app.quantity), { once: true }); app.render({ force: true }); }); } diff --git a/module/applications/dialogs/ownershipSelection.mjs b/module/applications/dialogs/ownershipSelection.mjs index 64173221..049f4d99 100644 --- a/module/applications/dialogs/ownershipSelection.mjs +++ b/module/applications/dialogs/ownershipSelection.mjs @@ -38,6 +38,7 @@ export default class OwnershipSelection extends HandlebarsApplicationMixin(Appli async _prepareContext(_options) { const context = await super._prepareContext(_options); + context.ownershipDefaultOptions = CONFIG.DH.GENERAL.basicOwnershiplevels; context.ownershipOptions = CONFIG.DH.GENERAL.simpleOwnershiplevels; context.defaultOwnership = this.defaultOwnership; context.ownership = game.users.reduce((acc, user) => { @@ -51,7 +52,6 @@ export default class OwnershipSelection extends HandlebarsApplicationMixin(Appli return acc; }, {}); - context.showOwnership = Boolean(Object.keys(context.ownership).length); return context; } diff --git a/module/applications/dialogs/tagTeamDialog.mjs b/module/applications/dialogs/tagTeamDialog.mjs index d1a1e123..b53d03ab 100644 --- a/module/applications/dialogs/tagTeamDialog.mjs +++ b/module/applications/dialogs/tagTeamDialog.mjs @@ -77,7 +77,7 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio cost: this.data.initiator.cost }; - const selectedMember = Object.values(context.members).find(x => x.selected && x.roll); + const selectedMember = Object.values(context.members).find(x => x.selected); const selectedIsCritical = selectedMember?.roll?.system?.isCritical; context.selectedData = { result: selectedMember @@ -220,8 +220,8 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio !roll.system.isCritical && criticalRoll ? (await getCritDamageBonus(damage.formula)) + damage.total : damage.total; - const updatedDamageParts = damage.parts; if (systemData.damage[key]) { + const updatedDamageParts = damage.parts; if (!roll.system.isCritical && criticalRoll) { for (let part of updatedDamageParts) { const criticalDamage = await getCritDamageBonus(part.formula); diff --git a/module/applications/hud/tokenHUD.mjs b/module/applications/hud/tokenHUD.mjs index 87c3e88e..f90c26be 100644 --- a/module/applications/hud/tokenHUD.mjs +++ b/module/applications/hud/tokenHUD.mjs @@ -21,8 +21,6 @@ export default class DHTokenHUD extends foundry.applications.hud.TokenHUD { async _prepareContext(options) { const context = await super._prepareContext(options); - if (!this.actor) return context; - context.partyOnCanvas = this.actor.type === 'party' && this.actor.system.partyMembers.some(member => member.getActiveTokens().length > 0); @@ -60,33 +58,14 @@ export default class DHTokenHUD extends foundry.applications.hud.TokenHUD { } static async #onToggleCombat() { - const tokensWithoutActors = canvas.tokens.controlled.filter(t => !t.actor); - const warning = - tokensWithoutActors.length === 1 - ? game.i18n.format('DAGGERHEART.UI.Notifications.tokenActorMissing', { - name: tokensWithoutActors[0].name - }) - : game.i18n.format('DAGGERHEART.UI.Notifications.tokenActorsMissing', { - names: tokensWithoutActors.map(x => x.name).join(', ') - }); - const tokens = canvas.tokens.controlled - .filter(t => t.actor && !DHTokenHUD.#nonCombatTypes.includes(t.actor.type)) + .filter(t => !t.actor || !DHTokenHUD.#nonCombatTypes.includes(t.actor.type)) .map(t => t.document); - if (!this.object.controlled && this.document.actor) tokens.push(this.document); + if (!this.object.controlled) tokens.push(this.document); try { - if (this.document.inCombat) { - const tokensInCombat = tokens.filter(t => t.inCombat); - await TokenDocument.implementation.deleteCombatants([...tokensInCombat, ...tokensWithoutActors]); - } else { - if (tokensWithoutActors.length) { - ui.notifications.warn(warning); - } - - const tokensOutOfCombat = tokens.filter(t => !t.inCombat); - await TokenDocument.implementation.createCombatants(tokensOutOfCombat); - } + if (this.document.inCombat) await TokenDocument.implementation.deleteCombatants(tokens); + else await TokenDocument.implementation.createCombatants(tokens); } catch (err) { ui.notifications.warn(err.message); } @@ -218,8 +197,6 @@ export default class DHTokenHUD extends foundry.applications.hud.TokenHUD { for (const effect of activeEffects) { for (const statusId of effect.statuses) { const status = choices[statusId]; - if (!status) continue; - status.instances = 1 + (status.instances ?? 0); status.locked = status.locked || effect.condition || status.instances > 1; if (!status) continue; diff --git a/module/applications/levelup/characterLevelup.mjs b/module/applications/levelup/characterLevelup.mjs index f7ef2ffa..623f0308 100644 --- a/module/applications/levelup/characterLevelup.mjs +++ b/module/applications/levelup/characterLevelup.mjs @@ -280,19 +280,11 @@ export default class DhCharacterLevelUp extends LevelUpBase { break; case 'experience': if (!advancement[choiceKey]) advancement[choiceKey] = []; - const allExperiences = { - ...this.actor.system.experiences, - ...Object.values(this.levelup.levels).reduce((acc, level) => { - for (const key of Object.keys(level.achievements.experiences)) { - acc[key] = level.achievements.experiences[key]; - } - - return acc; - }, {}) - }; const data = checkbox.data.map(data => { - const experience = Object.keys(allExperiences).find(x => x === data); - return allExperiences[experience]?.name ?? ''; + const experience = Object.keys(this.actor.system.experiences).find( + x => x === data + ); + return this.actor.system.experiences[experience]?.name ?? ''; }); advancement[choiceKey].push({ data: data, value: checkbox.value }); break; diff --git a/module/applications/levelup/levelup.mjs b/module/applications/levelup/levelup.mjs index ba6110cc..c3cc6e81 100644 --- a/module/applications/levelup/levelup.mjs +++ b/module/applications/levelup/levelup.mjs @@ -357,23 +357,11 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2) const experienceIncreaseTagify = htmlElement.querySelector('.levelup-experience-increases'); if (experienceIncreaseTagify) { - const allExperiences = { - ...this.actor.system.experiences, - ...Object.values(this.levelup.levels).reduce((acc, level) => { - for (const key of Object.keys(level.achievements.experiences)) { - acc[key] = level.achievements.experiences[key]; - } - - return acc; - }, {}) - }; tagifyElement( experienceIncreaseTagify, - Object.keys(allExperiences).reduce((acc, id) => { - const experience = allExperiences[id]; - if (experience.name) { - acc.push({ id: id, label: experience.name }); - } + Object.keys(this.actor.system.experiences).reduce((acc, id) => { + const experience = this.actor.system.experiences[id]; + acc.push({ id: id, label: experience.name }); return acc; }, []), diff --git a/module/applications/settings/homebrewSettings.mjs b/module/applications/settings/homebrewSettings.mjs index 3c4486c1..8e566106 100644 --- a/module/applications/settings/homebrewSettings.mjs +++ b/module/applications/settings/homebrewSettings.mjs @@ -32,7 +32,6 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli icon: 'fa-solid fa-gears' }, actions: { - editCurrencyIcon: this.changeCurrencyIcon, addItem: this.addItem, editItem: this.editItem, removeItem: this.removeItem, @@ -44,7 +43,6 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli deleteAdversaryType: this.deleteAdversaryType, selectAdversaryType: this.selectAdversaryType, save: this.save, - resetTokenSizes: this.resetTokenSizes, reset: this.reset }, form: { handler: this.updateData, submitOnChange: true } @@ -117,45 +115,6 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli this.render(); } - static async changeCurrencyIcon(_, target) { - const type = target.dataset.currency; - const currentIcon = this.settings.currency[type].icon; - const icon = await foundry.applications.api.DialogV2.input({ - classes: ['daggerheart', 'dh-style', 'change-currency-icon'], - content: await foundry.applications.handlebars.renderTemplate( - 'systems/daggerheart/templates/settings/homebrew-settings/change-currency-icon.hbs', - { currentIcon } - ), - window: { - title: game.i18n.localize('DAGGERHEART.SETTINGS.Homebrew.currency.changeIcon'), - icon: 'fa-solid fa-coins' - }, - render: (_, dialog) => { - const icon = dialog.element.querySelector('.displayed-icon i'); - const input = dialog.element.querySelector('input'); - const reset = dialog.element.querySelector('button[data-action=reset]'); - input.addEventListener('input', () => { - icon.classList.value = input.value; - }); - reset.addEventListener('click', () => { - const currencyField = DhHomebrew.schema.fields.currency.fields[type]; - const initial = currencyField.fields.icon.getInitialValue(); - input.value = icon.classList.value = initial; - }); - }, - ok: { - callback: (_, button) => button.form.elements.icon.value - } - }); - - if (icon !== null) { - await this.settings.updateSource({ - [`currency.${type}.icon`]: icon - }); - this.render(); - } - } - static async addItem(_, target) { const { type } = target.dataset; if (['shortRest', 'longRest'].includes(type)) { @@ -425,14 +384,6 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli this.close(); } - static async resetTokenSizes() { - await this.settings.updateSource({ - tokenSizes: this.settings.schema.fields.tokenSizes.initial - }); - - this.render(); - } - static async reset() { const confirmed = await foundry.applications.api.DialogV2.confirm({ window: { diff --git a/module/applications/sheets-configs/action-base-config.mjs b/module/applications/sheets-configs/action-base-config.mjs index 96790a5b..70252642 100644 --- a/module/applications/sheets-configs/action-base-config.mjs +++ b/module/applications/sheets-configs/action-base-config.mjs @@ -98,7 +98,7 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2) async _prepareContext(_options) { const context = await super._prepareContext(_options, 'action'); - context.source = this.action.toObject(true); + context.source = this.action.toObject(false); context.openSection = this.openSection; context.tabs = this._getTabs(this.constructor.TABS); context.config = CONFIG.DH; diff --git a/module/applications/sheets-configs/activeEffectConfig.mjs b/module/applications/sheets-configs/activeEffectConfig.mjs index d7b1b536..468aba5c 100644 --- a/module/applications/sheets-configs/activeEffectConfig.mjs +++ b/module/applications/sheets-configs/activeEffectConfig.mjs @@ -9,9 +9,6 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac if (!ignoredActorKeys.includes(key)) { const model = game.system.api.models.actors[key]; const attributes = CONFIG.Token.documentClass.getTrackedAttributes(model); - // As per DHToken._getTrackedAttributesFromSchema, attributes.bar have a max version as well. - const maxAttributes = attributes.bar.map(x => [...x, 'max']); - attributes.value.push(...maxAttributes); const group = game.i18n.localize(model.metadata.label); const choices = CONFIG.Token.documentClass .getTrackedAttributeChoices(attributes, model) diff --git a/module/applications/sheets-configs/adversary-settings.mjs b/module/applications/sheets-configs/adversary-settings.mjs index d3d215be..bcc8b1c9 100644 --- a/module/applications/sheets-configs/adversary-settings.mjs +++ b/module/applications/sheets-configs/adversary-settings.mjs @@ -51,19 +51,6 @@ export default class DHAdversarySettings extends DHBaseActorSettings { } }; - async _prepareContext(options) { - const context = await super._prepareContext(options); - - const featureForms = ['passive', 'action', 'reaction']; - context.features = context.document.system.features.sort((a, b) => - a.system.featureForm !== b.system.featureForm - ? featureForms.indexOf(a.system.featureForm) - featureForms.indexOf(b.system.featureForm) - : a.sort - b.sort - ); - - return context; - } - /* -------------------------------------------- */ /** @@ -111,16 +98,16 @@ export default class DHAdversarySettings extends DHBaseActorSettings { async _onDrop(event) { const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event); - + const item = await fromUuid(data.uuid); if (item?.type === 'feature') { if (data.fromInternal && item.parent?.uuid === this.actor.uuid) { return; } - + const itemData = item.toObject(); delete itemData._id; - + await this.actor.createEmbeddedDocuments('Item', [itemData]); } } diff --git a/module/applications/sheets-configs/environment-settings.mjs b/module/applications/sheets-configs/environment-settings.mjs index 15f5701d..2efa3b38 100644 --- a/module/applications/sheets-configs/environment-settings.mjs +++ b/module/applications/sheets-configs/environment-settings.mjs @@ -49,19 +49,6 @@ export default class DHEnvironmentSettings extends DHBaseActorSettings { } }; - async _prepareContext(options) { - const context = await super._prepareContext(options); - - const featureForms = ['passive', 'action', 'reaction']; - context.features = context.document.system.features.sort((a, b) => - a.system.featureForm !== b.system.featureForm - ? featureForms.indexOf(a.system.featureForm) - featureForms.indexOf(b.system.featureForm) - : a.sort - b.sort - ); - - return context; - } - /** * Adds a new category entry to the actor. * @type {ApplicationClickAction} diff --git a/module/applications/sheets-configs/prototype-token-config.mjs b/module/applications/sheets-configs/prototype-token-config.mjs index 9faf6e71..24c9dabb 100644 --- a/module/applications/sheets-configs/prototype-token-config.mjs +++ b/module/applications/sheets-configs/prototype-token-config.mjs @@ -1,30 +1,20 @@ -import DHTokenConfigMixin from './token-config-mixin.mjs'; -import { getActorSizeFromForm } from './token-config-mixin.mjs'; - -export default class DhPrototypeTokenConfig extends DHTokenConfigMixin( - foundry.applications.sheets.PrototypeTokenConfig -) { +export default class DhPrototypeTokenConfig extends foundry.applications.sheets.PrototypeTokenConfig { /** @inheritDoc */ - static DEFAULT_OPTIONS = { - ...super.DEFAULT_OPTIONS, - form: { handler: DhPrototypeTokenConfig.#onSubmit } - }; - - /** - * Process form submission for the sheet - * @this {PrototypeTokenConfig} - * @type {ApplicationFormSubmission} - */ - static async #onSubmit(event, form, formData) { - const submitData = this._processFormData(event, form, formData); - submitData.detectionModes ??= []; // Clear detection modes array - this._processChanges(submitData); - const changes = { prototypeToken: submitData }; - - const changedTokenSizeValue = getActorSizeFromForm(this.element, this.actor); - if (changedTokenSizeValue) changes.system = { size: changedTokenSizeValue }; - - this.actor.validate({ changes, clean: true, fallback: false }); - await this.actor.update(changes); + async _prepareResourcesTab() { + const token = this.token; + const usesTrackableAttributes = !foundry.utils.isEmpty(CONFIG.Actor.trackableAttributes); + const attributeSource = + this.actor?.system instanceof foundry.abstract.DataModel && usesTrackableAttributes + ? this.actor?.type + : this.actor?.system; + const TokenDocument = foundry.utils.getDocumentClass('Token'); + const attributes = TokenDocument.getTrackedAttributes(attributeSource); + return { + barAttributes: TokenDocument.getTrackedAttributeChoices(attributes, attributeSource), + bar1: token.getBarAttribute?.('bar1'), + bar2: token.getBarAttribute?.('bar2'), + turnMarkerModes: DhPrototypeTokenConfig.TURN_MARKER_MODES, + turnMarkerAnimations: CONFIG.Combat.settings.turnMarkerAnimations + }; } } diff --git a/module/applications/sheets-configs/token-config-mixin.mjs b/module/applications/sheets-configs/token-config-mixin.mjs deleted file mode 100644 index c29b54ff..00000000 --- a/module/applications/sheets-configs/token-config-mixin.mjs +++ /dev/null @@ -1,114 +0,0 @@ -export default function DHTokenConfigMixin(Base) { - class DHTokenConfigBase extends Base { - /** @override */ - static PARTS = { - tabs: super.PARTS.tabs, - identity: super.PARTS.identity, - appearance: { - template: 'systems/daggerheart/templates/sheets-settings/token-config/appearance.hbs', - scrollable: [''] - }, - vision: super.PARTS.vision, - light: super.PARTS.light, - resources: super.PARTS.resources, - footer: super.PARTS.footer - }; - - _attachPartListeners(partId, htmlElement, options) { - super._attachPartListeners(partId, htmlElement, options); - - switch (partId) { - case 'appearance': - htmlElement - .querySelector('#dhTokenSize') - ?.addEventListener('change', this.onTokenSizeChange.bind(this)); - break; - } - } - - /** @inheritDoc */ - async _prepareResourcesTab() { - const token = this.token; - const usesTrackableAttributes = !foundry.utils.isEmpty(CONFIG.Actor.trackableAttributes); - const attributeSource = - this.actor?.system instanceof foundry.abstract.DataModel && usesTrackableAttributes - ? this.actor?.type - : this.actor?.system; - const TokenDocument = foundry.utils.getDocumentClass('Token'); - const attributes = TokenDocument.getTrackedAttributes(attributeSource); - return { - barAttributes: TokenDocument.getTrackedAttributeChoices(attributes, attributeSource), - bar1: token.getBarAttribute?.('bar1'), - bar2: token.getBarAttribute?.('bar2'), - turnMarkerModes: DHTokenConfigBase.TURN_MARKER_MODES, - turnMarkerAnimations: CONFIG.Combat.settings.turnMarkerAnimations - }; - } - - async _prepareAppearanceTab() { - const context = await super._prepareAppearanceTab(); - context.tokenSizes = CONFIG.DH.ACTOR.tokenSize; - context.tokenSize = this.actor?.system?.size; - context.usesActorSize = this.actor?.system?.metadata?.usesSize; - context.actorSizeDisable = context.usesActorSize && this.actor.system.size !== 'custom'; - - return context; - } - - /** @inheritDoc */ - _previewChanges(changes) { - if (!changes || !this._preview) return; - - const tokenSizeSelect = this.element?.querySelector('#dhTokenSize'); - if (this.actor && tokenSizeSelect && tokenSizeSelect.value !== 'custom') { - const tokenSizes = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).tokenSizes; - const tokenSize = tokenSizes[tokenSizeSelect.value]; - changes.width = tokenSize; - changes.height = tokenSize; - } - - const deletions = { '-=actorId': null, '-=actorLink': null }; - const mergeOptions = { inplace: false, performDeletions: true }; - this._preview.updateSource(mergeObject(changes, deletions, mergeOptions)); - - if (this._preview?.object?.destroyed === false) { - this._preview.object.initializeSources(); - this._preview.object.renderFlags.set({ refresh: true }); - } - } - - async onTokenSizeChange(event) { - const value = event.target.value; - const tokenSizeDimensions = this.element.querySelector('#tokenSizeDimensions'); - if (tokenSizeDimensions) { - const disabled = value !== 'custom'; - - tokenSizeDimensions.dataset.tooltip = disabled - ? game.i18n.localize('DAGGERHEART.APPLICATIONS.TokenConfig.actorSizeUsed') - : ''; - - const disabledIcon = tokenSizeDimensions.querySelector('i'); - if (disabledIcon) { - disabledIcon.style.opacity = disabled ? '' : '0'; - } - - const dimensionsInputs = tokenSizeDimensions.querySelectorAll('.form-fields input'); - for (const input of dimensionsInputs) { - input.disabled = disabled; - } - } - } - } - - return DHTokenConfigBase; -} - -export function getActorSizeFromForm(element, actor) { - const tokenSizeSelect = element.querySelector('#dhTokenSize'); - const isSizeDifferent = tokenSizeSelect?.value !== actor?.system?.size; - if (tokenSizeSelect && actor && isSizeDifferent) { - return tokenSizeSelect.value; - } - - return null; -} diff --git a/module/applications/sheets-configs/token-config.mjs b/module/applications/sheets-configs/token-config.mjs index d7450bd6..ee573e5d 100644 --- a/module/applications/sheets-configs/token-config.mjs +++ b/module/applications/sheets-configs/token-config.mjs @@ -1,11 +1,20 @@ -import DHTokenConfigMixin from './token-config-mixin.mjs'; -import { getActorSizeFromForm } from './token-config-mixin.mjs'; - -export default class DhTokenConfig extends DHTokenConfigMixin(foundry.applications.sheets.TokenConfig) { - async _processSubmitData(event, form, submitData, options) { - const changedTokenSizeValue = getActorSizeFromForm(this.element, this.actor); - if (changedTokenSizeValue) this.token.actor.update({ 'system.size': changedTokenSizeValue }); - - super._processSubmitData(event, form, submitData, options); +export default class DhTokenConfig extends foundry.applications.sheets.TokenConfig { + /** @inheritDoc */ + async _prepareResourcesTab() { + const token = this.token; + const usesTrackableAttributes = !foundry.utils.isEmpty(CONFIG.Actor.trackableAttributes); + const attributeSource = + this.actor?.system instanceof foundry.abstract.DataModel && usesTrackableAttributes + ? this.actor?.type + : this.actor?.system; + const TokenDocument = foundry.utils.getDocumentClass('Token'); + const attributes = TokenDocument.getTrackedAttributes(attributeSource); + return { + barAttributes: TokenDocument.getTrackedAttributeChoices(attributes, attributeSource), + bar1: token.getBarAttribute?.('bar1'), + bar2: token.getBarAttribute?.('bar2'), + turnMarkerModes: DhTokenConfig.TURN_MARKER_MODES, + turnMarkerAnimations: CONFIG.Combat.settings.turnMarkerAnimations + }; } } diff --git a/module/applications/sheets/actors/adversary.mjs b/module/applications/sheets/actors/adversary.mjs index 98282d9f..6b6354ef 100644 --- a/module/applications/sheets/actors/adversary.mjs +++ b/module/applications/sheets/actors/adversary.mjs @@ -26,12 +26,7 @@ export default class AdversarySheet extends DHBaseActorSheet { } ] }, - dragDrop: [ - { - dragSelector: '[data-item-id][draggable="true"], [data-item-id] [draggable="true"]', - dropSelector: null - } - ], + dragDrop: [{ dragSelector: '[data-item-id][draggable="true"]', dropSelector: null }] }; static PARTS = { @@ -93,13 +88,6 @@ export default class AdversarySheet extends DHBaseActorSheet { context.resources.stress.emptyPips = context.resources.stress.max < maxResource ? maxResource - context.resources.stress.max : 0; - const featureForms = ['passive', 'action', 'reaction']; - context.features = this.document.system.features.sort((a, b) => - a.system.featureForm !== b.system.featureForm - ? featureForms.indexOf(a.system.featureForm) - featureForms.indexOf(b.system.featureForm) - : a.sort - b.sort - ); - return context; } @@ -176,16 +164,6 @@ export default class AdversarySheet extends DHBaseActorSheet { }); } - /** @inheritdoc */ - async _onDragStart(event) { - const inventoryItem = event.currentTarget.closest('.inventory-item'); - if (inventoryItem) { - event.dataTransfer.setDragImage(inventoryItem.querySelector('img'), 60, 0); - } - super._onDragStart(event); - } - - /* -------------------------------------------- */ /* Application Clicks Actions */ /* -------------------------------------------- */ diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index 594269be..016cff13 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -32,8 +32,7 @@ export default class CharacterSheet extends DHBaseActorSheet { handleResourceDice: CharacterSheet.#handleResourceDice, advanceResourceDie: CharacterSheet.#advanceResourceDie, cancelBeastform: CharacterSheet.#cancelBeastform, - useDowntime: this.useDowntime, - viewParty: CharacterSheet.#viewParty, + useDowntime: this.useDowntime }, window: { resizable: true, @@ -47,7 +46,7 @@ export default class CharacterSheet extends DHBaseActorSheet { }, dragDrop: [ { - dragSelector: '[data-item-id][draggable="true"], [data-item-id] [draggable="true"]', + dragSelector: '[data-item-id][draggable="true"]', dropSelector: null } ], @@ -319,40 +318,6 @@ export default class CharacterSheet extends DHBaseActorSheet { ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.loadoutMaxReached')); } }, - { - name: 'recall', - icon: 'fa-solid fa-bolt-lightning', - condition: target => { - const doc = getDocFromElementSync(target); - return doc && doc.system.inVault; - }, - callback: async (target, event) => { - const doc = await getDocFromElement(target); - const actorLoadout = doc.actor.system.loadoutSlot; - if (!actorLoadout.available) { - ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.loadoutMaxReached')); - return; - } - if (doc.system.recallCost == 0) { - return doc.update({ 'system.inVault': false }); - } - const type = 'effect'; - const cls = game.system.api.models.actions.actionsTypes[type]; - const action = new cls({ - ...cls.getSourceConfig(doc.system), - type: type, - chatDisplay: false, - cost: [{ - key: 'stress', - value: doc.system.recallCost - }] - }, { parent: doc.system }); - const config = await action.use(event); - if (config) { - return doc.update({ 'system.inVault': false }); - } - } - }, { name: 'toVault', icon: 'fa-solid fa-arrow-down', @@ -710,21 +675,18 @@ export default class CharacterSheet extends DHBaseActorSheet { roll: { trait: button.dataset.attribute }, - hasRoll: true, + hasRoll: true + }; + const result = await this.document.diceRoll({ + ...config, actionType: 'action', headerTitle: `${game.i18n.localize('DAGGERHEART.GENERAL.dualityRoll')}: ${this.actor.name}`, title: game.i18n.format('DAGGERHEART.UI.Chat.dualityRoll.abilityCheckTitle', { ability: abilityLabel }) - }; - const result = await this.document.diceRoll(config); + }); - /* This could be avoided by baking config.costs into config.resourceUpdates. Didn't feel like messing with it at the time */ - const costResources = result.costs - .filter(x => x.enabled) - .map(cost => ({ ...cost, value: -cost.value, total: -cost.total })); - config.resourceUpdates.addResources(costResources); - await config.resourceUpdates.updateResources(); + if (result) game.system.api.fields.ActionFields.CostField.execute.call(this, result); } //TODO: redo toggleEquipItem method @@ -893,41 +855,6 @@ export default class CharacterSheet extends DHBaseActorSheet { game.system.api.fields.ActionFields.BeastformField.handleActiveTransformations.call(item); } - static async #viewParty(_, target) { - const parties = this.document.parties; - if (parties.size <= 1) { - parties.first()?.sheet.render({ force: true }); - return; - } - - const buttons = parties.map((p) => { - const button = document.createElement("button"); - button.type = "button"; - button.classList.add("plain"); - const img = document.createElement("img"); - img.src = p.img; - button.append(img); - const name = document.createElement("span"); - name.textContent = p.name; - button.append(name); - button.addEventListener("click", () => { - p.sheet?.render({ force: true }); - game.tooltip.dismissLockedTooltips(); - }); - return button; - }); - - const html = document.createElement("div"); - html.classList.add("party-list"); - html.append(...buttons); - - game.tooltip.dismissLockedTooltips(); - game.tooltip.activate(target, { - html, - locked: true, - }) - } - /** * Open the downtime application. * @type {ApplicationClickAction} @@ -938,15 +865,6 @@ export default class CharacterSheet extends DHBaseActorSheet { }); } - /** @inheritdoc */ - async _onDragStart(event) { - const inventoryItem = event.currentTarget.closest('.inventory-item'); - if (inventoryItem) { - event.dataTransfer.setDragImage(inventoryItem.querySelector('img'), 60, 0); - } - super._onDragStart(event); - } - async _onDropItem(event, item) { if (this.document.uuid === item.parent?.uuid) { return super._onDropItem(event, item); diff --git a/module/applications/sheets/actors/environment.mjs b/module/applications/sheets/actors/environment.mjs index f8ff74a6..9a09cd94 100644 --- a/module/applications/sheets/actors/environment.mjs +++ b/module/applications/sheets/actors/environment.mjs @@ -25,12 +25,7 @@ export default class DhpEnvironment extends DHBaseActorSheet { toggleResourceDice: DhpEnvironment.#toggleResourceDice, handleResourceDice: DhpEnvironment.#handleResourceDice }, - dragDrop: [ - { - dragSelector: '[data-item-id][draggable="true"], [data-item-id] [draggable="true"]', - dropSelector: null - } - ] + dragDrop: [{ dragSelector: '.inventory-item', dropSelector: null }] }; /**@override */ @@ -79,9 +74,6 @@ export default class DhpEnvironment extends DHBaseActorSheet { case 'header': await this._prepareHeaderContext(context, options); - break; - case 'features': - await this._prepareFeaturesContext(context, options); break; case 'notes': await this._prepareNotesContext(context, options); @@ -118,22 +110,6 @@ export default class DhpEnvironment extends DHBaseActorSheet { } } - /** - * Prepare render context for the features part. - * @param {ApplicationRenderContext} context - * @param {ApplicationRenderOptions} options - * @returns {Promise} - * @protected - */ - async _prepareFeaturesContext(context, _options) { - const featureForms = ['passive', 'action', 'reaction']; - context.features = this.document.system.features.sort((a, b) => - a.system.featureForm !== b.system.featureForm - ? featureForms.indexOf(a.system.featureForm) - featureForms.indexOf(b.system.featureForm) - : a.sort - b.sort - ); - } - /** * Prepare render context for the Header part. * @param {ApplicationRenderContext} context diff --git a/module/applications/sheets/actors/party.mjs b/module/applications/sheets/actors/party.mjs index d78519cb..5c448b49 100644 --- a/module/applications/sheets/actors/party.mjs +++ b/module/applications/sheets/actors/party.mjs @@ -40,7 +40,7 @@ export default class Party extends DHBaseActorSheet { selectRefreshable: DaggerheartMenu.selectRefreshable, refreshActors: DaggerheartMenu.refreshActors }, - dragDrop: [{ dragSelector: '[data-item-id]', dropSelector: null }] + dragDrop: [{ dragSelector: '[data-item-id][draggable="true"]', dropSelector: null }] }; /**@override */ diff --git a/module/applications/sheets/api/application-mixin.mjs b/module/applications/sheets/api/application-mixin.mjs index d25a1a4e..449d6723 100644 --- a/module/applications/sheets/api/application-mixin.mjs +++ b/module/applications/sheets/api/application-mixin.mjs @@ -178,79 +178,6 @@ export default function DHApplicationMixin(Base) { _attachPartListeners(partId, htmlElement, options) { super._attachPartListeners(partId, htmlElement, options); this._dragDrop.forEach(d => d.bind(htmlElement)); - - // Handle delta inputs - for (const deltaInput of htmlElement.querySelectorAll('input[data-allow-delta]')) { - deltaInput.dataset.numValue = deltaInput.value; - deltaInput.inputMode = 'numeric'; - - const handleUpdate = (delta = 0) => { - const min = Number(deltaInput.min) || 0; - const max = Number(deltaInput.max) || Infinity; - const current = Number(deltaInput.dataset.numValue); - const rawNumber = Number(deltaInput.value); - if (Number.isNaN(rawNumber)) { - deltaInput.value = delta ? Math.clamp(current + delta, min, max) : current; - return; - } - - const newValue = - deltaInput.value.startsWith('+') || deltaInput.value.startsWith('-') - ? Math.clamp(current + rawNumber + delta, min, max) - : Math.clamp(rawNumber + delta, min, max); - deltaInput.value = deltaInput.dataset.numValue = newValue; - }; - - // Force valid characters while inputting - deltaInput.addEventListener('input', () => { - deltaInput.value = /[+=\-]?\d*/.exec(deltaInput.value)?.at(0) ?? deltaInput.value; - }); - - // Recreate Keyup/Keydown support - deltaInput.addEventListener('keydown', event => { - const step = event.key === 'ArrowUp' ? 1 : event.key === 'ArrowDown' ? -1 : 0; - if (step !== 0) { - handleUpdate(step); - deltaInput.dispatchEvent(new Event("change", { bubbles: true })); - } - }); - - // Mousewheel while focused support - deltaInput.addEventListener( - 'wheel', - event => { - if (deltaInput === document.activeElement) { - event.preventDefault(); - handleUpdate(Math.sign(-1 * event.deltaY)); - deltaInput.dispatchEvent(new Event("change", { bubbles: true })); - } - }, - { passive: false } - ); - - deltaInput.addEventListener('change', () => { - handleUpdate(); - }); - } - - // Handle contenteditable - for (const input of htmlElement.querySelectorAll('[contenteditable][data-property]')) { - const property = input.dataset.property; - input.addEventListener("blur", () => { - const selection = document.getSelection(); - if (input.contains(selection.anchorNode)) { - selection.empty(); - } - this.document.update({ [property]: input.textContent }); - }); - - input.addEventListener("keydown", event => { - if (event.key === "Enter") input.blur(); - }); - - // Chrome sometimes add
, which aren't a problem for the value but are for the placeholder - input.addEventListener("input", () => input.querySelectorAll("br").forEach((i) => i.remove())); - } } /**@inheritdoc */ diff --git a/module/applications/sheets/api/base-actor.mjs b/module/applications/sheets/api/base-actor.mjs index 85ecd616..adb0d39a 100644 --- a/module/applications/sheets/api/base-actor.mjs +++ b/module/applications/sheets/api/base-actor.mjs @@ -34,10 +34,7 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { } } ], - dragDrop: [ - { dragSelector: '.inventory-item[data-type="attack"]', dropSelector: null }, - { dragSelector: ".currency[data-currency] .drag-handle", dropSelector: null } - ] + dragDrop: [{ dragSelector: '.inventory-item[data-type="attack"]', dropSelector: null }] }; /* -------------------------------------------- */ @@ -257,35 +254,14 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { /* Application Drag/Drop */ /* -------------------------------------------- */ - async _onDrop(event) { - event.stopPropagation(); - const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event); - if (data.type === 'Currency' && ['character', 'party'].includes(this.document.type)) { - const originActor = await foundry.utils.fromUuid(data.originActor); - if (!originActor || originActor.uuid === this.document.uuid) return; - const currency = data.currency; - const quantity = await game.system.api.applications.dialogs.ItemTransferDialog.configure({ - originActor, - targetActor: this.document, - currency - }); - if (quantity) { - originActor.update({ [`system.gold.${currency}`]: Math.max(0, originActor.system.gold[currency] - quantity) }); - this.document.update({ [`system.gold.${currency}`]: this.document.system.gold[currency] + quantity }); - } - return; - } - - return super._onDrop(event); - } - async _onDropItem(event, item) { const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event); + const physicalActorTypes = ['character', 'party']; const originActor = item.actor; if ( item.actor?.uuid === this.document.uuid || !originActor || - !['character', 'party'].includes(this.document.type) + !physicalActorTypes.includes(this.document.type) ) { return super._onDropItem(event, item); } @@ -294,10 +270,10 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { if (item.system.metadata.isInventoryItem) { if (item.system.metadata.isQuantifiable) { const actorItem = originActor.items.get(data.originId); - const quantityTransfered = await game.system.api.applications.dialogs.ItemTransferDialog.configure({ - item, - targetActor: this.document - }); + const quantityTransfered = + actorItem.system.quantity === 1 + ? 1 + : await game.system.api.applications.dialogs.ItemTransferDialog.configure(item); if (quantityTransfered) { if (quantityTransfered === actorItem.system.quantity) { @@ -338,16 +314,6 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { * @param {DragEvent} event - The drag event */ async _onDragStart(event) { - // Handle drag/dropping currencies - const currencyEl = event.currentTarget.closest(".currency[data-currency]"); - if (currencyEl) { - const currency = currencyEl.dataset.currency; - const data = { type: 'Currency', currency, originActor: this.document.uuid }; - event.dataTransfer.setData('text/plain', JSON.stringify(data)); - return; - } - - // Handle drag/dropping attacks const attackItem = event.currentTarget.closest('.inventory-item[data-type="attack"]'); if (attackItem) { const attackData = { diff --git a/module/applications/sheets/items/beastform.mjs b/module/applications/sheets/items/beastform.mjs index 880c0796..1c4a4880 100644 --- a/module/applications/sheets/items/beastform.mjs +++ b/module/applications/sheets/items/beastform.mjs @@ -77,7 +77,6 @@ export default class BeastformSheet extends DHBaseItemSheet { name: context.document.system.advantageOn[key].value })) ); - context.dimensionsDisabled = context.document.system.tokenSize.size !== 'custom'; break; case 'effects': context.effects.actives = context.effects.actives.map(effect => { diff --git a/module/applications/sheets/items/feature.mjs b/module/applications/sheets/items/feature.mjs index 6ff98ca7..1575067b 100644 --- a/module/applications/sheets/items/feature.mjs +++ b/module/applications/sheets/items/feature.mjs @@ -31,11 +31,4 @@ export default class FeatureSheet extends DHBaseItemSheet { labelPrefix: 'DAGGERHEART.GENERAL.Tabs' } }; -//Might be wrong location but testing out if here is okay. - /**@override */ - async _prepareContext(options) { - const context = await super._prepareContext(options); - context.featureFormChoices = CONFIG.DH.ITEM.featureForm; - return context; - } } diff --git a/module/applications/sidebar/tabs/actorDirectory.mjs b/module/applications/sidebar/tabs/actorDirectory.mjs index d40443a0..4a528e74 100644 --- a/module/applications/sidebar/tabs/actorDirectory.mjs +++ b/module/applications/sidebar/tabs/actorDirectory.mjs @@ -17,30 +17,4 @@ export default class DhActorDirectory extends foundry.applications.sidebar.tabs. : null; }; } - - /** @inheritDoc */ - _onDragStart(event) { - let actor; - const { entryId } = event.currentTarget.dataset; - if (entryId) { - actor = this.collection.get(entryId); - if (!actor?.visible) return false; - } - super._onDragStart(event); - - // Create the drag preview. - if (actor && canvas.ready) { - const img = event.currentTarget.querySelector('img'); - const pt = actor.prototypeToken; - const usesSize = actor.system.metadata.usesSize; - const tokenSizes = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).tokenSizes; - const width = usesSize ? tokenSizes[actor.system.size] : pt.width; - const height = usesSize ? tokenSizes[actor.system.size] : pt.height; - - const w = width * canvas.dimensions.size * Math.abs(pt.texture.scaleX) * canvas.stage.scale.x; - const h = height * canvas.dimensions.size * Math.abs(pt.texture.scaleY) * canvas.stage.scale.y; - const preview = foundry.applications.ux.DragDrop.implementation.createDragImage(img, w, h); - event.dataTransfer.setDragImage(preview, w / 2, h / 2); - } - } } diff --git a/module/applications/ui/chatLog.mjs b/module/applications/ui/chatLog.mjs index cc42df2f..871ff173 100644 --- a/module/applications/ui/chatLog.mjs +++ b/module/applications/ui/chatLog.mjs @@ -55,28 +55,27 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo ]; } - addChatListeners = async (document, html, data) => { - const message = data?.message ?? document.toObject(false); + addChatListeners = async (app, html, data) => { html.querySelectorAll('.simple-roll-button').forEach(element => - element.addEventListener('click', event => this.onRollSimple(event, message)) + element.addEventListener('click', event => this.onRollSimple(event, data.message)) ); html.querySelectorAll('.ability-use-button').forEach(element => - element.addEventListener('click', event => this.abilityUseButton(event, message)) + element.addEventListener('click', event => this.abilityUseButton(event, data.message)) ); html.querySelectorAll('.action-use-button').forEach(element => - element.addEventListener('click', event => this.actionUseButton(event, message)) + element.addEventListener('click', event => this.actionUseButton(event, data.message)) ); html.querySelectorAll('.reroll-button').forEach(element => - element.addEventListener('click', event => this.rerollEvent(event, message)) + element.addEventListener('click', event => this.rerollEvent(event, data.message)) ); html.querySelectorAll('.group-roll-button').forEach(element => - element.addEventListener('click', event => this.groupRollButton(event, message)) + element.addEventListener('click', event => this.groupRollButton(event, data.message)) ); html.querySelectorAll('.group-roll-reroll').forEach(element => - element.addEventListener('click', event => this.groupRollReroll(event, message)) + element.addEventListener('click', event => this.groupRollReroll(event, data.message)) ); html.querySelectorAll('.group-roll-success').forEach(element => - element.addEventListener('click', event => this.groupRollSuccessEvent(event, message)) + element.addEventListener('click', event => this.groupRollSuccessEvent(event, data.message)) ); html.querySelectorAll('.group-roll-header-expand-section').forEach(element => element.addEventListener('click', this.groupRollExpandSection) @@ -134,9 +133,7 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo async actionUseButton(event, message) { const { moveIndex, actionIndex, movePath } = event.currentTarget.dataset; - const targetUuid = event.currentTarget.closest('.action-use-button-parent').querySelector('select')?.value; - const parent = await foundry.utils.fromUuid(targetUuid || message.system.actor) - + const parent = await foundry.utils.fromUuid(message.system.actor); const actionType = message.system.moves[moveIndex].actions[actionIndex]; const cls = game.system.api.models.actions.actionsTypes[actionType.type]; const action = new cls( @@ -148,8 +145,7 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo type: CONFIG.DH.ITEM.originItemType.restMove, itemPath: movePath, actionIndex: actionIndex - }, - targetUuid: targetUuid + } }, { parent: parent.system } ); @@ -249,6 +245,7 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo }); if (!result) return; + await game.system.api.fields.ActionFields.CostField.execute.call({ actor }, result); const newMessageData = foundry.utils.deepClone(message.system); foundry.utils.setProperty(newMessageData, `${path}.result`, result.roll); diff --git a/module/applications/ui/combatTracker.mjs b/module/applications/ui/combatTracker.mjs index 288ba8ad..b1e658a5 100644 --- a/module/applications/ui/combatTracker.mjs +++ b/module/applications/ui/combatTracker.mjs @@ -5,7 +5,8 @@ export default class DhCombatTracker extends foundry.applications.sidebar.tabs.C actions: { requestSpotlight: this.requestSpotlight, toggleSpotlight: this.toggleSpotlight, - setActionTokens: this.setActionTokens + setActionTokens: this.setActionTokens, + openCountdowns: this.openCountdowns } }; @@ -41,13 +42,13 @@ export default class DhCombatTracker extends foundry.applications.sidebar.tabs.C const modifierBP = this.combats .find(x => x.active) - ?.system?.extendedBattleToggles?.reduce((acc, toggle) => (acc ?? 0) + toggle.category, null) ?? null; + ?.system?.extendedBattleToggles?.reduce((acc, toggle) => acc + toggle.category, 0) ?? 0; const maxBP = CONFIG.DH.ENCOUNTER.BaseBPPerEncounter(context.characters.length) + modifierBP; const currentBP = AdversaryBPPerEncounter(context.adversaries, context.characters); Object.assign(context, { fear: game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Resources.Fear), - battlepoints: { max: maxBP, current: currentBP, hasModifierBP: modifierBP !== null } + battlepoints: { max: maxBP, current: currentBP, hasModifierBP: Boolean(modifierBP) } }); } @@ -56,26 +57,21 @@ export default class DhCombatTracker extends foundry.applications.sidebar.tabs.C const adversaries = context.turns?.filter(x => x.isNPC) ?? []; const characters = context.turns?.filter(x => !x.isNPC) ?? []; - const spotlightQueueEnabled = game.settings.get( - CONFIG.DH.id, - CONFIG.DH.SETTINGS.gameSettings.SpotlightRequestQueue - ); const spotlightRequests = characters - ?.filter(x => !x.isNPC && spotlightQueueEnabled) + ?.filter(x => !x.isNPC) .filter(x => x.system.spotlight.requestOrderIndex > 0) .sort((a, b) => { const valueA = a.system.spotlight.requestOrderIndex; const valueB = b.system.spotlight.requestOrderIndex; + return valueA - valueB; }); Object.assign(context, { actionTokens: game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules).actionTokens, adversaries, - characters: characters - ?.filter(x => !x.isNPC) - .filter(x => !spotlightQueueEnabled || x.system.spotlight.requestOrderIndex == 0), + characters: characters?.filter(x => !x.isNPC).filter(x => x.system.spotlight.requestOrderIndex == 0), spotlightRequests }); } @@ -127,7 +123,7 @@ export default class DhCombatTracker extends foundry.applications.sidebar.tabs.C resource, active: index === combat.turn, canPing: combatant.sceneId === canvas.scene?.id && game.user.hasPermission('PING_CANVAS'), - type: combatant.actor?.system?.type, + type: combatant.actor.system.type, img: await this._getCombatantThumbnail(combatant) }; @@ -165,13 +161,9 @@ export default class DhCombatTracker extends foundry.applications.sidebar.tabs.C if (this.viewed.turn !== toggleTurn) { const { updateCountdowns } = game.system.api.applications.ui.DhCountdowns; - if (combatant.actor?.type === 'character') { - await updateCountdowns( - CONFIG.DH.GENERAL.countdownProgressionTypes.spotlight.id, - CONFIG.DH.GENERAL.countdownProgressionTypes.characterSpotlight.id - ); - } else { - await updateCountdowns(CONFIG.DH.GENERAL.countdownProgressionTypes.spotlight.id); + await updateCountdowns(CONFIG.DH.GENERAL.countdownProgressionTypes.spotlight.id); + if (combatant.actor.type === 'character') { + await updateCountdowns(CONFIG.DH.GENERAL.countdownProgressionTypes.characterSpotlight.id); } const autoPoints = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).actionPoints; diff --git a/module/applications/ui/countdowns.mjs b/module/applications/ui/countdowns.mjs index 42920a4a..96315b17 100644 --- a/module/applications/ui/countdowns.mjs +++ b/module/applications/ui/countdowns.mjs @@ -245,20 +245,14 @@ export default class DhCountdowns extends HandlebarsApplicationMixin(Application return super.close(options); } - /** - * Sends updates of the countdowns to the GM player. Since this is asynchronous, be sure to - * update all the countdowns at the same time. - * - * @param {...any} progressTypes Countdowns to be updated - */ - static async updateCountdowns(...progressTypes) { + static async updateCountdowns(progressType) { const { countdownAutomation } = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation); if (!countdownAutomation) return; const countdownSetting = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Countdowns); const updatedCountdowns = Object.keys(countdownSetting.countdowns).reduce((acc, key) => { const countdown = countdownSetting.countdowns[key]; - if (progressTypes.indexOf(countdown.progress.type) !== -1 && countdown.progress.current > 0) { + if (countdown.progress.type === progressType && countdown.progress.current > 0) { acc.push(key); } @@ -266,7 +260,7 @@ export default class DhCountdowns extends HandlebarsApplicationMixin(Application }, []); const countdownData = countdownSetting.toObject(); - const settings = { + await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Countdowns, { ...countdownData, countdowns: Object.keys(countdownData.countdowns).reduce((acc, key) => { const countdown = foundry.utils.deepClone(countdownData.countdowns[key]); @@ -277,12 +271,14 @@ export default class DhCountdowns extends HandlebarsApplicationMixin(Application acc[key] = countdown; return acc; }, {}) - }; - await emitAsGM(GMUpdateEvent.UpdateCountdowns, - DhCountdowns.gmSetSetting.bind(settings), - settings, null, { - refreshType: RefreshType.Countdown }); + + const data = { refreshType: RefreshType.Countdown }; + await game.socket.emit(`system.${CONFIG.DH.id}`, { + action: socketEvent.Refresh, + data + }); + Hooks.callAll(socketEvent.Refresh, data); } async _onRender(context, options) { diff --git a/module/applications/ui/effectsDisplay.mjs b/module/applications/ui/effectsDisplay.mjs index 0875e783..7f90e30b 100644 --- a/module/applications/ui/effectsDisplay.mjs +++ b/module/applications/ui/effectsDisplay.mjs @@ -87,7 +87,7 @@ export default class DhEffectsDisplay extends HandlebarsApplicationMixin(Applica async removeEffect(event) { const element = event.target.closest('.effect-container'); const effects = DhEffectsDisplay.getTokenEffects(); - const effect = effects.find(x => x.id === element.dataset.effectId); + const effect = effects.find(x => x.id === element.id); await effect.delete(); this.render(); } diff --git a/module/canvas/placeables/token.mjs b/module/canvas/placeables/token.mjs index e8b85938..64ec3fa9 100644 --- a/module/canvas/placeables/token.mjs +++ b/module/canvas/placeables/token.mjs @@ -34,69 +34,6 @@ export default class DhTokenPlaceable extends foundry.canvas.placeables.Token { this.renderFlags.set({ refreshEffects: true }); } - /** - * Returns the distance from this token to another token object. - * This value is corrected to handle alternate token sizes and other grid types - * according to the diagonal rules. - */ - distanceTo(target) { - if (!canvas.ready) return NaN; - if (this === target) return 0; - - const originPoint = this.center; - const destinationPoint = target.center; - - // Compute for gridless. This version returns circular edge to edge + grid distance, - // so that tokens that are touching return 5. - if (canvas.grid.type === CONST.GRID_TYPES.GRIDLESS) { - const boundsCorrection = canvas.grid.distance / canvas.grid.size; - const originRadius = this.bounds.width * boundsCorrection / 2; - const targetRadius = target.bounds.width * boundsCorrection / 2; - const distance = canvas.grid.measurePath([originPoint, destinationPoint]).distance; - return distance - originRadius - targetRadius + canvas.grid.distance; - } - - // Compute what the closest grid space of each token is, then compute that distance - const originEdge = this.#getEdgeBoundary(this.bounds, originPoint, destinationPoint); - const targetEdge = this.#getEdgeBoundary(target.bounds, originPoint, destinationPoint); - const adjustedOriginPoint = canvas.grid.getTopLeftPoint({ - x: originEdge.x + Math.sign(originPoint.x - originEdge.x), - y: originEdge.y + Math.sign(originPoint.y - originEdge.y) - }); - const adjustDestinationPoint = canvas.grid.getTopLeftPoint({ - x: targetEdge.x + Math.sign(destinationPoint.x - targetEdge.x), - y: targetEdge.y + Math.sign(destinationPoint.y - targetEdge.y) - }); - return canvas.grid.measurePath([adjustedOriginPoint, adjustDestinationPoint]).distance; - } - - /** Returns the point at which a line starting at origin and ending at destination intersects the edge of the bounds */ - #getEdgeBoundary(bounds, originPoint, destinationPoint) { - const points = [ - { x: bounds.x, y: bounds.y }, - { x: bounds.x + bounds.width, y: bounds.y }, - { x: bounds.x + bounds.width, y: bounds.y + bounds.height }, - { x: bounds.x, y: bounds.y + bounds.height } - ]; - const pairsToTest = [ - [points[0], points[1]], - [points[1], points[2]], - [points[2], points[3]], - [points[3], points[0]] - ]; - for (const pair of pairsToTest) { - const result = foundry.utils.lineSegmentIntersection(originPoint, destinationPoint, pair[0], pair[1]); - if (result) return result; - } - - return null; - } - - /** Tests if the token is at least adjacent with another, with some leeway for diagonals */ - isAdjacentWith(token) { - return this.distanceTo(token) <= (canvas.grid.distance * 1.5); - } - /** @inheritDoc */ _drawBar(number, bar, data) { const val = Number(data.value); diff --git a/module/config/actionConfig.mjs b/module/config/actionConfig.mjs index c9b70193..d64fd9e9 100644 --- a/module/config/actionConfig.mjs +++ b/module/config/actionConfig.mjs @@ -2,7 +2,7 @@ export const actionTypes = { attack: { id: 'attack', name: 'DAGGERHEART.ACTIONS.TYPES.attack.name', - icon: 'fa-hand-fist', + icon: 'fa-khanda', tooltip: 'DAGGERHEART.ACTIONS.TYPES.attack.tooltip' }, countdown: { diff --git a/module/config/actorConfig.mjs b/module/config/actorConfig.mjs index fdef7d03..7ff42754 100644 --- a/module/config/actorConfig.mjs +++ b/module/config/actorConfig.mjs @@ -211,44 +211,6 @@ export const adversaryTraits = { } }; -export const tokenSize = { - custom: { - id: 'custom', - value: 0, - label: 'DAGGERHEART.GENERAL.custom' - }, - tiny: { - id: 'tiny', - value: 1, - label: 'DAGGERHEART.CONFIG.TokenSize.tiny' - }, - small: { - id: 'small', - value: 2, - label: 'DAGGERHEART.CONFIG.TokenSize.small' - }, - medium: { - id: 'medium', - value: 3, - label: 'DAGGERHEART.CONFIG.TokenSize.medium' - }, - large: { - id: 'large', - value: 4, - label: 'DAGGERHEART.CONFIG.TokenSize.large' - }, - huge: { - id: 'huge', - value: 5, - label: 'DAGGERHEART.CONFIG.TokenSize.huge' - }, - gargantuan: { - id: 'gargantuan', - value: 6, - label: 'DAGGERHEART.CONFIG.TokenSize.gargantuan' - } -}; - export const levelChoices = { attributes: { name: 'attributes', diff --git a/module/config/encounterConfig.mjs b/module/config/encounterConfig.mjs index 4e0f8a6e..96efd745 100644 --- a/module/config/encounterConfig.mjs +++ b/module/config/encounterConfig.mjs @@ -9,7 +9,7 @@ export const AdversaryBPPerEncounter = (adversaries, characters) => { ); if (existingEntry) { existingEntry.nr += 1; - } else if (adversary.type) { + } else { acc.push({ adversary, nr: 1 }); } return acc; @@ -21,7 +21,7 @@ export const AdversaryBPPerEncounter = (adversaries, characters) => { if (type.partyAmountPerBP) { acc += characters.length === 0 ? 0 : Math.ceil(entry.nr / characters.length); } else { - acc += bpCost * entry.nr; + acc += bpCost; } return acc; @@ -84,7 +84,6 @@ export const BPModifiers = { increaseDamage: { sort: 2, description: 'DAGGERHEART.CONFIG.BPModifiers.increaseDamage.description', - effectTargetTypes: ['adversary'], effects: [ { name: 'DAGGERHEART.CONFIG.BPModifiers.increaseDamage.effect.name', diff --git a/module/config/generalConfig.mjs b/module/config/generalConfig.mjs index 3f49f7aa..2c2b1316 100644 --- a/module/config/generalConfig.mjs +++ b/module/config/generalConfig.mjs @@ -232,7 +232,7 @@ export const defaultRestOptions = { actionType: 'action', chatDisplay: false, target: { - type: 'friendly' + type: 'self' }, damage: { parts: [ @@ -298,7 +298,7 @@ export const defaultRestOptions = { actionType: 'action', chatDisplay: false, target: { - type: 'friendly' + type: 'self' }, damage: { parts: [ @@ -341,7 +341,7 @@ export const defaultRestOptions = { actionType: 'action', chatDisplay: false, target: { - type: 'friendly' + type: 'self' }, damage: { parts: [ @@ -407,7 +407,7 @@ export const defaultRestOptions = { actionType: 'action', chatDisplay: false, target: { - type: 'friendly' + type: 'self' }, damage: { parts: [ diff --git a/module/config/itemConfig.mjs b/module/config/itemConfig.mjs index 7d80e597..a9ad1d68 100644 --- a/module/config/itemConfig.mjs +++ b/module/config/itemConfig.mjs @@ -5,6 +5,7 @@ export const armorFeatures = { actions: [ { type: 'damage', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.ArmorFeature.burning.actions.burn.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.burning.actions.burn.description', @@ -173,6 +174,7 @@ export const armorFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.ArmorFeature.hopeful.actions.hope.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.hopeful.actions.hope.description', @@ -186,6 +188,7 @@ export const armorFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.ArmorFeature.impenetrable.actions.impenetrable.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.impenetrable.actions.impenetrable.description', @@ -228,6 +231,7 @@ export const armorFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.ArmorFeature.painful.actions.pain.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.painful.actions.pain.description', @@ -265,6 +269,7 @@ export const armorFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.ArmorFeature.quiet.actions.quiet.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.quiet.actions.quiet.description', @@ -301,6 +306,7 @@ export const armorFeatures = { actions: [ { type: 'attack', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.ArmorFeature.resilient.actions.resilient.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.resilient.actions.resilient.description', @@ -347,6 +353,7 @@ export const armorFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.ArmorFeature.shifting.actions.shift.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.shifting.actions.shift.description', @@ -366,6 +373,7 @@ export const armorFeatures = { actions: [ { type: 'attack', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.ArmorFeature.timeslowing.actions.slowTime.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.timeslowing.actions.slowTime.description', @@ -393,6 +401,7 @@ export const armorFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.ArmorFeature.truthseeking.actions.truthseeking.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.truthseeking.actions.truthseeking.description', @@ -435,8 +444,7 @@ export const armorFeatures = { { key: 'system.resistance.magical.reduction', mode: 2, - value: '@system.armorScore', - priority: 21 + value: '@system.armorScore' } ] } @@ -529,6 +537,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.bouncing.actions.bounce.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.bouncing.actions.bounce.description', @@ -573,6 +582,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.brutal.actions.addDamage.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.brutal.actions.addDamage.description', @@ -586,6 +596,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.burning.actions.burn.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.burning.actions.burn.description', @@ -599,6 +610,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.charged.actions.markStress.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.charged.actions.markStress.description', @@ -635,6 +647,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.concussive.actions.attack.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.concussive.actions.attack.description', @@ -675,6 +688,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.deadly.actions.extraDamage.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.deadly.actions.extraDamage.description', @@ -688,6 +702,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.actions.deflect.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.actions.deflect.description', @@ -710,8 +725,7 @@ export const weaponFeatures = { { key: 'system.evasion', mode: 2, - value: '@system.armorScore', - priority: 21 + value: '@system.armorScore' } ] } @@ -725,6 +739,7 @@ export const weaponFeatures = { actions: [ { type: 'damage', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.actions.attack.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.actions.attack.descriptive', @@ -769,6 +784,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.devastating.actions.devastate.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.devastating.actions.devastate.description', @@ -819,6 +835,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.doubledUp.actions.doubleUp.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.doubledUp.actions.doubleUp.description', @@ -832,6 +849,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.dueling.actions.duel.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.dueling.actions.duel.description', @@ -845,6 +863,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', // Should prompt a dc 14 reaction save on adversaries + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.eruptive.actions.erupt.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.eruptive.actions.erupt.description', @@ -858,6 +877,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.grappling.actions.grapple.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.grappling.actions.grapple.description', @@ -877,6 +897,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.description', @@ -908,6 +929,7 @@ export const weaponFeatures = { actions: [ { type: 'healing', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.healing.actions.heal.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.healing.actions.heal.description', @@ -955,6 +977,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.hooked.actions.hook.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.hooked.actions.hook.description', @@ -968,6 +991,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.hot.actions.hot.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.hot.actions.hot.description', @@ -981,6 +1005,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.invigorating.actions.invigorate.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.invigorating.actions.invigorate.description', @@ -994,6 +1019,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.lifestealing.actions.lifesteal.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.lifestealing.actions.lifesteal.description', @@ -1007,6 +1033,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.lockedOn.actions.lockOn.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.lockedOn.actions.lockOn.description', @@ -1020,6 +1047,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.long.actions.long.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.long.actions.long.description', @@ -1033,6 +1061,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.lucky.actions.luck.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.lucky.actions.luck.description', @@ -1070,6 +1099,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.painful.actions.pain.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.painful.actions.pain.description', @@ -1115,6 +1145,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.parry.actions.parry.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.parry.actions.parry.description', @@ -1128,6 +1159,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.actions.persuade.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.actions.persuade.description', @@ -1164,6 +1196,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.pompous.actions.pompous.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.pompous.actions.pompous.description', @@ -1207,6 +1240,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.quick.actions.quick.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.quick.actions.quick.description', @@ -1244,6 +1278,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.reloading.actions.reload.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.reloading.actions.reload.description', @@ -1257,6 +1292,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.retractable.actions.retract.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.retractable.actions.retract.description', @@ -1270,6 +1306,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.returning.actions.return.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.returning.actions.return.description', @@ -1283,6 +1320,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.scary.actions.scare.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.scary.actions.scare.description', @@ -1326,8 +1364,7 @@ export const weaponFeatures = { { key: 'system.bonuses.damage.primaryWeapon.bonus', mode: 2, - value: '@system.traits.agility.value', - priority: 21 + value: '@system.traits.agility.value' } ] } @@ -1339,6 +1376,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.sheltering.actions.shelter.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.sheltering.actions.shelter.description', @@ -1352,6 +1390,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.startling.actions.startle.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.startling.actions.startle.description', @@ -1371,6 +1410,7 @@ export const weaponFeatures = { actions: [ { type: 'effect', + actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.timebending.actions.bendTime.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.timebending.actions.bendTime.description', @@ -1418,12 +1458,6 @@ export const orderedWeaponFeatures = () => { return Object.values(all).sort((a, b) => game.i18n.localize(a.label).localeCompare(game.i18n.localize(b.label))); }; -export const featureForm = { - passive: 'DAGGERHEART.CONFIG.FeatureForm.passive', - action: 'DAGGERHEART.CONFIG.FeatureForm.action', - reaction: 'DAGGERHEART.CONFIG.FeatureForm.reaction' -}; - export const featureTypes = { ancestry: { id: 'ancestry', @@ -1481,6 +1515,21 @@ export const featureSubTypes = { mastery: 'mastery' }; +export const actionTypes = { + passive: { + id: 'passive', + label: 'DAGGERHEART.CONFIG.ActionType.passive' + }, + action: { + id: 'action', + label: 'DAGGERHEART.CONFIG.ActionType.action' + }, + reaction: { + id: 'reaction', + label: 'DAGGERHEART.CONFIG.ActionType.reaction' + } +}; + export const itemResourceTypes = { simple: { id: 'simple', diff --git a/module/config/settingsConfig.mjs b/module/config/settingsConfig.mjs index 3d993949..aea9bc48 100644 --- a/module/config/settingsConfig.mjs +++ b/module/config/settingsConfig.mjs @@ -28,8 +28,7 @@ export const gameSettings = { LevelTiers: 'LevelTiers', Countdowns: 'Countdowns', LastMigrationVersion: 'LastMigrationVersion', - TagTeamRoll: 'TagTeamRoll', - SpotlightRequestQueue: 'SpotlightRequestQueue', + TagTeamRoll: 'TagTeamRoll' }; export const actionAutomationChoices = { diff --git a/module/data/action/baseAction.mjs b/module/data/action/baseAction.mjs index 18a09904..93de0a2d 100644 --- a/module/data/action/baseAction.mjs +++ b/module/data/action/baseAction.mjs @@ -33,8 +33,7 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel initial: 'action', nullable: false, required: true - }), - targetUuid: new fields.StringField({ initial: undefined }) + }) }; this.extraSchemas.forEach(s => { @@ -96,9 +95,6 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel prepareData() { this.name = this.name || game.i18n.localize(CONFIG.DH.ACTIONS.actionTypes[this.type].name); this.img = this.img ?? this.parent?.parent?.img; - - /* Fallback to feature description */ - this.description = this.description || this.parent?.description; } /** @@ -163,9 +159,12 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel * @returns {object} */ getRollData(data = {}) { - const actorData = this.actor ? this.actor.getRollData(false) : {}; + if (!this.actor) return null; + const actorData = this.actor.getRollData(false); + // Add Roll results to RollDatas actorData.result = data.roll?.total ?? 1; + actorData.scale = data.costs?.length // Right now only return the first scalable cost. ? (data.costs.find(c => c.scalable)?.total ?? 1) : 1; @@ -194,6 +193,8 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel async use(event) { if (!this.actor) throw new Error("An Action can't be used outside of an Actor context."); + if (this.chatDisplay) await this.toChat(); + let config = this.prepareConfig(event); if (!config) return; @@ -207,12 +208,9 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel // Execute the Action Worflow in order based of schema fields await this.executeWorkflow(config); - await config.resourceUpdates.updateResources(); if (Hooks.call(`${CONFIG.DH.id}.postUseAction`, this, config) === false) return; - if (this.chatDisplay) await this.toChat(); - return config; } @@ -241,11 +239,8 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel isDirect: !!this.damage?.direct, selectedRollMode: game.settings.get('core', 'rollMode'), data: this.getRollData(), - evaluate: this.hasRoll, - resourceUpdates: new ResourceUpdateMap(this.actor), - targetUuid: this.targetUuid + evaluate: this.hasRoll }; - DHBaseAction.applyKeybindings(config); return config; } @@ -327,46 +322,11 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel * @returns {string[]} An array of localized tag strings. */ _getTags() { - const tags = [game.i18n.localize(`DAGGERHEART.ACTIONS.TYPES.${this.type}.name`)]; + const tags = [ + game.i18n.localize(`DAGGERHEART.ACTIONS.TYPES.${this.type}.name`), + game.i18n.localize(`DAGGERHEART.CONFIG.ActionType.${this.actionType}`) + ]; return tags; } } - -export class ResourceUpdateMap extends Map { - #actor; - - constructor(actor) { - super(); - - this.#actor = actor; - } - - addResources(resources) { - for (const resource of resources) { - if (!resource.key) continue; - - const existing = this.get(resource.key); - if (existing) { - this.set(resource.key, { - ...existing, - value: existing.value + (resource.value ?? 0), - total: existing.total + (resource.total ?? 0) - }); - } else { - this.set(resource.key, resource); - } - } - } - - #getResources() { - return Array.from(this.values()); - } - - async updateResources() { - if (this.#actor) { - const target = this.#actor.system.partner ?? this.#actor; - await target.modifyResource(this.#getResources()); - } - } -} diff --git a/module/data/activeEffect/baseEffect.mjs b/module/data/activeEffect/baseEffect.mjs index ea74531d..770e3462 100644 --- a/module/data/activeEffect/baseEffect.mjs +++ b/module/data/activeEffect/baseEffect.mjs @@ -1,17 +1,3 @@ -/** -- Changes Type Priorities -- - * - Base Number - - * Custom: 0 - * Multiply: 10 - * Add: 20 - * Downgrade: 30 - * Upgrade: 40 - * Override: 50 - * - * - Changes Value Priorities - - * Standard: +0 - * "Anything that uses another data model value as its value": +1 - Effects that increase traits have to be calculated first at Base priority. (EX: Raise evasion by half your agility) - */ - export default class BaseEffect extends foundry.abstract.TypeDataModel { static defineSchema() { const fields = foundry.data.fields; diff --git a/module/data/activeEffect/beastformEffect.mjs b/module/data/activeEffect/beastformEffect.mjs index 5311b827..b5e775fc 100644 --- a/module/data/activeEffect/beastformEffect.mjs +++ b/module/data/activeEffect/beastformEffect.mjs @@ -65,38 +65,20 @@ export default class BeastformEffect extends BaseEffect { } }; - const updateToken = token => { - let x = null, - y = null; - if (token.object?.scene?.grid) { - const positionData = game.system.api.documents.DhToken.getSnappedPositionInSquareGrid( - token.object.scene.grid, - { x: token.x, y: token.y, elevation: token.elevation }, - baseUpdate.width, - baseUpdate.height - ); - - x = positionData.x; - y = positionData.y; - } - - return { - ...baseUpdate, - x, - y, - 'texture': { - enabled: this.characterTokenData.usesDynamicToken, - src: token.flags.daggerheart?.beastformTokenImg ?? this.characterTokenData.tokenImg - }, - 'ring': { - subject: { - texture: - token.flags.daggerheart?.beastformSubjectTexture ?? this.characterTokenData.tokenRingImg - } - }, - 'flags.daggerheart': { '-=beastformTokenImg': null, '-=beastformSubjectTexture': null } - }; - }; + const updateToken = token => ({ + ...baseUpdate, + 'texture': { + enabled: this.characterTokenData.usesDynamicToken, + src: token.flags.daggerheart?.beastformTokenImg ?? this.characterTokenData.tokenImg + }, + 'ring': { + subject: { + texture: + token.flags.daggerheart?.beastformSubjectTexture ?? this.characterTokenData.tokenRingImg + } + }, + 'flags.daggerheart': { '-=beastformTokenImg': null, '-=beastformSubjectTexture': null } + }); await updateActorTokens(this.parent.parent, update, updateToken); diff --git a/module/data/actor/adversary.mjs b/module/data/actor/adversary.mjs index 16e7e37a..bb8df3ee 100644 --- a/module/data/actor/adversary.mjs +++ b/module/data/actor/adversary.mjs @@ -1,6 +1,6 @@ import DHAdversarySettings from '../../applications/sheets-configs/adversary-settings.mjs'; import { ActionField } from '../fields/actionField.mjs'; -import BaseDataActor, { commonActorRules } from './base.mjs'; +import BaseDataActor from './base.mjs'; import { resourceField, bonusField } from '../fields/actorField.mjs'; export default class DhpAdversary extends BaseDataActor { @@ -11,8 +11,7 @@ export default class DhpAdversary extends BaseDataActor { label: 'TYPES.Actor.adversary', type: 'adversary', settingSheet: DHAdversarySettings, - hasAttribution: true, - usesSize: true + hasAttribution: true }); } @@ -56,11 +55,27 @@ export default class DhpAdversary extends BaseDataActor { }) }), resources: new fields.SchemaField({ - hitPoints: resourceField(0, 0, 'DAGGERHEART.GENERAL.HitPoints.plural', true), - stress: resourceField(0, 0, 'DAGGERHEART.GENERAL.stress', true) + hitPoints: resourceField( + 0, + 0, + 'DAGGERHEART.GENERAL.HitPoints.plural', + true, + game.i18n.localize('DAGGERHEART.GENERAL.max') + ), + stress: resourceField( + 0, + 0, + 'DAGGERHEART.GENERAL.stress', + true, + game.i18n.localize('DAGGERHEART.GENERAL.max') + ) }), rules: new fields.SchemaField({ - ...commonActorRules() + conditionImmunities: new fields.SchemaField({ + hidden: new fields.BooleanField({ initial: false }), + restrained: new fields.BooleanField({ initial: false }), + vulnerable: new fields.BooleanField({ initial: false }) + }) }), attack: new ActionField({ initial: { @@ -127,7 +142,7 @@ export default class DhpAdversary extends BaseDataActor { } isItemValid(source) { - return source.type === 'feature'; + return source.type === "feature"; } async _preUpdate(changes, options, user) { diff --git a/module/data/actor/base.mjs b/module/data/actor/base.mjs index b90361e2..c7f7ee75 100644 --- a/module/data/actor/base.mjs +++ b/module/data/actor/base.mjs @@ -1,24 +1,21 @@ import DHBaseActorSettings from '../../applications/sheets/api/actor-setting.mjs'; -import DHItem from '../../documents/item.mjs'; import { getScrollTextData } from '../../helpers/utils.mjs'; -const fields = foundry.data.fields; - const resistanceField = (resistanceLabel, immunityLabel, reductionLabel) => - new fields.SchemaField({ - resistance: new fields.BooleanField({ + new foundry.data.fields.SchemaField({ + resistance: new foundry.data.fields.BooleanField({ initial: false, label: `${resistanceLabel}.label`, hint: `${resistanceLabel}.hint`, isAttributeChoice: true }), - immunity: new fields.BooleanField({ + immunity: new foundry.data.fields.BooleanField({ initial: false, label: `${immunityLabel}.label`, hint: `${immunityLabel}.hint`, isAttributeChoice: true }), - reduction: new fields.NumberField({ + reduction: new foundry.data.fields.NumberField({ integer: true, initial: 0, label: `${reductionLabel}.label`, @@ -26,25 +23,6 @@ const resistanceField = (resistanceLabel, immunityLabel, reductionLabel) => }) }); -/* Common rules applying to Characters and Adversaries */ -export const commonActorRules = (extendedData = { damageReduction: {} }) => ({ - conditionImmunities: new fields.SchemaField({ - hidden: new fields.BooleanField({ initial: false }), - restrained: new fields.BooleanField({ initial: false }), - vulnerable: new fields.BooleanField({ initial: false }) - }), - damageReduction: new fields.SchemaField({ - thresholdImmunities: new fields.SchemaField({ - minor: new fields.BooleanField({ initial: false }) - }), - reduceSeverity: new fields.SchemaField({ - magical: new fields.NumberField({ initial: 0, min: 0 }), - physical: new fields.NumberField({ initial: 0, min: 0 }) - }), - ...extendedData.damageReduction - }) -}); - /** * Describes metadata about the actor data model type * @typedef {Object} ActorDataModelMetadata @@ -63,8 +41,7 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel { settingSheet: null, hasResistances: true, hasAttribution: false, - hasLimitedView: true, - usesSize: false + hasLimitedView: true }; } @@ -75,6 +52,7 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel { /** @inheritDoc */ static defineSchema() { + const fields = foundry.data.fields; const schema = {}; if (this.metadata.hasAttribution) { @@ -98,13 +76,6 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel { 'DAGGERHEART.GENERAL.DamageResistance.magicalReduction' ) }); - if (this.metadata.usesSize) - schema.size = new fields.StringField({ - required: true, - nullable: false, - choices: CONFIG.DH.ACTOR.tokenSize, - initial: CONFIG.DH.ACTOR.tokenSize.custom.id - }); return schema; } @@ -135,17 +106,6 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel { return data; } - /** - * Checks if an item is available for use, such as multiclass features being disabled - * on a character. - * - * @param {DHItem} item The item being checked for availability - * @return {boolean} whether the item is available - */ - isItemAvailable(item) { - return true; - } - async _preDelete() { /* Clear all partyMembers from tagTeam setting.*/ /* Revisit this when tagTeam is improved for many parties */ diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs index eba46f10..c5ab914c 100644 --- a/module/data/actor/character.mjs +++ b/module/data/actor/character.mjs @@ -1,7 +1,7 @@ import { burden } from '../../config/generalConfig.mjs'; import ForeignDocumentUUIDField from '../fields/foreignDocumentUUIDField.mjs'; import DhLevelData from '../levelData.mjs'; -import BaseDataActor, { commonActorRules } from './base.mjs'; +import BaseDataActor from './base.mjs'; import { attributeField, resourceField, stressDamageReductionRule, bonusField } from '../fields/actorField.mjs'; import { ActionField } from '../fields/actionField.mjs'; import DHCharacterSettings from '../../applications/sheets-configs/character-settings.mjs'; @@ -217,41 +217,44 @@ export default class DhCharacter extends BaseDataActor { }), companion: new ForeignDocumentUUIDField({ type: 'Actor', nullable: true, initial: null }), rules: new fields.SchemaField({ - ...commonActorRules({ - damageReduction: { - magical: new fields.BooleanField({ initial: false }), - physical: new fields.BooleanField({ initial: false }), - maxArmorMarked: new fields.SchemaField({ - value: new fields.NumberField({ - required: true, - integer: true, - initial: 1, - label: 'DAGGERHEART.GENERAL.Rules.damageReduction.maxArmorMarkedBonus' - }), - stressExtra: new fields.NumberField({ - required: true, - integer: true, - initial: 0, - label: 'DAGGERHEART.GENERAL.Rules.damageReduction.maxArmorMarkedStress.label', - hint: 'DAGGERHEART.GENERAL.Rules.damageReduction.maxArmorMarkedStress.hint' - }) - }), - stressDamageReduction: new fields.SchemaField({ - severe: stressDamageReductionRule( - 'DAGGERHEART.GENERAL.Rules.damageReduction.stress.severe' - ), - major: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.major'), - minor: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.minor'), - any: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.any') - }), - increasePerArmorMark: new fields.NumberField({ + damageReduction: new fields.SchemaField({ + maxArmorMarked: new fields.SchemaField({ + value: new fields.NumberField({ + required: true, integer: true, initial: 1, - label: 'DAGGERHEART.GENERAL.Rules.damageReduction.increasePerArmorMark.label', - hint: 'DAGGERHEART.GENERAL.Rules.damageReduction.increasePerArmorMark.hint' + label: 'DAGGERHEART.GENERAL.Rules.damageReduction.maxArmorMarkedBonus' }), - disabledArmor: new fields.BooleanField({ intial: false }) - } + stressExtra: new fields.NumberField({ + required: true, + integer: true, + initial: 0, + label: 'DAGGERHEART.GENERAL.Rules.damageReduction.maxArmorMarkedStress.label', + hint: 'DAGGERHEART.GENERAL.Rules.damageReduction.maxArmorMarkedStress.hint' + }) + }), + stressDamageReduction: new fields.SchemaField({ + severe: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.severe'), + major: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.major'), + minor: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.minor'), + any: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.any') + }), + increasePerArmorMark: new fields.NumberField({ + integer: true, + initial: 1, + label: 'DAGGERHEART.GENERAL.Rules.damageReduction.increasePerArmorMark.label', + hint: 'DAGGERHEART.GENERAL.Rules.damageReduction.increasePerArmorMark.hint' + }), + magical: new fields.BooleanField({ initial: false }), + physical: new fields.BooleanField({ initial: false }), + thresholdImmunities: new fields.SchemaField({ + minor: new fields.BooleanField({ initial: false }) + }), + reduceSeverity: new fields.SchemaField({ + magical: new fields.NumberField({ initial: 0, min: 0 }), + physical: new fields.NumberField({ initial: 0, min: 0 }) + }), + disabledArmor: new fields.BooleanField({ intial: false }) }), attack: new fields.SchemaField({ damage: new fields.SchemaField({ @@ -280,6 +283,11 @@ export default class DhCharacter extends BaseDataActor { }) }) }), + conditionImmunities: new fields.SchemaField({ + hidden: new fields.BooleanField({ initial: false }), + restrained: new fields.BooleanField({ initial: false }), + vulnerable: new fields.BooleanField({ initial: false }) + }), runeWard: new fields.BooleanField({ initial: false }), burden: new fields.SchemaField({ ignore: new fields.BooleanField() @@ -427,33 +435,6 @@ export default class DhCharacter extends BaseDataActor { return attack; } - /** @inheritDoc */ - isItemAvailable(item) { - if (!super.isItemAvailable(this)) return false; - /** - * Preventing subclass features from being available if the chacaracter does not - * have the right subclass advancement - */ - if (item.system.originItemType !== CONFIG.DH.ITEM.featureTypes.subclass.id) { - return true; - } - if (!this.class.subclass) return false; - - const prop = item.system.multiclassOrigin ? 'multiclass' : 'class'; - const subclassState = this[prop].subclass?.system?.featureState; - if (!subclassState) return false; - - if ( - item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.foundation || - (item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.specialization && subclassState >= 2) || - (item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.mastery && subclassState >= 3) - ) { - return true; - } else { - return false; - } - } - get sheetLists() { const ancestryFeatures = [], communityFeatures = [], @@ -462,7 +443,7 @@ export default class DhCharacter extends BaseDataActor { companionFeatures = [], features = []; - for (let item of this.parent.items.filter(x => this.isItemAvailable(x))) { + for (let item of this.parent.items) { if (item.system.originItemType === CONFIG.DH.ITEM.featureTypes.ancestry.id) { ancestryFeatures.push(item); } else if (item.system.originItemType === CONFIG.DH.ITEM.featureTypes.community.id) { @@ -470,7 +451,20 @@ export default class DhCharacter extends BaseDataActor { } else if (item.system.originItemType === CONFIG.DH.ITEM.featureTypes.class.id) { classFeatures.push(item); } else if (item.system.originItemType === CONFIG.DH.ITEM.featureTypes.subclass.id) { - subclassFeatures.push(item); + if (this.class.subclass) { + const prop = item.system.multiclassOrigin ? 'multiclass' : 'class'; + const subclassState = this[prop].subclass?.system?.featureState; + if (!subclassState) continue; + + if ( + item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.foundation || + (item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.specialization && + subclassState >= 2) || + (item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.mastery && subclassState >= 3) + ) { + subclassFeatures.push(item); + } + } } else if (item.system.originItemType === CONFIG.DH.ITEM.featureTypes.companion.id) { companionFeatures.push(item); } else if (item.type === 'feature' && !item.system.type) { diff --git a/module/data/actor/party.mjs b/module/data/actor/party.mjs index 236d65db..b306c486 100644 --- a/module/data/actor/party.mjs +++ b/module/data/actor/party.mjs @@ -26,7 +26,7 @@ export default class DhParty extends BaseDataActor { /* -------------------------------------------- */ isItemValid(source) { - return ['weapon', 'armor', 'consumable', 'loot'].includes(source.type); + return ["weapon", "armor", "consumable", "loot"].includes(source.type); } prepareBaseData() { diff --git a/module/data/combat.mjs b/module/data/combat.mjs index 3671a2cd..565afffc 100644 --- a/module/data/combat.mjs +++ b/module/data/combat.mjs @@ -15,9 +15,8 @@ export default class DhCombat extends foundry.abstract.TypeDataModel { get extendedBattleToggles() { const modifiers = CONFIG.DH.ENCOUNTER.BPModifiers; const adversaries = - this.parent.turns?.filter(x => x.actor && x.isNPC)?.map(x => ({ ...x.actor, type: x.actor.system.type })) ?? - []; - const characters = this.parent.turns?.filter(x => x.actor && !x.isNPC) ?? []; + this.parent.turns?.filter(x => x.isNPC)?.map(x => ({ ...x.actor, type: x.actor.system.type })) ?? []; + const characters = this.parent.turns?.filter(x => !x.isNPC) ?? []; const activeAutomatic = Object.keys(modifiers).reduce((acc, categoryKey) => { const category = modifiers[categoryKey]; diff --git a/module/data/fields/action/beastformField.mjs b/module/data/fields/action/beastformField.mjs index e19807c7..6ec5fdac 100644 --- a/module/data/fields/action/beastformField.mjs +++ b/module/data/fields/action/beastformField.mjs @@ -76,7 +76,7 @@ export default class BeastformField extends fields.SchemaField { * @returns */ static async transform(selectedForm, evolvedData, hybridData) { - const formData = evolvedData?.form ?? selectedForm; + const formData = evolvedData?.form ? evolvedData.form.toObject() : selectedForm; const beastformEffect = formData.effects.find(x => x.type === 'beastform'); if (!beastformEffect) { ui.notifications.error('DAGGERHEART.UI.Notifications.beastformMissingEffect'); @@ -92,18 +92,6 @@ export default class BeastformField extends fields.SchemaField { beastformEffect.changes = [...beastformEffect.changes, ...evolvedForm.changes]; formData.system.features = [...formData.system.features, ...selectedForm.system.features.map(x => x.uuid)]; - - const baseSize = evolvedData.form.system.tokenSize.size; - const evolvedSize = - baseSize === 'custom' - ? 'custom' - : (Object.keys(CONFIG.DH.ACTOR.tokenSize).find( - x => CONFIG.DH.ACTOR.tokenSize[x].value === CONFIG.DH.ACTOR.tokenSize[baseSize].value + 1 - ) ?? baseSize); - formData.system.tokenSize = { - ...evolvedData.form.system.tokenSize, - size: evolvedSize - }; } if (selectedForm.system.beastformType === CONFIG.DH.ITEM.beastformTypes.hybrid.id) { diff --git a/module/data/fields/action/costField.mjs b/module/data/fields/action/costField.mjs index 9271f6b0..656edee3 100644 --- a/module/data/fields/action/costField.mjs +++ b/module/data/fields/action/costField.mjs @@ -75,7 +75,7 @@ export default class CostField extends fields.ArrayField { } }, []); - config.resourceUpdates.addResources(resources); + await actor.modifyResource(resources); } /** diff --git a/module/data/fields/action/saveField.mjs b/module/data/fields/action/saveField.mjs index c9030036..473286b1 100644 --- a/module/data/fields/action/saveField.mjs +++ b/module/data/fields/action/saveField.mjs @@ -124,21 +124,29 @@ export default class SaveField extends fields.SchemaField { */ static async updateSaveMessage(result, message, targetId) { if (!result) return; - - const chatMessage = ui.chat.collection.get(message._id), - changes = { - flags: { - [game.system.id]: { - reactionRolls: { - [targetId]: { - result: result.roll.total, - success: result.roll.success + const updateMsg = async function (message, targetId, result) { + // setTimeout(async () => { + const chatMessage = ui.chat.collection.get(message._id), + changes = { + flags: { + [game.system.id]: { + reactionRolls: { + [targetId]: { + result: result.roll.total, + success: result.roll.success + } } } } - } - }; - await chatMessage.update(changes); + }; + await chatMessage.update(changes); + // }, 100); + }; + if (game.modules.get('dice-so-nice')?.active) + game.dice3d + .waitFor3DAnimationByMessageID(result.message.id ?? result.message._id) + .then(async () => await updateMsg(message, targetId, result)); + else await updateMsg(message, targetId, result); } /** diff --git a/module/data/fields/action/targetField.mjs b/module/data/fields/action/targetField.mjs index 3a4f12df..41383fea 100644 --- a/module/data/fields/action/targetField.mjs +++ b/module/data/fields/action/targetField.mjs @@ -25,12 +25,9 @@ export default class TargetField extends fields.SchemaField { config.hasTarget = true; let targets; // If the Action is configured as self-targeted, set targets as the owner. Probably better way than to fallback to getDependentTokens - if (this.target?.type === CONFIG.DH.GENERAL.targetTypes.self.id) { + if (this.target?.type === CONFIG.DH.GENERAL.targetTypes.self.id) targets = [this.actor.token ?? this.actor.prototypeToken]; - } else if (config.targetUuid) { - const actor = fromUuidSync(config.targetUuid); - targets = [actor.token ?? actor.prototypeToken]; - } else { + else { targets = Array.from(game.user.targets); if (this.target.type !== CONFIG.DH.GENERAL.targetTypes.any.id) { targets = targets.filter(target => TargetField.isTargetFriendly(this.actor, target, this.target.type)); @@ -82,7 +79,7 @@ export default class TargetField extends fields.SchemaField { return { id: token.id, actorId: token.actor.uuid, - name: token.name, + name: token.actor.name, img: token.actor.img, difficulty: token.actor.system.difficulty, evasion: token.actor.system.evasion, diff --git a/module/data/fields/actionField.mjs b/module/data/fields/actionField.mjs index d0d04721..8661f500 100644 --- a/module/data/fields/actionField.mjs +++ b/module/data/fields/actionField.mjs @@ -141,12 +141,6 @@ export function ActionMixin(Base) { return this.documentName; } - //Getter for icons - get typeIcon() { - const config = CONFIG.DH.ACTIONS.actionTypes[this.type]; - return config?.icon || 'fa-question'; // Fallback icon just in case - } - get relativeUUID() { return `.Item.${this.item.id}.Action.${this.id}`; } @@ -262,7 +256,7 @@ export function ActionMixin(Base) { async toChat(origin) { const cls = getDocumentClass('ChatMessage'); const systemData = { - title: game.i18n.localize('DAGGERHEART.CONFIG.FeatureForm.action'), + title: game.i18n.localize('DAGGERHEART.CONFIG.ActionType.action'), origin: origin, action: { name: this.name, @@ -272,17 +266,12 @@ export function ActionMixin(Base) { itemOrigin: this.item, description: this.description || (this.item instanceof Item ? this.item.system.description : '') }; - - const speaker = cls.getSpeaker(); const msg = { type: 'abilityUse', user: game.user.id, actor: { name: this.actor.name, img: this.actor.img }, author: this.author, - speaker: { - speaker, - actor: speaker.actor ?? this.actor - }, + speaker: cls.getSpeaker(), title: game.i18n.localize('DAGGERHEART.UI.Chat.action.title'), system: systemData, content: await foundry.applications.handlebars.renderTemplate( diff --git a/module/data/item/beastform.mjs b/module/data/item/beastform.mjs index 1840e26a..51ca298d 100644 --- a/module/data/item/beastform.mjs +++ b/module/data/item/beastform.mjs @@ -43,12 +43,6 @@ export default class DHBeastform extends BaseDataItem { base64: false }), tokenSize: new fields.SchemaField({ - size: new fields.StringField({ - required: true, - nullable: false, - choices: CONFIG.DH.ACTOR.tokenSize, - initial: CONFIG.DH.ACTOR.tokenSize.custom.id - }), height: new fields.NumberField({ integer: true, min: 1, initial: null, nullable: true }), width: new fields.NumberField({ integer: true, min: 1, initial: null, nullable: true }) }), @@ -196,18 +190,9 @@ export default class DHBeastform extends BaseDataItem { await this.parent.parent.createEmbeddedDocuments('ActiveEffect', [beastformEffect.toObject()]); - const autoTokenSize = - this.tokenSize.size !== 'custom' - ? game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).tokenSizes[ - this.tokenSize.size - ] - : null; - const width = autoTokenSize ?? this.tokenSize.width; - const height = autoTokenSize ?? this.tokenSize.height; - const prototypeTokenUpdate = { - height, - width, + height: this.tokenSize.height, + width: this.tokenSize.width, texture: { src: this.tokenImg }, @@ -217,33 +202,16 @@ export default class DHBeastform extends BaseDataItem { } } }; - const tokenUpdate = token => { - let x = null, - y = null; - if (token.object?.scene?.grid) { - const positionData = game.system.api.documents.DhToken.getSnappedPositionInSquareGrid( - token.object.scene.grid, - { x: token.x, y: token.y, elevation: token.elevation }, - width ?? token.width, - height ?? token.height - ); - x = positionData.x; - y = positionData.y; - } - - return { - ...prototypeTokenUpdate, - x, - y, - flags: { - daggerheart: { - beastformTokenImg: token.texture.src, - beastformSubjectTexture: token.ring.subject.texture - } + const tokenUpdate = token => ({ + ...prototypeTokenUpdate, + flags: { + daggerheart: { + beastformTokenImg: token.texture.src, + beastformSubjectTexture: token.ring.subject.texture } - }; - }; + } + }); await updateActorTokens(this.parent.parent, prototypeTokenUpdate, tokenUpdate); diff --git a/module/data/item/feature.mjs b/module/data/item/feature.mjs index cb01b1fb..3b8fe064 100644 --- a/module/data/item/feature.mjs +++ b/module/data/item/feature.mjs @@ -30,13 +30,7 @@ export default class DHFeature extends BaseDataItem { initial: null }), multiclassOrigin: new fields.BooleanField({ initial: false }), - identifier: new fields.StringField(), - featureForm: new fields.StringField({ - required: true, - initial: 'passive', - choices: CONFIG.DH.ITEM.featureForm, - label: 'DAGGERHEART.CONFIG.FeatureForm.label' - }) + identifier: new fields.StringField() }; } } diff --git a/module/data/settings/Homebrew.mjs b/module/data/settings/Homebrew.mjs index 7572c9ea..ead3c962 100644 --- a/module/data/settings/Homebrew.mjs +++ b/module/data/settings/Homebrew.mjs @@ -1,15 +1,14 @@ import { defaultRestOptions } from '../../config/generalConfig.mjs'; import { ActionsField } from '../fields/actionField.mjs'; -const currencyField = (initial, label, icon) => +const currencyField = (initial, label) => new foundry.data.fields.SchemaField({ enabled: new foundry.data.fields.BooleanField({ required: true, initial: true }), label: new foundry.data.fields.StringField({ required: true, initial, label - }), - icon: new foundry.data.fields.StringField({ required: true, nullable: false, blank: true, initial: icon }) + }) }); export default class DhHomebrew extends foundry.abstract.DataModel { @@ -40,60 +39,16 @@ export default class DhHomebrew extends foundry.abstract.DataModel { traitArray: new fields.ArrayField(new fields.NumberField({ required: true, integer: true }), { initial: () => [2, 1, 1, 0, 0, -1] }), - tokenSizes: new fields.SchemaField({ - tiny: new fields.NumberField({ - integer: false, - initial: 0.5, - label: 'DAGGERHEART.CONFIG.TokenSize.tiny' - }), - small: new fields.NumberField({ - integer: false, - initial: 0.8, - label: 'DAGGERHEART.CONFIG.TokenSize.small' - }), - medium: new fields.NumberField({ - integer: false, - initial: 1, - label: 'DAGGERHEART.CONFIG.TokenSize.medium' - }), - large: new fields.NumberField({ - integer: false, - initial: 2, - label: 'DAGGERHEART.CONFIG.TokenSize.large' - }), - huge: new fields.NumberField({ - integer: false, - initial: 3, - label: 'DAGGERHEART.CONFIG.TokenSize.huge' - }), - gargantuan: new fields.NumberField({ - integer: false, - initial: 4, - label: 'DAGGERHEART.CONFIG.TokenSize.gargantuan' - }) - }), currency: new fields.SchemaField({ title: new fields.StringField({ required: true, initial: 'Gold', label: 'DAGGERHEART.SETTINGS.Homebrew.currency.currencyName' }), - coins: currencyField( - 'Coins', - 'DAGGERHEART.SETTINGS.Homebrew.currency.coinName', - 'fa-solid fa-coin-front' - ), - handfuls: currencyField( - 'Handfuls', - 'DAGGERHEART.SETTINGS.Homebrew.currency.handfulName', - 'fa-solid fa-coins' - ), - bags: currencyField('Bags', 'DAGGERHEART.SETTINGS.Homebrew.currency.bagName', 'fa-solid fa-sack'), - chests: currencyField( - 'Chests', - 'DAGGERHEART.SETTINGS.Homebrew.currency.chestName', - 'fa-solid fa-treasure-chest' - ) + coins: currencyField('Coins', 'DAGGERHEART.SETTINGS.Homebrew.currency.coinName'), + handfuls: currencyField('Handfuls', 'DAGGERHEART.SETTINGS.Homebrew.currency.handfulName'), + bags: currencyField('Bags', 'DAGGERHEART.SETTINGS.Homebrew.currency.bagName'), + chests: currencyField('Chests', 'DAGGERHEART.SETTINGS.Homebrew.currency.chestName') }), restMoves: new fields.SchemaField({ longRest: new fields.SchemaField({ @@ -184,10 +139,22 @@ export default class DhHomebrew extends foundry.abstract.DataModel { /** @inheritDoc */ _initializeSource(source, options = {}) { source = super._initializeSource(source, options); - for (const type of ['coins', 'handfuls', 'bags', 'chests']) { - const initial = this.schema.fields.currency.fields[type].getInitialValue(); - source.currency[type] = foundry.utils.mergeObject(initial, source.currency[type], { inplace: false }); - } + source.currency.coins = { + enabled: source.currency.coins.enabled ?? true, + label: source.currency.coins.label || source.currency.coins + }; + source.currency.handfuls = { + enabled: source.currency.handfuls.enabled ?? true, + label: source.currency.handfuls.label || source.currency.handfuls + }; + source.currency.bags = { + enabled: source.currency.bags.enabled ?? true, + label: source.currency.bags.label || source.currency.bags + }; + source.currency.chests = { + enabled: source.currency.chests.enabled ?? true, + label: source.currency.chests.label || source.currency.chests + }; return source; } } diff --git a/module/data/settings/VariantRules.mjs b/module/data/settings/VariantRules.mjs index 41c63be2..ad7d707a 100644 --- a/module/data/settings/VariantRules.mjs +++ b/module/data/settings/VariantRules.mjs @@ -39,13 +39,6 @@ export default class DhVariantRules extends foundry.abstract.DataModel { label: 'DAGGERHEART.CONFIG.Range.close.name' }), far: new fields.NumberField({ required: true, initial: 60, label: 'DAGGERHEART.CONFIG.Range.far.name' }) - }), - massiveDamage: new fields.SchemaField({ - enabled: new fields.BooleanField({ - required: true, - initial: false, - label: 'DAGGERHEART.SETTINGS.VariantRules.FIELDS.massiveDamage.enabled.label' - }) }) }; } diff --git a/module/dice/d20Roll.mjs b/module/dice/d20Roll.mjs index 0256f281..387123c4 100644 --- a/module/dice/d20Roll.mjs +++ b/module/dice/d20Roll.mjs @@ -98,10 +98,10 @@ export default class D20Roll extends DHRoll { this.options.roll.modifiers = this.applyBaseBonus(); this.options.experiences?.forEach(m => { - if (this.options.data.system?.experiences?.[m]) + if (this.options.data.experiences?.[m]) this.options.roll.modifiers.push({ - label: this.options.data.system.experiences[m].name, - value: this.options.data.system.experiences[m].value + label: this.options.data.experiences[m].name, + value: this.options.data.experiences[m].value }); }); diff --git a/module/dice/dhRoll.mjs b/module/dice/dhRoll.mjs index ea24f238..e6856dab 100644 --- a/module/dice/dhRoll.mjs +++ b/module/dice/dhRoll.mjs @@ -236,3 +236,67 @@ export default class DHRoll extends Roll { return {}; } } + +export const registerRollDiceHooks = () => { + Hooks.on(`${CONFIG.DH.id}.postRollDuality`, async (config, message) => { + const automationSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation); + if ( + automationSettings.countdownAutomation && + config.actionType !== CONFIG.DH.ITEM.actionTypes.reaction.id && + !config.tagTeamSelected && + !config.skips?.updateCountdowns + ) { + const { updateCountdowns } = game.system.api.applications.ui.DhCountdowns; + await updateCountdowns(CONFIG.DH.GENERAL.countdownProgressionTypes.actionRoll.id); + + if (config.roll.result.duality === -1) { + await updateCountdowns(CONFIG.DH.GENERAL.countdownProgressionTypes.fear.id); + } + } + + const hopeFearAutomation = automationSettings.hopeFear; + if ( + !config.source?.actor || + (game.user.isGM ? !hopeFearAutomation.gm : !hopeFearAutomation.players) || + config.actionType === 'reaction' || + config.tagTeamSelected || + config.skips?.resources + ) + return; + const actor = await fromUuid(config.source.actor); + let updates = []; + if (!actor) return; + if (config.roll.isCritical || config.roll.result.duality === 1) + updates.push({ key: 'hope', value: 1, total: -1, enabled: true }); + if (config.roll.isCritical) updates.push({ key: 'stress', value: 1, total: -1, enabled: true }); + if (config.roll.result.duality === -1) updates.push({ key: 'fear', value: 1, total: -1, enabled: true }); + + if (config.rerolledRoll) { + if (config.rerolledRoll.isCritical || config.rerolledRoll.result.duality === 1) + updates.push({ key: 'hope', value: -1, total: 1, enabled: true }); + if (config.rerolledRoll.isCritical) updates.push({ key: 'stress', value: -1, total: 1, enabled: true }); + if (config.rerolledRoll.result.duality === -1) + updates.push({ key: 'fear', value: -1, total: 1, enabled: true }); + } + + if (updates.length) { + const target = actor.system.partner ?? actor; + if (!['dead', 'defeated', 'unconscious'].some(x => actor.statuses.has(x))) { + if (config.rerolledRoll) target.modifyResource(updates); + else config.costs = [...(config.costs ?? []), ...updates]; + } + } + + if (!config.roll.hasOwnProperty('success') && !config.targets?.length) return; + + const rollResult = config.roll.success || config.targets.some(t => t.hit), + looseSpotlight = !rollResult || config.roll.result.duality === -1; + + if (looseSpotlight && game.combat?.active) { + const currentCombatant = game.combat.combatants.get(game.combat.current?.combatantId); + if (currentCombatant?.actorId == actor.id) ui.combat.setCombatantSpotlight(currentCombatant.id); + } + + return; + }); +}; diff --git a/module/dice/dualityRoll.mjs b/module/dice/dualityRoll.mjs index d2e20213..813c913b 100644 --- a/module/dice/dualityRoll.mjs +++ b/module/dice/dualityRoll.mjs @@ -2,7 +2,6 @@ import D20RollDialog from '../applications/dialogs/d20RollDialog.mjs'; import D20Roll from './d20Roll.mjs'; import { setDiceSoNiceForDualityRoll } from '../helpers/utils.mjs'; import { getDiceSoNicePresets } from '../config/generalConfig.mjs'; -import { ResourceUpdateMap } from '../data/action/baseAction.mjs'; export default class DualityRoll extends D20Roll { _advantageFaces = 6; @@ -20,7 +19,7 @@ export default class DualityRoll extends D20Roll { get title() { return game.i18n.localize( - `DAGGERHEART.GENERAL.${this.options?.actionType === 'reaction' ? 'reactionRoll' : 'dualityRoll'}` + `DAGGERHEART.GENERAL.${this.options?.actionType === CONFIG.DH.ITEM.actionTypes.reaction.id ? 'reactionRoll' : 'dualityRoll'}` ); } @@ -220,88 +219,6 @@ export default class DualityRoll extends D20Roll { return data; } - static async buildPost(roll, config, message) { - await super.buildPost(roll, config, message); - - await DualityRoll.dualityUpdate(config); - } - - static async addDualityResourceUpdates(config) { - const automationSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation); - const hopeFearAutomation = automationSettings.hopeFear; - if ( - !config.source?.actor || - (game.user.isGM ? !hopeFearAutomation.gm : !hopeFearAutomation.players) || - config.actionType === 'reaction' || - config.tagTeamSelected || - config.skips?.resources - ) - return; - const actor = await fromUuid(config.source.actor); - let updates = []; - if (!actor) return; - - if (config.rerolledRoll) { - if (config.roll.result.duality != config.rerolledRoll.result.duality) { - const hope = - (config.roll.isCritical || config.roll.result.duality === 1 ? 1 : 0) - - (config.rerolledRoll.isCritical || config.rerolledRoll.result.duality === 1 ? 1 : 0); - const stress = (config.roll.isCritical ? 1 : 0) - (config.rerolledRoll.isCritical ? 1 : 0); - const fear = - (config.roll.result.duality === -1 ? 1 : 0) - (config.rerolledRoll.result.duality === -1 ? 1 : 0); - - if (hope !== 0) updates.push({ key: 'hope', value: hope, total: -1 * hope, enabled: true }); - if (stress !== 0) updates.push({ key: 'stress', value: -1 * stress, total: stress, enabled: true }); - if (fear !== 0) updates.push({ key: 'fear', value: fear, total: -1 * fear, enabled: true }); - } - } else { - if (config.roll.isCritical || config.roll.result.duality === 1) - updates.push({ key: 'hope', value: 1, total: -1, enabled: true }); - if (config.roll.isCritical) updates.push({ key: 'stress', value: -1, total: 1, enabled: true }); - if (config.roll.result.duality === -1) updates.push({ key: 'fear', value: 1, total: -1, enabled: true }); - } - - if (updates.length) { - // const target = actor.system.partner ?? actor; - if (!['dead', 'defeated', 'unconscious'].some(x => actor.statuses.has(x))) { - config.resourceUpdates.addResources(updates); - } - } - } - - static async dualityUpdate(config) { - const automationSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation); - if ( - automationSettings.countdownAutomation && - config.actionType !== 'reaction' && - !config.tagTeamSelected && - !config.skips?.updateCountdowns - ) { - const { updateCountdowns } = game.system.api.applications.ui.DhCountdowns; - - if (config.roll.result.duality === -1) { - await updateCountdowns( - CONFIG.DH.GENERAL.countdownProgressionTypes.actionRoll.id, - CONFIG.DH.GENERAL.countdownProgressionTypes.fear.id - ); - } else { - await updateCountdowns(CONFIG.DH.GENERAL.countdownProgressionTypes.actionRoll.id); - } - } - - await DualityRoll.addDualityResourceUpdates(config); - - if (!config.roll.hasOwnProperty('success') && !config.targets?.length) return; - - const rollResult = config.roll.success || config.targets?.some(t => t.hit), - looseSpotlight = !rollResult || config.roll.result.duality === -1; - - if (looseSpotlight && game.combat?.active) { - const currentCombatant = game.combat.combatants.get(game.combat.current?.combatantId); - if (currentCombatant?.actorId == config.data.id) ui.combat.setCombatantSpotlight(currentCombatant.id); - } - } - static async reroll(rollString, target, message) { let parsedRoll = game.system.api.dice.DualityRoll.fromData({ ...rollString, evaluated: false }); const term = parsedRoll.terms[target.dataset.dieIndex]; @@ -340,20 +257,14 @@ export default class DualityRoll extends D20Roll { newRoll.extra = newRoll.extra.slice(2); const tagTeamSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll); - - const actor = message.system.source.actor ? await foundry.utils.fromUuid(message.system.source.actor) : null; - const config = { + Hooks.call(`${CONFIG.DH.id}.postRollDuality`, { source: { actor: message.system.source.actor ?? '' }, targets: message.system.targets, tagTeamSelected: Object.values(tagTeamSettings.members).some(x => x.messageId === message._id), roll: newRoll, - rerolledRoll: message.system.roll, - resourceUpdates: new ResourceUpdateMap(actor) - }; - - await DualityRoll.addDualityResourceUpdates(config); - await config.resourceUpdates.updateResources(); - + rerolledRoll: + newRoll.result.duality !== message.system.roll.result.duality ? message.system.roll : undefined + }); return { newRoll, parsedRoll }; } } diff --git a/module/documents/_module.mjs b/module/documents/_module.mjs index 22718bea..af1e9942 100644 --- a/module/documents/_module.mjs +++ b/module/documents/_module.mjs @@ -4,7 +4,6 @@ export { default as DhpCombat } from './combat.mjs'; export { default as DHCombatant } from './combatant.mjs'; export { default as DhActiveEffect } from './activeEffect.mjs'; export { default as DhChatMessage } from './chatMessage.mjs'; -export { default as DhScene } from './scene.mjs'; export { default as DhToken } from './token.mjs'; export { default as DhTooltipManager } from './tooltipManager.mjs'; export { default as DhTemplateManager } from './templateManager.mjs'; diff --git a/module/documents/activeEffect.mjs b/module/documents/activeEffect.mjs index 2297ea27..fcf1d590 100644 --- a/module/documents/activeEffect.mjs +++ b/module/documents/activeEffect.mjs @@ -194,10 +194,27 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect { } prepareDerivedData() { - /* Check for item availability such as in the case of subclass advancement. */ - if (this.parent?.parent?.system?.isItemAvailable) { - if (!this.parent.parent.system.isItemAvailable(this.parent)) { - this.transfer = false; + /* Preventing subclass features from transferring to actor if they do not have the right subclass advancement */ + if (this.parent?.type === 'feature') { + const origSubclassParent = this.parent.system.originItemType === 'subclass'; + if (origSubclassParent) { + const subclass = this.parent.parent.items.find( + x => + x.type === 'subclass' && + x.system.isMulticlass === (this.parent.system.identifier === 'multiclass') + ); + + if (subclass) { + const featureState = subclass.system.featureState; + + if ( + (this.parent.system.identifier === CONFIG.DH.ITEM.featureSubTypes.specialization && + featureState < 2) || + (this.parent.system.identifier === CONFIG.DH.ITEM.featureSubTypes.mastery && featureState < 3) + ) { + this.transfer = false; + } + } } } } diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index f6666a5e..20339375 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -1,9 +1,8 @@ import { emitAsGM, GMUpdateEvent } from '../systemRegistration/socket.mjs'; import { LevelOptionType } from '../data/levelTier.mjs'; import DHFeature from '../data/item/feature.mjs'; -import { createScrollText, damageKeyToNumber, getDamageKey } from '../helpers/utils.mjs'; +import { createScrollText, damageKeyToNumber } from '../helpers/utils.mjs'; import DhCompanionLevelUp from '../applications/levelup/companionLevelup.mjs'; -import { ResourceUpdateMap } from '../data/action/baseAction.mjs'; export default class DhpActor extends Actor { parties = new Set(); @@ -74,27 +73,16 @@ export default class DhpActor extends Actor { /**@inheritdoc */ async _preCreate(data, options, user) { if ((await super._preCreate(data, options, user)) === false) return false; - const update = {}; - - // Set default token size. Done here as we do not want to set a datamodel default, since that would apply the sizing to third party actor modules that aren't set up with the size system. - if (this.system.metadata.usesSize && !data.system?.size) { - Object.assign(update, { - system: { - size: CONFIG.DH.ACTOR.tokenSize.medium.id - } - }); - } // Configure prototype token settings + const prototypeToken = {}; if (['character', 'companion', 'party'].includes(this.type)) - Object.assign(update, { - prototypeToken: { - sight: { enabled: true }, - actorLink: true, - disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY - } + Object.assign(prototypeToken, { + sight: { enabled: true }, + actorLink: true, + disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY }); - this.updateSource(update); + this.updateSource({ prototypeToken }); } _onUpdate(changes, options, userId) { @@ -489,7 +477,6 @@ export default class DhpActor extends Actor { async diceRoll(config) { config.source = { ...(config.source ?? {}), actor: this.uuid }; config.data = this.getRollData(); - config.resourceUpdates = new ResourceUpdateMap(this); const rollClass = config.roll.lite ? CONFIG.Dice.daggerheart['DHRoll'] : this.rollClass; return await rollClass.build(config); } @@ -539,11 +526,7 @@ export default class DhpActor extends Actor { /**@inheritdoc */ getRollData() { - const rollData = foundry.utils.deepClone(super.getRollData()); - /* system gets repeated infinately which causes issues when trying to use the data for document creation */ - delete rollData.system; - - rollData.id = this.id; + const rollData = super.getRollData(); rollData.name = this.name; rollData.system = this.system.getRollData(); rollData.prof = this.system.proficiency ?? 1; @@ -631,19 +614,6 @@ export default class DhpActor extends Actor { } } } - if (this.type === 'adversary') { - const reducedSeverity = hpDamage.damageTypes.reduce((value, curr) => { - return Math.max(this.system.rules.damageReduction.reduceSeverity[curr], value); - }, 0); - hpDamage.value = Math.max(hpDamage.value - reducedSeverity, 0); - - if ( - hpDamage.value && - this.system.rules.damageReduction.thresholdImmunities[getDamageKey(hpDamage.value)] - ) { - hpDamage.value -= 1; - } - } } updates.forEach( @@ -709,10 +679,6 @@ export default class DhpActor extends Actor { return updates; } - /** - * Resources are modified asynchronously, so be careful not to update the same resource in - * quick succession. - */ async modifyResource(resources) { if (!resources?.length) return; @@ -795,11 +761,6 @@ export default class DhpActor extends Actor { } convertDamageToThreshold(damage) { - const massiveDamageEnabled = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules) - .massiveDamage.enabled; - if (massiveDamageEnabled && damage >= this.system.damageThresholds.severe * 2) { - return 4; - } return damage >= this.system.damageThresholds.severe ? 3 : damage >= this.system.damageThresholds.major ? 2 : 1; } @@ -893,7 +854,7 @@ export default class DhpActor extends Actor { acc.push(effect); const currentStatusActiveEffects = acc.filter( - x => x.statuses.size === 1 && x.name === game.i18n.localize(statusMap.get(x.statuses.first())?.name) + x => x.statuses.size === 1 && x.name === game.i18n.localize(statusMap.get(x.statuses.first()).name) ); for (var status of effect.statuses) { diff --git a/module/documents/combat.mjs b/module/documents/combat.mjs index 20996b77..01cbee61 100644 --- a/module/documents/combat.mjs +++ b/module/documents/combat.mjs @@ -28,7 +28,6 @@ export default class DhpCombat extends Combat { ...effect, name: game.i18n.localize(effect.name), description: game.i18n.localize(effect.description), - effectTargetTypes: grouping.effectTargetTypes ?? [], flags: { [`${CONFIG.DH.id}.${CONFIG.DH.FLAGS.combatToggle}`]: { category: toggle.category, @@ -46,7 +45,11 @@ export default class DhpCombat extends Combat { for (let actor of actors) { await actor.createEmbeddedDocuments( 'ActiveEffect', - effects.filter(x => x.effectTargetTypes.includes(actor.type)) + effects.map(effect => ({ + ...effect, + name: game.i18n.localize(effect.name), + description: game.i18n.localize(effect.description) + })) ); } } else { diff --git a/module/documents/scene.mjs b/module/documents/scene.mjs deleted file mode 100644 index c6cdd2c2..00000000 --- a/module/documents/scene.mjs +++ /dev/null @@ -1,40 +0,0 @@ -import DHToken from './token.mjs'; - -export default class DhScene extends Scene { - /** A map of `TokenDocument` IDs embedded in this scene long with new dimensions from actor size-category changes */ - #sizeSyncBatch = new Map(); - - /** Synchronize a token's dimensions with its actor's size category. */ - syncTokenDimensions(tokenDoc, tokenSize) { - if (!tokenDoc.parent?.tokens.has(tokenDoc.id)) return; - const prototype = tokenDoc.actor?.prototypeToken ?? tokenDoc; - this.#sizeSyncBatch.set(tokenDoc.id, { - size: tokenSize, - prototypeSize: { width: prototype.width, height: prototype.height }, - position: { x: tokenDoc.x, y: tokenDoc.y, elevation: tokenDoc.elevation } - }); - this.#processSyncBatch(); - } - - /** Retrieve size and clear size-sync batch, make updates. */ - #processSyncBatch = foundry.utils.debounce(() => { - const tokenSizes = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).tokenSizes; - const entries = this.#sizeSyncBatch - .entries() - .toArray() - .map(([_id, { size, prototypeSize, position }]) => { - const tokenSize = tokenSizes[size]; - const width = size !== CONFIG.DH.ACTOR.tokenSize.custom.id ? tokenSize : prototypeSize.width; - const height = size !== CONFIG.DH.ACTOR.tokenSize.custom.id ? tokenSize : prototypeSize.height; - const updatedPosition = DHToken.getSnappedPositionInSquareGrid(this.grid, position, width, height); - return { - _id, - width, - height, - ...updatedPosition - }; - }); - this.#sizeSyncBatch.clear(); - this.updateEmbeddedDocuments('Token', entries, { animation: { movementSpeed: 1.5 } }); - }, 0); -} diff --git a/module/documents/token.mjs b/module/documents/token.mjs index 4ac29264..6996708b 100644 --- a/module/documents/token.mjs +++ b/module/documents/token.mjs @@ -1,4 +1,4 @@ -export default class DHToken extends CONFIG.Token.documentClass { +export default class DHToken extends TokenDocument { /** * Inspect the Actor data model and identify the set of attributes which could be used for a Token Bar. * @param {object} attributes The tracked attributes which can be chosen from @@ -83,7 +83,7 @@ export default class DHToken extends CONFIG.Token.documentClass { if (combat?.system?.battleToggles?.length) { await combat.toggleModifierEffects( true, - tokens.filter(x => x.actor).map(x => x.actor) + tokens.map(x => x.actor) ); } super.createCombatants(tokens, combat ?? {}); @@ -95,445 +95,9 @@ export default class DHToken extends CONFIG.Token.documentClass { if (combat?.system?.battleToggles?.length) { await combat.toggleModifierEffects( false, - tokens.filter(x => x.actor).map(x => x.actor) + tokens.map(x => x.actor) ); } super.deleteCombatants(tokens, combat ?? {}); } - - /**@inheritdoc */ - static async _preCreateOperation(documents, operation, user) { - const allowed = await super._preCreateOperation(documents, operation, user); - if (allowed === false) return false; - - const tokenSizes = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).tokenSizes; - for (const document of documents) { - const actor = document.actor; - if (actor?.system.metadata.usesSize) { - const tokenSize = tokenSizes[actor.system.size]; - if (tokenSize && actor.system.size !== CONFIG.DH.ACTOR.tokenSize.custom.id) { - document.updateSource({ - width: tokenSize, - height: tokenSize - }); - } - } - } - } - - /**@inheritdoc */ - _onRelatedUpdate(update = {}, operation = {}) { - super._onRelatedUpdate(update, operation); - - if (!this.actor?.isOwner) return; - - const updates = Array.isArray(update) ? update : [update]; - const activeGM = game.users.activeGM; // Let the active GM take care of updates if available - for (let update of updates) { - if ( - this.actor.system.metadata.usesSize && - update.system?.size && - activeGM && - game.user.id === activeGM.id - ) { - const tokenSizes = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).tokenSizes; - const tokenSize = tokenSizes[update.system.size]; - if (tokenSize !== this.width || tokenSize !== this.height) { - this.parent?.syncTokenDimensions(this, update.system.size); - } - } - } - } - - /**@inheritdoc */ - getSnappedPosition(data = {}) { - const grid = this.parent?.grid ?? BaseScene.defaultGrid; - const x = data.x ?? this.x; - const y = data.y ?? this.y; - let elevation = data.elevation ?? this.elevation; - const unsnapped = { x, y, elevation }; - - // Gridless grid - if (grid.isGridless) return unsnapped; - - // Get position and elevation - elevation = Math.round(elevation / grid.distance) * grid.distance; - - let width = data.width ?? this.width; - let height = data.height ?? this.height; - - if (this.actor?.system.metadata.usesSize) { - const tokenSizes = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).tokenSizes; - const tokenSize = tokenSizes[this.actor.system.size]; - if (tokenSize && this.actor.system.size !== CONFIG.DH.ACTOR.tokenSize.custom.id) { - width = tokenSize ?? width; - height = tokenSize ?? height; - } - } - - // Round width and height to nearest multiple of 0.5 if not small - width = width < 1 ? width : Math.round(width * 2) / 2; - height = height < 1 ? height : Math.round(height * 2) / 2; - const shape = data.shape ?? this.shape; - - // Square grid - let snapped; - if (grid.isSquare) snapped = DHToken.getSnappedPositionInSquareGrid(grid, unsnapped, width, height); - // Hexagonal grid - else snapped = DHToken.getSnappedPositionInHexagonalGrid(grid, unsnapped, width, height, shape); - return { x: snapped.x, y: snapped.y, elevation }; - } - - static getSnappedPositionInSquareGrid(grid, position, width, height) { - const M = CONST.GRID_SNAPPING_MODES; - // Small tokens snap to any vertex of the subgrid with resolution 4 - // where the token is fully contained within the grid space - const isTiny = (width === 0.5 && height <= 1) || (width <= 1 && height === 0.5); - if (isTiny) { - let x = position.x / grid.size; - let y = position.y / grid.size; - if (width === 1) x = Math.round(x); - else { - x = Math.floor(x * 8); - const k = ((x % 8) + 8) % 8; - if (k >= 6) x = Math.ceil(x / 8); - else if (k === 5) x = Math.floor(x / 8) + 0.5; - else x = Math.round(x / 2) / 4; - } - if (height === 1) y = Math.round(y); - else { - y = Math.floor(y * 8); - const k = ((y % 8) + 8) % 8; - if (k >= 6) y = Math.ceil(y / 8); - else if (k === 5) y = Math.floor(y / 8) + 0.5; - else y = Math.round(y / 2) / 4; - } - - x *= grid.size; - y *= grid.size; - - return { x, y }; - } else if (width < 1 && height < 1) { - // isSmall - let xGrid = Math.round(position.x / grid.size); - let yGrid = Math.round(position.y / grid.size); - - const x = xGrid * grid.size + grid.size / 2 - (width * grid.size) / 2; - const y = yGrid * grid.size + grid.size / 2 - (height * grid.size) / 2; - - return { x, y }; - } - - const modeX = Number.isInteger(width) ? M.VERTEX : M.VERTEX | M.EDGE_MIDPOINT | M.CENTER; - const modeY = Number.isInteger(height) ? M.VERTEX : M.VERTEX | M.EDGE_MIDPOINT | M.CENTER; - - if (modeX === modeY) return grid.getSnappedPoint(position, { mode: modeX }); - - return { - x: grid.getSnappedPoint(position, { mode: modeX }).x, - y: grid.getSnappedPoint(position, { mode: modeY }).y - }; - } - - //#region CopyPasta for mean private methods that have to be duplicated - static getSnappedPositionInHexagonalGrid(grid, position, width, height, shape) { - // Hexagonal shape - const hexagonalShape = DHToken.#getHexagonalShape(width, height, shape, grid.columns); - if (hexagonalShape) { - const offsetX = hexagonalShape.anchor.x * grid.sizeX; - const offsetY = hexagonalShape.anchor.y * grid.sizeY; - position = grid.getCenterPoint({ x: position.x + offsetX, y: position.y + offsetY }); - position.x -= offsetX; - position.y -= offsetY; - return position; - } - - // Rectagular shape - const M = CONST.GRID_SNAPPING_MODES; - return grid.getSnappedPoint(position, { mode: M.CENTER | M.VERTEX | M.CORNER | M.SIDE_MIDPOINT }); - } - - /** - * The cache of hexagonal shapes. - * @type {Map>} - */ - static #hexagonalShapes = new Map(); - - static #getHexagonalShape(width, height, shape, columns) { - if (!Number.isInteger(width * 2) || !Number.isInteger(height * 2)) return null; - - // TODO: can we set a max of 2^13 on width and height so that we may use an integer key? - const key = `${width},${height},${shape}${columns ? 'C' : 'R'}`; - let data = DHToken.#hexagonalShapes.get(key); - if (data) return data; - - // Hexagon symmetry - if (columns) { - const rowData = BaseToken.#getHexagonalShape(height, width, shape, false); - if (!rowData) return null; - - // Transpose the offsets/points of the shape in row orientation - const offsets = { even: [], odd: [] }; - for (const { i, j } of rowData.offsets.even) offsets.even.push({ i: j, j: i }); - for (const { i, j } of rowData.offsets.odd) offsets.odd.push({ i: j, j: i }); - offsets.even.sort(({ i: i0, j: j0 }, { i: i1, j: j1 }) => j0 - j1 || i0 - i1); - offsets.odd.sort(({ i: i0, j: j0 }, { i: i1, j: j1 }) => j0 - j1 || i0 - i1); - const points = []; - for (let i = rowData.points.length; i > 0; i -= 2) { - points.push(rowData.points[i - 1], rowData.points[i - 2]); - } - data = { - offsets, - points, - center: { x: rowData.center.y, y: rowData.center.x }, - anchor: { x: rowData.anchor.y, y: rowData.anchor.x } - }; - } - - // Small hexagon - else if (width === 0.5 && height === 0.5) { - data = { - offsets: { even: [{ i: 0, j: 0 }], odd: [{ i: 0, j: 0 }] }, - points: [0.25, 0.0, 0.5, 0.125, 0.5, 0.375, 0.25, 0.5, 0.0, 0.375, 0.0, 0.125], - center: { x: 0.25, y: 0.25 }, - anchor: { x: 0.25, y: 0.25 } - }; - } - - // Normal hexagon - else if (width === 1 && height === 1) { - data = { - offsets: { even: [{ i: 0, j: 0 }], odd: [{ i: 0, j: 0 }] }, - points: [0.5, 0.0, 1.0, 0.25, 1, 0.75, 0.5, 1.0, 0.0, 0.75, 0.0, 0.25], - center: { x: 0.5, y: 0.5 }, - anchor: { x: 0.5, y: 0.5 } - }; - } - - // Hexagonal ellipse or trapezoid - else if (shape <= CONST.TOKEN_SHAPES.TRAPEZOID_2) { - data = DHToken.#createHexagonalEllipseOrTrapezoid(width, height, shape); - } - - // Hexagonal rectangle - else if (shape <= CONST.TOKEN_SHAPES.RECTANGLE_2) { - data = DHToken.#createHexagonalRectangle(width, height, shape); - } - - // Cache the shape - if (data) { - foundry.utils.deepFreeze(data); - DHToken.#hexagonalShapes.set(key, data); - } - - return data; - } - - static #createHexagonalEllipseOrTrapezoid(width, height, shape) { - if (!Number.isInteger(width) || !Number.isInteger(height)) return null; - const points = []; - let top; - let bottom; - switch (shape) { - case CONST.TOKEN_SHAPES.ELLIPSE_1: - if (height >= 2 * width) return null; - top = Math.floor(height / 2); - bottom = Math.floor((height - 1) / 2); - break; - case CONST.TOKEN_SHAPES.ELLIPSE_2: - if (height >= 2 * width) return null; - top = Math.floor((height - 1) / 2); - bottom = Math.floor(height / 2); - break; - case CONST.TOKEN_SHAPES.TRAPEZOID_1: - if (height > width) return null; - top = height - 1; - bottom = 0; - break; - case CONST.TOKEN_SHAPES.TRAPEZOID_2: - if (height > width) return null; - top = 0; - bottom = height - 1; - break; - } - const offsets = { even: [], odd: [] }; - for (let i = bottom; i > 0; i--) { - for (let j = 0; j < width - i; j++) { - offsets.even.push({ i: bottom - i, j: j + (((bottom & 1) + i + 1) >> 1) }); - offsets.odd.push({ i: bottom - i, j: j + (((bottom & 1) + i) >> 1) }); - } - } - for (let i = 0; i <= top; i++) { - for (let j = 0; j < width - i; j++) { - offsets.even.push({ i: bottom + i, j: j + (((bottom & 1) + i + 1) >> 1) }); - offsets.odd.push({ i: bottom + i, j: j + (((bottom & 1) + i) >> 1) }); - } - } - let x = 0.5 * bottom; - let y = 0.25; - for (let k = width - bottom; k--; ) { - points.push(x, y); - x += 0.5; - y -= 0.25; - points.push(x, y); - x += 0.5; - y += 0.25; - } - points.push(x, y); - for (let k = bottom; k--; ) { - y += 0.5; - points.push(x, y); - x += 0.5; - y += 0.25; - points.push(x, y); - } - y += 0.5; - for (let k = top; k--; ) { - points.push(x, y); - x -= 0.5; - y += 0.25; - points.push(x, y); - y += 0.5; - } - for (let k = width - top; k--; ) { - points.push(x, y); - x -= 0.5; - y += 0.25; - points.push(x, y); - x -= 0.5; - y -= 0.25; - } - points.push(x, y); - for (let k = top; k--; ) { - y -= 0.5; - points.push(x, y); - x -= 0.5; - y -= 0.25; - points.push(x, y); - } - y -= 0.5; - for (let k = bottom; k--; ) { - points.push(x, y); - x += 0.5; - y -= 0.25; - points.push(x, y); - y -= 0.5; - } - return { - offsets, - points, - // We use the centroid of the polygon for ellipse and trapzoid shapes - center: foundry.utils.polygonCentroid(points), - anchor: bottom % 2 ? { x: 0.0, y: 0.5 } : { x: 0.5, y: 0.5 } - }; - } - - /** - * Create the row-based hexagonal rectangle given the type, width, and height. - * @param {number} width The width of the Token (positive) - * @param {number} height The height of the Token (positive) - * @param {TokenShapeType} shape The shape type (must be RECTANGLE_1 or RECTANGLE_2) - * @returns {TokenHexagonalShapeData|null} The hexagonal shape or null if there is no shape - * for the given combination of arguments - */ - static #createHexagonalRectangle(width, height, shape) { - if (width < 1 || !Number.isInteger(height)) return null; - if (width === 1 && height > 1) return null; - if (!Number.isInteger(width) && height === 1) return null; - - const even = shape === CONST.TOKEN_SHAPES.RECTANGLE_1 || height === 1; - const offsets = { even: [], odd: [] }; - for (let i = 0; i < height; i++) { - const j0 = even ? 0 : (i + 1) & 1; - const j1 = ((width + (i & 1) * 0.5) | 0) - (even ? i & 1 : 0); - for (let j = j0; j < j1; j++) { - offsets.even.push({ i, j: j + (i & 1) }); - offsets.odd.push({ i, j }); - } - } - let x = even ? 0.0 : 0.5; - let y = 0.25; - const points = [x, y]; - while (x + 1 <= width) { - x += 0.5; - y -= 0.25; - points.push(x, y); - x += 0.5; - y += 0.25; - points.push(x, y); - } - if (x !== width) { - y += 0.5; - points.push(x, y); - x += 0.5; - y += 0.25; - points.push(x, y); - } - while (y + 1.5 <= 0.75 * height) { - y += 0.5; - points.push(x, y); - x -= 0.5; - y += 0.25; - points.push(x, y); - y += 0.5; - points.push(x, y); - x += 0.5; - y += 0.25; - points.push(x, y); - } - if (y + 0.75 < 0.75 * height) { - y += 0.5; - points.push(x, y); - x -= 0.5; - y += 0.25; - points.push(x, y); - } - y += 0.5; - points.push(x, y); - while (x - 1 >= 0) { - x -= 0.5; - y += 0.25; - points.push(x, y); - x -= 0.5; - y -= 0.25; - points.push(x, y); - } - if (x !== 0) { - y -= 0.5; - points.push(x, y); - x -= 0.5; - y -= 0.25; - points.push(x, y); - } - while (y - 1.5 > 0) { - y -= 0.5; - points.push(x, y); - x += 0.5; - y -= 0.25; - points.push(x, y); - y -= 0.5; - points.push(x, y); - x -= 0.5; - y -= 0.25; - points.push(x, y); - } - if (y - 0.75 > 0) { - y -= 0.5; - points.push(x, y); - x += 0.5; - y -= 0.25; - points.push(x, y); - } - return { - offsets, - points, - // We use center of the rectangle (and not the centroid of the polygon) for the rectangle shapes - center: { - x: width / 2, - y: (0.75 * Math.floor(height) + 0.5 * (height % 1) + 0.25) / 2 - }, - anchor: even ? { x: 0.5, y: 0.5 } : { x: 0.0, y: 0.5 } - }; - } - //#endregion } diff --git a/module/documents/tooltipManager.mjs b/module/documents/tooltipManager.mjs index 3ea6703c..23e04ac1 100644 --- a/module/documents/tooltipManager.mjs +++ b/module/documents/tooltipManager.mjs @@ -10,7 +10,6 @@ export default class DhTooltipManager extends foundry.helpers.interaction.Toolti let html = options.html; if (element.dataset.tooltip?.startsWith('#battlepoints#')) { this.#wide = true; - this.#bordered = true; html = await this.getBattlepointHTML(element.dataset.combatId); options.direction = this._determineItemTooltipDirection(element); @@ -23,7 +22,6 @@ export default class DhTooltipManager extends foundry.helpers.interaction.Toolti return; } else { this.#wide = false; - this.#bordered = false; } if (element.dataset.tooltip === '#effect-display#') { @@ -75,8 +73,7 @@ export default class DhTooltipManager extends foundry.helpers.interaction.Toolti { item: item, description: item.system?.enrichedDescription ?? item.enrichedDescription, - config: CONFIG.DH, - allDomains: CONFIG.DH.DOMAIN.allDomains() + config: CONFIG.DH } ); @@ -171,6 +168,14 @@ export default class DhTooltipManager extends foundry.helpers.interaction.Toolti super.activate(element, { ...options, html: html }); } + _setStyle(position = {}) { + super._setStyle(position); + + if (this.#bordered) { + this.tooltip.classList.add('bordered-tooltip'); + } + } + _determineItemTooltipDirection(element, prefered = this.constructor.TOOLTIP_DIRECTIONS.LEFT) { const pos = element.getBoundingClientRect(); const dirs = this.constructor.TOOLTIP_DIRECTIONS; @@ -242,17 +247,12 @@ export default class DhTooltipManager extends foundry.helpers.interaction.Toolti if (this.#wide) { this.tooltip.classList.add('wide'); } - - if (this.#bordered) { - this.tooltip.classList.add('bordered-tooltip'); - } } /**@inheritdoc */ lockTooltip() { const clone = super.lockTooltip(); - if (this.#wide) clone.classList.add('wide'); - if (this.#bordered) clone.classList.add('bordered-tooltip'); + clone.classList.add('wide'); return clone; } @@ -262,7 +262,7 @@ export default class DhTooltipManager extends foundry.helpers.interaction.Toolti const combat = game.combats.get(combatId); const adversaries = combat.turns?.filter(x => x.actor?.isNPC)?.map(x => ({ ...x.actor, type: x.actor.system.type })) ?? []; - const characters = combat.turns?.filter(x => !x.isNPC && x.actor) ?? []; + const characters = combat.turns?.filter(x => !x.isNPC) ?? []; const nrCharacters = characters.length; const currentBP = AdversaryBPPerEncounter(adversaries, characters); @@ -272,7 +272,7 @@ export default class DhTooltipManager extends foundry.helpers.interaction.Toolti ); const categories = combat.combatants.reduce((acc, combatant) => { - if (combatant.actor?.type === 'adversary') { + if (combatant.actor.type === 'adversary') { const keyData = Object.keys(acc).reduce((identifiers, categoryKey) => { if (identifiers) return identifiers; const category = acc[categoryKey]; @@ -352,7 +352,7 @@ export default class DhTooltipManager extends foundry.helpers.interaction.Toolti await combat.toggleModifierEffects( event.target.checked, - combat.combatants.filter(x => x.actor?.type === 'adversary').map(x => x.actor), + combat.combatants.filter(x => x.actor.type === 'adversary').map(x => x.actor), category, grouping ); diff --git a/module/enrichers/LookupEnricher.mjs b/module/enrichers/LookupEnricher.mjs index cc9af608..3566e112 100644 --- a/module/enrichers/LookupEnricher.mjs +++ b/module/enrichers/LookupEnricher.mjs @@ -3,11 +3,6 @@ import { parseInlineParams } from './parser.mjs'; export default function DhLookupEnricher(match, { rollData }) { const results = parseInlineParams(match[1], { first: 'formula' }); const element = document.createElement('span'); - - const lookupCommand = match[0]; - const lookupParam = match[1]; - const lookupText = Roll.replaceFormulaData(String(results.formula), rollData); - element.textContent = lookupText === lookupParam ? lookupCommand : lookupText; - + element.textContent = Roll.replaceFormulaData(String(results.formula), rollData); return element; } diff --git a/module/helpers/utils.mjs b/module/helpers/utils.mjs index a28725b1..39d5298d 100644 --- a/module/helpers/utils.mjs +++ b/module/helpers/utils.mjs @@ -119,7 +119,7 @@ export const tagifyElement = (element, baseOptions, onChange, tagifyOptions = {} spellcheck='false' tabIndex="${this.settings.a11y.focusableTags ? 0 : -1}" class="${this.settings.classNames.tag} ${tagData.class ? tagData.class : ''}" - data-tooltip="${tagData.description ? htmlToText(tagData.description) : tagData.name}" + data-tooltip="${tagData.description || tagData.name}" ${this.getAttributes(tagData)}>
@@ -198,7 +198,7 @@ foundry.dice.terms.Die.prototype.selfCorrecting = function (modifier) { }; export const getDamageKey = damage => { - return ['none', 'minor', 'major', 'severe', 'massive', 'any'][damage]; + return ['none', 'minor', 'major', 'severe', 'any'][damage]; }; export const getDamageLabel = damage => { @@ -211,8 +211,7 @@ export const damageKeyToNumber = key => { minor: 1, major: 2, severe: 3, - massive: 4, - any: 5 + any: 4 }[key]; }; @@ -474,10 +473,3 @@ export async function getCritDamageBonus(formula) { const critRoll = new Roll(formula); return critRoll.dice.reduce((acc, dice) => acc + dice.faces * dice.number, 0); } - -export function htmlToText(html) { - var tempDivElement = document.createElement('div'); - tempDivElement.innerHTML = html; - - return tempDivElement.textContent || tempDivElement.innerText || ''; -} diff --git a/module/systemRegistration/settings.mjs b/module/systemRegistration/settings.mjs index 053325a8..6954730f 100644 --- a/module/systemRegistration/settings.mjs +++ b/module/systemRegistration/settings.mjs @@ -13,16 +13,6 @@ export const registerDHSettings = () => { registerMenuSettings(); registerMenus(); registerNonConfigSettings(); - - game.settings.register(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.SpotlightRequestQueue, { - name: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.SpotlightRequestQueue.name'), - label: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.SpotlightRequestQueue.label'), - hint: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.SpotlightRequestQueue.hint'), - scope: 'world', - config: true, - type: Boolean, - onChange: () => ui.combat.render() - }); }; const registerMenuSettings = () => { @@ -46,9 +36,6 @@ const registerMenuSettings = () => { if (value.maxFear) { if (ui.resources) ui.resources.render({ force: true }); } - - // Some homebrew settings may change sheets in various ways, so trigger a re-render - resetActors(); } }); @@ -143,25 +130,3 @@ const registerNonConfigSettings = () => { type: DhTagTeamRoll }); }; - -/** - * Triggers a reset and non-forced re-render on all given actors (if given) - * or all world actors and actors in all scenes to show immediate results for a changed setting. - */ -function resetActors(actors) { - actors ??= [ - game.actors.contents, - game.scenes.contents.flatMap(s => s.tokens.contents).flatMap(t => t.actor ?? []) - ].flat(); - actors = new Set(actors); - for (const actor of actors) { - for (const app of Object.values(actor.apps)) { - for (const element of app.element?.querySelectorAll('prose-mirror.active')) { - element.open = false; // This triggers a save - } - } - - actor.reset(); - actor.render(); - } -} diff --git a/module/systemRegistration/socket.mjs b/module/systemRegistration/socket.mjs index 046f1b68..27bf48c5 100644 --- a/module/systemRegistration/socket.mjs +++ b/module/systemRegistration/socket.mjs @@ -73,13 +73,10 @@ export const registerSocketHooks = () => { Hooks.callAll(socketEvent.Refresh, { refreshType: RefreshType.Countdown }); break; case GMUpdateEvent.UpdateSaveMessage: - const message = game.messages.get(data.update.message); - if (!message) return; - game.system.api.fields.ActionFields.SaveField.updateSaveMessage( - data.update.result, - message, - data.update.token - ); + const action = await fromUuid(data.update.action), + message = game.messages.get(data.update.message); + if (!action || !message) return; + action.updateSaveMessage(data.update.result, message, data.update.token); break; } diff --git a/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json b/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json index e2b3a444..8060ab72 100644 --- a/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json +++ b/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json @@ -40,8 +40,7 @@ "experiences": { "pe7OIoJsqlpMXEvs": { "name": "Tremor Sense", - "value": 2, - "description": "" + "value": 2 } }, "bonuses": { @@ -149,8 +148,7 @@ "source": "Daggerheart SRD", "page": 75, "artist": "" - }, - "size": "large" + } }, "flags": {}, "ownership": { @@ -260,14 +258,14 @@ "_id": "MFmGN6Tbf5GYxrQ9", "img": "icons/magic/unholy/silhouette-evil-horned-giant.webp", "system": { - "description": "

The @Lookup[@name] can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", + "description": "

The Burrower can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", "resource": null, "actions": { "3lGGgkxnzgUwHGIp": { "type": "effect", "_id": "3lGGgkxnzgUwHGIp", "systemPath": "actions", - "description": "", + "description": "

The Burrower can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", "chatDisplay": false, "actionType": "passive", "cost": [ @@ -319,14 +317,14 @@ "_id": "ctXYwil2D1zfsekT", "img": "icons/magic/earth/barrier-stone-explosion-red.webp", "system": { - "description": "

Mark a Stress to have the @Lookup[@name] burst out of the ground. All creatures within Very Close range must succeed on an Agility Reaction Roll or be knocked over, making them Vulnerable until they next act.

@Template[type:emanation|range:vc]

", + "description": "

Mark a Stress to have the Burrower burst out of the ground. All creatures within Very Close range must succeed on an Agility Reaction Roll or be knocked over, making them Vulnerable until they next act.

@Template[type:emanation|range:vc]

", "resource": null, "actions": { "4ppSeiTdbqnMzWAs": { "type": "attack", "_id": "4ppSeiTdbqnMzWAs", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to have the Burrower burst out of the ground. All creatures within Very Close range must succeed on an Agility Reaction Roll or be knocked over, making them Vulnerable until they next act.

@Template[type:emanation|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -383,8 +381,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [ { @@ -444,14 +441,14 @@ "_id": "UpFsnlbZkyvM2Ftv", "img": "icons/magic/acid/projectile-smoke-glowing.webp", "system": { - "description": "

Make an attack against all targets in front of the @Lookup[@name] within Close range. Targets the @Lookup[@name] succeeds against take 2d6 physical damage and must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP and you gain a Fear.

@Template[type:inFront|range:c]

", + "description": "

Make an attack against all targets in front of the Burrower within Close range. Targets the Burrower succeeds against take 2d6 physical damage and must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP and you gain a Fear.

@Template[type:inFront|range:c]

", "resource": null, "actions": { "yd10HwK6Wa3OEvv2": { "type": "attack", "_id": "yd10HwK6Wa3OEvv2", "systemPath": "actions", - "description": "", + "description": "

Make an attack against all targets in front of the Burrower within Close range. Targets the Burrower succeeds against take 2d6 physical damage and must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP and you gain a Fear.

@Template[type:inFront|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -549,8 +546,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -571,14 +567,14 @@ "_id": "aNIVT5LKhwLyjKpI", "img": "icons/magic/acid/dissolve-drip-droplet-smoke.webp", "system": { - "description": "

When the @Lookup[@name] takes Severe damage, all creatures within Close range are bathed in their acidic blood, taking 1d10 physical damage. This splash covers the ground within Very Close range with blood, and all creatures other than the @Lookup[@name] who move through it take 1d6 physical damage.

@Template[type:emanation|range:c]

", + "description": "

When the Burrower takes Severe damage, all creatures within Close range are bathed in their acidic blood, taking 1d10 physical damage. This splash covers the ground within Very Close range with blood, and all creatures other than the Burrower who move through it take 1d6 physical damage.

@Template[type:emanation|range:c]

", "resource": null, "actions": { "XbtTzOBvlTaxOKTy": { "type": "damage", "_id": "XbtTzOBvlTaxOKTy", "systemPath": "actions", - "description": "", + "description": "

When the Burrower takes Severe damage, all creatures within Close range are bathed in their acidic blood, taking 1d10 physical damage. This splash covers the ground within Very Close range with blood, and all creatures other than the Burrower who move through it take 1d6 physical damage.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -632,7 +628,7 @@ "type": "damage", "_id": "xpcp1ECTWF20kxve", "systemPath": "actions", - "description": "

This splash covers the ground within Very Close range with blood, and all creatures other than the @Lookup[@name] who move through it take 1d6 physical damage.

", + "description": "

This splash covers the ground within Very Close range with blood, and all creatures other than the Burrower who move through it take 1d6 physical damage.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -685,8 +681,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json b/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json index 266cba24..95e6c243 100644 --- a/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json +++ b/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 91, "artist": "" - }, - "size": "gargantuan" + } }, "flags": {}, "_id": "G7jiltRjgvVhZewm", @@ -221,14 +220,14 @@ "name": "Relentless (4)", "type": "feature", "system": { - "description": "

The @Lookup[@name] can be spotlighted up to four times per GM turn. Spend Fear as usual to spotlight them.

", + "description": "

The Flickerfly can be spotlighted up to four times per GM turn. Spend Fear as usual to spotlight them.

", "resource": null, "actions": { "poUhJdSkhjiVL2Vp": { "type": "effect", "_id": "poUhJdSkhjiVL2Vp", "systemPath": "actions", - "description": "", + "description": "

The Flickerfly can be spotlighted up to four times per GM turn. Spend Fear as usual to spotlight them.

", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -264,7 +263,7 @@ "img": "icons/magic/unholy/silhouette-evil-horned-giant.webp", "effects": [], "folder": null, - "sort": 100000, + "sort": 0, "ownership": { "default": 0, "MQSznptE5yLT7kj8": 3 @@ -279,14 +278,14 @@ "name": "Never Misses", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes an attack, the target’s Evasion is halved against the attack.

", + "description": "

When the Flickerfly makes an attack, the target’s Evasion is halved against the attack.

", "resource": null, "actions": { "VRGPnDhDpReXUZZF": { "type": "effect", "_id": "VRGPnDhDpReXUZZF", "systemPath": "actions", - "description": "", + "description": "

When the Flickerfly makes an attack, the target’s Evasion is halved against the attack.

", "chatDisplay": true, "actionType": "passive", "cost": [], @@ -361,7 +360,7 @@ } ], "folder": null, - "sort": 200000, + "sort": 0, "ownership": { "default": 0, "MQSznptE5yLT7kj8": 3 @@ -376,14 +375,14 @@ "name": "Whirlwind", "type": "feature", "system": { - "description": "

Spend a Fear to whirl, making an attack against all targets within Very Close range. Targets the @Lookup[@name] succeeds against take 3d8 direct physical damage.

@Template[type:emanation|range:vc]

", + "description": "

Spend a Fear to whirl, making an attack against all targets within Very Close range. Targets the Flickerfly succeeds against take 3d8 direct physical damage.

@Template[type:emanation|range:vc]

", "resource": null, "actions": { "RV1wKufKrMPN6MOo": { "type": "attack", "_id": "RV1wKufKrMPN6MOo", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to whirl, making an attack against all targets within Very Close range. Targets the Flickerfly succeeds against take 3d8 direct physical damage.

@Template[type:emanation|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -428,8 +427,7 @@ } } ], - "includeBase": false, - "direct": true + "includeBase": false }, "target": { "type": "any", @@ -462,14 +460,13 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "BuL6ndgaiJtjaM2T", "img": "icons/skills/melee/strike-slashes-orange.webp", "effects": [], "folder": null, - "sort": 300000, + "sort": 0, "ownership": { "default": 0, "MQSznptE5yLT7kj8": 3 @@ -484,14 +481,14 @@ "name": "Mind Dance", "type": "feature", "system": { - "description": "

Mark a Stress to create a magically dazzling display that grapples the minds of nearby foes. All targets within Close range must make an Instinct Reaction Roll. For each target who failed, you gain a Fear and the @Lookup[@name] learns one of the target’s fears.

@Template[type:emanation|range:c]

", + "description": "

Mark a Stress to create a magically dazzling display that grapples the minds of nearby foes. All targets within Close range must make an Instinct Reaction Roll. For each target who failed, you gain a Fear and the Flickerfl y learns one of the target’s fears.

@Template[type:emanation|range:c]

", "resource": null, "actions": { "GNwsDlCabx3fiG4g": { "type": "attack", "_id": "GNwsDlCabx3fiG4g", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to create a magically dazzling display that grapples the minds of nearby foes. All targets within Close range must make an Instinct Reaction Roll. For each target who failed, you gain a Fear and the Flickerfl y learns one of the target’s fears.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -542,14 +539,13 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "bOTsfXr9yNIGkIzK", "img": "icons/magic/light/explosion-glow-spiral-yellow.webp", "effects": [], "folder": null, - "sort": 400000, + "sort": 0, "ownership": { "default": 0, "MQSznptE5yLT7kj8": 3 @@ -564,14 +560,14 @@ "name": "Hallucinatory Breath", "type": "feature", "system": { - "description": "

Countdown (Loop 1d6). When the @Lookup[@name] takes damage for the first time, activate the countdown. When it triggers, the @Lookup[@name] breathes hallucinatory gas on all targets in front of them up to Far range. Targets must make an Instinct Reaction Roll or be tormented by fearful hallucinations. Targets whose fears are known to the @Lookup[@name] have disadvantage on this roll. Targets who fail lose 2 Hope and take 3d8+3 direct magic damage.

@Template[type:inFront|range:f]

", + "description": "

Countdown (Loop 1d6). When the Flickerfly takes damage for the first time, activate the countdown. When it triggers, the Flickerfly breathes hallucinatory gas on all targets in front of them up to Far range. Targets must make an Instinct Reaction Roll or be tormented by fearful hallucinations. Targets whose fears are known to the Flickerfl y have disadvantage on this roll. Targets who fail lose 2 Hope and take 3d8+3 direct magic damage.

@Template[type:inFront|range:f]

", "resource": null, "actions": { "YOyKyKGTUEWkMmJe": { "type": "attack", "_id": "YOyKyKGTUEWkMmJe", "systemPath": "actions", - "description": "

The @Lookup[@name] breathes hallucinatory gas on all targets in front of them up to Far range. Targets must make an Instinct Reaction Roll or be tormented by fearful hallucinations. Targets whose fears are known to the @Lookup[@name] have disadvantage on this roll. Targets who fail lose 2 Hope and take 3d8+3 direct magic damage.

@Template[type:inFront|range:f]

", + "description": "

The Flickerfly breathes hallucinatory gas on all targets in front of them up to Far range. Targets must make an Instinct Reaction Roll or be tormented by fearful hallucinations. Targets whose fears are known to the Flickerfly have disadvantage on this roll. Targets who fail lose 2 Hope and take 3d8+3 direct magic damage.

@Template[type:inFront|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -669,7 +665,7 @@ "type": "countdown", "_id": "lBhmLc33pcXzJHT3", "systemPath": "actions", - "description": "

Countdown (Loop 1d6). When the @Lookup[@name] takes damage for the first time, activate the countdown.

", + "description": "

Countdown (Loop 1d6). When the Flickerfly takes damage for the first time, activate the countdown.

", "chatDisplay": true, "originItem": { "type": "itemCollection" @@ -704,14 +700,13 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "49cIxZRFiAM6jDva", "img": "icons/magic/air/fog-gas-smoke-purple.webp", "effects": [], "folder": null, - "sort": 500000, + "sort": 0, "ownership": { "default": 0, "MQSznptE5yLT7kj8": 3 @@ -726,14 +721,14 @@ "name": "Uncanny Reflexes", "type": "feature", "system": { - "description": "

When the @Lookup[@name] takes damage from an attack within Close range, you can mark a Stress to take half damage.

", + "description": "

When the Flickerfly takes damage from an attack within Close range, you can mark a Stress to take half damage.

", "resource": null, "actions": { "FocbilGTpvUjlb7m": { "type": "effect", "_id": "FocbilGTpvUjlb7m", "systemPath": "actions", - "description": "", + "description": "

When the Flickerfly takes damage from an attack within Close range, you can mark a Stress to take half damage.

", "chatDisplay": true, "actionType": "reaction", "cost": [ @@ -760,14 +755,13 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "KLdLRKoJHBJlHwYe", "img": "icons/skills/movement/arrow-upward-yellow.webp", "effects": [], "folder": null, - "sort": 600000, + "sort": 0, "ownership": { "default": 0, "MQSznptE5yLT7kj8": 3 @@ -782,7 +776,7 @@ "name": "Deadly Flight", "type": "feature", "system": { - "description": "

While flying the @Lookup[@name] can move up to Far range instead of Close range before taking an action.

", + "description": "

While flying the Flickerfly can move up to Far range instead of Close range before taking an action.

", "resource": null, "actions": {}, "originItemType": null, @@ -792,7 +786,7 @@ "img": "icons/skills/movement/feet-winged-boots-blue.webp", "effects": [], "folder": null, - "sort": 700000, + "sort": 0, "ownership": { "default": 0, "fBcTgyTzoARBvohY": 3 diff --git a/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json b/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json index 3f31ff76..0fd791e0 100644 --- a/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json +++ b/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json @@ -110,8 +110,7 @@ "source": "Daggerheart SRD", "page": 84, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "vNIbYQ4YSzNf0WPE", @@ -220,12 +219,11 @@ "name": "Minion (6)", "type": "feature", "system": { - "description": "

The @Lookup[@name] is defeated when they take any damage. For every 6 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

", + "description": "

The Assassin is defeated when they take any damage. For every 6 damage a PC deals to the Assassin, defeat an additional Minion within range the attack would succeed against.

", "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "passive" + "originId": null }, "_id": "2yREz60uPY80tAa4", "img": "icons/magic/symbols/runes-carved-stone-yellow.webp", @@ -246,14 +244,14 @@ "name": "Group Attack", "type": "feature", "system": { - "description": "

Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 4 physical damage each. Combine this damage.

", + "description": "

Spend a Fear to choose a target and spotlight all Apprentice Assassins within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 4 physical damage each. Combine this damage.

", "resource": null, "actions": { "vgguNWz8vG8aoLXR": { "type": "effect", "_id": "vgguNWz8vG8aoLXR", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to choose a target and spotlight all Apprentice Assassins within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 4 physical damage each. Combine this damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -280,8 +278,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "4wT7CmM1DJEPcraF", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", diff --git a/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json b/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json index 4fc58990..cbba184b 100644 --- a/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json +++ b/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json @@ -122,8 +122,7 @@ "source": "Daggerheart SRD", "page": 97, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "WPEOIGfclNJxWb87", @@ -239,7 +238,7 @@ "type": "attack", "_id": "wi2DDvBhlg6sxQoc", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to spotlight 1d4 allies. Attacks they make while spotlighted in this way deal half damage, or full damage if you spend a Fear.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -290,8 +289,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "jNmMyq5QI2HNgffy", "img": "icons/magic/death/skull-weapon-staff-glow-pink.webp", @@ -319,7 +317,7 @@ "type": "attack", "_id": "vaXLESD4sRkQ3Ahn", "systemPath": "actions", - "description": "", + "description": "

Mark 2 Stress to cause all targets within Far range to make a Strength Reaction Roll. Targets who fail take 2d20+12 magic damage and you gain a Fear. Targets who succeed take half damage. A target who marks 2 or more HP must also mark 2 Stress and becomes Vulnerable until they roll with Hope.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -469,8 +467,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "4EECsXzHFG0RoIg0", "img": "icons/magic/unholy/projectile-missile-green.webp", @@ -537,7 +534,7 @@ "type": "effect", "_id": "gZg3AkzCYUTExjE6", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to summon a @UUID[Compendium.daggerheart.adversaries.Actor.YhJrP7rTBiRdX5Fp]{Zombie Legion}, which appears at Close range and immediately takes the spotlight.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -564,8 +561,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "XxXOrFovbCz9zFxR", "img": "icons/magic/death/undead-zombie-grave-green.webp", @@ -586,14 +582,14 @@ "name": "Not Today, My Dears", "type": "feature", "system": { - "description": "

When the @Lookup[@name] has marked 7 or more of their HP, you can spend a Fear to have them teleport away to a safe location to recover. A PC who succeeds on an Instinct Roll can trace the teleportation magic to their destination.

", + "description": "

When the Necromancer has marked 7 or more of their HP, you can spend a Fear to have them teleport away to a safe location to recover. A PC who succeeds on an Instinct Roll can trace the teleportation magic to their destination.

", "resource": null, "actions": { "DX8WPeLVrRBB2CdM": { "type": "attack", "_id": "DX8WPeLVrRBB2CdM", "systemPath": "actions", - "description": "", + "description": "

When the Necromancer has marked 7 or more of their HP, you can spend a Fear to have them teleport away to a safe location to recover. A PC who succeeds on an Instinct Roll can trace the teleportation magic to their destination.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -644,8 +640,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "k4MSykLRoW3qp7Lk", "img": "icons/magic/death/skull-horned-worn-fire-blue.webp", @@ -666,14 +661,14 @@ "name": "Your Life Is Mine", "type": "feature", "system": { - "description": "

Countdown (Loop 2d6). When the @Lookup[@name] has marked 6 or more of their HP, activate the countdown. When it triggers, deal 2d10+6 direct magic damage to a target within Close range. The @Lookup[@name] then clears a number of Stress or HP equal to the number of HP marked by the target from this attack.

", + "description": "

Countdown (Loop 2d6). When the Necromancer has marked 6 or more of their HP, activate the countdown. When it triggers, deal 2d10+6 direct magic damage to a target within Close range. The Necromancer then clears a number of Stress or HP equal to the number of HP marked by the target from this attack.

", "resource": null, "actions": { "YzepYov9vEMcBPU1": { "type": "damage", "_id": "YzepYov9vEMcBPU1", "systemPath": "actions", - "description": "

Deal 2d10+6 direct magic damage to a target within Close range. The @Lookup[@name] then clears a number of Stress or HP equal to the number of HP marked by the target from this attack.

", + "description": "

Deal 2d10+6 direct magic damage to a target within Close range. The Necromancer then clears a number of Stress or HP equal to the number of HP marked by the target from this attack.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -726,7 +721,7 @@ "type": "countdown", "_id": "LXhwkNCDFeUric8D", "systemPath": "actions", - "description": "

Countdown (Loop 2d6). When the @Lookup[@name] has marked 6 or more of their HP, activate the countdown.

", + "description": "

Countdown (Loop 2d6). When the Necromancer has marked 6 or more of their HP, activate the countdown.

", "chatDisplay": true, "originItem": { "type": "itemCollection" @@ -761,8 +756,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "FKcuCo0v2U7fVkqq", "img": "icons/magic/unholy/hand-claw-fire-green.webp", diff --git a/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json b/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json index 5a13b3d9..f4520545 100644 --- a/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json +++ b/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json @@ -39,8 +39,7 @@ "experiences": { "Gtr9I2G39GcXT2Si": { "name": "Local Knowledge", - "value": 3, - "description": "" + "value": 3 } }, "bonuses": { @@ -117,8 +116,7 @@ "source": "Daggerheart SRD", "page": 77, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "JRhrrEg5UroURiAD", @@ -236,7 +234,7 @@ "type": "attack", "_id": "84rwldOFvTPrrHJJ", "systemPath": "actions", - "description": "", + "description": "

Make an attack against a target within Far range. On a success, mark a Stress to deal 1d12+3 physical damage. If the target marks HP from this attack, they have disadvantage on Agility Rolls until they clear at least 1 HP.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -313,8 +311,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [ { diff --git a/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json b/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json index 55229040..00b2462a 100644 --- a/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json +++ b/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 84, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "0ts6CGd93lLqGZI5", @@ -221,7 +220,7 @@ "name": "Horde (1d6+3)", "type": "feature", "system": { - "description": "

When the @Lookup[@name] has marked half or more of their HP, their standard attack deals 1d6+3 physical damage instead.

", + "description": "

When the Squadron has marked half or more of their HP, their standard attack deals 1d6+3 physical damage instead.

", "resource": null, "actions": {}, "originItemType": null, @@ -246,14 +245,14 @@ "name": "Focused Volley", "type": "feature", "system": { - "description": "

Spend a Fear to target a point within Far range. Make an attack with advantage against all targets within Close range of that point. Targets the @Lookup[@name] succeeds against take 1d10+4 physical damage.

@Template[type:circle|range:c]

", + "description": "

Spend a Fear to target a point within Far range. Make an attack with advantage against all targets within Close range of that point. Targets the Squadron succeeds against take 1d10+4 physical damage.

@Template[type:circle|range:c]

", "resource": null, "actions": { "uG7Hl2DqaT69aNs1": { "type": "attack", "_id": "uG7Hl2DqaT69aNs1", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to target a point within Far range. Make an attack with advantage against all targets within Close range of that point. Targets the Squadron succeeds against take 1d10+4 physical damage.

@Template[type:circle|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -329,8 +328,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "Wuf5y9tJ88BwzLv2", "img": "icons/skills/ranged/arrows-flying-triple-brown.webp", @@ -358,7 +356,7 @@ "type": "attack", "_id": "mH6mmJIMM1fwzePt", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to target a point within Far range. Until the next roll with Fear, a creature who moves within Close range of that point must make an Agility Reaction Roll. On a failure, they take 2d6+3 physical damage. On a success, they take half damage.

@Template[type:circle|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -427,8 +425,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "ayGHTtyjSuIR4BrV", "img": "icons/skills/ranged/arrows-flying-salvo-blue.webp", diff --git a/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json b/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json index 6594cbbe..e887b4ba 100644 --- a/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json +++ b/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 84, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "h5RuhzGL17dW5FBT", @@ -227,14 +226,14 @@ "name": "Grindletooth Venom", "type": "feature", "system": { - "description": "

Targets who mark HP from the @Lookup[@name]’s attacks are Vulnerable until they clear a HP.

", + "description": "

Targets who mark HP from the Assassin’s attacks are Vulnerable until they clear a HP.

", "resource": null, "actions": { "L83tU1TgmqoH9SSn": { "type": "effect", "_id": "L83tU1TgmqoH9SSn", "systemPath": "actions", - "description": "", + "description": "

Targets who mark HP from the Assassin’s attacks are Vulnerable until they clear a HP.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -319,7 +318,7 @@ "name": "Assassin Poisoner", "type": "feature", "system": { - "description": "

The @Lookup[@name] has advantage on attacks if they are Hidden.

", + "description": "

The Assassin has advantage on attacks if they are Hidden.

", "resource": null, "actions": {}, "originItemType": null, @@ -395,7 +394,7 @@ "type": "effect", "_id": "sp7RfJRQJsEUm09m", "systemPath": "actions", - "description": "", + "description": "

Drop a smoke bomb that fills the air within Close range with smoke, Dizzying all targets in this area. Dizzied targets have disadvantage on their next action roll, then clear the condition.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -420,8 +419,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "lAmiK8wVxjyHwKlp", "img": "icons/magic/air/fog-gas-smoke-green.webp", diff --git a/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json b/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json index 96a1b752..49982ae2 100644 --- a/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json +++ b/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 85, "artist": "" - }, - "size": "large" + } }, "flags": {}, "_id": "dgH3fW9FTYLaIDvS", @@ -227,14 +226,14 @@ "name": "Relentless (2)", "type": "feature", "system": { - "description": "

The @Lookup[@name] can be spotlighted up to two times times per GM turn. Spend Fear as usual to spotlight them.

", + "description": "

The Box can be spotlighted up to two times times per GM turn. Spend Fear as usual to spotlight them.

", "resource": null, "actions": { "2JfPSV3pw6pv0BXd": { "type": "effect", "_id": "2JfPSV3pw6pv0BXd", "systemPath": "actions", - "description": "", + "description": "

The Box can be spotlighted up to two times times per GM turn. Spend Fear as usual to spotlight them.

", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -285,14 +284,14 @@ "name": "Randomized Tactics", "type": "feature", "system": { - "description": "

Mark a Stress and roll a d6. The @Lookup[@name] uses the corresponding move:

  1. Mana Beam

  2. Fire Jets

  3. Trample

  4. Shocking Gas

  5. Stunning Clap

  6. Psionic Whine

", + "description": "

Mark a Stress and roll a d6. The Box uses the corresponding move:

  1. Mana Beam

  2. Fire Jets

  3. Trample

  4. Shocking Gas

  5. Stunning Clap

  6. Psionic Whine

", "resource": null, "actions": { "FX9jwg5ZNjAWnti3": { "type": "attack", "_id": "FX9jwg5ZNjAWnti3", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress and roll a d6. The Box uses the corresponding move:

  1. Mana Beam

  2. Fire Jets

  3. Trample

  4. Shocking Gas

  5. Stunning Clap

  6. Psionic Whine

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -343,8 +342,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "ZqfLMjVkbUwDw4p6", "img": "icons/commodities/tech/transmission.webp", @@ -365,14 +363,14 @@ "name": "Mana Beam", "type": "feature", "system": { - "description": "

The @Lookup[@name] fires a searing beam. Make an attack against a target within Far range. On a success, deal 2d10+2 magic damage.

", + "description": "

The Box fires a searing beam. Make an attack against a target within Far range. On a success, deal 2d10+2 magic damage.

", "resource": null, "actions": { "Co09oXMw0yBjGaws": { "type": "attack", "_id": "Co09oXMw0yBjGaws", "systemPath": "actions", - "description": "", + "description": "

The Box fires a searing beam. Make an attack against a target within Far range. On a success, deal 2d10+2 magic damage.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -443,8 +441,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "lqyN4CQop53BzarW", "img": "icons/magic/light/beam-rays-blue.webp", @@ -465,14 +462,14 @@ "name": "Fire Jets", "type": "feature", "system": { - "description": "

The @Lookup[@name] shoots into the air, spinning and releasing jets of flame. Make an attack against all targets within Close range. Targets the @Lookup[@name] succeeds against take 2d8 physical damage.

@Template[type:emanation|range:c]

", + "description": "

The Box shoots into the air, spinning and releasing jets of flame. Make an attack against all targets within Close range. Targets the Box succeeds against take 2d8 physical damage.

@Template[type:emanation|range:c]

", "resource": null, "actions": { "hRAKaOdzQXLYBNVV": { "type": "attack", "_id": "hRAKaOdzQXLYBNVV", "systemPath": "actions", - "description": "", + "description": "

The Box shoots into the air, spinning and releasing jets of flame. Make an attack against all targets within Close range. Targets the Box succeeds against take 2d8 physical damage.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -543,8 +540,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "IHQoqt39T772FVMs", "img": "icons/magic/fire/explosion-embers-orange.webp", @@ -565,14 +561,14 @@ "name": "Trample", "type": "feature", "system": { - "description": "

The @Lookup[@name] rockets around erratically. Make an attack against all PCs within Close range. Targets the @Lookup[@name] succeeds against take 1d6+5 physical damage and are Vulnerable until their next roll with Hope.

@Template[type:emanation|range:c]

", + "description": "

The Box rockets around erratically. Make an attack against all PCs within Close range. Targets the Box succeeds against take 1d6+5 physical damage and are Vulnerable until their next roll with Hope.

@Template[type:emanation|range:c]

", "resource": null, "actions": { "IOgPMu12Xnn33TfG": { "type": "attack", "_id": "IOgPMu12Xnn33TfG", "systemPath": "actions", - "description": "", + "description": "

The Box rockets around erratically. Make an attack against all PCs within Close range. Targets the Box succeeds against take 1d6+5 physical damage and are Vulnerable until their next roll with Hope.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -648,8 +644,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "XtnByqUr9AuYU9Ip", "img": "icons/skills/movement/arrow-upward-yellow.webp", @@ -709,14 +704,14 @@ "name": "Shocking Gas", "type": "feature", "system": { - "description": "

The @Lookup[@name] sprays out a silver gas sparking with lightning. All targets within Close range must succeed on a Finesse Reaction Roll or mark 3 Stress.

@Template[type:emanation|range:c]

", + "description": "

The Box sprays out a silver gas sparking with lightning. All targets within Close range must succeed on a Finesse Reaction Roll or mark 3 Stress.

@Template[type:emanation|range:c]

", "resource": null, "actions": { "ky4OMl558J5wCbDp": { "type": "attack", "_id": "ky4OMl558J5wCbDp", "systemPath": "actions", - "description": "", + "description": "

The Box sprays out a silver gas sparking with lightning. All targets within Close range must succeed on a Finesse Reaction Roll or mark 3 Stress.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -786,8 +781,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "3bPURmuwQs06fThQ", "img": "icons/magic/lightning/bolt-strike-embers-teal.webp", @@ -808,14 +802,14 @@ "name": "Stunning Clap", "type": "feature", "system": { - "description": "

The @Lookup[@name] leaps and their sides clap, creating a small sonic boom. All targets within Very Close range must succeed on a Strength Reaction Roll or become Vulnerable until the cube is defeated.

@Template[type:emanation|range:vc]

", + "description": "

The Box leaps and their sides clap, creating a small sonic boom. All targets within Very Close range must succeed on a Strength Reaction Roll or become Vulnerable until the cube is defeated.

@Template[type:emanation|range:vc]

", "resource": null, "actions": { "LQtopkrtSlCQ5MAr": { "type": "attack", "_id": "LQtopkrtSlCQ5MAr", "systemPath": "actions", - "description": "", + "description": "

The Box leaps and their sides clap, creating a small sonic boom. All targets within Very Close range must succeed on a Strength Reaction Roll or become Vulnerable until the cube is defeated.

@Template[type:emanation|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -864,8 +858,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "ijIaKjroxq3xZd9Z", "img": "icons/magic/sonic/explosion-impact-shock-wave.webp", @@ -925,14 +918,14 @@ "name": "Psionic Whine", "type": "feature", "system": { - "description": "

The @Lookup[@name] releases a cluster of mechanical bees whose buzz rattles mortal minds. All targets within Close range must succeed on a Presence Reaction Roll or take 2d4+9 direct magic damage.

@Template[type:emanation|range:c]

", + "description": "

The Box releases a cluster of mechanical bees whose buzz rattles mortal minds. All targets within Close range must succeed on a Presence Reaction Roll or take 2d4+9 direct magic damage.

@Template[type:emanation|range:c]

", "resource": null, "actions": { "3R3pGOUj4rHaUzPK": { "type": "attack", "_id": "3R3pGOUj4rHaUzPK", "systemPath": "actions", - "description": "", + "description": "

The Box releases a cluster of mechanical bees whose buzz rattles mortal minds. All targets within Close range must succeed on a Presence Reaction Roll or take 2d4+9 direct magic damage.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -1003,8 +996,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "JCue4ko61bjhedXv", "img": "icons/creatures/invertebrates/wasp-swarm-tan.webp", @@ -1025,14 +1017,14 @@ "name": "Overcharge", "type": "feature", "system": { - "description": "

Before rolling damage for the @Lookup[@name]’s attack, you can mark a Stress to add a d6 to the damage roll. Additionally, you gain a Fear.

", + "description": "

Before rolling damage for the Box’s attack, you can mark a Stress to add a d6 to the damage roll. Additionally, you gain a Fear.

", "resource": null, "actions": { "3XOvKoYz4CqMNrU9": { "type": "healing", "_id": "3XOvKoYz4CqMNrU9", "systemPath": "actions", - "description": "", + "description": "

Before rolling damage for the Box’s attack, you can mark a Stress to add a d6 to the damage roll. Additionally, you gain a Fear.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -1104,8 +1096,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "ITzpRJr2jWK0Ksmp", "img": "icons/creatures/magical/construct-golem-stone-blue.webp", @@ -1126,14 +1117,14 @@ "name": "Death Quake", "type": "feature", "system": { - "description": "

When the @Lookup[@name] marks their last HP, the magic powering them ruptures in an explosion of force. All targets within Close range must succeed on an Instinct Reaction Roll or take 2d8+1 magic damage

@Template[type:emanation|range:c]

", + "description": "

When the Box marks their last HP, the magic powering them ruptures in an explosion of force. All targets within Close range must succeed on an Instinct Reaction Roll or take 2d8+1 magic damage

@Template[type:emanation|range:c]

", "resource": null, "actions": { "oCpv4zi9jtEpo0K1": { "type": "attack", "_id": "oCpv4zi9jtEpo0K1", "systemPath": "actions", - "description": "", + "description": "

When the Box marks their last HP, the magic powering them ruptures in an explosion of force. All targets within Close range must succeed on an Instinct Reaction Roll or take 2d8+1 magic damage

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -1204,8 +1195,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "YvfzPyJbbv2ia6Yp", "img": "icons/magic/sonic/explosion-shock-wave-teal.webp", diff --git a/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json b/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json index da5de611..e902ac32 100644 --- a/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json +++ b/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json @@ -122,8 +122,7 @@ "source": "Daggerheart SRD", "page": 75, "artist": "" - }, - "size": "large" + } }, "flags": {}, "_id": "71qKDLKO3CsrNkdy", @@ -234,7 +233,7 @@ "_id": "2fXzhh2qil8dw3vw", "img": "icons/skills/melee/strike-slashes-orange.webp", "system": { - "description": "

Targets who mark HP from the @Lookup[@name]’s standard attack are knocked back to Very Close range.

", + "description": "

Targets who mark HP from the Bear’s standard attack are knocked back to Very Close range.

", "resource": null, "actions": {}, "originItemType": null, @@ -267,7 +266,7 @@ "type": "attack", "_id": "PXL3e51eBYZ4O2lb", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to make an attack against a target within Melee range. On a success, deal 3d4+10 physical damage and the target is Restrained until they break free with a successful Strength Roll.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -351,8 +350,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [ { @@ -487,8 +485,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json b/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json index 8ee7c56c..24194f3d 100644 --- a/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json +++ b/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 77, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "B4LZcGuBAHzyVdzy", @@ -229,14 +228,14 @@ "_id": "qEn4baWgkjKtmILp", "img": "icons/equipment/shield/shield-round-boss-wood-brown.webp", "system": { - "description": "

A creature who tries to move within Very Close range of the @Lookup[@name] must succeed on an Agility Roll. If additional @Lookup[@name]s are standing in a line alongside the first, and each is within Melee range of another guard in the line, the Difficulty increases by the total number of guards in that line.

", + "description": "

A creature who tries to move within Very Close range of the Guard must succeed on an Agility Roll. If additional Bladed Guards are standing in a line alongside the first, and each is within Melee range of another guard in the line, the Difficulty increases by the total number of guards in that line.

", "resource": null, "actions": { "3lbeEeJdjzPn0MoG": { "type": "attack", "_id": "3lbeEeJdjzPn0MoG", "systemPath": "actions", - "description": "", + "description": "

A creature who tries to move within Very Close range of the Guard must succeed on an Agility Roll. If additional Bladed Guards are standing in a line alongside the first, and each is within Melee range of another guard in the line, the Difficulty increases by the total number of guards in that line.

", "chatDisplay": true, "actionType": "passive", "cost": [], @@ -309,7 +308,7 @@ "type": "attack", "_id": "TK5R00afB1RIA6gp", "systemPath": "actions", - "description": "", + "description": "

Make an attack against a target within Very Close range. On a success, mark a Stress to Restrain the target until they break free with a successful attack, Finesse Roll, or Strength Roll.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -359,8 +358,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [ { diff --git a/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json b/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json index c829c3f9..d77d3379 100644 --- a/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json +++ b/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json @@ -120,8 +120,7 @@ "source": "Daggerheart SRD", "page": 83, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "2UeZ0tEe7AzgSJNd", @@ -232,7 +231,7 @@ "_id": "yBaLF9DwPH2GSRKf", "img": "icons/magic/time/hourglass-brown-orange.webp", "system": { - "description": "

When you spotlight the @Lookup[@name] and they don’t have a token on their stat block, they can’t act yet. Place a token on their stat block and describe what they’re preparing to do. When you spotlight the @Lookup[@name] and they have a token on their stat block, clear the token and they can act.

", + "description": "

When you spotlight the Zombie and they don’t have a token on their stat block, they can’t act yet. Place a token on their stat block and describe what they’re preparing to do. When you spotlight the Zombie and they have a token on their stat block, clear the token and they can act.

", "resource": { "type": "simple", "value": 0, @@ -263,14 +262,14 @@ "_id": "LP7xVLMTkJsmiIvl", "img": "icons/skills/melee/strike-slashes-red.webp", "system": { - "description": "

Make a standard attack with advantage against a target the @Lookup[@name] has Restrained. On a success, the attack deals direct damage.

", + "description": "

Make a standard attack with advantage against a target the Zombie has Restrained. On a success, the attack deals direct damage.

", "resource": null, "actions": { "qCcWw60cPZnEWbpG": { "type": "attack", "_id": "qCcWw60cPZnEWbpG", "systemPath": "actions", - "description": "", + "description": "

Make a standard attack with advantage against a target the Zombie has Restrained. On a success, the attack deals direct damage.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -308,8 +307,7 @@ } } ], - "includeBase": false, - "direct": true + "includeBase": false }, "target": { "type": "any", @@ -321,7 +319,7 @@ "trait": null, "difficulty": null, "bonus": null, - "advState": "advantage", + "advState": "neutral", "diceRolling": { "multiplier": "prof", "flatMultiplier": 1, @@ -343,8 +341,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -365,14 +362,14 @@ "_id": "69reUZ5tv3splqyO", "img": "icons/creatures/abilities/mouth-teeth-lamprey-red.webp", "system": { - "description": "

When the @Lookup[@name] makes a successful standard attack, you can mark a Stress to temporarily Restrain the target and force them to mark 2 Stress.

", + "description": "

When the Zombies makes a successful standard attack, you can mark a Stress to temporarily Restrain the target and force them to mark 2 Stress.

", "resource": null, "actions": { "xV1z3dk9c7jIkk7v": { "type": "damage", "_id": "xV1z3dk9c7jIkk7v", "systemPath": "actions", - "description": "", + "description": "

When the Zombies makes a successful standard attack, you can mark a Stress to temporarily Restrain the target and force them to mark 2 Stress.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -435,8 +432,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [ { diff --git a/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json b/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json index 5b2d2e41..3ccac5dd 100644 --- a/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json +++ b/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json @@ -39,8 +39,7 @@ "experiences": { "7GpgCWSe6hNwnOO7": { "name": "Throw", - "value": 2, - "description": "" + "value": 2 } }, "bonuses": { @@ -106,8 +105,7 @@ }, "base": false } - ], - "direct": true + ] }, "name": "Club", "img": "icons/weapons/clubs/club-banded-barbed-black.webp", @@ -118,8 +116,7 @@ "source": "Daggerheart SRD", "page": 75, "artist": "" - }, - "size": "large" + } }, "flags": {}, "_id": "8Zkqk1jU09nKL2fy", @@ -230,14 +227,14 @@ "_id": "ynuyMl1sMQYINfcQ", "img": "icons/weapons/clubs/club-spiked-glowing.webp", "system": { - "description": "

You must spend a Fear to spotlight the @Lookup[@name]. While spotlighted, they can make their standard attack against all targets within range.

", + "description": "

You must spend a Fear to spotlight the Ogre. While spotlighted, they can make their standard attack against all targets within range.

", "resource": null, "actions": { "UoZ6vXRXvWYjpJpZ": { "type": "effect", "_id": "UoZ6vXRXvWYjpJpZ", "systemPath": "actions", - "description": "", + "description": "

You must spend a Fear to spotlight the Ogre. While spotlighted, they can make their standard attack against all targets within range.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -286,7 +283,7 @@ "_id": "szu5YYQ6klkDbqAT", "img": "icons/skills/wounds/bone-broken-marrow-red.webp", "system": { - "description": "

The @Lookup[@name]’s attacks deal direct damage.

", + "description": "

The Ogre’s attacks deal direct damage.

", "resource": null, "actions": {}, "originItemType": null, @@ -312,14 +309,14 @@ "_id": "zGvaBYJPOOnQVQEn", "img": "icons/magic/earth/projectile-stone-boulder-orange.webp", "system": { - "description": "

Mark a Stress to pick up heavy objects and throw them at all targets in front of the @Lookup[@name] within Far range. Make an attack against these targets. Targets the @Lookup[@name] succeeds against take 1d10+2 physical damage. If they succeed against more than one target, you gain a Fear.

@Template[type:inFront|range:f]

", + "description": "

Mark a Stress to pick up heavy objects and throw them at all targets in front of the Ogre within Far range. Make an attack against these targets. Targets the Ogre succeeds against take 1d10+2 physical damage. If they succeed against more than one target, you gain a Fear.

@Template[type:inFront|range:f]

", "resource": null, "actions": { "3p1qfHy5uHe4H2hB": { "type": "attack", "_id": "3p1qfHy5uHe4H2hB", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to pick up heavy objects and throw them at all targets in front of the Ogre within Far range. Make an attack against these targets. Targets the Ogre succeeds against take 1d10+2 physical damage. If they succeed against more than one target, you gain a Fear.

@Template[type:inFront|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -340,11 +337,10 @@ { "value": { "custom": { - "enabled": false, - "formula": "" + "enabled": false }, "flatMultiplier": 1, - "dice": "d10", + "dice": "d12", "bonus": 2, "multiplier": "flat" }, @@ -360,14 +356,12 @@ "dice": "d6", "bonus": null, "custom": { - "enabled": false, - "formula": "" + "enabled": false } } } ], - "includeBase": false, - "direct": true + "includeBase": false }, "target": { "type": "any", @@ -468,8 +462,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -490,14 +483,14 @@ "_id": "Qxkddj6nQc4RDExW", "img": "icons/skills/melee/strike-flail-destructive-yellow.webp", "system": { - "description": "

When the @Lookup[@name] marks 2 or more HP, they can rampage. Move the @Lookup[@name] to a point within Close range and deal 2d6+3 direct physical damage to all targets in their path.

", + "description": "

When the Ogre marks 2 or more HP, they can rampage. Move the Ogre to a point within Close range and deal 2d6+3 direct physical damage to all targets in their path.

", "resource": null, "actions": { "PtTu9bnCJKMySBSV": { "type": "damage", "_id": "PtTu9bnCJKMySBSV", "systemPath": "actions", - "description": "", + "description": "

When the Ogre marks 2 or more HP, they can rampage. Move the Ogre to a point within Close range and deal 2d6+3 direct physical damage to all targets in their path.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -535,8 +528,7 @@ } } ], - "includeBase": false, - "direct": true + "includeBase": false }, "target": { "type": "any", @@ -550,8 +542,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json b/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json index f548870a..a9686bf0 100644 --- a/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json +++ b/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 85, "artist": "" - }, - "size": "tiny" + } }, "flags": {}, "_id": "jDmHqGvzg5wjgmxE", @@ -221,7 +220,7 @@ "name": "Levitation", "type": "feature", "system": { - "description": "

The @Lookup[@name] levitates several feet off the ground and can’t be Restrained.

", + "description": "

The Skull levitates several feet off the ground and can’t be Restrained.

", "resource": null, "actions": {}, "originItemType": null, @@ -290,7 +289,7 @@ "name": "Wards", "type": "feature", "system": { - "description": "

The @Lookup[@name] is resistant to magic damage.

", + "description": "

The Skull is resistant to magic damage.

", "resource": null, "actions": {}, "originItemType": null, @@ -359,14 +358,14 @@ "name": "Magic Burst", "type": "feature", "system": { - "description": "

Mark a Stress to make an attack against all targets within Close range. Targets the @Lookup[@name] succeeds against take 2d6+4 magic damage.

@Template[type:emanation|range:c]

", + "description": "

Mark a Stress to make an attack against all targets within Close range. Targets the Skull succeeds against take 2d6+4 magic damage.

@Template[type:emanation|range:c]

", "resource": null, "actions": { "iF0PD1t3yovKMTfy": { "type": "attack", "_id": "iF0PD1t3yovKMTfy", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to make an attack against all targets within Close range. Targets the Skull succeeds against take 2d6+4 magic damage.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -444,8 +443,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "Zn25zBr96y1hrmnr", "img": "icons/magic/lightning/bolt-strike-purple.webp", @@ -466,14 +464,14 @@ "name": "Siphon Magic", "type": "feature", "system": { - "description": "

Spend a Fear to make an attack against a PC with a Spellcast trait within Very Close range. On a success, the target marks 1d4 Stress and the @Lookup[@name] clears that many Stress. Additionally, on a success, the @Lookup[@name] can immediately be spotlighted again.

", + "description": "

Spend a Fear to make an attack against a PC with a Spellcast trait within Very Close range. On a success, the target marks 1d4 Stress and the Skull clears that many Stress. Additionally, on a success, the Skull can immediately be spotlighted again.

", "resource": null, "actions": { "872Fq88Hitwc6f3W": { "type": "attack", "_id": "872Fq88Hitwc6f3W", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to make an attack against a PC with a Spellcast trait within Very Close range. On a success, the target marks 1d4 Stress and the Skull clears that many Stress. Additionally, on a success, the Skull can immediately be spotlighted again.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -542,8 +540,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "urXRi4bdBfvl8U6K", "img": "icons/magic/control/sihouette-hold-beam-green.webp", diff --git a/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json b/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json index c5b4357d..bf302c3f 100644 --- a/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json +++ b/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json @@ -104,8 +104,7 @@ "source": "Daggerheart SRD", "page": 85, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "99TqczuQipBmaB8i", @@ -214,7 +213,7 @@ "name": "Minion (6)", "type": "feature", "system": { - "description": "

The @Lookup[@name] is defeated when they take any damage. For every 6 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

", + "description": "

The Conscript is defeated when they take any damage. For every 6 damage a PC deals to the Conscript, defeat an additional Minion within range the attack would succeed against.

", "resource": null, "actions": {}, "originItemType": null, @@ -239,14 +238,14 @@ "name": "Group Attack", "type": "feature", "system": { - "description": "

Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 6 physical damage each. Combine this damage.

", + "description": "

Spend a Fear to choose a target and spotlight all Conscripts within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 6 physical damage each. Combine this damage.

", "resource": null, "actions": { "cbAvPSIhwBMBTI3D": { "type": "effect", "_id": "cbAvPSIhwBMBTI3D", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to choose a target and spotlight all Conscripts within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 6 physical damage each. Combine this damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -273,8 +272,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "MWfKUGzT1YBmLvpn", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", diff --git a/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json b/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json index 310eefce..b8d8cfa0 100644 --- a/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json +++ b/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 75, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "uOP5oT9QzXPlnf3p", @@ -223,14 +222,14 @@ "_id": "y3oUmDLGkcSjOO5Q", "img": "icons/magic/unholy/silhouette-evil-horned-giant.webp", "system": { - "description": "

The @Lookup[@name] can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

", + "description": "

The Construct can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

", "resource": null, "actions": { "bay0pyPsCyDEZKuk": { "type": "effect", "_id": "bay0pyPsCyDEZKuk", "systemPath": "actions", - "description": "", + "description": "

The Construct can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -282,7 +281,7 @@ "_id": "p4HLIkiM3HsglRoA", "img": "icons/commodities/metal/barstock-broken-steel.webp", "system": { - "description": "

When the @Lookup[@name] marks HP from physical damage, they must mark an additional HP.

", + "description": "

When the Construct marks HP from physical damage, they must mark an additional HP.

", "resource": null, "actions": {}, "originItemType": null, @@ -308,14 +307,14 @@ "_id": "93m085bEaKFzvEWT", "img": "icons/skills/movement/arrow-upward-blue.webp", "system": { - "description": "

Mark a Stress to make an attack against all targets in the @Lookup[@name]’s path when they move. Targets the @Lookup[@name] succeeds against take 1d8 physical damage.

", + "description": "

Mark a Stress to make an attack against all targets in the Construct’s path when they move. Targets the Construct succeeds against take 1d8 physical damage.

", "resource": null, "actions": { "OswphW4Z1B5oa4ts": { "type": "attack", "_id": "OswphW4Z1B5oa4ts", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to make an attack against all targets in the Construct’s path when they move. Targets the Construct succeeds against take 1d8 physical damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -394,8 +393,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -416,14 +414,14 @@ "_id": "EF6YIDjQ0liFubGA", "img": "icons/creatures/magical/construct-golem-stone-blue.webp", "system": { - "description": "

Before rolling damage for the @Lookup[@name]’s attack, you can mark a Stress to gain a +10 bonus to the damage roll. The @Lookup[@name] can then take the spotlight again.

", + "description": "

Before rolling damage for the Construct’s attack, you can mark a Stress to gain a +10 bonus to the damage roll. The Construct can then take the spotlight again.

", "resource": null, "actions": { "xYACTiZzApmCXXmf": { "type": "effect", "_id": "xYACTiZzApmCXXmf", "systemPath": "actions", - "description": "", + "description": "

Before rolling damage for the Construct’s attack, you can mark a Stress to gain a +10 bonus to the damage roll. The Construct can then take the spotlight again.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -451,8 +449,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [ { @@ -517,14 +514,14 @@ "_id": "UlGLuV1L33tDWkli", "img": "icons/magic/sonic/explosion-shock-wave-teal.webp", "system": { - "description": "

When the @Lookup[@name] marks their last HP, the magic powering them ruptures in an explosion of force. Make an attack with advantage against all targets within Very Close range. Targets the @Lookup[@name] succeeds against take 1d12+2 magic damage.

", + "description": "

When the Construct marks their last HP, the magic powering them ruptures in an explosion of force. Make an attack with advantage against all targets within Very Close range. Targets the Construct succeeds against take 1d12+2 magic damage.

", "resource": null, "actions": { "fkIWRdcGPgHgm6VC": { "type": "attack", "_id": "fkIWRdcGPgHgm6VC", "systemPath": "actions", - "description": "", + "description": "

When the Construct marks their last HP, the magic powering them ruptures in an explosion of force. Make an attack with advantage against all targets within Very Close range. Targets the Construct succeeds against take 1d12+2 magic damage.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -596,8 +593,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json b/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json index 668cd943..f6b94677 100644 --- a/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json +++ b/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json @@ -122,8 +122,7 @@ "source": "Daggerheart SRD", "page": 85, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "ZxWaWPdzFIUPNC62", @@ -232,14 +231,14 @@ "name": "Searing Glance", "type": "feature", "system": { - "description": "

When a PC within Close range makes a Presence Roll, you can mark a Stress to cast a gaze toward the aftermath. On the target’s failure, they must mark 2 Stress and are Vulnerable until the scene ends or they succeed on a social action against the @Lookup[@name]. On the target’s success, they must mark a Stress.

", + "description": "

When a PC within Close range makes a Presence Roll, you can mark a Stress to cast a gaze toward the aftermath. On the target’s failure, they must mark 2 Stress and are Vulnerable until the scene ends or they succeed on a social action against the Courtesan. On the target’s success, they must mark a Stress.

", "resource": null, "actions": { "dRtDCrAPLc1GYqBs": { "type": "damage", "_id": "dRtDCrAPLc1GYqBs", "systemPath": "actions", - "description": "", + "description": "

When a PC within Close range makes a Presence Roll, you can mark a Stress to cast a gaze toward the aftermath. On the target’s failure, they must mark 2 Stress and are Vulnerable until the scene ends or they succeed on a social action against the Courtesan. On the target’s success, they must mark a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -301,8 +300,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "rSMUPC5GhR982ifg", "img": "icons/magic/perception/eye-slit-orange.webp", diff --git a/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json b/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json index 6721666f..28222226 100644 --- a/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json +++ b/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 76, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "CBBuEXAlLKFMJdjg", @@ -236,7 +235,7 @@ "type": "attack", "_id": "Yi3rvjj0Umqt5Z8j", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to say something mocking and force a target within Close range to make a Presence Reaction Roll (14) to see if they can save face. On a failure, the target must mark 2 Stress and is Vulnerable until the scene ends.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -319,8 +318,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [ { @@ -380,14 +378,14 @@ "_id": "Ux42ELBBuSYwm4yW", "img": "icons/skills/social/diplomacy-unity-alliance.webp", "system": { - "description": "

Spend a Fear and target a PC. The @Lookup[@name] convinces a crowd or prominent individual that the target is the cause of their current conflict or misfortune.

", + "description": "

Spend a Fear and target a PC. The Courtier convinces a crowd or prominent individual that the target is the cause of their current conflict or misfortune.

", "resource": null, "actions": { "IwuFowlcXyjvfOxp": { "type": "effect", "_id": "IwuFowlcXyjvfOxp", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear and target a PC. The Courtier convinces a crowd or prominent individual that the target is the cause of their current conflict or misfortune.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -415,8 +413,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json b/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json index 14eb579b..7c90a78b 100644 --- a/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json +++ b/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json @@ -122,8 +122,7 @@ "source": "Daggerheart SRD", "page": 85, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "0NxCSugvKQ4W8OYZ", @@ -239,7 +238,7 @@ "type": "attack", "_id": "TQv3o9sRnlDNbPyu", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to make a standard attack against a target within range. On a success, the target must mark a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -342,8 +341,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "kCffzM8rX8NEr9d2", "img": "icons/magic/unholy/beam-ringed-impact-purple.webp", @@ -364,14 +362,14 @@ "name": "Shroud of the Fallen", "type": "feature", "system": { - "description": "

Mark a Stress to wrap an ally within Close range in a shroud of Protection until the @Lookup[@name] marks their last HP. While Protected, the target has resistance to all damage.

", + "description": "

Mark a Stress to wrap an ally within Close range in a shroud of Protection until the Adept marks their last HP. While Protected, the target has resistance to all damage.

", "resource": null, "actions": { "8yRj7EpEI4PlKNhl": { "type": "effect", "_id": "8yRj7EpEI4PlKNhl", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to wrap an ally within Close range in a shroud of Protection until the Adept marks their last HP. While Protected, the target has resistance to all damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -403,8 +401,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "IHWDn097sRgjlZXO", "img": "icons/magic/unholy/orb-contained-pink.webp", @@ -482,7 +479,7 @@ "type": "effect", "_id": "g4RDHrY0AEYXjH52", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear and choose a point within Far range. All targets within Close range of that point are Restrained in smoky chains until they break free with a successful Strength or Instinct Roll. A target Restrained by this feature must spend a Hope to make an action roll.

@Template[type:circle|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -514,8 +511,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "JpSrduK3vjd9h098", "img": "icons/magic/air/fog-gas-smoke-dense-pink.webp", @@ -582,7 +578,7 @@ "type": "healing", "_id": "3tibqB97ooJesxf0", "systemPath": "actions", - "description": "", + "description": "

Twice per scene, when a PC rolls a failure with Fear, clear a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -647,8 +643,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "x6FbcrfOscb3er6P", "img": "icons/magic/unholy/silhouette-robe-evil-glow.webp", diff --git a/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json b/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json index 57e7a7c7..76a338d2 100644 --- a/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json +++ b/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 86, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "tyBOpLfigAhI9bU3", @@ -221,14 +220,14 @@ "name": "Shadow's Embrace", "type": "feature", "system": { - "description": "

The @Lookup[@name] can climb and walk on vertical surfaces. Mark a Stress to move from one shadow to another within Far range.

", + "description": "

The Fang can climb and walk on vertical surfaces. Mark a Stress to move from one shadow to another within Far range.

", "resource": null, "actions": { "hjuqvsMB7KNLNvjg": { "type": "effect", "_id": "hjuqvsMB7KNLNvjg", "systemPath": "actions", - "description": "", + "description": "

The Fang can climb and walk on vertical surfaces. Mark a Stress to move from one shadow to another within Far range.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -276,14 +275,14 @@ "name": "Pick Off the Straggler", "type": "feature", "system": { - "description": "

Mark a Stress to cause a target within Melee range to make an Instinct Reaction Roll. On a failure, the target must mark 2 Stress and is teleported with the @Lookup[@name] to a shadow within Far range, making them temporarily Vulnerable. On a success, the target must mark a Stress.

", + "description": "

Mark a Stress to cause a target within Melee range to make an Instinct Reaction Roll. On a failure, the target must mark 2 Stress and is teleported with the Fang to a shadow within Far range, making them temporarily Vulnerable. On a success, the target must mark a Stress.

", "resource": null, "actions": { "QjQ04SAwfjrxliNI": { "type": "attack", "_id": "QjQ04SAwfjrxliNI", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to cause a target within Melee range to make an Instinct Reaction Roll. On a failure, the target must mark 2 Stress and is teleported with the Fang to a shadow within Far range, making them temporarily Vulnerable. On a success, the target must mark a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -365,8 +364,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "ohASSruBxcvuItIK", "img": "icons/magic/unholy/barrier-fire-pink.webp", diff --git a/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json b/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json index 0e14a661..f748df8b 100644 --- a/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json +++ b/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json @@ -104,8 +104,7 @@ "source": "Daggerheart SRD", "page": 86, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "zx99sOGTXicP4SSD", @@ -214,7 +213,7 @@ "name": "Minion (6)", "type": "feature", "system": { - "description": "

The @Lookup[@name] is defeated when they take any damage. For every 6 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

", + "description": "

The Initiate is defeated when they take any damage. For every 6 damage a PC deals to the Initiate, defeat an additional Minion within range the attack would succeed against.

", "resource": null, "actions": {}, "originItemType": null, @@ -239,14 +238,14 @@ "name": "Group Attack", "type": "feature", "system": { - "description": "

Spend a Fear to choose a target and spotlight all Cult @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 5 physical damage each. Combine this damage.

", + "description": "

Spend a Fear to choose a target and spotlight all Cult Initiates within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 5 physical damage each. Combine this damage.

", "resource": null, "actions": { "EH1preaTWBD4rOvx": { "type": "effect", "_id": "EH1preaTWBD4rOvx", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to choose a target and spotlight all Cult Initiates within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 5 physical damage each. Combine this damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -273,8 +272,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "WP6xQtYzouPEFr82", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", diff --git a/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json b/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json index cd745eb6..eea41180 100644 --- a/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json +++ b/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json @@ -116,8 +116,7 @@ "source": "Daggerheart SRD", "page": 76, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "9x2xY9zwc3xzbXo5", @@ -235,7 +234,7 @@ "type": "damage", "_id": "55hCZsJQhJNcZ0lX", "systemPath": "actions", - "description": "", + "description": "

Slam the ground, knocking all targets within Very Close range back to Far range. Each target knocked back this way must mark a Stress.

@Template[type:emanation|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -286,8 +285,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -308,14 +306,14 @@ "_id": "rreGFW5TbhUoZf2T", "img": "icons/magic/nature/root-vine-entangled-hand.webp", "system": { - "description": "

Make an attack against a target within Close range. On a success, spend a Fear to pull them into Melee range, deal 1d6+2 physical damage, and Restrain them until the @Lookup[@name] takes Severe damage.

", + "description": "

Make an attack against a target within Close range. On a success, spend a Fear to pull them into Melee range, deal 1d6+2 physical damage, and Restrain them until the Defender takes Severe damage.

", "resource": null, "actions": { "nQ3vXrrKBizZoaDt": { "type": "attack", "_id": "nQ3vXrrKBizZoaDt", "systemPath": "actions", - "description": "", + "description": "

Make an attack against a target within Close range. On a success, spend a Fear to pull them into Melee range, deal 1d6+2 physical damage, and Restrain them until the Defender takes Severe damage.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -390,8 +388,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [ { diff --git a/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json b/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json index e4ba41fb..3c76628d 100644 --- a/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json +++ b/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 91, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "pnyjIGxxvurcWmTv", @@ -227,7 +226,7 @@ "name": "Money Talks", "type": "feature", "system": { - "description": "

Attacks against the @Lookup[@name] are made with disadvantage unless the attacker spends a handful of gold. This @Lookup[@name] starts with a number of handfuls equal to the number of PCs. When a target marks HP from the @Lookup[@name]’s standard attack, they can spend a handful of gold instead of marking HP (1 handful per HP). Add a handful of gold to the @Lookup[@name] for each handful of gold spent by PCs on this feature.

", + "description": "

Attacks against the Demon are made with disadvantage unless the attacker spends a handful of gold. This Demon starts with a number of handfuls equal to the number of PCs. When a target marks HP from the Demon’s standard attack, they can spend a handful of gold instead of marking HP (1 handful per HP). Add a handful of gold to the Demon for each handful of gold spent by PCs on this feature.

", "resource": null, "actions": {}, "originItemType": null, @@ -252,7 +251,7 @@ "name": "Number Must Go Up", "type": "feature", "system": { - "description": "

Add a bonus to the @Lookup[@name]’s attack rolls equal to the number of handfuls of gold they have.

", + "description": "

Add a bonus to the Demon’s attack rolls equal to the number of handfuls of gold they have.

", "resource": { "type": "simple", "value": 0, @@ -284,7 +283,7 @@ "key": "system.bonuses.roll.attack.bonus", "mode": 2, "value": "ITEM.@system.resource.value", - "priority": 21 + "priority": null } ], "disabled": false, @@ -330,8 +329,7 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "BKgv2D1IdI813R8k", "img": "icons/skills/movement/arrows-up-trio-red.webp", diff --git a/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json b/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json index b1804074..3ae3639d 100644 --- a/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json +++ b/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 92, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "kE4dfhqmIQpNd44e", @@ -227,7 +226,7 @@ "name": "Depths of Despair", "type": "feature", "system": { - "description": "

The @Lookup[@name] deals double damage to PCs with 0 Hope.

", + "description": "

The Demon deals double damage to PCs with 0 Hope.

", "resource": null, "actions": {}, "originItemType": null, @@ -259,7 +258,7 @@ "type": "effect", "_id": "n0RYO05pROFU6ov3", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to weigh down the spirits of all PCs within Far range. All targets affected replace their Hope Die with a d8 until they roll a success with Hope or their next rest.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -291,8 +290,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "FC8PIf4BVkhmoJX8", "img": "icons/magic/death/skull-flames-white-blue.webp", @@ -357,7 +355,7 @@ "type": "damage", "_id": "urrp8SCFgqbmSTvm", "systemPath": "actions", - "description": "", + "description": "

When a PC fails with Fear, you can mark a Stress to cause all other PCs within Close range to lose a Hope.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -414,8 +412,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "dlMdfUjy2GaqgeOJ", "img": "icons/creatures/unholy/demon-fire-horned-mask.webp", @@ -436,14 +433,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Demon makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "N0Xx6GnijLXIMGBw": { "type": "healing", "_id": "N0Xx6GnijLXIMGBw", "systemPath": "actions", - "description": "", + "description": "

When the Demon makes a successful attack against a PC, you gain a Fear.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -510,8 +507,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "7qjx1c4C1fUfvXnu", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json b/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json index 16bc1d1f..b425ec66 100644 --- a/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json +++ b/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 92, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "2VN3BftageoTTIzu", @@ -227,14 +226,14 @@ "name": "Terrifying", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack, all PCs within Far range must lose a Hope and you gain a Fear.

@Template[type:emanation|range:f]

", + "description": "

When the Demon makes a successful attack, all PCs within Far range must lose a Hope and you gain a Fear.

@Template[type:emanation|range:f]

", "resource": null, "actions": { "v3XbljQeHEyfuSXz": { "type": "damage", "_id": "v3XbljQeHEyfuSXz", "systemPath": "actions", - "description": "", + "description": "

When the Demon makes a successful attack, all PCs within Far range must lose a Hope and you gain a Fear.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -319,7 +318,7 @@ "type": "damage", "_id": "nNfWqBgysVPtFh4w", "systemPath": "actions", - "description": "", + "description": "

When a PC within Far range fails a roll, they can choose to reroll their Fear Die and take the new result. If they still fail, they mark 2 Stress and the Demon clears a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -390,14 +389,14 @@ "name": "Unparalleled Skill", "type": "feature", "system": { - "description": "

Mark a Stress to deal the @Lookup[@name]’s standard attack damage to a target within Close range.

", + "description": "

Mark a Stress to deal the Demon’s standard attack damage to a target within Close range.

", "resource": null, "actions": { "MYOD2VAfdVC6hMCs": { "type": "damage", "_id": "MYOD2VAfdVC6hMCs", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to deal the Demon’s standard attack damage to a target within Close range.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -455,8 +454,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "Y3W44ifKIcoYpONN", "img": "icons/skills/melee/spear-tips-quintuple-orange.webp", @@ -484,7 +482,7 @@ "type": "effect", "_id": "ozGST8UY2MJnrd3w", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to spotlight two other Demons within Far range.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -511,8 +509,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "6BKWOTuxQWJd5RP5", "img": "icons/creatures/unholy/demon-fire-horned-winged-roar.webp", @@ -533,14 +530,14 @@ "name": "You Pale in Comparison", "type": "feature", "system": { - "description": "

When a PC fails a roll within Close range of the @Lookup[@name], they must mark a Stress.

@Template[type:emanation|range:c]

", + "description": "

When a PC fails a roll within Close range of the Demon, they must mark a Stress.

@Template[type:emanation|range:c]

", "resource": null, "actions": { "kuCPWb9cu3pZdAhh": { "type": "damage", "_id": "kuCPWb9cu3pZdAhh", "systemPath": "actions", - "description": "", + "description": "

When a PC fails a roll within Close range of the Demon, they must mark a Stress.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -590,8 +587,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "FLp1dPSJz1ezY0gD", "img": "icons/magic/control/fear-fright-shadow-monster-red.webp", diff --git a/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json b/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json index 31f9b942..08b22a0b 100644 --- a/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json +++ b/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json @@ -107,8 +107,7 @@ }, "base": false } - ], - "direct": true + ] }, "img": "icons/magic/symbols/rune-sigil-rough-white-teal.webp", "type": "attack", @@ -118,8 +117,7 @@ "source": "Daggerheart SRD", "page": 92, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "SxSOkM4bcVOFyjbo", @@ -228,7 +226,7 @@ "name": "Unprotected Mind", "type": "feature", "system": { - "description": "

The @Lookup[@name]’s standard attack deals direct damage.

", + "description": "

The Demon’s standard attack deals direct damage.

", "resource": null, "actions": {}, "originItemType": null, @@ -253,12 +251,11 @@ "name": "My Turn", "type": "feature", "system": { - "description": "

When the @Lookup[@name] marks HP from an attack, spend a number of Fear equal to the HP marked by the @Lookup[@name] to cause the attacker to mark the same number of HP.

", + "description": "

When the Demon marks HP from an attack, spend a number of Fear equal to the HP marked by the Demon to cause the attacker to mark the same number of HP.

", "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "KVyhgMJSSHTwRISA", "img": "icons/magic/control/fear-fright-monster-grin-purple-blue.webp", @@ -286,7 +283,7 @@ "type": "effect", "_id": "UU3H5aPQejOSoFZw", "systemPath": "actions", - "description": "", + "description": "

When a creature within Close range takes damage from a different adversary, you can mark a Stress to add a d4 to the damage roll.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -313,8 +310,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "pSAupMWw1eYqm84z", "img": "icons/magic/perception/eye-ringed-glow-angry-small-teal.webp", @@ -335,14 +331,14 @@ "name": "What's Yours Is Mine", "type": "feature", "system": { - "description": "

When a PC takes Severe damage within Very Close range of the @Lookup[@name], you can spend a Fear to cause the target to make a Finesse Reaction Roll. On a failure, the @Lookup[@name] seizes one item or consumable of their choice from the target’s inventory.

@Template[type:emanation|range:vc]

", + "description": "

When a PC takes Severe damage within Very Close range of the Demon, you can spend a Fear to cause the target to make a Finesse Reaction Roll. On a failure, the Demon seizes one item or consumable of their choice from the target’s inventory.

@Template[type:emanation|range:vc]

", "resource": null, "actions": { "3cGZ2CofM9HUlELH": { "type": "attack", "_id": "3cGZ2CofM9HUlELH", "systemPath": "actions", - "description": "", + "description": "

When a PC takes Severe damage within Very Close range of the Demon, you can spend a Fear to cause the target to make a Finesse Reaction Roll. On a failure, the Demon seizes one item or consumable of their choice from the target’s inventory.

@Template[type:emanation|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -386,8 +382,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "589tCxFc8KZ3rdzP", "img": "icons/magic/perception/hand-eye-black.webp", diff --git a/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json b/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json index 9e838d6d..13b9d624 100644 --- a/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json +++ b/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json @@ -108,8 +108,7 @@ }, "base": false } - ], - "direct": true + ] }, "type": "attack", "chatDisplay": false @@ -118,8 +117,7 @@ "source": "Daggerheart SRD", "page": 92, "artist": "" - }, - "size": "large" + } }, "flags": {}, "_id": "5lphJAgzoqZI3VoG", @@ -228,7 +226,7 @@ "name": "Anger Unrelenting", "type": "feature", "system": { - "description": "

The @Lookup[@name]’s attacks deal direct damage.

", + "description": "

The Demon’s attacks deal direct damage.

", "resource": null, "actions": {}, "originItemType": null, @@ -260,7 +258,7 @@ "type": "effect", "_id": "V142qYppCGJn8OiN", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to boil the blood of all PCs within Far range. They use a d20 as their Fear Die until the end of the scene.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -287,8 +285,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "a33PW8UkziliowlR", "img": "icons/skills/melee/maneuver-greatsword-yellow.webp", @@ -309,14 +306,14 @@ "name": "Retalliation", "type": "feature", "system": { - "description": "

When the @Lookup[@name] takes damage from an attack within Close range, you can mark a Stress to make a standard attack against the attacker.

@Template[type:emanation|range:c]

", + "description": "

When the Demon takes damage from an attack within Close range, you can mark a Stress to make a standard attack against the attacker.

@Template[type:emanation|range:c]

", "resource": null, "actions": { "hxrdtBm4dYN7KGZm": { "type": "attack", "_id": "hxrdtBm4dYN7KGZm", "systemPath": "actions", - "description": "", + "description": "

When the Demon takes damage from an attack within Close range, you can mark a Stress to make a standard attack against the attacker.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -361,8 +358,7 @@ } } ], - "includeBase": false, - "direct": true + "includeBase": false }, "target": { "type": "any", @@ -395,8 +391,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "DjGydqLXT4rDa7Av", "img": "icons/skills/melee/blood-slash-foam-red.webp", @@ -417,14 +412,14 @@ "name": "Blood and Souls", "type": "feature", "system": { - "description": "

Countdown (Loop 6). Activate the first time an attack is made within sight of the @Lookup[@name]. It ticks down when a PC takes a violent action. When it triggers, summon [[/r 1d4]]@UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demons}, who appear at Close range.

", + "description": "

Countdown (Loop 6). Activate the first time an attack is made within sight of the Demon. It ticks down when a PC takes a violent action. When it triggers, summon [[/r 1d4]]@UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demons}, who appear at Close range.

", "resource": null, "actions": { "szg3qA09aJUt9WKS": { "type": "countdown", "_id": "szg3qA09aJUt9WKS", "systemPath": "actions", - "description": "

Countdown (Loop 6). Activate the first time an attack is made within sight of the @Lookup[@name]. It ticks down when a PC takes a violent action.

", + "description": "

Countdown (Loop 6). Activate the first time an attack is made within sight of the Demon. It ticks down when a PC takes a violent action.

", "chatDisplay": true, "originItem": { "type": "itemCollection" @@ -485,8 +480,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "2F75BO0xEU8Zlj7T", "img": "icons/creatures/unholy/demon-fire-horned-clawed.webp", diff --git a/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json b/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json index 2947b7a1..b7ac7cb5 100644 --- a/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json +++ b/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 86, "artist": "" - }, - "size": "large" + } }, "flags": {}, "_id": "NoRZ1PqB8N5wcIw0", @@ -227,7 +226,7 @@ "name": "Horde (2d4+1)", "type": "feature", "system": { - "description": "

When the @Lookup[@name] has marked half or more of their HP, their standard attack deals 2d4+1 physical damage instead.

", + "description": "

When the Pack has marked half or more of their HP, their standard attack deals 2d4+1 physical damage instead.

", "resource": null, "actions": {}, "originItemType": null, @@ -259,7 +258,7 @@ "type": "damage", "_id": "XyLlX9RWSxciZ7oV", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to make all targets within Very Close range lose a Hope. If a target is not able to lose a Hope, they must instead mark 2 Stress.

@Template[type:emanation|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -309,8 +308,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "WEbHwamS5ZBphiKq", "img": "icons/creatures/unholy/demons-horned-glowing-pink.webp", @@ -331,14 +329,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Pack makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "BApDkAKPfyBkqrKY": { "type": "healing", "_id": "BApDkAKPfyBkqrKY", "systemPath": "actions", - "description": "", + "description": "

When the Pack makes a successful attack against a PC, you gain a Fear.

", "chatDisplay": true, "actionType": "reaction", "cost": [], @@ -405,8 +403,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "3mOBJE5c3cP2cGP1", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json b/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json index 16ec7643..38bba1d3 100644 --- a/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json +++ b/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json @@ -116,8 +116,7 @@ "source": "Daggerheart SRD", "page": 93, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "tBWHW00epmMnkawe", @@ -226,7 +225,7 @@ "name": "Flying", "type": "feature", "system": { - "description": "

While flying, the @Lookup[@name] gains a +3 bonus to their Difficulty.

", + "description": "

While flying, the Bat gains a +3 bonus to their Difficulty.

", "resource": null, "actions": {}, "originItemType": null, @@ -295,14 +294,14 @@ "name": "Screech", "type": "feature", "system": { - "description": "

Mark a Stress to send a high-pitch screech out toward all targets in front of the @Lookup[@name] within Far range. Those targets must mark 1d4 Stress.

@Template[type:inFront|range:f]

", + "description": "

Mark a Stress to send a high-pitch screech out toward all targets in front of the Bat within Far range. Those targets must mark 1d4 Stress.

@Template[type:inFront|range:f]

", "resource": null, "actions": { "2ILfoiBoMyBCtBsL": { "type": "damage", "_id": "2ILfoiBoMyBCtBsL", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to send a high-pitch screech out toward all targets in front of the Bat within Far range. Those targets must mark 1d4 Stress.

@Template[type:inFront|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -351,8 +350,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "o69lipskvBwGVhe4", "img": "icons/magic/sonic/projectile-sound-rings-wave.webp", @@ -380,7 +378,7 @@ "type": "attack", "_id": "wW7WGisUBzyxjsH2", "systemPath": "actions", - "description": "", + "description": "

When an allied Vampire marks HP, you can mark a Stress to fl y into Melee range of the attacker and make an attack with advantage against them. On a success, deal 2d6+2 physical damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -458,8 +456,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "BQPGgbNzKbNkGDJb", "img": "icons/skills/melee/strike-slashes-red.webp", diff --git a/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json b/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json index e3ecda4e..e3b34aea 100644 --- a/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json +++ b/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 76, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "wNzeuQLfLUMvgHlQ", @@ -229,14 +228,14 @@ "_id": "wQXEnMqrl2jo91oy", "img": "icons/creatures/abilities/wolf-howl-moon-purple.webp", "system": { - "description": "

If the @Lookup[@name] makes a successful standard attack and another @Lookup[@name] is within Melee range of the target, deal 1d6+5 physical damage instead of their standard damage and you gain a Fear.

", + "description": "

If the Wolf makes a successful standard attack and another Dire Wolf is within Melee range of the target, deal 1d6+5 physical damage instead of their standard damage and you gain a Fear.

", "resource": null, "actions": { "FFQvt3sMfuwXxIrf": { "type": "attack", "_id": "FFQvt3sMfuwXxIrf", "systemPath": "actions", - "description": "", + "description": "

If the Wolf makes a successful standard attack and another Dire Wolf is within Melee range of the target, deal 1d6+5 physical damage instead of their standard damage and you gain a Fear.

", "chatDisplay": true, "actionType": "passive", "cost": [], @@ -335,7 +334,7 @@ "type": "attack", "_id": "Tvizq1jEfG8FyfNc", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to make an attack against a target within Melee range. On a success, deal 3d4+10 direct physical damage and make them Vulnerable until they clear at least 1 HP.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -378,8 +377,7 @@ } } ], - "includeBase": false, - "direct": true + "includeBase": false }, "target": { "type": "any", @@ -418,8 +416,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [ { diff --git a/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json b/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json index f0a5d81c..845e447a 100644 --- a/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json +++ b/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 93, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "wR7cFKrHvRzbzhBT", @@ -227,14 +226,14 @@ "name": "Bramble Patch", "type": "feature", "system": { - "description": "

Mark a Stress to target a point within Far range. Create a patch of thorns that covers an area within Close range of that point. All targets within that area take 2d6+2 physical damage when they act. A target must succeed on a Finesse Roll or deal more than 20 damage to the @Lookup[@name] with an attack to leave the area.

@Template[type:circle|range:c]

", + "description": "

Mark a Stress to target a point within Far range. Create a patch of thorns that covers an area within Close range of that point. All targets within that area take 2d6+2 physical damage when they act. A target must succeed on a Finesse Roll or deal more than 20 damage to the Dryad with an attack to leave the area.

@Template[type:circle|range:c]

", "resource": null, "actions": { "iCJdIs57hfh5Cb0u": { "type": "attack", "_id": "iCJdIs57hfh5Cb0u", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to target a point within Far range. Create a patch of thorns that covers an area within Close range of that point. All targets within that area take 2d6+2 physical damage when they act. A target must succeed on a Finesse Roll or deal more than 20 damage to the Dryad with an attack to leave the area.

@Template[type:circle|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -338,8 +337,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "i9HbArl09dX2BvzY", "img": "icons/magic/nature/root-vines-grow-brown.webp", @@ -367,7 +365,7 @@ "type": "effect", "_id": "84Q2b0zIY9c7Yhho", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to grow three @UUID[Compendium.daggerheart.adversaries.Actor.o63nS0k3wHu6EgKP]{Treant Sapling Minions}, who appear at Close range and immediately take the spotlight.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -394,8 +392,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "yKWQLL3qsEZlQjyb", "img": "icons/magic/nature/tree-animated-stump-mushrooms-teal.webp", @@ -520,8 +517,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "z4JbqiHuxrWy6Cpu", "img": "icons/magic/nature/vines-thorned-curled-glow-teal-purple.webp", diff --git a/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json b/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json index 7b41b9e5..6d25a124 100644 --- a/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json +++ b/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 86, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "TLzY1nDw0Bu9Ud40", @@ -221,7 +220,7 @@ "name": "Horde (2d4+1)", "type": "feature", "system": { - "description": "

When the @Lookup[@name] have marked half or more of their HP, their standard attack deals 2d4+1 physical damage instead.

", + "description": "

When the Eels have marked half or more of their HP, their standard attack deals 2d4+1 physical damage instead.

", "resource": null, "actions": {}, "originItemType": null, @@ -253,7 +252,7 @@ "type": "attack", "_id": "L4Rpg7fnFuxpD3im", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to make a standard attack against all targets within Very Close range. You gain a Fear for each target that marks HP.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -331,8 +330,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "u5NL1eUJeAkIEpgt", "img": "icons/magic/lightning/bolt-strike-sparks-teal.webp", diff --git a/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json b/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json index b17cae1c..a774d40e 100644 --- a/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json +++ b/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json @@ -104,8 +104,7 @@ "source": "Daggerheart SRD", "page": 93, "artist": "" - }, - "size": "tiny" + } }, "flags": {}, "_id": "P7h54ZePFPHpYwvB", @@ -214,7 +213,7 @@ "name": "Minion (9)", "type": "feature", "system": { - "description": "

The @Lookup[@name] is defeated when they take any damage. For every 9 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

", + "description": "

The Elemental is defeated when they take any damage. For every 9 damage a PC deals to the Elemental, defeat an additional Minion within range the attack would succeed against.

", "resource": null, "actions": {}, "originItemType": null, @@ -239,7 +238,7 @@ "name": "Group Attack", "type": "feature", "system": { - "description": "

Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 5 physical damage each. Combine this damage.

", + "description": "

Spend a Fear to choose a target and spotlight all Elemental Sparks within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 5 physical damage each. Combine this damage.

", "resource": null, "actions": { "vXHZVb0Y7Hqu3uso": { @@ -273,8 +272,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "13OraSLq2YjpZqbm", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", diff --git a/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json b/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json index de5db0b2..5baabdec 100644 --- a/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json +++ b/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json @@ -143,8 +143,7 @@ "source": "Daggerheart SRD", "page": 86, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "ownership": { @@ -259,7 +258,7 @@ "type": "attack", "_id": "XquYMA2xJZUKSmXQ", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to move into Melee range of an ally and make a standard attack against a target within Very Close range. On a success, deal 2d10+2 physical damage and the ally can clear a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -337,8 +336,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "ojiIZHBd0sMLxSUE", "img": "icons/skills/melee/hand-grip-sword-orange.webp", @@ -359,14 +357,14 @@ "name": "Vassal's Loyalty", "type": "feature", "system": { - "description": "

When the @Lookup[@name] is within Very Close range of a knight or other noble who would take damage, you can mark a Stress to move into Melee range of them and take the damage instead.

", + "description": "

When the Soldier is within Very Close range of a knight or other noble who would take damage, you can mark a Stress to move into Melee range of them and take the damage instead.

", "resource": null, "actions": { "dwpQNx63V6hL1mXZ": { "type": "effect", "_id": "dwpQNx63V6hL1mXZ", "systemPath": "actions", - "description": "", + "description": "

When the Soldier is within Very Close range of a knight or other noble who would take damage, you can mark a Stress to move into Melee range of them and take the damage instead.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -393,8 +391,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "zcfyEY29yWqJtZbl", "img": "icons/magic/defensive/shield-barrier-blue.webp", diff --git a/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json b/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json index 39800002..7d439a1b 100644 --- a/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json +++ b/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 86, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "ChwwVqowFw8hJQwT", @@ -227,7 +226,7 @@ "name": "Warped Fortitude", "type": "feature", "system": { - "description": "

The @Lookup[@name] is resistant to physical damage.

", + "description": "

The Experiment is resistant to physical damage.

", "resource": null, "actions": {}, "originItemType": null, @@ -296,7 +295,7 @@ "name": "Overwhelm", "type": "feature", "system": { - "description": "

When a target the @Lookup[@name] attacks has other adversaries within Very Close range, the @Lookup[@name] deals double damage.

", + "description": "

When a target the Experiment attacks has other adversaries within Very Close range, the Experiment deals double damage.

", "resource": null, "actions": {}, "originItemType": null, @@ -321,14 +320,14 @@ "name": "Lurching Lunge", "type": "feature", "system": { - "description": "

Mark a Stress to spotlight the @Lookup[@name] as an additional GM move instead of spending Fear.

", + "description": "

Mark a Stress to spotlight the Experiment as an additional GM move instead of spending Fear.

", "resource": null, "actions": { "i3FANnO1t9AzJdTp": { "type": "effect", "_id": "i3FANnO1t9AzJdTp", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to spotlight the Experiment as an additional GM move instead of spending Fear.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -355,8 +354,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "g0h3Zo6xqgfSlyxi", "img": "icons/skills/melee/strike-slashes-red.webp", diff --git a/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json b/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json index 163c61f7..df039d82 100644 --- a/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json +++ b/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json @@ -104,8 +104,7 @@ "source": "Daggerheart SRD", "page": 97, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "OsLG2BjaEdTZUJU9", @@ -214,7 +213,7 @@ "name": "Minion (12)", "type": "feature", "system": { - "description": "

The @Lookup[@name] is defeated when they take any damage. For every 12 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

", + "description": "

The Shock Troop is defeated when they take any damage. For every 12 damage a PC deals to the Shock Troop, defeat an additional Minion within range the attack would succeed against.

", "resource": null, "actions": {}, "originItemType": null, @@ -239,7 +238,7 @@ "name": "Aura of Doom", "type": "feature", "system": { - "description": "

When a PC marks HP from an attack by the @Lookup[@name], they lose a Hope.

", + "description": "

When a PC marks HP from an attack by the Shock Troop, they lose a Hope.

", "resource": null, "actions": { "HcGa2nD0WziA0lFP": { @@ -317,14 +316,14 @@ "name": "Group Attack", "type": "feature", "system": { - "description": "

Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 12 physical damage each. Combine this damage.

", + "description": "

Spend a Fear to choose a target and spotlight all Fallen Shock Troops within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 12 physical damage each. Combine this damage.

", "resource": null, "actions": { "QHNRSEQmqOcaoXq4": { "type": "effect", "_id": "QHNRSEQmqOcaoXq4", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to choose a target and spotlight all Fallen Shock Troops within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 12 physical damage each. Combine this damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -351,8 +350,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "gC4whvt2r9Tfso9Y", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", diff --git a/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json b/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json index fc064958..48dbefcc 100644 --- a/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json +++ b/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 97, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "PELRry1vqjBzSAlr", @@ -227,14 +226,14 @@ "name": "Conflagration", "type": "feature", "system": { - "description": "

Spend a Fear to unleash an all-consuming firestorm and make an attack against all targets within Close range. Targets the @Lookup[@name] succeeds against take 2d10+6 direct magic damage.

@Template[type:emanation|range:c]

", + "description": "

Spend a Fear to unleash an all-consuming f i restorm and make an attack against all targets within Close range. Targets the Sorcerer succeeds against take 2d10+6 direct magic damage.

@Template[type:emanation|range:c]

", "resource": null, "actions": { "v7zZo52Dnj1e1i2G": { "type": "attack", "_id": "v7zZo52Dnj1e1i2G", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to unleash an all-consuming f i restorm and make an attack against all targets within Close range. Targets the Sorcerer succeeds against take 2d10+6 direct magic damage.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -312,8 +311,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "s15sNyb3JYMzBLIU", "img": "icons/magic/fire/projectile-beams-salvo-red.webp", @@ -341,7 +339,7 @@ "type": "effect", "_id": "mXWOpXcYALYqicTw", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to trap a target within Far range in a powerful illusion of their worst fears. While trapped, the target is Restrained and Vulnerable until they break free, ending both conditions, with a successful Instinct Roll.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -366,8 +364,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "ecp9o8t1dQFXGsse", "img": "icons/magic/death/skull-energy-light-white.webp", @@ -428,12 +425,11 @@ "name": "Slippery", "type": "feature", "system": { - "description": "

When the @Lookup[@name] takes damage from an attack, they can teleport up to Far range.

", + "description": "

When the Sorcerer takes damage from an attack, they can teleport up to Far range.

", "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "C74czwNeWF5vS1DZ", "img": "icons/magic/symbols/ring-circle-smoke-blue.webp", @@ -454,7 +450,7 @@ "name": "Shackles of Guilt", "type": "feature", "system": { - "description": "

Countdown (Loop 2d6). When the @Lookup[@name] is in the spotlight for the first time, activate the countdown. When it triggers, all targets within Far range become Vulnerable and must mark a Stress as they relive their greatest regrets. A target can break free from their regret with a successful Presence or Strength Roll. When a PC fails to break free, they lose a Hope.

@Template[type:emanation|range:f]

", + "description": "

Countdown (Loop 2d6). When the Sorcerer is in the spotlight for the first time, activate the countdown. When it triggers, all targets within Far range become Vulnerable and must mark a Stress as they relive their greatest regrets. A target can break free from their regret with a successful Presence or Strength Roll. When a PC fails to break free, they lose a Hope.

@Template[type:emanation|range:f]

", "resource": null, "actions": { "7b0FkpAnWz9a5EWx": { @@ -518,7 +514,7 @@ "type": "countdown", "_id": "11PtfoxbgOXxNlkG", "systemPath": "actions", - "description": "

Countdown (Loop 2d6). When the @Lookup[@name] is in the spotlight for the first time, activate the countdown.

", + "description": "

Countdown (Loop 2d6). When the Sorcerer is in the spotlight for the first time, activate the countdown.

", "chatDisplay": true, "originItem": { "type": "itemCollection" @@ -553,8 +549,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "gwSgBhkcekCGvXxz", "img": "icons/magic/unholy/strike-hand-glow-pink.webp", diff --git a/src/packs/adversaries/adversary_Fallen_Warlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json b/src/packs/adversaries/adversary_Fallen_Warlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json index b2cdc489..c432cae2 100644 --- a/src/packs/adversaries/adversary_Fallen_Warlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json +++ b/src/packs/adversaries/adversary_Fallen_Warlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json @@ -160,8 +160,7 @@ "source": "Daggerheart SRD", "page": 97, "artist": "" - }, - "size": "medium" + } }, "prototypeToken": { "name": "Fallen Warlord: Realm Breaker", @@ -262,14 +261,14 @@ "name": "Relentless (2)", "type": "feature", "system": { - "description": "

The @Lookup[@name] can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

", + "description": "

The Realm-Breaker can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

", "resource": null, "actions": { "9IHzeKjP35M5jj3b": { "type": "effect", "_id": "9IHzeKjP35M5jj3b", "systemPath": "actions", - "description": "", + "description": "

The Realm-Breaker can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -320,14 +319,14 @@ "name": "Firespite Plate Armor", "type": "feature", "system": { - "description": "

When the @Lookup[@name] takes damage, reduce it by 2d10.

", + "description": "

When the Realm-Breaker takes damage, reduce it by 2d10.

", "resource": null, "actions": { "djEIhnCsuCUdwC0m": { "type": "attack", "_id": "djEIhnCsuCUdwC0m", "systemPath": "actions", - "description": "", + "description": "

When the Realm-Breaker takes damage, reduce it by 2d10.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -399,7 +398,7 @@ "type": "attack", "_id": "zMVhUekP8pcyQGFR", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to make a standard attack against all targets within Very Close range. When a target uses armor to reduce damage from this attack, they must mark 2 Armor Slots.

@Template[type:emanation|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -477,8 +476,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "PVLjJaQLH3LK3svk", "img": "icons/skills/melee/blood-slash-foam-red.webp", @@ -499,14 +497,14 @@ "name": "All-Consuming Rage", "type": "feature", "system": { - "description": "

Countdown (Decreasing 8). When the @Lookup[@name] is in the spotlight for the first time, activate the countdown. When it triggers, create a torrent of incarnate rage that rends flesh from bone. All targets within Far range must make a Presence Reaction Roll. Targets who fail take 2d6+10 direct magic damage. Targets who succeed take half damage. For each HP marked from this damage, summon a @UUID[Compendium.daggerheart.adversaries.Actor.OsLG2BjaEdTZUJU9]{Fallen Shock Troop} within Very Close range of the target who marked that HP. If the countdown ever decreases its maximum value to 0, the @Lookup[@name] marks their remaining HP and all targets within Far range must mark all remaining HP and make a death move.

@Template[type:emanation|range:f]

", + "description": "

Countdown (Decreasing 8). When the Realm-Breaker is in the spotlight for the first time, activate the countdown. When it triggers, create a torrent of incarnate rage that rends flesh from bone. All targets within Far range must make a Presence Reaction Roll. Targets who fail take 2d6+10 direct magic damage. Targets who succeed take half damage. For each HP marked from this damage, summon a @UUID[Compendium.daggerheart.adversaries.Actor.OsLG2BjaEdTZUJU9]{Fallen Shock Troop} within Very Close range of the target who marked that HP. If the countdown ever decreases its maximum value to 0, the Realm-Breaker marks their remaining HP and all targets within Far range must mark all remaining HP and make a death move.

@Template[type:emanation|range:f]

", "resource": null, "actions": { "rgy5wXyXJWh6uWxC": { "type": "attack", "_id": "rgy5wXyXJWh6uWxC", "systemPath": "actions", - "description": "

When it triggers, create a torrent of incarnate rage that rends flesh from bone. All targets within Far range must make a Presence Reaction Roll. Targets who fail take 2d6+10 direct magic damage. Targets who succeed take half damage. For each HP marked from this damage, summon a @UUID[Compendium.daggerheart.adversaries.Actor.OsLG2BjaEdTZUJU9]{Fallen Shock Troop} within Very Close range of the target who marked that HP. If the countdown ever decreases its maximum value to 0, the @Lookup[@name] marks their remaining HP and all targets within Far range must mark all remaining HP and make a death move.

@Template[type:emanation|range:f]

", + "description": "

When it triggers, create a torrent of incarnate rage that rends flesh from bone. All targets within Far range must make a Presence Reaction Roll. Targets who fail take 2d6+10 direct magic damage. Targets who succeed take half damage. For each HP marked from this damage, summon a @UUID[Compendium.daggerheart.adversaries.Actor.OsLG2BjaEdTZUJU9]{Fallen Shock Troop} within Very Close range of the target who marked that HP. If the countdown ever decreases its maximum value to 0, the Realm-Breaker marks their remaining HP and all targets within Far range must mark all remaining HP and make a death move.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -579,7 +577,7 @@ "type": "countdown", "_id": "8e3BHmOFLvRwPbTW", "systemPath": "actions", - "description": "

Countdown (Decreasing 8). When the @Lookup[@name] is in the spotlight for the first time, activate the countdown.

", + "description": "

Countdown (Decreasing 8). When the Realm-Breaker is in the spotlight for the first time, activate the countdown.

", "chatDisplay": true, "originItem": { "type": "itemCollection" @@ -614,8 +612,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "48tIwFQr64IQ5LaY", "img": "icons/magic/control/fear-fright-monster-grin-red-orange.webp", @@ -636,14 +633,14 @@ "name": "Doombringer", "type": "feature", "system": { - "description": "

When a target marks HP from an attack by the @Lookup[@name], all PCs within Far range of the target must lose a Hope.

@Template[type:emanation|range:f]

", + "description": "

When a target marks HP from an attack by the Realm-Breaker, all PCs within Far range of the target must lose a Hope.

@Template[type:emanation|range:f]

", "resource": null, "actions": { "WEBPJCbXfBeyHFJ4": { "type": "damage", "_id": "WEBPJCbXfBeyHFJ4", "systemPath": "actions", - "description": "", + "description": "

When a target marks HP from an attack by the Realm-Breaker, all PCs within Far range of the target must lose a Hope.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -693,8 +690,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "v74W0MUqVi9vPUEw", "img": "icons/magic/death/skull-energy-light-purple.webp", @@ -715,12 +711,11 @@ "name": "I Have Never Known Defeat", "type": "feature", "system": { - "description": "

When the @Lookup[@name] marks their last HP, replace them with the @UUID[Compendium.daggerheart.adversaries.Actor.RXkZTwBRi4dJ3JE5]{Fallen Warlord: Undefeated Champion} and immediately spotlight them.

", + "description": "

When the Realm-Breaker marks their last HP, replace them with the @UUID[Compendium.daggerheart.adversaries.Actor.RXkZTwBRi4dJ3JE5]{Fallen Warlord: Undefeated Champion} and immediately spotlight them.

", "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "RscRTl8U8u6WcwAB", "img": "icons/magic/unholy/silhouette-evil-horned-giant.webp", diff --git a/src/packs/adversaries/adversary_Fallen_Warlord__Undefeated_Champion_RXkZTwBRi4dJ3JE5.json b/src/packs/adversaries/adversary_Fallen_Warlord__Undefeated_Champion_RXkZTwBRi4dJ3JE5.json index 89d61c1c..ab5d5c41 100644 --- a/src/packs/adversaries/adversary_Fallen_Warlord__Undefeated_Champion_RXkZTwBRi4dJ3JE5.json +++ b/src/packs/adversaries/adversary_Fallen_Warlord__Undefeated_Champion_RXkZTwBRi4dJ3JE5.json @@ -161,8 +161,7 @@ "source": "Daggerheart SRD", "page": 98, "artist": "" - }, - "size": "medium" + } }, "prototypeToken": { "name": "Fallen Warlord: Undefeated Champion", @@ -263,14 +262,14 @@ "name": "Relentless (3)", "type": "feature", "system": { - "description": "

The @Lookup[@name] can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", + "description": "

The Undefeated Champion can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", "resource": null, "actions": { "BoDTEH8Y6i9G1d4R": { "type": "effect", "_id": "BoDTEH8Y6i9G1d4R", "systemPath": "actions", - "description": "", + "description": "

The Undefeated Champion can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -321,14 +320,14 @@ "name": "Faltering Armor", "type": "feature", "system": { - "description": "

When the @Lookup[@name] takes damage, reduce it by 1d10.

", + "description": "

When the Undefeated Champion takes damage, reduce it by 1d10.

", "resource": null, "actions": { "REOzNvunSAU3UcEx": { "type": "attack", "_id": "REOzNvunSAU3UcEx", "systemPath": "actions", - "description": "", + "description": "

When the Undefeated Champion takes damage, reduce it by 1d10.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -393,14 +392,14 @@ "name": "Shattering Strike", "type": "feature", "system": { - "description": "

Mark a Stress to make a standard attack against all targets within Very Close range. PCs the @Lookup[@name] succeeds against lose a number of Hope equal to the HP they marked from this attack.

@Template[type:emanation|range:vc]

", + "description": "

Mark a Stress to make a standard attack against all targets within Very Close range. PCs the Champion succeeds against lose a number of Hope equal to the HP they marked from this attack.

@Template[type:emanation|range:vc]

", "resource": null, "actions": { "t1GhGnEhNYyJ7p2U": { "type": "attack", "_id": "t1GhGnEhNYyJ7p2U", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to make a standard attack against all targets within Very Close range. PCs the Champion succeeds against lose a number of Hope equal to the HP they marked from this attack.

@Template[type:emanation|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -471,8 +470,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "t8yOkGWmPgQ6EbIr", "img": "icons/skills/melee/sword-stuck-glowing-pink.webp", @@ -500,7 +498,7 @@ "type": "effect", "_id": "hGMzqw00JTlYfHYy", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to summon a number of @UUID[Compendium.daggerheart.adversaries.Actor.OsLG2BjaEdTZUJU9]{Fallen Shock Troops} equal to twice the number of PCs. The Shock Troops appear at Far range.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -527,8 +525,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "AP7W9ruUCdTHO69S", "img": "icons/magic/death/undead-skeleton-worn-blue.webp", @@ -549,14 +546,14 @@ "name": "Circle of Defilement", "type": "feature", "system": { - "description": "

Countdown (1d8). When the @Lookup[@name] is in the spotlight for the first time, activate the countdown. When it triggers, activate a magical circle covering an area within Far range of the @Lookup[@name]. A target within that area is Vulnerable until they leave the circle. The circle can be removed by dealing Severe damage to the @Lookup[@name].

", + "description": "

Countdown (1d8). When the Undefeated Champion is in the spotlight for the first time, activate the countdown. When it triggers, activate a magical circle covering an area within Far range of the Champion. A target within that area is Vulnerable until they leave the circle. The circle can be removed by dealing Severe damage to the Undefeated Champion.

", "resource": null, "actions": { "mHeYZ8e8MbkGz22d": { "type": "effect", "_id": "mHeYZ8e8MbkGz22d", "systemPath": "actions", - "description": "

Activate a magical circle covering an area within Far range of the @Lookup[@name]. A target within that area is Vulnerable until they leave the circle. The circle can be removed by dealing Severe damage to the @Lookup[@name].

", + "description": "

Activate a magical circle covering an area within Far range of the Champion. A target within that area is Vulnerable until they leave the circle. The circle can be removed by dealing Severe damage to the Undefeated Champion.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -583,7 +580,7 @@ "type": "countdown", "_id": "4x13WyksHU0u0j20", "systemPath": "actions", - "description": "

Countdown (1d8). When the @Lookup[@name] is in the spotlight for the first time, activate the countdown.

", + "description": "

Countdown (1d8). When the Undefeated Champion is in the spotlight for the first time, activate the countdown.

", "chatDisplay": true, "originItem": { "type": "itemCollection" @@ -618,8 +615,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "55P7ZijSbQeVHCw4", "img": "icons/magic/unholy/barrier-fire-pink.webp", @@ -679,14 +675,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Undefeated Champion makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "i1Wmh6Mok4Qsur00": { "type": "healing", "_id": "i1Wmh6Mok4Qsur00", "systemPath": "actions", - "description": "", + "description": "

When the Undefeated Champion makes a successful attack against a PC, you gain a Fear.

", "chatDisplay": true, "actionType": "reaction", "cost": [], @@ -753,8 +749,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "ReWtcLE5akrSauI1", "img": "icons/skills/melee/strike-weapons-orange.webp", @@ -775,14 +770,14 @@ "name": "Doombringer", "type": "feature", "system": { - "description": "

When a target marks HP from an attack by the @Lookup[@name], all PCs within Far range of the target lose a Hope.

@Template[type:emanation|range:f]

", + "description": "

When a target marks HP from an attack by the Undefeated Champion, all PCs within Far range of the target lose a Hope.

@Template[type:emanation|range:f]

", "resource": null, "actions": { "liwKSCTmQqZasAf6": { "type": "damage", "_id": "liwKSCTmQqZasAf6", "systemPath": "actions", - "description": "", + "description": "

When a target marks HP from an attack by the Undefeated Champion, all PCs within Far range of the target lose a Hope.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -832,8 +827,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "tQRotPLi3eokgUdM", "img": "icons/magic/death/skull-energy-light-purple.webp", diff --git a/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json b/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json index 6d09a490..7eb4f6fc 100644 --- a/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json +++ b/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 87, "artist": "" - }, - "size": "large" + } }, "flags": {}, "_id": "8VZIgU12cB3cvlyH", @@ -227,7 +226,7 @@ "name": "Two as One", "type": "feature", "system": { - "description": "

When the @Lookup[@name] is spotlighted, you can also spotlight a Tier 1 animal adversary currently under their control.

", + "description": "

When the Beastmaster is spotlighted, you can also spotlight a Tier 1 animal adversary currently under their control.

", "resource": null, "actions": {}, "originItemType": null, @@ -259,7 +258,7 @@ "type": "attack", "_id": "ErwQgU4dwBcmZIBX", "systemPath": "actions", - "description": "", + "description": "

Make a standard attack against a target. On a success, you can mark a Stress to pin them to a nearby surface. The pinned target is Restrained until they break free with a successful Finesse or Strength Roll.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -333,8 +332,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "6ZrDjgnWufJohkp1", "img": "icons/skills/ranged/arrow-flying-broadhead-metal.webp", @@ -394,14 +392,14 @@ "name": "Deadly Companion", "type": "feature", "system": { - "description": "

Twice per scene, summon a Bear, Dire Wolf, or similar Tier 1 animal adversary under the @Lookup[@name]’s control. The adversary appears at Close range and is immediately spotlighted.

", + "description": "

Twice per scene, summon a Bear, Dire Wolf, or similar Tier 1 animal adversary under the Beastmaster’s control. The adversary appears at Close range and is immediately spotlighted.

", "resource": null, "actions": { "eSRUMqpQDPRG9leg": { "type": "effect", "_id": "eSRUMqpQDPRG9leg", "systemPath": "actions", - "description": "", + "description": "

Twice per scene, summon a @UUID[Compendium.daggerheart.adversaries.Actor.71qKDLKO3CsrNkdy]{Bear}, @UUID[Compendium.daggerheart.adversaries.Actor.wNzeuQLfLUMvgHlQ]{Dire Wolf} or similar Tier 1 animal adversary under the Beastmaster’s control. The adversary appears at Close range and is immediately spotlighted.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -422,8 +420,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "w1oHm0NoEavQgUzl", "img": "icons/creatures/mammals/ox-bull-horned-glowing-orange.webp", diff --git a/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json b/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json index 4f76b706..bce45f4c 100644 --- a/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json +++ b/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 87, "artist": "" - }, - "size": "large" + } }, "flags": {}, "_id": "YnObCleGjPT7yqEc", @@ -227,14 +226,14 @@ "name": "Battering Ram", "type": "feature", "system": { - "description": "

Mark a Stress to have the @Lookup[@name] charge at an inanimate object within Close range they could feasibly smash (such as a wall, cart, or market stand) and destroy it. All targets within Very Close range of the object must succeed on an Agility Reaction Roll or take 2d4+3 physical damage from the shrapnel.

@Template[type:circle|range:vc]

", + "description": "

Mark a Stress to have the Brawler charge at an inanimate object within Close range they could feasibly smash (such as a wall, cart, or market stand) and destroy it. All targets within Very Close range of the object must succeed on an Agility Reaction Roll or take 2d4+3 physical damage from the shrapnel.

@Template[type:circle|range:vc]

", "resource": null, "actions": { "zns57MqnZ6M1d4r0": { "type": "attack", "_id": "zns57MqnZ6M1d4r0", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to have the Brawler charge at an inanimate object within Close range they could feasibly smash (such as a wall, cart, or market stand) and destroy it. All targets within Very Close range of the object must succeed on an Agility Reaction Roll or take 2d4+3 physical damage from the shrapnel.

@Template[type:circle|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -312,8 +311,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "ro8AtBdgklyyuydK", "img": "icons/skills/melee/shield-damaged-broken-orange.webp", @@ -334,14 +332,14 @@ "name": "Bloody Reprisal", "type": "feature", "system": { - "description": "

When the @Lookup[@name] marks 2 or more HP from an attack within Very Close range, you can make a standard attack against the attacker. On a success, the @Lookup[@name] deals 2d6+15 physical damage instead of their standard damage.

", + "description": "

When the Brawler marks 2 or more HP from an attack within Very Close range, you can make a standard attack against the attacker. On a success, the Brawler deals 2d6+15 physical damage instead of their standard damage.

", "resource": null, "actions": { "D53yjFXoP5uFXe9M": { "type": "attack", "_id": "D53yjFXoP5uFXe9M", "systemPath": "actions", - "description": "", + "description": "

When the Brawler marks 2 or more HP from an attack within Very Close range, you can make a standard attack against the attacker. On a success, the Brawler deals 2d6+15 physical damage instead of their standard damage.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -412,8 +410,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "kKBbEAffbHxmHo15", "img": "icons/skills/melee/strike-flail-spiked-pink.webp", @@ -434,14 +431,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Brawler makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "U2AfyadkJluHXA4r": { "type": "healing", "_id": "U2AfyadkJluHXA4r", "systemPath": "actions", - "description": "", + "description": "

When the Brawler makes a successful attack against a PC you gain a Fear.

", "chatDisplay": true, "actionType": "reaction", "cost": [], @@ -508,8 +505,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "B0EniYxyLvjJSqYb", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json b/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json index b0ba4170..7606d09f 100644 --- a/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json +++ b/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json @@ -143,8 +143,7 @@ "source": "Daggerheart SRD", "page": 87, "artist": "" - }, - "size": "large" + } }, "flags": {}, "ownership": { @@ -252,7 +251,7 @@ "name": "Flight", "type": "feature", "system": { - "description": "

While flying, the @Lookup[@name] gains a +3 bonus to their Difficulty.

", + "description": "

While flying, the Eagle gains a +3 bonus to their Difficulty.

", "resource": null, "actions": {}, "originItemType": null, @@ -328,7 +327,7 @@ "type": "attack", "_id": "KwsxjI3jBzmxgkPu", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to attack a target within Far range. On a success, deal 2d10+2 physical damage and knock the target over, making them Vulnerable until they next act.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -411,8 +410,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "MabIQE1Kjn60j08J", "img": "icons/skills/melee/strike-slashes-orange.webp", @@ -472,14 +470,14 @@ "name": "Take Off", "type": "feature", "system": { - "description": "

Make an attack against a target within Very Close range. On a success, deal 2d4+3 physical damage and the target must succeed on an Agility Reaction Roll or become temporarily Restrained within the @Lookup[@name]’s massive talons. If the target is Restrained, the @Lookup[@name] immediately lifts into the air to Very Far range above the battlefi eld while holding them.

", + "description": "

Make an attack against a target within Very Close range. On a success, deal 2d4+3 physical damage and the target must succeed on an Agility Reaction Roll or become temporarily Restrained within the Eagle’s massive talons. If the target is Restrained, the Eagle immediately lifts into the air to Very Far range above the battlefi eld while holding them.

", "resource": null, "actions": { "NtgA9EQPF2Rdb9KK": { "type": "attack", "_id": "NtgA9EQPF2Rdb9KK", "systemPath": "actions", - "description": "", + "description": "

Make an attack against a target within Very Close range. On a success, deal 2d4+3 physical damage and the target must succeed on an Agility Reaction Roll or become temporarily Restrained within the Eagle’s massive talons. If the target is Restrained, the Eagle immediately lifts into the air to Very Far range above the battlefi eld while holding them.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -555,8 +553,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "NEOQ0E9AGSSIDm4v", "img": "icons/skills/movement/arrow-upward-yellow.webp", @@ -616,14 +613,14 @@ "name": "Deadly Drop", "type": "feature", "system": { - "description": "

While flying, the @Lookup[@name] can drop a Restrained target they are holding. When dropped, the target is no longer Restrained but starts falling. If their fall isn’t prevented during the PCs’ next action, the target takes 2d20 physical damage when they land.

", + "description": "

While flying, the Eagle can drop a Restrained target they are holding. When dropped, the target is no longer Restrained but starts falling. If their fall isn’t prevented during the PCs’ next action, the target takes 2d20 physical damage when they land.

", "resource": null, "actions": { "1tO018UgL0VG51ti": { "type": "damage", "_id": "1tO018UgL0VG51ti", "systemPath": "actions", - "description": "", + "description": "

While flying, the Eagle can drop a Restrained target they are holding. When dropped, the target is no longer Restrained but starts falling. If their fall isn’t prevented during the PCs’ next action, the target takes 2d20 physical damage when they land.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -674,8 +671,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "jY0ynjYvbS6E3NgJ", "img": "icons/skills/movement/arrow-down-pink.webp", diff --git a/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json b/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json index 54f12efa..7b21aca5 100644 --- a/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json +++ b/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 76, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "IIWV4ysJPFPnTP7W", @@ -229,7 +228,7 @@ "_id": "9RduwBLYcBaiouYk", "img": "icons/creatures/magical/humanoid-silhouette-aliens-green.webp", "system": { - "description": "

When the @Lookup[@name] have marked half or more of their HP, their standard attack deals 1d4+1 physical damage instead.

", + "description": "

When the Mosquitoes have marked half or more of their HP, their standard attack deals 1d4+1 physical damage instead.

", "resource": null, "actions": {}, "originItemType": null, @@ -255,7 +254,7 @@ "_id": "gxYV6iTMM1S9Vv5v", "img": "icons/commodities/biological/wing-insect-green.webp", "system": { - "description": "

While flying, the @Lookup[@name] have a +2 bonus to their Difficulty.

", + "description": "

While flying, the Mosquitoes have a +2 bonus to their Difficulty.

", "resource": null, "actions": {}, "originItemType": null, @@ -325,14 +324,14 @@ "_id": "BTlMLjG65KQs0Jk2", "img": "icons/skills/wounds/blood-drip-droplet-red.webp", "system": { - "description": "

When the @Lookup[@name]’s attack causes a target to mark HP, you can mark a Stress to force the target to mark an additional HP.

", + "description": "

When the Mosquitoes’ attack causes a target to mark HP, you can mark a Stress to force the target to mark an additional HP.

", "resource": null, "actions": { "7ee6IhkKYDehjLmg": { "type": "effect", "_id": "7ee6IhkKYDehjLmg", "systemPath": "actions", - "description": "", + "description": "

When the Mosquitoes’ attack causes a target to mark HP, you can mark a Stress to force the target to mark an additional HP.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -360,8 +359,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json b/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json index d4655880..afeb44ad 100644 --- a/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json +++ b/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json @@ -110,8 +110,7 @@ "source": "Daggerheart SRD", "page": 76, "artist": "" - }, - "size": "small" + } }, "flags": {}, "_id": "4PfLnaCrOcMdb4dK", @@ -222,7 +221,7 @@ "_id": "v3AcLcWrXy2rtW4Z", "img": "icons/magic/symbols/runes-carved-stone-yellow.webp", "system": { - "description": "

The @Lookup[@name] is defeated when they take any damage. For every 3 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

", + "description": "

The Rat is defeated when they take any damage. For every 3 damage a PC deals to the Rat, defeat an additional Minion within range the attack would succeed against.

", "resource": null, "actions": {}, "originItemType": null, @@ -248,14 +247,14 @@ "_id": "fsaBlCjTdq1jM23G", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", "system": { - "description": "

Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 1 physical damage each. Combine this damage.

", + "description": "

Spend a Fear to choose a target and spotlight all Giant Rats within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 1 physical damage each. Combine this damage.

", "resource": null, "actions": { "q8chow47nQLR9qeF": { "type": "attack", "_id": "q8chow47nQLR9qeF", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to choose a target and spotlight all Giant Rats within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 1 physical damage each. Combine this damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -307,8 +306,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json b/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json index 75da96b2..a38fce28 100644 --- a/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json +++ b/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json @@ -104,8 +104,7 @@ "source": "Daggerheart SRD", "page": 87, "artist": "" - }, - "size": "large" + } }, "flags": {}, "_id": "5s8wSvpyC5rxY5aD", @@ -214,7 +213,7 @@ "name": "Minion (7)", "type": "feature", "system": { - "description": "

The @Lookup[@name] is defeated when they take any damage. For every 7 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

", + "description": "

The Recruit is defeated when they take any damage. For every 7 damage a PC deals to the Recruit, defeat an additional Minion within range the attack would succeed against.

", "resource": null, "actions": {}, "originItemType": null, @@ -239,14 +238,14 @@ "name": "Group Attack", "type": "feature", "system": { - "description": "

Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 5 physical damage each. Combine this damage.

", + "description": "

Spend a Fear to choose a target and spotlight all Giant Recruits within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 5 physical damage each. Combine this damage.

", "resource": null, "actions": { "DjbPQowW1OdBD9Zn": { "type": "effect", "_id": "DjbPQowW1OdBD9Zn", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to choose a target and spotlight all Giant Recruits within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 5 physical damage each. Combine this damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -275,8 +274,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "FMgB28X1LammRInU", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", diff --git a/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json b/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json index 99b5ed46..d5f25734 100644 --- a/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json +++ b/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 76, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "fmfntuJ8mHRCAktP", @@ -236,7 +235,7 @@ "type": "attack", "_id": "PJbZ4ibLPle9BBRv", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to make a standard attack against two targets within Melee range.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -315,8 +314,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -344,7 +342,7 @@ "type": "attack", "_id": "ZkcplnqoMP7dH9F4", "systemPath": "actions", - "description": "", + "description": "

Make an attack against a target within Very Close range. On a success, spend a Fear to deal 1d4+4 physical damage and Poison them until their next rest or they succeed on a Knowledge Roll (16). While Poisoned, the target must roll a d6 before they make an action roll. On a result of 4 or lower, they must mark a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -421,8 +419,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [ { @@ -480,7 +477,7 @@ "_id": "TmDpAY5t3PjhEv9K", "img": "icons/skills/melee/strike-weapons-orange.webp", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Scorpion makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "1Fn4rvhueQoMXqFc": { @@ -555,8 +552,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json b/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json index f02a1c52..ec94123b 100644 --- a/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json +++ b/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 77, "artist": "" - }, - "size": "large" + } }, "flags": {}, "_id": "8KWVLWXFhlY2kYx0", @@ -223,14 +222,14 @@ "_id": "Efa6t9Ow8b1DRyZV", "img": "icons/skills/melee/shield-damaged-broken-gold.webp", "system": { - "description": "

On a successful attack within Melee range against the @Lookup[@name], the attacker must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

", + "description": "

On a successful attack within Melee range against the Snake, the attacker must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

", "resource": null, "actions": { "H1nUSOudbtha1lnC": { "type": "damage", "_id": "H1nUSOudbtha1lnC", "systemPath": "actions", - "description": "", + "description": "

On a successful attack within Melee range against the Snake, the attacker must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -302,14 +301,14 @@ "_id": "Ro9XCeXsTOT9SXyo", "img": "icons/skills/melee/blood-slash-foam-red.webp", "system": { - "description": "

Mark a Stress to make an attack against all targets within Very Close range. Targets the @Lookup[@name] succeeds against take 1d6+1 physical damage.

", + "description": "

Mark a Stress to make an attack against all targets within Very Close range. Targets the Snake succeeds against take 1d6+1 physical damage.

", "resource": null, "actions": { "2UzeQYL5HeyF3zwh": { "type": "attack", "_id": "2UzeQYL5HeyF3zwh", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to make an attack against all targets within Very Close range. Targets the Snake succeeds against take 1d6+1 physical damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -386,8 +385,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -408,7 +406,7 @@ "_id": "LR5XHauNtWcl18CY", "img": "icons/magic/acid/projectile-needles-salvo-green.webp", "system": { - "description": "

Spend a Fear to introduce a d6 Spitter Die. When the @Lookup[@name] is in the spotlight, roll this die. On a result of 5 or higher, all targets in front of the @Lookup[@name] within Far range must succeed on an Agility Reaction Roll or take 1d4 physical damage. The @Lookup[@name] can take the spotlight a second time this GM turn.

@Template[type:inFront|range:f]

", + "description": "

Spend a Fear to introduce a d6 Spitter Die. When the Snake is in the spotlight, roll this die. On a result of 5 or higher, all targets in front of the Snake within Far range must succeed on an Agility Reaction Roll or take 1d4 physical damage. The Snake can take the spotlight a second time this GM turn.

@Template[type:inFront|range:f]

", "resource": null, "actions": { "yx5fjMLLwSnvSbqs": { @@ -449,7 +447,7 @@ "type": "attack", "_id": "Ds6KlQKZCOhh5OMT", "systemPath": "actions", - "description": "

All targets in front of the @Lookup[@name] within Far range must succeed on an Agility Reaction Roll or take 1d4 physical damage.

@Template[type:inFront|range:f]

", + "description": "

All targets in front of the Snake within Far range must succeed on an Agility Reaction Roll or take 1d4 physical damage.

@Template[type:inFront|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -522,7 +520,7 @@ "type": "attack", "_id": "xccwknU2xHUwQSdn", "systemPath": "actions", - "description": "

When the @Lookup[@name] is in the spotlight, roll the spitter die. On a result of 5 or higher, do a spit Attack.

", + "description": "

When the Snake is in the spotlight, roll the spitter die. On a result of 5 or higher, do a spit Attack.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -567,8 +565,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [ { diff --git a/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json b/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json index deeafa37..7445c992 100644 --- a/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json +++ b/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 88, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "8mJYMpbLTb8qIOrr", @@ -227,14 +226,14 @@ "name": "Relentless (2)", "type": "feature", "system": { - "description": "

The @Lookup[@name] can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

", + "description": "

The Gorgon can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

", "resource": null, "actions": { "GSYD7y0ywAqyKUfm": { "type": "effect", "_id": "GSYD7y0ywAqyKUfm", "systemPath": "actions", - "description": "", + "description": "

The Gorgon can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -285,14 +284,14 @@ "name": "Sunsear Arrows", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful standard attack, the target Glows until the end of the scene and can’t become Hidden. Attack rolls made against a Glowing target have advantage.

", + "description": "

When the Gorgon makes a successful standard attack, the target Glows until the end of the scene and can’t become Hidden. Attack rolls made against a Glowing target have advantage.

", "resource": null, "actions": { "fnTd5BjBAK46vRRk": { "type": "effect", "_id": "fnTd5BjBAK46vRRk", "systemPath": "actions", - "description": "", + "description": "

When the Gorgon makes a successful standard attack, the target Glows until the end of the scene and can’t become Hidden. Attack rolls made against a Glowing target have advantage.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -382,14 +381,14 @@ "name": "Crown of Serpents", "type": "feature", "system": { - "description": "

Make an attack roll against a target within Melee range using the @Lookup[@name]’s protective snakes. On a success, mark a Stress to deal 2d10+4 physical damage and the target must mark a Stress.

", + "description": "

Make an attack roll against a target within Melee range using the Gorgon’s protective snakes. On a success, mark a Stress to deal 2d10+4 physical damage and the target must mark a Stress.

", "resource": null, "actions": { "ryfj8eiYYNGJPtBg": { "type": "attack", "_id": "ryfj8eiYYNGJPtBg", "systemPath": "actions", - "description": "", + "description": "

Make an attack roll against a target within Melee range using the Gorgon’s protective snakes. On a success, mark a Stress to deal 2d10+4 physical damage and the target must mark a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -485,8 +484,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "9SO2ov36lFH2YV0S", "img": "icons/creatures/reptiles/snake-fangs-bite-green.webp", @@ -507,14 +505,14 @@ "name": "Petrifying Gaze", "type": "feature", "system": { - "description": "

When the @Lookup[@name] takes damage from an attack within Close range, you can spend a Fear to force the attacker to make an Instinct Reaction Roll. On a failure, they begin to turn to stone, marking a HP and starting a Petrification Countdown (4). This countdown ticks down when the @Lookup[@name] is attacked. When it triggers, the target must make a death move. If the @Lookup[@name] is defeated, all petrification countdowns end.

", + "description": "

When the Gorgon takes damage from an attack within Close range, you can spend a Fear to force the attacker to make an Instinct Reaction Roll. On a failure, they begin to turn to stone, marking a HP and starting a Petrification Countdown (4). This countdown ticks down when the Gorgon is attacked. When it triggers, the target must make a death move. If the Gorgon is defeated, all petrification countdowns end.

", "resource": null, "actions": { "ySkX0wOpEFqtgeD9": { "type": "attack", "_id": "ySkX0wOpEFqtgeD9", "systemPath": "actions", - "description": "", + "description": "

When the Gorgon takes damage from an attack within Close range, you can spend a Fear to force the attacker to make an Instinct Reaction Roll. On a failure, they begin to turn to stone, marking a HP and starting a Petrification Countdown (4). This countdown ticks down when the Gorgon is attacked. When it triggers, the target must make a death move. If the Gorgon is defeated, all petrification countdowns end.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -567,7 +565,7 @@ "type": "countdown", "_id": "ywZTs3D8ClT7tAsa", "systemPath": "actions", - "description": "

On a failure, they begin to turn to stone, marking a HP and starting a Petrification Countdown (4). This countdown ticks down when the @Lookup[@name] is attacked. When it triggers, the target must make a death move. If the @Lookup[@name] is defeated, all petrification countdowns end.

", + "description": "

On a failure, they begin to turn to stone, marking a HP and starting a Petrification Countdown (4). This countdown ticks down when the Gorgon is attacked. When it triggers, the target must make a death move. If the Gorgon is defeated, all petrification countdowns end.

", "chatDisplay": false, "originItem": { "type": "itemCollection" @@ -602,8 +600,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "047o6OtNlUwLG1H1", "img": "icons/magic/earth/strike-body-stone-crumble.webp", @@ -624,14 +621,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Gorgon makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "V6tkBYSjOt1LZCkp": { "type": "healing", "_id": "V6tkBYSjOt1LZCkp", "systemPath": "actions", - "description": "", + "description": "

When the Gorgon makes a successful attack against a PC, you gain a Fear.

", "chatDisplay": true, "actionType": "reaction", "cost": [], @@ -698,8 +695,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "IRIaFxFughjXVu0Y", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json b/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json index a20d80e6..3a19084d 100644 --- a/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json +++ b/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 93, "artist": "" - }, - "size": "gargantuan" + } }, "flags": {}, "_id": "dsfB3YhoL5SudvS2", @@ -221,7 +220,7 @@ "name": "Slow", "type": "feature", "system": { - "description": "

When you spotlight the @Lookup[@name] and they don’t have a token on their stat block, they can’t act yet. Place a token on their stat block and describe what they’re preparing to do. When you spotlight the @Lookup[@name] and they have a token on their stat block, clear the token and they can act.

", + "description": "

When you spotlight the Elemental and they don’t have a token on their stat block, they can’t act yet. Place a token on their stat block and describe what they’re preparing to do. When you spotlight the Elemental and they have a token on their stat block, clear the token and they can act.

", "resource": { "type": "simple", "value": 0, @@ -251,14 +250,14 @@ "name": "Crushing Blows", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack, the target must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

", + "description": "

When the Elemental makes a successful attack, the target must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

", "resource": null, "actions": { "0sXciTiPc30v8czv": { "type": "damage", "_id": "0sXciTiPc30v8czv", "systemPath": "actions", - "description": "", + "description": "

When the Elemental makes a successful attack, the target must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -329,7 +328,7 @@ "name": "Immovable Object", "type": "feature", "system": { - "description": "

An attack that would move the @Lookup[@name] moves them two fewer ranges (for example, Far becomes Very Close). When the @Lookup[@name] takes physical damage, reduce it by 7.

", + "description": "

An attack that would move the Elemental moves them two fewer ranges (for example, Far becomes Very Close). When the Elemental takes physical damage, reduce it by 7.

", "resource": null, "actions": {}, "originItemType": null, @@ -398,14 +397,14 @@ "name": "Rockslide", "type": "feature", "system": { - "description": "

Mark a Stress to create a rockslide that buries the land in front of @Lookup[@name] within Close range with rockfall. All targets in this area must make an Agility Reaction Roll (19). Targets who fail take 2d12+5 physical damage and become Vulnerable until their next roll with Hope. Targets who succeed take half damage.

@Template[type:inFront|range:c]

", + "description": "

Mark a Stress to create a rockslide that buries the land in front of Elemental within Close range with rockfall. All targets in this area must make an Agility Reaction Roll (19). Targets who fail take 2d12+5 physical damage and become Vulnerable until their next roll with Hope. Targets who succeed take half damage.

@Template[type:inFront|range:c]

", "resource": null, "actions": { "eLGIC3kVjLo8FEvy": { "type": "attack", "_id": "eLGIC3kVjLo8FEvy", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to create a rockslide that buries the land in front of Elemental within Close range with rockfall. All targets in this area must make an Agility Reaction Roll (19). Targets who fail take 2d12+5 physical damage and become Vulnerable until their next roll with Hope. Targets who succeed take half damage.

@Template[type:inFront|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -488,8 +487,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "q45DiEFlXqcXZ5hv", "img": "icons/magic/earth/barrier-stone-brown-green.webp", @@ -549,14 +547,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Elemental makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "FPIpslusIeVQGdnb": { "type": "healing", "_id": "FPIpslusIeVQGdnb", "systemPath": "actions", - "description": "", + "description": "

When the Elemental makes a successful attack against a PC, you gain a Fear.

", "chatDisplay": true, "actionType": "reaction", "cost": [], @@ -623,8 +621,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "ag7t5EW358M0qiSL", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json b/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json index be037b10..bdc22b1a 100644 --- a/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json +++ b/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 93, "artist": "" - }, - "size": "gargantuan" + } }, "flags": {}, "_id": "xIICT6tEdnA7dKDV", @@ -228,7 +227,7 @@ "type": "attack", "_id": "Gk5tcqshtwP4JsKS", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to attack a target within Very Close range. On a success, deal 2d4+7 physical damage and the target’s next action has disadvantage. On a failure, the target must mark a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -311,8 +310,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "B8ZrtRCZrwwwWJOE", "img": "icons/magic/water/projectile-icecicle-glowing.webp", @@ -377,14 +375,14 @@ "name": "Drowning Embrace", "type": "feature", "system": { - "description": "

Spend a Fear to make an attack against all targets within Very Close range. Targets the @Lookup[@name] succeeds against become Restrained and Vulnerable as they begin drowning. A target can break free, ending both conditions, with a successful Strength or Instinct Roll.

@Template[type:emanation|range:vc]

", + "description": "

Spend a Fear to make an attack against all targets within Very Close range. Targets the Elemental succeeds against become Restrained and Vulnerable as they begin drowning. A target can break free, ending both conditions, with a successful Strength or Instinct Roll.

@Template[type:emanation|range:vc]

", "resource": null, "actions": { "ooYbiLrYjoWXIfe9": { "type": "attack", "_id": "ooYbiLrYjoWXIfe9", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to make an attack against all targets within Very Close range. Targets the Elemental succeeds against become Restrained and Vulnerable as they begin drowning. A target can break free, ending both conditions, with a successful Strength or Instinct Roll.

@Template[type:emanation|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -440,8 +438,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "bcwFQeuU6ZfIGjau", "img": "icons/magic/water/vortex-water-whirlpool-blue.webp", @@ -502,14 +499,14 @@ "name": "High Tide", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful standard attack, you can mark a Stress to knock the target back to Close range.

", + "description": "

When the Elemental makes a successful standard attack, you can mark a Stress to knock the target back to Close range.

", "resource": null, "actions": { "MXSyEGbaHeFgyOsB": { "type": "effect", "_id": "MXSyEGbaHeFgyOsB", "systemPath": "actions", - "description": "", + "description": "

When the Elemental makes a successful standard attack, you can mark a Stress to knock the target back to Close range.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -536,8 +533,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "BGE42W1XPd0vpimR", "img": "icons/magic/water/tendrils-ice-thorns.webp", diff --git a/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json b/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json index c7446a11..426803c2 100644 --- a/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json +++ b/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 80, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "SHXedd9zZPVfUgUa", @@ -229,7 +228,7 @@ "_id": "DquXi9yCNsPAFEmK", "img": "icons/magic/time/hourglass-brown-orange.webp", "system": { - "description": "

When you spotlight the @Lookup[@name] and they don’t have a token on their stat block, they can’t act yet. Place a token on their stat block and describe what they’re preparing to do. When you spotlight the @Lookup[@name] and they have a token on their stat block, clear the token and they can act.

", + "description": "

When you spotlight the Ooze and they don’t have a token on their stat block, they can’t act yet. Place a token on their stat block and describe what they’re preparing to do. When you spotlight the Ooze and they have a token on their stat block, clear the token and they can act.

", "resource": { "type": "simple", "value": 0, @@ -260,14 +259,14 @@ "_id": "gJWoUSTGwVsJwPmK", "img": "icons/skills/melee/shield-damaged-broken-gold.webp", "system": { - "description": "

When the @Lookup[@name] makes a successful attack, the target must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

", + "description": "

When the Ooze makes a successful attack, the target must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

", "resource": null, "actions": { "nU4xpjruOvskcmiA": { "type": "damage", "_id": "nU4xpjruOvskcmiA", "systemPath": "actions", - "description": "", + "description": "

When the Ooze makes a successful attack, the target must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -339,14 +338,14 @@ "_id": "Sm9Sk4mSvcq6PkmR", "img": "icons/creatures/slimes/slime-face-melting-green.webp", "system": { - "description": "

Make a standard attack against a target within Melee range. On a success, the @Lookup[@name] envelops them and the target must mark 2 Stress. The target must mark an additional Stress when they make an action roll. If the @Lookup[@name] takes Severe damage, the target is freed.

", + "description": "

Make a standard attack against a target within Melee range. On a success, the Ooze envelops them and the target must mark 2 Stress. The target must mark an additional Stress when they make an action roll. If the Ooze takes Severe damage, the target is freed.

", "resource": null, "actions": { "fSxq0AL6YwZs7OAH": { "type": "attack", "_id": "fSxq0AL6YwZs7OAH", "systemPath": "actions", - "description": "", + "description": "

Make a standard attack against a target within Melee range. On a success, the Ooze envelops them and the target must mark 2 Stress. The target must mark an additional Stress when they make an action roll. If the Ooze takes Severe damage, the target is freed.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -448,8 +447,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [ { @@ -507,14 +505,14 @@ "_id": "qNhrEK2YF8e3ljU6", "img": "icons/creatures/slimes/slime-movement-pseudopods-green.webp", "system": { - "description": "

When the @Lookup[@name] has 3 or more HP marked, you can spend a Fear to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.aLkLFuVoKz2NLoBK]{Tiny Green Oozes} (with no marked HP or Stress). Immediately spotlight both of them.

", + "description": "

When the Ooze has 3 or more HP marked, you can spend a Fear to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.aLkLFuVoKz2NLoBK]{Tiny Green Oozes} (with no marked HP or Stress). Immediately spotlight both of them.

", "resource": null, "actions": { "s5mLw6DRGd76MLcC": { "type": "effect", "_id": "s5mLw6DRGd76MLcC", "systemPath": "actions", - "description": "", + "description": "

When the Ooze has 3 or more HP marked, you can spend a Fear to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.aLkLFuVoKz2NLoBK]{Tiny Green Oozes} (with no marked HP or Stress). Immediately spotlight both of them.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -542,8 +540,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json b/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json index 0abf1661..43e10f5f 100644 --- a/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json +++ b/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 98, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "kabueAo6BALApWqp", @@ -221,7 +220,7 @@ "name": "Punish the Guilty", "type": "feature", "system": { - "description": "

The @Lookup[@name] deals double damage to targets marked Guilty by a High Seraph.

", + "description": "

The Archer deals double damage to targets marked Guilty by a High Seraph.

", "resource": null, "actions": {}, "originItemType": null, @@ -253,7 +252,7 @@ "type": "attack", "_id": "pQLfy0I6sZhgAoIm", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to make a standard attack against up to three targets.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -331,8 +330,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "Ye35DuZroQfeFoNw", "img": "icons/skills/ranged/arrows-flying-salvo-yellow.webp", diff --git a/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json b/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json index cceed989..b9a50759 100644 --- a/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json +++ b/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json @@ -104,8 +104,7 @@ "source": "Daggerheart SRD", "page": 98, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "VENwg7xEFcYObjmT", @@ -214,7 +213,7 @@ "name": "Minion (13)", "type": "feature", "system": { - "description": "

The @Lookup[@name] is defeated when they take any damage. For every 13 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

", + "description": "

The Soldier is defeated when they take any damage. For every 13 damage a PC deals to the Soldier, defeat an additional Minion within range the attack would succeed against.

", "resource": null, "actions": {}, "originItemType": null, @@ -239,14 +238,14 @@ "name": "Divine Flight", "type": "feature", "system": { - "description": "

While the @Lookup[@name] is flying, spend a Fear to move up to Far range instead of Close range before taking an action.

", + "description": "

While the Soldier is flying, spend a Fear to move up to Far range instead of Close range before taking an action.

", "resource": null, "actions": { "aCRmnQ5n7FrbQykj": { "type": "effect", "_id": "aCRmnQ5n7FrbQykj", "systemPath": "actions", - "description": "", + "description": "

While the Soldier is flying, spend a Fear to move up to Far range instead of Close range before taking an action.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -294,14 +293,14 @@ "name": "Group Attack", "type": "feature", "system": { - "description": "

Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 10 physical damage each. Combine this damage.

", + "description": "

Spend a Fear to choose a target and spotlight all Hallowed Soldiers within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 10 physical damage each. Combine this damage.

", "resource": null, "actions": { "eo7J0v1B5zPHul1M": { "type": "effect", "_id": "eo7J0v1B5zPHul1M", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to choose a target and spotlight all Hallowed Soldiers within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 10 physical damage each. Combine this damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -328,8 +327,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "ZpypjDbaurs1YSFb", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", diff --git a/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json b/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json index 89d82a0b..b2ebe434 100644 --- a/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json +++ b/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json @@ -116,8 +116,7 @@ "source": "Daggerheart SRD", "page": 77, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "uRtghKE9mHlII4rs", @@ -228,7 +227,7 @@ "_id": "t9Fa5jKLhvjD8Ar2", "img": "icons/skills/movement/arrow-upward-blue.webp", "system": { - "description": "

After making a standard attack, the @Lookup[@name] can move anywhere within Far range.

", + "description": "

After making a standard attack, the Harrier can move anywhere within Far range.

", "resource": null, "actions": {}, "originItemType": null, @@ -261,7 +260,7 @@ "type": "attack", "_id": "FiuiLUbNUL0YKq7w", "systemPath": "actions", - "description": "", + "description": "

When a creature moves into Melee range to make an attack, you can mark a Stress before the attack roll to move anywhere within Close range and make an attack against that creature. On a success, deal 1d10+2 physical damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -340,8 +339,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json b/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json index 75afed49..e0e2a946 100644 --- a/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json +++ b/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json @@ -122,8 +122,7 @@ "source": "Daggerheart SRD", "page": 77, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "mK3A5FTx6k8iPU3F", @@ -234,14 +233,14 @@ "_id": "SsgN2qSYpQLR43Cz", "img": "icons/skills/movement/arrows-up-trio-red.webp", "system": { - "description": "

Spend 2 Fear to spotlight the @Lookup[@name] and up to 2d4 allies within Far range.

@Template[type:emanation|range:f]

", + "description": "

Spend 2 Fear to spotlight the Head Guard and up to 2d4 allies within Far range.

@Template[type:emanation|range:f]

", "resource": null, "actions": { "lI0lnRb3xrUjqIYX": { "type": "attack", "_id": "lI0lnRb3xrUjqIYX", "systemPath": "actions", - "description": "", + "description": "

Spend 2 Fear to spotlight the Head Guard and up to 2d4 allies within Far range.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -293,8 +292,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -315,14 +313,14 @@ "_id": "YeJ7eJVCKsRxG8mk", "img": "icons/skills/ranged/target-bullseye-arrow-blue.webp", "system": { - "description": "

Countdown (5). When the @Lookup[@name] is in the spotlight for the first time, activate the countdown. It ticks down when a PC makes an attack roll. When it triggers, all Archer Guards within Far range make a standard attack with advantage against the nearest target within their range. If any attacks succeed on the same target, combine their damage.

@Template[type:emanation|range:f]

", + "description": "

Countdown (5). When the Head Guard is in the spotlight for the first time, activate the countdown. It ticks down when a PC makes an attack roll. When it triggers, all Archer Guards within Far range make a standard attack with advantage against the nearest target within their range. If any attacks succeed on the same target, combine their damage.

@Template[type:emanation|range:f]

", "resource": null, "actions": { "xyhaCmPGiVMsTViH": { "type": "countdown", "_id": "xyhaCmPGiVMsTViH", "systemPath": "actions", - "description": "", + "description": "

Countdown (5). When the Head Guard is in the spotlight for the first time, activate the countdown. It ticks down when a PC makes an attack roll. When it triggers, all Archer Guards within Far range make a standard attack with advantage against the nearest target within their range. If any attacks succeed on the same target, combine their damage.

", "chatDisplay": true, "originItem": { "type": "itemCollection" @@ -358,8 +356,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, @@ -380,14 +377,14 @@ "_id": "sd2OlhLchyoqeKke", "img": "icons/skills/melee/strike-weapons-orange.webp", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Head Guard makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "tD1hAwP6scxXrouw": { "type": "healing", "_id": "tD1hAwP6scxXrouw", "systemPath": "actions", - "description": "", + "description": "

When the Head Guard makes a successful attack against a PC, you gain a Fear.

", "chatDisplay": true, "actionType": "reaction", "cost": [], @@ -455,8 +452,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json b/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json index 9e948594..0c22e7fa 100644 --- a/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json +++ b/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 95, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "i2UNbRvgyoSs07M6", @@ -227,14 +226,14 @@ "name": "Terrifying", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

@Template[type:emanation|range:f]

", + "description": "

When the Vampire makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

@Template[type:emanation|range:f]

", "resource": null, "actions": { "Rf2ZL3EjCzudonRb": { "type": "damage", "_id": "Rf2ZL3EjCzudonRb", "systemPath": "actions", - "description": "", + "description": "

When the Vampire makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -305,14 +304,14 @@ "name": "Look into My Eyes", "type": "feature", "system": { - "description": "

A creature who moves into Melee range of the @Lookup[@name] must make an Instinct Reaction Roll. On a failure, you gain [[/r 1d4]] Fear.

", + "description": "

A creature who moves into Melee range of the Vampire must make an Instinct Reaction Roll. On a failure, you gain [[/r 1d4]] Fear.

", "resource": null, "actions": { "lOgkZTR1hybc6bnJ": { "type": "attack", "_id": "lOgkZTR1hybc6bnJ", "systemPath": "actions", - "description": "", + "description": "

A creature who moves into Melee range of the Vampire must make an Instinct Reaction Roll. On a failure, you gain [[/r 1d4]] Fear.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -377,14 +376,14 @@ "name": "Feed on Followers", "type": "feature", "system": { - "description": "

When the @Lookup[@name] is within Melee range of an ally, they can cause the ally to mark a HP. The @Lookup[@name] then clears a HP.

", + "description": "

When the Vampire is within Melee range of an ally, they can cause the ally to mark a HP. The Vampire then clears a HP.

", "resource": null, "actions": { "tM6TBTtmCXTnIzen": { "type": "healing", "_id": "tM6TBTtmCXTnIzen", "systemPath": "actions", - "description": "", + "description": "

When the Vampire is within Melee range of an ally, they can cause the ally to mark a HP. The Vampire then clears a HP.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -449,8 +448,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "Oj6qkLG1N6uqQHcx", "img": "icons/creatures/abilities/fang-tooth-blood-red.webp", @@ -478,7 +476,7 @@ "type": "effect", "_id": "5Q6RMUTiauKw0tDj", "systemPath": "actions", - "description": "", + "description": "

Spend 2 Fear to summon [[/r 1d4]] @UUID[Compendium.daggerheart.adversaries.Actor.WWyUp6Mxl1S3KYUG]{Vampires}, who appear at Far range and immediately take the spotlight.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -505,8 +503,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "IWtpuQCuV82lOSry", "img": "icons/creatures/mammals/bat-giant-tattered-purple.webp", @@ -527,14 +524,14 @@ "name": "Lifesuck", "type": "feature", "system": { - "description": "

When the @Lookup[@name] is spotlighted, roll a d8. On a result of 6 or higher, all targets within Very Close range must mark a HP.

@Template[type:emanation|range:vc]

", + "description": "

When the Vampire is spotlighted, roll a d8. On a result of 6 or higher, all targets within Very Close range must mark a HP.

@Template[type:emanation|range:vc]

", "resource": null, "actions": { "DA8qT2omBcG4oryX": { "type": "attack", "_id": "DA8qT2omBcG4oryX", "systemPath": "actions", - "description": "", + "description": "

When the Vampire is spotlighted, roll a d8. On a result of 6 or higher, all targets within Very Close range must mark a HP.

@Template[type:emanation|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -604,8 +601,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "6FsQf339qGHnz3ZF", "img": "icons/magic/unholy/strike-beam-blood-small-red-purple.webp", diff --git a/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json b/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json index 0a952540..d03fdea1 100644 --- a/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json +++ b/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 98, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "r1mbfSSwKWdcFdAU", @@ -227,14 +226,14 @@ "name": "Relentless (3)", "type": "feature", "system": { - "description": "

The @Lookup[@name] can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", + "description": "

The Seraph can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", "resource": null, "actions": { "7oqXSF66R2GlB17O": { "type": "effect", "_id": "7oqXSF66R2GlB17O", "systemPath": "actions", - "description": "", + "description": "

The Seraph can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -285,14 +284,14 @@ "name": "Divine Flight", "type": "feature", "system": { - "description": "

While the @Lookup[@name] is flying, spend a Fear to move up to Far range instead of Close range before taking an action.

", + "description": "

While the Seraph is flying, spend a Fear to move up to Far range instead of Close range before taking an action.

", "resource": null, "actions": { "ZgspQLiGhuKURA1T": { "type": "effect", "_id": "ZgspQLiGhuKURA1T", "systemPath": "actions", - "description": "", + "description": "

While the Seraph is flying, spend a Fear to move up to Far range instead of Close range before taking an action.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -340,14 +339,14 @@ "name": "Judgement", "type": "feature", "system": { - "description": "

Spend a Fear to make a target Guilty in the eyes of the Seraph’s god until the @Lookup[@name] is defeated. While Guilty, the target doesn’t gain Hope on a result with Hope. When the @Lookup[@name] succeeds on a standard attack against a Guilty target, they deal Severe damage instead of their standard damage. The @Lookup[@name] can only mark one target at a time.

", + "description": "

Spend a Fear to make a target Guilty in the eyes of the Seraph’s god until the Seraph is defeated. While Guilty, the target doesn’t gain Hope on a result with Hope. When the Seraph succeeds on a standard attack against a Guilty target, they deal Severe damage instead of their standard damage. The Seraph can only mark one target at a time.

", "resource": null, "actions": { "ErGJWtFIXFPgKtek": { "type": "effect", "_id": "ErGJWtFIXFPgKtek", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to make a target Guilty in the eyes of the Seraph’s god until the Seraph is defeated. While Guilty, the target doesn’t gain Hope on a result with Hope. When the Seraph succeeds on a standard attack against a Guilty target, they deal Severe damage instead of their standard damage. The Seraph can only mark one target at a time.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -372,8 +371,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "FilEB21L5q9XxKE1", "img": "icons/magic/light/beams-rays-orange-purple-small.webp", @@ -438,7 +436,7 @@ "type": "attack", "_id": "HwC75gazlN0k30AL", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to reflect a sliver of divinity as a searing beam of light that hits up to twenty targets within Very Far range. Targets must make a Presence Reaction Roll, with disadvantage if they are marked Guilty. Targets who fail take 4d6+12 magic damage. Targets who succeed take half damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -516,8 +514,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "Vrb8dIJcOJ3ClwO5", "img": "icons/magic/light/beam-strike-orange-gold.webp", @@ -545,7 +542,7 @@ "type": "effect", "_id": "j6DmU9dtob5QStxY", "systemPath": "actions", - "description": "", + "description": "

Once per scene, spend a Fear to spotlight all other adversaries within Far range. Attacks they make while spotlighted in this way deal half damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -572,8 +569,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "9LpLXpQBfQryJA60", "img": "icons/magic/holy/barrier-shield-winged-blue.webp", diff --git a/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json b/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json index 6f64f883..9341c9ab 100644 --- a/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json +++ b/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 94, "artist": "" - }, - "size": "large" + } }, "flags": {}, "_id": "6hbqmxDXFOzZJDk4", @@ -227,7 +226,7 @@ "name": "Slow", "type": "feature", "system": { - "description": "

When you spotlight the @Lookup[@name] and they don’t have a token on their stat block, they can’t act yet. Place a token on their stat block and describe what they’re preparing to do. When you spotlight the @Lookup[@name] and they have a token on their stat block, clear the token and they can act.

", + "description": "

When you spotlight the Ooze and they don’t have a token on their stat block, they can’t act yet. Place a token on their stat block and describe what they’re preparing to do. When you spotlight the Ooze and they have a token on their stat block, clear the token and they can act.

", "resource": { "type": "simple", "value": 0, @@ -257,14 +256,14 @@ "name": "Acidic Form", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack, the target must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

", + "description": "

When the Ooze makes a successful attack, the target must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

", "resource": null, "actions": { "gtT2oHSyZg9OHHJD": { "type": "damage", "_id": "gtT2oHSyZg9OHHJD", "systemPath": "actions", - "description": "", + "description": "

When the Ooze makes a successful attack, the target must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -335,7 +334,7 @@ "name": "Envelop", "type": "feature", "system": { - "description": "

Make an attack against a target within Melee range. On a success, the @Lookup[@name] Envelops them and the target must mark 2 Stress. While Enveloped, the target must mark an additional Stress every time they make an action roll. When the @Lookup[@name] takes Severe damage, all Enveloped targets are freed and the condition is cleared.

", + "description": "

Make an attack against a target within Melee range. On a success, the Ooze Envelops them and the target must mark 2 Stress. While Enveloped, the target must mark an additional Stress every time they make an action roll. When the Ooze takes Severe damage, all Enveloped targets are freed and the condition is cleared.

", "resource": null, "actions": { "hQBYPagz5yuTcCQq": { @@ -417,8 +416,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "pfXYuH7rtsyVjSXh", "img": "icons/creatures/slimes/slime-face-melting-green.webp", @@ -476,14 +474,14 @@ "name": "Split", "type": "feature", "system": { - "description": "

When the @Lookup[@name] has 4 or more HP marked, you can spend a Fear to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.SHXedd9zZPVfUgUa]{Green Oozes}(with no marked HP or Stress). Immediately spotlight both of them.

", + "description": "

When the Ooze has 4 or more HP marked, you can spend a Fear to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.SHXedd9zZPVfUgUa]{Green Oozes}(with no marked HP or Stress). Immediately spotlight both of them.

", "resource": null, "actions": { "iQsYAqpUFvJslRDr": { "type": "effect", "_id": "iQsYAqpUFvJslRDr", "systemPath": "actions", - "description": "", + "description": "

When the Ooze has 4 or more HP marked, you can spend a Fear to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.SHXedd9zZPVfUgUa]{Green Oozes}(with no marked HP or Stress). Immediately spotlight both of them.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -510,8 +508,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "Mq90kFBM5ix2pzzh", "img": "icons/creatures/slimes/slime-movement-pseudopods-green.webp", diff --git a/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json b/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json index 4c6fd61f..0bc04c03 100644 --- a/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json +++ b/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 94, "artist": "" - }, - "size": "huge" + } }, "flags": {}, "_id": "MI126iMOOobQ1Obn", @@ -221,7 +220,7 @@ "name": "Many-Headed Menace", "type": "feature", "system": { - "description": "

The @Lookup[@name] begins with three heads and can have up to five. When the @Lookup[@name] takes Major or greater damage, they lose a head.

", + "description": "

The Hydra begins with three heads and can have up to five. When the Hydra takes Major or greater damage, they lose a head.

", "resource": { "type": "simple", "value": 3, @@ -251,7 +250,7 @@ "name": "Relentless (X)", "type": "feature", "system": { - "description": "

The @Lookup[@name] can be spotlighted X times per GM turn, where X is the @Lookup[@name]’s number of heads. Spend Fear as usual to spotlight them.


Note: Automation is not added so manually spend fear as per text.

", + "description": "

The Hydra can be spotlighted X times per GM turn, where X is the Hydra’s number of heads. Spend Fear as usual to spotlight them.

Note: Automation is not added so manually spend fear as per text.

", "resource": null, "actions": {}, "originItemType": null, @@ -276,14 +275,14 @@ "name": "Regeneration", "type": "feature", "system": { - "description": "

If the @Lookup[@name] has any marked HP, spend a Fear to clear a HP and grow two heads.

", + "description": "

If the Hydra has any marked HP, spend a Fear to clear a HP and grow two heads.

", "resource": null, "actions": { "SsRtZwee1mYlPLUy": { "type": "healing", "_id": "SsRtZwee1mYlPLUy", "systemPath": "actions", - "description": "", + "description": "

If the Hydra has any marked HP, spend a Fear to clear a HP and grow two heads.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -355,8 +354,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "b2KflqWoOxHMQf97", "img": "icons/magic/life/cross-beam-green.webp", @@ -384,7 +382,7 @@ "type": "damage", "_id": "nJxpFR4Ul0e2RrL4", "systemPath": "actions", - "description": "", + "description": "

All PCs within Far range lose 2 Hope.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -434,8 +432,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "bCeCu8M25izOAsuY", "img": "icons/magic/death/skull-energy-light-white.webp", @@ -456,7 +453,7 @@ "name": "Magical Weakness", "type": "feature", "system": { - "description": "

When the @Lookup[@name] takes magic damage, they become Dazed until the next roll with Fear. While Dazed, they can’t use their Regeneration action but are immune to magic damage.

", + "description": "

When the Hydra takes magic damage, they become Dazed until the next roll with Fear. While Dazed, they can’t use their Regeneration action but are immune to magic damage.

", "resource": null, "actions": { "heAkvOuQG1EJmVbb": { @@ -488,8 +485,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "sJzjcRBgYRp5f53E", "img": "icons/magic/symbols/star-rising-purple.webp", diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Bandit_5Lh1T0zaT8Pkr2U2.json b/src/packs/adversaries/adversary_Jagged_Knife_Bandit_5Lh1T0zaT8Pkr2U2.json index ae359eaf..8828c612 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Bandit_5Lh1T0zaT8Pkr2U2.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Bandit_5Lh1T0zaT8Pkr2U2.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 77, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "5Lh1T0zaT8Pkr2U2", @@ -229,7 +228,7 @@ "_id": "5VPb3OJDv6Q5150r", "img": "icons/skills/movement/arrow-upward-white.webp", "system": { - "description": "

The @Lookup[@name] climbs just as easily as they run.

", + "description": "

The Bandit climbs just as easily as they run.

", "resource": null, "actions": {}, "originItemType": null, @@ -255,14 +254,14 @@ "_id": "V7haVmSLm6vTeffc", "img": "icons/skills/movement/arrow-down-pink.webp", "system": { - "description": "

When the @Lookup[@name] succeeds on a standard attack from above a target, they deal 1d10+1 physical damage instead of their standard damage.

", + "description": "

When the Bandit succeeds on a standard attack from above a target, they deal 1d10+1 physical damage instead of their standard damage.

", "resource": null, "actions": { "X7xdCLY7ySMpaTHe": { "type": "damage", "_id": "X7xdCLY7ySMpaTHe", "systemPath": "actions", - "description": "", + "description": "

When the Bandit succeeds on a standard attack from above a target, they deal 1d10+1 physical damage instead of their standard damage.

", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json b/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json index 6ca9749c..465dd7a2 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json @@ -116,8 +116,7 @@ "source": "Daggerheart SRD", "page": 78, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "MbBPIOxaxXYNApXz", @@ -235,7 +234,7 @@ "type": "effect", "_id": "yzjCJyfGzZrEd0G3", "systemPath": "actions", - "description": "", + "description": "

Choose a target within Far range and temporarily Curse them. While the target is Cursed, you can mark a Stress when that target rolls with Hope to make the roll be with Fear instead.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -261,8 +260,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [ { @@ -320,14 +318,14 @@ "_id": "d8uVdKpTm9yw6TZS", "img": "icons/magic/unholy/projectile-bolts-salvo-pink.webp", "system": { - "description": "

Make an attack against up to three targets within Very Close range. Mark a Stress to deal 2d6+3 magic damage to targets the @Lookup[@name] succeeded against.

", + "description": "

Make an attack against up to three targets within Very Close range. Mark a Stress to deal 2d6+3 magic damage to targets the Hexer succeeded against.

", "resource": null, "actions": { "HmvmqoMli6oC2y2a": { "type": "attack", "_id": "HmvmqoMli6oC2y2a", "systemPath": "actions", - "description": "", + "description": "

Make an attack against up to three targets within Very Close range. Mark a Stress to deal 2d6+3 magic damage to targets the Hexer succeeded against.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -399,8 +397,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json b/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json index fc644604..e7ec011d 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json @@ -122,8 +122,7 @@ "source": "Daggerheart SRD", "page": 78, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "CBKixLH3yhivZZuL", @@ -234,7 +233,7 @@ "_id": "vipYd2zMFs0i4Ock", "img": "icons/commodities/metal/chain-silver.webp", "system": { - "description": "

Creatures Restrained by the @Lookup[@name] take double damage from attacks by other adversaries.

", + "description": "

Creatures Restrained by the Kneebreaker take double damage from attacks by other adversaries.

", "resource": null, "actions": {}, "originItemType": null, @@ -260,14 +259,14 @@ "_id": "Sa4Nt0eoDjirBKGf", "img": "icons/skills/melee/unarmed-punch-fist.webp", "system": { - "description": "

Make an attack against a target within Melee range. On a success, the target takes no damage but is Restrained and Vulnerable. The target can break free, clearing both conditions, with a successful Strength Roll or is freed automatically if the @Lookup[@name] takes Major or greater damage.

", + "description": "

Make an attack against a target within Melee range. On a success, the target takes no damage but is Restrained and Vulnerable. The target can break free, clearing both conditions, with a successful Strength Roll or is freed automatically if the Kneebreaker takes Major or greater damage.

", "resource": null, "actions": { "uMNSQzNPVPhHT34T": { "type": "attack", "_id": "uMNSQzNPVPhHT34T", "systemPath": "actions", - "description": "", + "description": "

Make an attack against a target within Melee range. On a success, the target takes no damage but is Restrained and Vulnerable. The target can break free, clearing both conditions, with a successful Strength Roll or is freed automatically if the Kneebreaker takes Major or greater damage.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -317,8 +316,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [ { diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json b/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json index 1a95bf87..99381bd6 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json @@ -110,8 +110,7 @@ "source": "Daggerheart SRD", "page": 78, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "C0OMQqV7pN6t7ouR", @@ -222,7 +221,7 @@ "_id": "hfP30YIlYDW9wkHe", "img": "icons/magic/symbols/runes-carved-stone-yellow.webp", "system": { - "description": "

The @Lookup[@name] is defeated when they take any damage. For every 3 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

", + "description": "

The Lackey is defeated when they take any damage. For every 3 damage a PC deals to the Lackey, defeat an additional Minion within range the attack would succeed against.

", "resource": null, "actions": {}, "originItemType": null, @@ -248,14 +247,14 @@ "_id": "1k5TmQIAunM7Bv32", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", "system": { - "description": "

Spend a Fear to choose a target and spotlight all @Lookup[@name] within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 2 physical damage each. Combine this damage.

", + "description": "

Spend a Fear to choose a target and spotlight all Jagged Knife Lackeys within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 2 physical damage each. Combine this damage.

", "resource": null, "actions": { "aoQDb2m32NDxE6ZP": { "type": "effect", "_id": "aoQDb2m32NDxE6ZP", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to choose a target and spotlight all Jagged Knife Lackeys within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 2 physical damage each. Combine this damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -283,8 +282,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json b/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json index 165bb160..7e448a62 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json @@ -116,8 +116,7 @@ "source": "Daggerheart SRD", "page": 78, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "aTljstqteGoLpCBq", @@ -228,14 +227,14 @@ "_id": "LIAbel7pMzAHpgF3", "img": "icons/skills/movement/arrows-up-trio-red.webp", "system": { - "description": "

When you spotlight the @Lookup[@name], mark a Stress to also spotlight two allies within Close range.

", + "description": "

When you spotlight the Lieutenant, mark a Stress to also spotlight two allies within Close range.

", "resource": null, "actions": { "IfMFU67g4sfhSYtm": { "type": "effect", "_id": "IfMFU67g4sfhSYtm", "systemPath": "actions", - "description": "", + "description": "

When you spotlight the Lieutenant, mark a Stress to also spotlight two allies within Close range.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -263,8 +262,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -290,8 +288,7 @@ "actions": {}, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -319,7 +316,7 @@ "type": "attack", "_id": "fzVyO0DUwIVEUCtg", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to make an attack against a Vulnerable target within Close range. On a success, deal 2d6+12 physical damage and the target must mark a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -423,8 +420,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -445,14 +441,14 @@ "_id": "uelnRgGStjJ27VtO", "img": "icons/skills/melee/strike-weapons-orange.webp", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Lieutenant makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "GSjfSgBzyhbVcpbt": { "type": "healing", "_id": "GSjfSgBzyhbVcpbt", "systemPath": "actions", - "description": "", + "description": "

When the Lieutenant makes a successful attack against a PC, you gain a Fear.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -520,8 +516,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json b/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json index bca035c1..10dc241f 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 78, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "XF4tYTq9nPJAy2ox", @@ -229,14 +228,14 @@ "_id": "dhycdSd4NYdPOYbP", "img": "icons/weapons/daggers/dagger-crooked-ice-blue.webp", "system": { - "description": "

When the @Lookup[@name] succeeds on a standard attack that has advantage, they deal 1d6+6 physical damage instead of their standard damage.

", + "description": "

When the Shadow succeeds on a standard attack that has advantage, they deal 1d6+6 physical damage instead of their standard damage.

", "resource": null, "actions": { "6G5Dasl1pP8pfYkZ": { "type": "attack", "_id": "6G5Dasl1pP8pfYkZ", "systemPath": "actions", - "description": "", + "description": "

When the Shadow succeeds on a standard attack that has advantage, they deal 1d6+6 physical damage instead of their standard damage.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -329,14 +328,14 @@ "_id": "ILIogeKbYioPutRw", "img": "icons/magic/perception/silhouette-stealth-shadow.webp", "system": { - "description": "

Become Hidden until after the @Lookup[@name]’s next attack. Attacks made while Hidden from this feature have advantage.

", + "description": "

Become Hidden until after the Shadow’s next attack. Attacks made while Hidden from this feature have advantage.

", "resource": null, "actions": { "s0X44RPg5hA8lVax": { "type": "effect", "_id": "s0X44RPg5hA8lVax", "systemPath": "actions", - "description": "", + "description": "

Become Hidden until after the Shadow’s next attack. Attacks made while Hidden from this feature have advantage.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -363,8 +362,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [ { diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Sniper_1zuyof1XuIfi3aMG.json b/src/packs/adversaries/adversary_Jagged_Knife_Sniper_1zuyof1XuIfi3aMG.json index 166c521b..968e227a 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Sniper_1zuyof1XuIfi3aMG.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Sniper_1zuyof1XuIfi3aMG.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 78, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "1zuyof1XuIfi3aMG", @@ -229,14 +228,14 @@ "_id": "adPXzpvLREjN3len", "img": "icons/skills/ranged/arrow-flying-spiral-blue.webp", "system": { - "description": "

If the @Lookup[@name] is Hidden when they make a successful standard attack against a target, they deal 1d10+4 physical damage instead of their standard damage.

", + "description": "

If the Sniper is Hidden when they make a successful standard attack against a target, they deal 1d10+4 physical damage instead of their standard damage.

", "resource": null, "actions": { "2eX7P0wSfbKKu8dJ": { "type": "attack", "_id": "2eX7P0wSfbKKu8dJ", "systemPath": "actions", - "description": "", + "description": "

If the Sniper is Hidden when they make a successful standard attack against a target, they deal 1d10+4 physical damage instead of their standard damage.

", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json b/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json index 86d69c37..25b0b8b0 100644 --- a/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json +++ b/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 88, "artist": "" - }, - "size": "large" + } }, "flags": {}, "_id": "MYXmTx2FHcIjdfYZ", @@ -221,14 +220,14 @@ "name": "Relentless (3)", "type": "feature", "system": { - "description": "

The @Lookup[@name] can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", + "description": "

The Flickerfly can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", "resource": null, "actions": { "FgoP6tlMUxnv5k4Z": { "type": "effect", "_id": "FgoP6tlMUxnv5k4Z", "systemPath": "actions", - "description": "", + "description": "

The Flickerfly can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -279,14 +278,14 @@ "name": "Peerless Accuracy", "type": "feature", "system": { - "description": "

Before the @Lookup[@name] makes an attack, roll a d6. On a result of 4 or higher, the target’s Evasion is halved against this attack.

", + "description": "

Before the Flickerfly makes an attack, roll a d6. On a result of 4 or higher, the target’s Evasion is halved against this attack.

", "resource": null, "actions": { "RrKQktP8MI4YQR5k": { "type": "attack", "_id": "RrKQktP8MI4YQR5k", "systemPath": "actions", - "description": "", + "description": "

Before the Flickerfly makes an attack, roll a d6. On a result of 4 or higher, the target’s Evasion is halved against this attack.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -400,14 +399,14 @@ "name": "Mind Dance", "type": "feature", "system": { - "description": "

Mark a Stress to create a magically dazzling display that grapples the minds of nearby foes. All targets within Close range must make an Instinct Reaction Roll. For each target who failed, you gain a Fear and the @Lookup[@name] learns one of the target’s fears.

@Template[type:emanation|range:c]

", + "description": "

Mark a Stress to create a magically dazzling display that grapples the minds of nearby foes. All targets within Close range must make an Instinct Reaction Roll. For each target who failed, you gain a Fear and the Flickerfl y learns one of the target’s fears.

@Template[type:emanation|range:c]

", "resource": null, "actions": { "0wL3ieMrXEb2gcxe": { "type": "attack", "_id": "0wL3ieMrXEb2gcxe", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to create a magically dazzling display that grapples the minds of nearby foes. All targets within Close range must make an Instinct Reaction Roll. For each target who failed, you gain a Fear and the Flickerfl y learns one of the target’s fears.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -451,8 +450,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "Bt7MqMkPpPpzWksK", "img": "icons/magic/light/explosion-glow-spiral-yellow.webp", @@ -473,14 +471,14 @@ "name": "Hallucinatory Breath", "type": "feature", "system": { - "description": "

Countdown (Loop 1d6). When the @Lookup[@name] takes damage for the first time, activate the countdown. When it triggers, the @Lookup[@name] breathes hallucinatory gas on all targets in front of them up to Far range. Targets must succeed on an Instinct Reaction Roll or be tormented by fearful hallucinations. Targets whose fears are known to the @Lookup[@name] have disadvantage on this roll. Targets who fail must mark a Stress and lose a Hope.

@Template[type:inFront|range:f]

", + "description": "

Countdown (Loop 1d6). When the Flickerfly takes damage for the first time, activate the countdown. When it triggers, the Flickerfly breathes hallucinatory gas on all targets in front of them up to Far range. Targets must succeed on an Instinct Reaction Roll or be tormented by fearful hallucinations. Targets whose fears are known to the Flickerfly have disadvantage on this roll. Targets who fail must mark a Stress and lose a Hope.

@Template[type:inFront|range:f]

", "resource": null, "actions": { "USEkCakSzYcZbBwY": { "type": "attack", "_id": "USEkCakSzYcZbBwY", "systemPath": "actions", - "description": "", + "description": "

The Flickerfly breathes hallucinatory gas on all targets in front of them up to Far range. Targets must succeed on an Instinct Reaction Roll or be tormented by fearful hallucinations. Targets whose fears are known to the Flickerfl y have disadvantage on this roll. Targets who fail must mark a Stress and lose a Hope.

@Template[type:inFront|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -577,7 +575,7 @@ "type": "countdown", "_id": "n8ZuLjwTf2FJ7V6n", "systemPath": "actions", - "description": "

Countdown (Loop 1d6). When the @Lookup[@name] takes damage for the first time, activate the countdown.

", + "description": "

Countdown (Loop 1d6). When the Flickerfly takes damage for the first time, activate the countdown.

", "chatDisplay": true, "originItem": { "type": "itemCollection" @@ -612,8 +610,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "EjfM83eVCdcVGC3c", "img": "icons/magic/air/fog-gas-smoke-purple.webp", diff --git a/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json b/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json index 71cb7a8d..298af435 100644 --- a/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json +++ b/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json @@ -127,8 +127,7 @@ "source": "Daggerheart SRD", "page": 88, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "7ai2opemrclQe3VF", @@ -237,7 +236,7 @@ "name": "Chevalier", "type": "feature", "system": { - "description": "

While the @Lookup[@name] is on a mount, they gain a +2 bonus to their Difficulty. When they take Severe damage, they’re knocked from their mount and lose this benefit until they’re next spotlighted.

", + "description": "

While the Knight is on a mount, they gain a +2 bonus to their Difficulty. When they take Severe damage, they’re knocked from their mount and lose this benefit until they’re next spotlighted.

", "resource": null, "actions": {}, "originItemType": null, @@ -306,7 +305,7 @@ "name": "Heavily Armored", "type": "feature", "system": { - "description": "

When the @Lookup[@name] takes physical damage, reduce it by 3.

", + "description": "

When the Knight takes physical damage, reduce it by 3.

", "resource": null, "actions": {}, "originItemType": null, @@ -375,14 +374,14 @@ "name": "Cavalry Charge", "type": "feature", "system": { - "description": "

If the @Lookup[@name] is mounted, move up to Far range and make a standard attack against a target. On a success, deal 2d8+4 physical damage and the target must mark a Stress.

", + "description": "

If the Knight is mounted, move up to Far range and make a standard attack against a target. On a success, deal 2d8+4 physical damage and the target must mark a Stress.

", "resource": null, "actions": { "Mb079uPkaZgpo9y3": { "type": "attack", "_id": "Mb079uPkaZgpo9y3", "systemPath": "actions", - "description": "", + "description": "

If the Knight is mounted, move up to Far range and make a standard attack against a target. On a success, deal 2d8+4 physical damage and the target must mark a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -476,8 +475,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "djKDZawLnGF1zkbY", "img": "icons/skills/movement/arrow-upward-yellow.webp", @@ -505,7 +503,7 @@ "type": "effect", "_id": "V5fLHHdTOita6u9f", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to spotlight [[/r 1d4+1]] allies. Attacks they make while spotlighted in this way deal half damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -532,8 +530,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "RoxNNIn0m9rHQDH8", "img": "icons/environment/people/charge.webp", diff --git a/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json b/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json index 3b84774e..12f881d4 100644 --- a/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json +++ b/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 99, "artist": "" - }, - "size": "gargantuan" + } }, "flags": {}, "_id": "4nqv3ZwJGjnmic8j", @@ -227,14 +226,14 @@ "name": "Relentless (3)", "type": "feature", "system": { - "description": "

The @Lookup[@name] can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", + "description": "

The Kraken can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", "resource": null, "actions": { "420LQBs27zQTAXfY": { "type": "effect", "_id": "420LQBs27zQTAXfY", "systemPath": "actions", - "description": "", + "description": "

The Kraken can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -285,7 +284,7 @@ "name": "Many Tentacles", "type": "feature", "system": { - "description": "

While the @Lookup[@name] has 7 or fewer marked HP, they can make their standard attack against two targets within range.

", + "description": "

While the Kraken has 7 or fewer marked HP, they can make their standard attack against two targets within range.

", "resource": null, "actions": {}, "originItemType": null, @@ -310,7 +309,7 @@ "name": "Grapple and Drown", "type": "feature", "system": { - "description": "

Make an attack roll against a target within Close range. On a success, mark a Stress to grab them with a tentacle and drag them beneath the water. The target is Restrained and Vulnerable until they break free with a successful Strength Roll or the @Lookup[@name] takes Major or greater damage. While Restrained and Vulnerable in this way, a target must mark a Stress when they make an action roll.

", + "description": "

Make an attack roll against a target within Close range. On a success, mark a Stress to grab them with a tentacle and drag them beneath the water. The target is Restrained and Vulnerable until they break free with a successful Strength Roll or the Kraken takes Major or greater damage. While Restrained and Vulnerable in this way, a target must mark a Stress when they make an action roll.

", "resource": null, "actions": { "SX2Y4OapGEawl17j": { @@ -366,8 +365,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "vz2BWhispgR7mSWF", "img": "icons/magic/water/orb-water-bubbles-blue.webp", @@ -435,7 +433,7 @@ "type": "attack", "_id": "pHZUiZRSj4FuG0uK", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to spew a line of boiling water at any number of targets in a line up to Far range. All targets must succeed on an Agility Reaction Roll or take 4d6+9 physical damage. If a target marks an Armor Slot to reduce the damage, they must also mark a Stress.

@Template[type:ray|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -506,8 +504,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "eksa3E2ecBgdib6h", "img": "icons/magic/water/projectile-icecicle-glowing.webp", @@ -528,14 +525,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Kraken makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "hXQtIGmSaWKMOuFB": { "type": "healing", "_id": "hXQtIGmSaWKMOuFB", "systemPath": "actions", - "description": "", + "description": "

When the Kraken makes a successful attack against a PC, you gain a Fear.

", "chatDisplay": true, "actionType": "reaction", "cost": [], @@ -602,8 +599,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "m4aybzb8tXWHelDU", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json b/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json index 528df6a9..90ede3ec 100644 --- a/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json +++ b/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 88, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "niBpVU7yeo5ccskE", @@ -227,14 +226,14 @@ "name": "Quick Hands", "type": "feature", "system": { - "description": "

Make an attack against a target within Melee range. On a success, deal 1d8+2 physical damage and the @Lookup[@name] steals one item or consumable from the target’s inventory.

", + "description": "

Make an attack against a target within Melee range. On a success, deal 1d8+2 physical damage and the Thief steals one item or consumable from the target’s inventory.

", "resource": null, "actions": { "33xlM2ph77SSUfBs": { "type": "attack", "_id": "33xlM2ph77SSUfBs", "systemPath": "actions", - "description": "", + "description": "

Make an attack against a target within Melee range. On a success, deal 1d8+2 physical damage and the Thief steals one item or consumable from the target’s inventory.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -303,8 +302,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "Cgk36WXthA9LwOYb", "img": "icons/skills/melee/strike-sword-gray.webp", @@ -325,14 +323,14 @@ "name": "Escape Plan", "type": "feature", "system": { - "description": "

Mark a Stress to reveal a snare trap set anywhere on the battlefield by the @Lookup[@name]. All targets within Very Close range of the trap must succeed on an Agility Reaction Roll (13) or be pulled off their feet and suspended upside down. A target is Restrained and Vulnerable until they break free, ending both conditions, with a successful Finesse or Strength Roll (13).

@Template[type:rect|range:c]

", + "description": "

Mark a Stress to reveal a snare trap set anywhere on the battlefi eld by the Thief. All targets within Very Close range of the trap must succeed on an Agility Reaction Roll (13) or be pulled off their feet and suspended upside down. A target is Restrained and Vulnerable until they break free, ending both conditions, with a successful Finesse or Strength Roll (13).

@Template[type:rect|range:c]

", "resource": null, "actions": { "sq0q1l2Go4GduR3B": { "type": "attack", "_id": "sq0q1l2Go4GduR3B", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to reveal a snare trap set anywhere on the battlefi eld by the Thief. All targets within Very Close range of the trap must succeed on an Agility Reaction Roll (13) or be pulled off their feet and suspended upside down. A target is Restrained and Vulnerable until they break free, ending both conditions, with a successful Finesse or Strength Roll (13).

@Template[type:rect|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -381,8 +379,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "tP2DD751nOLxFVps", "img": "icons/environment/traps/trap-jaw-tan.webp", diff --git a/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json b/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json index 3cec6e0b..943559e1 100644 --- a/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json +++ b/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json @@ -122,8 +122,7 @@ "source": "Daggerheart SRD", "page": 84, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "dNta0cUzr96xcFhf", @@ -232,91 +231,9 @@ "name": "Won't See it Coming", "type": "feature", "system": { - "description": "

The @Lookup[@name] deals direct damage while they’re Hidden.

", + "description": "

The Assassin deals direct damage while they’re Hidden.

", "resource": null, - "actions": { - "xFBE0jLf96fbCY7K": { - "type": "attack", - "_id": "xFBE0jLf96fbCY7K", - "systemPath": "actions", - "baseAction": false, - "description": "", - "chatDisplay": true, - "originItem": { - "type": "itemCollection" - }, - "actionType": "action", - "cost": [], - "uses": { - "value": null, - "max": "", - "recovery": null, - "consumeOnSuccess": false - }, - "damage": { - "parts": [ - { - "value": { - "custom": { - "enabled": false, - "formula": "" - }, - "flatMultiplier": 2, - "dice": "d10", - "bonus": 2, - "multiplier": "flat" - }, - "applyTo": "hitPoints", - "type": [ - "physical" - ], - "base": false, - "resultBased": false, - "valueAlt": { - "multiplier": "prof", - "flatMultiplier": 1, - "dice": "d6", - "bonus": null, - "custom": { - "enabled": false, - "formula": "" - } - } - } - ], - "includeBase": false, - "direct": true - }, - "target": { - "type": "any", - "amount": null - }, - "effects": [], - "roll": { - "type": "attack", - "trait": null, - "difficulty": null, - "bonus": null, - "advState": "neutral", - "diceRolling": { - "multiplier": "prof", - "flatMultiplier": 1, - "dice": "d6", - "compare": null, - "treshold": null - }, - "useDefault": false - }, - "save": { - "trait": null, - "difficulty": null, - "damageMod": "none" - }, - "name": "Hidden attack", - "img": "icons/magic/perception/silhouette-stealth-shadow.webp", - "range": "close" - } - }, + "actions": {}, "originItemType": null, "originId": null }, @@ -339,14 +256,14 @@ "name": "Strike as One", "type": "feature", "system": { - "description": "

Mark a Stress to spotlight a number of other Assassins equal to the @Lookup[@name]’s unmarked Stress.

", + "description": "

Mark a Stress to spotlight a number of other Assassins equal to the Assassin’s unmarked Stress.

", "resource": null, "actions": { "vKRDbD07bqR317Zv": { "type": "effect", "_id": "vKRDbD07bqR317Zv", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to spotlight a number of other Assassins equal to the Assassin’s unmarked Stress.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -373,8 +290,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "za6Qr0CjI9Kb4I0U", "img": "icons/skills/movement/arrows-up-trio-red.webp", @@ -395,14 +311,14 @@ "name": "The Subtle Blade", "type": "feature", "system": { - "description": "

When the @Lookup[@name] successfully makes a standard attack against a Vulnerable target, you can spend a Fear to deal Severe damage instead of their standard damage.

", + "description": "

When the Assassin successfully makes a standard attack against a Vulnerable target, you can spend a Fear to deal Severe damage instead of their standard damage.

", "resource": null, "actions": { "tYkZ9BwjlOg61BhE": { "type": "effect", "_id": "tYkZ9BwjlOg61BhE", "systemPath": "actions", - "description": "", + "description": "

When the Assassin successfully makes a standard attack against a Vulnerable target, you can spend a Fear to deal Severe damage instead of their standard damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -429,8 +345,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "s0WcpK43WN2ptqNc", "img": "icons/skills/melee/strike-dagger-blood-red.webp", @@ -451,14 +366,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Assassin makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "7EP5X5kodzMCBQZO": { "type": "healing", "_id": "7EP5X5kodzMCBQZO", "systemPath": "actions", - "description": "", + "description": "

When the Assassin makes a successful attack against a PC, you gain a Fear.

", "chatDisplay": true, "actionType": "reaction", "cost": [], @@ -525,8 +440,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "PcNgHScmTd9l3exN", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Merchant_Al3w2CgjfdT3p9ma.json b/src/packs/adversaries/adversary_Merchant_Al3w2CgjfdT3p9ma.json index 880b1a6e..43135e6f 100644 --- a/src/packs/adversaries/adversary_Merchant_Al3w2CgjfdT3p9ma.json +++ b/src/packs/adversaries/adversary_Merchant_Al3w2CgjfdT3p9ma.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 79, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "Al3w2CgjfdT3p9ma", @@ -229,7 +228,7 @@ "_id": "3Fwj28UxUcdMifoi", "img": "icons/skills/social/diplomacy-handshake.webp", "system": { - "description": "

A PC who succeeds on a Presence Roll against the @Lookup[@name] gains a discount on purchases. A PC who fails on a Presence Roll against the @Lookup[@name] must pay more and has disadvantage on future Presence Rolls against the @Lookup[@name].

", + "description": "

A PC who succeeds on a Presence Roll against the Merchant gains a discount on purchases. A PC who fails on a Presence Roll against the Merchant must pay more and has disadvantage on future Presence Rolls against the Merchant.

", "resource": null, "actions": {}, "originItemType": null, @@ -255,14 +254,14 @@ "_id": "Ksdgov6mYg7Og2ys", "img": "icons/skills/social/trading-justice-scale-yellow.webp", "system": { - "description": "

When a PC rolls a 14 or lower on a Presence Roll made against the @Lookup[@name], they must mark a Stress.

", + "description": "

When a PC rolls a 14 or lower on a Presence Roll made against the Merchant, they must mark a Stress.

", "resource": null, "actions": { "sTHDvAggf1nUX4Ai": { "type": "damage", "_id": "sTHDvAggf1nUX4Ai", "systemPath": "actions", - "description": "", + "description": "

When a PC rolls a 14 or lower on a Presence Roll made against the Merchant, they must mark a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json b/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json index 15c0aeb9..a3ab2363 100644 --- a/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json +++ b/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json @@ -122,8 +122,7 @@ "source": "Daggerheart SRD", "page": 88, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "Vy02IhGhkJLuezu4", @@ -239,7 +238,7 @@ "type": "attack", "_id": "T7N9rDCaB5VOm6AY", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to offer a target a dangerous bargain for something they want or need. If used on a PC, they must make a Presence Reaction Roll (17). On a failure, they must mark 2 Stress or take the deal.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -309,8 +308,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "7dxToUpxOyISXXde", "img": "icons/commodities/currency/coins-plain-stack-gold-yellow.webp", @@ -331,14 +329,14 @@ "name": "The Best Muscle Money Can Buy", "type": "feature", "system": { - "description": "

Once per scene, mark a Stress to summon 1d4+1 Tier 1 adversaries, who appear at Far range, to enforce the @Lookup[@name]’s will.

", + "description": "

Once per scene, mark a Stress to summon 1d4+1 Tier 1 adversaries, who appear at Far range, to enforce the Baron’s will.

", "resource": null, "actions": { "9NA6vgfsv0y2tX9v": { "type": "effect", "_id": "9NA6vgfsv0y2tX9v", "systemPath": "actions", - "description": "", + "description": "

Once per scene, mark a Stress to summon 1d4+1 Tier 1 adversaries, who appear at Far range, to enforce the Baron’s will.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -365,8 +363,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "QnDvERcyaq3XLCjF", "img": "icons/environment/people/charge.webp", diff --git a/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json b/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json index b1732c71..edb50cf1 100644 --- a/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json +++ b/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 79, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "sRn4bqerfARvhgSV", @@ -223,7 +222,7 @@ "_id": "4Rw5KC5klRseiLvn", "img": "icons/magic/defensive/shield-barrier-flaming-diamond-blue.webp", "system": { - "description": "

The @Lookup[@name] is resistant to magic damage.

", + "description": "

The Elemental is resistant to magic damage.

", "resource": null, "actions": {}, "originItemType": null, @@ -300,7 +299,7 @@ "type": "damage", "_id": "g4CVwjDeJgTJ2oCw", "systemPath": "actions", - "description": "", + "description": "

Mark a HP to force all targets within Close range to mark a Stress and become Vulnerable until their next rest or they clear a HP.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -363,8 +362,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [ { @@ -431,7 +429,7 @@ "type": "damage", "_id": "QzuQIAtSrgz9Zd5V", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to transform the area within Very Close range into a different biome. All targets within this area take 2d6+3 direct magic damage.

@Template[type:emanation|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -490,8 +488,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -512,13 +509,12 @@ "_id": "dnVB2DxbpYtwt0S0", "img": "icons/magic/light/beam-impact-deflect-teal.webp", "system": { - "description": "

When the @Lookup[@name] takes damage from an attack within Close range, deal an amount of damage to the attacker equal to half the damage they dealt.

", + "description": "

When the Elemental takes damage from an attack within Close range, deal an amount of damage to the attacker equal to half the damage they dealt.

", "resource": null, "actions": {}, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, @@ -539,14 +535,14 @@ "_id": "JqRfb0IZ3aJrVazI", "img": "icons/skills/melee/strike-weapons-orange.webp", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Elemental makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "zpQIB9z9kK2BlfqZ": { "type": "healing", "_id": "zpQIB9z9kK2BlfqZ", "systemPath": "actions", - "description": "", + "description": "

When the Elemental makes a successful attack against a PC, you gain a Fear.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -614,8 +610,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json b/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json index 3a330fdf..5d6c34cd 100644 --- a/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json +++ b/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json @@ -110,8 +110,7 @@ "source": "Daggerheart SRD", "page": 79, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "3tqCjDwJAQ7JKqMb", @@ -222,14 +221,14 @@ "_id": "4xoydX3YwsLujuaI", "img": "icons/magic/unholy/silhouette-evil-horned-giant.webp", "system": { - "description": "

The @Lookup[@name] can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

", + "description": "

The Demon can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

", "resource": null, "actions": { "lfYFbb71wWaR8DJs": { "type": "effect", "_id": "lfYFbb71wWaR8DJs", "systemPath": "actions", - "description": "", + "description": "

The Demon can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -281,14 +280,14 @@ "_id": "kD9kO92V7t3IqZu8", "img": "icons/magic/unholy/strike-hand-glow-pink.webp", "system": { - "description": "

When a PC rolls a failure with Fear while within Close range of the @Lookup[@name], they lose a Hope.

@Template[type:emanation|range:c]

", + "description": "

When a PC rolls a failure with Fear while within Close range of the Demon, they lose a Hope.

@Template[type:emanation|range:c]

", "resource": null, "actions": { "XQ7QebA0iGvMti4A": { "type": "damage", "_id": "XQ7QebA0iGvMti4A", "systemPath": "actions", - "description": "", + "description": "

When a PC rolls a failure with Fear while within Close range of the Demon, they lose a Hope.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -367,7 +366,7 @@ "type": "attack", "_id": "nOzLQ0NJzeB3vKiV", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to rain down hellfire within Far range. All targets within the area must make an Agility Reaction Roll. Targets who fail take 1d20+3 magic damage. Targets who succeed take half damage.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -446,8 +445,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -468,14 +466,14 @@ "_id": "bpLBGTW1DmXPgIcx", "img": "icons/magic/death/skull-energy-light-white.webp", "system": { - "description": "

Before rolling damage for the @Lookup[@name]’s attack, you can mark a Stress to gain a bonus to the damage roll equal to the @Lookup[@name]’s current number of marked HP.

", + "description": "

Before rolling damage for the Demon’s attack, you can mark a Stress to gain a bonus to the damage roll equal to the Demon’s current number of marked HP.

", "resource": null, "actions": { "vZq3iaJrMzLYbqQN": { "type": "effect", "_id": "vZq3iaJrMzLYbqQN", "systemPath": "actions", - "description": "", + "description": "

Before rolling damage for the Demon’s attack, you can mark a Stress to gain a bonus to the damage roll equal to the Demon’s current number of marked HP.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -503,8 +501,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, @@ -525,14 +522,14 @@ "_id": "w400aHTlADxDihpt", "img": "icons/skills/melee/strike-weapons-orange.webp", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Demon makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "Cmd4f2gfxgOZsN6f": { "type": "healing", "_id": "Cmd4f2gfxgOZsN6f", "systemPath": "actions", - "description": "", + "description": "

When the Demon makes a successful attack against a PC, you gain a Fear.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -600,8 +597,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json b/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json index 2980a141..7421e270 100644 --- a/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json +++ b/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 79, "artist": "" - }, - "size": "large" + } }, "flags": {}, "_id": "DscWkNVoHak6P4hh", @@ -223,14 +222,14 @@ "_id": "c1jcZZD616J5Y4Mb", "img": "icons/magic/unholy/silhouette-evil-horned-giant.webp", "system": { - "description": "

The @Lookup[@name] can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

", + "description": "

The Elemental can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

", "resource": null, "actions": { "oFsBEbdXCpX9XLQy": { "type": "effect", "_id": "oFsBEbdXCpX9XLQy", "systemPath": "actions", - "description": "", + "description": "

The Elemental can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

", "chatDisplay": true, "actionType": "passive", "cost": [], @@ -273,14 +272,14 @@ "_id": "7AXE86WNd68OySkD", "img": "icons/magic/fire/explosion-flame-lightning-strike.webp", "system": { - "description": "

Mark a Stress to choose a point within Far range. The ground within Very Close range of that point immediately bursts into flames. All creatures within this area must make an Agility Reaction Roll. Targets who fail take 2d8 magic damage from the flames. Targets who succeed take half damage.

@Template[type:circle|range:vc]

", + "description": "

Mark a Stress to choose a point within Far range. The ground within Very Close range of that point immediately bursts into fl ames. All creatures within this area must make an Agility Reaction Roll. Targets who fail take 2d8 magic damage from the fl ames. Targets who succeed take half damage.

@Template[type:circle|range:vc]

", "resource": null, "actions": { "x1VCkfcSYiPyg8fk": { "type": "attack", "_id": "x1VCkfcSYiPyg8fk", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to choose a point within Far range. The ground within Very Close range of that point immediately bursts into fl ames. All creatures within this area must make an Agility Reaction Roll. Targets who fail take 2d8 magic damage from the fl ames. Targets who succeed take half damage.

@Template[type:circle|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -359,8 +358,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -467,8 +465,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -489,7 +486,7 @@ "_id": "3u6wvKPJAS2v5nWV", "img": "icons/magic/fire/elemental-fire-flying.webp", "system": { - "description": "

Three times per scene, when the @Lookup[@name] moves onto objects that are highly flammable, consume them to clear a HP or a Stress.

", + "description": "

Three times per scene, when the Elemental moves onto objects that are highly flammable, consume them to clear a HP or a Stress.

", "resource": { "type": "simple", "value": 0, @@ -501,7 +498,7 @@ "type": "healing", "_id": "CTWSVVisdgJgF7pd", "systemPath": "actions", - "description": "", + "description": "

Three times per scene, when the Elemental moves onto objects that are highly flammable, consume them to clear a HP or a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -568,7 +565,7 @@ "type": "healing", "_id": "e0fG0xtj6hOUp66o", "systemPath": "actions", - "description": "", + "description": "

Three times per scene, when the Elemental moves onto objects that are highly flammable, consume them to clear a HP or a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -634,8 +631,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, @@ -656,14 +652,14 @@ "_id": "kssnXljBaV31iX58", "img": "icons/skills/melee/strike-weapons-orange.webp", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Elemental makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "rPj1Wf22Kai3eBCv": { "type": "healing", "_id": "rPj1Wf22Kai3eBCv", "systemPath": "actions", - "description": "", + "description": "

When the Elemental makes a successful attack against a PC, you gain a Fear.

", "chatDisplay": true, "actionType": "reaction", "cost": [], @@ -731,8 +727,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json b/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json index 0f1e7ded..267a1e14 100644 --- a/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json +++ b/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json @@ -104,8 +104,7 @@ "source": "Daggerheart SRD", "page": 80, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "G62k4oSkhkoXEs2D", @@ -216,7 +215,7 @@ "_id": "gOgqATDRzPP7Jzbh", "img": "icons/magic/symbols/runes-carved-stone-yellow.webp", "system": { - "description": "

The @Lookup[@name] is defeated when they take any damage. For every 5 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

", + "description": "

The Treant is defeated when they take any damage. For every 5 damage a PC deals to the Treant, defeat an additional Minion within range the attack would succeed against.

", "resource": null, "actions": {}, "originItemType": null, @@ -242,14 +241,14 @@ "_id": "K08WlZwGqzEo4idT", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", "system": { - "description": "

Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 4 physical damage each. Combine this damage.

", + "description": "

Spend a Fear to choose a target and spotlight all Minor Treants within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 4 physical damage each. Combine this damage.

", "resource": null, "actions": { "xTMNAHcoErKuR6TZ": { "type": "effect", "_id": "xTMNAHcoErKuR6TZ", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to choose a target and spotlight all Minor Treants within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 4 physical damage each. Combine this damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -277,8 +276,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json b/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json index 85981374..10f48d17 100644 --- a/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json +++ b/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 89, "artist": "" - }, - "size": "large" + } }, "flags": {}, "_id": "rM9qCIYeWg9I0B4l", @@ -221,14 +220,14 @@ "name": "Ramp Up", "type": "feature", "system": { - "description": "

You must spend a Fear to spotlight the @Lookup[@name]. While spotlighted, they can make their standard attack against all targets within range.

", + "description": "

You must spend a Fear to spotlight the Minotaur. While spotlighted, they can make their standard attack against all targets within range.

", "resource": null, "actions": { "oVGqHl82zSjnlym3": { "type": "effect", "_id": "oVGqHl82zSjnlym3", "systemPath": "actions", - "description": "", + "description": "

You must spend a Fear to spotlight the Minotaur. While spotlighted, they can make their standard attack against all targets within range.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -276,14 +275,14 @@ "name": "Charging Bull", "type": "feature", "system": { - "description": "

Mark a Stress to charge through a group within Close range and make an attack against all targets in the @Lookup[@name]’s path. Targets the @Lookup[@name] succeeds against take 2d6+8 physical damage and are knocked back to Very Far range. If a target is knocked into a solid object or another creature, they take an extra 1d6 damage (combine the damage).

", + "description": "

Mark a Stress to charge through a group within Close range and make an attack against all targets in the Minotaur’s path. Targets the Minotaur succeeds against take 2d6+8 physical damage and are knocked back to Very Far range. If a target is knocked into a solid object or another creature, they take an extra 1d6 damage (combine the damage).

", "resource": null, "actions": { "8fgkb7U2pxNyiHrB": { "type": "attack", "_id": "8fgkb7U2pxNyiHrB", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to charge through a group within Close range and make an attack against all targets in the Minotaur’s path. Targets the Minotaur succeeds against take 2d6+8 physical damage and are knocked back to Very Far range. If a target is knocked into a solid object or another creature, they take an extra 1d6 damage (combine the damage).

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -415,8 +414,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "b2QvDYOq1nreI2uD", "img": "icons/creatures/mammals/bull-horned-blue.webp", @@ -480,8 +478,7 @@ } } ], - "includeBase": false, - "direct": true + "includeBase": false }, "target": { "type": "any", @@ -514,8 +511,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "WxbHcbaeb6L7g8qN", "img": "icons/skills/melee/strike-slashes-red.webp", diff --git a/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json b/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json index 5320a0ed..3f2d7d88 100644 --- a/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json +++ b/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json @@ -122,8 +122,7 @@ "source": "Daggerheart SRD", "page": 94, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "yx0vK2yfNVZKWUUi", @@ -236,8 +235,7 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "iYHCYTJzZbw5f0pF", "img": "icons/commodities/treasure/crown-gold-satin-gems-red.webp", @@ -258,14 +256,14 @@ "name": "Crownsguard", "type": "feature", "system": { - "description": "

Once per scene, mark a Stress to summon six Tier 3 Minions, who appear at Close range to enforce the @Lookup[@name]’s will.

", + "description": "

Once per scene, mark a Stress to summon six Tier 3 Minions, who appear at Close range to enforce the Monarch’s will.

", "resource": null, "actions": { "OJyqqCi0npye34y2": { "type": "effect", "_id": "OJyqqCi0npye34y2", "systemPath": "actions", - "description": "", + "description": "

Once per scene, mark a Stress to summon six Tier 3 Minions, who appear at Close range to enforce the Monarch’s will.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -292,8 +290,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "9K7C1PR4Q6QrUjjb", "img": "icons/environment/people/charge.webp", @@ -314,14 +311,14 @@ "name": "Casus Belli", "type": "feature", "system": { - "description": "

Long-Term Countdown (8). Spend a Fear to activate after the @Lookup[@name]’s desire for war is first revealed. When it triggers, the @Lookup[@name] has a reason to rally the nation to war and the support to act on that reason. You gain [[/r 1d4]] Fear.

", + "description": "

Long-Term Countdown (8). Spend a Fear to activate after the Monarch’s desire for war is first revealed. When it triggers, the Monarch has a reason to rally the nation to war and the support to act on that reason. You gain [[/r 1d4]] Fear.

", "resource": null, "actions": { "CNEOOdPI4xVJ2JeP": { "type": "countdown", "_id": "CNEOOdPI4xVJ2JeP", "systemPath": "actions", - "description": "

Long-Term Countdown (8). Spend a Fear to activate after the @Lookup[@name]’s desire for war is first revealed.

", + "description": "

Long-Term Countdown (8). Spend a Fear to activate after the Monarch’s desire for war is first revealed.

", "chatDisplay": true, "originItem": { "type": "itemCollection" @@ -367,7 +364,7 @@ "type": "healing", "_id": "QnZoH9LjJvKl5YcF", "systemPath": "actions", - "description": "

The @Lookup[@name] has a reason to rally the nation to war and the support to act on that reason. You gain 1d4 Fear.

", + "description": "

The Monarch has a reason to rally the nation to war and the support to act on that reason. You gain 1d4 Fear.

", "chatDisplay": true, "originItem": { "type": "itemCollection" @@ -438,8 +435,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "kA5NZTdiknsh7wxp", "img": "icons/sundries/scrolls/scroll-bound-sealed-red-tan.webp", diff --git a/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json b/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json index 8bc7fe10..74d7e2c3 100644 --- a/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json +++ b/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 89, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "mVV7a7KQAORoPMgZ", @@ -227,14 +226,14 @@ "name": "Terrifying", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

@Template[type:emanation|range:f]

", + "description": "

When the Hunter makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

@Template[type:emanation|range:f]

", "resource": null, "actions": { "9T1g3FH38cnCRG8k": { "type": "damage", "_id": "9T1g3FH38cnCRG8k", "systemPath": "actions", - "description": "", + "description": "

When the Hunter makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -305,14 +304,14 @@ "name": "Deathlock", "type": "feature", "system": { - "description": "

Spend a Fear to curse a target within Very Close range with a necrotic Deathlock until the end of the scene. Attacks made by the @Lookup[@name] against a Deathlocked target deal direct damage. The @Lookup[@name] can only maintain one Deathlock at a time.

", + "description": "

Spend a Fear to curse a target within Very Close range with a necrotic Deathlock until the end of the scene. Attacks made by the Hunter against a Deathlocked target deal direct damage. The Hunter can only maintain one Deathlock at a time.

", "resource": null, "actions": { "LUNsI29woLk4m2wo": { "type": "effect", "_id": "LUNsI29woLk4m2wo", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to curse a target within Very Close range with a necrotic Deathlock until the end of the scene. Attacks made by the Hunter against a Deathlocked target deal direct damage. The Hunter can only maintain one Deathlock at a time.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -341,92 +340,10 @@ "name": "Curse", "img": "icons/magic/unholy/hand-marked-pink.webp", "range": "veryClose" - }, - "zLKfwa8a2YBRLKAF": { - "type": "attack", - "_id": "zLKfwa8a2YBRLKAF", - "systemPath": "actions", - "baseAction": false, - "description": "

Attacks made by the @Lookup[@name] against a Deathlocked target deal direct damage.

", - "chatDisplay": true, - "originItem": { - "type": "itemCollection" - }, - "actionType": "action", - "cost": [], - "uses": { - "value": null, - "max": "", - "recovery": null, - "consumeOnSuccess": false - }, - "damage": { - "parts": [ - { - "value": { - "custom": { - "enabled": false, - "formula": "" - }, - "flatMultiplier": 2, - "dice": "d12", - "bonus": 1, - "multiplier": "flat" - }, - "applyTo": "hitPoints", - "type": [ - "physical" - ], - "base": false, - "resultBased": false, - "valueAlt": { - "multiplier": "prof", - "flatMultiplier": 1, - "dice": "d6", - "bonus": null, - "custom": { - "enabled": false, - "formula": "" - } - } - } - ], - "includeBase": false, - "direct": true - }, - "target": { - "type": "any", - "amount": null - }, - "effects": [], - "roll": { - "type": "attack", - "trait": null, - "difficulty": null, - "bonus": null, - "advState": "neutral", - "diceRolling": { - "multiplier": "prof", - "flatMultiplier": 1, - "dice": "d6", - "compare": null, - "treshold": null - }, - "useDefault": false - }, - "save": { - "trait": null, - "difficulty": null, - "damageMod": "none" - }, - "name": "Deathlocked attack", - "img": "icons/magic/unholy/hand-marked-pink.webp", - "range": "veryClose" } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "r1T70u9n3bRfUTX5", "img": "icons/magic/unholy/hand-marked-pink.webp", @@ -491,7 +408,7 @@ "type": "attack", "_id": "wxOfNoEogH1EU0Jb", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to spotlight 1d4 allies. Attacks they make while spotlighted in this way deal half damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -542,8 +459,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "5AQTqW1GDidHfU3a", "img": "icons/skills/movement/arrows-up-trio-red.webp", @@ -564,14 +480,14 @@ "name": "Rampage", "type": "feature", "system": { - "description": "

Countdown (Loop 1d6). When the @Lookup[@name] is in the spotlight for the first time, activate the countdown. When it triggers, move the @Lookup[@name] in a straight line to a point within Far range and make an attack against all targets in their path. Targets the @Lookup[@name] succeeds against take 2d8+2 physical damage.

@Template[type:ray|range:f]

", + "description": "

Countdown (Loop 1d6). When the Hunter is in the spotlight for the first time, activate the countdown. When it triggers, move the Hunter in a straight line to a point within Far range and make an attack against all targets in their path. Targets the Hunter succeeds against take 2d8+2 physical damage.

@Template[type:ray|range:f]

", "resource": null, "actions": { "VjiFxuzfAaq5N1jy": { "type": "attack", "_id": "VjiFxuzfAaq5N1jy", "systemPath": "actions", - "description": "

Move the @Lookup[@name] in a straight line to a point within Far range and make an attack against all targets in their path. Targets the @Lookup[@name] succeeds against take 2d8+2 physical damage.

@Template[type:ray|range:f]

", + "description": "

Move the Hunter in a straight line to a point within Far range and make an attack against all targets in their path. Targets the Hunter succeeds against take 2d8+2 physical damage.

@Template[type:ray|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -644,7 +560,7 @@ "type": "countdown", "_id": "BhA3vxCuMs4UbbQU", "systemPath": "actions", - "description": "

Countdown (Loop 1d6). When the @Lookup[@name] is in the spotlight for the first time, activate the countdown.

", + "description": "

Countdown (Loop 1d6). When the Hunter is in the spotlight for the first time, activate the countdown.

", "chatDisplay": true, "originItem": { "type": "itemCollection" @@ -679,8 +595,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "IOCG3J20wUHvyvvh", "img": "icons/magic/movement/trail-streak-zigzag-yellow.webp", diff --git a/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json b/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json index c0999e70..00ba4dfe 100644 --- a/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json +++ b/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json @@ -111,8 +111,7 @@ "page": 95, "artist": "" }, - "motivesAndTactics": "Hide in plain sight, preserve the forest, root down, swing branches", - "size": "large" + "motivesAndTactics": "Hide in plain sight, preserve the forest, root down, swing branches" }, "flags": {}, "_id": "XK78QUfY8c8Go8Uv", @@ -221,7 +220,7 @@ "name": "Just a Tree", "type": "feature", "system": { - "description": "

Before they make their first attack in a fight or after they become Hidden the @Lookup[@name] is indistinguishable from other trees until they next act or a PC succeeds on an Instinct Roll to identify them.

", + "description": "

Before they make their first attack in a fight or after they become Hidden the Treant is indistinguishable from other trees until they next act or a PC succeeds on an Instinct Roll to identify them.

", "resource": null, "actions": {}, "originItemType": null, @@ -246,14 +245,14 @@ "name": "Seed Barrage", "type": "feature", "system": { - "description": "

Mark a Stress and make an attack against up to three targets within Close range pummeling them with giant acorns. Targets the @Lookup[@name] succeeds against take 2d10+5 physical damage.

", + "description": "

Mark a Stress and make an attack against up to three targets within Close range pummeling them with giant acorns Targets the Treant succeeds against take 2d10+5 physical damage.

", "resource": null, "actions": { "cM5BBUSFxOHBsV2G": { "type": "damage", "_id": "cM5BBUSFxOHBsV2G", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress and make an attack against up to three targets within Close range pummeling them with giant acorns Targets the Treant succeeds against take 2d10+5 physical damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -316,8 +315,7 @@ } }, "originItemType": null, - "multiclassOrigin": false, - "featureForm": "action" + "multiclassOrigin": false }, "_id": "Q2slH9qkBO5SPw43", "img": "icons/consumables/nuts/nut-spiked-shell.webp", @@ -338,7 +336,7 @@ "name": "Take Root", "type": "feature", "system": { - "description": "

Mark a Stress to Root the @Lookup[@name] in place. The @Lookup[@name] is Restrained while Rooted and can end this effect instead of moving while they are spotlighted. While Rooted the @Lookup[@name] has resistance to physical damage.

", + "description": "

Mark a Stress to Root the Treant in place. The Treant is Restrained while Rooted and can end this effect instead of moving while they are spotlighted. While Rooted the Treant has resistance to physical damage.

", "resource": null, "actions": { "008EelRlcs6CKGvM": { @@ -380,8 +378,7 @@ } }, "originItemType": null, - "multiclassOrigin": false, - "featureForm": "action" + "multiclassOrigin": false }, "_id": "sqkgw26P2KiQVtXT", "img": "icons/consumables/plants/thorned-stem-brown.webp", diff --git a/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json b/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json index 66fa5ba1..0925049d 100644 --- a/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json +++ b/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 99, "artist": "" - }, - "size": "large" + } }, "flags": {}, "_id": "befIqd5IYKg6eUz2", @@ -227,14 +226,14 @@ "name": "Terrifying", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

@Template[type:emanation|range:f]

", + "description": "

When the Oracle makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

@Template[type:emanation|range:f]

", "resource": null, "actions": { "VjdSO1lAdTIAlofM": { "type": "damage", "_id": "VjdSO1lAdTIAlofM", "systemPath": "actions", - "description": "", + "description": "

When the Oracle makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -305,14 +304,14 @@ "name": "Walls Closing In", "type": "feature", "system": { - "description": "

When a creature rolls a failure while within Very Far range of the @Lookup[@name], they must mark a Stress.

", + "description": "

When a creature rolls a failure while within Very Far range of the Oracle, they must mark a Stress.

", "resource": null, "actions": { "u9iEsvV5ktvOxNp5": { "type": "damage", "_id": "u9iEsvV5ktvOxNp5", "systemPath": "actions", - "description": "", + "description": "

When a creature rolls a failure while within Very Far range of the Oracle, they must mark a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -390,7 +389,7 @@ "type": "attack", "_id": "IiSgpy6Axfqo9f9V", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to present a target within Far range with a vision of their personal nightmare. The target must make a Knowledge Reaction Roll. On a failure, they lose all Hope and take 2d20+4 direct magic damage. On a success, they take half damage and lose a Hope.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -468,8 +467,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "QoFecwKWBFzrk4Wp", "img": "icons/magic/death/skeleton-skull-soul-blue.webp", @@ -497,7 +495,7 @@ "type": "attack", "_id": "71UnFo3CBBPtbao3", "systemPath": "actions", - "description": "", + "description": "

Once per day, spend 2 Fear to summon 2d4 Tier 2 or below Minions relevant to one of the PC’s personal nightmares. They appear at Close range relative to that PC.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -548,8 +546,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "A4yI2RENCuLk6mg9", "img": "icons/magic/death/skull-horned-worn-fire-blue.webp", @@ -570,12 +567,11 @@ "name": "Ominous Knowledge", "type": "feature", "system": { - "description": "

When the @Lookup[@name] sees a mortal creature, they instantly know one of their personal nightmares.

", + "description": "

When the Oracle sees a mortal creature, they instantly know one of their personal nightmares.

", "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "IPoWZmSQ2kgWek5T", "img": "icons/magic/symbols/mask-yellow-orange.webp", @@ -596,14 +592,14 @@ "name": "Vengeful Fate", "type": "feature", "system": { - "description": "

When the @Lookup[@name] marks HP from an attack within Very Close range, you can mark a Stress to knock the attacker back to Far range and deal 2d10+4 physical damage.

", + "description": "

When the Oracle marks HP from an attack within Very Close range, you can mark a Stress to knock the attacker back to Far range and deal 2d10+4 physical damage.

", "resource": null, "actions": { "vJ7kARKL5H87T1BY": { "type": "damage", "_id": "vJ7kARKL5H87T1BY", "systemPath": "actions", - "description": "", + "description": "

When the Oracle marks HP from an attack within Very Close range, you can mark a Stress to knock the attacker back to Far range and deal 2d10+4 physical damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -661,8 +657,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "kuxTMjy8lOmNSa8e", "img": "icons/magic/control/sihouette-hold-beam-green.webp", diff --git a/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json b/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json index 5b565b8c..8e9d6b37 100644 --- a/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json +++ b/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 99, "artist": "" - }, - "size": "large" + } }, "flags": {}, "_id": "A0SeeDzwjvqOsyof", @@ -221,7 +220,7 @@ "name": "Chaotic Form", "type": "feature", "system": { - "description": "

When the @Lookup[@name] attacks, roll 2d4 and use the result as their attack modifier.

", + "description": "

When the Abomination attacks, roll 2d4 and use the result as their attack modifi er.

", "resource": null, "actions": {}, "originItemType": null, @@ -246,14 +245,14 @@ "name": "Disorienting Presence", "type": "feature", "system": { - "description": "

When a target takes damage from the @Lookup[@name], they must make an Instinct Reaction Roll. On a failure, they gain disadvantage on their next action roll and you gain a Fear.

", + "description": "

When a target takes damage from the Abomination, they must make an Instinct Reaction Roll. On a failure, they gain disadvantage on their next action roll and you gain a Fear.

", "resource": null, "actions": { "4diIu0AzPjitQ94k": { "type": "attack", "_id": "4diIu0AzPjitQ94k", "systemPath": "actions", - "description": "", + "description": "

When a target takes damage from the Abomination, they must make an Instinct Reaction Roll. On a failure, they gain disadvantage on their next action roll and you gain a Fear.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -367,14 +366,14 @@ "name": "Reality Quake", "type": "feature", "system": { - "description": "

Spend a Fear to rattle the edges of reality within Far range of the @Lookup[@name]. All targets within that area must succeed on a Knowledge Reaction Roll or become Unstuck from reality until the end of the scene. When an Unstuck target spends Hope or marks Armor Slots, HP, or Stress, they must double the amount spent or marked.

@Template[type:emanation|range:f]

", + "description": "

Spend a Fear to rattle the edges of reality within Far range of the Abomination. All targets within that area must succeed on a Knowledge Reaction Roll or become Unstuck from reality until the end of the scene. When an Unstuck target spends Hope or marks Armor Slots, HP, or Stress, they must double the amount spent or marked.

@Template[type:emanation|range:f]

", "resource": null, "actions": { "7apNSLz8m7sxyLhU": { "type": "attack", "_id": "7apNSLz8m7sxyLhU", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to rattle the edges of reality within Far range of the Abomination. All targets within that area must succeed on a Knowledge Reaction Roll or become Unstuck from reality until the end of the scene. When an Unstuck target spends Hope or marks Armor Slots, HP, or Stress, they must double the amount spent or marked.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -423,8 +422,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "K3MQO1I42nmfM2F2", "img": "icons/magic/sonic/explosion-shock-sound-wave.webp", @@ -482,14 +480,14 @@ "name": "Unreal Form", "type": "feature", "system": { - "description": "

When the @Lookup[@name] takes damage, reduce it by 1d20. If the @Lookup[@name] marks 1 or fewer Hit Points from a successful attack against them, you gain a Fear.

", + "description": "

When the Abomination takes damage, reduce it by 1d20. If the Abomination marks 1 or fewer Hit Points from a successful attack against them, you gain a Fear.

", "resource": null, "actions": { "ohpbyDEgSTVJ7qaF": { "type": "attack", "_id": "ohpbyDEgSTVJ7qaF", "systemPath": "actions", - "description": "", + "description": "

When the Abomination takes damage, reduce it by 1d20. If the Abomination marks 1 or fewer Hit Points from a successful attack against them, you gain a Fear.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -533,8 +531,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "u9dR2Qh3swHZalXj", "img": "icons/magic/unholy/orb-contained-pink.webp", diff --git a/src/packs/adversaries/adversary_Outer_Realms_Corrupter_ms6nuOl3NFkhPj1k.json b/src/packs/adversaries/adversary_Outer_Realms_Corrupter_ms6nuOl3NFkhPj1k.json index 83fbf4fa..4226d346 100644 --- a/src/packs/adversaries/adversary_Outer_Realms_Corrupter_ms6nuOl3NFkhPj1k.json +++ b/src/packs/adversaries/adversary_Outer_Realms_Corrupter_ms6nuOl3NFkhPj1k.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 99, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "ms6nuOl3NFkhPj1k", @@ -221,14 +220,14 @@ "name": "Will-Shattering Touch", "type": "feature", "system": { - "description": "

When a PC takes damage from the @Lookup[@name], they lose a Hope.

", + "description": "

When a PC takes damage from the Corrupter, they lose a Hope.

", "resource": null, "actions": { "q2PUiGoUQqsMghtW": { "type": "damage", "_id": "q2PUiGoUQqsMghtW", "systemPath": "actions", - "description": "", + "description": "

When a PC takes damage from the Corrupter, they lose a Hope.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -306,7 +305,7 @@ "type": "attack", "_id": "6vX6VHpXX7OiGSWH", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to spew partially digested portions of consumed realities at all targets within Close range. Targets must succeed on a Knowledge Reaction Roll or mark 2 Stress.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -376,8 +375,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "gBLVvHbyekmIUITD", "img": "icons/magic/unholy/barrier-shield-glowing-pink.webp", diff --git a/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json b/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json index 370182a5..f5558098 100644 --- a/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json +++ b/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json @@ -104,8 +104,7 @@ "source": "Daggerheart SRD", "page": 99, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "moJhHgKqTKPS2WYS", @@ -214,7 +213,7 @@ "name": "Minion (13)", "type": "feature", "system": { - "description": "

The @Lookup[@name] is defeated when they take any damage. For every 13 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

", + "description": "

The Thrall is defeated when they take any damage. For every 13 damage a PC deals to the Thrall, defeat an additional Minion within range the attack would succeed against.

", "resource": null, "actions": {}, "originItemType": null, @@ -239,14 +238,14 @@ "name": "Group Attack", "type": "feature", "system": { - "description": "

Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 11 physical damage each. Combine this damage.

", + "description": "

Spend a Fear to choose a target and spotlight all Outer Realm Thralls within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 11 physical damage each. Combine this damage.

", "resource": null, "actions": { "tvQetauskZoHDR5y": { "type": "effect", "_id": "tvQetauskZoHDR5y", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to choose a target and spotlight all Outer Realm Thralls within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 11 physical damage each. Combine this damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -273,8 +272,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "7DWNmxZvp1Fm3aq3", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", diff --git a/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json b/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json index b63e8cb7..efffaf03 100644 --- a/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json +++ b/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json @@ -40,13 +40,11 @@ "experiences": { "rLPEhboQmaD7QV7T": { "name": "Intimidation", - "value": 2, - "description": "" + "value": 2 }, "ejtjcqd5oW6eKnav": { "name": "Tear Things Apart", - "value": 2, - "description": "" + "value": 2 } }, "bonuses": { @@ -122,8 +120,7 @@ "source": "Daggerheart SRD", "page": 83, "artist": "" - }, - "size": "huge" + } }, "flags": {}, "_id": "EQTOAOUrkIvS2z88", @@ -234,7 +231,7 @@ "_id": "rEJ1kAfhHQZWhrZj", "img": "icons/commodities/biological/hand-clawed-tan.webp", "system": { - "description": "

When the @Lookup[@name] takes Major or greater damage, they mark an additional HP.

", + "description": "

When the Zombie takes Major or greater damage, they mark an additional HP.

", "resource": null, "actions": { "Y8LQe5TzbdK2mOG9": { @@ -317,7 +314,7 @@ "_id": "0fn7rVLwBnyCyvTA", "img": "icons/skills/melee/strike-slashes-orange.webp", "system": { - "description": "

When the @Lookup[@name] makes a standard attack, they can attack all targets within Very Close range.

@Template[type:emanation|range:vc]

", + "description": "

When the Zombie makes a standard attack, they can attack all targets within Very Close range.

@Template[type:emanation|range:vc]

", "resource": null, "actions": {}, "originItemType": null, @@ -343,14 +340,14 @@ "_id": "gw1Z2VazlRXYCiCK", "img": "icons/magic/death/skull-trio-badge-purple.webp", "system": { - "description": "

When the @Lookup[@name] is within Very Close range of a corpse, they can incorporate it into themselves, clearing a HP and a Stress.

", + "description": "

When the Zombie is within Very Close range of a corpse, they can incorporate it into themselves, clearing a HP and a Stress.

", "resource": null, "actions": { "PfaFRZKFnHGg6mU4": { "type": "healing", "_id": "PfaFRZKFnHGg6mU4", "systemPath": "actions", - "description": "", + "description": "

When the Zombie is within Very Close range of a corpse, they can incorporate it into themselves, clearing a HP and a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -441,8 +438,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -470,7 +466,7 @@ "type": "attack", "_id": "2NYC0D7wkBNrUAKl", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to cause all PCs within Far range to make a Presence Reaction Roll (13). Targets who fail lose a Hope and you gain a Fear for each. Targets who succeed must mark a Stress.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -548,8 +544,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json b/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json index e3da56b6..ae8bb68f 100644 --- a/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json +++ b/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 101, "artist": "" - }, - "size": "large" + } }, "flags": {}, "_id": "CP6iRfHdyFWniTHY", @@ -221,14 +220,14 @@ "name": "Terrifying", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

@Template[type:emanation|range:f]

", + "description": "

When the Zombie makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

@Template[type:emanation|range:f]

", "resource": null, "actions": { "dquYnt5qiHZfnyD9": { "type": "damage", "_id": "dquYnt5qiHZfnyD9", "systemPath": "actions", - "description": "", + "description": "

When the Zombie makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -299,7 +298,7 @@ "name": "Fearsome Presence", "type": "feature", "system": { - "description": "

PCs can’t spend Hope to use features against the @Lookup[@name].

", + "description": "

PCs can’t spend Hope to use features against the Zombie.

", "resource": null, "actions": {}, "originItemType": null, @@ -324,14 +323,14 @@ "name": "Perfect Strike", "type": "feature", "system": { - "description": "

Mark a Stress to make a standard attack against all targets within Very Close range. Targets the @Lookup[@name] succeeds against are Vulnerable until their next rest.

@Template[type:emanation|range:vc]

", + "description": "

Mark a Stress to make a standard attack against all targets within Very Close range. Targets the Zombie succeeds against are Vulnerable until their next rest.

@Template[type:emanation|range:vc]

", "resource": null, "actions": { "un9btM1mN53JHIgV": { "type": "attack", "_id": "un9btM1mN53JHIgV", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to make a standard attack against all targets within Very Close range. Targets the Zombie succeeds against are Vulnerable until their next rest.

@Template[type:emanation|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -414,8 +413,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "CKy2r6FguyTSO9Fm", "img": "icons/skills/melee/strike-axe-energy-pink.webp", @@ -446,7 +444,7 @@ "startRound": null, "startTurn": null }, - "description": "

Vulnerable until your next rest.

", + "description": "

Vulnerable until yournext rest.

", "tint": "#ffffff", "statuses": [ "vulnerable" @@ -475,14 +473,14 @@ "name": "Skilled Opportunist", "type": "feature", "system": { - "description": "

When another adversary deals damage to a target within Very Close range of the @Lookup[@name], you can spend a Fear to add the @Lookup[@name]’s standard attack damage to the damage roll.

", + "description": "

When another adversary deals damage to a target within Very Close range of the Zombie, you can spend a Fear to add the Zombie’s standard attack damage to the damage roll.

", "resource": null, "actions": { "To2z7XQItxcMxKBp": { "type": "effect", "_id": "To2z7XQItxcMxKBp", "systemPath": "actions", - "description": "", + "description": "

When another adversary deals damage to a target within Very Close range of the Zombie, you can spend a Fear to add the Zombie’s standard attack damage to the damage roll.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -502,8 +500,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "hWxjmdc1O5J1otLM", "img": "icons/magic/perception/shadow-stealth-eyes-purple.webp", diff --git a/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json b/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json index 4ac7e746..fc5d8f01 100644 --- a/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json +++ b/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 80, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "wycLpvebWdUqRhpP", @@ -229,7 +228,7 @@ "_id": "Jbq36nElH6RDacLU", "img": "icons/skills/social/diplomacy-writing-letter.webp", "system": { - "description": "

All social actions made against the @Lookup[@name] on their land have disadvantage.

", + "description": "

All social actions made against the Noble on their land have disadvantage.

", "resource": null, "actions": {}, "originItemType": null, @@ -255,7 +254,7 @@ "_id": "ebdAPBso5ROmdFNO", "img": "icons/environment/people/infantry-armored.webp", "system": { - "description": "

Once per scene, mark a Stress to summon 1d4 @UUID[Compendium.daggerheart.adversaries.Actor.B4LZcGuBAHzyVdzy]{Bladed Guards}, who appear at Far range to enforce the @Lookup[@name]’s will.

", + "description": "

Once per scene, mark a Stress to summon 1d4 @UUID[Compendium.daggerheart.adversaries.Actor.B4LZcGuBAHzyVdzy]{Bladed Guards}, who appear at Far range to enforce the Noble’s will.

", "resource": null, "actions": { "cUKwhq1imsTVru8D": { @@ -314,8 +313,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -336,14 +334,14 @@ "_id": "xN09fSsg33nURqpk", "img": "icons/commodities/currency/coin-embossed-skull-gold.webp", "system": { - "description": "

Spend a Fear and target a PC. The @Lookup[@name] proclaims that the target and their allies are exiled from the @Lookup[@name]’s territory. While exiled, the target and their allies have disadvantage during social situations within the @Lookup[@name]’s domain.

", + "description": "

Spend a Fear and target a PC. The Noble proclaims that the target and their allies are exiled from the noble’s territory. While exiled, the target and their allies have disadvantage during social situations within the Noble’s domain.

", "resource": null, "actions": { "dAHzRxf0iztyc1mI": { "type": "effect", "_id": "dAHzRxf0iztyc1mI", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear and target a PC. The Noble proclaims that the target and their allies are exiled from the noble’s territory. While exiled, the target and their allies have disadvantage during social situations within the Noble’s domain.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -371,8 +369,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json b/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json index 409d7698..5b3db044 100644 --- a/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json +++ b/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json @@ -122,8 +122,7 @@ "source": "Daggerheart SRD", "page": 81, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "OROJbjsqagVh7ECV", @@ -234,14 +233,14 @@ "_id": "PsMA3x6giL8tixbf", "img": "icons/magic/control/mouth-smile-deception-purple.webp", "system": { - "description": "

When the @Lookup[@name] marks 2 or fewer HP from an attack within Melee range, the attacker must mark a Stress.

", + "description": "

When the Captain marks 2 or fewer HP from an attack within Melee range, the attacker must mark a Stress.

", "resource": null, "actions": { "xYphrI8GtMHHuT9a": { "type": "damage", "_id": "xYphrI8GtMHHuT9a", "systemPath": "actions", - "description": "", + "description": "

When the Captain marks 2 or fewer HP from an attack within Melee range, the attacker must mark a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -320,7 +319,7 @@ "type": "effect", "_id": "NlgIp0KrmZoS27Xy", "systemPath": "actions", - "description": "", + "description": "

Once per scene, mark a Stress to summon a Pirate Raiders Horde, which appears at Far range.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -348,8 +347,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -370,14 +368,14 @@ "_id": "brHnMc0TDiWVT4U6", "img": "icons/magic/death/skull-energy-light-purple.webp", "system": { - "description": "

Spend a Fear to choose a target who has three or more Pirates within Melee range of them. The @Lookup[@name] leads the Pirates in hurling threats and promises of a watery grave. The target must make a Presence Reaction Roll. On a failure, the target marks 1d4+1 Stress. On a success, they must mark a Stress.

", + "description": "

Spend a Fear to choose a target who has three or more Pirates within Melee range of them. The Captain leads the Pirates in hurling threats and promises of a watery grave. The target must make a Presence Reaction Roll. On a failure, the target marks 1d4+1 Stress. On a success, they must mark a Stress.

", "resource": null, "actions": { "h2vM7jDTeFttVJKN": { "type": "attack", "_id": "h2vM7jDTeFttVJKN", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to choose a target who has three or more Pirates within Melee range of them. The Captain leads the Pirates in hurling threats and promises of a watery grave. The target must make a Presence Reaction Roll. On a failure, the target marks 1d4+1 Stress. On a success, they must mark a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -454,8 +452,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -476,14 +473,14 @@ "_id": "V4EcsqMd70BTrDNu", "img": "icons/skills/melee/strike-weapons-orange.webp", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Captain makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "78Qphxjbs7cOYsNf": { "type": "healing", "_id": "78Qphxjbs7cOYsNf", "systemPath": "actions", - "description": "", + "description": "

When the Captain makes a successful attack against a PC, you gain a Fear.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -551,8 +548,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Pirate_Raiders_5YgEajn0wa4i85kC.json b/src/packs/adversaries/adversary_Pirate_Raiders_5YgEajn0wa4i85kC.json index 7d3733ce..dd69529d 100644 --- a/src/packs/adversaries/adversary_Pirate_Raiders_5YgEajn0wa4i85kC.json +++ b/src/packs/adversaries/adversary_Pirate_Raiders_5YgEajn0wa4i85kC.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 81, "artist": "" - }, - "size": "huge" + } }, "flags": {}, "_id": "5YgEajn0wa4i85kC", @@ -229,7 +228,7 @@ "_id": "Q7DRbWjHl64CNwag", "img": "icons/creatures/magical/humanoid-silhouette-aliens-green.webp", "system": { - "description": "

When the @Lookup[@name] have marked half or more of their HP, their standard attack deals 1d4+1 physical damage instead.

", + "description": "

When the Raiders have marked half or more of their HP, their standard attack deals 1d4+1 physical damage instead.

", "resource": null, "actions": {}, "originItemType": null, @@ -255,14 +254,14 @@ "_id": "N401rF937fLXMuMA", "img": "icons/magic/control/mouth-smile-deception-purple.webp", "system": { - "description": "

When the @Lookup[@name] mark 2 or fewer HP from an attack within Melee range, the attacker must mark a Stress.

", + "description": "

When the Raiders mark 2 or fewer HP from an attack within Melee range, the attacker must mark a Stress.

", "resource": null, "actions": { "ejadA9jjMnVNVczS": { "type": "damage", "_id": "ejadA9jjMnVNVczS", "systemPath": "actions", - "description": "", + "description": "

When the Raiders mark 2 or fewer HP from an attack within Melee range, the attacker must mark a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Pirate_Tough_mhcVkVFrzIJ18FDm.json b/src/packs/adversaries/adversary_Pirate_Tough_mhcVkVFrzIJ18FDm.json index 69b59211..919b8aaf 100644 --- a/src/packs/adversaries/adversary_Pirate_Tough_mhcVkVFrzIJ18FDm.json +++ b/src/packs/adversaries/adversary_Pirate_Tough_mhcVkVFrzIJ18FDm.json @@ -150,8 +150,7 @@ "source": "Daggerheart SRD", "page": 81, "artist": "" - }, - "size": "medium" + } }, "prototypeToken": { "name": "Pirate Tough", @@ -252,14 +251,14 @@ "name": "Swashbuckler", "type": "feature", "system": { - "description": "

When the @Lookup[@name] marks 2 or fewer HP from an attack within Melee range, the attacker must mark a Stress.

", + "description": "

When the Tough marks 2 or fewer HP from an attack within Melee range, the attacker must mark a Stress.

", "resource": null, "actions": { "xg3K78wfOhg8oCd3": { "type": "damage", "_id": "xg3K78wfOhg8oCd3", "systemPath": "actions", - "description": "", + "description": "

When the Tough marks 2 or fewer HP from an attack within Melee range, the attacker must mark a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -337,7 +336,7 @@ "type": "attack", "_id": "uJl1NJQ55yd9oCwz", "systemPath": "actions", - "description": "", + "description": "

Make an attack against a target within Very Close range. On a success, mark a Stress to move into Melee range of the target, dealing 3d4 physical damage and knocking the target back to Close range.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -408,8 +407,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "uzlxE1Cxm9GGmrNs", "img": "icons/skills/melee/unarmed-punch-fist-blue.webp", diff --git a/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json b/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json index 320b71af..f555999d 100644 --- a/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json +++ b/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 80, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "9rVlbJVrDNn1x7PS", @@ -229,7 +228,7 @@ "_id": "QGQTLWXIMMLUvm7c", "img": "icons/magic/fire/flame-burning-embers-yellow.webp", "system": { - "description": "

The @Lookup[@name] can only move within Very Close range as their normal movement. They light any flammable object they touch on fi re.

", + "description": "

The Ooze can only move within Very Close range as their normal movement. They light any flammable object they touch on fi re.

", "resource": null, "actions": {}, "originItemType": null, @@ -262,7 +261,7 @@ "type": "attack", "_id": "b4g8XUIKLhxDlUPy", "systemPath": "actions", - "description": "", + "description": "

Make an attack against a target within Very Close range. On a success, the target takes 1d8 magic damage and is Ignited until they’re extinguished with a successful Finesse Roll (14). While Ignited, the target takes 1d4 magic damage when they make an action roll.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -392,8 +391,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [ { @@ -451,14 +449,14 @@ "_id": "M9gAcPrgKfSg9Tjb", "img": "icons/creatures/slimes/slime-movement-splashing-red.webp", "system": { - "description": "

When the @Lookup[@name] has 3 or more HP marked, you can spend a Fear to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.1fkLQXVtmILqfJ44]{Tiny Red Oozes} (with no marked HP or Stress). Immediately spotlight both of them.

", + "description": "

When the Ooze has 3 or more HP marked, you can spend a Fear to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.1fkLQXVtmILqfJ44]{Tiny Red Oozes} (with no marked HP or Stress). Immediately spotlight both of them.

", "resource": null, "actions": { "dw6Juw8mriH7sg0e": { "type": "effect", "_id": "dw6Juw8mriH7sg0e", "systemPath": "actions", - "description": "", + "description": "

When the Ooze has 3 or more HP marked, you can spend a Fear to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.1fkLQXVtmILqfJ44]{Tiny Red Oozes} (with no marked HP or Stress). Immediately spotlight both of them.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -486,8 +484,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json b/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json index a9bf3a67..461846a2 100644 --- a/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json +++ b/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json @@ -104,8 +104,7 @@ "source": "Daggerheart SRD", "page": 83, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "gP3fWTLzSFnpA8EJ", @@ -216,7 +215,7 @@ "_id": "cwV1kNkNrrrHWEwX", "img": "icons/magic/symbols/runes-carved-stone-yellow.webp", "system": { - "description": "

The @Lookup[@name] is defeated when they take any damage. For every 3 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

", + "description": "

The Zombie is defeated when they take any damage. For every 3 damage a PC deals to the Zombie, defeat an additional Minion within range the attack would succeed against.

", "resource": null, "actions": {}, "originItemType": null, @@ -242,14 +241,14 @@ "_id": "R9vrwFNl5BD1YXJo", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", "system": { - "description": "

Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 2 physical damage each. Combine this damage.

", + "description": "

Spend a Fear to choose a target and spotlight all Rotted Zombies within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 2 physical damage each. Combine this damage.

", "resource": null, "actions": { "DJBNtd3hWjwsjPwq": { "type": "effect", "_id": "DJBNtd3hWjwsjPwq", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to choose a target and spotlight all Rotted Zombies within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 2 physical damage each. Combine this damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -277,8 +276,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json b/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json index 8593ec01..36c5a617 100644 --- a/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json +++ b/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json @@ -122,8 +122,7 @@ "source": "Daggerheart SRD", "page": 89, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "EtLJiTsilPPZvLUX", @@ -232,14 +231,14 @@ "name": "Devastating Retort", "type": "feature", "system": { - "description": "

A PC who rolls less than 17 on an action roll targeting the @Lookup[@name] must mark a Stress.

", + "description": "

A PC who rolls less than 17 on an action roll targeting the Advisor must mark a Stress.

", "resource": null, "actions": { "gtM7UPq6xHgJHPPp": { "type": "damage", "_id": "gtM7UPq6xHgJHPPp", "systemPath": "actions", - "description": "", + "description": "

A PC who rolls less than 17 on an action roll targeting the Advisor must mark a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -310,14 +309,14 @@ "name": "Bend Ears", "type": "feature", "system": { - "description": "

Mark a Stress to influence an NPC within Melee range with whispered words. That target’s opinion on one matter shifts toward the @Lookup[@name]’s preference unless it is in direct opposition to the target’s motives.

", + "description": "

Mark a Stress to influence an NPC within Melee range with whispered words. That target’s opinion on one matter shifts toward the Advisor’s preference unless it is in direct opposition to the target’s motives.

", "resource": null, "actions": { "JNFTnARlTAKermLx": { "type": "effect", "_id": "JNFTnARlTAKermLx", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to influence an NPC within Melee range with whispered words. That target’s opinion on one matter shifts toward the Advisor’s preference unless it is in direct opposition to the target’s motives.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -344,8 +343,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "lG6vMc0zUbijpvCM", "img": "icons/skills/social/diplomacy-handshake.webp", @@ -373,7 +371,7 @@ "type": "effect", "_id": "6oaHwUVWTmF362vI", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to convince a crowd or notable individual that one person or group is responsible for some problem facing the target. The target becomes hostile to the scapegoat until convinced of their innocence with a successful Presence Roll (17).

[[/dr trait=presence difficulty=17]]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -400,8 +398,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "iwNrNBbvm3RMgSw5", "img": "icons/skills/social/diplomacy-unity-alliance.webp", diff --git a/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json b/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json index 0c8757c5..113d8f73 100644 --- a/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json +++ b/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json @@ -122,8 +122,7 @@ "source": "Daggerheart SRD", "page": 89, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "sLAccjvCWfeedbpI", @@ -239,7 +238,7 @@ "type": "attack", "_id": "e6DmGF9vOv27BJ6f", "systemPath": "actions", - "description": "", + "description": "

Spend 2 Fear to spotlight 1d4 allies. Attacks they make while spotlighted in this way deal half damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -290,8 +289,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "WLnguxRo9egh2hfX", "img": "icons/skills/movement/arrows-up-trio-red.webp", @@ -319,7 +317,7 @@ "type": "healing", "_id": "MUdqLSRIpEEk1Ujc", "systemPath": "actions", - "description": "", + "description": "

When you spotlight an ally within Far range, mark a Stress to gain a Fear.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -391,8 +389,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "O5Nn1Slv8RJJpNeT", "img": "icons/magic/unholy/hand-claw-glow-orange.webp", @@ -413,7 +410,7 @@ "name": "Summoning Ritual", "type": "feature", "system": { - "description": "

Countdown (6). When the @Lookup[@name] is in the spotlight for the first time, activate the countdown. When they mark HP, tick down this countdown by the number of HP marked. When it triggers, summon a @UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demon} who appears at Close range.

", + "description": "

Countdown (6). When the Secret-Keeper is in the spotlight for the first time, activate the countdown. When they mark HP, tick down this countdown by the number of HP marked. When it triggers, summon a @UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demon} who appears at Close range.

", "resource": null, "actions": { "0rixG6jLRynAYNqA": { @@ -442,7 +439,7 @@ "type": "countdown", "_id": "ZVXHY2fpomoKV7jG", "systemPath": "actions", - "description": "

Countdown (6). When the @Lookup[@name] is in the spotlight for the first time, activate the countdown.

", + "description": "

Countdown (6). When the Secret-Keeper is in the spotlight for the first time, activate the countdown.

", "chatDisplay": true, "originItem": { "type": "itemCollection" @@ -477,8 +474,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "4L7aM9NDLbjvuwI3", "img": "icons/magic/unholy/silhouette-light-fire-blue.webp", @@ -499,14 +495,14 @@ "name": "Fallen Hounds", "type": "feature", "system": { - "description": "

Once per scene, when the @Lookup[@name] marks 2 or more HP, you can mark a Stress to summon a @UUID[Compendium.daggerheart.adversaries.Actor.NoRZ1PqB8N5wcIw0]{Demonic Hound Pack}, which appears at Close range and is immediately spotlighted.

", + "description": "

Once per scene, when the SecretKeeper marks 2 or more HP, you can mark a Stress to summon a @UUID[Compendium.daggerheart.adversaries.Actor.NoRZ1PqB8N5wcIw0]{Demonic Hound Pack}, which appears at Close range and is immediately spotlighted.

", "resource": null, "actions": { "JBuQUJhif2A7IlJd": { "type": "effect", "_id": "JBuQUJhif2A7IlJd", "systemPath": "actions", - "description": "", + "description": "

Once per scene, when the SecretKeeper marks 2 or more HP, you can mark a Stress to summon a @UUID[Compendium.daggerheart.adversaries.Actor.NoRZ1PqB8N5wcIw0]{Demonic Hound Pack}, which appears at Close range and is immediately spotlighted.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -533,8 +529,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "Q28NPuSMccjzykib", "img": "icons/creatures/unholy/demon-fire-horned-clawed.webp", diff --git a/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json b/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json index e26b48eb..8f490686 100644 --- a/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json +++ b/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json @@ -104,8 +104,7 @@ "source": "Daggerheart SRD", "page": 81, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "bgreCaQ6ap2DVpCr", @@ -216,7 +215,7 @@ "_id": "nLlbuGTKAvsFRnUB", "img": "icons/magic/symbols/runes-carved-stone-yellow.webp", "system": { - "description": "

The @Lookup[@name] is defeated when they take any damage. For every 4 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

", + "description": "

The Sellsword is defeated when they take any damage. For every 4 damage a PC deals to the Sellsword, defeat an additional Minion within range the attack would succeed against.

", "resource": null, "actions": {}, "originItemType": null, @@ -242,14 +241,14 @@ "_id": "CQZQiEiRH70Br5Ge", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", "system": { - "description": "

Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 3 physical damage each. Combine this damage.

", + "description": "

Spend a Fear to choose a target and spotlight all Sellswords within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 3 physical damage each. Combine this damage.

", "resource": null, "actions": { "ghgFZskDiizJDjcn": { "type": "effect", "_id": "ghgFZskDiizJDjcn", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to choose a target and spotlight all Sellswords within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 3 physical damage each. Combine this damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -277,8 +276,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Shambling_Zombie_2nXz4ilAY4xuhKLm.json b/src/packs/adversaries/adversary_Shambling_Zombie_2nXz4ilAY4xuhKLm.json index 7c3925ac..2e6d7fd2 100644 --- a/src/packs/adversaries/adversary_Shambling_Zombie_2nXz4ilAY4xuhKLm.json +++ b/src/packs/adversaries/adversary_Shambling_Zombie_2nXz4ilAY4xuhKLm.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 84, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "2nXz4ilAY4xuhKLm", @@ -223,7 +222,7 @@ "_id": "IpUWqXjwP2Lp5Zhs", "img": "icons/magic/death/undead-zombie-grave-green.webp", "system": { - "description": "

When the @Lookup[@name] is within Melee range of a creature and at least one other @Lookup[@name] is within Close range, all attacks against that creature have advantage.

", + "description": "

When the Zombie is within Melee range of a creature and at least one other Zombie is within Close range, all attacks against that creature have advantage.

", "resource": null, "actions": {}, "originItemType": null, @@ -249,14 +248,14 @@ "_id": "iiOjamlZIuhpDC8W", "img": "icons/magic/death/skull-energy-light-purple.webp", "system": { - "description": "

Targets who mark HP from the @Lookup[@name]’s attacks must also mark a Stress.

", + "description": "

Targets who mark HP from the Zombie’s attacks must also mark a Stress.

", "resource": null, "actions": { "JUw16Jag9uTfBmKZ": { "type": "damage", "_id": "JUw16Jag9uTfBmKZ", "systemPath": "actions", - "description": "", + "description": "

Targets who mark HP from the Zombie’s attacks must also mark a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json b/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json index e385a6c5..8729ac0a 100644 --- a/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json +++ b/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 90, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "YmVAkdNsyuXWTtYp", @@ -221,14 +220,14 @@ "name": "Terrifying", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

@Template[type:emanation|range:f]

", + "description": "

When the Shark makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

@Template[type:emanation|range:f]

", "resource": null, "actions": { "NoEb6qR3ktIu9kRJ": { "type": "damage", "_id": "NoEb6qR3ktIu9kRJ", "systemPath": "actions", - "description": "", + "description": "

When the Shark makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -299,14 +298,14 @@ "name": "Rending Bite", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack, the target must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

", + "description": "

When the Shark makes a successful attack, the target must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

", "resource": null, "actions": { "a0gC7uWycUB2NgKS": { "type": "attack", "_id": "a0gC7uWycUB2NgKS", "systemPath": "actions", - "description": "", + "description": "

When the Shark makes a successful attack, the target must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -423,14 +422,14 @@ "name": "Blood in the Water", "type": "feature", "system": { - "description": "

When a creature within Close range of the @Lookup[@name] marks HP from another creature’s attack, you can mark a Stress to immediately spotlight the @Lookup[@name], moving them into Melee range of the target and making a standard attack.

", + "description": "

When a creature within Close range of the Shark marks HP from another creature’s attack, you can mark a Stress to immediately spotlight the Shark, moving them into Melee range of the target and making a standard attack.

", "resource": null, "actions": { "sE9KRd9siZeYHPhb": { "type": "effect", "_id": "sE9KRd9siZeYHPhb", "systemPath": "actions", - "description": "", + "description": "

When a creature within Close range of the Shark marks HP from another creature’s attack, you can mark a Stress to immediately spotlight the Shark, moving them into Melee range of the target and making a standard attack.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -457,8 +456,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "LBKPfi8XktBAwbrt", "img": "icons/skills/wounds/blood-spurt-spray-red.webp", diff --git a/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json b/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json index a72c6d46..4e3f2aca 100644 --- a/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json +++ b/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 90, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "BK4jwyXSRx7IOQiO", @@ -227,14 +226,14 @@ "name": "Captive Audience", "type": "feature", "system": { - "description": "

If the @Lookup[@name] makes a standard attack against a target Entranced by their song, the attack deals 2d10+1 damage instead of their standard damage.

", + "description": "

If the Siren makes a standard attack against a target Entranced by their song, the attack deals 2d10+1 damage instead of their standard damage.

", "resource": null, "actions": { "FxWbdt0hRNv2k9Pm": { "type": "attack", "_id": "FxWbdt0hRNv2k9Pm", "systemPath": "actions", - "description": "", + "description": "

If the Siren makes a standard attack against a target Entranced by their song, the attack deals 2d10+1 damage instead of their standard damage.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -326,14 +325,14 @@ "name": "Enchanting Song", "type": "feature", "system": { - "description": "

Spend a Fear to sing a song that affects all targets within Close range. Targets must succeed on an Instinct Reaction Roll or become Entranced until they mark 2 Stress. Other @Lookup[@name]s within Close range of the target can mark a Stress to each add a +1 bonus to the Difficulty of the reaction roll. While Entranced, a target can’t act and is Vulnerable.

@Template[type:emanation|range:c]

", + "description": "

Spend a Fear to sing a song that affects all targets within Close range. Targets must succeed on an Instinct Reaction Roll or become Entranced until they mark 2 Stress. Other Sirens within Close range of the target can mark a Stress to each add a +1 bonus to the Difficulty of the reaction roll. While Entranced, a target can’t act and is Vulnerable.

@Template[type:emanation|range:c]

", "resource": null, "actions": { "FY8K8Nsg0TKAWok8": { "type": "attack", "_id": "FY8K8Nsg0TKAWok8", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to sing a song that affects all targets within Close range. Targets must succeed on an Instinct Reaction Roll or become Entranced until they mark 2 Stress. Other Sirens within Close range of the target can mark a Stress to each add a +1 bonus to the Difficulty of the reaction roll. While Entranced, a target can’t act and is Vulnerable.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -389,8 +388,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "Ks3HpB4W1l5FqR7p", "img": "icons/magic/control/hypnosis-mesmerism-eye.webp", diff --git a/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json b/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json index e5381f6f..aeb2dd0e 100644 --- a/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json +++ b/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 81, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "7X5q7a6ueeHs5oA9", @@ -223,7 +222,7 @@ "_id": "6mL2FQ9pQdfoDNzG", "img": "icons/skills/targeting/crosshair-triple-strike-orange.webp", "system": { - "description": "

When two or more adversaries are within Very Close range of a creature, all damage the @Lookup[@name] deals to that creature is doubled.

", + "description": "

When two or more adversaries are within Very Close range of a creature, all damage the Archer deals to that creature is doubled.

", "resource": null, "actions": {}, "originItemType": null, @@ -256,7 +255,7 @@ "type": "attack", "_id": "nKmxl3D7g4p7Zcub", "systemPath": "actions", - "description": "", + "description": "

Make an attack against a Vulnerable target within Far range. On a success, mark a Stress to deal 3d4+8 physical damage.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -328,8 +327,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json b/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json index 5a973b17..22d00f72 100644 --- a/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json +++ b/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json @@ -104,8 +104,7 @@ "source": "Daggerheart SRD", "page": 81, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "6l1a3Fazq8BoKIcc", @@ -216,7 +215,7 @@ "_id": "g9GQ9cMPNETxKXOz", "img": "icons/magic/symbols/runes-carved-stone-yellow.webp", "system": { - "description": "

The @Lookup[@name] is defeated when they take any damage. For every 4 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

", + "description": "

The Dredge is defeated when they take any damage. For every 4 damage a PC deals to the Dredge, defeat an additional Minion within range the attack would succeed against.

", "resource": null, "actions": {}, "originItemType": null, @@ -242,14 +241,14 @@ "_id": "wl9KKEpVWDBu62hU", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", "system": { - "description": "

Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 1 physical damage each. Combine this damage.

", + "description": "

Spend a Fear to choose a target and spotlight all Dredges within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 1 physical damage each. Combine this damage.

", "resource": null, "actions": { "Sz55uB8xkoNytLwJ": { "type": "effect", "_id": "Sz55uB8xkoNytLwJ", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to choose a target and spotlight all Dredges within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 1 physical damage each. Combine this damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -277,8 +276,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json b/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json index 3c26dd28..c16d878b 100644 --- a/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json +++ b/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 82, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "Q9LaVTyXF9NF12C7", @@ -223,14 +222,14 @@ "_id": "OZKEz4eK9h7zCbuf", "img": "icons/magic/death/skull-energy-light-purple.webp", "system": { - "description": "

When the @Lookup[@name] makes a successful attack, all PCs within Close range lose a Hope and you gain a Fear.

", + "description": "

When the Knight makes a successful attack, all PCs within Close range lose a Hope and you gain a Fear.

", "resource": null, "actions": { "9EiPNrGzwLtuf9g0": { "type": "damage", "_id": "9EiPNrGzwLtuf9g0", "systemPath": "actions", - "description": "", + "description": "

When the Knight makes a successful attack, all PCs within Close range lose a Hope and you gain a Fear.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -302,14 +301,14 @@ "_id": "WdVLwy9RNkVlZnCL", "img": "icons/skills/melee/strike-sword-steel-yellow.webp", "system": { - "description": "

Mark a Stress to make an attack against all targets within Very Close range. Targets the @Lookup[@name] succeeds against take 1d8+2 physical damage and must mark a Stress.

@Template[type:emanation|range:vc]

", + "description": "

Mark a Stress to make an attack against all targets within Very Close range. Targets the Knight succeeds against take 1d8+2 physical damage and must mark a Stress.

@Template[type:emanation|range:vc]

", "resource": null, "actions": { "vMv4monku9LOSxUZ": { "type": "attack", "_id": "vMv4monku9LOSxUZ", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to make an attack against all targets within Very Close range. Targets the Knight succeeds against take 1d8+2 physical damage and must mark a Stress.

@Template[type:emanation|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -413,8 +412,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -435,14 +433,14 @@ "_id": "STesKV2KB61PlwCh", "img": "icons/magic/death/hand-undead-skeleton-fire-pink.webp", "system": { - "description": "

When the @Lookup[@name] is defeated, they make an attack against a target within Very Close range (prioritizing the creature who killed them). On a success, the target takes 1d4+8 physical damage and loses 1d4 Hope.

", + "description": "

When the Knight is defeated, they make an attack against a target within Very Close range (prioritizing the creature who killed them). On a success, the target takes 1d4+8 physical damage and loses 1d4 Hope.

", "resource": null, "actions": { "NtGhAVVOJF6ZGBRv": { "type": "attack", "_id": "NtGhAVVOJF6ZGBRv", "systemPath": "actions", - "description": "", + "description": "

When the Knight is defeated, they make an attack against a target within Very Close range (prioritizing the creature who killed them). On a success, the target takes 1d4+8 physical damage and loses 1d4 Hope.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -514,8 +512,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json b/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json index 28003d5c..1a1ca906 100644 --- a/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json +++ b/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 82, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "10YIQl0lvCJXZLfX", @@ -223,7 +222,7 @@ "_id": "ouvJweENF1kLYcOT", "img": "icons/magic/death/bones-crossed-orange.webp", "system": { - "description": "

The @Lookup[@name] is resistant to physical damage.

", + "description": "

The Warrior is resistant to physical damage.

", "resource": null, "actions": {}, "originItemType": null, @@ -293,7 +292,7 @@ "_id": "hYl31ThCmZdc0MFa", "img": "icons/magic/death/hand-dirt-undead-zombie.webp", "system": { - "description": "

When the @Lookup[@name] is defeated, you can spotlight them and roll a d6. On a result of 6, if there are other adversaries on the battlefield, the @Lookup[@name] re-forms with no marked HP.

", + "description": "

When the Warrior is defeated, you can spotlight them and roll a d6. On a result of 6, if there are other adversaries on the battlefi eld, the Warrior re-forms with no marked HP.

", "resource": null, "actions": { "QnuFrptj8oARaA3i": { @@ -345,8 +344,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json b/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json index e6cc30f7..9832d7ce 100644 --- a/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json +++ b/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 90, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "5tCkhnBByUIN5UdG", @@ -227,7 +226,7 @@ "name": "Ghost", "type": "feature", "system": { - "description": "

The @Lookup[@name] has resistance to physical damage. Mark a Stress to move up to Close range through solid objects.

", + "description": "

The Archer has resistance to physical damage. Mark a Stress to move up to Close range through solid objects.

", "resource": null, "actions": { "kkKfo1gwetxB3tFQ": { @@ -333,7 +332,7 @@ "type": "attack", "_id": "KahJnM94QQfy6oMK", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to make an attack within Far range against a PC who is within Very Close range of at least two other PCs. On a success, the target takes 2d8+12 physical damage.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -404,8 +403,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "0h4IVmCgWXyQngAw", "img": "icons/skills/targeting/crosshair-triple-strike-orange.webp", diff --git a/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json b/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json index b70a5d53..3cb0a37c 100644 --- a/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json +++ b/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 90, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "65cSO3EQEh6ZH6Xk", @@ -227,7 +226,7 @@ "name": "Ghost", "type": "feature", "system": { - "description": "

The @Lookup[@name] has resistance to physical damage. Mark a Stress to move up to Close range through solid objects.

", + "description": "

The Captain has resistance to physical damage. Mark a Stress to move up to Close range through solid objects.

", "resource": null, "actions": { "k7RuXErgCsEBmhmk": { @@ -333,7 +332,7 @@ "type": "effect", "_id": "eHmbN4aPLUuEoDQt", "systemPath": "actions", - "description": "", + "description": "

Spend 2 Fear to return up to [[/r 1d4+1]] defeated Spectral allies to the battle at the points where they first appeared (with no marked HP or Stress).

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -360,8 +359,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "7YVe4DfEWMNLXNvu", "img": "icons/magic/death/undead-skeleton-worn-blue.webp", @@ -382,14 +380,14 @@ "name": "Hold Fast", "type": "feature", "system": { - "description": "

When the @Lookup[@name]’s Spectral allies are forced to make a reaction roll, you can mark a Stress to give those allies a +2 bonus to the roll.

", + "description": "

When the Captain’s Spectral allies are forced to make a reaction roll, you can mark a Stress to give those allies a +2 bonus to the roll.

", "resource": null, "actions": { "aRg1bcPGUn69GPyB": { "type": "effect", "_id": "aRg1bcPGUn69GPyB", "systemPath": "actions", - "description": "", + "description": "

When the Captain’s Spectral allies are forced to make a reaction roll, you can mark a Stress to give those allies a +2 bonus to the roll.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -416,8 +414,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "X0vtV30ACVVZ6NfF", "img": "icons/magic/defensive/shield-barrier-flaming-diamond-teal.webp", @@ -438,14 +435,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Captain makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "tZKpqKdehnPxRsOc": { "type": "healing", "_id": "tZKpqKdehnPxRsOc", "systemPath": "actions", - "description": "", + "description": "

When the Captain makes a successful attack against a PC, you gain a Fear.

", "chatDisplay": true, "actionType": "reaction", "cost": [], @@ -512,8 +509,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "b9wn9oVMne8E1OYx", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json b/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json index 577a7d25..04062b0d 100644 --- a/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json +++ b/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 90, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "UFVGl1osOsJTneLf", @@ -227,7 +226,7 @@ "name": "Ghost", "type": "feature", "system": { - "description": "

The @Lookup[@name] has resistance to physical damage. Mark a Stress to move up to Close range through solid objects.

", + "description": "

The Guardian has resistance to physical damage. Mark a Stress to move up to Close range through solid objects.

", "resource": null, "actions": { "X1JlwWqyYHjahbpA": { @@ -333,7 +332,7 @@ "type": "attack", "_id": "AdfULyYsj9YPcCj6", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to make an attack against a target within Very Close range. On a success, deal 2d10+6 physical damage and the target must mark a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -436,8 +435,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "L48tQmj5O3s2pjBn", "img": "icons/weapons/swords/sword-flanged-lightning.webp", diff --git a/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json b/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json index 13d6ed84..f096aeef 100644 --- a/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json +++ b/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json @@ -118,8 +118,7 @@ "source": "Daggerheart SRD", "page": 82, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "ldbWEL7uZs84vyrR", @@ -230,7 +229,7 @@ "_id": "BwuoAv3EWT0m1apk", "img": "icons/weapons/swords/sword-runed-glowing.webp", "system": { - "description": "

Damage dealt by the @Lookup[@name]’s standard attack is considered both physical and magic.

", + "description": "

Damage dealt by the Spellblade’s standard attack is considered both physical and magic.

", "resource": null, "actions": {}, "originItemType": null, @@ -263,7 +262,7 @@ "type": "attack", "_id": "K4VnxigKTiu7hhZx", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress and target a group within Far range. All targets must succeed on an Agility Reaction Roll or take 1d8+2 magic damage. You gain a Fear for each target who marked HP from this attack.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -342,8 +341,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -364,14 +362,14 @@ "_id": "piyJhdHzztabmZ8I", "img": "icons/skills/movement/arrows-up-trio-red.webp", "system": { - "description": "

Spend 2 Fear to spotlight up to five allies within Far range.

", + "description": "

Spend 2 Fear to spotlight up to fi ve allies within Far range.

", "resource": null, "actions": { "N42NPEu7fcVDXEvl": { "type": "effect", "_id": "N42NPEu7fcVDXEvl", "systemPath": "actions", - "description": "", + "description": "

Spend 2 Fear to spotlight up to fi ve allies within Far range.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -399,8 +397,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -421,14 +418,14 @@ "_id": "P9nD5K2ztkZGo2I8", "img": "icons/skills/melee/strike-weapons-orange.webp", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Spellblade makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "f4AulN6MeMaEvqbk": { "type": "healing", "_id": "f4AulN6MeMaEvqbk", "systemPath": "actions", - "description": "", + "description": "

When the Spellblade makes a successful attack against a PC, you gain a Fear.

", "chatDisplay": true, "actionType": "reaction", "cost": [], @@ -496,8 +493,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json b/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json index 5affdc44..88f8eb5b 100644 --- a/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json +++ b/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 90, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "8zlynOhnVA59KpKT", @@ -227,14 +226,14 @@ "name": "Gathering Secrets", "type": "feature", "system": { - "description": "

Spend a Fear to describe how the @Lookup[@name] knows a secret about a PC in the scene.

", + "description": "

Spend a Fear to describe how the Spy knows a secret about a PC in the scene.

", "resource": null, "actions": { "iq5KzP5hgA4377fO": { "type": "effect", "_id": "iq5KzP5hgA4377fO", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to describe how the Spy knows a secret about a PC in the scene.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -261,8 +260,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "csCWQuSqic5ckHeO", "img": "icons/magic/perception/orb-eye-scrying.webp", @@ -283,14 +281,14 @@ "name": "Fly on the Wall", "type": "feature", "system": { - "description": "

When a PC or group is discussing something sensitive, you can mark a Stress to reveal that the @Lookup[@name] is present in the scene, observing them. If the @Lookup[@name] escapes the scene to report their findings, you gain 1d4 Fear.

", + "description": "

When a PC or group is discussing something sensitive, you can mark a Stress to reveal that the Spy is present in the scene, observing them. If the Spy escapes the scene to report their findings, you gain 1d4 Fear.

", "resource": null, "actions": { "Ml8nt7SPNFc2iQno": { "type": "effect", "_id": "Ml8nt7SPNFc2iQno", "systemPath": "actions", - "description": "", + "description": "

When a PC or group is discussing something sensitive, you can mark a Stress to reveal that the Spy is present in the scene, observing them. If the Spy escapes the scene to report their findings, you gain 1d4 Fear.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -319,7 +317,7 @@ "type": "healing", "_id": "qCA2hTMIYGW0FhGy", "systemPath": "actions", - "description": "

If the @Lookup[@name] escapes the scene to report their findings, you gain 1d4 Fear.

", + "description": "

If the Spy escapes the scene to report their findings, you gain 1d4 Fear.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -383,8 +381,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "UvgVDn0YjISLdKE4", "img": "icons/magic/perception/silhouette-stealth-shadow.webp", diff --git a/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json b/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json index 603182cc..0f6fbc5f 100644 --- a/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json +++ b/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 94, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "KGVwnLq85ywP9xvB", @@ -227,14 +226,14 @@ "name": "From Above", "type": "feature", "system": { - "description": "

When the @Lookup[@name] succeeds on a standard attack from above a target, they deal 3d12+3 physical damage instead of their standard damage.

", + "description": "

When the Knight succeeds on a standard attack from above a target, they deal 3d12+3 physical damage instead of their standard damage.

", "resource": null, "actions": { "PZNJgyomR7MK2xUP": { "type": "damage", "_id": "PZNJgyomR7MK2xUP", "systemPath": "actions", - "description": "", + "description": "

When the Knight succeeds on a standard attack from above a target, they deal 3d12+3 physical damage instead of their standard damage.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -306,14 +305,14 @@ "name": "Blade of the Forest", "type": "feature", "system": { - "description": "

Spend a Fear to make an attack against all targets within Very Close range. Targets the @Lookup[@name] succeeds against take physical damage equal to [[/r 3d4]] + the target’s Major threshold.

@Template[type:emanation|range:vc]

", + "description": "

Spend a Fear to make an attack against all targets within Very Close range. Targets the Knight succeeds against take physical damage equal to [[/r 3d4]] + the target’s Major threshold.

@Template[type:emanation|range:vc]

", "resource": null, "actions": { "xPSVwVVOC5gc2KTi": { "type": "attack", "_id": "xPSVwVVOC5gc2KTi", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to make an attack against all targets within Very Close range. Targets the Knight succeeds against take physical damage equal to [[/r 3d4]] + the target’s Major threshold.

@Template[type:emanation|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -364,8 +363,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "CYaSykD9BUxpiOxg", "img": "icons/skills/melee/strike-blade-hooked-green-purple.webp", @@ -386,14 +384,14 @@ "name": "Thorny Armor", "type": "feature", "system": { - "description": "

When the @Lookup[@name] takes damage from an attack within Melee range, you can mark a Stress to deal 1d10+5 physical damage to the attacker.

", + "description": "

When the Knight takes damage from an attack within Melee range, you can mark a Stress to deal 1d10+5 physical damage to the attacker.

", "resource": null, "actions": { "b5KO7xpWspZS0swK": { "type": "damage", "_id": "b5KO7xpWspZS0swK", "systemPath": "actions", - "description": "", + "description": "

When the Knight takes damage from an attack within Melee range, you can mark a Stress to deal 1d10+5 physical damage to the attacker.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -449,8 +447,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "1LHHdn4ToSwSznuP", "img": "icons/magic/nature/root-vine-barrier-wall-brown.webp", diff --git a/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json b/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json index de3ef9f2..6572d058 100644 --- a/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json +++ b/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 91, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "3aAS2Qm3R6cgaYfE", @@ -227,7 +226,7 @@ "name": "Stonestrider", "type": "feature", "system": { - "description": "

The @Lookup[@name] can move through stone and earth as easily as air. While within stone or earth, they are Hidden and immune to all damage.

", + "description": "

The Stonewraith can move through stone and earth as easily as air. While within stone or earth, they are Hidden and immune to all damage.

", "resource": null, "actions": {}, "originItemType": null, @@ -259,7 +258,7 @@ "type": "attack", "_id": "E8C2Nd4mwcGTXoXb", "systemPath": "actions", - "description": "", + "description": "

While Hidden, mark a Stress to leap into Melee range with a target within Very Close range. The target must succeed on an Agility or Instinct Reaction Roll (15) or take 2d8 physical damage and become temporarily Restrained.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -340,8 +339,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "tQgxiSS48TJ3X1Dl", "img": "icons/creatures/abilities/mouth-teeth-rows-white.webp", @@ -408,7 +406,7 @@ "type": "attack", "_id": "4UGEEuK9XY8leCBV", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to roar while within a cave and cause a cave-in. All targets within Close range must succeed on an Agility Reaction Roll (14) or take 2d10 physical damage. The rubble can be cleared with a Progress Countdown (8).

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -523,8 +521,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "9Z0i0uURfBMVIapJ", "img": "icons/magic/sonic/projectile-sound-rings-wave.webp", @@ -545,14 +542,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Stonewraith makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "IIZPctjF4MJkWs4b": { "type": "healing", "_id": "IIZPctjF4MJkWs4b", "systemPath": "actions", - "description": "", + "description": "

When the Stonewraith makes a successful attack against a PC, you gain a Fear.

", "chatDisplay": true, "actionType": "reaction", "cost": [], @@ -619,8 +616,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "faM1UzclP0X3ZrkJ", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json b/src/packs/adversaries/adversary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json index 33fe06d7..1db0df10 100644 --- a/src/packs/adversaries/adversary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json +++ b/src/packs/adversaries/adversary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 82, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "qNgs3AbLyJrY19nt", @@ -223,7 +222,7 @@ "_id": "9Zuu892SO5NmtI4w", "img": "icons/creatures/magical/humanoid-silhouette-aliens-green.webp", "system": { - "description": "

When the @Lookup[@name] has marked half or more of their HP, their standard attack deals 1d4+1 physical damage instead.

", + "description": "

When the Swarm has marked half or more of their HP, their standard attack deals 1d4+1 physical damage instead.

", "resource": null, "actions": {}, "originItemType": null, @@ -249,7 +248,7 @@ "_id": "0O6ckwZE34RBnjpB", "img": "icons/creatures/mammals/rodent-rat-green.webp", "system": { - "description": "

All targets within Melee range have disadvantage on attacks against targets other than the @Lookup[@name].

", + "description": "

All targets within Melee range have disadvantage on attacks against targets other than the Swarm.

", "resource": null, "actions": {}, "originItemType": null, diff --git a/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json b/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json index 2ec5e924..bcaf166a 100644 --- a/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json +++ b/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 82, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "VtFBt9XBE0WrGGxP", @@ -229,14 +228,14 @@ "_id": "uo5DbPuQQ018Pyfd", "img": "icons/creatures/abilities/wolf-howl-moon-purple.webp", "system": { - "description": "

If the @Lookup[@name] makes a standard attack and another @Lookup[@name] is within Melee range of the target, deal 1d8+5 physical damage instead of their standard damage.

", + "description": "

If the Soldier makes a standard attack and another Sylvan Soldier is within Melee range of the target, deal 1d8+5 physical damage instead of their standard damage.

", "resource": null, "actions": { "dmlz83o2JOAoGiuK": { "type": "attack", "_id": "dmlz83o2JOAoGiuK", "systemPath": "actions", - "description": "", + "description": "

If the Soldier makes a standard attack and another Sylvan Soldier is within Melee range of the target, deal 1d8+5 physical damage instead of their standard damage.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -336,7 +335,7 @@ "type": "attack", "_id": "UyL02IaAO3m8LgWI", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to pull down a tree within Close range. A creature hit by the tree must succeed on an Agility Reaction Roll (15) or take 1d10 physical damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -415,8 +414,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -437,14 +435,14 @@ "_id": "1dmKoSnV82sLc8xZ", "img": "icons/magic/nature/root-vine-leaves-green.webp", "system": { - "description": "

When the @Lookup[@name] makes a successful attack, you can mark a Stress to become Hidden until the @Lookup[@name]’s next attack or a PC succeeds on an Instinct Roll (14) to find them.

", + "description": "

When the Soldier makes a successful attack, you can mark a Stress to become Hidden until the Soldier’s next attack or a PC succeeds on an Instinct Roll (14) to find them.

", "resource": null, "actions": { "l32BjO9J0jFvD0Zy": { "type": "effect", "_id": "l32BjO9J0jFvD0Zy", "systemPath": "actions", - "description": "", + "description": "

When the Soldier makes a successful attack, you can mark a Stress to become Hidden until the Soldier’s next attack or a PC succeeds on an Instinct Roll (14) to find them.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -477,8 +475,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [ { diff --git a/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json b/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json index 639fa956..d5f30dda 100644 --- a/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json +++ b/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json @@ -148,8 +148,7 @@ "source": "Daggerheart SRD", "page": 82, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "ownership": { @@ -259,7 +258,7 @@ "_id": "4dSzqtYvH385r9Ng", "img": "icons/creatures/magical/humanoid-silhouette-aliens-green.webp", "system": { - "description": "

When the @Lookup[@name] has marked half or more of their HP, their standard attack deals 1d4+2 physical damage instead.

", + "description": "

When the Swarm has marked half or more of their HP, their standard attack deals 1d4+2 physical damage instead.

", "resource": null, "actions": {}, "originItemType": null, @@ -292,7 +291,7 @@ "type": "damage", "_id": "CiA4K6py0eW6eihU", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to deal 2d6+8 direct physical damage to a target with 3 or more bramble tokens.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -313,10 +312,9 @@ { "value": { "custom": { - "enabled": false, - "formula": "" + "enabled": false }, - "flatMultiplier": 2, + "flatMultiplier": 1, "dice": "d6", "bonus": 8, "multiplier": "flat" @@ -333,14 +331,12 @@ "dice": "d6", "bonus": null, "custom": { - "enabled": false, - "formula": "" + "enabled": false } } } ], - "includeBase": false, - "direct": true + "includeBase": false }, "target": { "type": "any", @@ -354,8 +350,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -376,14 +371,14 @@ "_id": "JRSGc3ozDnKCAvCj", "img": "icons/magic/nature/root-vine-entangled-hands.webp", "system": { - "description": "

When the @Lookup[@name] succeeds on an attack, give the target a bramble token. If a target has any bramble tokens, they are Restrained. If a target has 3 or more bramble tokens, they are also Vulnerable. All bramble tokens can be removed by succeeding on a Finesse Roll (12 + the number of bramble tokens) or dealing Major or greater damage to the Swarm. If bramble tokens are removed from a target using a Finesse Roll, a number of @Lookup[@name] Minions spawn within Melee range equal to the number of tokens removed.

", + "description": "

When the Swarm succeeds on an attack, give the target a bramble token. If a target has any bramble tokens, they are Restrained. If a target has 3 or more bramble tokens, they are also Vulnerable. All bramble tokens can be removed by succeeding on a Finesse Roll (12 + the number of bramble tokens) or dealing Major or greater damage to the Swarm. If bramble tokens are removed from a target using a Finesse Roll, a number of Tangle Bramble Minions spawn within Melee range equal to the number of tokens removed.

", "resource": null, "actions": { "Cdw2XxA5NhAQhQse": { "type": "effect", "_id": "Cdw2XxA5NhAQhQse", "systemPath": "actions", - "description": "", + "description": "

When the Swarm succeeds on an attack, give the target a bramble token. If a target has any bramble tokens, they are Restrained. If a target has 3 or more bramble tokens, they are also Vulnerable. All bramble tokens can be removed by succeeding on a Finesse Roll (12 + the number of bramble tokens) or dealing Major or greater damage to the Swarm. If bramble tokens are removed from a target using a Finesse Roll, a number of Tangle Bramble Minions spawn within Melee range equal to the number of tokens removed.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -409,8 +404,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [ { diff --git a/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json b/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json index a6e5ca17..8b984fc1 100644 --- a/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json +++ b/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json @@ -144,8 +144,7 @@ "source": "Daggerheart SRD", "page": 83, "artist": "" - }, - "size": "tiny" + } }, "flags": {}, "ownership": { @@ -255,7 +254,7 @@ "_id": "jH1VMpj4dCUhKVCJ", "img": "icons/magic/symbols/runes-carved-stone-yellow.webp", "system": { - "description": "

The @Lookup[@name] is defeated when they take any damage. For every 4 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

", + "description": "

The Bramble is defeated when they take any damage. For every 4 damage a PC deals to the Tangle Bramble, defeat an additional Minion within range the attack would succeed against.

", "resource": null, "actions": {}, "originItemType": null, @@ -281,14 +280,14 @@ "_id": "WiobzuyvJ46zfsOv", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", "system": { - "description": "

Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 2 physical damage each. Combine this damage.

", + "description": "

Spend a Fear to choose a target and spotlight all Tangle Brambles within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 2 physical damage each. Combine this damage.

", "resource": null, "actions": { "ZC5pKIb9N82vgMWu": { "type": "effect", "_id": "ZC5pKIb9N82vgMWu", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to choose a target and spotlight all Tangle Brambles within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 2 physical damage each. Combine this damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -316,8 +315,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -338,13 +336,12 @@ "_id": "KBMf7oBfFSHoafKN", "img": "icons/magic/nature/root-vines-knot-brown.webp", "system": { - "description": "

When an attack from the @Lookup[@name] causes a target to mark HP and there are three or more @Lookup[@name] Minions within Close range, you can combine the Minions into a @UUID[Compendium.daggerheart.adversaries.Actor.PKSXFuaIHUCoH63A]{Tangle Bramble Swarm Horde}. The Horde’s HP is equal to the number of Minions combined.

", + "description": "

When an attack from the Bramble causes a target to mark HP and there are three or more Tangle Bramble Minions within Close range, you can combine the Minions into a @UUID[Compendium.daggerheart.adversaries.Actor.PKSXFuaIHUCoH63A]{Tangle Bramble Swarm Horde}. The Horde’s HP is equal to the number of Minions combined.

", "resource": null, "actions": {}, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Tiny_Green_Ooze_aLkLFuVoKz2NLoBK.json b/src/packs/adversaries/adversary_Tiny_Green_Ooze_aLkLFuVoKz2NLoBK.json index 6a984b3c..8864c47c 100644 --- a/src/packs/adversaries/adversary_Tiny_Green_Ooze_aLkLFuVoKz2NLoBK.json +++ b/src/packs/adversaries/adversary_Tiny_Green_Ooze_aLkLFuVoKz2NLoBK.json @@ -107,8 +107,7 @@ "source": "Daggerheart SRD", "page": 80, "artist": "" - }, - "size": "tiny" + } }, "flags": {}, "_id": "aLkLFuVoKz2NLoBK", @@ -219,14 +218,14 @@ "_id": "WpOh5kHHx7lcTvEY", "img": "icons/magic/acid/dissolve-drip-droplet-smoke.webp", "system": { - "description": "

When the @Lookup[@name] makes a successful attack, the target must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

", + "description": "

When the Ooze makes a successful attack, the target must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

", "resource": null, "actions": { "HfK0u0c7NRppuF1Q": { "type": "damage", "_id": "HfK0u0c7NRppuF1Q", "systemPath": "actions", - "description": "", + "description": "

When the Ooze makes a successful attack, the target must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json b/src/packs/adversaries/adversary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json index 116fffba..f3ea25ff 100644 --- a/src/packs/adversaries/adversary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json +++ b/src/packs/adversaries/adversary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json @@ -107,8 +107,7 @@ "source": "Daggerheart SRD", "page": 80, "artist": "" - }, - "size": "tiny" + } }, "flags": {}, "_id": "1fkLQXVtmILqfJ44", @@ -219,7 +218,7 @@ "_id": "zsUMP2qNmNpVHwk0", "img": "icons/magic/fire/blast-jet-stream-splash.webp", "system": { - "description": "

When a creature within Melee range deals damage to the @Lookup[@name], they take 1d6 direct magic damage.

", + "description": "

When a creature within Melee range deals damage to the Ooze, they take 1d6 direct magic damage.

", "resource": null, "actions": { "cHaEnBwinVKmoS9s": { @@ -278,8 +277,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json b/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json index 8959f78a..e4e5f6f7 100644 --- a/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json +++ b/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json @@ -97,15 +97,13 @@ ] }, "type": "attack", - "chatDisplay": false, - "range": "" + "chatDisplay": false }, "attribution": { "source": "Daggerheart SRD", "page": 95, "artist": "" - }, - "size": "small" + } }, "flags": {}, "_id": "o63nS0k3wHu6EgKP", @@ -214,7 +212,7 @@ "name": "Minion (6)", "type": "feature", "system": { - "description": "

The @Lookup[@name] is defeated when they take any damage. For every 6 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

", + "description": "

The Sapling is defeated when they take any damage. For every 6 damage a PC deals to the Sapling, defeat an additional Minion within range the attack would succeed against.

", "resource": null, "actions": {}, "originItemType": null, @@ -239,7 +237,7 @@ "name": "Group Attack", "type": "feature", "system": { - "description": "

Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 8 physical damage each. Combine this damage.

", + "description": "

Spend a Fear to choose a target and spotlight all Treant Saplings within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 8 physical damage each. Combine this damage.

", "resource": null, "actions": { "euP8VA4wvfsCpwN1": { @@ -273,8 +271,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "fh8ehANkVOnxEKVa", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", diff --git a/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json b/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json index 4f51cd79..f2522a90 100644 --- a/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json +++ b/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 95, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "WWyUp6Mxl1S3KYUG", @@ -227,14 +226,14 @@ "name": "Draining Bite", "type": "feature", "system": { - "description": "

Make an attack against a target within Melee range. On a success, deal 5d4 physical damage. A target who marks HP from this attack loses a Hope and must mark a Stress. The @Lookup[@name] then clears a HP.

", + "description": "

Make an attack against a target within Melee range. On a success, deal 5d4 physical damage. A target who marks HP from this attack loses a Hope and must mark a Stress. The Vampire then clears a HP.

", "resource": null, "actions": { "GxJ7oxrrFp7VsybV": { "type": "attack", "_id": "GxJ7oxrrFp7VsybV", "systemPath": "actions", - "description": "", + "description": "

Make an attack against a target within Melee range. On a success, deal 5d4 physical damage. A target who marks HP from this attack loses a Hope and must mark a Stress. The Vampire then clears a HP.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -353,8 +352,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "X0VgwJbK2n3mez0p", "img": "icons/creatures/abilities/fang-tooth-blood-red.webp", @@ -375,14 +373,14 @@ "name": "Mistform", "type": "feature", "system": { - "description": "

When the @Lookup[@name] takes physical damage, you can spend a Fear to take half damage.

", + "description": "

When the Vampire takes physical damage, you can spend a Fear to take half damage.

", "resource": null, "actions": { "TDu6DplfPluwInhi": { "type": "effect", "_id": "TDu6DplfPluwInhi", "systemPath": "actions", - "description": "", + "description": "

When the Vampire takes physical damage, you can spend a Fear to take half damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -409,8 +407,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "DKVB4rbX2M1CCVM7", "img": "icons/magic/air/fog-gas-smoke-blue-gray.webp", diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json b/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json index d1cca592..38cddad7 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 95, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "JqYraOqNmmhHk4Yy", @@ -221,7 +220,7 @@ "name": "Blocking Shield", "type": "feature", "system": { - "description": "

Creatures within Melee range of the @Lookup[@name] have disadvantage on attack rolls against them. Creatures trapped inside the @Lookup[@name] are immune to this feature.

", + "description": "

Creatures within Melee range of the Gaoler have disadvantage on attack rolls against them. Creatures trapped inside the Gaoler are immune to this feature.

", "resource": null, "actions": {}, "originItemType": null, @@ -246,14 +245,14 @@ "name": "Lock Up", "type": "feature", "system": { - "description": "

Mark a Stress to make an attack against a target within Very Close range. On a success, the target is Restrained within the @Lookup[@name] until freed with a successful Strength Roll (18). While Restrained, the target can only attack the @Lookup[@name].

", + "description": "

Mark a Stress to make an attack against a target within Very Close range. On a success, the target is Restrained within the Gaoler until freed with a successful Strength Roll (18). While Restrained, the target can only attack the Gaoler.

", "resource": null, "actions": { "NawX2Kuk4GXI5loW": { "type": "attack", "_id": "NawX2Kuk4GXI5loW", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to make an attack against a target within Very Close range. On a success, the target is Restrained within the Gaoler until freed with a successful Strength Roll (18). While Restrained, the target can only attack the Gaoler.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -309,8 +308,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "VlHp8RjHy7MK8rqC", "img": "icons/environment/traps/cage-grey-steel.webp", diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json b/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json index 67139669..10e023c1 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 96, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "FVgYb28fhxlVcGwA", @@ -221,7 +220,7 @@ "name": "Kinetic Slam", "type": "feature", "system": { - "description": "

Targets who take damage from the @Lookup[@name]’s standard attack are knocked back to Very Close range.

", + "description": "

Targets who take damage from the Sentinel’s standard attack are knocked back to Very Close range.

", "resource": null, "actions": {}, "originItemType": null, @@ -246,14 +245,14 @@ "name": "Box In", "type": "feature", "system": { - "description": "

Mark a Stress to choose a target within Very Close range to focus on. That target has disadvantage on attack rolls when they’re within Very Close range of the @Lookup[@name]. The @Lookup[@name]Sentinel can only focus on one target at a time.

", + "description": "

Mark a Stress to choose a target within Very Close range to focus on. That target has disadvantage on attack rolls when they’re within Very Close range of the Sentinel. The Sentinel can only focus on one target at a time.

", "resource": null, "actions": { "4RQnBu4kcUs3PcPH": { "type": "effect", "_id": "4RQnBu4kcUs3PcPH", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to choose a target within Very Close range to focus on. That target has disadvantage on attack rolls when they’re within Very Close range of the Sentinel. The Sentinel can only focus on one target at a time.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -285,8 +284,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "DLspoIclNJcTB3YJ", "img": "icons/magic/perception/eye-ringed-glow-angry-red.webp", @@ -358,7 +356,7 @@ "type": "attack", "_id": "mI9i9iwrM48NjzeE", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to lob explosive magic at a point within Far range. All targets within Very Close range of that point must make an Agility Reaction Roll. Targets who fail take 2d8+20 magic damage and are knocked back to Close range. Targets who succeed take half damage and aren’t knocked back.

@Template[type:circle|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -436,8 +434,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "LVFZ4AfVhS6Q9hRy", "img": "icons/magic/sonic/projectile-shock-wave-blue.webp", @@ -458,14 +455,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Sentinel makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "AtXg38fItOgiYUee": { "type": "healing", "_id": "AtXg38fItOgiYUee", "systemPath": "actions", - "description": "", + "description": "

When the Sentinel makes a successful attack against a PC, you gain a Fear.

", "chatDisplay": true, "actionType": "reaction", "cost": [], @@ -532,8 +529,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "N4446BxubUanUQHH", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json b/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json index ab683607..6b4671ea 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 96, "artist": "" - }, - "size": "large" + } }, "flags": {}, "_id": "c5hGdvY5UnSjlHws", @@ -221,7 +220,7 @@ "name": "Slow Firing", "type": "feature", "system": { - "description": "

When you spotlight the @Lookup[@name] and they don’t have a token on their stat block, they can’t make a standard attack. Place a token on their stat block and describe what they’re preparing to do. When you spotlight the @Lookup[@name] and they have a token on their stat block, clear the token and they can attack.

", + "description": "

When you spotlight the Turret and they don’t have a token on their stat block, they can’t make a standard attack. Place a token on their stat block and describe what they’re preparing to do. When you spotlight the Turret and they have a token on their stat block, clear the token and they can attack.

", "resource": { "type": "simple", "value": 0, @@ -251,14 +250,14 @@ "name": "Mark Target", "type": "feature", "system": { - "description": "

Spend a Fear to Mark a target within Far range until the @Lookup[@name] is destroyed or the Marked target becomes Hidden. While the target is Marked, their Evasion is halved.

", + "description": "

Spend a Fear to Mark a target within Far range until the Turret is destroyed or the Marked target becomes Hidden. While the target is Marked, their Evasion is halved.

", "resource": null, "actions": { "1SfYAIIr5znuHCKX": { "type": "effect", "_id": "1SfYAIIr5znuHCKX", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to Mark a target within Far range until the Turret is destroyed or the Marked target becomes Hidden. While the target is Marked, their Evasion is halved.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -290,8 +289,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "uwAr6wR4k7ppI2cW", "img": "icons/skills/targeting/crosshair-pointed-orange.webp", @@ -356,14 +354,14 @@ "name": "Concentrate Fire", "type": "feature", "system": { - "description": "

When another adversary deals damage to a target within Far range of the @Lookup[@name], you can mark a Stress to add the @Lookup[@name]’s standard attack damage to the damage roll.

", + "description": "

When another adversary deals damage to a target within Far range of the Turret, you can mark a Stress to add the Turret’s standard attack damage to the damage roll.

", "resource": null, "actions": { "3cqPKBRtwxtLwDpN": { "type": "effect", "_id": "3cqPKBRtwxtLwDpN", "systemPath": "actions", - "description": "", + "description": "

When another adversary deals damage to a target within Far range of the Turret, you can mark a Stress to add the Turret’s standard attack damage to the damage roll.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -390,8 +388,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "G7qZ9RHPyNns3axX", "img": "icons/commodities/tech/cog-brass.webp", @@ -412,14 +409,14 @@ "name": "Detonation", "type": "feature", "system": { - "description": "

When the @Lookup[@name] is destroyed, they explode. All targets within Close range must make an Agility Reaction Roll. Targets who fail take 3d20 physical damage. Targets who succeed take half damage.

@Template[type:emanation|range:c]

", + "description": "

When the Turret is destroyed, they explode. All targets within Close range must make an Agility Reaction Roll. Targets who fail take 3d20 physical damage. Targets who succeed take half damage.

@Template[type:emanation|range:c]

", "resource": null, "actions": { "i1PZ9ddYdOOs2xSb": { "type": "attack", "_id": "i1PZ9ddYdOOs2xSb", "systemPath": "actions", - "description": "", + "description": "

When the Turret is destroyed, they explode. All targets within Close range must make an Agility Reaction Roll. Targets who fail take 3d20 physical damage. Targets who succeed take half damage.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -490,8 +487,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "ALDtQci3ktq9cajU", "img": "icons/magic/sonic/explosion-shock-wave-teal.webp", diff --git a/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json b/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json index 82bdd810..3bcdd49a 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json @@ -150,8 +150,7 @@ "source": "Daggerheart SRD", "page": 101, "artist": "" - }, - "size": "gargantuan" + } }, "prototypeToken": { "name": "Volcanic Dragon: Ashen Tyrant", @@ -252,14 +251,14 @@ "name": "Relentless (4)", "type": "feature", "system": { - "description": "

The @Lookup[@name] can be spotlighted up to four times per GM turn. Spend Fear as usual to spotlight them.

", + "description": "

The Ashen Tyrant can be spotlighted up to four times per GM turn. Spend Fear as usual to spotlight them.

", "resource": null, "actions": { "cvhKUhLycuEeloKH": { "type": "effect", "_id": "cvhKUhLycuEeloKH", "systemPath": "actions", - "description": "", + "description": "

The Ashen Tyrant can be spotlighted up to four times per GM turn. Spend Fear as usual to spotlight them.

", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -310,7 +309,7 @@ "name": "Cornered", "type": "feature", "system": { - "description": "

Mark a Stress instead of spending a Fear to spotlight the @Lookup[@name].

", + "description": "

Mark a Stress instead of spending a Fear to spotlight the Ashen Tyrant.

", "resource": null, "actions": { "nIBoqkOFWx0vpbnj": { @@ -365,7 +364,7 @@ "name": "Injured Wings", "type": "feature", "system": { - "description": "

While flying, the @Lookup[@name] gains a +1 bonus to their Difficulty.

", + "description": "

While flying, the Ashen Tyrant gains a +1 bonus to their Difficulty.

", "resource": null, "actions": {}, "originItemType": null, @@ -434,14 +433,14 @@ "name": "Ashes to Ashes", "type": "feature", "system": { - "description": "

When a PC rolls a failure while within Close range of the @Lookup[@name], they lose a Hope and you gain a Fear. If the PC can’t lose a Hope, they must mark a HP.

", + "description": "

When a PC rolls a failure while within Close range of the Ashen Tyrant, they lose a Hope and you gain a Fear. If the PC can’t lose a Hope, they must mark a HP.

", "resource": null, "actions": { "q6gbeIrGMII6IeiM": { "type": "damage", "_id": "q6gbeIrGMII6IeiM", "systemPath": "actions", - "description": "", + "description": "

When a PC rolls a failure while within Close range of the Ashen Tyrant, they lose a Hope and you gain a Fear. If the PC can’t lose a Hope, they must mark a HP.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -512,14 +511,14 @@ "name": "Desperate Rampage", "type": "feature", "system": { - "description": "

Mark a Stress to make an attack against all targets within Close range. Targets the @Lookup[@name] succeeds against take 2d20+2 physical damage, are knocked back to Close range of where they were, and must mark a Stress.

@Template[type:emanation|range:c]

", + "description": "

Mark a Stress to make an attack against all targets within Close range. Targets the Ashen Tyrant succeeds against take 2d20+2 physical damage, are knocked back to Close range of where they were, and must mark a Stress.

@Template[type:emanation|range:c]

", "resource": null, "actions": { "3glUQAcsLBcCumnS": { "type": "attack", "_id": "3glUQAcsLBcCumnS", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to make an attack against all targets within Close range. Targets the Ashen Tyrant succeeds against take 2d20+2 physical damage, are knocked back to Close range of where they were, and must mark a Stress.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -615,8 +614,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "AXhSVGL33i0j6DAw", "img": "icons/creatures/abilities/tail-swipe-green.webp", @@ -644,7 +642,7 @@ "type": "effect", "_id": "UrD4A68IBJgyfvvt", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to smash the ground and kick up ash within Far range. While within the ash cloud, a target has disadvantage on action rolls. The ash cloud clears the next time an adversary is spotlighted.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -671,8 +669,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "ggCol5LQ2ZpeQjly", "img": "icons/magic/air/fog-gas-smoke-brown.webp", @@ -693,14 +690,14 @@ "name": "Apocalyptic Thrasing", "type": "feature", "system": { - "description": "

Countdown (1d12). Spend a Fear to activate. It ticks down when a PC rolls with Fear. When it triggers, the @Lookup[@name] thrashes about, causing environmental damage (such as an earthquake, avalanche, or collapsing walls). All targets within Far range must make a Strength Reaction Roll. Targets who fail take 2d10+10 physical damage and are Restrained by the rubble until they break free with a successful Strength Roll. Targets who succeed take half damage. If the @Lookup[@name] is defeated while this countdown is active, trigger the countdown immediately as the destruction caused by their death throes.

@Template[type:emanation|range:f]

", + "description": "

Countdown (1d12). Spend a Fear to activate. It ticks down when a PC rolls with Fear. When it triggers, the Ashen Tyrant thrashes about, causing environmental damage (such as an earthquake, avalanche, or collapsing walls). All targets within Far range must make a Strength Reaction Roll. Targets who fail take 2d10+10 physical damage and are Restrained by the rubble until they break free with a successful Strength Roll. Targets who succeed take half damage. If the Ashen Tyrant is defeated while this countdown is active, trigger the countdown immediately as the destruction caused by their death throes.

@Template[type:emanation|range:f]

", "resource": null, "actions": { "OznXxmwiPwzuFPQZ": { "type": "attack", "_id": "OznXxmwiPwzuFPQZ", "systemPath": "actions", - "description": "

When the countdown triggers, the @Lookup[@name] thrashes about, causing environmental damage (such as an earthquake, avalanche, or collapsing walls). All targets within Far range must make a Strength Reaction Roll. Targets who fail take 2d10+10 physical damage and are Restrained by the rubble until they break free with a successful Strength Roll. Targets who succeed take half damage. If the @Lookup[@name] is defeated while this countdown is active, trigger the countdown immediately as the destruction caused by their death throes.

@Template[type:emanation|range:f]

", + "description": "

When the countdown triggers, the Ashen Tyrant thrashes about, causing environmental damage (such as an earthquake, avalanche, or collapsing walls). All targets within Far range must make a Strength Reaction Roll. Targets who fail take 2d10+10 physical damage and are Restrained by the rubble until they break free with a successful Strength Roll. Targets who succeed take half damage. If the Ashen Tyrant is defeated while this countdown is active, trigger the countdown immediately as the destruction caused by their death throes.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -822,8 +819,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "uWiyaJPXcoW06pOM", "img": "icons/creatures/abilities/mouth-teeth-fire-orange.webp", diff --git a/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json b/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json index b23da064..056bf848 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json @@ -150,8 +150,7 @@ "source": "Daggerheart SRD", "page": 100, "artist": "" - }, - "size": "gargantuan" + } }, "prototypeToken": { "name": "Volcanic Dragon: Molten Scourge", @@ -252,14 +251,14 @@ "name": "Relentless (3)", "type": "feature", "system": { - "description": "

The @Lookup[@name] can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", + "description": "

The Molten Scourge can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", "resource": null, "actions": { "ngzXlah4Lv3eK6i5": { "type": "effect", "_id": "ngzXlah4Lv3eK6i5", "systemPath": "actions", - "description": "", + "description": "

The Molten Scourge can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -310,7 +309,7 @@ "name": "Cracked Scales", "type": "feature", "system": { - "description": "

When the @Lookup[@name] takes damage, roll a number of d6s equal to HP marked. For each result of 4 or higher, you gain a Fear.

", + "description": "

When the Molten Scourge takes damage, roll a number of d6s equal to HP marked. For each result of 4 or higher, you gain a Fear.

", "resource": null, "actions": {}, "originItemType": null, @@ -335,14 +334,14 @@ "name": "Shattering Might", "type": "feature", "system": { - "description": "

Mark a Stress to make an attack against a target within Very Close range. On a success, the target takes 4d8+1 physical damage, loses a Hope, and is knocked back to Close range. The @Lookup[@name] clears a Stress.

", + "description": "

Mark a Stress to make an attack against a target within Very Close range. On a success, the target takes 4d8+1 physical damage, loses a Hope, and is knocked back to Close range. The Molten Scourge clears a Stress.

", "resource": null, "actions": { "YNw3E6309te5JPoM": { "type": "attack", "_id": "YNw3E6309te5JPoM", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to make an attack against a target within Very Close range. On a success, the target takes 4d8+1 physical damage, loses a Hope, and is knocked back to Close range. The Molten Scourge clears a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -420,8 +419,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "bpjpHxf6tj4i3H4r", "img": "icons/creatures/abilities/tail-swipe-green.webp", @@ -442,14 +440,14 @@ "name": "Eruption", "type": "feature", "system": { - "description": "

Spend a Fear to erupt lava from beneath the @Lookup[@name]’s scales, filling the area within Very Close range with molten lava. All targets in that area must succeed on an Agility Reaction Roll or take 4d6+6 physical damage and be knocked back to Close range. This area remains lava. When a creature other than the @Lookup[@name] enters that area or acts while inside of it, they must mark 6 HP.

@Template[type:emanation|range:vc]

", + "description": "

Spend a Fear to erupt lava from beneath the Molten Scourge’s scales, filling the area within Very Close range with molten lava. All targets in that area must succeed on an Agility Reaction Roll or take 4d6+6 physical damage and be knocked back to Close range. This area remains lava. When a creature other than the Molten Scourge enters that area or acts while inside of it, they must mark 6 HP.

@Template[type:emanation|range:vc]

", "resource": null, "actions": { "OpwKa8tQQoaEIZiS": { "type": "attack", "_id": "OpwKa8tQQoaEIZiS", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to erupt lava from beneath the Molten Scourge’s scales, filling the area within Very Close range with molten lava. All targets in that area must succeed on an Agility Reaction Roll or take 4d6+6 physical damage and be knocked back to Close range. This area remains lava. When a creature other than the Molten Scourge enters that area or acts while inside of it, they must mark 6 HP.

@Template[type:emanation|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -520,8 +518,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "NuksKUrbf4yj4vR2", "img": "icons/magic/fire/blast-jet-stream-embers-red.webp", @@ -542,14 +539,14 @@ "name": "Volcanic Breath", "type": "feature", "system": { - "description": "

When the @Lookup[@name] takes Major damage, roll a d10. On a result of 8 or higher, the @Lookup[@name] breathes a flow of lava in front of them within Far range. All targets in that area must make an Agility Reaction Roll. Targets who fail take 2d10+4 physical damage, mark 1d4 Stress, and are Vulnerable until they clear a Stress. Targets who succeed take half damage and must mark a Stress.

@Template[type:inFront|range:f]

", + "description": "

When the Molten Scourge takes Major damage, roll a d10. On a result of 8 or higher, the Molten Scourge breathes a flow of lava in front of them within Far range. All targets in that area must make an Agility Reaction Roll. Targets who fail take 2d10+4 physical damage, mark 1d4 Stress, and are Vulnerable until they clear a Stress. Targets who succeed take half damage and must mark a Stress.

@Template[type:inFront|range:f]

", "resource": null, "actions": { "OhrssSQhmciZt1Rm": { "type": "attack", "_id": "OhrssSQhmciZt1Rm", "systemPath": "actions", - "description": "

When the @Lookup[@name] takes Major damage, roll a d10. On a result of 8 or higher, the @Lookup[@name] breathes a flow of lava in front of them within Far range.

", + "description": "

When the Molten Scourge takes Major damage, roll a d10. On a result of 8 or higher, the Molten Scourge breathes a flow of lava in front of them within Far range.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -602,7 +599,7 @@ "type": "attack", "_id": "LBNvfABGWcrygpQM", "systemPath": "actions", - "description": "

The @Lookup[@name] breathes a flow of lava in front of them within Far range. All targets in that area must make an Agility Reaction Roll. Targets who fail take 2d10+4 physical damage, mark 1d4 Stress, and are Vulnerable until they clear a Stress. Targets who succeed take half damage and must mark a Stress.

@Template[type:inFront|range:f]

", + "description": "

The Molten Scourge breathes a flow of lava in front of them within Far range. All targets in that area must make an Agility Reaction Roll. Targets who fail take 2d10+4 physical damage, mark 1d4 Stress, and are Vulnerable until they clear a Stress. Targets who succeed take half damage and must mark a Stress.

@Template[type:inFront|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -702,8 +699,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "2mK8kxfp2WBUeBri", "img": "icons/magic/fire/blast-jet-stream-embers-orange.webp", @@ -763,14 +759,14 @@ "name": "Lava Splash", "type": "feature", "system": { - "description": "

When the @Lookup[@name] takes Severe damage from an attack within Very Close range, molten blood gushes from the wound and deals 2d10+4 direct physical damage to the attacker.

", + "description": "

When the Molten Scourge takes Severe damage from an attack within Very Close range, molten blood gushes from the wound and deals 2d10+4 direct physical damage to the attacker.

", "resource": null, "actions": { "WtrAv8peQ71OBoO1": { "type": "damage", "_id": "WtrAv8peQ71OBoO1", "systemPath": "actions", - "description": "", + "description": "

When the Molten Scourge takes Severe damage from an attack within Very Close range, molten blood gushes from the wound and deals 2d10+4 direct physical damage to the attacker.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -808,8 +804,7 @@ } } ], - "includeBase": false, - "direct": true + "includeBase": false }, "target": { "type": "any", @@ -822,8 +817,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "3VdQdUDULZCQPvLZ", "img": "icons/magic/fire/blast-jet-stream-embers-red.webp", @@ -844,12 +838,11 @@ "name": "Ashen Vengeance", "type": "feature", "system": { - "description": "

When the @Lookup[@name] marks their last HP, replace them with the @UUID[Compendium.daggerheart.adversaries.Actor.pMuXGCSOQaxpi5tb]{Ashen Tyrant} and immediately spotlight them.

", + "description": "

When the Molten Scourge marks their last HP, replace them with the @UUID[Compendium.daggerheart.adversaries.Actor.pMuXGCSOQaxpi5tb]{Ashen Tyrant} and immediately spotlight them.

", "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "qYFoyDSdZ5X2h245", "img": "icons/magic/fire/flame-burning-eye.webp", diff --git a/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json b/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json index 2e2adbdd..2be56990 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json @@ -150,8 +150,7 @@ "source": "Daggerheart SRD", "page": 100, "artist": "" - }, - "size": "gargantuan" + } }, "prototypeToken": { "name": "Volcanic Dragon: Obsidian Predator", @@ -252,14 +251,14 @@ "name": "Relentless (2)", "type": "feature", "system": { - "description": "

The @Lookup[@name] can be spotlighted up to two times per GM turn Spend Fear as usual to spotlight them

", + "description": "

The Obsidian Predator can be spotlighted up to two times per GM turn Spend Fear as usual to spotlight them

", "resource": null, "actions": { "XuhmupOVJj8ae6q0": { "type": "effect", "_id": "XuhmupOVJj8ae6q0", "systemPath": "actions", - "description": "", + "description": "

The Obsidian Predator can be spotlighted up to two times per GM turn Spend Fear as usual to spotlight them.

", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -310,7 +309,7 @@ "name": "Flying", "type": "feature", "system": { - "description": "

While flying, the @Lookup[@name] gains a +3 bonus to their Difficulty.

", + "description": "

While flying, the Obsidian Predator gains a +3 bonus to their Difficulty.

", "resource": null, "actions": {}, "originItemType": null, @@ -379,7 +378,7 @@ "name": "Obsidian Scales", "type": "feature", "system": { - "description": "

The @Lookup[@name] is resistant to physical damage.

", + "description": "

The Obsidian Predator is resistant to physical damage.

", "resource": null, "actions": {}, "originItemType": null, @@ -448,14 +447,14 @@ "name": "Avalanche Tail", "type": "feature", "system": { - "description": "

Mark a Stress to make an attack against all targets within Close range. Targets the @Lookup[@name] succeeds against take 4d6+4 physical damage and are knocked.

@Template[type:emanation|range:c]

", + "description": "

Mark a Stress to make an attack against all targets within Close range. Targets the Obsidian Predator succeeds against take 4d6+4 physical damage and are knocked.

@Template[type:emanation|range:c]

", "resource": null, "actions": { "23y0BoufIgNq62j9": { "type": "attack", "_id": "23y0BoufIgNq62j9", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to make an attack against all targets within Close range. Targets the Obsidian Predator succeeds against take 4d6+4 physical damage and are knocked.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -529,8 +528,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "8bMOItTuL7PfAYcJ", "img": "icons/creatures/abilities/tail-swipe-green.webp", @@ -590,14 +588,14 @@ "name": "Dive-Bomb", "type": "feature", "system": { - "description": "

If the @Lookup[@name] is flying, mark a Stress to choose a point within Far range. Move to that point and make an attack against all targets within Very Close range. Targets the @Lookup[@name] succeeds against take 2d10+6 physical damage and must mark a Stress and lose a Hope.

@Template[type:emanation|range:vc]

", + "description": "

If the Obsidian Predator is flying, mark a Stress to choose a point within Far range. Move to that point and make an attack against all targets within Very Close range. Targets the Obsidian Predator succeeds against take 2d10+6 physical damage and must mark a Stress and lose a Hope.

@Template[type:emanation|range:vc]

", "resource": null, "actions": { "OpAT9nxlbgvnhdBg": { "type": "attack", "_id": "OpAT9nxlbgvnhdBg", "systemPath": "actions", - "description": "", + "description": "

If the Obsidian Predator is flying, mark a Stress to choose a point within Far range. Move to that point and make an attack against all targets within Very Close range. Targets the Obsidian Predator succeeds against take 2d10+6 physical damage and must mark a Stress and lose a Hope.

@Template[type:emanation|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -718,8 +716,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "5wLxyaWJuUhkx1EX", "img": "icons/creatures/reptiles/dragon-winged-blue.webp", @@ -740,12 +737,11 @@ "name": "Erupting Rage", "type": "feature", "system": { - "description": "

When the @Lookup[@name] marks their last HP, replace them with the @UUID[Compendium.daggerheart.adversaries.Actor.eArAPuB38CNR0ZIM]{Molten Scourge} and immediately spotlight them.

", + "description": "

When the Obsidian Predator marks their last HP, replace them with the @UUID[Compendium.daggerheart.adversaries.Actor.eArAPuB38CNR0ZIM]{Molten Scourge} and immediately spotlight them.

", "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "5llfnRwO7mfzDFgT", "img": "icons/magic/fire/flame-burning-eye.webp", diff --git a/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json b/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json index f087c63d..fcb3dc5a 100644 --- a/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json +++ b/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json @@ -122,8 +122,7 @@ "source": "Daggerheart SRD", "page": 91, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "noDdT0tsN6FXSmC8", @@ -239,7 +238,7 @@ "type": "effect", "_id": "39zC1I5DYozI47lP", "systemPath": "actions", - "description": "", + "description": "

Before or after making a standard attack, you can mark a Stress to teleport to a location within Far range.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -287,14 +286,14 @@ "name": "Refresh Warding Sphere", "type": "feature", "system": { - "description": "

Mark a Stress to refresh the @Lookup[@name]’s “Warding Sphere” reaction.

", + "description": "

Mark a Stress to refresh the Wizard’s “Warding Sphere” reaction.

", "resource": null, "actions": { "FCuksmAGRC4061zm": { "type": "effect", "_id": "FCuksmAGRC4061zm", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to refresh the Wizard’s “Warding Sphere” reaction.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -321,8 +320,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "dI2MGjC7NFAru1Gd", "img": "icons/magic/defensive/shield-barrier-blades-teal.webp", @@ -350,7 +348,7 @@ "type": "attack", "_id": "vnMq4NuQO6GYxWhM", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear and choose a point within Far range. A Very Close area around that point erupts into impassable terrain. All targets within that area must make an Agility Reaction Roll (14). Targets who fail take 2d10 physical damage and are thrown out of the area. Targets who succeed take half damage and aren’t moved.

@Template[type:circle|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -428,8 +426,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "PnQ0m0FLnpht7oE4", "img": "icons/magic/earth/barrier-stone-explosion-red.webp", @@ -457,7 +454,7 @@ "type": "attack", "_id": "DFHR8LtvjZjHP6BL", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to unleash a precise hail of magical blasts. All targets in the scene must make an Agility Reaction Roll. Targets who fail take 2d12 magic damage. Targets who succeed take half damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -535,8 +532,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "s2luvEVxJLZmOrdh", "img": "icons/magic/light/projectiles-trio-pink.webp", @@ -557,19 +553,19 @@ "name": "Warding Sphere", "type": "feature", "system": { - "description": "

When the @Lookup[@name] takes damage from an attack within Close range, deal 2d6 magic damage to the attacker. This reaction can’t be used again until the @Lookup[@name] refreshes it with their “Refresh Warding Sphere” action.

", + "description": "

When the Wizard takes damage from an attack within Close range, deal 2d6 magic damage to the attacker. This reaction can’t be used again until the Wizard refreshes it with their “Refresh Warding Sphere” action.

", "resource": null, "actions": { "2fHrpaZW9toi6nin": { "type": "damage", "_id": "2fHrpaZW9toi6nin", "systemPath": "actions", - "description": "", + "description": "

When the Wizard takes damage from an attack within Close range, deal 2d6 magic damage to the attacker. This reaction can’t be used again until the Wizard refreshes it with their “Refresh Warding Sphere” action.

", "chatDisplay": true, "actionType": "action", "cost": [], "uses": { - "value": 0, + "value": null, "max": "1", "recovery": null }, @@ -615,8 +611,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "9cPigHRcUfJC9gD8", "img": "icons/magic/defensive/barrier-shield-dome-blue-purple.webp", diff --git a/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json b/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json index 2989468b..d1d936e1 100644 --- a/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json +++ b/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 83, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "ZNbQ2jg35LG4t9eH", @@ -223,14 +222,14 @@ "_id": "tyGgOqQzDSIypoMz", "img": "icons/skills/melee/strike-sword-dagger-runes-gold.webp", "system": { - "description": "

Make a standard attack against a target. On a success, mark a Stress to Taunt the target until their next successful attack. The next time the Taunted target attacks, they have disadvantage against targets other than the @Lookup[@name].

", + "description": "

Make a standard attack against a target. On a success, mark a Stress to Taunt the target until their next successful attack. The next time the Taunted target attacks, they have disadvantage against targets other than the Weaponmaster.

", "resource": null, "actions": { "mlPgZJNL2TjykjUb": { "type": "attack", "_id": "mlPgZJNL2TjykjUb", "systemPath": "actions", - "description": "", + "description": "

Make a standard attack against a target. On a success, mark a Stress to Taunt the target until their next successful attack. The next time the Taunted target attacks, they have disadvantage against targets other than the Weaponmaster.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -307,8 +306,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [ { @@ -378,7 +376,7 @@ "type": "healing", "_id": "WQ067ZFiG2QMBo2n", "systemPath": "actions", - "description": "", + "description": "

Once per scene, spend a Fear to clear 2 HP and 2 Stress.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -486,8 +484,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -508,14 +505,14 @@ "_id": "oYNVPQOy5oQli5Il", "img": "icons/skills/melee/strike-weapons-orange.webp", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Weaponmaster makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "jeKcXbdw8gPF4OQA": { "type": "healing", "_id": "jeKcXbdw8gPF4OQA", "systemPath": "actions", - "description": "", + "description": "

When the Weaponmaster makes a successful attack against a PC, you gain a Fear.

", "chatDisplay": true, "actionType": "reaction", "cost": [], @@ -583,8 +580,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json b/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json index 446a4af3..80fb7ce2 100644 --- a/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json +++ b/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 83, "artist": "" - }, - "size": "medium" + } }, "flags": {}, "_id": "8yUj2Mzvnifhxegm", @@ -236,7 +235,7 @@ "type": "attack", "_id": "0VOUNQKNjwlLhnRW", "systemPath": "actions", - "description": "", + "description": "

Mark a Stress to spotlight 1d4 allies within range of a target they can attack without moving. On a success, their attacks deal half damage.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -288,8 +287,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [], "folder": null, @@ -317,7 +315,7 @@ "type": "effect", "_id": "cXOjhfMgKh2yD1mc", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to form a cage around a target within Very Close range and Restrain them until they’re freed with a successful Strength Roll. When a creature makes an action roll against the cage, they must mark a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -350,8 +348,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "effects": [ { @@ -411,14 +408,14 @@ "_id": "4f79icB7Dd1xLEZQ", "img": "icons/skills/melee/strike-weapons-orange.webp", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Dryad makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "9MGyAjWtLbDz8Znu": { "type": "healing", "_id": "9MGyAjWtLbDz8Znu", "systemPath": "actions", - "description": "", + "description": "

When the Dryad makes a successful attack against a PC, you gain a Fear.

", "chatDisplay": true, "actionType": "reaction", "cost": [], @@ -486,8 +483,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json b/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json index b0a3bded..28c00c51 100644 --- a/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json +++ b/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json @@ -117,8 +117,7 @@ "source": "Daggerheart SRD", "page": 96, "artist": "" - }, - "size": "huge" + } }, "flags": {}, "_id": "UGPiPLJsPvMTSKEF", @@ -227,14 +226,14 @@ "name": "Relentless (3)", "type": "feature", "system": { - "description": "

The @Lookup[@name] can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", + "description": "

The Dragon can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", "resource": null, "actions": { "cmZsrUJa9FJ8gZKP": { "type": "effect", "_id": "cmZsrUJa9FJ8gZKP", "systemPath": "actions", - "description": "", + "description": "

The Dragon can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -285,14 +284,14 @@ "name": "Rend and Crush", "type": "feature", "system": { - "description": "

If a target damaged by the @Lookup[@name] doesn’t mark an Armor Slot to reduce the damage, they must mark a Stress.

", + "description": "

If a target damaged by the Dragon doesn’t mark an Armor Slot to reduce the damage, they must mark a Stress.

", "resource": null, "actions": { "dHoMdLfAl6UKjXRP": { "type": "damage", "_id": "dHoMdLfAl6UKjXRP", "systemPath": "actions", - "description": "", + "description": "

If a target damaged by the Dragon doesn’t mark an Armor Slot to reduce the damage, they must mark a Stress.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -363,7 +362,7 @@ "name": "No Hope", "type": "feature", "system": { - "description": "

When a PC rolls with Fear while within Far range of the @Lookup[@name], they lose a Hope.

", + "description": "

When a PC rolls with Fear while within Far range of the Dragon, they lose a Hope.

", "resource": null, "actions": {}, "originItemType": null, @@ -388,14 +387,14 @@ "name": "Blizzard Breath", "type": "feature", "system": { - "description": "

Spend 2 Fear to release an icy whorl in front of the @Lookup[@name] within Close range. All targets in this area must make an Agility Reaction Roll. Targets who fail take 4d6+5 magic damage and are Restrained by ice until they break free with a successful Strength Roll. Targets who succeed must mark 2 Stress or take half damage.

@Template[type:inFront|range:c]

", + "description": "

Spend 2 Fear to release an icy whorl in front of the Dragon within Close range. All targets in this area must make an Agility Reaction Roll. Targets who fail take 4d6+5 magic damage and are Restrained by ice until they break free with a successful Strength Roll. Targets who succeed must mark 2 Stress or take half damage.

@Template[type:inFront|range:c]

", "resource": null, "actions": { "CBecTlgyUBFxgoi5": { "type": "attack", "_id": "CBecTlgyUBFxgoi5", "systemPath": "actions", - "description": "", + "description": "

Spend 2 Fear to release an icy whorl in front of the Dragon within Close range. All targets in this area must make an Agility Reaction Roll. Targets who fail take 4d6+5 magic damage and are Restrained by ice until they break free with a successful Strength Roll. Targets who succeed must mark 2 Stress or take half damage.

@Template[type:inFront|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -478,8 +477,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "QV2ytK4b1VWF71OS", "img": "icons/magic/water/projectiles-ice-faceted-shard-salvo-blue.webp", @@ -539,14 +537,14 @@ "name": "Avalanche", "type": "feature", "system": { - "description": "

Spend a Fear to have the @Lookup[@name] unleash a huge downfall of snow and ice, covering all other creatures within Far range. All targets within this area must succeed on an Instinct Reaction Roll or be buried in snow and rocks, becoming Vulnerable until they dig themselves out from the debris. For each PC that fails the reaction roll, you gain a Fear.

@Template[type:emanation|range:f]

", + "description": "

Spend a Fear to have the Dragon unleash a huge downfall of snow and ice, covering all other creatures within Far range. All targets within this area must succeed on an Instinct Reaction Roll or be buried in snow and rocks, becoming Vulnerable until they dig themselves out from the debris. For each PC that fails the reaction roll, you gain a Fear.

@Template[type:emanation|range:f]

", "resource": null, "actions": { "G9LjoXShkCcgx8EC": { "type": "attack", "_id": "G9LjoXShkCcgx8EC", "systemPath": "actions", - "description": "", + "description": "

Spend a Fear to have the Dragon unleash a huge downfall of snow and ice, covering all other creatures within Far range. All targets within this area must succeed on an Instinct Reaction Roll or be buried in snow and rocks, becoming Vulnerable until they dig themselves out from the debris. For each PC that fails the reaction roll, you gain a Fear.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -602,8 +600,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "CcRTxCDCJskiu3fI", "img": "icons/magic/water/barrier-ice-wall-snow.webp", @@ -663,7 +660,7 @@ "name": "Frozen Scales", "type": "feature", "system": { - "description": "

When a creature makes a successful attack against the @Lookup[@name] from within Very Close range, they must mark a Stress and become Chilled until their next rest or they clear a Stress. While they are Chilled, they have disadvantage on attack rolls.

", + "description": "

When a creature makes a successful attack against the Dragon from within Very Close range, they must mark a Stress and become Chilled until their next rest or they clear a Stress. While they are Chilled, they have disadvantage on attack rolls.

", "resource": null, "actions": { "QZMpj1qEWI6Er7q2": { @@ -725,8 +722,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "nXZHOfcYvjg3YMNU", "img": "icons/commodities/leather/scales-blue.webp", @@ -791,14 +787,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

", + "description": "

When the Dragon makes a successful attack against a PC, you gain a Fear.

", "resource": null, "actions": { "5V5SDnUBg9dQOkLW": { "type": "healing", "_id": "5V5SDnUBg9dQOkLW", "systemPath": "actions", - "description": "", + "description": "

When the Dragon makes a successful attack against a PC, you gain a Fear.

", "chatDisplay": true, "actionType": "reaction", "cost": [], @@ -865,8 +861,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "QHdJgT2fvwqquyf7", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json b/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json index 1b2cce2a..a67dda37 100644 --- a/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json +++ b/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 101, "artist": "" - }, - "size": "huge" + } }, "flags": {}, "_id": "YhJrP7rTBiRdX5Fp", @@ -221,7 +220,7 @@ "name": "Horde (2d6+5)", "type": "feature", "system": { - "description": "

When the @Lookup[@name] has marked half or more of their HP, their standard attack deals 2d6+5 physical damage instead.

", + "description": "

When the Legion has marked half or more of their HP, their standard attack deals 2d6+5 physical damage instead.

", "resource": null, "actions": {}, "originItemType": null, @@ -246,7 +245,7 @@ "name": "Unyielding", "type": "feature", "system": { - "description": "

The @Lookup[@name] has resistance to physical damage.

", + "description": "

The Legion has resistance to physical damage.

", "resource": null, "actions": {}, "originItemType": null, @@ -315,14 +314,14 @@ "name": "Relentless (2)", "type": "feature", "system": { - "description": "

The @Lookup[@name] can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

", + "description": "

The Legion can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

", "resource": null, "actions": { "IACoLeO6VmnK0qkW": { "type": "effect", "_id": "IACoLeO6VmnK0qkW", "systemPath": "actions", - "description": "", + "description": "

The Legion can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -373,14 +372,14 @@ "name": "Overwhelm", "type": "feature", "system": { - "description": "

When the @Lookup[@name] takes Minor damage from an attack within Melee range, you can mark a Stress to make a standard attack with advantage against the attacker.

", + "description": "

When the Legion takes Minor damage from an attack within Melee range, you can mark a Stress to make a standard attack with advantage against the attacker.

", "resource": null, "actions": { "TJ9DhHRuqK5X5Zx5": { "type": "effect", "_id": "TJ9DhHRuqK5X5Zx5", "systemPath": "actions", - "description": "", + "description": "

When the Legion takes Minor damage from an attack within Melee range, you can mark a Stress to make a standard attack with advantage against the attacker.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -407,8 +406,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "d5Vilu9cUub1O6TD", "img": "icons/skills/melee/strike-slashes-orange.webp", diff --git a/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json b/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json index 32519ac6..9b8a118d 100644 --- a/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json +++ b/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json @@ -111,8 +111,7 @@ "source": "Daggerheart SRD", "page": 84, "artist": "" - }, - "size": "huge" + } }, "flags": {}, "_id": "Nf0v43rtflV56V2T", @@ -223,7 +222,7 @@ "_id": "nNJGAhWu0IuS2ybn", "img": "icons/creatures/magical/humanoid-silhouette-aliens-green.webp", "system": { - "description": "

When the @Lookup[@name] have marked half or more of their HP, their standard attack deals 1d4+2 physical damage instead.

", + "description": "

When the Zombies have marked half or more of their HP, their standard attack deals 1d4+2 physical damage instead.

", "resource": null, "actions": {}, "originItemType": null, @@ -249,14 +248,14 @@ "_id": "jQmltra0ovHE33Nx", "img": "icons/magic/death/blood-corruption-vomit-red.webp", "system": { - "description": "

When the @Lookup[@name]s mark HP from an attack within Melee range, you can mark a Stress to make a standard attack against the attacker.

", + "description": "

When the Zombies mark HP from an attack within Melee range, you can mark a Stress to make a standard attack against the attacker.

", "resource": null, "actions": { "0Im5AEgp8gJaVJHh": { "type": "effect", "_id": "0Im5AEgp8gJaVJHh", "systemPath": "actions", - "description": "", + "description": "

When the Zombies mark HP from an attack within Melee range, you can mark a Stress to make a standard attack against the attacker.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -284,8 +283,7 @@ }, "originItemType": null, "subType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "effects": [], "folder": null, diff --git a/src/packs/ancestries/feature_Shell_A6a87OWA3tx16g9V.json b/src/packs/ancestries/feature_Shell_A6a87OWA3tx16g9V.json index f07fff69..0620296a 100644 --- a/src/packs/ancestries/feature_Shell_A6a87OWA3tx16g9V.json +++ b/src/packs/ancestries/feature_Shell_A6a87OWA3tx16g9V.json @@ -36,13 +36,13 @@ "key": "system.damageThresholds.major", "mode": 2, "value": "@prof", - "priority": 21 + "priority": null }, { "key": "system.damageThresholds.severe", "mode": 2, "value": "@prof", - "priority": 21 + "priority": null } ], "disabled": false, diff --git a/src/packs/beastforms/beastform_Agile_Scout_a9UoCwtrbgKk02mK.json b/src/packs/beastforms/beastform_Agile_Scout_a9UoCwtrbgKk02mK.json index 71018bc9..58892f81 100644 --- a/src/packs/beastforms/beastform_Agile_Scout_a9UoCwtrbgKk02mK.json +++ b/src/packs/beastforms/beastform_Agile_Scout_a9UoCwtrbgKk02mK.json @@ -9,8 +9,7 @@ "tokenRingImg": "icons/creatures/mammals/rodent-rat-diseaed-gray.webp", "tokenSize": { "height": null, - "width": null, - "size": "tiny" + "width": null }, "mainTrait": "agility", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Aquatic_Predator_ItBVeCl2u5uetgy7.json b/src/packs/beastforms/beastform_Aquatic_Predator_ItBVeCl2u5uetgy7.json index 5287de84..46610de3 100644 --- a/src/packs/beastforms/beastform_Aquatic_Predator_ItBVeCl2u5uetgy7.json +++ b/src/packs/beastforms/beastform_Aquatic_Predator_ItBVeCl2u5uetgy7.json @@ -9,8 +9,7 @@ "tokenRingImg": "icons/creatures/fish/fish-marlin-swordfight-blue.webp", "tokenSize": { "height": null, - "width": null, - "size": "large" + "width": null }, "mainTrait": "agility", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Aquatic_Scout_qqzdFCxyYupWZK23.json b/src/packs/beastforms/beastform_Aquatic_Scout_qqzdFCxyYupWZK23.json index 95bea914..ef28f80c 100644 --- a/src/packs/beastforms/beastform_Aquatic_Scout_qqzdFCxyYupWZK23.json +++ b/src/packs/beastforms/beastform_Aquatic_Scout_qqzdFCxyYupWZK23.json @@ -9,8 +9,7 @@ "tokenRingImg": "icons/creatures/tentacles/tentacles-octopus-black-pink.webp", "tokenSize": { "height": null, - "width": null, - "size": "tiny" + "width": null }, "mainTrait": "agility", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Armored_Sentry_8pUHJv3BYdjA4Qdf.json b/src/packs/beastforms/beastform_Armored_Sentry_8pUHJv3BYdjA4Qdf.json index ba18c05f..8b752488 100644 --- a/src/packs/beastforms/beastform_Armored_Sentry_8pUHJv3BYdjA4Qdf.json +++ b/src/packs/beastforms/beastform_Armored_Sentry_8pUHJv3BYdjA4Qdf.json @@ -9,8 +9,7 @@ "tokenRingImg": "icons/creatures/reptiles/turtle-shell-glowing-green.webp", "tokenSize": { "height": null, - "width": null, - "size": "small" + "width": null }, "mainTrait": "strength", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Epic_Aquatic_Beast_wT4xbF99I55yjKZV.json b/src/packs/beastforms/beastform_Epic_Aquatic_Beast_wT4xbF99I55yjKZV.json index 0dfe9c20..710bb3c8 100644 --- a/src/packs/beastforms/beastform_Epic_Aquatic_Beast_wT4xbF99I55yjKZV.json +++ b/src/packs/beastforms/beastform_Epic_Aquatic_Beast_wT4xbF99I55yjKZV.json @@ -9,8 +9,7 @@ "tokenRingImg": "icons/creatures/fish/squid-kraken-teal.webp", "tokenSize": { "height": null, - "width": null, - "size": "gargantuan" + "width": null }, "mainTrait": "agility", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Great_Predator_afbMt4Ld6nY3mw0N.json b/src/packs/beastforms/beastform_Great_Predator_afbMt4Ld6nY3mw0N.json index 450a1312..984c72c8 100644 --- a/src/packs/beastforms/beastform_Great_Predator_afbMt4Ld6nY3mw0N.json +++ b/src/packs/beastforms/beastform_Great_Predator_afbMt4Ld6nY3mw0N.json @@ -9,8 +9,7 @@ "tokenRingImg": "icons/creatures/mammals/wolf-shadow-black.webp", "tokenSize": { "height": null, - "width": null, - "size": "large" + "width": null }, "mainTrait": "strength", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Great_Winged_Beast_b4BMnTbJ3iPPidSb.json b/src/packs/beastforms/beastform_Great_Winged_Beast_b4BMnTbJ3iPPidSb.json index c04b2182..444fda44 100644 --- a/src/packs/beastforms/beastform_Great_Winged_Beast_b4BMnTbJ3iPPidSb.json +++ b/src/packs/beastforms/beastform_Great_Winged_Beast_b4BMnTbJ3iPPidSb.json @@ -9,8 +9,7 @@ "tokenRingImg": "icons/creatures/birds/corvid-flying-wings-purple.webp", "tokenSize": { "height": null, - "width": null, - "size": "large" + "width": null }, "mainTrait": "finesse", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Household_Friend_iDmOtiHJJ80AIAVT.json b/src/packs/beastforms/beastform_Household_Friend_iDmOtiHJJ80AIAVT.json index cfb6aea7..80756af0 100644 --- a/src/packs/beastforms/beastform_Household_Friend_iDmOtiHJJ80AIAVT.json +++ b/src/packs/beastforms/beastform_Household_Friend_iDmOtiHJJ80AIAVT.json @@ -9,8 +9,7 @@ "tokenRingImg": "icons/creatures/mammals/rabbit-movement-glowing-green.webp", "tokenSize": { "height": null, - "width": null, - "size": "tiny" + "width": null }, "mainTrait": "instinct", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Massive_Behemoth_qjwMzPn33aKZACkv.json b/src/packs/beastforms/beastform_Massive_Behemoth_qjwMzPn33aKZACkv.json index 35715056..8e3c0ce5 100644 --- a/src/packs/beastforms/beastform_Massive_Behemoth_qjwMzPn33aKZACkv.json +++ b/src/packs/beastforms/beastform_Massive_Behemoth_qjwMzPn33aKZACkv.json @@ -9,8 +9,7 @@ "tokenRingImg": "icons/creatures/mammals/beast-horned-scaled-glowing-orange.webp", "tokenSize": { "height": null, - "width": null, - "size": "huge" + "width": null }, "mainTrait": "strength", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Mighty_Lizard_94tvcC3D5Kp4lzuN.json b/src/packs/beastforms/beastform_Mighty_Lizard_94tvcC3D5Kp4lzuN.json index 390bf054..4dcb396a 100644 --- a/src/packs/beastforms/beastform_Mighty_Lizard_94tvcC3D5Kp4lzuN.json +++ b/src/packs/beastforms/beastform_Mighty_Lizard_94tvcC3D5Kp4lzuN.json @@ -9,8 +9,7 @@ "tokenRingImg": "icons/creatures/reptiles/lizard-iguana-green.webp", "tokenSize": { "height": null, - "width": null, - "size": "large" + "width": null }, "mainTrait": "instinct", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Mighty_Strider_zRLjqKx4Rn2TjivL.json b/src/packs/beastforms/beastform_Mighty_Strider_zRLjqKx4Rn2TjivL.json index adb9627b..f77c7b5d 100644 --- a/src/packs/beastforms/beastform_Mighty_Strider_zRLjqKx4Rn2TjivL.json +++ b/src/packs/beastforms/beastform_Mighty_Strider_zRLjqKx4Rn2TjivL.json @@ -9,8 +9,7 @@ "tokenRingImg": "icons/environment/creatures/horse-tan.webp", "tokenSize": { "height": null, - "width": null, - "size": "large" + "width": null }, "mainTrait": "agility", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Mythic_Aerial_Hunter_jV6EuEacyQlHW4SN.json b/src/packs/beastforms/beastform_Mythic_Aerial_Hunter_jV6EuEacyQlHW4SN.json index dc373c27..34898d53 100644 --- a/src/packs/beastforms/beastform_Mythic_Aerial_Hunter_jV6EuEacyQlHW4SN.json +++ b/src/packs/beastforms/beastform_Mythic_Aerial_Hunter_jV6EuEacyQlHW4SN.json @@ -9,8 +9,7 @@ "tokenRingImg": "icons/creatures/reptiles/dragon-winged-blue.webp", "tokenSize": { "height": null, - "width": null, - "size": "gargantuan" + "width": null }, "mainTrait": "finesse", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Nimble_Grazer_CItO8yX6amQaqyk7.json b/src/packs/beastforms/beastform_Nimble_Grazer_CItO8yX6amQaqyk7.json index 183ad150..08d83325 100644 --- a/src/packs/beastforms/beastform_Nimble_Grazer_CItO8yX6amQaqyk7.json +++ b/src/packs/beastforms/beastform_Nimble_Grazer_CItO8yX6amQaqyk7.json @@ -9,8 +9,7 @@ "tokenRingImg": "icons/creatures/mammals/deer-antlers-glowing-blue.webp", "tokenSize": { "height": null, - "width": null, - "size": "medium" + "width": null }, "mainTrait": "agility", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Pack_Predator_YLisKYYhAGca50WM.json b/src/packs/beastforms/beastform_Pack_Predator_YLisKYYhAGca50WM.json index 834493bb..58d28e2d 100644 --- a/src/packs/beastforms/beastform_Pack_Predator_YLisKYYhAGca50WM.json +++ b/src/packs/beastforms/beastform_Pack_Predator_YLisKYYhAGca50WM.json @@ -9,8 +9,7 @@ "tokenRingImg": "icons/creatures/mammals/wolf-howl-moon-forest-blue.webp", "tokenSize": { "height": null, - "width": null, - "size": "medium" + "width": null }, "mainTrait": "strength", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Pouncing_Predator_33oFSZ1PwFqInHPe.json b/src/packs/beastforms/beastform_Pouncing_Predator_33oFSZ1PwFqInHPe.json index d172d8f3..5df71fd3 100644 --- a/src/packs/beastforms/beastform_Pouncing_Predator_33oFSZ1PwFqInHPe.json +++ b/src/packs/beastforms/beastform_Pouncing_Predator_33oFSZ1PwFqInHPe.json @@ -9,8 +9,7 @@ "tokenRingImg": "icons/creatures/abilities/cougar-roar-rush-orange.webp", "tokenSize": { "height": null, - "width": null, - "size": "medium" + "width": null }, "mainTrait": "instinct", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Powerful_Beast_m8BVTuJI1wCvzTcf.json b/src/packs/beastforms/beastform_Powerful_Beast_m8BVTuJI1wCvzTcf.json index 7fa832e6..bbbc9a66 100644 --- a/src/packs/beastforms/beastform_Powerful_Beast_m8BVTuJI1wCvzTcf.json +++ b/src/packs/beastforms/beastform_Powerful_Beast_m8BVTuJI1wCvzTcf.json @@ -9,8 +9,7 @@ "tokenRingImg": "icons/creatures/abilities/bear-roar-bite-brown-green.webp", "tokenSize": { "height": null, - "width": null, - "size": "large" + "width": null }, "mainTrait": "strength", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Stalking_Arachnid_A4TVRY0D5r9EiVwA.json b/src/packs/beastforms/beastform_Stalking_Arachnid_A4TVRY0D5r9EiVwA.json index 16520a9c..dc1ba68f 100644 --- a/src/packs/beastforms/beastform_Stalking_Arachnid_A4TVRY0D5r9EiVwA.json +++ b/src/packs/beastforms/beastform_Stalking_Arachnid_A4TVRY0D5r9EiVwA.json @@ -9,8 +9,7 @@ "tokenRingImg": "icons/creatures/invertebrates/spider-mandibles-brown.webp", "tokenSize": { "height": null, - "width": null, - "size": "tiny" + "width": null }, "mainTrait": "finesse", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Striking_Serpent_1XrZWGDttBAAUxR1.json b/src/packs/beastforms/beastform_Striking_Serpent_1XrZWGDttBAAUxR1.json index f78500c9..1cdf3fa3 100644 --- a/src/packs/beastforms/beastform_Striking_Serpent_1XrZWGDttBAAUxR1.json +++ b/src/packs/beastforms/beastform_Striking_Serpent_1XrZWGDttBAAUxR1.json @@ -9,8 +9,7 @@ "tokenRingImg": "icons/creatures/reptiles/serpent-horned-green.webp", "tokenSize": { "height": null, - "width": null, - "size": "small" + "width": null }, "mainTrait": "finesse", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Terrible_Lizard_5BABxRe2XVrYTj8N.json b/src/packs/beastforms/beastform_Terrible_Lizard_5BABxRe2XVrYTj8N.json index 49818b74..d15fa0d9 100644 --- a/src/packs/beastforms/beastform_Terrible_Lizard_5BABxRe2XVrYTj8N.json +++ b/src/packs/beastforms/beastform_Terrible_Lizard_5BABxRe2XVrYTj8N.json @@ -9,8 +9,7 @@ "tokenRingImg": "icons/creatures/abilities/dragon-breath-purple.webp", "tokenSize": { "height": null, - "width": null, - "size": "gargantuan" + "width": null }, "mainTrait": "strength", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Winged_Beast_mZ4Wlqtss2FlNNvL.json b/src/packs/beastforms/beastform_Winged_Beast_mZ4Wlqtss2FlNNvL.json index 4ca44471..cc78e6a4 100644 --- a/src/packs/beastforms/beastform_Winged_Beast_mZ4Wlqtss2FlNNvL.json +++ b/src/packs/beastforms/beastform_Winged_Beast_mZ4Wlqtss2FlNNvL.json @@ -9,8 +9,7 @@ "tokenRingImg": "icons/creatures/birds/raptor-owl-flying-moon.webp", "tokenSize": { "height": null, - "width": null, - "size": "tiny" + "width": null }, "mainTrait": "finesse", "advantageOn": { diff --git a/src/packs/beastforms/feature_Armored_Shell_nDQZdIF2epKlhauX.json b/src/packs/beastforms/feature_Armored_Shell_nDQZdIF2epKlhauX.json index 7aaefef8..e56cfa68 100644 --- a/src/packs/beastforms/feature_Armored_Shell_nDQZdIF2epKlhauX.json +++ b/src/packs/beastforms/feature_Armored_Shell_nDQZdIF2epKlhauX.json @@ -100,7 +100,7 @@ "key": "system.resistance.physical.reduction", "mode": 2, "value": "@system.armorScore", - "priority": 21 + "priority": null } ], "disabled": false, diff --git a/src/packs/domains/domainCard_Body_Basher_aQz8jKkCd8M9aKMA.json b/src/packs/domains/domainCard_Body_Basher_aQz8jKkCd8M9aKMA.json index f0d4c988..dfb5af6d 100644 --- a/src/packs/domains/domainCard_Body_Basher_aQz8jKkCd8M9aKMA.json +++ b/src/packs/domains/domainCard_Body_Basher_aQz8jKkCd8M9aKMA.json @@ -38,13 +38,13 @@ "key": "system.bonuses.damage.primaryWeapon.bonus", "mode": 2, "value": "@system.traits.strength.value", - "priority": 21 + "priority": null }, { "key": "system.bonuses.damage.secondaryWeapon.bonus", "mode": 2, "value": "@system.traits.strength.value", - "priority": 21 + "priority": null } ], "disabled": false, @@ -57,7 +57,7 @@ "startRound": null, "startTurn": null }, - "description": "

On a successful attack using a weapon with a Melee range, gain a bonus to your damage roll equal to your Strength.

", + "description": "

On a successful attack using a weapon with a Melee range, gain a bonus to your damage roll equal to your Strength.

", "origin": null, "tint": "#ffffff", "transfer": true, diff --git a/src/packs/domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json b/src/packs/domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json index ededde93..2fca6775 100644 --- a/src/packs/domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json +++ b/src/packs/domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json @@ -208,13 +208,13 @@ }, "changes": [ { - "key": "system.rules.damageReduction.reduceSeverity.magical", + "key": "system.resistance.magical.reduction", "mode": 2, "value": "1", "priority": null }, { - "key": "system.rules.damageReduction.reduceSeverity.physical", + "key": "system.resistance.magical.reduction", "mode": 2, "value": "1", "priority": null diff --git a/src/packs/domains/domainCard_Cruel_Precision_bap1eCWryPNowbyo.json b/src/packs/domains/domainCard_Cruel_Precision_bap1eCWryPNowbyo.json index 9e5c414e..cdb5ffe6 100644 --- a/src/packs/domains/domainCard_Cruel_Precision_bap1eCWryPNowbyo.json +++ b/src/packs/domains/domainCard_Cruel_Precision_bap1eCWryPNowbyo.json @@ -37,13 +37,13 @@ "key": "system.bonuses.damage.primaryWeapon.bonus", "mode": 2, "value": "@system.traits.agility.value", - "priority": 21 + "priority": null }, { "key": "system.bonuses.damage.secondaryWeapon.bonus", "mode": 2, "value": "@system.traits.agility.value", - "priority": 21 + "priority": null } ], "disabled": true, diff --git a/src/packs/domains/domainCard_Overwhelming_Aura_iEBLySZD9z8CLdz7.json b/src/packs/domains/domainCard_Overwhelming_Aura_iEBLySZD9z8CLdz7.json index cc04c9c9..e5282328 100644 --- a/src/packs/domains/domainCard_Overwhelming_Aura_iEBLySZD9z8CLdz7.json +++ b/src/packs/domains/domainCard_Overwhelming_Aura_iEBLySZD9z8CLdz7.json @@ -101,7 +101,7 @@ "key": "system.traits.presence.value", "mode": 5, "value": "@cast", - "priority": 51 + "priority": null } ], "disabled": false, diff --git a/src/packs/domains/domainCard_Rage_Up_GRL0cvs96vrTDckZ.json b/src/packs/domains/domainCard_Rage_Up_GRL0cvs96vrTDckZ.json index 6f8b481d..94472445 100644 --- a/src/packs/domains/domainCard_Rage_Up_GRL0cvs96vrTDckZ.json +++ b/src/packs/domains/domainCard_Rage_Up_GRL0cvs96vrTDckZ.json @@ -113,13 +113,13 @@ "key": "system.bonuses.damage.magical.bonus", "mode": 2, "value": "2*@system.traits.strength.value", - "priority": 21 + "priority": null }, { "key": "system.bonuses.damage.physical.bonus", "mode": 2, "value": "2*@system.traits.strength.value", - "priority": 21 + "priority": null } ], "disabled": false, @@ -162,13 +162,13 @@ "key": "system.bonuses.damage.magical.bonus", "mode": 2, "value": "4*@system.traits.strength.value", - "priority": 21 + "priority": null }, { "key": "system.bonuses.damage.physical.bonus", "mode": 2, "value": "4*@system.traits.strength.value", - "priority": 21 + "priority": null } ], "disabled": false, diff --git a/src/packs/domains/domainCard_Rise_Up_oDIZoC4l19Nli0Fj.json b/src/packs/domains/domainCard_Rise_Up_oDIZoC4l19Nli0Fj.json index 38c900b2..28fd2f1f 100644 --- a/src/packs/domains/domainCard_Rise_Up_oDIZoC4l19Nli0Fj.json +++ b/src/packs/domains/domainCard_Rise_Up_oDIZoC4l19Nli0Fj.json @@ -106,7 +106,7 @@ "key": "system.damageThresholds.severe", "mode": 2, "value": "@system.proficiency", - "priority": 21 + "priority": null } ], "disabled": false, @@ -119,7 +119,7 @@ "startRound": null, "startTurn": null }, - "description": "

Gain a bonus to your Severe threshold equal to your Proficiency.

", + "description": "

Gain a bonus to your Severe threshold equal to your Proficiency.

", "origin": null, "tint": "#ffffff", "transfer": true, diff --git a/src/packs/domains/domainCard_Untouchable_9QElncQUDSakuSdR.json b/src/packs/domains/domainCard_Untouchable_9QElncQUDSakuSdR.json index 11a1a841..b1563416 100644 --- a/src/packs/domains/domainCard_Untouchable_9QElncQUDSakuSdR.json +++ b/src/packs/domains/domainCard_Untouchable_9QElncQUDSakuSdR.json @@ -37,7 +37,7 @@ "key": "system.evasion", "mode": 2, "value": "ceil(@system.traits.agility.value / 2)", - "priority": 21 + "priority": null } ], "disabled": false, diff --git a/src/packs/domains/domainCard_Zone_of_Protection_lOZaRb4fCVgQsWB5.json b/src/packs/domains/domainCard_Zone_of_Protection_lOZaRb4fCVgQsWB5.json index 5669173d..681dc276 100644 --- a/src/packs/domains/domainCard_Zone_of_Protection_lOZaRb4fCVgQsWB5.json +++ b/src/packs/domains/domainCard_Zone_of_Protection_lOZaRb4fCVgQsWB5.json @@ -4,7 +4,7 @@ "type": "domainCard", "folder": "OwsbTSWzKq2WJmQN", "system": { - "description": "

Make a Spellcast Roll (16). Once per long rest on a success, choose a point within Far range and create a visible zone of protection there for all allies within Very Close range of that point. When you do, place a d6 on this card with the 1 value facing up. When an ally in this zone takes damage, they reduce it by the die’s value. You then increase the die’s value by one. When the die’s value would exceed 6, this effect ends.

@Template[type:emanation|range:vc]

", + "description": "

Make a Spellcast Roll (16). Once per long rest on a success, choose a point within Far range and create a visible zone of protection there for all allies within Very Close range of that point. When you do, place a d6 on this card with the 1 value facing up. When an ally in this zone takes damage, they reduce it by the die’s value. You then increase the die’s value by one. When the die’s value would exceed 6, this effect ends.

@Template[type:emanation|range:vc]

", "domain": "splendor", "recallCost": 2, "level": 6, diff --git a/src/packs/environments/environment_Abandoned_Grove_pGEdzdLkqYtBhxnG.json b/src/packs/environments/environment_Abandoned_Grove_pGEdzdLkqYtBhxnG.json index c1006da4..4d9be4f8 100644 --- a/src/packs/environments/environment_Abandoned_Grove_pGEdzdLkqYtBhxnG.json +++ b/src/packs/environments/environment_Abandoned_Grove_pGEdzdLkqYtBhxnG.json @@ -49,7 +49,7 @@ "width": 1, "height": 1, "texture": { - "src": "systems/daggerheart/assets/icons/documents/actors/forest.svg", + "src": "AbominationVaults.webp", "anchorX": 0.5, "anchorY": 0.5, "offsetX": 0, @@ -67,10 +67,10 @@ "disposition": -1, "displayBars": 0, "bar1": { - "attribute": null + "attribute": "resources.hitPoints" }, "bar2": { - "attribute": null + "attribute": "resources.stress" }, "light": { "negative": false, @@ -118,7 +118,7 @@ "ring": null, "background": null }, - "effects": 0, + "effects": 1, "subject": { "scale": 1, "texture": null @@ -249,8 +249,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "maK5OyfrOxcjCoPt", "img": "icons/magic/nature/root-vine-spiral-thorns-teal.webp", @@ -314,8 +313,7 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "uG5A2XQuUcPsXzgP", "img": "icons/magic/nature/hand-weapon-wood-bark-brown.webp", @@ -363,8 +361,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "3kkkbnWEvXk5TPK8", "img": "icons/magic/unholy/strike-hand-glow-pink.webp", diff --git a/src/packs/environments/environment_Ambushed_uGEdNYERCTJBEjc5.json b/src/packs/environments/environment_Ambushed_uGEdNYERCTJBEjc5.json index b0ccd435..b32128dd 100644 --- a/src/packs/environments/environment_Ambushed_uGEdNYERCTJBEjc5.json +++ b/src/packs/environments/environment_Ambushed_uGEdNYERCTJBEjc5.json @@ -221,8 +221,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "HfuVxgVidIVsapvI", "img": "icons/magic/perception/shadow-stealth-eyes-purple.webp", diff --git a/src/packs/environments/environment_Ambushers_uXZpebPR77YQ1oXI.json b/src/packs/environments/environment_Ambushers_uXZpebPR77YQ1oXI.json index e8ba889a..ed40af4a 100644 --- a/src/packs/environments/environment_Ambushers_uXZpebPR77YQ1oXI.json +++ b/src/packs/environments/environment_Ambushers_uXZpebPR77YQ1oXI.json @@ -183,8 +183,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "b6Qviz1ANG8OrAYq", "img": "icons/skills/wounds/injury-face-impact-orange.webp", diff --git a/src/packs/environments/environment_Burning_Heart_of_the_Woods_oY69NN4rYxoRE4hl.json b/src/packs/environments/environment_Burning_Heart_of_the_Woods_oY69NN4rYxoRE4hl.json index dc42fb07..81ce16f9 100644 --- a/src/packs/environments/environment_Burning_Heart_of_the_Woods_oY69NN4rYxoRE4hl.json +++ b/src/packs/environments/environment_Burning_Heart_of_the_Woods_oY69NN4rYxoRE4hl.json @@ -252,8 +252,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "1aOeMMX0XuDtZbbB", "img": "icons/magic/nature/root-vine-spiral-thorns-teal.webp", @@ -392,8 +391,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "JKFkDvwUOP35Tsr1", "img": "icons/creatures/magical/construct-face-stone-pink.webp", @@ -459,8 +457,7 @@ } } ], - "includeBase": false, - "direct": true + "includeBase": false }, "target": { "type": "any", @@ -510,8 +507,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "kYxuTZjH7HDUGeWh", "img": "icons/magic/air/fog-gas-smoke-brown.webp", diff --git a/src/packs/environments/environment_Bustling_Marketplace_HZKA7hkej7JJY503.json b/src/packs/environments/environment_Bustling_Marketplace_HZKA7hkej7JJY503.json index ad96108b..b0b5b591 100644 --- a/src/packs/environments/environment_Bustling_Marketplace_HZKA7hkej7JJY503.json +++ b/src/packs/environments/environment_Bustling_Marketplace_HZKA7hkej7JJY503.json @@ -168,8 +168,7 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "60uDqt9omFifZ7xd", "img": "icons/commodities/treasure/brooch-jeweled-pink.webp", @@ -292,8 +291,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "56qjiKMoN6S9riI6", "img": "icons/skills/social/theft-pickpocket-bribery-brown.webp", @@ -318,8 +316,7 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "l2FzZpR2reVmlkdp", "img": "icons/skills/movement/arrow-upward-blue.webp", diff --git a/src/packs/environments/environment_Castle_Siege_1eZ32Esq7rfZOjlu.json b/src/packs/environments/environment_Castle_Siege_1eZ32Esq7rfZOjlu.json index 411a10c7..80344b0f 100644 --- a/src/packs/environments/environment_Castle_Siege_1eZ32Esq7rfZOjlu.json +++ b/src/packs/environments/environment_Castle_Siege_1eZ32Esq7rfZOjlu.json @@ -277,8 +277,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "eSTq8Y0v4Dwd13XU", "img": "icons/weapons/artillery/catapult-simple.webp", @@ -303,8 +302,7 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "U59K0WKVjwbgzMZU", "img": "icons/environment/people/charge.webp", @@ -403,8 +401,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "bemKmwjBtbEFVWXM", "img": "icons/magic/earth/projectile-stone-boulder-brown.webp", diff --git a/src/packs/environments/environment_Chaos_Realm_2Z1mKc65LxNk2PqR.json b/src/packs/environments/environment_Chaos_Realm_2Z1mKc65LxNk2PqR.json index 77781de0..9ceca2a6 100644 --- a/src/packs/environments/environment_Chaos_Realm_2Z1mKc65LxNk2PqR.json +++ b/src/packs/environments/environment_Chaos_Realm_2Z1mKc65LxNk2PqR.json @@ -335,8 +335,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "0OYHJZqT0DlVz5be", "img": "icons/magic/control/sihouette-hold-beam-green.webp", @@ -442,8 +441,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "RNbAdBZM6gDNaRPn", "img": "icons/magic/unholy/energy-smoke-pink.webp", @@ -498,8 +496,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "SZpUJeJETVQtZwae", "img": "icons/creatures/unholy/demons-horned-glowing-pink.webp", @@ -577,8 +574,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "MyIh4CJsDnkjmeYs", "img": "icons/magic/perception/hand-eye-pink.webp", diff --git a/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json b/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json index 548cf7c4..e72ac02e 100644 --- a/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json +++ b/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json @@ -462,8 +462,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "EP4FXeQqbqFGQoIX", "img": "icons/skills/movement/arrow-down-pink.webp", diff --git a/src/packs/environments/environment_Cult_Ritual_QAXXiOKBDmCTauHD.json b/src/packs/environments/environment_Cult_Ritual_QAXXiOKBDmCTauHD.json index 705c9585..80074b2e 100644 --- a/src/packs/environments/environment_Cult_Ritual_QAXXiOKBDmCTauHD.json +++ b/src/packs/environments/environment_Cult_Ritual_QAXXiOKBDmCTauHD.json @@ -195,8 +195,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "0Rgqw1kUPeJ11ldd", "img": "icons/magic/unholy/orb-swirling-teal.webp", @@ -371,8 +370,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "oFfu3hUhp4ta4qwT", "img": "icons/magic/unholy/barrier-fire-pink.webp", @@ -397,8 +395,7 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "WltEUhtYwfnX8WCc", "img": "icons/skills/wounds/blood-drip-droplet-red.webp", diff --git a/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json b/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json index aacf87e9..ada17126 100644 --- a/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json +++ b/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json @@ -279,8 +279,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "OWUM3eFiZrIn0Bjd", "img": "icons/magic/unholy/orb-hands-pink.webp", @@ -385,8 +384,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "CL3wPZNOtw6m5WVT", "img": "icons/magic/unholy/hand-light-pink.webp", @@ -563,8 +561,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "AJdG1krRvixBFCZG", "img": "icons/magic/unholy/silhouette-robe-evil-glow.webp", @@ -641,8 +638,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "GUAo44cJCnS1GE9p", "img": "icons/magic/unholy/barrier-fire-pink.webp", diff --git a/src/packs/environments/environment_Hallowed_Temple_dsA6j69AnaJhUyqH.json b/src/packs/environments/environment_Hallowed_Temple_dsA6j69AnaJhUyqH.json index f005fa59..342039be 100644 --- a/src/packs/environments/environment_Hallowed_Temple_dsA6j69AnaJhUyqH.json +++ b/src/packs/environments/environment_Hallowed_Temple_dsA6j69AnaJhUyqH.json @@ -226,7 +226,7 @@ "name": "Divine Guidance", "type": "feature", "system": { - "description": "

A PC who prays to a deity while in the Hallowed Temple can make an Instinct Roll to receive answers. If the god they beseech isn’t welcome in this temple, the roll is made with disadvantage.

  • Critical Success: The PC gains clear information. Additionally, they gain [[/r 1d4]] Hope, which can be distributed between the party if they share the vision and guidance they received.

  • Success with Hope: The PC receives clear information.

  • Success with Fear: The PC receives brief flashes of insight and an emotional impression conveying an answer.

  • Any Failure: The PC receives only vague flashes. They can mark a Stress to receive one clear image without context.

What does it feel like as you are touched by this vision? What feeling lingers after the images have passed?

", + "description": "

A PC who prays to a deity while in the Hallowed Temple can make an Instinct Roll to receive answers. If the god they beseech isn’t welcome in this temple, the roll is made with disadvantage.

  • Critical Success: The PC gains clear information. Additionally, they gain [[/r 1d4]] Hope, which can be distributed between the party if they share the vision and guidance they received.

  • Success with Hope: The PC receives clear information.

  • Success with Fear: The PC receives brief flashes of insight and an emotional impression conveying an answer.

  • Any Failure: The PC receives only vague flashes. They can mark a Stress to receive one clear image without context.

What does it feel like as you are touched by this vision? What feeling lingers after the images have passed?
", "resource": null, "actions": {}, "originItemType": null, @@ -308,8 +308,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "vICfHK2urDQ2Jm8s", "img": "icons/magic/holy/barrier-shield-winged-blue.webp", @@ -364,8 +363,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "8tGAuFRyM4onvQ2o", "img": "icons/magic/holy/projectiles-blades-salvo-yellow.webp", diff --git a/src/packs/environments/environment_Haunted_City_OzYbizKraK92FDiI.json b/src/packs/environments/environment_Haunted_City_OzYbizKraK92FDiI.json index 1bd07a57..30a436bd 100644 --- a/src/packs/environments/environment_Haunted_City_OzYbizKraK92FDiI.json +++ b/src/packs/environments/environment_Haunted_City_OzYbizKraK92FDiI.json @@ -259,8 +259,7 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "ZA2RzxH5FlnrcYLN", "img": "icons/magic/death/undead-ghosts-trio-blue.webp", @@ -332,8 +331,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "i0FV2Djaq0vB57cq", "img": "icons/magic/death/skull-weapon-staff-glow-pink.webp", diff --git a/src/packs/environments/environment_Imperial_Court_jr1xAoXzVwVblzxI.json b/src/packs/environments/environment_Imperial_Court_jr1xAoXzVwVblzxI.json index 4b49c341..5af29dd0 100644 --- a/src/packs/environments/environment_Imperial_Court_jr1xAoXzVwVblzxI.json +++ b/src/packs/environments/environment_Imperial_Court_jr1xAoXzVwVblzxI.json @@ -268,8 +268,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "tm9FL5gJF7Oheu21", "img": "icons/magic/death/skull-energy-light-white.webp", @@ -341,8 +340,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "HwSKX5r40ux0OfJN", "img": "icons/sundries/documents/document-sealed-red-white.webp", @@ -421,8 +419,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "YPMgWUagVq1Hicqo", "img": "icons/magic/perception/orb-eye-scrying.webp", diff --git a/src/packs/environments/environment_Local_Tavern_cM4X81DOyvxNIi52.json b/src/packs/environments/environment_Local_Tavern_cM4X81DOyvxNIi52.json index 105f230f..8ff4d3b5 100644 --- a/src/packs/environments/environment_Local_Tavern_cM4X81DOyvxNIi52.json +++ b/src/packs/environments/environment_Local_Tavern_cM4X81DOyvxNIi52.json @@ -201,8 +201,7 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "cAbSo5VQHxJqJPKm", "img": "icons/magic/unholy/silhouette-robe-evil-power.webp", @@ -223,12 +222,11 @@ "name": "Someone Comes to Town", "type": "feature", "system": { - "description": "

Introduce a significant NPC who wants to hire the party for something or who relates to a PC’s background.

Did they know the PCs were here? What do they want in this town?

", + "description": "

Introduce a signifi cant NPC who wants to hire the party for something or who relates to a PC’s background.

Did they know the PCs were here? What do they want in this town?

", "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "QPezCAC18vIc5xRC", "img": "icons/environment/people/commoner.webp", @@ -305,8 +303,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "H3LNvVrUbsAkgjni", "img": "icons/skills/melee/unarmed-punch-fist-white.webp", diff --git a/src/packs/environments/environment_Mountain_Pass_acMu9wJrMZZzLSTJ.json b/src/packs/environments/environment_Mountain_Pass_acMu9wJrMZZzLSTJ.json index 8e7cf1c8..3be39fc8 100644 --- a/src/packs/environments/environment_Mountain_Pass_acMu9wJrMZZzLSTJ.json +++ b/src/packs/environments/environment_Mountain_Pass_acMu9wJrMZZzLSTJ.json @@ -222,8 +222,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "jkm03DXYYajsRk2j", "img": "icons/magic/earth/projectile-boulder-dust.webp", @@ -248,8 +247,7 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "hkZVEduCWJFR0h2S", "img": "icons/creatures/birds/corvid-flying-wings-purple.webp", @@ -384,8 +382,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "K8ld4m5yTA6WZwUs", "img": "icons/magic/water/snowflake-ice-blue-white.webp", diff --git a/src/packs/environments/environment_Necromancer_s_Ossuary_h3KyRL7AshhLAmcH.json b/src/packs/environments/environment_Necromancer_s_Ossuary_h3KyRL7AshhLAmcH.json index e96b9177..1cb43050 100644 --- a/src/packs/environments/environment_Necromancer_s_Ossuary_h3KyRL7AshhLAmcH.json +++ b/src/packs/environments/environment_Necromancer_s_Ossuary_h3KyRL7AshhLAmcH.json @@ -311,8 +311,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "asSGMUdf4gG4PO8F", "img": "icons/magic/death/bones-crossed-gray.webp", @@ -384,8 +383,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "mnpqMpYCjdlwtvBp", "img": "icons/magic/death/skull-weapon-staff-glow-pink.webp", @@ -440,8 +438,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "chJRXNg5zyTGbcG5", "img": "icons/magic/death/undead-zombie-grave-green.webp", diff --git a/src/packs/environments/environment_Outpost_Town_YezryR32uo39xRxW.json b/src/packs/environments/environment_Outpost_Town_YezryR32uo39xRxW.json index bc3c211d..d0f4eae2 100644 --- a/src/packs/environments/environment_Outpost_Town_YezryR32uo39xRxW.json +++ b/src/packs/environments/environment_Outpost_Town_YezryR32uo39xRxW.json @@ -222,8 +222,7 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "uxu8YrvYVxP3Qc2y", "img": "icons/skills/melee/unarmed-punch-fist-yellow-red.webp", @@ -278,8 +277,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "reaction" + "originId": null }, "_id": "21tdueq5Wgvj3vG4", "img": "icons/environment/settlement/watchtower-moonlit-blue.webp", diff --git a/src/packs/environments/environment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json b/src/packs/environments/environment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json index 7be27924..36e21f82 100644 --- a/src/packs/environments/environment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json +++ b/src/packs/environments/environment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json @@ -172,8 +172,7 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "fnvOiHKsd34EaLqG", "img": "icons/magic/fire/flame-burning-building.webp", @@ -279,8 +278,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "r9kkodHghWm01mje", "img": "icons/magic/fire/explosion-flame-lightning-strike.webp", @@ -305,8 +303,7 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "ZAIvH5CfhehW48EY", "img": "icons/environment/people/charge.webp", diff --git a/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json b/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json index 5c973fa6..40dbb1c6 100644 --- a/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json +++ b/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json @@ -296,8 +296,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "WsNoSwwtv0r80BMj", "img": "icons/magic/water/wave-water-teal.webp", @@ -391,8 +390,7 @@ } }, "originItemType": null, - "originId": null, - "featureForm": "action" + "originId": null }, "_id": "SDTS3LOPMVJOt1S1", "img": "icons/creatures/reptiles/snake-fangs-bite-green-yellow.webp", diff --git a/src/packs/items/armors/armor_Bare_Bones_ITAjcigTcUw5pMCN.json b/src/packs/items/armors/armor_Bare_Bones_ITAjcigTcUw5pMCN.json index 5158b100..5c061083 100644 --- a/src/packs/items/armors/armor_Bare_Bones_ITAjcigTcUw5pMCN.json +++ b/src/packs/items/armors/armor_Bare_Bones_ITAjcigTcUw5pMCN.json @@ -39,7 +39,7 @@ "key": "system.armorScore", "mode": 2, "value": "@system.traits.strength.value", - "priority": 21 + "priority": null } ], "disabled": false, diff --git a/src/packs/items/armors/armor_Elundrian_Chain_Armor_Q6LxmtFetDDkoZVZ.json b/src/packs/items/armors/armor_Elundrian_Chain_Mail_Q6LxmtFetDDkoZVZ.json similarity index 94% rename from src/packs/items/armors/armor_Elundrian_Chain_Armor_Q6LxmtFetDDkoZVZ.json rename to src/packs/items/armors/armor_Elundrian_Chain_Mail_Q6LxmtFetDDkoZVZ.json index d63ce4df..d8b938fd 100644 --- a/src/packs/items/armors/armor_Elundrian_Chain_Armor_Q6LxmtFetDDkoZVZ.json +++ b/src/packs/items/armors/armor_Elundrian_Chain_Mail_Q6LxmtFetDDkoZVZ.json @@ -1,6 +1,6 @@ { "folder": "hLn0v6ov6KuFgptu", - "name": "Elundrian Chain Armor", + "name": "Elundrian Chain Mail", "type": "armor", "_id": "Q6LxmtFetDDkoZVZ", "img": "icons/equipment/chest/breastplate-sculpted-green.webp", @@ -42,8 +42,7 @@ { "key": "system.resistance.magical.reduction", "mode": 2, - "value": "@system.armorScore", - "priority": 21 + "value": "@system.armorScore" } ], "_id": "xGxqTCO8MjNq5Cw6", diff --git a/src/packs/items/consumables/consumable_Stardrop_y4c1jrlHrf0wBWOq.json b/src/packs/items/consumables/consumable_Stardrop_y4c1jrlHrf0wBWOq.json index 1a8800cd..91cc1861 100644 --- a/src/packs/items/consumables/consumable_Stardrop_y4c1jrlHrf0wBWOq.json +++ b/src/packs/items/consumables/consumable_Stardrop_y4c1jrlHrf0wBWOq.json @@ -4,7 +4,7 @@ "_id": "y4c1jrlHrf0wBWOq", "img": "icons/magic/light/projectiles-star-purple.webp", "system": { - "description": "

You can use this stardrop to summon a hailstorm of comets that deals 8d20 physical damage to all targets within Very Far range.

", + "description": "

You can use this stardrop to summon a hailstorm of comets that deals 8d20 physical damage to all targets within Very Far range.

@Template[type:emanation|range:vf]

", "quantity": 1, "actions": { "pt5U6hlyx4T7MUOa": { diff --git a/src/packs/items/weapons/weapon_Buckler_EmFTp9wzT6MHSaNz.json b/src/packs/items/weapons/weapon_Buckler_EmFTp9wzT6MHSaNz.json index 4d815a6c..86859acd 100644 --- a/src/packs/items/weapons/weapon_Buckler_EmFTp9wzT6MHSaNz.json +++ b/src/packs/items/weapons/weapon_Buckler_EmFTp9wzT6MHSaNz.json @@ -155,8 +155,7 @@ { "key": "system.evasion", "mode": 2, - "value": "@system.armorScore", - "priority": 21 + "value": "@system.armorScore" } ], "transfer": false, diff --git a/src/packs/items/weapons/weapon_Flickerfly_Blade_xLJ5RRpUoTRmAC3G.json b/src/packs/items/weapons/weapon_Flickerfly_Blade_xLJ5RRpUoTRmAC3G.json index 5dd5f04e..a00d4767 100644 --- a/src/packs/items/weapons/weapon_Flickerfly_Blade_xLJ5RRpUoTRmAC3G.json +++ b/src/packs/items/weapons/weapon_Flickerfly_Blade_xLJ5RRpUoTRmAC3G.json @@ -117,8 +117,7 @@ { "key": "system.bonuses.damage.primaryWeapon.bonus", "mode": 2, - "value": "@system.traits.agility.value", - "priority": 21 + "value": "@system.traits.agility.value" } ], "_id": "jMIrOhpPUncn7dWg", diff --git a/src/packs/journals/journal_Daggerheart_SRD_uNs7ne9VCbbu5dcG.json b/src/packs/journals/journal_Daggerheart_SRD_uNs7ne9VCbbu5dcG.json index 944467eb..1c7bff64 100644 --- a/src/packs/journals/journal_Daggerheart_SRD_uNs7ne9VCbbu5dcG.json +++ b/src/packs/journals/journal_Daggerheart_SRD_uNs7ne9VCbbu5dcG.json @@ -125,7 +125,7 @@ "image": {}, "text": { "format": 1, - "content": "

FLOW OF THE GAME

Daggerheart is a conversation. The GM describes fictional scenarios involving the PCs, and the players take turns describing how their characters react. The goal of every person at the table is to build upon everyone else’s ideas and collaboratively tell a satisfying story. The system facilitates this collaborative process by providing structure to the conversation and mechanics for resolving moments of tension where fate or fortune determine the outcome of events.

PLAYER PRINCIPLES & BEST PRACTICES

To get the most out of Daggerheart, we recommend players keep the following principles and practices in mind throughout each session:

PRINCIPLES

  • Be a fan of your character and their journey.

  • Spotlight your friends.

  • Address the characters and address the players.

  • Build the world together.

  • Play to find out what happens.

  • Hold on gently.

BEST PRACTICES

  • Embrace danger.

  • Use your resources.

  • Tell the story.

  • Discover your character.

For more information, see the Daggerheart Core Rulebook, pages 9 and 108.

CORE GAMEPLAY LOOP

The core gameplay loop is the procedure that drives every scene, both in and out of combat:

STEP 1: SET THE SCENE

The GM describes a scenario, establishing the PCs’ surroundings and any dangers, NPCs, or other important details the characters would notice.

STEP 2: ASK AND ANSWER QUESTIONS

The players ask clarifying questions to explore the scene more deeply and gather information that could inform their characters’ actions. The GM responds to these questions by giving the players information their characters could easily obtain, or by asking questions of their own to the players. The players also respond to any questions the GM poses to them.

In this way, the table builds out the fiction collaboratively.

STEP 3: BUILD ON THE FICTION

As the scene develops, the players find opportunities to take action—problems to solve, obstacles to overcome, mysteries to investigate, and so on. The players describe how their characters proceed; if their proposed actions carry no chance of failure (or if failure would be boring), they automatically succeed. But if the outcome of their action is unknown, the GM calls for an action roll. Either way, the table works the outcome into the story and moves the fiction forward, narrating how the PC’s actions have changed things.

STEP 4: GO BACK TO STEP 1

The process repeats from the beginning, with the GM relaying any updated details or material changes to the players. This process continues until the end of the scene is triggered by a mechanic or arrives organically.

THE SPOTLIGHT

The spotlight is a symbol that represents the table’s attention—and therefore the immediate focus of both the narrative and the game mechanics. Any time a character or player becomes the focus of a scene, they “are in the spotlight” or “have the spotlight.”

The spotlight moves around the table organically as scenes unfold unless a mechanical trigger determines where the spotlight goes next. For example, when a player fails an action roll, the mechanics prompt the GM to seize the spotlight and make a GM move.

TURN ORDER & ACTION ECONOMY

Daggerheart’s turns don’t follow a traditional, rigid format:
there is no explicit initiative mechanic and characters don’t have a set number of actions they can take or things they can do before the spotlight passes to someone else. A player with the spotlight describes what their character does and the spotlight simply swings to whoever:

  1. the fiction would naturally turn it toward

  2. hasn’t had the focus in a while, or

  3. a triggered mechanic puts it on


Optional: Spotlight Tracker Tool

If your group prefers a more traditional action economy, you can use tokens to track how many times a player has had the spotlight: At the start of a session or scene, each player adds a certain number of tokens (we recommend 3) to their character sheet and removes a token each time they take an action. If the spotlight would swing to someone without any tokens, it swings to someone else instead. Once every player has used all their available tokens, players refill their character sheet with the same number of tokens as before, then continue playing.


MAKING MOVES & TAKING ACTION

Any time a character does something to advance the story, such as speaking with another character, interacting with the environment, making an attack, casting a spell, or using a class feature, they are making a move.

ACTION ROLLS

Any move where success would be trivial or failure would be boring automatically succeeds, but any move that’s difficult to accomplish or risky to attempt triggers an action roll.

OVERVIEW

All action rolls require a pair of d12s called Duality Dice.

These are two visually distinct twelve-sided dice, with one die representing Hope and the other representing Fear.

To make an action roll, you roll the Duality Dice, sum the results, apply any relevant modifiers, and compare the total to a Difficulty number to determine the outcome:

  • Success with Hope: If your total meets or beats the difficulty AND your Hope Die shows a higher result than your Fear Die, you rolled a “Success with Hope.” You succeed and gain a Hope.

  • Success with Fear: If your total meets or beats the Difficulty AND your Fear Die shows a higher result than your Hope Die, you rolled a “Success with Fear.” You succeed with a cost or complication, but the GM gains a Fear.

  • Failure with Hope: If your total is less than the Difficulty AND your Hope Die shows a higher result than your Fear Die, you rolled a “Failure with Hope.” You fail with a minor consequence and gain a Hope, then the spotlight swings to the GM.

  • Failure with Fear: If your total is less than the Difficulty AND your Fear Die shows a higher result than your Hope Die, you rolled a “Failure with Fear.” You fail with a major consequence and the GM gains a Fear, then the spotlight swings to the GM.

  • Critical Success: If the Duality Dice show matching results, you rolled a “Critical Success” (“Crit”). You automatically succeed with a bonus, gain a Hope, and clear a Stress. If this was an attack roll, you deal critical damage.

Note: A Critical Success counts as a roll “with Hope.”

After resolving the action roll, the table works together to weave the outcome into the narrative and play continues.

FAILING FORWARD

In Daggerheart, every time you roll the dice, the scene changes in some way. There is no such thing as a roll where “nothing happens,” because the fiction constantly evolves based on the successes and failures of the characters.

PROCEDURE

The following steps describe in more detail the procedure that all action rolls utilize:

STEP 1: PICK AN APPROPRIATE TRAIT

Some actions and effects specify in their description which trait applies to the roll; otherwise, the GM tells the acting player which character trait best applies to the action being attempted. If more than one trait could apply to the roll, the GM chooses or lets the acting player decide.

STEP 2: DETERMINE THE DIFFICULTY

Some actions and features say in their description what the Difficulty is. Otherwise, the GM determines the Difficulty based on the scenario. The GM can choose whether to share the Difficulty with the table. In either case, the GM should communicate the potential consequences of failure to the acting player.

STEP 3: APPLY EXTRA DICE AND MODIFIERS

The acting player decides whether to Utilize an Experience or activate other effects, then, if applicable, adds the appropriate tokens and dice (such as advantage or Rally dice) to their dice pool.


Note: Unless an action, ability, or feature specifically allows for it, a player must declare the use of any Experiences, extra dice, or other modifiers before they roll.


STEP 4: ROLL THE DICE

The acting player rolls their entire dice pool and announces the results in the format of “[total result] with [Hope/Fear]”— or “Critical Success!” in the case of matching Duality Dice.


Example: A player is making an action roll with a +1 in the relevant trait and no other modifiers; they roll the Duality Dice and get a result of 5 on their Hope Die and 7 on their Fear Die, then announce “I rolled a 13 with Fear!”


STEP 5: RESOLVE THE OUTCOME

The active player and the GM work together, along with the suggestions and support of the rest of the table, to resolve the outcome of the action.

GM MOVES AND ADVERSARY ACTIONS

GMs also make moves. They should consider making a move when a player does one of the following things:

  • Rolls with Fear on an action roll.

  • Fails an action roll.

  • Does something that would have consequences.

  • Gives them a golden opportunity.

  • Looks to them for what happens next.

After the GM turn is done, the spotlight goes back to the PCs.

Many adversaries and environments have Fear Features, especially powerful or consequential moves that the GM must spend Fear to activate.


Note: This Fear is in addition to any Fear the GM has previously spent to seize the spotlight or activate another action or ability.


ADVERSARY ACTIONS

When play passes to the GM, the GM can make a GM move to spotlight an adversary. A spotlighted adversary can:

  • Move within Close range and make a standard attack

  • Move within Close range and use an adversary action

  • Clear a condition

  • Sprint within Far or Very Far range on the battlefield

  • Do anything else the fiction demands or the GM deems appropriate

The GM can spend additional Fear to spotlight additional adversaries. Once the GM has finished, the spotlight swings back to the PCs.

SPECIAL ROLLS

Some rolls have unique specifications or otherwise modify the action roll procedure: trait rolls, Spellcast Rolls, attack rolls, and damage rolls. Unless otherwise noted, you can apply any bonus, modifier, or effect to a special roll as if it were a standard action roll.

TRAIT ROLLS

An action roll that specifies which character trait applies to it is called a trait roll. In the text of a feature or effect, a trait roll is referenced with the format “[Trait] Roll (Difficulty)” (e.g., “Agility Roll (12)”). If the text of an effect doesn’t specify a trait roll’s Difficulty, the GM sets the Difficulty based on the circumstances.

Features and effects that affect a trait roll also affect any action roll that uses the same trait, including attack rolls, Spellcast rolls, and standard action rolls.


Example: The katari’s ancestry feature “Feline Instincts,” which allows the katari to reroll an Agility Roll, can also be used on a standard action roll using Agility to traverse dangerous terrain or on an attack roll made with a weapon that uses Agility.


SPELLCAST ROLLS

Spellcast Rolls are trait rolls that require you to use your Spellcast trait. Your Spellcast trait, if you have one, is determined by your subclass.

Spellcast Rolls are only made when a character uses a feature that requires one. A successful Spellcast Roll activates the effect as described by the feature.


Notes: A Spellcast Roll that can damage a target is also considered an attack roll.

When you cast a spell, the text tells you when the effect ends. The GM can spend a Fear to end a temporary effect. If your spell doesn’t specify when it ends, it ends when you choose or at a natural moment of the story. You can choose to end your spell early.

You can cast and maintain the effects of more than one spell at the same time.


REACTION ROLLS

A reaction roll is made in response to an attack or a hazard, representing a character’s attempt to avoid or withstand an imminent effect.

Reaction rolls work like action rolls, except they don’t generate Hope or Fear, don’t trigger additional GM moves, and other characters can’t aid you with Help an Ally.

If you critically succeed on a reaction roll, you don’t clear a Stress or gain a Hope, but you do ignore any effects that would have impacted you on a success, such as taking damage or marking Stress.

GROUP ACTION ROLLS

When multiple PCs take action together, the party chooses one PC to lead the action. Each other player then describes how their character collaborates on the task. The leader makes an action roll as usual, while the other players make reaction rolls using whichever traits they and the GM decide fit best.

The lead character gains a +1 bonus to their lead action roll for each of these reaction rolls that succeeded and a −1 penalty for each these reaction rolls that failed.

TAG TEAM ROLLS

Each player can, once per session, initiate a Tag Team Roll between their character and another PC by spending 3 Hope. The players work with one another to describe how they combine their actions in a unique and exciting way. Both players make separate action rolls; before resolving the roll’s outcome, choose one of the rolls to apply to both actions. On a roll with Hope, all PCs involved gain a Hope. On a roll with Fear, the GM gains a Fear token for each PC involved.

On a successful Tag Team attack roll, both players roll damage and add the totals together to determine the damage dealt, which is then treated as if it came from a single source. If the attacks deal different types of damage, the players choose which type to deal.


Notes:

A Tag Team Roll counts as a single action roll for the purposes of any countdowns or features that track action rolls.

Though each player may only initiate one Tag Team Roll per session, one PC can be involved in multiple Tag Team Rolls.


ADVANTAGE & DISADVANTAGE

Some features and effects let you roll with advantage or disadvantage on an action or reaction roll:

  • Advantage represents an opportunity that you seize to increase your chances of success. When you roll with advantage, you roll a d6 advantage die with your dice pool and add its result to your total.

  • Disadvantage represents an additional difficulty, hardship, or challenge you face when attempting an action. When you roll with disadvantage, you roll a d6 disadvantage die with your dice pool and subtract its result from your total.

Advantage or disadvantage can be granted or imposed by mechanical triggers or at the GM’s discretion. When a PC aids you with Help an Ally, they roll their own advantage die and you add it to your total.

Advantage and disadvantage dice cancel each out, one-for-one, when they would be added to the same dice pool, so you’ll never roll both at the same time. If you have advantage or disadvantage from other sources that don’t affect your own dice pool, such as another player’s Help an Ally move, their effects stack with your rolled results.

HOPE & FEAR

Hope and Fear are metacurrencies representing the cosmic forces that shape the events of your table’s story. Hope powers PC abilities and features, while Fear powers the abilities of the GM and the adversaries and environments they control.

HOPE

Every PC starts with 2 Hope at character creation and gains more throughout play. A PC can have a maximum of 6 Hope at one time, and Hope carries over between sessions.

Players can spend Hope to:

  • Help an Ally

    When you Help an Ally who is making an action roll, describe how you do so and roll an advantage die. Multiple players can spend Hope to help the same acting player, but that player only adds the highest result to their final total.

  • Utilize an Experience

    When you Utilize an Experience on a relevant roll, add its modifier to the result. You can spend multiple Hope to utilize multiple Experiences.

  • Initiate a Tag Team Roll

    Spend 3 Hope to initiate a Tag Team roll, combining the actions of two PCs into one impressive act of synergy. When you make a Tag Team roll, both players roll their action rolls and then choose which set of results to apply to the outcome.

  • Activate a Hope Feature

    A Hope Feature is any effect that allows (or requires) you to spend a specified amount of Hope to activate it. Class Hope features are class-specific features, detailed on your character sheet, that cost 3 Hope to activate


Note: When using a Hope Feature, if you rolled with Hope for that action, the Hope you gain from that roll can be spent on that feature (or toward it, if it requires spending multiple Hope).


FEAR

The GM gains Fear whenever a player rolls with Fear and can spend Fear at any time to make or enhance a GM move or to use a Fear Feature. The GM can have up to 12 Fear at one time. Fear carries over between sessions.

COMBAT

Though Daggerheart relies on the same flow of collaborative storytelling in and out of combat, physical conflicts rely more heavily on several key mechanics related to attacking, maneuvering, and taking damage.

EVASION

Evasion represents a character’s ability to avoid attacks and other unwanted effects. Any roll made against a PC has a Difficulty equal to the target’s Evasion. A PC’s base Evasion is determined by their class, but can be modified by domain cards, equipment, conditions, and other effects.


Note: attacks rolled against adversaries use the target’s Difficulty instead of Evasion.


HIT POINTS & DAMAGE THRESHOLDS

Hit Points (HP) represent a character’s ability to withstand physical injury. When a character takes damage, they mark 1 to 3 HP, based on their damage thresholds:

  • If the final damage is at or above the character’s Severe damage threshold, they mark 3 HP.

  • If the final damage is at or above the character’s Major damage threshold but below their Severe damage threshold, they mark 2 HP.

  • If the final damage is below the character’s Major damage threshold, they mark 1 HP.

  • If incoming damage is ever reduced to 0 or less, no HP is marked.

A PC’s damage thresholds are calculated by adding their level to the listed damage thresholds of their equipped armor. A PC’s starting HP is based on their class, but they can gain additional Hit Points through advancements, features, and other effects.

An adversary’s Damage Thresholds and HP are listed in their stat blocks.

When a character marks their last Hit Point, they fall. If a PC falls, they make a death move.

Characters can clear Hit Points by taking downtime moves (see: Downtime) or by activating relevant special abilities or effects.


Optional Rule: Massive Damage

If a character ever takes damage equal to twice their Severe threshold, they mark 4 HP instead of 3.


STRESS

Stress represents how much mental, physical, and emotional strain a character can endure. Some special abilities or effects require the character activating them to mark Stress, and the GM can require a PC to mark Stress as a GM move or to represent the cost, complication, or consequence of an action roll.

When a character marks their last Stress, they become Vulnerable (see: Conditions) until they clear at least 1 Stress.

When a character must mark 1 or more Stress but can’t, they mark 1 HP instead. A character can’t use a move that requires them to mark Stress if all of their Stress is marked.

PCs can clear Stress by making downtime moves (see: Downtime). A PC’s maximum Stress is determined by their class, but they can increase it through advancements, abilities, and other effects.

ATTACKING

ATTACK ROLLS

An attack roll is an action roll intended to inflict harm. The trait that applies to an attack roll is specified by the weapon or spell being used. Unarmed attack rolls use either Strength or Finesse (GM’s choice). An attack roll’s Difficulty, unless otherwise noted, is equal to the Difficulty score of its target.

DAMAGE ROLLS

On a successful attack, roll damage. Damage is calculated from the damage roll listed in the attack’s description with the format “xdy+[modifier]” (e.g., for a spell that inflicts “1d8+2” damage, you roll an eight-sided and add 2 to the result; the damage dealt is equal to the total).

Any time an effect says to deal damage using your Spellcast trait, you roll a number of dice equal to your Spellcast trait.


Note: If your Spellcast trait is +0 or lower, you don’t roll anything.


For weapons, the number of damage dice you roll is equal to your Proficiency. Note that your Proficiency multiplies the number of dice you roll, but doesn’t affect the modifier. For example, a PC with Proficiency 2 and wielding a weapon with adamage rating of “d8+2” deals damage equal to “2d8+2” on a successful attack.

Successful unarmed attacks inflict [Proficiency]d4 damage.

CRITICAL DAMAGE

When you get a critical success (i.e., you roll matching values on your Duality Dice) on an attack roll, you deal extra damage.

Make the damage roll as usual, but add the maximum possible result of the damage dice to the final total. For instance, if an attack would normally deal 2d8+1 damage, a critical success would deal 2d8+1+16.

DAMAGE TYPES

There are two damage types: physical damage (phy) and magic damage (mag). Unless stated otherwise, mundane weapons and unarmed attacks deal physical damage, and spells deal magic damage.

RESISTANCE, IMMUNITY, AND DIRECT DAMAGE

If a target has resistance to a damage type, then they reduce incoming damage of that type by half before comparing it to their Hit Point Thresholds. If the target has additional ways of reducing incoming damage, such as marking Armor Slots, they apply the resistance effect first. The effects of multiple resistances to the same damage type do not stack.

If a target has immunity to a damage type, they ignore incoming damage of that type.

If an attack deals both physical and magic damage, a character can only benefit from resistance or immunity if they are resistant or immune to both damage types.

Direct damage is damage that can’t be reduced by marking Armor Slots.

MULTI-TARGET ATTACK ROLLS

If a spell or ability allows you to target multiple adversaries, make one attack roll and one damage roll, then apply the results to each target individually.

MULTIPLE DAMAGE SOURCES

Damage dealt simultaneously from multiple sources is always totaled before it’s compared to its target’s damage thresholds.


For example, if a PC with orc ancestry makes a successful attack against a target in Melee range and decides to spend a Hope to use their “Tusks” feature (which gives them an extra 1d6 damage on a damage roll), they would roll their normal weapon damage and add a d6 to the result, then deal that total damage to the adversary.


MAPS, RANGE, AND MOVEMENT

You can play Daggerheart using “theater of the mind” or maps and miniatures. The conversions below from abstract ranges to physical measurements assume 1 inch of map represents about 5 feet of fictional space.

Daggerheart uses the following ranges to translate fictional positioning into relative distance for the purposes of targeting, movement, and other game mechanics:

  • Melee: Close enough to touch, up to a few feet away.

  • Very Close: Close enough to see fine details, about 5–10 feet away. While in danger, a character can move, as part of their action, from Very Close range into Melee range. On a map: anything within the shortest length of a game card (2-3 inches).

  • Close: Close enough to see prominent details, about 10–30 feet away. While in danger, a character can move, as part of their action, from Close range into Melee range. On a map: anything within the length of a pencil (5-6 inches).

  • Far: Close enough to see very little detail, about 30–100 feet away. While in danger, a character must make an Agility Roll to safely move from Far range into Melee range. On a map: anything within the length of the long edge of a piece of copy paper (11–12 inches).

  • Very Far: Too far to make out any details, about 100–300 feet away. While in danger, a character must make an Agility Roll to safely move from Very Far range into Melee range. On a map: anything beyond Far range, but still within the bounds of the conflict or scene.

  • Out of Range: Anything beyond a character’s Very Far range is Out of Range and usually can’t be targeted.

Range is measured from the source of an effect, such as the attacker or spellcaster, to the target or object of an effect.

A weapon, spell, ability, item, or other effect’s stated range is a maximum range; unless otherwise noted, it can be used at closer distances.


Optional Rule: Defined Ranges

If your table would rather operate with more precise range rules, you can use a 1-inch grid battle map during combat.

If you do, use the following guidelines for play:

  • Melee: 1 square

  • Very Close: 3 squares

  • Close: 6 squares

  • Far: 12 squares

  • Very Far: 13+ squares

  • Out of Range: Off the battlemap


MOVEMENT UNDER PRESSURE

When you’re under pressure or in danger and make an action roll, you can move to a location within Close range as part of that action. If you’re not already making an action roll, or if you want to move farther than your Close range, you need to succeed on an Agility Roll to safely reposition yourself.

An adversary can move within Close range for free as part of an action, or within Very Far range as a separate action.

AREA OF EFFECT

Unless stated otherwise, all the targets of a group effect must be within Very Close range of a single origin point within your effect’s range.

LINE OF SIGHT & COVER

Unless stated otherwise, a ranged attacker must have line of sight to their intended target to make an attack roll. If a partial obstruction lies between the attacker and target, the target has cover. Attacks made through cover are rolled with disadvantage. If the obstruction is total, there is no line of sight.

CONDITIONS

Conditions are effects that grant specific benefits or drawbacks to the target they are attached to.

STANDARD CONDITIONS

Daggerheart has three standard conditions:

HIDDEN

While you’re out of sight from all enemies and they don’t otherwise know your location, you gain the Hidden condition. Any rolls against a Hidden creature have disadvantage. After an adversary moves to where they would see you, you move into their line of sight, or you make an attack, you are no longer Hidden.

RESTRAINED

Restrained characters can’t move, but you can still take actions from their current position.

VULNERABLE

When a creature is Vulnerable, all rolls targeting them have advantage.

Some features can apply special or unique conditions, which work as described in the feature text.

Unless otherwise noted, the same condition can’t be applied more than once to the same target.

TEMPORARY TAGS & SPECIAL CONDITIONS

The temporary tag denotes a condition or effect that the affected creature can clear by making a move against it. When an affected PC makes a move to clear a temporary condition or effect, it normally requires a successful action roll using an appropriate trait. When an affected adversary makes a move to clear a temporary condition or effect, the GM puts the spotlight on the adversary and describes how they do it; this doesn’t require a roll but it does use up that adversary’s spotlight.

Special conditions are only cleared when specific requirements are met, such as completing a certain action or using a particular item. The requirements for clearing these conditions are stated in the text of the effect that applies the condition.

DOWNTIME

Between conflicts, the party can take a rest to recover expended resources and deepen their bonds. During a rest, each PC can make up to two downtime moves.

When the party rests, they must choose between a short rest and a long rest. If a party takes three short rests in a row, their next rest must be a long rest.

If a short rest is interrupted, such as by an adversary's attack, the characters don’t gain its benefits. If a long rest is interrupted, the characters only gain the benefits of a short rest.

A short rest lasts enough time for the party to catch its breath, about an hour in-world. Each player can move domain cards between their loadout and vault for free, then choose twice from the following list of downtime moves (players can choose the same move twice):

  • Tend to Wounds: Clear 1d4+Tier Hit Points for yourself or an ally.

  • Clear Stress: Clear 1d4+Tier Stress.

  • Repair Armor: Clear 1d4+Tier Armor Slots from your or an ally’s armor.

  • Prepare: Describe how you prepare yourself for the path ahead, then gain a Hope. If you choose to Prepare with one or more members of your party, you each gain 2 Hope.

At the end of a short rest, any features or effects with a limited number of uses per rest refresh and any features or effects that last until your next rest expire.

A long rest is when the characters make camp and relax or sleep for several in-game hours. Each player can move domain cards between their loadout and vault for free, then choose twice from the following list of downtime moves (players can choose the same move twice):

  • Tend to All Wounds: Clear all Hit Points for yourself or an ally.

  • Clear All Stress: Clear all Stress.

  • Repair All Armor: Clear all Armor Slots from your or an ally’s armor

  • Prepare: Describe how you prepare for the next day’s adventure, then gain a Hope. If you choose to Prepare with one or more members of your party, you each gain 2 Hope.

  • Work on a Project: With GM approval, a PC may pursue a long-term project, such as deciphering an ancient text or crafting a new weapon. The first time they start a new project, assign it a countdown. Each time a PC makes the Work on a Project move, they either advance their project’s countdown automatically or make an action roll to advance it (GM’s choice).

At the end of a long rest, any features or effects with a limited number of uses per rest or per long rest refresh and any features or effects that last until your next rest or until your next long rest expire.

DOWNTIME CONSEQUENCES

On a short rest, the GM gains 1d4 Fear. On a long rest, they gain Fear equal to 1d4 + the number of PCs, and they can advance a long-term countdown of their choice.

DEATH

When a PC marks their last Hit Point, they must make a death move by choosing one of the following options:

  • Blaze of Glory: Your character embraces death and goes out in a blaze of glory. Take one final action. It automatically critically succeeds (with GM approval), and then you cross through the veil of death.

  • Avoid Death: Your character avoids death and faces the consequences. They temporarily drop unconscious, and then you work with the GM to describe how the situation worsens. While unconscious, your character can’t move or act, and they can’t be targeted by an attack. They return to consciousness when an ally clears 1 or more of their marked Hit Points or when the party finishes a long rest. After your character falls unconscious, roll your Hope Die. If its value is equal to or less than your character’s level, they gain a scar: permanently cross out a Hope slot and work with the GM to determine its lasting narrative impact and how, if possible, it can be restored. If you ever cross out your last Hope slot, your character’s journey ends.

  • Risk It All: Roll your Duality Dice. If the Hope Die is higher, your character stays on their feet and clears a number of Hit Points or Stress equal to the value of the Hope Die (you can divide the Hope Die value between Hit Points and Stress however you’d prefer). If the Fear Die is higher, your character crosses through the veil of death. If the Duality Dice show matching results, your character stays up and clears all Hit Points and Stress.

If your character dies, work with the GM before the next session to create a new character at the current level of the rest of the party.

ADDITIONAL RULES

The following rules apply to many aspects of the game.

ROUNDING UP

This game doesn’t use fractions; if you need to round to a whole number, round up unless otherwise specified. When in doubt, resolve any ambiguity in favor of the PCs.

REROLLING DICE

When a feature allows you to reroll a die, you always take the new result unless the feature specifically says otherwise.

INCOMING DAMAGE

Incoming damage means the total damage from a single attack or source, before Armor Slots are marked.

SIMULTANEOUS EFFECTS

If the resolution order of multiple effects is unclear, the person in control of the effects (player or GM) decides what order to resolve them in.

STACKING EFFECTS

Unless stated otherwise, all effects beside conditions and advantage/disadvantage can stack.

ONGOING SPELL EFFECTS

If an effect doesn’t have a listed mechanical expiration, it only ends when decided by the controlling player, the GM, or the demands of the fiction.

SPENDING RESOURCES

Unless an effect states otherwise, you can’t spend Hope or mark Stress multiple times on the same feature to increase or repeat its effects on the same roll.

USING FEATURES AFTER A ROLL

If a feature allows you to affect a roll after the result has been totaled, you can use it after the GM declares whether the roll succeeds or fails, but not after the consequences unfold or another roll is made.

LEVELING UP

Your party levels up whenever the GM decides you’ve reached a narrative milestone (usually about every 3 sessions). All party members level up at the same time.

Daggerheart has 10 PC levels divided into 4 tiers:


→ Tier 1 encompasses level 1 only.

→ Tier 2 encompasses levels 2–4.

→ Tier 3 encompasses levels 5–7.

→ Tier 4 encompasses levels 8–10.


Your tier affects your damage thresholds, tier achievements, and access to advancements.

STEP ONE: TIER ACHIEVEMENTS

Take any applicable tier achievements

  • At level 2, you gain a new Experience at +2 and permanently increase your Proficiency by 1.

  • At level 5, you gain a new Experience at +2, permanently increase your Proficiency by 1, and clear any marked traits.

  • At level 8, you gain a new Experience at +2, permanently increase your Proficiency by 1, and clear any marked traits.

STEP TWO: ADVANCEMENTS

Choose any two advancements with at least one unmarked slot from your tier or below. Options with multiple slots can be chosen more than once. When you choose an advancement, mark one of its slots.

  • When you choose to increase two unmarked character traits and mark them: Choose two unmarked character traits and gain a permanent +1 bonus to them. You can’t increase these stats again until the next tier (when your tier achievement allows you to clear those marks).

  • When you choose to permanently add 1 or more Hit Point slots: Darken the outline of the next rectangle in the Hit Point section of your character sheet in pen or permanent marker.

  • When you choose to permanently add 1 or more Stress slots: Darken the outline of the next rectangle in the Stress section of your character sheet in pen or permanent marker.

  • When you choose to increase your Experience: Choose two Experiences on your character sheet and gain a permanent +1 bonus to both.

  • When you take an additional domain card: You can choose an additional domain card at or below your level or from your class’s domains. If you’ve multiclassed, you can instead select a card at or below half your level from your chosen multiclass domain.

  • When you choose to increase your Evasion: Gain a permanent +1 bonus to your Evasion.

  • When you choose to take an upgraded subclass card: Take the next card for your subclass. If you have only the foundation card, take a specialization; if you have a specialization already, take a mastery. Then cross out this tier’s multiclass option.

  • When you choose to increase your Proficiency: Fill in one of the open circles in the “Proficiency” section of your character sheet, then increase your weapon’s number of damage dice by 1. The black box around this advancement’s slots indicates you must spend two advancements and mark both level-up slots in order to take it as an option.

  • When you choose to multiclass: Choose an additional class, select one of its domains, and gain its class feature. Add the appropriate multiclass module to your character sheet and take the foundation card from one of its subclasses. Then cross out the “upgraded subclass” advancement option in this tier and all other “multiclass” advancement options on your character sheet. The black box around this advancement’s slots indicates you must spend two advancements and mark both level-up slots in order to take it as an option.

STEP THREE: DAMAGE THRESHOLDS

Increase all damage thresholds by 1.

STEP FOUR: DOMAIN CARDS

Acquire a new domain card at your level or lower from one of your class’s domains and add it to your loadout or vault. If your loadout is already full, you can’t add the new card to it until you move another into your vault. You can also exchange one domain card you’ve previously acquired for a different domain card of the same level or lower.

MULTICLASSING

Starting at level 5, you can choose multiclassing as an option when leveling up. When you multiclass, you choose an additional class, gain access to one of its domains, and acquire its class feature. Take the appropriate multiclass module and add it to the right side of your character sheet, then choose a foundation card from one of its subclasses. If your foundation cards specify different Spellcast traits, you can choose which one to apply when making a Spellcast roll.

Whenever you have the option to acquire a new domain card, you can choose from cards at or below half your current level (rounded up) from the domain you chose when you selected the multiclass advancement.

EQUIPMENT

Your equipped weapons and armor are the ones listed in the “Active Weapons” and “Active Armor” sections of your character sheet. Your character can only attack with weapons, benefit from armor, and gain features from items they have equipped. You can’t equip weapons or armor with a higher tier than you.

PCs can carry up to two additional weapons in the “Inventory Weapon” areas of the character sheet.

You can swap an Inventory Weapon with an Active Weapon at no cost during a rest or moment of calm; otherwise, you must mark a Stress to do so.

Your character can only have one Active Armor at a time.

They can’t equip armor while in danger or under pressure; otherwise, they can equip or unequip armor without cost.

Each armor has its own Armor Slots; if your character unequips their armor, track how many of its Armor Slots are marked. You can't carry armor in your inventory. When your character equips or unequips armor, recalculate your damage thresholds.

WEAPONS

All weapons have a tier, trait, range, damage die, damage type, and burden. Some weapons also have a feature.

CATEGORY

A weapon’s category specifies whether it is a Primary or Secondary weapon. Your character can only equip up to one weapon of each category at a time.

TRAIT

A weapon’s trait specifies which trait to use when making an attack roll with it.

RANGE

A weapon’s range specifies the maximum distance between the attacker and their target when attacking with it.

DAMAGE

A weapon’s damage indicates the size of the damage dice you roll on a successful attack with it; you roll a number of dice equal to your Proficiency. If the damage includes a flat modifier, this number is added to the total damage rolled, but is not altered or affected by Proficiency.

DAMAGE TYPE

A weapon’s damage type indicates whether it deals physical or magic damage. Weapons that deal magic damage can only be wielded by characters with a Spellcast trait.

BURDEN

A weapon’s burden indicates how many hands it occupies when equipped. Your character’s maximum burden is 2 hands.

FEATURE

A weapon’s feature is a special rule that stays in effect while the weapon is equipped.

You can throw an equipped weapon at a target within Very Close range, making the attack roll with Finesse. On a success, deal damage as usual for that weapon. Once thrown, the weapon is no longer considered equipped. Until you retrieve and re-equip it, you can’t attack with it or benefit from its features.

Combat Wheelchair

By Mark Thompson

The combat wheelchair is a ruleset designed to help you play a wheelchair user in Daggerheart. This section provides mechanics and narrative guidance for you to work from, but feel free to adapt the flavor text to best suit your character. Have fun with your character’s wheelchair design, and make it as unique or tailored to them as you please.

ACTION AND MOVEMENT

When describing how your character moves, you can use descriptions such as the following:

  • “I roll over to the door to see if it’s open.”

  • “I wheel myself over to the group to ask what’s going on.”

  • “I pull my brakes and skid to a halt, turning in my seat to level my bow at the intruder.”

CONSEQUENCES

Here are some ways you might describe complications you encounter when your character uses their wheelchair:

  • “I pull my brakes, but I don’t think to account for the loose gravel on the ground.”

  • “I hit a patch of ice awkwardly and am sent skidding out past my target.”

  • “I go to push off in pursuit, but one of my front caster wheels snags on a crack in the pavement, stalling me for a moment.”

GMs should avoid breaking a character's wheelchair or otherwise removing it from play as a consequence, unless everyone at the table, especially the wheelchair user’s player, gives their approval.

EVASION

Your character is assumed to be skilled in moving their wheelchair and navigating numerous situations in it. As a result, the only wheelchair that gives a penalty to a PC's Evasion is the Heavy Frame model.

BURDEN

All wheelchairs can be maneuvered using one or two hands outside of combat. However, when being used as a weapon, the chair is restricted to requiring one or two hands to perform attacks, depending on the model you’ve chosen. If you’re playing a character who has limited to no mobility in their arms, their wheelchair can be attuned to them by magical means. For example, your character might use a psychic link to guide the chair around like a pseudo-electric wheelchair. All the rules presented here can be tailored and adapted to any character's needs.

CHOOSING YOUR MODEL

All combat wheelchairs are equipped as Primary Weapons.

There are three models of wheelchair available: light, heavy, and arcane. You’re encouraged to consider the type of character you’re playing and the class they belong to, then choose the model that best matches that character concept.

ARMOR

Every armor has a name, base damage thresholds, and a base Armor Score. Some armor also has a feature.

  • An armor’s base armor score indicates how many Armor Slots it provides its wearer before additional bonuses are added to calculate their total Armor Score. A PC’s Armor Score can’t exceed 12.

  • An armor’s base thresholds determine its wearer’s major and severe damage thresholds before adding bonuses to calculate their final damage thresholds.

  • An armor’s feature is a special rule that stays in effect while the armor is equipped.

While unarmored, your character’s base Armor Score is 0, their Major threshold is equal to their level, and their Severe threshold is equal to twice their level.

REDUCING INCOMING DAMAGE

When you take damage, you can mark one Armor Slot to reduce the number of Hit Points you would mark by one. If your character has an Armor Score of 0, you can’t mark Armor Slots. If an effect temporarily increases your Armor Score,

it increases your available Armor Slots by the same amount; when the effect ends, so does the availability of these Armor Slots.

LOOT

Loot comprises any consumables or reusable items the party acquires.

Items can be used until sold, discarded, or lost.

To generate a random item, choose a rarity, roll the designated dice, and match the total to the item in the table:

  • Common: 1d12 or 2d12

  • Rare: 3d12 or 4d12

  • Uncommon: 2d12 or 3d12

  • Legendary: 4d12 or 5d12

@UUID[Compendium.daggerheart.rolltables.RollTable.S61Shlt2I5CbLRjz]{Loot}

CONSUMABLES

Consumables are loot that can only be used once. You can hold up to five of each consumable at a time. Using a consumable doesn’t require a roll unless required by the GM or the demands of the fiction.

To generate a random consumable, choose a rarity, roll the designated dice, and match the total to the item in the table:

  • Common: 1d12 or 2d12

  • Rare: 3d12 or 4d12

  • Uncommon: 2d12 or 3d12

  • Legendary: 4d12 or 5d12

@UUID[Compendium.daggerheart.rolltables.RollTable.tF04P02yVN1YDVel]{Consumables}

GOLD

Gold is an abstract measurement of how much wealth a character has, and is measured in handfuls, bags, and chests, with 10 handfuls to 1 bag, and 10 bags to 1 chest. When you have marked all of the slots in a category and you gain another gold reward in that category, mark a slot in the following category and clear all the slots in the current one.

For example, if you have 9 handfuls and gain another, you instead mark 1 bag and erase all handfuls. If you have 9 bags and gain another, you mark 1 chest and erase all bags.

You can’t have more than 1 chest, so if all your Gold slots are marked, you’ll need to spend some of your gold or store it somewhere else before you can acquire more.


Optional Rule: Gold Coins

If your group wants to track gold with more granularity, you can add coins as your lowest denomination. Following the established pattern, 10 coins equal 1 handful.


" + "content": "

FLOW OF THE GAME

Daggerheart is a conversation. The GM describes fictional scenarios involving the PCs, and the players take turns describing how their characters react. The goal of every person at the table is to build upon everyone else’s ideas and collaboratively tell a satisfying story. The system facilitates this collaborative process by providing structure to the conversation and mechanics for resolving moments of tension where fate or fortune determine the outcome of events.

PLAYER PRINCIPLES & BEST PRACTICES

To get the most out of Daggerheart, we recommend players keep the following principles and practices in mind throughout each session:

PRINCIPLES

  • Be a fan of your character and their journey.

  • Spotlight your friends.

  • Address the characters and address the players.

  • Build the world together.

  • Play to find out what happens.

  • Hold on gently.

BEST PRACTICES

  • Embrace danger.

  • Use your resources.

  • Tell the story.

  • Discover your character.

For more information, see the Daggerheart Core Rulebook, pages 9 and 108.

CORE GAMEPLAY LOOP

The core gameplay loop is the procedure that drives every scene, both in and out of combat:

STEP 1: SET THE SCENE

The GM describes a scenario, establishing the PCs’ surroundings and any dangers, NPCs, or other important details the characters would notice.

STEP 2: ASK AND ANSWER QUESTIONS

The players ask clarifying questions to explore the scene more deeply and gather information that could inform their characters’ actions. The GM responds to these questions by giving the players information their characters could easily obtain, or by asking questions of their own to the players. The players also respond to any questions the GM poses to them.

In this way, the table builds out the fiction collaboratively.

STEP 3: BUILD ON THE FICTION

As the scene develops, the players find opportunities to take action—problems to solve, obstacles to overcome, mysteries to investigate, and so on. The players describe how their characters proceed; if their proposed actions carry no chance of failure (or if failure would be boring), they automatically succeed. But if the outcome of their action is unknown, the GM calls for an action roll. Either way, the table works the outcome into the story and moves the fiction forward, narrating how the PC’s actions have changed things.

STEP 4: GO BACK TO STEP 1

The process repeats from the beginning, with the GM relaying any updated details or material changes to the players. This process continues until the end of the scene is triggered by a mechanic or arrives organically.

THE SPOTLIGHT

The spotlight is a symbol that represents the table’s attention—and therefore the immediate focus of both the narrative and the game mechanics. Any time a character or player becomes the focus of a scene, they “are in the spotlight” or “have the spotlight.”

The spotlight moves around the table organically as scenes unfold unless a mechanical trigger determines where the spotlight goes next. For example, when a player fails an action roll, the mechanics prompt the GM to seize the spotlight and make a GM move.

TURN ORDER & ACTION ECONOMY

Daggerheart’s turns don’t follow a traditional, rigid format:
there is no explicit initiative mechanic and characters don’t have a set number of actions they can take or things they can do before the spotlight passes to someone else. A player with the spotlight describes what their character does and the spotlight simply swings to whoever:

  1. the fiction would naturally turn it toward

  2. hasn’t had the focus in a while, or

  3. a triggered mechanic puts it on


Optional: Spotlight Tracker Tool

If your group prefers a more traditional action economy, you can use tokens to track how many times a player has had the spotlight: At the start of a session or scene, each player adds a certain number of tokens (we recommend 3) to their character sheet and removes a token each time they take an action. If the spotlight would swing to someone without any tokens, it swings to someone else instead. Once every player has used all their available tokens, players refill their character sheet with the same number of tokens as before, then continue playing.


MAKING MOVES & TAKING ACTION

Any time a character does something to advance the story, such as speaking with another character, interacting with the environment, making an attack, casting a spell, or using a class feature, they are making a move.

ACTION ROLLS

Any move where success would be trivial or failure would be boring automatically succeeds, but any move that’s difficult to accomplish or risky to attempt triggers an action roll.

OVERVIEW

All action rolls require a pair of d12s called Duality Dice.

These are two visually distinct twelve-sided dice, with one die representing Hope and the other representing Fear.

To make an action roll, you roll the Duality Dice, sum the results, apply any relevant modifiers, and compare the total to a Difficulty number to determine the outcome:

  • Success with Hope: If your total meets or beats the difficulty AND your Hope Die shows a higher result than your Fear Die, you rolled a “Success with Hope.” You succeed and gain a Hope.

  • Success with Fear: If your total meets or beats the Difficulty AND your Fear Die shows a higher result than your Hope Die, you rolled a “Success with Fear.” You succeed with a cost or complication, but the GM gains a Fear.

  • Failure with Hope: If your total is less than the Difficulty AND your Hope Die shows a higher result than your Fear Die, you rolled a “Failure with Hope.” You fail with a minor consequence and gain a Hope, then the spotlight swings to the GM.

  • Failure with Fear: If your total is less than the Difficulty AND your Fear Die shows a higher result than your Hope Die, you rolled a “Failure with Fear.” You fail with a major consequence and the GM gains a Fear, then the spotlight swings to the GM.

  • Critical Success: If the Duality Dice show matching results, you rolled a “Critical Success” (“Crit”). You automatically succeed with a bonus, gain a Hope, and clear a Stress. If this was an attack roll, you deal critical damage.

Note: A Critical Success counts as a roll “with Hope.”

After resolving the action roll, the table works together to weave the outcome into the narrative and play continues.

FAILING FORWARD

In Daggerheart, every time you roll the dice, the scene changes in some way. There is no such thing as a roll where “nothing happens,” because the fiction constantly evolves based on the successes and failures of the characters.

PROCEDURE

The following steps describe in more detail the procedure that all action rolls utilize:

STEP 1: PICK AN APPROPRIATE TRAIT

Some actions and effects specify in their description which trait applies to the roll; otherwise, the GM tells the acting player which character trait best applies to the action being attempted. If more than one trait could apply to the roll, the GM chooses or lets the acting player decide.

STEP 2: DETERMINE THE DIFFICULTY

Some actions and features say in their description what the Difficulty is. Otherwise, the GM determines the Difficulty based on the scenario. The GM can choose whether to share the Difficulty with the table. In either case, the GM should communicate the potential consequences of failure to the acting player.

STEP 3: APPLY EXTRA DICE AND MODIFIERS

The acting player decides whether to Utilize an Experience or activate other effects, then, if applicable, adds the appropriate tokens and dice (such as advantage or Rally dice) to their dice pool.


Note: Unless an action, ability, or feature specifically allows for it, a player must declare the use of any Experiences, extra dice, or other modifiers before they roll.


STEP 4: ROLL THE DICE

The acting player rolls their entire dice pool and announces the results in the format of “[total result] with [Hope/Fear]”— or “Critical Success!” in the case of matching Duality Dice.


Example: A player is making an action roll with a +1 in the relevant trait and no other modifiers; they roll the Duality Dice and get a result of 5 on their Hope Die and 7 on their Fear Die, then announce “I rolled a 13 with Fear!”


STEP 5: RESOLVE THE OUTCOME

The active player and the GM work together, along with the suggestions and support of the rest of the table, to resolve the outcome of the action.

GM MOVES AND ADVERSARY ACTIONS

GMs also make moves. They should consider making a move when a player does one of the following things:

  • Rolls with Fear on an action roll.

  • Fails an action roll.

  • Does something that would have consequences.

  • Gives them a golden opportunity.

  • Looks to them for what happens next.

After the GM turn is done, the spotlight goes back to the PCs.

Many adversaries and environments have Fear Features, especially powerful or consequential moves that the GM must spend Fear to activate.


Note: This Fear is in addition to any Fear the GM has previously spent to seize the spotlight or activate another action or ability.


ADVERSARY ACTIONS

When play passes to the GM, the GM can make a GM move to spotlight an adversary. A spotlighted adversary can:

  • Move within Close range and make a standard attack

  • Move within Close range and use an adversary action

  • Clear a condition

  • Sprint within Far or Very Far range on the battlefield

  • Do anything else the fiction demands or the GM deems appropriate

The GM can spend additional Fear to spotlight additional adversaries. Once the GM has finished, the spotlight swings back to the PCs.

SPECIAL ROLLS

Some rolls have unique specifications or otherwise modify the action roll procedure: trait rolls, Spellcast Rolls, attack rolls, and damage rolls. Unless otherwise noted, you can apply any bonus, modifier, or effect to a special roll as if it were a standard action roll.

TRAIT ROLLS

An action roll that specifies which character trait applies to it is called a trait roll. In the text of a feature or effect, a trait roll is referenced with the format “[Trait] Roll (Difficulty)” (e.g., “Agility Roll (12)”). If the text of an effect doesn’t specify a trait roll’s Difficulty, the GM sets the Difficulty based on the circumstances.

Features and effects that affect a trait roll also affect any action roll that uses the same trait, including attack rolls, Spellcast rolls, and standard action rolls.


Example: The katari’s ancestry feature “Feline Instincts,” which allows the katari to reroll an Agility Roll, can also be used on a standard action roll using Agility to traverse dangerous terrain or on an attack roll made with a weapon that uses Agility.


SPELLCAST ROLLS

Spellcast Rolls are trait rolls that require you to use your Spellcast trait. Your Spellcast trait, if you have one, is determined by your subclass.

Spellcast Rolls are only made when a character uses a feature that requires one. A successful Spellcast Roll activates the effect as described by the feature.


Notes: A Spellcast Roll that can damage a target is also considered an attack roll.

When you cast a spell, the text tells you when the effect ends. The GM can spend a Fear to end a temporary effect. If your spell doesn’t specify when it ends, it ends when you choose or at a natural moment of the story. You can choose to end your spell early.

You can cast and maintain the effects of more than one spell at the same time.


REACTION ROLLS

A reaction roll is made in response to an attack or a hazard, representing a character’s attempt to avoid or withstand an imminent effect.

Reaction rolls work like action rolls, except they don’t generate Hope or Fear, don’t trigger additional GM moves, and other characters can’t aid you with Help an Ally.

If you critically succeed on a reaction roll, you don’t clear a Stress or gain a Hope, but you do ignore any effects that would have impacted you on a success, such as taking damage or marking Stress.

GROUP ACTION ROLLS

When multiple PCs take action together, the party chooses one PC to lead the action. Each other player then describes how their character collaborates on the task. The leader makes an action roll as usual, while the other players make reaction rolls using whichever traits they and the GM decide fit best.

The lead character gains a +1 bonus to their lead action roll for each of these reaction rolls that succeeded and a −1 penalty for each these reaction rolls that failed.

TAG TEAM ROLLS

Each player can, once per session, initiate a Tag Team Roll between their character and another PC by spending 3 Hope. The players work with one another to describe how they combine their actions in a unique and exciting way. Both players make separate action rolls; before resolving the roll’s outcome, choose one of the rolls to apply to both actions. On a roll with Hope, all PCs involved gain a Hope. On a roll with Fear, the GM gains a Fear token for each PC involved.

On a successful Tag Team attack roll, both players roll damage and add the totals together to determine the damage dealt, which is then treated as if it came from a single source. If the attacks deal different types of damage, the players choose which type to deal.


Notes:

A Tag Team Roll counts as a single action roll for the purposes of any countdowns or features that track action rolls.

Though each player may only initiate one Tag Team Roll per session, one PC can be involved in multiple Tag Team Rolls.


ADVANTAGE & DISADVANTAGE

Some features and effects let you roll with advantage or disadvantage on an action or reaction roll:

  • Advantage represents an opportunity that you seize to increase your chances of success. When you roll with advantage, you roll a d6 advantage die with your dice pool and add its result to your total.

  • Disadvantage represents an additional difficulty, hardship, or challenge you face when attempting an action. When you roll with disadvantage, you roll a d6 disadvantage die with your dice pool and subtract its result from your total.

Advantage or disadvantage can be granted or imposed by mechanical triggers or at the GM’s discretion. When a PC aids you with Help an Ally, they roll their own advantage die and you add it to your total.

Advantage and disadvantage dice cancel each out, one-for-one, when they would be added to the same dice pool, so you’ll never roll both at the same time. If you have advantage or disadvantage from other sources that don’t affect your own dice pool, such as another player’s Help an Ally move, their effects stack with your rolled results.

HOPE & FEAR

Hope and Fear are metacurrencies representing the cosmic forces that shape the events of your table’s story. Hope powers PC abilities and features, while Fear powers the abilities of the GM and the adversaries and environments they control.

HOPE

Every PC starts with 2 Hope at character creation and gains more throughout play. A PC can have a maximum of 6 Hope at one time, and Hope carries over between sessions.

Players can spend Hope to:

  • Help an Ally

    When you Help an Ally who is making an action roll, describe how you do so and roll an advantage die. Multiple players can spend Hope to help the same acting player, but that player only adds the highest result to their final total.

  • Utilize an Experience

    When you Utilize an Experience on a relevant roll, add its modifier to the result. You can spend multiple Hope to utilize multiple Experiences.

  • Initiate a Tag Team Roll

    Spend 3 Hope to initiate a Tag Team roll, combining the actions of two PCs into one impressive act of synergy. When you make a Tag Team roll, both players roll their action rolls and then choose which set of results to apply to the outcome.

  • Activate a Hope Feature

    A Hope Feature is any effect that allows (or requires) you to spend a specified amount of Hope to activate it. Class Hope features are class-specific features, detailed on your character sheet, that cost 3 Hope to activate


Note: When using a Hope Feature, if you rolled with Hope for that action, the Hope you gain from that roll can be spent on that feature (or toward it, if it requires spending multiple Hope).


FEAR

The GM gains Fear whenever a player rolls with Fear and can spend Fear at any time to make or enhance a GM move or to use a Fear Feature. The GM can have up to 12 Fear at one time. Fear carries over between sessions.

COMBAT

Though Daggerheart relies on the same flow of collaborative storytelling in and out of combat, physical conflicts rely more heavily on several key mechanics related to attacking, maneuvering, and taking damage.

EVASION

Evasion represents a character’s ability to avoid attacks and other unwanted effects. Any roll made against a PC has a Difficulty equal to the target’s Evasion. A PC’s base Evasion is determined by their class, but can be modified by domain cards, equipment, conditions, and other effects.


Note: attacks rolled against adversaries use the target’s Difficulty instead of Evasion.


HIT POINTS & DAMAGE THRESHOLDS

Hit Points (HP) represent a character’s ability to withstand physical injury. When a character takes damage, they mark 1 to 3 HP, based on their damage thresholds:

  • If the final damage is at or above the character’s Severe damage threshold, they mark 3 HP.

  • If the final damage is at or above the character’s Major damage threshold but below their Severe damage threshold, they mark 2 HP.

  • If the final damage is below the character’s Major damage threshold, they mark 1 HP.

  • If incoming damage is ever reduced to 0 or less, no HP is marked.

A PC’s damage thresholds are calculated by adding their level to the listed damage thresholds of their equipped armor. A PC’s starting HP is based on their class, but they can gain additional Hit Points through advancements, features, and other effects.

An adversary’s Damage Thresholds and HP are listed in their stat blocks.

When a character marks their last Hit Point, they fall. If a PC falls, they make a death move.

Characters can clear Hit Points by taking downtime moves (see: Downtime) or by activating relevant special abilities or effects.


Optional Rule: Massive Damage

If a character ever takes damage equal to twice their Severe threshold, they mark 4 HP instead of 3.


STRESS

Stress represents how much mental, physical, and emotional strain a character can endure. Some special abilities or effects require the character activating them to mark Stress, and the GM can require a PC to mark Stress as a GM move or to represent the cost, complication, or consequence of an action roll.

When a character marks their last Stress, they become Vulnerable (see: Conditions) until they clear at least 1 Stress.

When a character must mark 1 or more Stress but can’t, they mark 1 HP instead. A character can’t use a move that requires them to mark Stress if all of their Stress is marked.

PCs can clear Stress by making downtime moves (see: Downtime). A PC’s maximum Stress is determined by their class, but they can increase it through advancements, abilities, and other effects.

ATTACKING

ATTACK ROLLS

An attack roll is an action roll intended to inflict harm. The trait that applies to an attack roll is specified by the weapon or spell being used. Unarmed attack rolls use either Strength or Finesse (GM’s choice). An attack roll’s Difficulty, unless otherwise noted, is equal to the Difficulty score of its target.

DAMAGE ROLLS

On a successful attack, roll damage. Damage is calculated from the damage roll listed in the attack’s description with the format “xdy+[modifier]” (e.g., for a spell that inflicts “1d8+2” damage, you roll an eight-sided and add 2 to the result; the damage dealt is equal to the total).

Any time an effect says to deal damage using your Spellcast trait, you roll a number of dice equal to your Spellcast trait.


Note: If your Spellcast trait is +0 or lower, you don’t roll anything.


For weapons, the number of damage dice you roll is equal to your Proficiency. Note that your Proficiency multiplies the number of dice you roll, but doesn’t affect the modifier. For example, a PC with Proficiency 2 and wielding a weapon with adamage rating of “d8+2” deals damage equal to “2d8+2” on a successful attack.

Successful unarmed attacks inflict [Proficiency]d4 damage.

CRITICAL DAMAGE

When you get a critical success (i.e., you roll matching values on your Duality Dice) on an attack roll, you deal extra damage.

Make the damage roll as usual, but add the maximum possible result of the damage dice to the final total. For instance, if an attack would normally deal 2d8+1 damage, a critical success would deal 2d8+1+16.

DAMAGE TYPES

There are two damage types: physical damage (phy) and magic damage (mag). Unless stated otherwise, mundane weapons and unarmed attacks deal physical damage, and spells deal magic damage.

RESISTANCE, IMMUNITY, AND DIRECT DAMAGE

If a target has resistance to a damage type, then they reduce incoming damage of that type by half before comparing it to their Hit Point Thresholds. If the target has additional ways of reducing incoming damage, such as marking Armor Slots, they apply the resistance effect first. The effects of multiple resistances to the same damage type do not stack.

If a target has immunity to a damage type, they ignore incoming damage of that type.

If an attack deals both physical and magic damage, a character can only benefit from resistance or immunity if they are resistant or immune to both damage types.

Direct damage is damage that can’t be reduced by marking Armor Slots.

MULTI-TARGET ATTACK ROLLS

If a spell or ability allows you to target multiple adversaries, make one attack roll and one damage roll, then apply the results to each target individually.

MULTIPLE DAMAGE SOURCES

Damage dealt simultaneously from multiple sources is always totaled before it’s compared to its target’s damage thresholds.


For example, if a PC with orc ancestry makes a successful attack against a target in Melee range and decides to spend a Hope to use their “Tusks” feature (which gives them an extra 1d6 damage on a damage roll), they would roll their normal weapon damage and add a d6 to the result, then deal that total damage to the adversary.


MAPS, RANGE, AND MOVEMENT

You can play Daggerheart using “theater of the mind” or maps and miniatures. The conversions below from abstract ranges to physical measurements assume 1 inch of map represents about 5 feet of fictional space.

Daggerheart uses the following ranges to translate fictional positioning into relative distance for the purposes of targeting, movement, and other game mechanics:

  • Melee: Close enough to touch, up to a few feet away.

  • Very Close: Close enough to see fine details, about 5–10 feet away. While in danger, a character can move, as part of their action, from Very Close range into Melee range. On a map: anything within the shortest length of a game card (2-3 inches).

  • Close: Close enough to see prominent details, about 10–30 feet away. While in danger, a character can move, as part of their action, from Close range into Melee range. On a map: anything within the length of a pencil (5-6 inches).

  • Far: Close enough to see very little detail, about 30–100 feet away. While in danger, a character must make an Agility Roll to safely move from Far range into Melee range. On a map: anything within the length of the long edge of a piece of copy paper (11–12 inches).

  • Very Far: Too far to make out any details, about 100–300 feet away. While in danger, a character must make an Agility Roll to safely move from Very Far range into Melee range. On a map: anything beyond Far range, but still within the bounds of the conflict or scene.

  • Out of Range: Anything beyond a character’s Very Far range is Out of Range and usually can’t be targeted.

Range is measured from the source of an effect, such as the attacker or spellcaster, to the target or object of an effect.

A weapon, spell, ability, item, or other effect’s stated range is a maximum range; unless otherwise noted, it can be used at closer distances.


Optional Rule: Defined Ranges

If your table would rather operate with more precise range rules, you can use a 1-inch grid battle map during combat.

If you do, use the following guidelines for play:

  • Melee: 1 square

  • Very Close: 3 squares

  • Close: 6 squares

  • Far: 12 squares

  • Very Far: 13+ squares

  • Out of Range: Off the battlemap


MOVEMENT UNDER PRESSURE

When you’re under pressure or in danger and make an action roll, you can move to a location within Close range as part of that action. If you’re not already making an action roll, or if you want to move farther than your Close range, you need to succeed on an Agility Roll to safely reposition yourself.

An adversary can move within Close range for free as part of an action, or within Very Far range as a separate action.

AREA OF EFFECT

Unless stated otherwise, all the targets of a group effect must be within Very Close range of a single origin point within your effect’s range.

LINE OF SIGHT & COVER

Unless stated otherwise, a ranged attacker must have line of sight to their intended target to make an attack roll. If a partial obstruction lies between the attacker and target, the target has cover. Attacks made through cover are rolled with disadvantage. If the obstruction is total, there is no line of sight.

CONDITIONS

Conditions are effects that grant specific benefits or drawbacks to the target they are attached to.

STANDARD CONDITIONS

Daggerheart has three standard conditions:

HIDDEN

While you’re out of sight from all enemies and they don’t otherwise know your location, you gain the Hidden condition. Any rolls against a Hidden creature have disadvantage. After an adversary moves to where they would see you, you move into their line of sight, or you make an attack, you are no longer Hidden.

RESTRAINED

Restrained characters can’t move, but you can still take actions from their current position.

VULNERABLE

When a creature is Vulnerable, all rolls targeting them have advantage.

Some features can apply special or unique conditions, which work as described in the feature text.

Unless otherwise noted, the same condition can’t be applied more than once to the same target.

TEMPORARY TAGS & SPECIAL CONDITIONS

The temporary tag denotes a condition or effect that the affected creature can clear by making a move against it. When an affected PC makes a move to clear a temporary condition or effect, it normally requires a successful action roll using an appropriate trait. When an affected adversary makes a move to clear a temporary condition or effect, the GM puts the spotlight on the adversary and describes how they do it; this doesn’t require a roll but it does use up that adversary’s spotlight.

Special conditions are only cleared when specific requirements are met, such as completing a certain action or using a particular item. The requirements for clearing these conditions are stated in the text of the effect that applies the condition.

DOWNTIME

Between conflicts, the party can take a rest to recover expended resources and deepen their bonds. During a rest, each PC can make up to two downtime moves.

When the party rests, they must choose between a short rest and a long rest. If a party takes three short rests in a row, their next rest must be a long rest.

If a short rest is interrupted, such as by an adversary's attack, the characters don’t gain its benefits. If a long rest is interrupted, the characters only gain the benefits of a short rest.

A short rest lasts enough time for the party to catch its breath, about an hour in-world. Each player can move domain cards between their loadout and vault for free, then choose twice from the following list of downtime moves (players can choose the same move twice):

  • Tend to Wounds: Clear 1d4+Tier Hit Points for yourself or an ally.

  • Clear Stress: Clear 1d4+Tier Stress.

  • Repair Armor: Clear 1d4+Tier Armor Slots from your or an ally’s armor.

  • Prepare: Describe how you prepare yourself for the path ahead, then gain a Hope. If you choose to Prepare with one or more members of your party, you each gain 2 Hope.

At the end of a short rest, any features or effects with a limited number of uses per rest refresh and any features or effects that last until your next rest expire.

A long rest is when the characters make camp and relax or sleep for several in-game hours. Each player can move domain cards between their loadout and vault for free, then choose twice from the following list of downtime moves (players can choose the same move twice):

  • Tend to All Wounds: Clear all Hit Points for yourself or an ally.

  • Clear All Stress: Clear all Stress.

  • Repair All Armor: Clear all Armor Slots from your or an ally’s armor

  • Prepare: Describe how you prepare for the next day’s adventure, then gain a Hope. If you choose to Prepare with one or more members of your party, you each gain 2 Hope.

  • Work on a Project: With GM approval, a PC may pursue a long-term project, such as deciphering an ancient text or crafting a new weapon. The first time they start a new project, assign it a countdown. Each time a PC makes the Work on a Project move, they either advance their project’s countdown automatically or make an action roll to advance it (GM’s choice).

At the end of a long rest, any features or effects with a limited number of uses per rest or per long rest refresh and any features or effects that last until your next rest or until your next long rest expire.

DOWNTIME CONSEQUENCES

On a short rest, the GM gains 1d4 Fear. On a long rest, they gain Fear equal to 1d4 + the number of PCs, and they can advance a long-term countdown of their choice.

DEATH

When a PC marks their last Hit Point, they must make a death move by choosing one of the following options:

  • Blaze of Glory: Your character embraces death and goes out in a blaze of glory. Take one final action. It automatically critically succeeds (with GM approval), and then you cross through the veil of death.

  • Avoid Death: Your character avoids death and faces the consequences. They temporarily drop unconscious, and then you work with the GM to describe how the situation worsens. While unconscious, your character can’t move or act, and they can’t be targeted by an attack. They return to consciousness when an ally clears 1 or more of their marked Hit Points or when the party finishes a long rest. After your character falls unconscious, roll your Hope Die. If its value is equal to or less than your character’s level, they gain a scar: permanently cross out a Hope slot and work with the GM to determine its lasting narrative impact and how, if possible, it can be restored. If you ever cross out your last Hope slot, your character’s journey ends.

  • Risk It All: Roll your Duality Dice. If the Hope Die is higher, your character stays on their feet and clears a number of Hit Points or Stress equal to the value of the Hope Die (you can divide the Hope Die value between Hit Points and Stress however you’d prefer). If the Fear Die is higher, your character crosses through the veil of death. If the Duality Dice show matching results, your character stays up and clears all Hit Points and Stress.

If your character dies, work with the GM before the next session to create a new character at the current level of the rest of the party.

ADDITIONAL RULES

The following rules apply to many aspects of the game.

ROUNDING UP

This game doesn’t use fractions; if you need to round to a whole number, round up unless otherwise specified. When in doubt, resolve any ambiguity in favor of the PCs.

REROLLING DICE

When a feature allows you to reroll a die, you always take the new result unless the feature specifically says otherwise.

INCOMING DAMAGE

Incoming damage means the total damage from a single attack or source, before Armor Slots are marked.

SIMULTANEOUS EFFECTS

If the resolution order of multiple effects is unclear, the person in control of the effects (player or GM) decides what order to resolve them in.

STACKING EFFECTS

Unless stated otherwise, all effects beside conditions and advantage/disadvantage can stack.

ONGOING SPELL EFFECTS

If an effect doesn’t have a listed mechanical expiration, it only ends when decided by the controlling player, the GM, or the demands of the fiction.

SPENDING RESOURCES

Unless an effect states otherwise, you can’t spend Hope or mark Stress multiple times on the same feature to increase or repeat its effects on the same roll.

USING FEATURES AFTER A ROLL

If a feature allows you to affect a roll after the result has been totaled, you can use it after the GM declares whether the roll succeeds or fails, but not after the consequences unfold or another roll is made.

LEVELING UP

Your party levels up whenever the GM decides you’ve reached a narrative milestone (usually about every 3 sessions). All party members level up at the same time.

Daggerheart has 10 PC levels divided into 4 tiers:


→ Tier 1 encompasses level 1 only.

→ Tier 2 encompasses levels 2–4.

→ Tier 3 encompasses levels 5–7.

→ Tier 4 encompasses levels 8–10.


Your tier affects your damage thresholds, tier achievements, and access to advancements.

STEP ONE: TIER ACHIEVEMENTS

Take any applicable tier achievements

  • At level 2, you gain a new Experience at +2 and permanently increase your Proficiency by 1.

  • At level 5, you gain a new Experience at +2, permanently increase your Proficiency by 1, and clear any marked traits.

  • At level 8, you gain a new Experience at +2, permanently increase your Proficiency by 1, and clear any marked traits.

STEP TWO: ADVANCEMENTS

Choose any two advancements with at least one unmarked slot from your tier or below. Options with multiple slots can be chosen more than once. When you choose an advancement, mark one of its slots.

  • When you choose to increase two unmarked character traits and mark them: Choose two unmarked character traits and gain a permanent +1 bonus to them. You can’t increase these stats again until the next tier (when your tier achievement allows you to clear those marks).

  • When you choose to permanently add 1 or more Hit Point slots: Darken the outline of the next rectangle in the Hit Point section of your character sheet in pen or permanent marker.

  • When you choose to permanently add 1 or more Stress slots: Darken the outline of the next rectangle in the Stress section of your character sheet in pen or permanent marker.

  • When you choose to increase your Experience: Choose two Experiences on your character sheet and gain a permanent +1 bonus to both.

  • When you take an additional domain card: You can choose an additional domain card at or below your level or from your class’s domains. If you’ve multiclassed, you can instead select a card at or below half your level from your chosen multiclass domain.

  • When you choose to increase your Evasion: Gain a permanent +1 bonus to your Evasion.

  • When you choose to take an upgraded subclass card: Take the next card for your subclass. If you have only the foundation card, take a specialization; if you have a specialization already, take a mastery. Then cross out this tier’s multiclass option.

  • When you choose to increase your Proficiency: Fill in one of the open circles in the “Proficiency” section of your character sheet, then increase your weapon’s number of damage dice by 1. The black box around this advancement’s slots indicates you must spend two advancements and mark both level-up slots in order to take it as an option.

  • When you choose to multiclass: Choose an additional class, select one of its domains, and gain its class feature. Add the appropriate multiclass module to your character sheet and take the foundation card from one of its subclasses. Then cross out the “upgraded subclass” advancement option in this tier and all other “multiclass” advancement options on your character sheet. The black box around this advancement’s slots indicates you must spend two advancements and mark both level-up slots in order to take it as an option.

STEP THREE: DAMAGE THRESHOLDS

Increase all damage thresholds by 1.

STEP FOUR: DOMAIN CARDS

Acquire a new domain card at your level or lower from one of your class’s domains and add it to your loadout or vault. If your loadout is already full, you can’t add the new card to it until you move another into your vault. You can also exchange one domain card you’ve previously acquired for a different domain card of the same level or lower.

MULTICLASSING

Starting at level 5, you can choose multiclassing as an option when leveling up. When you multiclass, you choose an additional class, gain access to one of its domains, and acquire its class feature. Take the appropriate multiclass module and add it to the right side of your character sheet, then choose a foundation card from one of its subclasses. If your foundation cards specify different Spellcast traits, you can choose which one to apply when making a Spellcast roll.

Whenever you have the option to acquire a new domain card, you can choose from cards at or below half your current level (rounded up) from the domain you chose when you selected the multiclass advancement.

EQUIPMENT

Your equipped weapons and armor are the ones listed in the “Active Weapons” and “Active Armor” sections of your character sheet. Your character can only attack with weapons, benefit from armor, and gain features from items they have equipped. You can’t equip weapons or armor with a higher tier than you.

PCs can carry up to two additional weapons in the “Inventory Weapon” areas of the character sheet.

You can swap an Inventory Weapon with an Active Weapon at no cost during a rest or moment of calm; otherwise, you must mark a Stress to do so.

Your character can only have one Active Armor at a time.

They can’t equip armor while in danger or under pressure; otherwise, they can equip or unequip armor without cost.

Each armor has its own Armor Slots; if your character unequips their armor, track how many of its Armor Slots are marked. You can't carry armor in your inventory. When your character equips or unequips armor, recalculate your damage thresholds.

WEAPONS

All weapons have a tier, trait, range, damage die, damage type, and burden. Some weapons also have a feature.

CATEGORY

A weapon’s category specifies whether it is a Primary or Secondary weapon. Your character can only equip up to one weapon of each category at a time.

TRAIT

A weapon’s trait specifies which trait to use when making an attack roll with it.

RANGE

A weapon’s range specifies the maximum distance between the attacker and their target when attacking with it.

DAMAGE

A weapon’s damage indicates the size of the damage dice you roll on a successful attack with it; you roll a number of dice equal to your Proficiency. If the damage includes a flat modifier, this number is added to the total damage rolled, but is not altered or affected by Proficiency.

DAMAGE TYPE

A weapon’s damage type indicates whether it deals physical or magic damage. Weapons that deal magic damage can only be wielded by characters with a Spellcast trait.

BURDEN

A weapon’s burden indicates how many hands it occupies when equipped. Your character’s maximum burden is 2 hands.

FEATURE

A weapon’s feature is a special rule that stays in effect while the weapon is equipped.

You can throw an equipped weapon at a target within Very Close range, making the attack roll with Finesse. On a success, deal damage as usual for that weapon. Once thrown, the weapon is no longer considered equipped. Until you retrieve and re-equip it, you can’t attack with it or benefit from its features.

Combat Wheelchair

By Mark Thompson

The combat wheelchair is a ruleset designed to help you play a wheelchair user in Daggerheart. This section provides mechanics and narrative guidance for you to work from, but feel free to adapt the flavor text to best suit your character. Have fun with your character’s wheelchair design, and make it as unique or tailored to them as you please.

ACTION AND MOVEMENT

When describing how your character moves, you can use descriptions such as the following:

  • “I roll over to the door to see if it’s open.”

  • “I wheel myself over to the group to ask what’s going on.”

  • “I pull my brakes and skid to a halt, turning in my seat to level my bow at the intruder.”

CONSEQUENCES

Here are some ways you might describe complications you encounter when your character uses their wheelchair:

  • “I pull my brakes, but I don’t think to account for the loose gravel on the ground.”

  • “I hit a patch of ice awkwardly and am sent skidding out past my target.”

  • “I go to push off in pursuit, but one of my front caster wheels snags on a crack in the pavement, stalling me for a moment.”

GMs should avoid breaking a character's wheelchair or otherwise removing it from play as a consequence, unless everyone at the table, especially the wheelchair user’s player, gives their approval.

EVASION

Your character is assumed to be skilled in moving their wheelchair and navigating numerous situations in it. As a result, the only wheelchair that gives a penalty to a PC's Evasion is the Heavy Frame model.

BURDEN

All wheelchairs can be maneuvered using one or two hands outside of combat. However, when being used as a weapon, the chair is restricted to requiring one or two hands to perform attacks, depending on the model you’ve chosen. If you’re playing a character who has limited to no mobility in their arms, their wheelchair can be attuned to them by magical means. For example, your character might use a psychic link to guide the chair around like a pseudo-electric wheelchair. All the rules presented here can be tailored and adapted to any character's needs.

CHOOSING YOUR MODEL

All combat wheelchairs are equipped as Primary Weapons.

There are three models of wheelchair available: light, heavy, and arcane. You’re encouraged to consider the type of character you’re playing and the class they belong to, then choose the model that best matches that character concept.

ARMOR

Every armor has a name, base damage thresholds, and a base Armor Score. Some armor also has a feature.

  • An armor’s base armor score indicates how many Armor Slots it provides its wearer before additional bonuses are added to calculate their total Armor Score. A PC’s Armor Score can’t exceed 12.

  • An armor’s base thresholds determine its wearer’s major and severe damage thresholds before adding bonuses to calculate their final damage thresholds.

  • An armor’s feature is a special rule that stays in effect while the armor is equipped.

While unarmored, your character’s base Armor Score is 0, their Major threshold is equal to their level, and their Severe threshold is equal to twice their level.

REDUCING INCOMING DAMAGE

When you take damage, you can mark one Armor Slot to reduce the number of Hit Points you would mark by one. If your character has an Armor Score of 0, you can’t mark Armor Slots. If an effect temporarily increases your Armor Score,

it increases your available Armor Slots by the same amount; when the effect ends, so does the availability of these Armor Slots.

LOOT

Loot comprises any consumables or reusable items the party acquires.

Items can be used until sold, discarded, or lost.

To generate a random item, choose a rarity, roll the designated dice, and match the total to the item in the table:

  • Common: 1d12 or 2d12

  • Rare: 3d12 or 4d12

  • Uncommon: 2d12 or 3d12

  • Legendary: 4d12 or 5d12

@UUID[RollTable.KKqUrMMXPpm7uhYT]{Loot}

Consumables

Consumables are loot that can only be used once. You can hold up to five of each consumable at a time. Using a consumable doesn’t require a roll unless required by the GM or the demands of the fiction.

To generate a random consumable, choose a rarity, roll the designated dice, and match the total to the item in the table:

  • Common: 1d12 or 2d12

  • Rare: 3d12 or 4d12

  • Uncommon: 2d12 or 3d12

  • Legendary: 4d12 or 5d12

@UUID[RollTable.wZXyi343PSVVwWB3]{Consumables}

GOLD

Gold is an abstract measurement of how much wealth a character has, and is measured in handfuls, bags, and chests, with 10 handfuls to 1 bag, and 10 bags to 1 chest. When you have marked all of the slots in a category and you gain another gold reward in that category, mark a slot in the following category and clear all the slots in the current one.

For example, if you have 9 handfuls and gain another, you instead mark 1 bag and erase all handfuls. If you have 9 bags and gain another, you mark 1 chest and erase all bags.

You can’t have more than 1 chest, so if all your Gold slots are marked, you’ll need to spend some of your gold or store it somewhere else before you can acquire more.


Optional Rule: Gold Coins

If your group wants to track gold with more granularity, you can add coins as your lowest denomination. Following the established pattern, 10 coins equal 1 handful.


" }, "video": { "controls": true, @@ -142,11 +142,10 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.351", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": "Bgvu4A6AMkRFOTGR", - "modifiedTime": 1767971461044 + "lastModifiedBy": null }, "_key": "!journal.pages!uNs7ne9VCbbu5dcG.C123WDOcT5hAa95M" }, @@ -163,7 +162,7 @@ "image": {}, "text": { "format": 1, - "content": "

INTRODUCTION

The GM is responsible for guiding the narrative and roleplaying the world the PCs inhabit. This section provides you with advice for running Daggerheart: using the core mechanics; creating memorable encounters; planning exciting sessions; selecting, creating, and using GM moves; crafting a full campaign; running dynamic NPCs; and more.

GM GUIDANCE

These three sections provide a foundation to help you get the most out of this game. The “GM Principles” are your guiding star—when in doubt, return to these principles.

GM PRINCIPLES

BEGIN AND END WITH THE FICTION

Use the fiction to drive mechanics, then connect the mechanics back to the fiction.

COLLABORATE AT ALL TIMES, ESPECIALLY DURING CONFLICT

The PCs are the protagonists of the campaign; antagonism between player and GM should exist only in the fiction.

FILL THE WORLD WITH LIFE, WONDER, AND DANGER

Showcase rich cultures, take the PCs to wondrous places, and introduce them to dangerous creatures.

ASK QUESTIONS AND INCORPORATE THE ANSWERS

Ensuring that the players’ ideas are included results in a narrative that supports the whole group’s creativity.

GIVE EVERY ROLL IMPACT

Only ask the players to roll during meaningful moments.

PLAY TO FIND OUT WHAT HAPPENS

Be surprised by what the characters do, the choices they make, and the people they become.

HOLD ON GENTLY

Don’t worry if you need to abandon or alter something that came before.

GM PRACTICES

CULTIVATE A CURIOUS TABLE

Follow what catches the players’ interest to foster an environment of creative inquiry.

GAIN YOUR PLAYERS’ TRUST

Act in good faith, follow through on your promises, admit your mistakes.

KEEP THE STORY MOVING FORWARD

Advance the story through escalating action, new information, or changing circumstances after every action roll, whether it succeeds or fails.

CUT TO THE ACTION

Skip past the boring bits. When a scene drags on, end it.

HELP THE PLAYERS USE THE GAME

Players have more fun when you help them understand the system.

CREATE A META CONVERSATION

Empower players to speak out of character, use safety tools, and ask for clarification.

TELL THEM WHAT THEY WOULD KNOW

Don’t hide obvious details or important information from the players.

GROUND THE WORLD IN MOTIVE

An NPC’s actions flow from their goals and desires.

BRING THE GAME’S MECHANICS TO LIFE

Set a good example of how fiction and mechanics work together to enhance the game experience.

REFRAME RATHER THAN REJECT

If a player’s contribution conflicts with the fiction, work with them to reshape it.

WORK IN MOMENTS AND MONTAGES

When framing a scene, decide which beats should be savored and which shouldn’t linger.

PITFALLS TO AVOID

UNDERMINING THE HEROES

If a roll doesn’t go well, show how it was impacted by an adversary’s prowess, environmental factors, or unexpected surprises, rather than the PC’s incompetence.

ALWAYS TELLING THE PLAYERS WHAT TO ROLL

Let the players decide how to handle a challenge.

LETTING SCENES DRAG

Shake it up or cut away when a scene has concluded, the table’s energy is flagging, or people are talking in circles.

SINGULAR SOLUTIONS

Don’t get hung up on one right answer to a problem. If the players have a clever idea, make it work.

OVERPLANNING

Spend your prep time inventing situations instead of scripting scenes. If the players surprise you, take a break to think through your options.

HOARDING FEAR

Spend Fear when you have the opportunity. The players will always generate more.

For more in-depth GM guidance, see pg. 140 of the Daggerheart Core Rulebook.

CORE GM MECHANICS

ROLLING DICE

The GM has no Duality Dice; instead, they roll a single d20 called the GM’s Die.

ADVERSARY ATTACK ROLLS

When an adversary attacks a PC, roll your d20 and add the adversary’s attack bonus to the result. If the total meets or beats the target’s Evasion, the attack succeeds; otherwise, the attack fails. On a successful attack, roll the attack’s damage dice to determine how much it deals.

If you roll a natural 20 on an attack, your roll automatically succeeds and you deal extra damage. Roll damage normally, then add the highest number on the damage dice to the total.

For example, an attack that deals 3d6+2 deals 18+3d6+2 on a critical success; the critical success does not affect the flat damage modifier.


Note: a critical success on an adversary’s reaction roll automatically succeeds, but confers no additional benefit.


GUIDANCE ON ACTION ROLLS

After a player describes a move they want to make during the game, you might decide an action roll is necessary to determine how the scene progresses. Use this guide to determine what to present the player, choosing whichever option best fits the situation:

  • Determine whether the roll is necessary, considering the PC’s Experiences or backstory, the pressure they’re acting under, and the possible outcomes.

  • Establish the stakes of an action roll before the player makes it.

  • Communicate any unavoidable consequences.

  • If desired, you can offer the player the opportunity to forgo an action roll in exchange for agreeing to an interesting outcome, cost, or complication.

MAKING MOVES

As the GM, you have GM moves that change the story in response to the players’ actions. GM moves aren’t bound by specific spells or effects—when you make a GM move, you can describe the action in whatever way the fiction demands.

GM moves happen during GM turns. A GM turn begins when the spotlight passes to them and ends when the spotlight passes back to the players.

WHEN TO MAKE A MOVE

The GM can make a GM move whenever you want, but the frequency and severity depends on the type of story you’re telling, the actions your players take, and the tone of the session you’re running.

Make a GM move when the players:

  • Roll with Fear

  • Fail an action roll

  • Do something that has unavoidable consequences

  • Give you a “golden opportunity” (an opening that demands an immediate response)

  • Look to you for what happens next

CHOOSING GM MOVES

The result of a player’s action roll determines your response:

On a Critical Success, you let the player describe their success, then give them an additional opportunity or advantage.

On a Success with Hope, you let the player describe their success, then you show how the world reacts to it.

On a Success with Fear, you work with the player to describe their success, then take a Fear and make a GM move to introduce a minor consequence, complication, or cost:

  • An adversary attacks

  • The PC marks a Stress

  • You introduce a new threat

  • You raise the stakes of the conflict

On a Failure with Hope, you describe how the PC fails to get what they want, then make a GM move to introduce a minor consequence, complication, or cost:

  • An adversary attacks

  • The PC marks a Stress

  • You introduce a new threat

  • You raise the stakes of the conflict

On a Failure with Fear, you describe how things go wrong, then make a GM move to introduce a major consequence, complication, or cost:

  • You put them in immediate danger

  • They become the focus of multiple adversaries

  • They are separated from their party

  • They lose an important opportunity for good.

QUICK REFERENCE:

RESOLVING ACTION ROLLS

If you’re unsure how to resolve a roll, think about these quick phrases:

Success with Hope: Yes, and… (You get what you want and gain a Hope.)

Success with Fear: Yes, but… (You get what you want, but there’s a consequence, and the GM gains a Fear.)

Failure with Hope: No, but… (Things don’t go as planned, but you gain a Hope.)

Failure with Fear: No, and… (Things don’t go as planned and it gets worse. The GM gains a Fear.)

If the move you should make is not obvious from the fiction, draw inspiration from the “Example GM Moves” list:

  • Introduce a new obstacle or enemy

  • Ask the player what happens

  • Have the PC mark a Stress

  • Tell the players “everything is fine… for now.”

SOFT AND HARD MOVES

Soft moves go easier on the players—they give the party new information about the scene and offer them an opportunity to react to it. Hard moves are harsher, more impactful, or more direct—the PCs don’t get an opening to interrupt, alter, or anticipate the outcome.

Use softer moves on rolls with Hope and harder moves on rolls with Fear.


Example GM Moves

  • Show how the world reacts

  • Ask a question and build on the answer

  • Make an NPC act in accordance with their motive

  • Drive a PC to take action by dangling their goals in front of them

  • Signal an imminent off-screen threat

  • Reveal an unwelcome truth or unexpected danger

  • Force the group to split up

  • Make a PC mark Stress

  • Make a move the characters don’t see

  • Show the collateral damage

  • Clear an adversary’s condition

  • Shift the environment

  • Spotlight an adversary

  • Capture someone or something important

  • Use a PC’s backstory against them

  • Take away an opportunity permanently.


USING FEAR

You start a campaign with 1 Fear per PC in the party.

You gain Fear whenever a PC rolls with Fear, the PCs take a rest (see: Downtime), or when an ability or effect tells you to.

You can never have more than 12 Fear at one time.

Fear carries over between sessions.

Spend a Fear to:

  • Interrupt the players to steal the spotlight and make a move

  • Make an additional GM move

  • Use an adversary’s Fear Feature

  • Use an environment’s Fear Feature

  • Add an adversary’s Experience to a roll

The dramatic tension of a scene correlates with the amount of Fear you spend during it. For guidance on how much Fear you should spend in a scene, consult the following table:

Incidental

A catch-up between PCs after an emotionally charged scene; gathering information; resupplying at a local market; resting during downtime.

0–1 Fear

Minor

A travel sequence; a minor skirmish that introduces new foes or signals future trouble.

1–3 Fear

Standard

A substantial battle with a notable objective; perilous travel that tests might and wit; a tense social encounter seeking crucial information or aid.

2–4 Fear

Major

A large battle with a Solo or Leader adversary; a character-defining scene with a significant change to a character’s personal story (such as revelation, growth, and betrayal).

4–8 Fear

Climactic

A major confrontation with the villain of a story arc; an epic set piece battle; a judicial duel to determine an important NPC’s fate.

6–12 Fear

If you find yourself with a large amount of Fear, consider:

  • Spending Fast: Spend Fear before the players have a chance to react

  • Spending Often: Spend Fear every time the spotlight swings to you

  • Spending Big: Spend Fear to make multiple moves in a row

Spending Fear to make a move communicates the increased impact of your action. Fear moves often include one or more of these elements:

  • Introducing new adversaries to a scene when their appearance hasn’t been foreshadowed or lacks context.

  • An adversary activating a powerful spell or transformation to deal massive damage or boost their capabilities.

  • An environment exerting a strong negative effect on the party.

DIFFICULTY BENCHMARKS

The Difficulty of an attack roll against an adversary is equal to the adversary’s Difficulty score. The Difficulty of any other action rolls against an adversary is equal to the adversary’s Difficulty score, plus (if applicable) the value of one of the adversary relevant Experience modifiers.

When a player makes an action roll without a specified Difficulty, the GM sets the Difficulty according to the totality of the circumstances. Refer to the following benchmark table for more guidance:

AGILITY

ROLL

SPRINT

LEAP

MANEUVER

5

Sprint within Close range across an open field with an enemy present.

Make a running jump of half your height (about 3 feet for a human).

Walk slowly across a narrow beam.

10

Sprint within Far range across an open field with an enemy present.

Make a running jump of your height (about 6 feet for a human).

Walk quickly across a narrow beam.

15

Sprint within Close range across rough terrain with an enemy present.

Make a running jump of double your height (about 12 feet for a human).

Run across a narrow beam.

20

Sprint within Close range through an active battle of multiple enemies.

Make a running jump of three times your height (about 18 feet for a human).

Run across a narrow beam in heavy wind.

25

Sprint within Far range through a pitched battle in rough terrain.

Make a running jump of five times your height (about 30 feet for a human).

Run across a very narrow beam in an active rainstorm.

30

Sprint across the heads of your enemies in a pitched battle.

Make a running jump of ten times your height (about 60 feet for a human).

Run across an inch-wide, oil-slicked beam in an active rainstorm.

STRENGTH

ROLL

LIFT

SMASH

GRAPPLE

5

Lift a chair.

Destroy a glass cup.

Subdue a child.

10

Lift a table or small chest.

Destroy a small wooden table.

Subdue a weak adult.

15

Lift a grown person or large chest.

Break through a wooden door.

Subdue an average adult.

20

Lift the side of a laden cart or carry a large chest up stairs.

Break through a stone wall.

Subdue a skilled wrestler.

25

Lift a horse, an ox, or a large monster.

Break through a dragon’s teeth.

Subdue a large beast.

30

Lift a falling portcullis gate.

Break a god’s grip.

Subdue a legendary beast.

FINESSE

ROLL

CONTROL

HIDE

TINKER

5

Ride a horse through easy terrain.

Evade notice under full cover on a moonless night.

Open a sticky lock with the appropriate key.

10

Drive an ox-pulled cart.

Evade notice in limited cover on a moonless night.

Open a simple puzzle box.

15

Ride a horse through rough terrain.

Evade notice in limited cover on an average night.

Disable a standard trap.

20

Drive a cart through rough terrain.

Evade notice in the shadows on an average night.

Disable a complicated trap.

25

Ride a wild horse through dangerous terrain.

Evade notice with minimal cover in ample light.

Open a door secured by a sequence of elaborate locks.

30

Ride an enraged beast through dangerous terrain.

Evade notice with no cover in full daylight.

Disable an incredibly sensitive and deadly trap.

INSTINCT

ROLL

PERCEIVE

SENSE

NAVIGATE

5

Hear a loud noise twenty paces away.

Detect an obvious ambush or notice an obvious deception.

Follow a well-trod path in good lighting and weather.

10

Hear a speaking voice fifty paces away.

Detect a looming threat or notice an average person’s lies.

Follow an average path in good lighting and weather.

15

Hear someone walking in the woods fifty paces away.

Detect hostile intent from a foe or see through a merchant’s lies.

Follow a subtle path through rough conditions.

20

Hear someone sneaking through the woods fifty paces away.

Detect a politician’s veiled hostility or detect a nearby assassin.

Follow a subtle path through harsh conditions.

25

Hear a prowling animal fifty paces away.

Identify a spymaster’s plot or read a politican’s true intentions.

Find your way with no path through dangerous conditions.

30

Hear a diving bird a hundred paces away.

Sense a shred of doubt within a god’s pronouncement.

Find your way through a trickery god’s maze.

PRESENCE

ROLL

CHARM

PERFORM

DECEIVE

5

Win the trust of a friendly neighbor.

Earn a meal from a friendly crowd.

Trick a trusting acquaintance.

10

Win the trust of a friendly stranger.

Earn room and board in a small town or impress a small crowd.

Trick an average stranger.

15

Win the trust of a cautious stranger or talk your way into a noble’s party.

Earn room and board in a low-end tavern or impress a large crowd.

Trick an average merchant.

20

Win the trust of a sympathetic foe or talk your way into an enemy’s party.

Earn lodging in a high-end tavern or impress a full theater.

Trick a trained courtier.

25

Turn an enemy against their ruler or talk your way into a fae court.

Earn your keep in a royal court or impress a full colosseum.

Trick a spymaster.

30

Talk a hostile god into granting you a boon.

Save yourself from execution after offending the queen.

Trick a god.

KNOWLEDGE

ROLL

RECALL

ANALYZE

COMPREHEND

5

Recall uncommon facts about your community.

Unpack an obvious metaphor in a simple text.

Learn simple skills from an excellent teacher.

10

Recall uncommon facts about a neighboring community.

Identify obvious subtext in a conversation.

Learn simple skills from an average teacher.

15

Recall uncommon facts about a distant community.

Break an average cipher in a coded message.

Learn complicated skills from an excellent teacher.

20

Recall specialized facts about a distant community.

Identify a weakness in a complicated battle plan.

Learn complicated skills under poor conditions.

25

Recall specialized facts about a fallen kingdom.

Predict the downfall of a nation based on concealed misdeeds.

Learn complicated skills quickly under dangerous conditions.

30

Recall secret information about an obscure historical group.

Identify the weakness in a divine champion’s fighting form.

Learn complicated skills quickly from incomplete information.

GIVING ADVANTAGE AND DISADVANTAGE

To viscerally convey how a PC’s actions or circumstances affect their ability to act, grant them advantage die (or impose disadvantage die) instead of adjusting the Difficulty of an action roll.

ADVERSARY ACTION ROLLS

By default, adversaries don’t normally make action rolls except for attack rolls and any unique actions described in their stat blocks. Any other action an adversary attempts simply succeeds without an action roll; if you want an adversary’s action to have a chance of failure, have any relevant PCs make reaction rolls instead.

However, for especially dramatic or difficult tasks that the PCs can’t influence, you can give an adversary an action roll anyway. For an adversary’s action roll, roll a d20. If the result is equal to or greater than the action’s Difficulty, the action succeeds—otherwise it fails. You can spend a Fear before rolling to add a relevant Experience from the adversary’s stat block to the total. Use the same procedure when an adversary makes a reaction roll.

ADVERSARY ADVANTAGE & DISADVANTAGE

If an adversary has advantage on an action roll, the GM rolls an extra d20 and counts only the higher result. If an adversary has disadvantage on an action roll, the GM rolls an extra d20 and counts only the lower result.

ADVERSARY ATTACKS

When an adversary attacks a PC, the GM rolls a d20 and adds the adversary’s Attack Modifier to the result. If the total meets or beats the target’s Evasion, the attack succeeds; otherwise, it fails. Before rolling, the GM can grant the attacking adversary advantage, impose disadvantage, or spend a Fear to add a relevant Experience from the adversary’s stat block to the total.

On a success, the adversary deals the damage listed in their stat block to the target.

When an adversary’s action lets the GM make an attack against multiple targets, they make one attack roll and compare it to each target’s Evasion separately.

COUNTDOWNS

Countdowns represent a period of time or series of events preceding a future effect. A countdown begins at a starting value. When a countdown advances, it’s reduced by 1. The countdown’s effect is triggered when the countdown reaches 0.


Note: You can track countdowns by “spinning down” dice or ticking off boxes.


Standard countdowns advance every time a player makes an action roll. If an adversary or environment ability refers to a “Countdown [n],” then it means a standard countdown with a starting value of n.

Dynamic countdowns advance by up to 3 depending on the outcomes of action rolls. Consequence countdowns are dynamic countdowns to negative effects. Progress countdowns are dynamic countdowns to positive effects. Dynamic countdowns advance according to this chart:

DYNAMIC COUNTDOWN ADVANCEMENT

Roll Result

Progress Advancement

Consequence Advancement

Failure with Fear

No advancement

Tick down 3

Failure with Hope

No advancement

Tick down 2

Success with Fear

Tick down 1

Tick down 1

Success with Hope

Tick down 2

No advancement

Critical Success

Tick down 3

No advancement

ADVANCED COUNTDOWN FEATURES

  • Countdowns with randomized starting values

  • Loop countdowns that reset to their starting value after their countdown effect is triggered.

  • Increasing countdowns that increase their starting value by 1 every time they loop.

  • Decreasing countdowns that decrease their starting value by 1 every time they loop.

  • Linked progress and consequence countdowns that simultaneously advance according to the same action roll outcomes.

  • Long-term countdowns that advance after rests instead of action rolls.

GIVING OUT GOLD, EQUIPMENT, AND LOOT

It’s up to you and your players how much importance you want to place on gold, equipment, and loot in your campaign.

Adjust the availability and utility of wealth and equipment to reflect the tone, themes, and setting of your campaign.

If you don’t wish to track gold, then when PCs go shopping fornew items let them pick one or two from a short, preselected list that aligns with your campaign setting and the party’s current location.

Otherwise, set the prices of goods and services by adjusting the entries in the Average Costs table to reflect your campaign setting:

Meals for a party of adventurers per night

1 Handful

Standard inn room per night

1 Handful

Luxury inn room per night

1 Bag

Carriage ride

2 Handfuls

Mount (horse, mule, etc.)

3 Bags

Specialized tools

3 Handfuls

Fine clothing

3 Handfuls

Luxury clothing

1 Bag

Tier 1 equipment (weapons, armor)

1–5 Handfuls

Tier 2 equipment (weapons, armor)

1–2 Bags

Tier 3 equipment (weapons, armor)

5–10 Bags

Tier 4 equipment (weapons, armor)

1–2 Chests

RUNNING GM NPCS

When you run NPCs as the GM, you should always strive to follow your GM principles and use them to bring the world to life. Differentiate NPCs with unique manners of speech and action; let their individual goals and desires motivate their actions.

The only essential elements for a NPC are their name, description, and motive. If it’s likely that the PCs will roll actions against them, give them a Difficulty. Adversaries can be invented or improvised by modifying the stat block of another adversary.

If an NPC becomes an ally in combat, they don’t need a stat block—just put the spotlight on what they do and show how their involvement alters the fiction. If a PC capitalizes on their help during the scene, give the PC advantage. NPCs that don’t have Hit Points or Stress can still be injured or killed if the fiction demands it.

If you want an important NPC to mechanically interact with the system, you can give them one or more features with specific triggers and effects. An NPC might also have a choice that adjusts the parameters of their feature. For example:

ARCANE HOLD

Choice: When the battle begins, choose a favored PC.

Trigger: The first time during a battle the favored PC is within Close range and hit with an attack.

Effect: Make an attack roll with a +6 modifier against the adversary. On a success, the target is temporarily Restrained by tendrils of powerful magic.

NPC FEATURE EXAMPLES

VOLLEY OF ARROWS

Trigger: A battle begins and this NPC is involved.

Effect: Activate a countdown (Loop 3). It ticks down when a PC misses an attack. When it triggers, this NPC releases a volley of arrows at a target of the PCs’ choice, dealing 2d8+3 physical damage.

MENTOR

​​Choice: When the battle begins, choose a protégé PC.

Trigger: Your protégé is within Close range and fails an attack roll.

Effect: Move into Melee range with the PC and give them advice or guidance. The next attack roll they make has advantage.

REGROUP

​​Choice: When a battle begins, choose a point within Far range.

Trigger: All PCs have marked all of their Armor Slots.

Effect: Teleport all PCs and this NPC to the chosen spot and clear an Armor Slot on each target.

INTO THE NIGHT

Trigger: The PCs start a long rest with this NPC.

Effect: Roll 1d4. On a 2 or less, this NPC steals 1 handful of gold from the party while they are sleeping, then disappears into the night.

OPTIONAL GM MECHANICS

FATE ROLLS

When the GM wants to leave an outcome entirely up to chance, they call for a fate roll. The GM establishes what’s at stake and how the roll will be interpreted. Then a player rolls one of their Duality Dice and interprets the result.


Examples:

“Roll your Fear Die. On a 4 or lower, the fire spreads beyond this house.”

“I think it’s really up to chance whether reinforcements will make it to you in time. Go ahead and roll your Fear Die— that’ll determine the starting size of the countdown. When that triggers, reinforcements will arrive in your Far range.”

“Go ahead and roll your Hope Die to see how big the crowd at the inn is tonight. The higher the roll, the bigger the crowd.”

“Make a roll using your Hope Die to determine the number of Stamina Potions the shop has in stock.”


FALLING AND COLLISION DAMAGE

If a character falls to the ground, you can use the following as a guide to determine the damage they take:

  • A fall from Very Close range deals 1d10+3 physical damage.

  • A fall from Close range deals 1d20+5 physical damage.

  • A fall from Far or Very Far range deals 1d100+15 physical damage, or death at the GM’s discretion.

If a character collides with an object or another character at a dangerous speed, they take 1d20+5 direct physical damage.

MOVING AND FIGHTING UNDERWATER

By default, attack rolls made while the attacker is underwater have disadvantage.

For creatures that can’t breathe underwater, use a standard countdown (3) to track how long they can hold their breath.

Advance the countdown whenever the PC takes an action. In addition if they fail a roll or roll with Fear while underwater, you can spend your GM move to advance it an additional time—or twice, if they rolled a failure with Fear.

Once the countdown ends, the underwater PC must mark a Stress whenever they take an action.

CONFLICT BETWEEN PCS

Sometimes a player might want their character to act against another PC in the scene. Before jumping to rolling dice, discuss the situation with both players to decide how to resolve the conflict. A roll might not be necessary to reach an outcome—but if rolling will be fun for everyone involved, come to a consensus on the terms of the roll, then facilitate the scene according to the results.

On an attack roll against a PC, the attacker rolls against the defender’s Evasion, just like an adversary. On any other kind of action roll, the instigator makes an action roll and the target makes a reaction roll. To succeed, the instigator must beat a Difficulty equal to the total value of the reaction roll.

ADVERSARIES AND ENVIRONMENTS

USING ADVERSARIES

ADVERSARY STAT BLOCKS

All the information required to run an adversary is contained in their stat block. An adversary’s stat block includes their:

NAME

Each stat block has a unique name. Abilities that affect adversaries with a certain name include all adversaries who use that stat block, regardless of their in-story name.

TIER

Each adversary is designed to oppose PCs of a certain tier. If you confront the party with an adversary from another tier, adjust their stats.

TYPE

The adversary’s type appears alongside their tier. An adversary’s type represents the role they play in a conflict.

The adversary types are:

  • Bruisers: tough; deliver powerful attacks.

  • Hordes: groups of identical creatures acting together as a single unit.

  • Leaders: command and summon other adversaries.

  • Minions: easily dispatched but dangerous in numbers.

  • Ranged: fragile in close encounters but deal high damage at range.

  • Skulks: maneuver and exploit opportunities to ambush opponents.

  • Socials: present challenges around conversation instead of combat.

  • Solos: present a formidable challenge to a whole party, with or without support.

  • Standards: representative of their fictional group.

  • Supports: enhance their allies and disrupt their opponents.

DESCRIPTION

A summary of the adversary's appearance and demeanor.

MOTIVES & TACTICS

Suggusted impulses, actions and goals for the adversary.

DIFFICULTY

The Difficulty of any roll made against the adversary, unless otherwise noted.

DAMAGE THRESHOLDS, HIT POINTS, AND STRESS

These systems function the same way they do for PCs. The numbers listed after “Threshold” are the adversary’s Major and Severe Thresholds.

ATTACK MODIFIER

When you attack with the adversary, apply this bonus or penalty to your attack roll.

STANDARD ATTACK

A description of the adversary’s primary mode of inflicting harm on the PCs. It includes the attack’s name, its effective range, and the damage it deals on a success. Using an adversary’s standard attack is a GM move.

EXPERIENCE (OPTIONAL)

The GM can spend a Fear to add an adversary’s relevant Experience to raise their attack roll or increase the Difficulty of a roll made against them.

EXAMPLE EXPERIENCES:

Acrobatics

Hunt from Above

Navigation

Ambusher

Intimidation

Nobility

Bartering

Intrusion

Quick Reflexes

Blademaster

Keen Senses

Socialite

Bodyguard

Magical Knowledge

Stealth

Commander

Nature’s Friend

Tracker

FEATURE(S)

There are three kinds of adversary features: actions, reactions, and passives. Note: each adversaries stress is tracked individually. If a feature requires the GM to spend Stress to activate it, the Stress must come from the adversary whose feature is being activate. If a feature has a Fear requirement, it must be spent in addition to any Fear already spent—for instance, to interrupt the PCs and put the spotlight on the adversary.

  • Actions: a special attack or other unique action that the adversary can perform when the spotlight is on them.

  • Reactions: special effects that take effect when their trigger occurs, regardless of whether the spotlight is on the adversary.

  • Passives: special abilities that remain in effect by default and require no resources or triggers to activate.

FEAR FEATURE(S)

High-impact effects that cost a Fear to activate.

EXAMPLE ADVERSARY FEATURES:

ACTIONS

Haymaker - Action: Make an attack against a target within Very Close range. On a success, deal X direct physical damage.

Shredding Strike - Action: Make an attack against a target within Very Close range. On a success, deal X physical damage and the target must mark an Armor Slot without gaining its benefit (they can still use armor to reduce the damage).

More Where That Came From - Action: Summon three Jagged Knife Lackeys, who appear at Far range.

REACTIONS

Heavy Hitter - Reaction: When this adversary deals damage with a standard attack, you can spend a Fear to gain a +X bonus to the damage roll.

Team-Up - Reaction: When another adversary within Very Close range of this adversary deals X damage to a creature, you can mark a Stress to make a standard attack against that same creature. On a success, combine the damage.

Momentum - Reaction: When this adversary makes a successful attack against a PC, you gain a Fear.

PASSIVES

Horde (X) - Passive: When the Horde has marked half or more of their HP, their standard attack deals X damage instead.

Minion (X) - Passive: This adversary is defeated when they take any damage. For every X damage a PC deals to this adversary, defeat an additional Minion within range the attack would succeed against.

Relentless (X) - Passive: This adversary can be spotlighted up to X times per GM turn. Spend Fear as usual to spotlight them.

Slow - Passive: When you spotlight this adversary and they don’t have a token on their stat block, they can’t act yet. Place a token on their stat block and describe what they’re preparing to do. When you spotlight this adversary and they have a token on their stat block, clear the token and they can act.

Arcane Form - Passive: This adversary is resistant to magic damage.

Armored Carapace - Passive: When this adversary takes physical damage, reduce it by X.

FEAR FEATURES

Explosion - Action: Spend a Fear to erupt in a fiery explosion. Make an attack against all targets within Close range. Targets the adversary succeeds against take 1d8 magic damage and are knocked back to Far range.

BUILDING BALANCED ENCOUNTERS

When planning a battle, start with [(3 x the number of PCs in combat) + 2] Battle Points and make the following adjustments:

  • -1 for an easier or shorter fight

  • -2 if you’re using 2 or more Solo adversaries

  • -2 if you add +1d4 (or a static +2) to all adversaries’ damage rolls

  • +1 if you choose an adversary from a lower tier

  • +1 if you don’t include any Bruisers, Hordes, Leaders, or Solos

  • +2 for a harder or longer fight

Then spend your Battle Points to add an adversary to the encounter:

  • Spend 1 point for each group of Minions equal to the size of the party.

  • Spend 1 point for each Social or Support adversary.

  • Spend 2 points for each Horde, Ranged, Skulk, or Standard adversary.

  • Spend 3 points for each Leader adversary.

  • Spend 4 points for each Bruiser adversary.

  • Spend 5 points for each Solo adversary.

DEFEATED ADVERSARIES

When an adversary marks their last Hit Point, they are defeated: incapacitated, tied up, routed, killed, or anything else the table decides makes sense.

ADVERSARY STAT BLOCK BENCHMARKS

ADVERSARY STATISTIC

TIER 1

TIER 2

TIER 3

TIER 4

Attack Modifier

+1

+2

+3

+4

Damage Dice

1d6+2 to 1d12+4

2d6+3 to 2d12+4

3d8+3 to 3d12+5

4d8+10 to 4d12+15

Difficulty

11

14

17

20

Damage Thresholds

Major 7/Severe 12

Major 10/Severe 20

Major 20/Severe 32

Major 25/Severe 45

ADVERSARIES BY TIER

This section contains the following stat blocks:

TIER 1 (LEVEL 1)

  • @UUID[Compendium.daggerheart.adversaries.Actor.89yAh30vaNQOALlz]{Acid Burrower}

  • @UUID[Compendium.daggerheart.adversaries.Actor.71qKDLKO3CsrNkdy]{Bear}

  • @UUID[Compendium.daggerheart.adversaries.Actor.8Zkqk1jU09nKL2fy]{Cave Ogre}

  • @UUID[Compendium.daggerheart.adversaries.Actor.uOP5oT9QzXPlnf3p]{Construct}

  • @UUID[Compendium.daggerheart.adversaries.Actor.CBBuEXAlLKFMJdjg]{Courtier}

  • @UUID[Compendium.daggerheart.adversaries.Actor.9x2xY9zwc3xzbXo5]{Deeproot Defender}

  • @UUID[Compendium.daggerheart.adversaries.Actor.wNzeuQLfLUMvgHlQ]{Dire Wolf}

  • @UUID[Compendium.daggerheart.adversaries.Actor.IIWV4ysJPFPnTP7W]{Giant Mosquitoes}

  • @UUID[Compendium.daggerheart.adversaries.Actor.4PfLnaCrOcMdb4dK]{Giant Rat}

  • @UUID[Compendium.daggerheart.adversaries.Actor.fmfntuJ8mHRCAktP]{Giant Scorpion}

  • @UUID[Compendium.daggerheart.adversaries.Actor.8KWVLWXFhlY2kYx0]{Glass Snake}

  • @UUID[Compendium.daggerheart.adversaries.Actor.uRtghKE9mHlII4rs]{Harrier}

  • @UUID[Compendium.daggerheart.adversaries.Actor.JRhrrEg5UroURiAD]{Archer Guard}

  • @UUID[Compendium.daggerheart.adversaries.Actor.B4LZcGuBAHzyVdzy]{Bladed Guard}

  • @UUID[Compendium.daggerheart.adversaries.Actor.mK3A5FTx6k8iPU3F]{Head Guard}

  • @UUID[Compendium.daggerheart.adversaries.Actor.5Lh1T0zaT8Pkr2U2]{Jagged Knife Bandit}

  • @UUID[Compendium.daggerheart.adversaries.Actor.MbBPIOxaxXYNApXz]{Jagged Knife Hexer}

  • @UUID[Compendium.daggerheart.adversaries.Actor.CBKixLH3yhivZZuL]{Jagged Knife Kneebreaker}

  • @UUID[Compendium.daggerheart.adversaries.Actor.C0OMQqV7pN6t7ouR]{Jagged Knife Lackey}

  • @UUID[Compendium.daggerheart.adversaries.Actor.aTljstqteGoLpCBq]{Jagged Knife Lieutenant}

  • @UUID[Compendium.daggerheart.adversaries.Actor.XF4tYTq9nPJAy2ox]{Jagged Knife Shadow}

  • @UUID[Compendium.daggerheart.adversaries.Actor.1zuyof1XuIfi3aMG]{Jagged Knife Sniper}

  • @UUID[Compendium.daggerheart.adversaries.Actor.Al3w2CgjfdT3p9ma]{Merchant}

  • @UUID[Compendium.daggerheart.adversaries.Actor.sRn4bqerfARvhgSV]{Minor Chaos Elemental}

  • @UUID[Compendium.daggerheart.adversaries.Actor.DscWkNVoHak6P4hh]{Minor Fire Elemental}

  • @UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demon}

  • @UUID[Compendium.daggerheart.adversaries.Actor.G62k4oSkhkoXEs2D]{Minor Treant}

  • @UUID[Compendium.daggerheart.adversaries.Actor.SHXedd9zZPVfUgUa]{Green Ooze}

  • @UUID[Compendium.daggerheart.adversaries.Actor.aLkLFuVoKz2NLoBK]{Tiny Green Ooze}

  • @UUID[Compendium.daggerheart.adversaries.Actor.9rVlbJVrDNn1x7PS]{Red Ooze}

  • @UUID[Compendium.daggerheart.adversaries.Actor.1fkLQXVtmILqfJ44]{Tiny Red Ooze}

  • @UUID[Compendium.daggerheart.adversaries.Actor.wycLpvebWdUqRhpP]{Petty Noble}

  • @UUID[Compendium.daggerheart.adversaries.Actor.OROJbjsqagVh7ECV]{Pirate Captain}

  • @UUID[Compendium.daggerheart.adversaries.Actor.5YgEajn0wa4i85kC]{Pirate Raiders}

  • @UUID[Compendium.daggerheart.adversaries.Actor.mhcVkVFrzIJ18FDm]{Pirate Tough}

  • @UUID[Compendium.daggerheart.adversaries.Actor.bgreCaQ6ap2DVpCr]{Sellsword}

  • @UUID[Compendium.daggerheart.adversaries.Actor.7X5q7a6ueeHs5oA9]{Skeleton Archer}

  • @UUID[Compendium.daggerheart.adversaries.Actor.6l1a3Fazq8BoKIcc]{Skeleton Dredge}

  • @UUID[Compendium.daggerheart.adversaries.Actor.Q9LaVTyXF9NF12C7]{Skeleton Knight}

  • @UUID[Compendium.daggerheart.adversaries.Actor.10YIQl0lvCJXZLfX]{Skeleton Warrior}

  • @UUID[Compendium.daggerheart.adversaries.Actor.ldbWEL7uZs84vyrR]{Spellblade}

  • @UUID[Compendium.daggerheart.adversaries.Actor.qNgs3AbLyJrY19nt]{Swarm of Rats}

  • @UUID[Compendium.daggerheart.adversaries.Actor.VtFBt9XBE0WrGGxP]{Sylvan Soldier}

  • @UUID[Compendium.daggerheart.adversaries.Actor.PKSXFuaIHUCoH63A]{Tangle Bramble Swarm}

  • @UUID[Compendium.daggerheart.adversaries.Actor.XcAGOSmtCFLT1unN]{Tangle Bramble}

  • @UUID[Compendium.daggerheart.adversaries.Actor.ZNbQ2jg35LG4t9eH]{Weaponmaster}

  • @UUID[Compendium.daggerheart.adversaries.Actor.8yUj2Mzvnifhxegm]{Young Dryad}

  • @UUID[Compendium.daggerheart.adversaries.Actor.2UeZ0tEe7AzgSJNd]{Brawny Zombie}

  • @UUID[Compendium.daggerheart.adversaries.Actor.EQTOAOUrkIvS2z88]{Patchwork Zombie Hulk}

  • @UUID[Compendium.daggerheart.adversaries.Actor.gP3fWTLzSFnpA8EJ]{Rotted Zombie}

  • @UUID[Compendium.daggerheart.adversaries.Actor.2nXz4ilAY4xuhKLm]{Shambling Zombie}

  • @UUID[Compendium.daggerheart.adversaries.Actor.Nf0v43rtflV56V2T]{Zombie Pack}

TIER 2 (LEVELS 2–4)

  • @UUID[Compendium.daggerheart.adversaries.Actor.0ts6CGd93lLqGZI5]{Archer Squadron}

  • @UUID[Compendium.daggerheart.adversaries.Actor.vNIbYQ4YSzNf0WPE]{Apprentice Assassin}

  • @UUID[Compendium.daggerheart.adversaries.Actor.h5RuhzGL17dW5FBT]{Assassin Poisoner}

  • @UUID[Compendium.daggerheart.adversaries.Actor.dNta0cUzr96xcFhf]{Master Assassin}

  • @UUID[Compendium.daggerheart.adversaries.Actor.dgH3fW9FTYLaIDvS]{Battle Box}

  • @UUID[Compendium.daggerheart.adversaries.Actor.jDmHqGvzg5wjgmxE]{Chaos Skull}

  • @UUID[Compendium.daggerheart.adversaries.Actor.99TqczuQipBmaB8i]{Conscript}

  • @UUID[Compendium.daggerheart.adversaries.Actor.ZxWaWPdzFIUPNC62]{Courtesan}

  • @UUID[Compendium.daggerheart.adversaries.Actor.0NxCSugvKQ4W8OYZ]{Cult Adept}

  • @UUID[Compendium.daggerheart.adversaries.Actor.tyBOpLfigAhI9bU3]{Cult Fang}

  • @UUID[Compendium.daggerheart.adversaries.Actor.zx99sOGTXicP4SSD]{Cult Initiate}

  • @UUID[Compendium.daggerheart.adversaries.Actor.NoRZ1PqB8N5wcIw0]{Demonic Hound Pack}

  • @UUID[Compendium.daggerheart.adversaries.Actor.TLzY1nDw0Bu9Ud40]{Electric Eels}

  • @UUID[Compendium.daggerheart.adversaries.Actor.bfhVWMBUh61b9J6n]{Elite Soldier}

  • @UUID[Compendium.daggerheart.adversaries.Actor.ChwwVqowFw8hJQwT]{Failed Experiment}

  • @UUID[Compendium.daggerheart.adversaries.Actor.8VZIgU12cB3cvlyH]{Giant Beastmaster}

  • @UUID[Compendium.daggerheart.adversaries.Actor.YnObCleGjPT7yqEc]{Giant Brawler}

  • @UUID[Compendium.daggerheart.adversaries.Actor.5s8wSvpyC5rxY5aD]{Giant Recruit}

  • @UUID[Compendium.daggerheart.adversaries.Actor.OMQ0v6PE8s1mSU0K]{Giant Eagle}

  • @UUID[Compendium.daggerheart.adversaries.Actor.8mJYMpbLTb8qIOrr]{Gorgon}

  • @UUID[Compendium.daggerheart.adversaries.Actor.MYXmTx2FHcIjdfYZ]{Juvenile Flickerfly}

  • @UUID[Compendium.daggerheart.adversaries.Actor.7ai2opemrclQe3VF]{Knight of the Realm}

  • @UUID[Compendium.daggerheart.adversaries.Actor.niBpVU7yeo5ccskE]{Masked Thief}

  • @UUID[Compendium.daggerheart.adversaries.Actor.Vy02IhGhkJLuezu4]{Merchant Baron}

  • @UUID[Compendium.daggerheart.adversaries.Actor.rM9qCIYeWg9I0B4l]{Minotaur Wrecker}

  • @UUID[Compendium.daggerheart.adversaries.Actor.mVV7a7KQAORoPMgZ]{Mortal Hunter}

  • @UUID[Compendium.daggerheart.adversaries.Actor.EtLJiTsilPPZvLUX]{Royal Advisor}

  • @UUID[Compendium.daggerheart.adversaries.Actor.sLAccjvCWfeedbpI]{Secret-Keeper}

  • @UUID[Compendium.daggerheart.adversaries.Actor.YmVAkdNsyuXWTtYp]{Shark}

  • @UUID[Compendium.daggerheart.adversaries.Actor.BK4jwyXSRx7IOQiO]{Siren}

  • @UUID[Compendium.daggerheart.adversaries.Actor.5tCkhnBByUIN5UdG]{Spectral Archer}

  • @UUID[Compendium.daggerheart.adversaries.Actor.65cSO3EQEh6ZH6Xk]{Spectral Captain}

  • @UUID[Compendium.daggerheart.adversaries.Actor.UFVGl1osOsJTneLf]{Spectral Guardian}

  • @UUID[Compendium.daggerheart.adversaries.Actor.8zlynOhnVA59KpKT]{Spy}

  • @UUID[Compendium.daggerheart.adversaries.Actor.3aAS2Qm3R6cgaYfE]{Stonewraith}

  • @UUID[Compendium.daggerheart.adversaries.Actor.noDdT0tsN6FXSmC8]{War Wizard}

TIER 3 (LEVELS 5–7)

  • @UUID[Compendium.daggerheart.adversaries.Actor.G7jiltRjgvVhZewm]{Adult Flickerfly}

  • @UUID[Compendium.daggerheart.adversaries.Actor.pnyjIGxxvurcWmTv]{Demon of Avarice}

  • @UUID[Compendium.daggerheart.adversaries.Actor.kE4dfhqmIQpNd44e]{Demon of Despair}

  • @UUID[Compendium.daggerheart.adversaries.Actor.2VN3BftageoTTIzu]{Demon of Hubris}

  • @UUID[Compendium.daggerheart.adversaries.Actor.SxSOkM4bcVOFyjbo]{Demon of Jealousy}

  • @UUID[Compendium.daggerheart.adversaries.Actor.5lphJAgzoqZI3VoG]{Demon of Wrath}

  • @UUID[Compendium.daggerheart.adversaries.Actor.tBWHW00epmMnkawe]{Dire Bat}

  • @UUID[Compendium.daggerheart.adversaries.Actor.wR7cFKrHvRzbzhBT]{Dryad}

  • @UUID[Compendium.daggerheart.adversaries.Actor.P7h54ZePFPHpYwvB]{Elemental Spark}

  • @UUID[Compendium.daggerheart.adversaries.Actor.dsfB3YhoL5SudvS2]{Greater Earth Elemental}

  • @UUID[Compendium.daggerheart.adversaries.Actor.xIICT6tEdnA7dKDV]{Greater Water Elemental}

  • @UUID[Compendium.daggerheart.adversaries.Actor.6hbqmxDXFOzZJDk4]{Huge Green Ooze}

  • @UUID[Compendium.daggerheart.adversaries.Actor.MI126iMOOobQ1Obn]{Hydra}

  • @UUID[Compendium.daggerheart.adversaries.Actor.yx0vK2yfNVZKWUUi]{Monarch}

  • @UUID[Compendium.daggerheart.adversaries.Actor.KGVwnLq85ywP9xvB]{Stag Knight}

  • @UUID[Compendium.daggerheart.adversaries.Actor.XK78QUfY8c8Go8Uv]{Oak Treant}

  • @UUID[Compendium.daggerheart.adversaries.Actor.o63nS0k3wHu6EgKP]{Treant Sapling}

  • @UUID[Compendium.daggerheart.adversaries.Actor.i2UNbRvgyoSs07M6]{Head Vampire}

  • @UUID[Compendium.daggerheart.adversaries.Actor.WWyUp6Mxl1S3KYUG]{Vampire}

  • @UUID[Compendium.daggerheart.adversaries.Actor.JqYraOqNmmhHk4Yy]{Vault Guardian Gaoler}

  • @UUID[Compendium.daggerheart.adversaries.Actor.FVgYb28fhxlVcGwA]{Vault Guardian Sentinel}

  • @UUID[Compendium.daggerheart.adversaries.Actor.c5hGdvY5UnSjlHws]{Vault Guardian Turret}

  • @UUID[Compendium.daggerheart.adversaries.Actor.UGPiPLJsPvMTSKEF]{Young Ice Dragon}

TIER 4 (LEVELS 8–10)

  • @UUID[Compendium.daggerheart.adversaries.Actor.WPEOIGfclNJxWb87]{Arch-Necromancer}

  • @UUID[Compendium.daggerheart.adversaries.Actor.OsLG2BjaEdTZUJU9]{Fallen Shock Troop}

  • @UUID[Compendium.daggerheart.adversaries.Actor.PELRry1vqjBzSAlr]{Fallen Sorcerer}

  • @UUID[Compendium.daggerheart.adversaries.Actor.hxZ0sgoFJubh5aj6]{Fallen Warlord: Realm-Breaker}

  • @UUID[Compendium.daggerheart.adversaries.Actor.RXkZTwBRi4dJ3JE5]{Fallen Warlord: Undefeated Champion}

  • @UUID[Compendium.daggerheart.adversaries.Actor.kabueAo6BALApWqp]{Hallowed Archer}

  • @UUID[Compendium.daggerheart.adversaries.Actor.VENwg7xEFcYObjmT]{Hallowed Soldier}

  • @UUID[Compendium.daggerheart.adversaries.Actor.r1mbfSSwKWdcFdAU]{High Seraph}

  • @UUID[Compendium.daggerheart.adversaries.Actor.4nqv3ZwJGjnmic8j]{Kraken}

  • @UUID[Compendium.daggerheart.adversaries.Actor.befIqd5IYKg6eUz2]{Oracle of Doom}

  • @UUID[Compendium.daggerheart.adversaries.Actor.A0SeeDzwjvqOsyof]{Outer Realms Abomination}

  • @UUID[Compendium.daggerheart.adversaries.Actor.ms6nuOl3NFkhPj1k]{Outer Realms Corruptor}

  • @UUID[Compendium.daggerheart.adversaries.Actor.moJhHgKqTKPS2WYS]{Outer Realms Thrall}

  • @UUID[Compendium.daggerheart.adversaries.Actor.ladm7wykhZczYzrQ]{Volcanic Dragon: Obsidian Predator}

  • @UUID[Compendium.daggerheart.adversaries.Actor.eArAPuB38CNR0ZIM]{Volcanic Dragon: Molten Scourge}

  • @UUID[Compendium.daggerheart.adversaries.Actor.pMuXGCSOQaxpi5tb]{Volcanic Dragon: Ashen Tyrant}

  • @UUID[Compendium.daggerheart.adversaries.Actor.CP6iRfHdyFWniTHY]{Perfected Zombie}

  • @UUID[Compendium.daggerheart.adversaries.Actor.YhJrP7rTBiRdX5Fp]{Zombie Legion}

USING ENVIRONMENTS

Environments represent everything in a scene beyond the PCs and adversaries, such as the physical space, background NPCs, and natural forces.

ENVIRONMENT STAT BLOCK

Each environment’s stat block presents their necessary mechanical statistics:

NAME

The unique name of the environment stat block.

TIER

The PC tier the environment is designed to challenge.

TYPE

The type of scene it most easily supports:

  • Explorations — wondrous locations with mysteries and marvels to discover

  • Socials — locations that primarily present interpersonal challenges

  • Traversals — dangerous locations where movement through and around the space itself is a challenge

  • Events — special activities or occurrences (rather than physical spaces)

DESCRIPTION

An evocative one-line summary of the environment.

IMPULSES

The manner or mode with which the environment pushs and pulls the people within them.

DIFFICULTY

The standard Difficulty for action rolls made to overcome, oppose, or resist the environment or its elements.

POTENTIAL ADVERSARIES

Suggested adversaries that might appear in scenes within the environment.

FEATURES

Features provide inspiration for GM moves you can use that represent the dynamic landscape or situation.

FEATURE QUESTIONS

Prompts for plot hooks, narrative engines, and connections to other story elements.

ADAPTING ENVIRONMENTS

Sometimes you want to use an environment but it’s at the wrong tier for your party. Or you might want to replace a feature or two, then present it as an entirely different environment. Whether planning your session or even improvising an environment mid-session, you can adjust an existing environment’s stat block to fit the needs of your scene or improvise elements as needed. The environments framework is there to help organize ideas, not to stifle creativity.

When you need to quickly adjust a stat block to a different tier, you can simply replace its existing statistics with those listed on the Environment Statistics by Tier table, using the column that corresponds to your party’s tier.

BENCHMARK STATISTICS FOR ENVIRONMENTS BY TIER

Environment Statistic

Tier 1

Tier 2

Tier 3

Tier 4

Damage Dice

1d6+1 to 1d8+3

2d6+3 to 2d10+2

3d8+3 to 3d10+1

4d8+3 to 4d10+10

Difficulty

11

14

17

20

ENVIRONMENT STAT BLOCKS BY TIER

This section contains the following stat blocks.

@UUID[Compendium.daggerheart.environments.Folder.GQ0VnOLrKBIHR6Us]{TIER 1 (LEVEL 1)}

  • @UUID[Compendium.daggerheart.environments.Actor.pGEdzdLkqYtBhxnG]{Abandoned Grove (Exploration)}

  • @UUID[Compendium.daggerheart.environments.Actor.uGEdNYERCTJBEjc5]{Ambushed (Event)}

  • @UUID[Compendium.daggerheart.environments.Actor.uXZpebPR77YQ1oXI]{Ambushers (Event)}

  • @UUID[Compendium.daggerheart.environments.Actor.HZKA7hkej7JJY503]{Bustling Marketplace (Social)}

  • @UUID[Compendium.daggerheart.environments.Actor.LPpfdlNKqiZIl04w]{Cliffside Ascent (Traversal)}

  • @UUID[Compendium.daggerheart.environments.Actor.cM4X81DOyvxNIi52]{Local Tavern (Social)}

  • @UUID[Compendium.daggerheart.environments.Actor.YezryR32uo39xRxW]{Outpost Town (Social)}

  • @UUID[Compendium.daggerheart.environments.Actor.t4cdqTfzcqP3H1vJ]{Raging River (Traversal)}

@UUID[Compendium.daggerheart.environments.Folder.XMeecO3IRvu5ck6F]{TIER 2 (LEVELS 2–4)}

  • @UUID[Compendium.daggerheart.environments.Actor.QAXXiOKBDmCTauHD]{Cult Ritual (Event)}

  • @UUID[Compendium.daggerheart.environments.Actor.dsA6j69AnaJhUyqH]{Hallowed Temple (Social)}

  • @UUID[Compendium.daggerheart.environments.Actor.OzYbizKraK92FDiI]{Haunted City (Exploration)}

  • @UUID[Compendium.daggerheart.environments.Actor.acMu9wJrMZZzLSTJ]{Mountain Pass (Traversal)}

@UUID[Compendium.daggerheart.environments.Folder.MfrIkJK12PAEfbPL]{TIER 3 (LEVELS 5–7)}

  • @UUID[Compendium.daggerheart.environments.Actor.oY69NN4rYxoRE4hl]{Burning Heart of the Woods (Exploration)}

  • @UUID[Compendium.daggerheart.environments.Actor.1eZ32Esq7rfZOjlu]{Castle Siege (Event)}

  • @UUID[Compendium.daggerheart.environments.Actor.EWD3ZsLoK6VMVOf7]{Pitched Battle (Event)}

@UUID[Compendium.daggerheart.environments.Folder.IKumu5HTLqONLYqb]{TIER 4 (LEVELS 8–10)}

  • @UUID[Compendium.daggerheart.environments.Actor.2Z1mKc65LxNk2PqR]{Chaos Realm (Traversal)}

  • @UUID[Compendium.daggerheart.environments.Actor.4DLYez7VbMCFDAuZ]{Divine Usurpation (Event)}

  • @UUID[Compendium.daggerheart.environments.Actor.jr1xAoXzVwVblzxI]{Imperial Court (Social)}

  • @UUID[Compendium.daggerheart.environments.Actor.h3KyRL7AshhLAmcH]{Necromancer’s Ossuary (Exploration)}

ADDITIONAL GM GUIDANCE

This section provides additional guidance for preparing and running a session of Daggerheart.

STORY BEATS

In storytelling, a beat is a moment that changes the trajectory of the narrative—a shift in the world, a significant action or reaction, an emotional revelation, or an important decision.

Take turns with the players, narrating a beat and then letting them react and carry the scene forward with their own beats.

When preparing for a session, plan in terms of the moments that give shape to each scene or sequence, rather than pre-scripting specific details or exchanges.

PREPARING COMBAT ENCOUNTERS

Build the hurdles the PCs face around the question of “What helps tell the story?” Enemies, environments, and hazards are the tools for heightening tension and creating drama. Ensure that combat is being used to give players more information about the unfolding story, revealing the world, the plot, or the characters.

BATTLES AND NARRATIVE

Dynamic battles create suspense by forcing players to choose between their various objectives, engaging their character’s motivations and weaknesses, and creating the crucible that the players use to forge their characters into legendary heroes. When preparing combat encounters:

  • Consider the narrative function of the battle

  • Base adversaries’ moves on their motives

  • Use dynamic environments to bring the battleground to life

  • Add enemies that can interact with the PCs’ features and special abilities

SESSION REWARDS

Reward players at the end of a session with:

  • Useful information

  • Story hooks

  • Loot

  • Gold

  • Access to new equipment or enhancements

CRAFTING SCENES

Whenever you start a session, arrive at a new place, or change the situation, tell the players what they need to know by thinking with all of your senses and sharing something unique or unexpected about the fiction.

ENGAGING YOUR PLAYERS

Keep your players engaged by:

  • Rotating the Focus between the PCs

  • Tying Together Story Elements

  • Engaging Quiet Players

  • Using Visual Aids

  • Encouraging Unguided Play

  • Confronting the PCs with internal and external conflicts

  • Raise the Stakes by Spending Fear

  • Layering Goals Other than Attrition into Combat (see Table of Random Objectives on the next page)

@UUID[Compendium.daggerheart.rolltables.RollTable.I5L1dlgxXTNrCCkL]{Table of Random Objectives}

PHASED BATTLES

Make battles by shifting the nature of its enemies or environment mid-combat:

  • Change the Terms of Engagement

  • Alter the Environment

  • Evolve the Opposition

USING DOWNTIME

Use downtime scenes as a pressure release valve to vary the intensity of the story and give the PCs room to breathe.

Empower your players to frame their own downtime scenes.

Ask the players what it looks like as they tend to their wounds or unwind together, encouraging them to take the reins and work with other players whose characters are involved

PROJECTS DURING DOWNTIME

The Work on a Project downtime move requires more GM input than other downtime moves and is best suited for long-term endeavors the PCs wish to undertake.

These projects are typically tracked using a Progress Countdown. When deciding the starting value of the countdown, consider the complexity of the project, the availability of relevant tools, and the impact of the project on the story.

Simple projects advance their countdown each time a player uses the Work on a Project move, but complex projects require a roll.

EXTENDED DOWNTIME

When you fast-forward the story across an extended period, use montages to illustrate the passage of time. You gain 1d6 Fear per PC and advance any long-term countdowns as appropriate.

CAMPAIGN FRAMES

A campaign frame provides inspiration, tools, and mechanics to support a particular type of story at the table.

Every campaign frame has a complexity rating that indicates how much its mechanics deviate from or expand upon the Daggerheart core ruleset.

Each campaign frame includes the following sections.

  • A pitch to present to players

  • Suggestions and guidance on tone, feel, themes, and touchstones

  • An overview of the campaign’s background

  • Guidance for fitting communities, ancestries, and classes into the setting

  • Principles for players and GMs to focus on during the campaign

  • Unique setting distinctions

  • An inciting incident to launch the campaign

  • Special mechanics to use during the campaign

  • Questions to consider during session zero

You can find each campaign frame map in the appendix of the core rulebook or at www.daggerheart.com/downloads.

" + "content": "

INTRODUCTION

The GM is responsible for guiding the narrative and roleplaying the world the PCs inhabit. This section provides you with advice for running Daggerheart: using the core mechanics; creating memorable encounters; planning exciting sessions; selecting, creating, and using GM moves; crafting a full campaign; running dynamic NPCs; and more.

GM GUIDANCE

These three sections provide a foundation to help you get the most out of this game. The “GM Principles” are your guiding star—when in doubt, return to these principles.

GM PRINCIPLES

BEGIN AND END WITH THE FICTION

Use the fiction to drive mechanics, then connect the mechanics back to the fiction.

COLLABORATE AT ALL TIMES, ESPECIALLY DURING CONFLICT

The PCs are the protagonists of the campaign; antagonism between player and GM should exist only in the fiction.

FILL THE WORLD WITH LIFE, WONDER, AND DANGER

Showcase rich cultures, take the PCs to wondrous places, and introduce them to dangerous creatures.

ASK QUESTIONS AND INCORPORATE THE ANSWERS

Ensuring that the players’ ideas are included results in a narrative that supports the whole group’s creativity.

GIVE EVERY ROLL IMPACT

Only ask the players to roll during meaningful moments.

PLAY TO FIND OUT WHAT HAPPENS

Be surprised by what the characters do, the choices they make, and the people they become.

HOLD ON GENTLY

Don’t worry if you need to abandon or alter something that came before.

GM PRACTICES

CULTIVATE A CURIOUS TABLE

Follow what catches the players’ interest to foster an environment of creative inquiry.

GAIN YOUR PLAYERS’ TRUST

Act in good faith, follow through on your promises, admit your mistakes.

KEEP THE STORY MOVING FORWARD

Advance the story through escalating action, new information, or changing circumstances after every action roll, whether it succeeds or fails.

CUT TO THE ACTION

Skip past the boring bits. When a scene drags on, end it.

HELP THE PLAYERS USE THE GAME

Players have more fun when you help them understand the system.

CREATE A META CONVERSATION

Empower players to speak out of character, use safety tools, and ask for clarification.

TELL THEM WHAT THEY WOULD KNOW

Don’t hide obvious details or important information from the players.

GROUND THE WORLD IN MOTIVE

An NPC’s actions flow from their goals and desires.

BRING THE GAME’S MECHANICS TO LIFE

Set a good example of how fiction and mechanics work together to enhance the game experience.

REFRAME RATHER THAN REJECT

If a player’s contribution conflicts with the fiction, work with them to reshape it.

WORK IN MOMENTS AND MONTAGES

When framing a scene, decide which beats should be savored and which shouldn’t linger.

PITFALLS TO AVOID

UNDERMINING THE HEROES

If a roll doesn’t go well, show how it was impacted by an adversary’s prowess, environmental factors, or unexpected surprises, rather than the PC’s incompetence.

ALWAYS TELLING THE PLAYERS WHAT TO ROLL

Let the players decide how to handle a challenge.

LETTING SCENES DRAG

Shake it up or cut away when a scene has concluded, the table’s energy is flagging, or people are talking in circles.

SINGULAR SOLUTIONS

Don’t get hung up on one right answer to a problem. If the players have a clever idea, make it work.

OVERPLANNING

Spend your prep time inventing situations instead of scripting scenes. If the players surprise you, take a break to think through your options.

HOARDING FEAR

Spend Fear when you have the opportunity. The players will always generate more.

For more in-depth GM guidance, see pg. 140 of the Daggerheart Core Rulebook.

CORE GM MECHANICS

ROLLING DICE

The GM has no Duality Dice; instead, they roll a single d20 called the GM’s Die.

ADVERSARY ATTACK ROLLS

When an adversary attacks a PC, roll your d20 and add the adversary’s attack bonus to the result. If the total meets or beats the target’s Evasion, the attack succeeds; otherwise, the attack fails. On a successful attack, roll the attack’s damage dice to determine how much it deals.

If you roll a natural 20 on an attack, your roll automatically succeeds and you deal extra damage. Roll damage normally, then add the highest number on the damage dice to the total.

For example, an attack that deals 3d6+2 deals 18+3d6+2 on a critical success; the critical success does not affect the flat damage modifier.


Note: a critical success on an adversary’s reaction roll automatically succeeds, but confers no additional benefit.


GUIDANCE ON ACTION ROLLS

After a player describes a move they want to make during the game, you might decide an action roll is necessary to determine how the scene progresses. Use this guide to determine what to present the player, choosing whichever option best fits the situation:

  • Determine whether the roll is necessary, considering the PC’s Experiences or backstory, the pressure they’re acting under, and the possible outcomes.

  • Establish the stakes of an action roll before the player makes it.

  • Communicate any unavoidable consequences.

  • If desired, you can offer the player the opportunity to forgo an action roll in exchange for agreeing to an interesting outcome, cost, or complication.

MAKING MOVES

As the GM, you have GM moves that change the story in response to the players’ actions. GM moves aren’t bound by specific spells or effects—when you make a GM move, you can describe the action in whatever way the fiction demands.

GM moves happen during GM turns. A GM turn begins when the spotlight passes to them and ends when the spotlight passes back to the players.

WHEN TO MAKE A MOVE

The GM can make a GM move whenever you want, but the frequency and severity depends on the type of story you’re telling, the actions your players take, and the tone of the session you’re running.

Make a GM move when the players:

  • Roll with Fear

  • Fail an action roll

  • Do something that has unavoidable consequences

  • Give you a “golden opportunity” (an opening that demands an immediate response)

  • Look to you for what happens next

CHOOSING GM MOVES

The result of a player’s action roll determines your response:

On a Critical Success, you let the player describe their success, then give them an additional opportunity or advantage.

On a Success with Hope, you let the player describe their success, then you show how the world reacts to it.

On a Success with Fear, you work with the player to describe their success, then take a Fear and make a GM move to introduce a minor consequence, complication, or cost:

  • An adversary attacks

  • The PC marks a Stress

  • You introduce a new threat

  • You raise the stakes of the conflict

On a Failure with Hope, you describe how the PC fails to get what they want, then make a GM move to introduce a minor consequence, complication, or cost:

  • An adversary attacks

  • The PC marks a Stress

  • You introduce a new threat

  • You raise the stakes of the conflict

On a Failure with Fear, you describe how things go wrong, then make a GM move to introduce a major consequence, complication, or cost:

  • You put them in immediate danger

  • They become the focus of multiple adversaries

  • They are separated from their party

  • They lose an important opportunity for good.

QUICK REFERENCE:

RESOLVING ACTION ROLLS

If you’re unsure how to resolve a roll, think about these quick phrases:

Success with Hope: Yes, and… (You get what you want and gain a Hope.)

Success with Fear: Yes, but… (You get what you want, but there’s a consequence, and the GM gains a Fear.)

Failure with Hope: No, but… (Things don’t go as planned, but you gain a Hope.)

Failure with Fear: No, and… (Things don’t go as planned and it gets worse. The GM gains a Fear.)

If the move you should make is not obvious from the fiction, draw inspiration from the “Example GM Moves” list:

  • Introduce a new obstacle or enemy

  • Ask the player what happens

  • Have the PC mark a Stress

  • Tell the players “everything is fine… for now.”

SOFT AND HARD MOVES

Soft moves go easier on the players—they give the party new information about the scene and offer them an opportunity to react to it. Hard moves are harsher, more impactful, or more direct—the PCs don’t get an opening to interrupt, alter, or anticipate the outcome.

Use softer moves on rolls with Hope and harder moves on rolls with Fear.


Example GM Moves

  • Show how the world reacts

  • Ask a question and build on the answer

  • Make an NPC act in accordance with their motive

  • Drive a PC to take action by dangling their goals in front of them

  • Signal an imminent off-screen threat

  • Reveal an unwelcome truth or unexpected danger

  • Force the group to split up

  • Make a PC mark Stress

  • Make a move the characters don’t see

  • Show the collateral damage

  • Clear an adversary’s condition

  • Shift the environment

  • Spotlight an adversary

  • Capture someone or something important

  • Use a PC’s backstory against them

  • Take away an opportunity permanently.


USING FEAR

You start a campaign with 1 Fear per PC in the party.

You gain Fear whenever a PC rolls with Fear, the PCs take a rest (see: Downtime), or when an ability or effect tells you to.

You can never have more than 12 Fear at one time.

Fear carries over between sessions.

Spend a Fear to:

  • Interrupt the players to steal the spotlight and make a move

  • Make an additional GM move

  • Use an adversary’s Fear Feature

  • Use an environment’s Fear Feature

  • Add an adversary’s Experience to a roll

The dramatic tension of a scene correlates with the amount of Fear you spend during it. For guidance on how much Fear you should spend in a scene, consult the following table:

Incidental

A catch-up between PCs after an emotionally charged scene; gathering information; resupplying at a local market; resting during downtime.

0–1 Fear

Minor

A travel sequence; a minor skirmish that introduces new foes or signals future trouble.

1–3 Fear

Standard

A substantial battle with a notable objective; perilous travel that tests might and wit; a tense social encounter seeking crucial information or aid.

2–4 Fear

Major

A large battle with a Solo or Leader adversary; a character-defining scene with a significant change to a character’s personal story (such as revelation, growth, and betrayal).

4–8 Fear

Climactic

A major confrontation with the villain of a story arc; an epic set piece battle; a judicial duel to determine an important NPC’s fate.

6–12 Fear

If you find yourself with a large amount of Fear, consider:

  • Spending Fast: Spend Fear before the players have a chance to react

  • Spending Often: Spend Fear every time the spotlight swings to you

  • Spending Big: Spend Fear to make multiple moves in a row

Spending Fear to make a move communicates the increased impact of your action. Fear moves often include one or more of these elements:

  • Introducing new adversaries to a scene when their appearance hasn’t been foreshadowed or lacks context.

  • An adversary activating a powerful spell or transformation to deal massive damage or boost their capabilities.

  • An environment exerting a strong negative effect on the party.

DIFFICULTY BENCHMARKS

The Difficulty of an attack roll against an adversary is equal to the adversary’s Difficulty score. The Difficulty of any other action rolls against an adversary is equal to the adversary’s Difficulty score, plus (if applicable) the value of one of the adversary relevant Experience modifiers.

When a player makes an action roll without a specified Difficulty, the GM sets the Difficulty according to the totality of the circumstances. Refer to the following benchmark table for more guidance:

AGILITY

ROLL

SPRINT

LEAP

MANEUVER

5

Sprint within Close range across an open field with an enemy present.

Make a running jump of half your height (about 3 feet for a human).

Walk slowly across a narrow beam.

10

Sprint within Far range across an open field with an enemy present.

Make a running jump of your height (about 6 feet for a human).

Walk quickly across a narrow beam.

15

Sprint within Close range across rough terrain with an enemy present.

Make a running jump of double your height (about 12 feet for a human).

Run across a narrow beam.

20

Sprint within Close range through an active battle of multiple enemies.

Make a running jump of three times your height (about 18 feet for a human).

Run across a narrow beam in heavy wind.

25

Sprint within Far range through a pitched battle in rough terrain.

Make a running jump of five times your height (about 30 feet for a human).

Run across a very narrow beam in an active rainstorm.

30

Sprint across the heads of your enemies in a pitched battle.

Make a running jump of ten times your height (about 60 feet for a human).

Run across an inch-wide, oil-slicked beam in an active rainstorm.

STRENGTH

ROLL

LIFT

SMASH

GRAPPLE

5

Lift a chair.

Destroy a glass cup.

Subdue a child.

10

Lift a table or small chest.

Destroy a small wooden table.

Subdue a weak adult.

15

Lift a grown person or large chest.

Break through a wooden door.

Subdue an average adult.

20

Lift the side of a laden cart or carry a large chest up stairs.

Break through a stone wall.

Subdue a skilled wrestler.

25

Lift a horse, an ox, or a large monster.

Break through a dragon’s teeth.

Subdue a large beast.

30

Lift a falling portcullis gate.

Break a god’s grip.

Subdue a legendary beast.

FINESSE

ROLL

CONTROL

HIDE

TINKER

5

Ride a horse through easy terrain.

Evade notice under full cover on a moonless night.

Open a sticky lock with the appropriate key.

10

Drive an ox-pulled cart.

Evade notice in limited cover on a moonless night.

Open a simple puzzle box.

15

Ride a horse through rough terrain.

Evade notice in limited cover on an average night.

Disable a standard trap.

20

Drive a cart through rough terrain.

Evade notice in the shadows on an average night.

Disable a complicated trap.

25

Ride a wild horse through dangerous terrain.

Evade notice with minimal cover in ample light.

Open a door secured by a sequence of elaborate locks.

30

Ride an enraged beast through dangerous terrain.

Evade notice with no cover in full daylight.

Disable an incredibly sensitive and deadly trap.

INSTINCT

ROLL

PERCEIVE

SENSE

NAVIGATE

5

Hear a loud noise twenty paces away.

Detect an obvious ambush or notice an obvious deception.

Follow a well-trod path in good lighting and weather.

10

Hear a speaking voice fifty paces away.

Detect a looming threat or notice an average person’s lies.

Follow an average path in good lighting and weather.

15

Hear someone walking in the woods fifty paces away.

Detect hostile intent from a foe or see through a merchant’s lies.

Follow a subtle path through rough conditions.

20

Hear someone sneaking through the woods fifty paces away.

Detect a politician’s veiled hostility or detect a nearby assassin.

Follow a subtle path through harsh conditions.

25

Hear a prowling animal fifty paces away.

Identify a spymaster’s plot or read a politican’s true intentions.

Find your way with no path through dangerous conditions.

30

Hear a diving bird a hundred paces away.

Sense a shred of doubt within a god’s pronouncement.

Find your way through a trickery god’s maze.

PRESENCE

ROLL

CHARM

PERFORM

DECEIVE

5

Win the trust of a friendly neighbor.

Earn a meal from a friendly crowd.

Trick a trusting acquaintance.

10

Win the trust of a friendly stranger.

Earn room and board in a small town or impress a small crowd.

Trick an average stranger.

15

Win the trust of a cautious stranger or talk your way into a noble’s party.

Earn room and board in a low-end tavern or impress a large crowd.

Trick an average merchant.

20

Win the trust of a sympathetic foe or talk your way into an enemy’s party.

Earn lodging in a high-end tavern or impress a full theater.

Trick a trained courtier.

25

Turn an enemy against their ruler or talk your way into a fae court.

Earn your keep in a royal court or impress a full colosseum.

Trick a spymaster.

30

Talk a hostile god into granting you a boon.

Save yourself from execution after offending the queen.

Trick a god.

KNOWLEDGE

ROLL

RECALL

ANALYZE

COMPREHEND

5

Recall uncommon facts about your community.

Unpack an obvious metaphor in a simple text.

Learn simple skills from an excellent teacher.

10

Recall uncommon facts about a neighboring community.

Identify obvious subtext in a conversation.

Learn simple skills from an average teacher.

15

Recall uncommon facts about a distant community.

Break an average cipher in a coded message.

Learn complicated skills from an excellent teacher.

20

Recall specialized facts about a distant community.

Identify a weakness in a complicated battle plan.

Learn complicated skills under poor conditions.

25

Recall specialized facts about a fallen kingdom.

Predict the downfall of a nation based on concealed misdeeds.

Learn complicated skills quickly under dangerous conditions.

30

Recall secret information about an obscure historical group.

Identify the weakness in a divine champion’s fighting form.

Learn complicated skills quickly from incomplete information.

GIVING ADVANTAGE AND DISADVANTAGE

To viscerally convey how a PC’s actions or circumstances affect their ability to act, grant them advantage die (or impose disadvantage die) instead of adjusting the Difficulty of an action roll.

ADVERSARY ACTION ROLLS

By default, adversaries don’t normally make action rolls except for attack rolls and any unique actions described in their stat blocks. Any other action an adversary attempts simply succeeds without an action roll; if you want an adversary’s action to have a chance of failure, have any relevant PCs make reaction rolls instead.

However, for especially dramatic or difficult tasks that the PCs can’t influence, you can give an adversary an action roll anyway. For an adversary’s action roll, roll a d20. If the result is equal to or greater than the action’s Difficulty, the action succeeds—otherwise it fails. You can spend a Fear before rolling to add a relevant Experience from the adversary’s stat block to the total. Use the same procedure when an adversary makes a reaction roll.

ADVERSARY ADVANTAGE & DISADVANTAGE

If an adversary has advantage on an action roll, the GM rolls an extra d20 and counts only the higher result. If an adversary has disadvantage on an action roll, the GM rolls an extra d20 and counts only the lower result.

ADVERSARY ATTACKS

When an adversary attacks a PC, the GM rolls a d20 and adds the adversary’s Attack Modifier to the result. If the total meets or beats the target’s Evasion, the attack succeeds; otherwise, it fails. Before rolling, the GM can grant the attacking adversary advantage, impose disadvantage, or spend a Fear to add a relevant Experience from the adversary’s stat block to the total.

On a success, the adversary deals the damage listed in their stat block to the target.

When an adversary’s action lets the GM make an attack against multiple targets, they make one attack roll and compare it to each target’s Evasion separately.

COUNTDOWNS

Countdowns represent a period of time or series of events preceding a future effect. A countdown begins at a starting value. When a countdown advances, it’s reduced by 1. The countdown’s effect is triggered when the countdown reaches 0.


Note: You can track countdowns by “spinning down” dice or ticking off boxes.


Standard countdowns advance every time a player makes an action roll. If an adversary or environment ability refers to a “Countdown [n],” then it means a standard countdown with a starting value of n.

Dynamic countdowns advance by up to 3 depending on the outcomes of action rolls. Consequence countdowns are dynamic countdowns to negative effects. Progress countdowns are dynamic countdowns to positive effects. Dynamic countdowns advance according to this chart:

DYNAMIC COUNTDOWN ADVANCEMENT

Roll Result

Progress Advancement

Consequence Advancement

Failure with Fear

No advancement

Tick down 3

Failure with Hope

No advancement

Tick down 2

Success with Fear

Tick down 1

Tick down 1

Success with Hope

Tick down 2

No advancement

Critical Success

Tick down 3

No advancement

ADVANCED COUNTDOWN FEATURES

  • Countdowns with randomized starting values

  • Loop countdowns that reset to their starting value after their countdown effect is triggered.

  • Increasing countdowns that increase their starting value by 1 every time they loop.

  • Decreasing countdowns that decrease their starting value by 1 every time they loop.

  • Linked progress and consequence countdowns that simultaneously advance according to the same action roll outcomes.

  • Long-term countdowns that advance after rests instead of action rolls.

GIVING OUT GOLD, EQUIPMENT, AND LOOT

It’s up to you and your players how much importance you want to place on gold, equipment, and loot in your campaign.

Adjust the availability and utility of wealth and equipment to reflect the tone, themes, and setting of your campaign.

If you don’t wish to track gold, then when PCs go shopping fornew items let them pick one or two from a short, preselected list that aligns with your campaign setting and the party’s current location.

Otherwise, set the prices of goods and services by adjusting the entries in the Average Costs table to reflect your campaign setting:

Meals for a party of adventurers per night

1 Handful

Standard inn room per night

1 Handful

Luxury inn room per night

1 Bag

Carriage ride

2 Handfuls

Mount (horse, mule, etc.)

3 Bags

Specialized tools

3 Handfuls

Fine clothing

3 Handfuls

Luxury clothing

1 Bag

Tier 1 equipment (weapons, armor)

1–5 Handfuls

Tier 2 equipment (weapons, armor)

1–2 Bags

Tier 3 equipment (weapons, armor)

5–10 Bags

Tier 4 equipment (weapons, armor)

1–2 Chests

RUNNING GM NPCS

When you run NPCs as the GM, you should always strive to follow your GM principles and use them to bring the world to life. Differentiate NPCs with unique manners of speech and action; let their individual goals and desires motivate their actions.

The only essential elements for a NPC are their name, description, and motive. If it’s likely that the PCs will roll actions against them, give them a Difficulty. Adversaries can be invented or improvised by modifying the stat block of another adversary.

If an NPC becomes an ally in combat, they don’t need a stat block—just put the spotlight on what they do and show how their involvement alters the fiction. If a PC capitalizes on their help during the scene, give the PC advantage. NPCs that don’t have Hit Points or Stress can still be injured or killed if the fiction demands it.

If you want an important NPC to mechanically interact with the system, you can give them one or more features with specific triggers and effects. An NPC might also have a choice that adjusts the parameters of their feature. For example:

ARCANE HOLD

Choice: When the battle begins, choose a favored PC.

Trigger: The first time during a battle the favored PC is within Close range and hit with an attack.

Effect: Make an attack roll with a +6 modifier against the adversary. On a success, the target is temporarily Restrained by tendrils of powerful magic.

NPC FEATURE EXAMPLES

VOLLEY OF ARROWS

Trigger: A battle begins and this NPC is involved.

Effect: Activate a countdown (Loop 3). It ticks down when a PC misses an attack. When it triggers, this NPC releases a volley of arrows at a target of the PCs’ choice, dealing 2d8+3 physical damage.

MENTOR

​​Choice: When the battle begins, choose a protégé PC.

Trigger: Your protégé is within Close range and fails an attack roll.

Effect: Move into Melee range with the PC and give them advice or guidance. The next attack roll they make has advantage.

REGROUP

​​Choice: When a battle begins, choose a point within Far range.

Trigger: All PCs have marked all of their Armor Slots.

Effect: Teleport all PCs and this NPC to the chosen spot and clear an Armor Slot on each target.

INTO THE NIGHT

Trigger: The PCs start a long rest with this NPC.

Effect: Roll 1d4. On a 2 or less, this NPC steals 1 handful of gold from the party while they are sleeping, then disappears into the night.

OPTIONAL GM MECHANICS

FATE ROLLS

When the GM wants to leave an outcome entirely up to chance, they call for a fate roll. The GM establishes what’s at stake and how the roll will be interpreted. Then a player rolls one of their Duality Dice and interprets the result.


Examples:

“Roll your Fear Die. On a 4 or lower, the fire spreads beyond this house.”

“I think it’s really up to chance whether reinforcements will make it to you in time. Go ahead and roll your Fear Die— that’ll determine the starting size of the countdown. When that triggers, reinforcements will arrive in your Far range.”

“Go ahead and roll your Hope Die to see how big the crowd at the inn is tonight. The higher the roll, the bigger the crowd.”

“Make a roll using your Hope Die to determine the number of Stamina Potions the shop has in stock.”


FALLING AND COLLISION DAMAGE

If a character falls to the ground, you can use the following as a guide to determine the damage they take:

  • A fall from Very Close range deals 1d10+3 physical damage.

  • A fall from Close range deals 1d20+5 physical damage.

  • A fall from Far or Very Far range deals 1d100+15 physical damage, or death at the GM’s discretion.

If a character collides with an object or another character at a dangerous speed, they take 1d20+5 direct physical damage.

MOVING AND FIGHTING UNDERWATER

By default, attack rolls made while the attacker is underwater have disadvantage.

For creatures that can’t breathe underwater, use a standard countdown (3) to track how long they can hold their breath.

Advance the countdown whenever the PC takes an action. In addition if they fail a roll or roll with Fear while underwater, you can spend your GM move to advance it an additional time—or twice, if they rolled a failure with Fear.

Once the countdown ends, the underwater PC must mark a Stress whenever they take an action.

CONFLICT BETWEEN PCS

Sometimes a player might want their character to act against another PC in the scene. Before jumping to rolling dice, discuss the situation with both players to decide how to resolve the conflict. A roll might not be necessary to reach an outcome—but if rolling will be fun for everyone involved, come to a consensus on the terms of the roll, then facilitate the scene according to the results.

On an attack roll against a PC, the attacker rolls against the defender’s Evasion, just like an adversary. On any other kind of action roll, the instigator makes an action roll and the target makes a reaction roll. To succeed, the instigator must beat a Difficulty equal to the total value of the reaction roll.

ADVERSARIES AND ENVIRONMENTS

USING ADVERSARIES

ADVERSARY STAT BLOCKS

All the information required to run an adversary is contained in their stat block. An adversary’s stat block includes their:

NAME

Each stat block has a unique name. Abilities that affect adversaries with a certain name include all adversaries who use that stat block, regardless of their in-story name.

TIER

Each adversary is designed to oppose PCs of a certain tier. If you confront the party with an adversary from another tier, adjust their stats.

TYPE

The adversary’s type appears alongside their tier. An adversary’s type represents the role they play in a conflict.

The adversary types are:

  • Bruisers: tough; deliver powerful attacks.

  • Hordes: groups of identical creatures acting together as a single unit.

  • Leaders: command and summon other adversaries.

  • Minions: easily dispatched but dangerous in numbers.

  • Ranged: fragile in close encounters but deal high damage at range.

  • Skulks: maneuver and exploit opportunities to ambush opponents.

  • Socials: present challenges around conversation instead of combat.

  • Solos: present a formidable challenge to a whole party, with or without support.

  • Standards: representative of their fictional group.

  • Supports: enhance their allies and disrupt their opponents.

DESCRIPTION

A summary of the adversary's appearance and demeanor.

MOTIVES & TACTICS

Suggusted impulses, actions and goals for the adversary.

DIFFICULTY

The Difficulty of any roll made against the adversary, unless otherwise noted.

DAMAGE THRESHOLDS, HIT POINTS, AND STRESS

These systems function the same way they do for PCs. The numbers listed after “Threshold” are the adversary’s Major and Severe Thresholds.

ATTACK MODIFIER

When you attack with the adversary, apply this bonus or penalty to your attack roll.

STANDARD ATTACK

A description of the adversary’s primary mode of inflicting harm on the PCs. It includes the attack’s name, its effective range, and the damage it deals on a success. Using an adversary’s standard attack is a GM move.

EXPERIENCE (OPTIONAL)

The GM can spend a Fear to add an adversary’s relevant Experience to raise their attack roll or increase the Difficulty of a roll made against them.

EXAMPLE EXPERIENCES:

Acrobatics

Hunt from Above

Navigation

Ambusher

Intimidation

Nobility

Bartering

Intrusion

Quick Reflexes

Blademaster

Keen Senses

Socialite

Bodyguard

Magical Knowledge

Stealth

Commander

Nature’s Friend

Tracker

FEATURE(S)

There are three kinds of adversary features: actions, reactions, and passives. Note: each adversaries stress is tracked individually. If a feature requires the GM to spend Stress to activate it, the Stress must come from the adversary whose feature is being activate. If a feature has a Fear requirement, it must be spent in addition to any Fear already spent—for instance, to interrupt the PCs and put the spotlight on the adversary.

  • Actions: a special attack or other unique action that the adversary can perform when the spotlight is on them.

  • Reactions: special effects that take effect when their trigger occurs, regardless of whether the spotlight is on the adversary.

  • Passives: special abilities that remain in effect by default and require no resources or triggers to activate.

FEAR FEATURE(S)

High-impact effects that cost a Fear to activate.

EXAMPLE ADVERSARY FEATURES:

ACTIONS

Haymaker - Action: Make an attack against a target within Very Close range. On a success, deal X direct physical damage.

Shredding Strike - Action: Make an attack against a target within Very Close range. On a success, deal X physical damage and the target must mark an Armor Slot without gaining its benefit (they can still use armor to reduce the damage).

More Where That Came From - Action: Summon three Jagged Knife Lackeys, who appear at Far range.

REACTIONS

Heavy Hitter - Reaction: When this adversary deals damage with a standard attack, you can spend a Fear to gain a +X bonus to the damage roll.

Team-Up - Reaction: When another adversary within Very Close range of this adversary deals X damage to a creature, you can mark a Stress to make a standard attack against that same creature. On a success, combine the damage.

Momentum - Reaction: When this adversary makes a successful attack against a PC, you gain a Fear.

PASSIVES

Horde (X) - Passive: When the Horde has marked half or more of their HP, their standard attack deals X damage instead.

Minion (X) - Passive: This adversary is defeated when they take any damage. For every X damage a PC deals to this adversary, defeat an additional Minion within range the attack would succeed against.

Relentless (X) - Passive: This adversary can be spotlighted up to X times per GM turn. Spend Fear as usual to spotlight them.

Slow - Passive: When you spotlight this adversary and they don’t have a token on their stat block, they can’t act yet. Place a token on their stat block and describe what they’re preparing to do. When you spotlight this adversary and they have a token on their stat block, clear the token and they can act.

Arcane Form - Passive: This adversary is resistant to magic damage.

Armored Carapace - Passive: When this adversary takes physical damage, reduce it by X.

FEAR FEATURES

Explosion - Action: Spend a Fear to erupt in a fiery explosion. Make an attack against all targets within Close range. Targets the adversary succeeds against take 1d8 magic damage and are knocked back to Far range.

BUILDING BALANCED ENCOUNTERS

When planning a battle, start with [(3 x the number of PCs in combat) + 2] Battle Points and make the following adjustments:

  • -1 for an easier or shorter fight

  • -2 if you’re using 2 or more Solo adversaries

  • -2 if you add +1d4 (or a static +2) to all adversaries’ damage rolls

  • +1 if you choose an adversary from a lower tier

  • +1 if you don’t include any Bruisers, Hordes, Leaders, or Solos

  • +2 for a harder or longer fight

Then spend your Battle Points to add an adversary to the encounter:

  • Spend 1 point for each group of Minions equal to the size of the party.

  • Spend 1 point for each Social or Support adversary.

  • Spend 2 points for each Horde, Ranged, Skulk, or Standard adversary.

  • Spend 3 points for each Leader adversary.

  • Spend 4 points for each Bruiser adversary.

  • Spend 5 points for each Solo adversary.

DEFEATED ADVERSARIES

When an adversary marks their last Hit Point, they are defeated: incapacitated, tied up, routed, killed, or anything else the table decides makes sense.

ADVERSARY STAT BLOCK BENCHMARKS

ADVERSARY STATISTIC

TIER 1

TIER 2

TIER 3

TIER 4

Attack Modifier

+1

+2

+3

+4

Damage Dice

1d6+2 to 1d12+4

2d6+3 to 2d12+4

3d8+3 to 3d12+5

4d8+10 to 4d12+15

Difficulty

11

14

17

20

Damage Thresholds

Major 7/Severe 12

Major 10/Severe 20

Major 20/Severe 32

Major 25/Severe 45

ADVERSARIES BY TIER

This section contains the following stat blocks:

TIER 1 (LEVEL 1)

  • @UUID[Compendium.daggerheart.adversaries.Actor.89yAh30vaNQOALlz]{Acid Burrower}

  • @UUID[Compendium.daggerheart.adversaries.Actor.71qKDLKO3CsrNkdy]{Bear}

  • @UUID[Compendium.daggerheart.adversaries.Actor.8Zkqk1jU09nKL2fy]{Cave Ogre}

  • @UUID[Compendium.daggerheart.adversaries.Actor.uOP5oT9QzXPlnf3p]{Construct}

  • @UUID[Compendium.daggerheart.adversaries.Actor.CBBuEXAlLKFMJdjg]{Courtier}

  • @UUID[Compendium.daggerheart.adversaries.Actor.9x2xY9zwc3xzbXo5]{Deeproot Defender}

  • @UUID[Compendium.daggerheart.adversaries.Actor.wNzeuQLfLUMvgHlQ]{Dire Wolf}

  • @UUID[Compendium.daggerheart.adversaries.Actor.IIWV4ysJPFPnTP7W]{Giant Mosquitoes}

  • @UUID[Compendium.daggerheart.adversaries.Actor.4PfLnaCrOcMdb4dK]{Giant Rat}

  • @UUID[Compendium.daggerheart.adversaries.Actor.fmfntuJ8mHRCAktP]{Giant Scorpion}

  • @UUID[Compendium.daggerheart.adversaries.Actor.8KWVLWXFhlY2kYx0]{Glass Snake}

  • @UUID[Compendium.daggerheart.adversaries.Actor.uRtghKE9mHlII4rs]{Harrier}

  • @UUID[Compendium.daggerheart.adversaries.Actor.JRhrrEg5UroURiAD]{Archer Guard}

  • @UUID[Compendium.daggerheart.adversaries.Actor.B4LZcGuBAHzyVdzy]{Bladed Guard}

  • @UUID[Compendium.daggerheart.adversaries.Actor.mK3A5FTx6k8iPU3F]{Head Guard}

  • @UUID[Compendium.daggerheart.adversaries.Actor.5Lh1T0zaT8Pkr2U2]{Jagged Knife Bandit}

  • @UUID[Compendium.daggerheart.adversaries.Actor.MbBPIOxaxXYNApXz]{Jagged Knife Hexer}

  • @UUID[Compendium.daggerheart.adversaries.Actor.CBKixLH3yhivZZuL]{Jagged Knife Kneebreaker}

  • @UUID[Compendium.daggerheart.adversaries.Actor.C0OMQqV7pN6t7ouR]{Jagged Knife Lackey}

  • @UUID[Compendium.daggerheart.adversaries.Actor.aTljstqteGoLpCBq]{Jagged Knife Lieutenant}

  • @UUID[Compendium.daggerheart.adversaries.Actor.XF4tYTq9nPJAy2ox]{Jagged Knife Shadow}

  • @UUID[Compendium.daggerheart.adversaries.Actor.1zuyof1XuIfi3aMG]{Jagged Knife Sniper}

  • @UUID[Compendium.daggerheart.adversaries.Actor.Al3w2CgjfdT3p9ma]{Merchant}

  • @UUID[Compendium.daggerheart.adversaries.Actor.sRn4bqerfARvhgSV]{Minor Chaos Elemental}

  • @UUID[Compendium.daggerheart.adversaries.Actor.DscWkNVoHak6P4hh]{Minor Fire Elemental}

  • @UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demon}

  • @UUID[Compendium.daggerheart.adversaries.Actor.G62k4oSkhkoXEs2D]{Minor Treant}

  • @UUID[Compendium.daggerheart.adversaries.Actor.SHXedd9zZPVfUgUa]{Green Ooze}

  • @UUID[Compendium.daggerheart.adversaries.Actor.aLkLFuVoKz2NLoBK]{Tiny Green Ooze}

  • @UUID[Compendium.daggerheart.adversaries.Actor.9rVlbJVrDNn1x7PS]{Red Ooze}

  • @UUID[Compendium.daggerheart.adversaries.Actor.1fkLQXVtmILqfJ44]{Tiny Red Ooze}

  • @UUID[Compendium.daggerheart.adversaries.Actor.wycLpvebWdUqRhpP]{Petty Noble}

  • @UUID[Compendium.daggerheart.adversaries.Actor.OROJbjsqagVh7ECV]{Pirate Captain}

  • @UUID[Compendium.daggerheart.adversaries.Actor.5YgEajn0wa4i85kC]{Pirate Raiders}

  • @UUID[Compendium.daggerheart.adversaries.Actor.mhcVkVFrzIJ18FDm]{Pirate Tough}

  • @UUID[Compendium.daggerheart.adversaries.Actor.bgreCaQ6ap2DVpCr]{Sellsword}

  • @UUID[Compendium.daggerheart.adversaries.Actor.7X5q7a6ueeHs5oA9]{Skeleton Archer}

  • @UUID[Compendium.daggerheart.adversaries.Actor.6l1a3Fazq8BoKIcc]{Skeleton Dredge}

  • @UUID[Compendium.daggerheart.adversaries.Actor.Q9LaVTyXF9NF12C7]{Skeleton Knight}

  • @UUID[Compendium.daggerheart.adversaries.Actor.10YIQl0lvCJXZLfX]{Skeleton Warrior}

  • @UUID[Compendium.daggerheart.adversaries.Actor.ldbWEL7uZs84vyrR]{Spellblade}

  • @UUID[Compendium.daggerheart.adversaries.Actor.qNgs3AbLyJrY19nt]{Swarm of Rats}

  • @UUID[Compendium.daggerheart.adversaries.Actor.VtFBt9XBE0WrGGxP]{Sylvan Soldier}

  • @UUID[Compendium.daggerheart.adversaries.Actor.PKSXFuaIHUCoH63A]{Tangle Bramble Swarm}

  • @UUID[Compendium.daggerheart.adversaries.Actor.XcAGOSmtCFLT1unN]{Tangle Bramble}

  • @UUID[Compendium.daggerheart.adversaries.Actor.ZNbQ2jg35LG4t9eH]{Weaponmaster}

  • @UUID[Compendium.daggerheart.adversaries.Actor.8yUj2Mzvnifhxegm]{Young Dryad}

  • @UUID[Compendium.daggerheart.adversaries.Actor.2UeZ0tEe7AzgSJNd]{Brawny Zombie}

  • @UUID[Compendium.daggerheart.adversaries.Actor.EQTOAOUrkIvS2z88]{Patchwork Zombie Hulk}

  • @UUID[Compendium.daggerheart.adversaries.Actor.gP3fWTLzSFnpA8EJ]{Rotted Zombie}

  • @UUID[Compendium.daggerheart.adversaries.Actor.2nXz4ilAY4xuhKLm]{Shambling Zombie}

  • @UUID[Compendium.daggerheart.adversaries.Actor.Nf0v43rtflV56V2T]{Zombie Pack}

TIER 2 (LEVELS 2–4)

  • @UUID[Compendium.daggerheart.adversaries.Actor.0ts6CGd93lLqGZI5]{Archer Squadron}

  • @UUID[Compendium.daggerheart.adversaries.Actor.vNIbYQ4YSzNf0WPE]{Apprentice Assassin}

  • @UUID[Compendium.daggerheart.adversaries.Actor.h5RuhzGL17dW5FBT]{Assassin Poisoner}

  • @UUID[Compendium.daggerheart.adversaries.Actor.dNta0cUzr96xcFhf]{Master Assassin}

  • @UUID[Compendium.daggerheart.adversaries.Actor.dgH3fW9FTYLaIDvS]{Battle Box}

  • @UUID[Compendium.daggerheart.adversaries.Actor.jDmHqGvzg5wjgmxE]{Chaos Skull}

  • @UUID[Compendium.daggerheart.adversaries.Actor.99TqczuQipBmaB8i]{Conscript}

  • @UUID[Compendium.daggerheart.adversaries.Actor.ZxWaWPdzFIUPNC62]{Courtesan}

  • @UUID[Compendium.daggerheart.adversaries.Actor.0NxCSugvKQ4W8OYZ]{Cult Adept}

  • @UUID[Compendium.daggerheart.adversaries.Actor.tyBOpLfigAhI9bU3]{Cult Fang}

  • @UUID[Compendium.daggerheart.adversaries.Actor.zx99sOGTXicP4SSD]{Cult Initiate}

  • @UUID[Compendium.daggerheart.adversaries.Actor.NoRZ1PqB8N5wcIw0]{Demonic Hound Pack}

  • @UUID[Compendium.daggerheart.adversaries.Actor.TLzY1nDw0Bu9Ud40]{Electric Eels}

  • @UUID[Compendium.daggerheart.adversaries.Actor.bfhVWMBUh61b9J6n]{Elite Soldier}

  • @UUID[Compendium.daggerheart.adversaries.Actor.ChwwVqowFw8hJQwT]{Failed Experiment}

  • @UUID[Compendium.daggerheart.adversaries.Actor.8VZIgU12cB3cvlyH]{Giant Beastmaster}

  • @UUID[Compendium.daggerheart.adversaries.Actor.YnObCleGjPT7yqEc]{Giant Brawler}

  • @UUID[Compendium.daggerheart.adversaries.Actor.5s8wSvpyC5rxY5aD]{Giant Recruit}

  • @UUID[Compendium.daggerheart.adversaries.Actor.OMQ0v6PE8s1mSU0K]{Giant Eagle}

  • @UUID[Compendium.daggerheart.adversaries.Actor.8mJYMpbLTb8qIOrr]{Gorgon}

  • @UUID[Compendium.daggerheart.adversaries.Actor.MYXmTx2FHcIjdfYZ]{Juvenile Flickerfly}

  • @UUID[Compendium.daggerheart.adversaries.Actor.7ai2opemrclQe3VF]{Knight of the Realm}

  • @UUID[Compendium.daggerheart.adversaries.Actor.niBpVU7yeo5ccskE]{Masked Thief}

  • @UUID[Compendium.daggerheart.adversaries.Actor.Vy02IhGhkJLuezu4]{Merchant Baron}

  • @UUID[Compendium.daggerheart.adversaries.Actor.rM9qCIYeWg9I0B4l]{Minotaur Wrecker}

  • @UUID[Compendium.daggerheart.adversaries.Actor.mVV7a7KQAORoPMgZ]{Mortal Hunter}

  • @UUID[Compendium.daggerheart.adversaries.Actor.EtLJiTsilPPZvLUX]{Royal Advisor}

  • @UUID[Compendium.daggerheart.adversaries.Actor.sLAccjvCWfeedbpI]{Secret-Keeper}

  • @UUID[Compendium.daggerheart.adversaries.Actor.YmVAkdNsyuXWTtYp]{Shark}

  • @UUID[Compendium.daggerheart.adversaries.Actor.BK4jwyXSRx7IOQiO]{Siren}

  • @UUID[Compendium.daggerheart.adversaries.Actor.5tCkhnBByUIN5UdG]{Spectral Archer}

  • @UUID[Compendium.daggerheart.adversaries.Actor.65cSO3EQEh6ZH6Xk]{Spectral Captain}

  • @UUID[Compendium.daggerheart.adversaries.Actor.UFVGl1osOsJTneLf]{Spectral Guardian}

  • @UUID[Compendium.daggerheart.adversaries.Actor.8zlynOhnVA59KpKT]{Spy}

  • @UUID[Compendium.daggerheart.adversaries.Actor.3aAS2Qm3R6cgaYfE]{Stonewraith}

  • @UUID[Compendium.daggerheart.adversaries.Actor.noDdT0tsN6FXSmC8]{War Wizard}

TIER 3 (LEVELS 5–7)

  • @UUID[Compendium.daggerheart.adversaries.Actor.G7jiltRjgvVhZewm]{Adult Flickerfly}

  • @UUID[Compendium.daggerheart.adversaries.Actor.pnyjIGxxvurcWmTv]{Demon of Avarice}

  • @UUID[Compendium.daggerheart.adversaries.Actor.kE4dfhqmIQpNd44e]{Demon of Despair}

  • @UUID[Compendium.daggerheart.adversaries.Actor.2VN3BftageoTTIzu]{Demon of Hubris}

  • @UUID[Compendium.daggerheart.adversaries.Actor.SxSOkM4bcVOFyjbo]{Demon of Jealousy}

  • @UUID[Compendium.daggerheart.adversaries.Actor.5lphJAgzoqZI3VoG]{Demon of Wrath}

  • @UUID[Compendium.daggerheart.adversaries.Actor.tBWHW00epmMnkawe]{Dire Bat}

  • @UUID[Compendium.daggerheart.adversaries.Actor.wR7cFKrHvRzbzhBT]{Dryad}

  • @UUID[Compendium.daggerheart.adversaries.Actor.P7h54ZePFPHpYwvB]{Elemental Spark}

  • @UUID[Compendium.daggerheart.adversaries.Actor.dsfB3YhoL5SudvS2]{Greater Earth Elemental}

  • @UUID[Compendium.daggerheart.adversaries.Actor.xIICT6tEdnA7dKDV]{Greater Water Elemental}

  • @UUID[Compendium.daggerheart.adversaries.Actor.6hbqmxDXFOzZJDk4]{Huge Green Ooze}

  • @UUID[Compendium.daggerheart.adversaries.Actor.MI126iMOOobQ1Obn]{Hydra}

  • @UUID[Compendium.daggerheart.adversaries.Actor.yx0vK2yfNVZKWUUi]{Monarch}

  • @UUID[Compendium.daggerheart.adversaries.Actor.KGVwnLq85ywP9xvB]{Stag Knight}

  • @UUID[Compendium.daggerheart.adversaries.Actor.XK78QUfY8c8Go8Uv]{Oak Treant}

  • @UUID[Compendium.daggerheart.adversaries.Actor.o63nS0k3wHu6EgKP]{Treant Sapling}

  • @UUID[Compendium.daggerheart.adversaries.Actor.i2UNbRvgyoSs07M6]{Head Vampire}

  • @UUID[Compendium.daggerheart.adversaries.Actor.WWyUp6Mxl1S3KYUG]{Vampire}

  • @UUID[Compendium.daggerheart.adversaries.Actor.JqYraOqNmmhHk4Yy]{Vault Guardian Gaoler}

  • @UUID[Compendium.daggerheart.adversaries.Actor.FVgYb28fhxlVcGwA]{Vault Guardian Sentinel}

  • @UUID[Compendium.daggerheart.adversaries.Actor.c5hGdvY5UnSjlHws]{Vault Guardian Turret}

  • @UUID[Compendium.daggerheart.adversaries.Actor.UGPiPLJsPvMTSKEF]{Young Ice Dragon}

TIER 4 (LEVELS 8–10)

  • @UUID[Compendium.daggerheart.adversaries.Actor.WPEOIGfclNJxWb87]{Arch-Necromancer}

  • @UUID[Compendium.daggerheart.adversaries.Actor.OsLG2BjaEdTZUJU9]{Fallen Shock Troop}

  • @UUID[Compendium.daggerheart.adversaries.Actor.PELRry1vqjBzSAlr]{Fallen Sorcerer}

  • @UUID[Compendium.daggerheart.adversaries.Actor.hxZ0sgoFJubh5aj6]{Fallen Warlord: Realm-Breaker}

  • @UUID[Compendium.daggerheart.adversaries.Actor.RXkZTwBRi4dJ3JE5]{Fallen Warlord: Undefeated Champion}

  • @UUID[Compendium.daggerheart.adversaries.Actor.kabueAo6BALApWqp]{Hallowed Archer}

  • @UUID[Compendium.daggerheart.adversaries.Actor.VENwg7xEFcYObjmT]{Hallowed Soldier}

  • @UUID[Compendium.daggerheart.adversaries.Actor.r1mbfSSwKWdcFdAU]{High Seraph}

  • @UUID[Compendium.daggerheart.adversaries.Actor.4nqv3ZwJGjnmic8j]{Kraken}

  • @UUID[Compendium.daggerheart.adversaries.Actor.befIqd5IYKg6eUz2]{Oracle of Doom}

  • @UUID[Compendium.daggerheart.adversaries.Actor.A0SeeDzwjvqOsyof]{Outer Realms Abomination}

  • @UUID[Compendium.daggerheart.adversaries.Actor.ms6nuOl3NFkhPj1k]{Outer Realms Corruptor}

  • @UUID[Compendium.daggerheart.adversaries.Actor.moJhHgKqTKPS2WYS]{Outer Realms Thrall}

  • @UUID[Compendium.daggerheart.adversaries.Actor.ladm7wykhZczYzrQ]{Volcanic Dragon: Obsidian Predator}

  • @UUID[Compendium.daggerheart.adversaries.Actor.eArAPuB38CNR0ZIM]{Volcanic Dragon: Molten Scourge}

  • @UUID[Compendium.daggerheart.adversaries.Actor.pMuXGCSOQaxpi5tb]{Volcanic Dragon: Ashen Tyrant}

  • @UUID[Compendium.daggerheart.adversaries.Actor.CP6iRfHdyFWniTHY]{Perfected Zombie}

  • @UUID[Compendium.daggerheart.adversaries.Actor.YhJrP7rTBiRdX5Fp]{Zombie Legion}

USING ENVIRONMENTS

Environments represent everything in a scene beyond the PCs and adversaries, such as the physical space, background NPCs, and natural forces.

ENVIRONMENT STAT BLOCK

Each environment’s stat block presents their necessary mechanical statistics:

NAME

The unique name of the environment stat block.

TIER

The PC tier the environment is designed to challenge.

TYPE

The type of scene it most easily supports:

  • Explorations — wondrous locations with mysteries and marvels to discover

  • Socials — locations that primarily present interpersonal challenges

  • Traversals — dangerous locations where movement through and around the space itself is a challenge

  • Events — special activities or occurrences (rather than physical spaces)

DESCRIPTION

An evocative one-line summary of the environment.

IMPULSES

The manner or mode with which the environment pushs and pulls the people within them.

DIFFICULTY

The standard Difficulty for action rolls made to overcome, oppose, or resist the environment or its elements.

POTENTIAL ADVERSARIES

Suggested adversaries that might appear in scenes within the environment.

FEATURES

Features provide inspiration for GM moves you can use that represent the dynamic landscape or situation.

FEATURE QUESTIONS

Prompts for plot hooks, narrative engines, and connections to other story elements.

ADAPTING ENVIRONMENTS

Sometimes you want to use an environment but it’s at the wrong tier for your party. Or you might want to replace a feature or two, then present it as an entirely different environment. Whether planning your session or even improvising an environment mid-session, you can adjust an existing environment’s stat block to fit the needs of your scene or improvise elements as needed. The environments framework is there to help organize ideas, not to stifle creativity.

When you need to quickly adjust a stat block to a different tier, you can simply replace its existing statistics with those listed on the Environment Statistics by Tier table, using the column that corresponds to your party’s tier.

BENCHMARK STATISTICS FOR ENVIRONMENTS BY TIER

Environment Statistic

Tier 1

Tier 2

Tier 3

Tier 4

Damage Dice

1d6+1 to 1d8+3

2d6+3 to 2d10+2

3d8+3 to 3d10+1

4d8+3 to 4d10+10

Difficulty

11

14

17

20

ENVIRONMENT STAT BLOCKS BY TIER

This section contains the following stat blocks.

@UUID[Compendium.daggerheart.environments.Folder.GQ0VnOLrKBIHR6Us]{TIER 1 (LEVEL 1)}

  • @UUID[Compendium.daggerheart.environments.Actor.pGEdzdLkqYtBhxnG]{Abandoned Grove (Exploration)}

  • @UUID[Compendium.daggerheart.environments.Actor.uGEdNYERCTJBEjc5]{Ambushed (Event)}

  • @UUID[Compendium.daggerheart.environments.Actor.uXZpebPR77YQ1oXI]{Ambushers (Event)}

  • @UUID[Compendium.daggerheart.environments.Actor.HZKA7hkej7JJY503]{Bustling Marketplace (Social)}

  • @UUID[Compendium.daggerheart.environments.Actor.LPpfdlNKqiZIl04w]{Cliffside Ascent (Traversal)}

  • @UUID[Compendium.daggerheart.environments.Actor.cM4X81DOyvxNIi52]{Local Tavern (Social)}

  • @UUID[Compendium.daggerheart.environments.Actor.YezryR32uo39xRxW]{Outpost Town (Social)}

  • @UUID[Compendium.daggerheart.environments.Actor.t4cdqTfzcqP3H1vJ]{Raging River (Traversal)}

@UUID[Compendium.daggerheart.environments.Folder.XMeecO3IRvu5ck6F]{TIER 2 (LEVELS 2–4)}

  • @UUID[Compendium.daggerheart.environments.Actor.QAXXiOKBDmCTauHD]{Cult Ritual (Event)}

  • @UUID[Compendium.daggerheart.environments.Actor.dsA6j69AnaJhUyqH]{Hallowed Temple (Social)}

  • @UUID[Compendium.daggerheart.environments.Actor.OzYbizKraK92FDiI]{Haunted City (Exploration)}

  • @UUID[Compendium.daggerheart.environments.Actor.acMu9wJrMZZzLSTJ]{Mountain Pass (Traversal)}

@UUID[Compendium.daggerheart.environments.Folder.MfrIkJK12PAEfbPL]{TIER 3 (LEVELS 5–7)}

  • @UUID[Compendium.daggerheart.environments.Actor.oY69NN4rYxoRE4hl]{Burning Heart of the Woods (Exploration)}

  • @UUID[Compendium.daggerheart.environments.Actor.1eZ32Esq7rfZOjlu]{Castle Siege (Event)}

  • @UUID[Compendium.daggerheart.environments.Actor.EWD3ZsLoK6VMVOf7]{Pitched Battle (Event)}

@UUID[Compendium.daggerheart.environments.Folder.IKumu5HTLqONLYqb]{TIER 4 (LEVELS 8–10)}

  • @UUID[Compendium.daggerheart.environments.Actor.2Z1mKc65LxNk2PqR]{Chaos Realm (Traversal)}

  • @UUID[Compendium.daggerheart.environments.Actor.4DLYez7VbMCFDAuZ]{Divine Usurpation (Event)}

  • @UUID[Compendium.daggerheart.environments.Actor.jr1xAoXzVwVblzxI]{Imperial Court (Social)}

  • @UUID[Compendium.daggerheart.environments.Actor.h3KyRL7AshhLAmcH]{Necromancer’s Ossuary (Exploration)}

ADDITIONAL GM GUIDANCE

This section provides additional guidance for preparing and running a session of Daggerheart.

STORY BEATS

In storytelling, a beat is a moment that changes the trajectory of the narrative—a shift in the world, a significant action or reaction, an emotional revelation, or an important decision.

Take turns with the players, narrating a beat and then letting them react and carry the scene forward with their own beats.

When preparing for a session, plan in terms of the moments that give shape to each scene or sequence, rather than pre-scripting specific details or exchanges.

PREPARING COMBAT ENCOUNTERS

Build the hurdles the PCs face around the question of “What helps tell the story?” Enemies, environments, and hazards are the tools for heightening tension and creating drama. Ensure that combat is being used to give players more information about the unfolding story, revealing the world, the plot, or the characters.

BATTLES AND NARRATIVE

Dynamic battles create suspense by forcing players to choose between their various objectives, engaging their character’s motivations and weaknesses, and creating the crucible that the players use to forge their characters into legendary heroes. When preparing combat encounters:

  • Consider the narrative function of the battle

  • Base adversaries’ moves on their motives

  • Use dynamic environments to bring the battleground to life

  • Add enemies that can interact with the PCs’ features and special abilities

SESSION REWARDS

Reward players at the end of a session with:

  • Useful information

  • Story hooks

  • Loot

  • Gold

  • Access to new equipment or enhancements

CRAFTING SCENES

Whenever you start a session, arrive at a new place, or change the situation, tell the players what they need to know by thinking with all of your senses and sharing something unique or unexpected about the fiction.

ENGAGING YOUR PLAYERS

Keep your players engaged by:

  • Rotating the Focus between the PCs

  • Tying Together Story Elements

  • Engaging Quiet Players

  • Using Visual Aids

  • Encouraging Unguided Play

  • Confronting the PCs with internal and external conflicts

  • Raise the Stakes by Spending Fear

  • Layering Goals Other than Attrition into Combat (see Table of Random Objectives on the next page)

1d12

Objective

1

Acquire (obtain or steal) an important item or items.

2

Capture one or more of the opponents.

3

Activate a magical device.

4

Frame a character or tarnish their reputation.

5

Drive the opponent into a corner or ambush point.

6

Stop a magical ritual, legal ceremony, or time-sensitive spell.

7

Hold the line—keep the enemy from reaching a specific area or group.

8

Plant evidence or a tracking device on a target.

9

Secure a specific location ahead of another group’s arrival.

10

Harass the opponent to deplete their resources or keep them occupied.

11

Destroy a piece of architecture, a statue, a shrine, or a weapon.

12

Investigate a situation to confirm or deny existing

information.

PHASED BATTLES

Make battles by shifting the nature of its enemies or environment mid-combat:

  • Change the Terms of Engagement

  • Alter the Environment

  • Evolve the Opposition

USING DOWNTIME

Use downtime scenes as a pressure release valve to vary the intensity of the story and give the PCs room to breathe.

Empower your players to frame their own downtime scenes.

Ask the players what it looks like as they tend to their wounds or unwind together, encouraging them to take the reins and work with other players whose characters are involved

PROJECTS DURING DOWNTIME

The Work on a Project downtime move requires more GM input than other downtime moves and is best suited for long-term endeavors the PCs wish to undertake.

These projects are typically tracked using a Progress Countdown. When deciding the starting value of the countdown, consider the complexity of the project, the availability of relevant tools, and the impact of the project on the story.

Simple projects advance their countdown each time a player uses the Work on a Project move, but complex projects require a roll.

EXTENDED DOWNTIME

When you fast-forward the story across an extended period, use montages to illustrate the passage of time. You gain 1d6 Fear per PC and advance any long-term countdowns as appropriate.

CAMPAIGN FRAMES

A campaign frame provides inspiration, tools, and mechanics to support a particular type of story at the table.

Every campaign frame has a complexity rating that indicates how much its mechanics deviate from or expand upon the Daggerheart core ruleset.

Each campaign frame includes the following sections.

  • A pitch to present to players

  • Suggestions and guidance on tone, feel, themes, and touchstones

  • An overview of the campaign’s background

  • Guidance for fitting communities, ancestries, and classes into the setting

  • Principles for players and GMs to focus on during the campaign

  • Unique setting distinctions

  • An inciting incident to launch the campaign

  • Special mechanics to use during the campaign

  • Questions to consider during session zero

You can find each campaign frame map in the appendix of the core rulebook or at www.daggerheart.com/downloads.

" }, "video": { "controls": true, @@ -180,11 +179,10 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.351", + "coreVersion": "13.346", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": "Bgvu4A6AMkRFOTGR", - "modifiedTime": 1767971861704 + "lastModifiedBy": null }, "_key": "!journal.pages!uNs7ne9VCbbu5dcG.xCcdczIt2x2HBihY" } diff --git a/src/packs/rolltables/tables_Consumables_tF04P02yVN1YDVel.json b/src/packs/rolltables/tables_Consumables_tF04P02yVN1YDVel.json deleted file mode 100644 index c2413ec3..00000000 --- a/src/packs/rolltables/tables_Consumables_tF04P02yVN1YDVel.json +++ /dev/null @@ -1,1519 +0,0 @@ -{ - "name": "Consumables", - "img": "icons/consumables/potions/bottle-corked-red.webp", - "description": "

To generate a random consumable, choose a rarity, roll the designated dice, and match the total to the item in the table:

  • Common: 1d12 or 2d12

  • Uncommon: 2d12 or 3d12

  • Rare: 3d12 or 4d12

  • Legendary: 4d12 or 5d12

", - "results": [ - { - "type": "document", - "weight": 1, - "range": [ - 1, - 1 - ], - "name": "Stride Potion", - "img": "icons/consumables/potions/potion-flask-corked-cyan.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.lNtcrkgFGOJNaroE", - "_id": "HitkUdk2TJyIifWX", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.HitkUdk2TJyIifWX" - }, - { - "type": "document", - "weight": 1, - "range": [ - 2, - 2 - ], - "name": "Bolster Potion", - "img": "icons/consumables/potions/potion-vial-tube-yellow.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.FOPQNqXbiVO0ilYL", - "_id": "nXdPwzbs1TlhuAPG", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.nXdPwzbs1TlhuAPG" - }, - { - "type": "document", - "weight": 1, - "range": [ - 3, - 3 - ], - "name": "Control Potion", - "img": "icons/consumables/potions/flask-corked-blue.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.eeBhZSGLjuNZuJuI", - "_id": "3vNNo1oURhYA3ku3", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.3vNNo1oURhYA3ku3" - }, - { - "type": "document", - "weight": 1, - "range": [ - 4, - 4 - ], - "name": "Attune Potion", - "img": "icons/consumables/potions/bottle-conical-corked-purple.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.JGD3M9hBHtVAA8XP", - "_id": "eIfprIpZdRJCoBQ7", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.eIfprIpZdRJCoBQ7" - }, - { - "type": "document", - "weight": 1, - "range": [ - 5, - 5 - ], - "name": "Charm Potion", - "img": "icons/consumables/potions/potion-tube-corked-blue.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.CVBbFfOY75YwyQsp", - "_id": "LFWeiTR9rC34Tg03", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.LFWeiTR9rC34Tg03" - }, - { - "type": "document", - "weight": 1, - "range": [ - 6, - 6 - ], - "name": "Enlighten Potion", - "img": "icons/consumables/potions/vial-cork-empty.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.aWHSO2AqDufi7nL4", - "_id": "9wcVzrpjZHL87dGg", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.9wcVzrpjZHL87dGg" - }, - { - "type": "document", - "weight": 1, - "range": [ - 7, - 7 - ], - "name": "Minor Health Potion", - "img": "icons/consumables/potions/potion-tube-corked-red.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.tPfKtKRRjv8qdSqy", - "_id": "1IBI7K2c7tyhq9nK", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.1IBI7K2c7tyhq9nK" - }, - { - "type": "document", - "weight": 1, - "range": [ - 8, - 8 - ], - "name": "Minor Stamina Potion", - "img": "icons/consumables/potions/potion-tube-corked-green.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.b6vGSPFWOlzZZDLO", - "_id": "1D9VOgGRjhy6eWqA", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.1D9VOgGRjhy6eWqA" - }, - { - "type": "document", - "weight": 1, - "range": [ - 9, - 9 - ], - "name": "Grindletooth Venom", - "img": "icons/consumables/potions/bottle-conical-corked-labeled-skull-poison-green.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.8WkhvSzeOmLdnoLJ", - "_id": "Nqj2K2UDP27sAkUK", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.Nqj2K2UDP27sAkUK" - }, - { - "type": "document", - "weight": 1, - "range": [ - 10, - 10 - ], - "name": "Varik Leaves", - "img": "icons/consumables/plants/leaf-serrated-pink.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.hvy5BkG3F6iOIXTx", - "_id": "6ynsrta3MiinHg38", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.6ynsrta3MiinHg38" - }, - { - "type": "document", - "weight": 1, - "range": [ - 11, - 11 - ], - "name": "Vial of Moondrip", - "img": "icons/consumables/potions/bottle-ornate-bat-teal.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.VqEX5YwK5oL3r1t6", - "_id": "UDPco0e4rvz8Ch8X", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.UDPco0e4rvz8Ch8X" - }, - { - "type": "document", - "weight": 1, - "range": [ - 12, - 12 - ], - "name": "Unstable Arcane Shard", - "img": "icons/commodities/gems/gem-faceted-cushion-teal-black.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.mUepnLbkvFk0ha4Z", - "_id": "xQV1Uvhy1TqjEpH1", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.xQV1Uvhy1TqjEpH1" - }, - { - "type": "document", - "weight": 1, - "range": [ - 13, - 13 - ], - "name": "Potion of Stability", - "img": "icons/consumables/potions/bottle-conical-corked-labeled-shell-cyan.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.dvL8oaxpEF6jKvYN", - "_id": "pz4dXNbMYuSbFdzN", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.pz4dXNbMYuSbFdzN" - }, - { - "type": "document", - "weight": 1, - "range": [ - 14, - 14 - ], - "name": "Improved Grindletooth Venom", - "img": "icons/consumables/potions/potion-jar-corked-labeled-poison-skull-green.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.BqBWXXe9T07AMV4u", - "_id": "sqdq6x4SEqLdHDPM", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.sqdq6x4SEqLdHDPM" - }, - { - "type": "document", - "weight": 1, - "range": [ - 15, - 15 - ], - "name": "Morphing Clay", - "img": "icons/commodities/stone/ore-chunk-brown.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.f1NHVSIHJJCIOaBl", - "_id": "tceGvaaN4diOnr6V", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.tceGvaaN4diOnr6V" - }, - { - "type": "document", - "weight": 1, - "range": [ - 16, - 16 - ], - "name": "Vial of Darksmoke", - "img": "icons/consumables/potions/bottle-bulb-empty-glass.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.Nwv5ydGf0MWnzq1n", - "_id": "QtGq1JKzwBzWX6Sd", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.QtGq1JKzwBzWX6Sd" - }, - { - "type": "document", - "weight": 1, - "range": [ - 17, - 17 - ], - "name": "Jumping Root", - "img": "icons/consumables/plants/dried-bundle-wrapped-stems-sticks-brown.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.c2putn9apuurJhWX", - "_id": "lidCdzbTqahcajZb", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.lidCdzbTqahcajZb" - }, - { - "type": "document", - "weight": 1, - "range": [ - 18, - 18 - ], - "name": "Snap Powder", - "img": "icons/commodities/materials/bowl-powder-gold.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.cg6VtQ0eVZjDdcK0", - "_id": "m37ithF7wXFYrv6H", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.m37ithF7wXFYrv6H" - }, - { - "type": "document", - "weight": 1, - "range": [ - 19, - 19 - ], - "name": "Health Potion", - "img": "icons/consumables/potions/bottle-corked-red.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.Aruc2NLutWuVIjP1", - "_id": "RFrvEnE7WyDw2YWK", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.RFrvEnE7WyDw2YWK" - }, - { - "type": "document", - "weight": 1, - "range": [ - 20, - 20 - ], - "name": "Stamina Potion", - "img": "icons/consumables/potions/bottle-corked-green.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.hf3k1POoVSooJyN2", - "_id": "Lgs8ccMBUaq0XCHs", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.Lgs8ccMBUaq0XCHs" - }, - { - "type": "document", - "weight": 1, - "range": [ - 21, - 21 - ], - "name": "Armor Stitcher", - "img": "icons/skills/trades/textiles-stitching-leather-brown.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.VlbsCjvvLNfTzNXb", - "_id": "S2nsHwVRSFMbVlKh", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.S2nsHwVRSFMbVlKh" - }, - { - "type": "document", - "weight": 1, - "range": [ - 22, - 22 - ], - "name": "Gill Salve", - "img": "icons/commodities/materials/bowl-powder-blue.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.Nvbb9mze6o5D0AEg", - "_id": "B3cL4jMj0eaW8utR", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.B3cL4jMj0eaW8utR" - }, - { - "type": "document", - "weight": 1, - "range": [ - 23, - 23 - ], - "name": "Replication Parchment", - "img": "icons/sundries/scrolls/scroll-worn-beige.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.yJkwz4AP6yhGo8Vj", - "_id": "sgkt4zYiFSQMOmvo", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.sgkt4zYiFSQMOmvo" - }, - { - "type": "document", - "weight": 1, - "range": [ - 24, - 24 - ], - "name": "Improved Arcane Shard", - "img": "icons/commodities/gems/gem-faceted-teardrop-blue.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.nQTo6mNoPTEVBtkm", - "_id": "CCuzy7Y3KasoCouV", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.CCuzy7Y3KasoCouV" - }, - { - "type": "document", - "weight": 1, - "range": [ - 25, - 25 - ], - "name": "Major Stride Potion", - "img": "icons/consumables/potions/potion-jar-capped-teal.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.yK6eEDUrsPbZA8G0", - "_id": "TtXvBYeeMqQ4gDhO", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.TtXvBYeeMqQ4gDhO" - }, - { - "type": "document", - "weight": 1, - "range": [ - 26, - 26 - ], - "name": "Major Bolster Potion", - "img": "icons/consumables/potions/potion-jar-corked-orange.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.mnyQDRtngWWQeRXF", - "_id": "cRwTxLNJXMVKFW75", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.cRwTxLNJXMVKFW75" - }, - { - "type": "document", - "weight": 1, - "range": [ - 27, - 27 - ], - "name": "Major Control Potion", - "img": "icons/consumables/potions/bottle-round-corked-blue.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.80s1FLmTLtohZ5GH", - "_id": "q15EknW1P2cw4oyb", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.q15EknW1P2cw4oyb" - }, - { - "type": "document", - "weight": 1, - "range": [ - 28, - 28 - ], - "name": "Major Attune Potion", - "img": "icons/consumables/potions/bottle-round-corked-pink.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.CCPFm5iXXwvyYYwR", - "_id": "tkj1X675uJMTkMTR", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.tkj1X675uJMTkMTR" - }, - { - "type": "document", - "weight": 1, - "range": [ - 29, - 29 - ], - "name": "Major Charm Potion", - "img": "icons/consumables/potions/potion-bottle-corked-blue.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.IJLAUlQymbSjzsri", - "_id": "N6ImVJLHEOXxFSAE", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.N6ImVJLHEOXxFSAE" - }, - { - "type": "document", - "weight": 1, - "range": [ - 30, - 30 - ], - "name": "Major Enlighten Potion", - "img": "icons/consumables/potions/bottle-corked-empty.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.SDdv1G2veMLKrxcJ", - "_id": "NuHqSzBX7daJRor8", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.NuHqSzBX7daJRor8" - }, - { - "type": "document", - "weight": 1, - "range": [ - 31, - 31 - ], - "name": "Blood of the Yorgi", - "img": "icons/consumables/potions/potion-tube-corked-bat-gold-red.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.pDGzmczoTlKGmKgd", - "_id": "jpOQNSqbtl0ry3UU", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.jpOQNSqbtl0ry3UU" - }, - { - "type": "document", - "weight": 1, - "range": [ - 32, - 32 - ], - "name": "Homet’s Secret Potion", - "img": "icons/consumables/potions/conical-ornate-purple.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.VSwa1LpQ9PjZKsWF", - "_id": "QQsRU8GRbQeFU3KP", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.QQsRU8GRbQeFU3KP" - }, - { - "type": "document", - "weight": 1, - "range": [ - 33, - 33 - ], - "name": "Redthorn Saliva", - "img": "icons/commodities/materials/slime-thick-blue.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.s2Exl2XFuoOhtIov", - "_id": "UJfqKp0GtIrUEPyb", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.UJfqKp0GtIrUEPyb" - }, - { - "type": "document", - "weight": 1, - "range": [ - 34, - 34 - ], - "name": "Channelstone", - "img": "icons/commodities/stone/engraved-symbol-water-grey.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.IKMVQ6VwtapwoUim", - "_id": "VHCnZip35MMw57CG", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.VHCnZip35MMw57CG" - }, - { - "type": "document", - "weight": 1, - "range": [ - 35, - 35 - ], - "name": "Mythic Dust", - "img": "icons/commodities/materials/bowl-powder-grey.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.Zsh2AvZr8EkGtLyw", - "_id": "zphlOIuZBXFZcEVa", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.zphlOIuZBXFZcEVa" - }, - { - "type": "document", - "weight": 1, - "range": [ - 36, - 36 - ], - "name": "Acidpaste", - "img": "icons/commodities/materials/bowl-powder-teal.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.cfVFmS8vT9dbq9s1", - "_id": "bVFt8cYycBuUItfq", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.bVFt8cYycBuUItfq" - }, - { - "type": "document", - "weight": 1, - "range": [ - 37, - 37 - ], - "name": "Hopehold Flare", - "img": "icons/commodities/tech/smoke-bomb-purple.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.EhaQCPJ8oiqpRIwB", - "_id": "atidisB2nCu9CF3b", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.atidisB2nCu9CF3b" - }, - { - "type": "document", - "weight": 1, - "range": [ - 38, - 38 - ], - "name": "Major Arcane Shard", - "img": "icons/commodities/gems/gem-rough-round-blue.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.AA7bmiwv00lshPrC", - "_id": "VQ75yVBccK73Gif3", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.VQ75yVBccK73Gif3" - }, - { - "type": "document", - "weight": 1, - "range": [ - 39, - 39 - ], - "name": "Featherbone", - "img": "icons/commodities/bones/bones-stack-worn-brown.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.DpxEMpwfasEBpORU", - "_id": "hPKdeNWzJqCuFfjX", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.hPKdeNWzJqCuFfjX" - }, - { - "type": "document", - "weight": 1, - "range": [ - 40, - 40 - ], - "name": "Circle of the Void", - "img": "icons/magic/unholy/orb-glowing-purple.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.elsyP6VhHw1JjGSl", - "_id": "sh98CSXJL593xj0h", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.sh98CSXJL593xj0h" - }, - { - "type": "document", - "weight": 1, - "range": [ - 41, - 41 - ], - "name": "Sun Tree Sap", - "img": "icons/consumables/drinks/wine-amphora-clay-pink.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.kwexUzdM9wm1Qums", - "_id": "lL2638NxooIcWgfL", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.lL2638NxooIcWgfL" - }, - { - "type": "document", - "weight": 1, - "range": [ - 42, - 42 - ], - "name": "Dripfang Poison", - "img": "icons/consumables/potions/potion-jug-corked-skull-poison-brown-green.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.eU8VpbWB2NHIL47n", - "_id": "xXPyThPKW3noUC1t", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.xXPyThPKW3noUC1t" - }, - { - "type": "document", - "weight": 1, - "range": [ - 43, - 43 - ], - "name": "Major Health Potion", - "img": "icons/consumables/potions/bottle-round-label-cork-red.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.cM7pHe8bBAxSZ2xR", - "_id": "x2EnrXxULti4Chpb", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.x2EnrXxULti4Chpb" - }, - { - "type": "document", - "weight": 1, - "range": [ - 44, - 44 - ], - "name": "Major Stamina Potion", - "img": "icons/consumables/potions/bottle-round-label-cork-green.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.I4cQ03xbxnc81EGa", - "_id": "2WsA7zyGFJROyf8n", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.2WsA7zyGFJROyf8n" - }, - { - "type": "document", - "weight": 1, - "range": [ - 45, - 45 - ], - "name": "Ogre Musk", - "img": "icons/commodities/materials/slime-thick-green.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.qr1bosjFcUfuwq4B", - "_id": "vNlix6NqUSWwq2MU", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.vNlix6NqUSWwq2MU" - }, - { - "type": "document", - "weight": 1, - "range": [ - 46, - 46 - ], - "name": "Wingsprout", - "img": "icons/consumables/plants/leaf-broad-blue.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.n10vozlmosVR6lo4", - "_id": "iCj1YAinJxuGT2EN", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.iCj1YAinJxuGT2EN" - }, - { - "type": "document", - "weight": 1, - "range": [ - 47, - 47 - ], - "name": "Jar of Lost Voices", - "img": "icons/containers/kitchenware/jug-wrapped-red.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.yUol6M5b8jsbk9za", - "_id": "mTq9bibanrSynx3t", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.mTq9bibanrSynx3t" - }, - { - "type": "document", - "weight": 1, - "range": [ - 48, - 48 - ], - "name": "Dragonbloom Tea", - "img": "icons/consumables/drinks/tea-jug-gourd-brown.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.wM18PWWW2Ami4fBG", - "_id": "oEKTJg1p52E1NVqm", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.oEKTJg1p52E1NVqm" - }, - { - "type": "document", - "weight": 1, - "range": [ - 49, - 49 - ], - "name": "Bridge Seed", - "img": "icons/consumables/plants/leaf-old-dried-curled-green.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.RrIasiMCt6mqVTps", - "_id": "viK90OvIqxwj8kcD", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.viK90OvIqxwj8kcD" - }, - { - "type": "document", - "weight": 1, - "range": [ - 50, - 50 - ], - "name": "Sleeping Sap", - "img": "icons/consumables/potions/bottle-bulb-corked-labeled-blue.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.XZavUVlHEvE2srEt", - "_id": "7bOHwnq9xyBXT0Or", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.7bOHwnq9xyBXT0Or" - }, - { - "type": "document", - "weight": 1, - "range": [ - 51, - 51 - ], - "name": "Feast of Xuria", - "img": "icons/consumables/food/bowl-stew-tofu-potato-red.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.aX6NyxkNzu0LcJpt", - "_id": "aF8qVVOuVHUCyDon", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.aF8qVVOuVHUCyDon" - }, - { - "type": "document", - "weight": 1, - "range": [ - 52, - 52 - ], - "name": "Bonding Honey", - "img": "icons/consumables/food/soup-broth-bowl-wooden-yellow.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.PfQvqopXgvroBklL", - "_id": "dXbNSYrZs1LpnX2D", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.dXbNSYrZs1LpnX2D" - }, - { - "type": "document", - "weight": 1, - "range": [ - 53, - 53 - ], - "name": "Shrinking Potion", - "img": "icons/consumables/potions/flask-decorated-label-pink.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.HGixKenQwhyRAYNk", - "_id": "YpBzj89kfEpjmhO7", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.YpBzj89kfEpjmhO7" - }, - { - "type": "document", - "weight": 1, - "range": [ - 54, - 54 - ], - "name": "Growing Potion", - "img": "icons/consumables/potions/potion-bottle-corked-labeled-green.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.fl2f3ees8RFMze9t", - "_id": "3QHLVvfKx73UTKmm", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.3QHLVvfKx73UTKmm" - }, - { - "type": "document", - "weight": 1, - "range": [ - 55, - 55 - ], - "name": "Knowledge Stone", - "img": "icons/commodities/treasure/token-engraved-blue-glowing.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.nL9IALzm9BNi5oSt", - "_id": "C4MpR7mBHjIiPRzo", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.C4MpR7mBHjIiPRzo" - }, - { - "type": "document", - "weight": 1, - "range": [ - 56, - 56 - ], - "name": "Sweet Moss", - "img": "icons/consumables/plants/succulent-bundle-green.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.GrDrRqWgv7gvl9vn", - "_id": "Z5UPngFMi7TSojoM", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.Z5UPngFMi7TSojoM" - }, - { - "type": "document", - "weight": 1, - "range": [ - 57, - 57 - ], - "name": "Blinding Orb", - "img": "icons/magic/light/explosion-star-large-blue-yellow.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.eAXHdzA5qNPldOpn", - "_id": "bMCETSm5oYxdpRyu", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.bMCETSm5oYxdpRyu" - }, - { - "type": "document", - "weight": 1, - "range": [ - 58, - 58 - ], - "name": "Death Tea", - "img": "icons/consumables/drinks/wine-amphora-clay-gray.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.xDnJeF1grkmKck8Q", - "_id": "wkAnGk1yLHE6bzfr", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.wkAnGk1yLHE6bzfr" - }, - { - "type": "document", - "weight": 1, - "range": [ - 59, - 59 - ], - "name": "Mirror of Marigold", - "img": "icons/commodities/treasure/token-silver-blue.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.UFQVwgYOUZ88UxcH", - "_id": "XKAAfJUyqwRSRgh1", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.XKAAfJUyqwRSRgh1" - }, - { - "type": "document", - "weight": 1, - "range": [ - 60, - 60 - ], - "name": "Stardrop", - "img": "icons/magic/light/projectiles-star-purple.webp", - "documentUuid": "Compendium.daggerheart.consumables.Item.y4c1jrlHrf0wBWOq", - "_id": "91ALaXvFQDOq5h2A", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!tF04P02yVN1YDVel.91ALaXvFQDOq5h2A" - } - ], - "replacement": true, - "displayRoll": true, - "folder": null, - "ownership": { - "default": 0, - "Bgvu4A6AMkRFOTGR": 3 - }, - "flags": {}, - "formula": "1d60", - "_id": "tF04P02yVN1YDVel", - "sort": 300000, - "_key": "!tables!tF04P02yVN1YDVel" -} diff --git a/src/packs/rolltables/tables_Loot_S61Shlt2I5CbLRjz.json b/src/packs/rolltables/tables_Loot_S61Shlt2I5CbLRjz.json deleted file mode 100644 index 9517eadd..00000000 --- a/src/packs/rolltables/tables_Loot_S61Shlt2I5CbLRjz.json +++ /dev/null @@ -1,1519 +0,0 @@ -{ - "name": "Loot", - "img": "icons/commodities/treasure/brooch-gold-ruby.webp", - "description": "

To generate a random item, choose a rarity, roll the designated dice, and match the total to the item in the table:

  • Common: 1d12 or 2d12

  • Uncommon: 2d12 or 3d12

  • Rare: 3d12 or 4d12

  • Legendary: 4d12 or 5d12

", - "results": [ - { - "type": "document", - "weight": 1, - "range": [ - 1, - 1 - ], - "_id": "U0jqWUc9SVQTwZOt", - "name": "Premium Bedroll", - "img": "icons/sundries/survival/bedroll-blue-red.webp", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "documentUuid": "Compendium.daggerheart.loot.Item.QGYPNBIufpBguwjC", - "_key": "!tables.results!S61Shlt2I5CbLRjz.U0jqWUc9SVQTwZOt" - }, - { - "type": "document", - "weight": 1, - "range": [ - 2, - 2 - ], - "_id": "jsje2l4MxyDSeiQ5", - "name": "Piper Whistle", - "img": "icons/tools/instruments/pipe-flue-tan.webp", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "documentUuid": "Compendium.daggerheart.loot.Item.v4PIoCCEjeE3acys", - "_key": "!tables.results!S61Shlt2I5CbLRjz.jsje2l4MxyDSeiQ5" - }, - { - "type": "document", - "weight": 1, - "range": [ - 3, - 3 - ], - "name": "Charging Quiver", - "img": "icons/containers/ammunition/arrows-quiver-grey-gold.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.gsUDP90d4SRtLEUn", - "_id": "OUEywrTcAKy9jOf2", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.OUEywrTcAKy9jOf2" - }, - { - "type": "document", - "weight": 1, - "range": [ - 4, - 4 - ], - "name": "Alistair’s Torch", - "img": "icons/sundries/lights/torch-brown-lit.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.MeEg57T6MKpw3sme", - "_id": "jYHROKTetnH9U1NF", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.jYHROKTetnH9U1NF" - }, - { - "type": "document", - "weight": 1, - "range": [ - 5, - 5 - ], - "name": "Speaking Orbs", - "img": "icons/commodities/materials/glass-orb-blue-gold.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.LZrG6CFiSjpLA2F1", - "_id": "1skyTdrVs2cPMbYd", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.1skyTdrVs2cPMbYd" - }, - { - "type": "document", - "weight": 1, - "range": [ - 6, - 6 - ], - "name": "Manacles", - "img": "icons/sundries/survival/cuffs-shackles-steel.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.GkmATIuemyFtQX1D", - "_id": "ew7VM7lktgEHUVNh", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.ew7VM7lktgEHUVNh" - }, - { - "type": "document", - "weight": 1, - "range": [ - 7, - 7 - ], - "name": "Arcane Cloak", - "img": "icons/equipment/back/cloak-layered-green-brown.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.4STt98biZwjFoKOe", - "_id": "ghM44MABWLVc0594", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.ghM44MABWLVc0594" - }, - { - "type": "document", - "weight": 1, - "range": [ - 8, - 8 - ], - "name": "Woven Net", - "img": "icons/tools/fishing/net-tan.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.ARuv48PWUGJGBC4n", - "_id": "NWltT1Sifub9cFxR", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.NWltT1Sifub9cFxR" - }, - { - "type": "document", - "weight": 1, - "range": [ - 9, - 9 - ], - "name": "Fire Jar", - "img": "icons/containers/kitchenware/jug-wrapped-red.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.X6RMkIt89wf7qX2E", - "_id": "2NbLnKKXmmx5m1Di", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.2NbLnKKXmmx5m1Di" - }, - { - "type": "document", - "weight": 1, - "range": [ - 10, - 10 - ], - "name": "Suspended Rod", - "img": "icons/commodities/tech/pipe-metal.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.nnj12RiFanq7s5zv", - "_id": "COpKr1HYsR8Jkwyn", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.COpKr1HYsR8Jkwyn" - }, - { - "type": "document", - "weight": 1, - "range": [ - 11, - 11 - ], - "name": "Glamour Stone", - "img": "icons/commodities/treasure/token-engraved-purple-glowing.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.Pj17cvdJ1XG1jv6I", - "_id": "e1vjhShtDZSnVUNu", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.e1vjhShtDZSnVUNu" - }, - { - "type": "document", - "weight": 1, - "range": [ - 12, - 12 - ], - "name": "Empty Chest", - "img": "icons/containers/chest/chest-simple-box-gold-brown.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.p2yy61uKsyIsl8cU", - "_id": "HIvObcLTrncfN7Qx", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.HIvObcLTrncfN7Qx" - }, - { - "type": "document", - "weight": 1, - "range": [ - 13, - 13 - ], - "name": "Companion Case", - "img": "icons/containers/chest/chest-reinforced-steel-red.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.V25uXkAQvK3hUta4", - "_id": "fCgRZndg111RI8MC", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.fCgRZndg111RI8MC" - }, - { - "type": "document", - "weight": 1, - "range": [ - 14, - 14 - ], - "name": "Piercing Arrows", - "img": "icons/weapons/ammunition/arrow-broadhead-glowing-orange.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.I63LTFD6GXHgyGpR", - "_id": "97oyM8w0xZjeQkeM", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.97oyM8w0xZjeQkeM" - }, - { - "type": "document", - "weight": 1, - "range": [ - 15, - 15 - ], - "name": "Valorstone", - "img": "icons/commodities/treasure/token-engraved-spiral-grey-white.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.7yywua9TmQ4WP5WH", - "_id": "EY4Rtt8KDpjhTxCH", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.EY4Rtt8KDpjhTxCH" - }, - { - "type": "document", - "weight": 1, - "range": [ - 16, - 16 - ], - "name": "Skeleton Key", - "img": "icons/sundries/misc/key-ornate-iron-black.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.edkNgwy4xghZreBa", - "_id": "XYORiEz8M7K3BNWM", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.XYORiEz8M7K3BNWM" - }, - { - "type": "document", - "weight": 1, - "range": [ - 17, - 17 - ], - "name": "Arcane Prism", - "img": "icons/commodities/gems/gem-faceted-trillion-blue.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.Mn1eo2Mdtu1kzyxB", - "_id": "Yc3x5ifOASG15MrD", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.Yc3x5ifOASG15MrD" - }, - { - "type": "document", - "weight": 1, - "range": [ - 18, - 18 - ], - "name": "Minor Stamina Potion Recipe", - "img": "icons/sundries/scrolls/scroll-bound-green.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.1TLpFsp3PLDsqoTw", - "_id": "akIE4Bu9zq6N4N0d", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.akIE4Bu9zq6N4N0d" - }, - { - "type": "document", - "weight": 1, - "range": [ - 19, - 19 - ], - "name": "Minor Health Potion Recipe", - "img": "icons/sundries/scrolls/scroll-bound-red.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.PQxvxAVBbkt0TleC", - "_id": "GVUbOeXrT0TLPlW9", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.GVUbOeXrT0TLPlW9" - }, - { - "type": "document", - "weight": 1, - "range": [ - 20, - 20 - ], - "name": "Homing Compasses", - "img": "icons/tools/navigation/compass-worn-copper.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.yrAGYlDyoe4OYl7d", - "_id": "0FaxK5udut2y79B7", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.0FaxK5udut2y79B7" - }, - { - "type": "document", - "weight": 1, - "range": [ - 21, - 21 - ], - "name": "Corrector Sprite", - "img": "icons/magic/light/orbs-smoke-pink.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.G0RktbmtnuAlKCRH", - "_id": "R1iPLFiRgHFhm5x2", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.R1iPLFiRgHFhm5x2" - }, - { - "type": "document", - "weight": 1, - "range": [ - 22, - 22 - ], - "name": "Gecko Gloves", - "img": "icons/equipment/hand/glove-ring-leather-green.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.CGzjBpHJRG8KSt5Y", - "_id": "MUWHmP6Bx55SSOpQ", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.MUWHmP6Bx55SSOpQ" - }, - { - "type": "document", - "weight": 1, - "range": [ - 23, - 23 - ], - "name": "Lorekeeper", - "img": "icons/sundries/books/book-backed-wood-tan.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.JsPYzrqpITqGj23I", - "_id": "X2vU11ltW4aMbPcc", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.X2vU11ltW4aMbPcc" - }, - { - "type": "document", - "weight": 1, - "range": [ - 24, - 24 - ], - "name": "Vial of Darksmoke Recipe", - "img": "icons/sundries/scrolls/scroll-bound-black-brown.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.MhCo8i0cRXzdnXbA", - "_id": "SJmfB1HDxXJB6xyS", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.SJmfB1HDxXJB6xyS" - }, - { - "type": "document", - "weight": 1, - "range": [ - 25, - 25 - ], - "name": "Bloodstone", - "img": "icons/commodities/treasure/token-engraved-eye-red.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.oMd78vhL2x2NO8Mg", - "_id": "dEyzIWTTbSk8LaoN", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.dEyzIWTTbSk8LaoN" - }, - { - "type": "document", - "weight": 1, - "range": [ - 26, - 26 - ], - "name": "Greatstone", - "img": "icons/commodities/treasure/token-etched-h-brown.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.y7zABzR0Q2fRskTw", - "_id": "sSwx1g6eqgLqPgBu", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.sSwx1g6eqgLqPgBu" - }, - { - "type": "document", - "weight": 1, - "range": [ - 27, - 27 - ], - "name": "Glider", - "img": "icons/commodities/leather/leather-patch-red.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.CiXwelozmBDcPY48", - "_id": "DSPDKm53Mu6PeaK1", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.DSPDKm53Mu6PeaK1" - }, - { - "type": "document", - "weight": 1, - "range": [ - 28, - 28 - ], - "name": "Ring of Silence", - "img": "icons/equipment/finger/ring-ball-purple.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.K1ysGnTpNyxPu5Au", - "_id": "SSuVJ6WbSdfpMxTx", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.SSuVJ6WbSdfpMxTx" - }, - { - "type": "document", - "weight": 1, - "range": [ - 29, - 29 - ], - "name": "Calming Pendant", - "img": "icons/equipment/neck/amulet-round-blue.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.tgFFMxpuRSiRrrEB", - "_id": "Fwq1wJzAGdO2rUWo", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.Fwq1wJzAGdO2rUWo" - }, - { - "type": "document", - "weight": 1, - "range": [ - 30, - 30 - ], - "name": "Dual Flask", - "img": "icons/consumables/potions/round-decorated-snake-green.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.HCvcAu3sdHCspGMP", - "_id": "elle12djjCs3D6Vr", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.elle12djjCs3D6Vr" - }, - { - "type": "document", - "weight": 1, - "range": [ - 31, - 31 - ], - "name": "Bag of Ficklesand", - "img": "icons/containers/bags/pouch-cloth-tan.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.v758j4FwNVAurhYK", - "_id": "yXyVHCrQEamt9DSt", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.yXyVHCrQEamt9DSt" - }, - { - "type": "document", - "weight": 1, - "range": [ - 32, - 32 - ], - "name": "Ring of Resistance", - "img": "icons/equipment/finger/ring-shield-silver.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.aUqRifqR5JXXa1dN", - "_id": "mHlhtw9BRyMeeGvz", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.mHlhtw9BRyMeeGvz" - }, - { - "type": "document", - "weight": 1, - "range": [ - 33, - 33 - ], - "name": "Phoenix Feather", - "img": "icons/commodities/materials/feather-red.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.QNtzJSVENww63THa", - "_id": "5R86TY964aeYZxLa", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.5R86TY964aeYZxLa" - }, - { - "type": "document", - "weight": 1, - "range": [ - 34, - 34 - ], - "name": "Box of Many Goods", - "img": "icons/containers/boxes/crate-heavy-yellow.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.bZyT7Qw7iafswlTY", - "_id": "6ZhCovGbkTxRJFFx", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.6ZhCovGbkTxRJFFx" - }, - { - "type": "document", - "weight": 1, - "range": [ - 35, - 35 - ], - "name": "Airblade Charm", - "img": "icons/equipment/neck/amulet-carved-stone-spiral-blue.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.cTYvyaSKBxosM9Y9", - "_id": "UYHcpVuL9P26VPBM", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.UYHcpVuL9P26VPBM" - }, - { - "type": "document", - "weight": 1, - "range": [ - 36, - 36 - ], - "name": "Portal Seed", - "img": "icons/commodities/treasure/egg-ornate-green-gold.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.eRd5Gk7J7hPCqp11", - "_id": "yOchOTcWwUwug2st", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.yOchOTcWwUwug2st" - }, - { - "type": "document", - "weight": 1, - "range": [ - 37, - 37 - ], - "name": "Paragon’s Chain", - "img": "icons/equipment/neck/choker-chain-thin-gold.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.F4hoRfvVdZq5bhhI", - "_id": "TFgxOPNDbLYDzxrl", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.TFgxOPNDbLYDzxrl" - }, - { - "type": "document", - "weight": 1, - "range": [ - 38, - 38 - ], - "name": "Elusive Amulet", - "img": "icons/equipment/neck/pendant-rough-silver-purple.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.PkmTZXRMZL022O75", - "_id": "GcJEXPoMDxxWNYno", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.GcJEXPoMDxxWNYno" - }, - { - "type": "document", - "weight": 1, - "range": [ - 39, - 39 - ], - "name": "Hopekeeper Locket", - "img": "icons/equipment/neck/amulet-round-engraved-spiral-gold.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.9DcFR75tsnBYIp6Z", - "_id": "iyiOPysR6uQE7QXR", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.iyiOPysR6uQE7QXR" - }, - { - "type": "document", - "weight": 1, - "range": [ - 40, - 40 - ], - "name": "Infinite Bag", - "img": "icons/containers/bags/pack-engraved-leather-blue.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.Iedjw1LVWEozVh0J", - "_id": "nsg8GxSABbvsZo5v", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.nsg8GxSABbvsZo5v" - }, - { - "type": "document", - "weight": 1, - "range": [ - 41, - 41 - ], - "name": "Stride Relic", - "img": "icons/commodities/treasure/token-runed-ing-brown.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.FfJISMzYATaPQPLc", - "_id": "DFEA1djJSnstOXym", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.DFEA1djJSnstOXym" - }, - { - "type": "document", - "weight": 1, - "range": [ - 42, - 42 - ], - "name": "Bolster Relic", - "img": "icons/commodities/treasure/token-runed-radr-brown.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.m3EpxlDgxn2tCDDR", - "_id": "xa075fPgUGCVVGiy", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.xa075fPgUGCVVGiy" - }, - { - "type": "document", - "weight": 1, - "range": [ - 43, - 43 - ], - "name": "Control Relic", - "img": "icons/commodities/treasure/token-runed-sigel-brown.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.QPGBDItjrRhXU6iJ", - "_id": "zNS3a6JZLlLgXxXI", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.zNS3a6JZLlLgXxXI" - }, - { - "type": "document", - "weight": 1, - "range": [ - 44, - 44 - ], - "name": "Attune Relic", - "img": "icons/commodities/treasure/token-runed-spiral-grey.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.vK6bKyQTT3m8WvMh", - "_id": "pf1zrtyDamclUpb5", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.pf1zrtyDamclUpb5" - }, - { - "type": "document", - "weight": 1, - "range": [ - 45, - 45 - ], - "name": "Charm Relic", - "img": "icons/commodities/treasure/token-runed-wyn-grey.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.9P9jqGSlxVCbTdLe", - "_id": "JNsJQefAYXARnzcB", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.JNsJQefAYXARnzcB" - }, - { - "type": "document", - "weight": 1, - "range": [ - 46, - 46 - ], - "name": "Enlighten Relic", - "img": "icons/commodities/treasure/token-runed-os-grey.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.vSGx1f9SYUiA29L3", - "_id": "Bk2zTfHlpNg4f4AB", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.Bk2zTfHlpNg4f4AB" - }, - { - "type": "document", - "weight": 1, - "range": [ - 47, - 47 - ], - "name": "Honing Relic", - "img": "icons/commodities/treasure/token-runed-nyd-yellow.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.SAAnEAeXDnhBbLjB", - "_id": "BxB4fAXy57tWHc98", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.BxB4fAXy57tWHc98" - }, - { - "type": "document", - "weight": 1, - "range": [ - 48, - 48 - ], - "name": "Flickerfly Pendant", - "img": "icons/equipment/neck/choker-rough-green.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.9VKYSBQxN9XFWlAm", - "_id": "b7JDKti5fXipswXs", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.b7JDKti5fXipswXs" - }, - { - "type": "document", - "weight": 1, - "range": [ - 49, - 49 - ], - "name": "Lakestrider Boots", - "img": "icons/equipment/feet/shoes-collared-leather-blue.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.NgvmrJYKpA2PrRSo", - "_id": "ngpVKb5GIJySdf2Y", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.ngpVKb5GIJySdf2Y" - }, - { - "type": "document", - "weight": 1, - "range": [ - 50, - 50 - ], - "name": "Clay Companion", - "img": "icons/commodities/gems/pearl-brown.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.lGIk9vBNz0jvskXD", - "_id": "IrKbVyqUcSruPPfZ", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.IrKbVyqUcSruPPfZ" - }, - { - "type": "document", - "weight": 1, - "range": [ - 51, - 51 - ], - "name": "Mythic Dust Recipe", - "img": "icons/sundries/scrolls/scroll-bound-green.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.5YZls8XH3MB7twNa", - "_id": "V1R3wUj4l7lnbph1", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.V1R3wUj4l7lnbph1" - }, - { - "type": "document", - "weight": 1, - "range": [ - 52, - 52 - ], - "name": "Shard of Memory", - "img": "icons/commodities/gems/gem-rough-navette-purple-pink.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.2ULPgNyqCrxea0v0", - "_id": "0dFhkeOokjbwptHh", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.0dFhkeOokjbwptHh" - }, - { - "type": "document", - "weight": 1, - "range": [ - 53, - 53 - ], - "name": "Gem of Alacrity", - "img": "icons/commodities/gems/gem-rough-ball-purple.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.zecFwBUSWtB3HW8X", - "_id": "CLObmHdtId5fEs4n", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.CLObmHdtId5fEs4n" - }, - { - "type": "document", - "weight": 1, - "range": [ - 54, - 54 - ], - "name": "Gem of Might", - "img": "icons/commodities/gems/gem-rough-brilliant-green.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.rtSInNPc4B3ChBUZ", - "_id": "17Zw4Tl1s1h5cFZK", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.17Zw4Tl1s1h5cFZK" - }, - { - "type": "document", - "weight": 1, - "range": [ - 55, - 55 - ], - "name": "Gem of Precision", - "img": "icons/commodities/gems/gem-rough-cushion-green.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.CrvJ7vb4s40YgEcy", - "_id": "6zmLU8WdmEWbIHBL", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.6zmLU8WdmEWbIHBL" - }, - { - "type": "document", - "weight": 1, - "range": [ - 56, - 56 - ], - "name": "Gem of Insight", - "img": "icons/commodities/gems/gem-rough-cushion-blue.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.TbgeT9ZxKHqFqJSN", - "_id": "AEeWEQnJwq51mBnM", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.AEeWEQnJwq51mBnM" - }, - { - "type": "document", - "weight": 1, - "range": [ - 57, - 57 - ], - "name": "Gem of Audacity", - "img": "icons/commodities/gems/gem-rough-cushion-pink-yellow.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.hMu9It3ThCLCXuCA", - "_id": "SuymUKc0CeisDgm2", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.SuymUKc0CeisDgm2" - }, - { - "type": "document", - "weight": 1, - "range": [ - 58, - 58 - ], - "name": "Gem of Sagacity", - "img": "icons/commodities/gems/gem-rough-cushion-purple.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.ua351S7CsH22X1x2", - "_id": "27LKVRatgX1asMpR", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.27LKVRatgX1asMpR" - }, - { - "type": "document", - "weight": 1, - "range": [ - 59, - 59 - ], - "name": "Ring of Unbreakable Resolve", - "img": "icons/equipment/finger/ring-faceted-gold-teal.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.kn71qCQY0DnjmQBJ", - "_id": "3A76l2jxYMqVfcQY", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.3A76l2jxYMqVfcQY" - }, - { - "type": "document", - "weight": 1, - "range": [ - 60, - 60 - ], - "name": "Belt of Unity", - "img": "icons/equipment/waist/belt-buckle-ornate-steel.webp", - "documentUuid": "Compendium.daggerheart.loot.Item.gFzkUGCjkRJtyoe9", - "_id": "dkLn9gwnlaD4kbZ2", - "description": "", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "_key": "!tables.results!S61Shlt2I5CbLRjz.dkLn9gwnlaD4kbZ2" - } - ], - "replacement": true, - "displayRoll": true, - "folder": null, - "ownership": { - "default": 0, - "Bgvu4A6AMkRFOTGR": 3 - }, - "flags": {}, - "formula": "1d60", - "_id": "S61Shlt2I5CbLRjz", - "sort": 200000, - "_key": "!tables!S61Shlt2I5CbLRjz" -} diff --git a/src/packs/rolltables/tables_Table_of_Random_Objectives_I5L1dlgxXTNrCCkL.json b/src/packs/rolltables/tables_Table_of_Random_Objectives_I5L1dlgxXTNrCCkL.json deleted file mode 100644 index b10127e7..00000000 --- a/src/packs/rolltables/tables_Table_of_Random_Objectives_I5L1dlgxXTNrCCkL.json +++ /dev/null @@ -1,319 +0,0 @@ -{ - "name": "Table of Random Objectives", - "img": "icons/sundries/documents/document-torn-diagram-tan.webp", - "description": "

Layering Goals Other than Attrition into Combat

", - "results": [ - { - "type": "text", - "weight": 1, - "range": [ - 1, - 1 - ], - "_id": "LDuVbmdvhJiEOe7U", - "name": "", - "img": "icons/svg/d12-grey.svg", - "description": "

Acquire (obtain or steal) an important item or items.

", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "documentUuid": null, - "_key": "!tables.results!I5L1dlgxXTNrCCkL.LDuVbmdvhJiEOe7U" - }, - { - "type": "text", - "weight": 1, - "range": [ - 2, - 2 - ], - "_id": "FxYpST4nQUTBp1mN", - "name": "", - "img": "icons/svg/d12-grey.svg", - "description": "

Capture one or more of the opponents.

", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "documentUuid": null, - "_key": "!tables.results!I5L1dlgxXTNrCCkL.FxYpST4nQUTBp1mN" - }, - { - "type": "text", - "weight": 1, - "range": [ - 3, - 3 - ], - "_id": "bTkZgxqEr4lNxzeK", - "name": "", - "img": "icons/svg/d12-grey.svg", - "description": "

Activate a magical device.

", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "documentUuid": null, - "_key": "!tables.results!I5L1dlgxXTNrCCkL.bTkZgxqEr4lNxzeK" - }, - { - "type": "text", - "weight": 1, - "range": [ - 4, - 4 - ], - "_id": "T39LgOL1cw5AIY59", - "name": "", - "img": "icons/svg/d12-grey.svg", - "description": "

Frame a character or tarnish their reputation.

", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "documentUuid": null, - "_key": "!tables.results!I5L1dlgxXTNrCCkL.T39LgOL1cw5AIY59" - }, - { - "type": "text", - "weight": 1, - "range": [ - 5, - 5 - ], - "_id": "MHgv8dlrwA3ZmBKq", - "name": "", - "img": "icons/svg/d12-grey.svg", - "description": "

Drive the opponent into a corner or ambush point.

", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "documentUuid": null, - "_key": "!tables.results!I5L1dlgxXTNrCCkL.MHgv8dlrwA3ZmBKq" - }, - { - "type": "text", - "weight": 1, - "range": [ - 6, - 6 - ], - "_id": "4USCNNavzVvBqldn", - "name": "", - "img": "icons/svg/d12-grey.svg", - "description": "

Stop a magical ritual, legal ceremony, or time-sensitive spell.

", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "documentUuid": null, - "_key": "!tables.results!I5L1dlgxXTNrCCkL.4USCNNavzVvBqldn" - }, - { - "type": "text", - "weight": 1, - "range": [ - 7, - 7 - ], - "_id": "gwZnWTauHsbb6rsr", - "name": "", - "img": "icons/svg/d12-grey.svg", - "description": "

Hold the line—keep the enemy from reaching a specific area or group.

", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "documentUuid": null, - "_key": "!tables.results!I5L1dlgxXTNrCCkL.gwZnWTauHsbb6rsr" - }, - { - "type": "text", - "weight": 1, - "range": [ - 8, - 8 - ], - "_id": "beDIxxPyCCVa8nlE", - "name": "", - "img": "icons/svg/d12-grey.svg", - "description": "

Plant evidence or a tracking device on a target.

", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "documentUuid": null, - "_key": "!tables.results!I5L1dlgxXTNrCCkL.beDIxxPyCCVa8nlE" - }, - { - "type": "text", - "weight": 1, - "range": [ - 9, - 9 - ], - "_id": "C70V6prVmZd5VRV8", - "name": "", - "img": "icons/svg/d12-grey.svg", - "description": "

Secure a specific location ahead of another group’s arrival.

", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "documentUuid": null, - "_key": "!tables.results!I5L1dlgxXTNrCCkL.C70V6prVmZd5VRV8" - }, - { - "type": "text", - "weight": 1, - "range": [ - 10, - 10 - ], - "_id": "i02rh05CvhHlKJCN", - "name": "", - "img": "icons/svg/d12-grey.svg", - "description": "

Harass the opponent to deplete their resources or keep them occupied.

", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "documentUuid": null, - "_key": "!tables.results!I5L1dlgxXTNrCCkL.i02rh05CvhHlKJCN" - }, - { - "type": "text", - "weight": 1, - "range": [ - 11, - 11 - ], - "_id": "AbNgD5GCbWuui9oP", - "name": "", - "img": "icons/svg/d12-grey.svg", - "description": "

Destroy a piece of architecture, a statue, a shrine, or a weapon.

", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "documentUuid": null, - "_key": "!tables.results!I5L1dlgxXTNrCCkL.AbNgD5GCbWuui9oP" - }, - { - "type": "text", - "weight": 1, - "range": [ - 12, - 12 - ], - "_id": "TCrdyh3qhl2vtQxO", - "name": "", - "img": "icons/svg/d12-grey.svg", - "description": "

Investigate a situation to confirm or deny existing information.

", - "drawn": false, - "flags": {}, - "_stats": { - "compendiumSource": null, - "duplicateSource": null, - "exportSource": null, - "coreVersion": "13.351", - "systemId": "daggerheart", - "systemVersion": "1.4.4", - "lastModifiedBy": null - }, - "documentUuid": null, - "_key": "!tables.results!I5L1dlgxXTNrCCkL.TCrdyh3qhl2vtQxO" - } - ], - "replacement": true, - "displayRoll": true, - "folder": null, - "ownership": { - "default": 0, - "Bgvu4A6AMkRFOTGR": 3 - }, - "flags": {}, - "formula": "1d12", - "_id": "I5L1dlgxXTNrCCkL", - "sort": 400000, - "_key": "!tables!I5L1dlgxXTNrCCkL" -} diff --git a/src/packs/subclasses/feature_Conjure_Shield_oirsCnN66GOlK3Fa.json b/src/packs/subclasses/feature_Conjure_Shield_oirsCnN66GOlK3Fa.json index 99b04487..8847b7af 100644 --- a/src/packs/subclasses/feature_Conjure_Shield_oirsCnN66GOlK3Fa.json +++ b/src/packs/subclasses/feature_Conjure_Shield_oirsCnN66GOlK3Fa.json @@ -35,7 +35,7 @@ "key": "system.evasion", "mode": 2, "value": "@system.proficiency", - "priority": 21 + "priority": null } ], "disabled": false, diff --git a/src/packs/subclasses/feature_Elemental_Incarnation_f37TTgCc0Q3Ih1A1.json b/src/packs/subclasses/feature_Elemental_Incarnation_f37TTgCc0Q3Ih1A1.json index 30ffb50b..6dcd5f13 100644 --- a/src/packs/subclasses/feature_Elemental_Incarnation_f37TTgCc0Q3Ih1A1.json +++ b/src/packs/subclasses/feature_Elemental_Incarnation_f37TTgCc0Q3Ih1A1.json @@ -255,13 +255,13 @@ "key": "system.damageThresholds.major", "mode": 2, "value": "@system.proficiency", - "priority": 21 + "priority": null }, { "key": "system.damageThresholds.severe", "mode": 2, "value": "@system.proficiency", - "priority": 21 + "priority": null } ], "disabled": false, diff --git a/src/packs/subclasses/feature_Iron_Will_7AVRNyBcd1Nffjtn.json b/src/packs/subclasses/feature_Iron_Will_7AVRNyBcd1Nffjtn.json index bea62e2b..eda72fd7 100644 --- a/src/packs/subclasses/feature_Iron_Will_7AVRNyBcd1Nffjtn.json +++ b/src/packs/subclasses/feature_Iron_Will_7AVRNyBcd1Nffjtn.json @@ -32,7 +32,7 @@ "img": "icons/equipment/chest/breastplate-helmet-metal.webp", "changes": [ { - "key": "system.rules.damageReduction.maxArmorMarked.value", + "key": "system.rules.damageReduction.maxArmorMarked.stressExtra", "mode": 2, "value": "1", "priority": null diff --git a/src/packs/subclasses/feature_Wings_of_Light_KkQH0tYhagIqe2MT.json b/src/packs/subclasses/feature_Wings_of_Light_KkQH0tYhagIqe2MT.json index 5b86e348..2fa32bec 100644 --- a/src/packs/subclasses/feature_Wings_of_Light_KkQH0tYhagIqe2MT.json +++ b/src/packs/subclasses/feature_Wings_of_Light_KkQH0tYhagIqe2MT.json @@ -15,16 +15,7 @@ "description": "

Mark a Stress to pick up and carry another willing creature approximately your size or smaller.

", "chatDisplay": true, "actionType": "action", - "cost": [ - { - "scalable": false, - "key": "stress", - "value": 1, - "itemId": null, - "step": null, - "consumeOnSuccess": false - } - ], + "cost": [], "uses": { "value": null, "max": "", @@ -69,12 +60,12 @@ } ], "target": { - "type": "self", + "type": "any", "amount": null }, "name": "Spend Hope", "img": "icons/magic/light/projectile-beam-yellow.webp", - "range": "self" + "range": "" } }, "originItemType": null, diff --git a/styles/less/dialog/index.less b/styles/less/dialog/index.less index b5ed8764..91b2846b 100644 --- a/styles/less/dialog/index.less +++ b/styles/less/dialog/index.less @@ -37,5 +37,3 @@ @import './image-select/sheet.less'; @import './item-transfer/sheet.less'; - -@import './settings/change-currency-icon.less'; \ No newline at end of file diff --git a/styles/less/dialog/item-transfer/sheet.less b/styles/less/dialog/item-transfer/sheet.less index 7807e479..dd55fdb2 100644 --- a/styles/less/dialog/item-transfer/sheet.less +++ b/styles/less/dialog/item-transfer/sheet.less @@ -1,35 +1,20 @@ .daggerheart.dh-style.dialog.item-transfer { - .summary { - display: flex; - align-items: center; - justify-content: center; - gap: 3rem; - - .actor-img { - border-radius: 50%; - width: 5rem; - height: 5rem; - object-fit: cover; - object-position: top center; - } + .item-transfer-container { + display: grid; + grid-template-columns: 1fr 42px; + gap: 4px; - .granted-item { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: var(--font-size-32); - - img { - width: 2rem; - height: 2rem; - object-fit: contain; - border-radius: 3px; - } + .number-display { + text-align: center; } } - label { - flex: 0; - margin-right: 0.5rem; + + .item-sheet-footer { + padding-top: 8px; + display: flex; + + button { + flex: 1; + } } } diff --git a/styles/less/dialog/settings/change-currency-icon.less b/styles/less/dialog/settings/change-currency-icon.less deleted file mode 100644 index 61870a4b..00000000 --- a/styles/less/dialog/settings/change-currency-icon.less +++ /dev/null @@ -1,13 +0,0 @@ -.application.daggerheart.dialog.dh-style.change-currency-icon { - .displayed-icon { - height: 2.5rem; - text-align: center; - font-size: 2.5rem; - margin-bottom: 1.25rem; - } - .input-row { - display: flex; - gap: 4px; - align-items: center; - } -} \ No newline at end of file diff --git a/styles/less/global/chat.less b/styles/less/global/chat.less index 69ee369a..3f83294a 100644 --- a/styles/less/global/chat.less +++ b/styles/less/global/chat.less @@ -25,7 +25,6 @@ padding: 8px; } -.vtt.stream.system-daggerheart .chat-sidebar, .daggerheart.chat-sidebar, #chat-notifications { .chat-log { diff --git a/styles/less/global/elements.less b/styles/less/global/elements.less index e740d917..79deb99d 100755 --- a/styles/less/global/elements.less +++ b/styles/less/global/elements.less @@ -6,8 +6,7 @@ input[type='text'], input[type='number'], - textarea, - .input[contenteditable] { + textarea { background: light-dark(transparent, transparent); border-radius: 6px; box-shadow: 0 4px 30px @soft-shadow; @@ -44,14 +43,6 @@ } } - .input[contenteditable] { - cursor: var(--cursor-text); - &:empty:before { - color: light-dark(@dark-40, @beige-50); - content: attr(placeholder); - } - } - input[type='checkbox'], input[type='radio'] { &:checked::after { diff --git a/styles/less/global/inventory-item.less b/styles/less/global/inventory-item.less index c8a29795..d936358b 100644 --- a/styles/less/global/inventory-item.less +++ b/styles/less/global/inventory-item.less @@ -129,8 +129,7 @@ .item-label { flex: 1; - align-self: stretch; - align-content: center; + align-self: center; .item-name { font-size: var(--font-size-14); diff --git a/styles/less/hud/token-hud/token-hud.less b/styles/less/hud/token-hud/token-hud.less index 46003975..ac269172 100644 --- a/styles/less/hud/token-hud/token-hud.less +++ b/styles/less/hud/token-hud/token-hud.less @@ -56,7 +56,7 @@ .effect-locked { position: absolute; bottom: 2px; - left: 11.5px; + right: 2px; font-size: 12px; color: @golden; filter: drop-shadow(0 0 3px black); diff --git a/styles/less/sheets/actors/adversary/header.less b/styles/less/sheets/actors/adversary/header.less index 8bd3fcee..d4a7812e 100644 --- a/styles/less/sheets/actors/adversary/header.less +++ b/styles/less/sheets/actors/adversary/header.less @@ -12,19 +12,18 @@ gap: 5px; align-items: center; justify-content: space-between; - padding: 8px 0; + padding: 0; + padding-top: 5px; + padding-bottom: 8px; flex: 1; - h1 { - display: flex; - flex: 1; - padding: 6px 0 0 0; + input[type='text'] { font-size: var(--font-size-32); + height: 42px; text-align: start; border: 1px solid transparent; outline: 2px solid transparent; transition: all 0.3s ease; - word-break: break-word; &:hover { outline: 2px solid light-dark(@dark, @golden); @@ -40,7 +39,6 @@ .tag { display: flex; flex-direction: row; - gap: 4px; justify-content: center; align-items: center; padding: 3px 5px; diff --git a/styles/less/sheets/actors/adversary/sidebar.less b/styles/less/sheets/actors/adversary/sidebar.less index 4e7535c1..f8537525 100644 --- a/styles/less/sheets/actors/adversary/sidebar.less +++ b/styles/less/sheets/actors/adversary/sidebar.less @@ -344,19 +344,15 @@ .experience-name { width: 180px; - display: flex; - align-items: center; text-align: start; font-size: var(--font-size-14); color: light-dark(@dark, @beige); - line-height: 1; } } .experience-value { height: 25px; width: 35px; - min-width: 35px; font-size: var(--font-size-14); color: light-dark(@dark, @beige); align-content: center; diff --git a/styles/less/sheets/actors/character/header.less b/styles/less/sheets/actors/character/header.less index 93d6c6be..80089cf7 100644 --- a/styles/less/sheets/actors/character/header.less +++ b/styles/less/sheets/actors/character/header.less @@ -34,22 +34,19 @@ .name-row { display: flex; gap: 5px; - align-items: start; + align-items: end; justify-content: space-between; padding: 0; padding-top: 5px; flex: 1; - h1 { - display: flex; - flex: 1; - padding: 6px 0 0 0; + input[type='text'] { font-size: var(--font-size-32); + height: 42px; text-align: start; border: 1px solid transparent; outline: 2px solid transparent; transition: all 0.3s ease; - word-break: break-word; &:hover { outline: 2px solid light-dark(@dark, @golden); @@ -60,8 +57,6 @@ white-space: nowrap; display: flex; justify-content: end; - height: var(--font-size-32); - margin-top: 6px; .label { display: flex; @@ -145,11 +140,6 @@ button { flex: 1; - padding: 0 0.375rem; - } - - button[data-action=viewParty] { - margin-right: 6px; } } diff --git a/styles/less/sheets/actors/character/sidebar.less b/styles/less/sheets/actors/character/sidebar.less index 04baf2b9..e66cba82 100644 --- a/styles/less/sheets/actors/character/sidebar.less +++ b/styles/less/sheets/actors/character/sidebar.less @@ -592,7 +592,6 @@ .experience-value { height: 25px; width: 35px; - min-width: 35px; font-size: var(--font-size-14); color: light-dark(@dark, @beige); align-content: center; @@ -600,12 +599,6 @@ margin-right: 5px; } - .experience-name { - display: flex; - align-items: center; - line-height: 1; - } - .controls { margin-left: auto; } diff --git a/styles/less/sheets/actors/companion/details.less b/styles/less/sheets/actors/companion/details.less index 2e43cac4..cbdc25e6 100644 --- a/styles/less/sheets/actors/companion/details.less +++ b/styles/less/sheets/actors/companion/details.less @@ -57,9 +57,6 @@ .experience-name { width: 180px; - display: flex; - align-items: center; - line-height: 1; text-align: start; font-size: var(--font-size-14); color: light-dark(@dark, @beige); @@ -69,7 +66,6 @@ .experience-value { height: 25px; width: 35px; - min-width: 35px; font-size: var(--font-size-14); color: light-dark(@dark, @beige); align-content: center; diff --git a/styles/less/sheets/items/beastform.less b/styles/less/sheets/items/beastform.less index 100b024a..162c4925 100644 --- a/styles/less/sheets/items/beastform.less +++ b/styles/less/sheets/items/beastform.less @@ -5,8 +5,5 @@ flex-direction: column; margin-top: 10px; } - .hint { - font-style: italic; - } } } diff --git a/styles/less/ui/chat/chat.less b/styles/less/ui/chat/chat.less index 6f0e5e85..828e2774 100644 --- a/styles/less/ui/chat/chat.less +++ b/styles/less/ui/chat/chat.less @@ -152,7 +152,6 @@ } } -.vtt.stream.system-daggerheart .chat-sidebar, .daggerheart, #chat-notifications { .chat-message { diff --git a/styles/less/ui/chat/downtime.less b/styles/less/ui/chat/downtime.less index a99bde33..5496a2a3 100644 --- a/styles/less/ui/chat/downtime.less +++ b/styles/less/ui/chat/downtime.less @@ -99,35 +99,12 @@ } } - .action-use-button-parent { - width: 100%; - - .action-use-target { - display:flex; - align-items: center; - justify-content: space-between; - gap: 4px; - width: 100%; - padding: 4px 8px 10px 40px; - font-size: var(--font-size-12); - - label { - font-weight: bold; - } - - select { - flex: 1; - } - } - } - .action-use-button { width: -webkit-fill-available; margin: 0 8px; font-weight: 600; height: 40px; } - } } } diff --git a/styles/less/ui/ownership-selection/ownership-selection.less b/styles/less/ui/ownership-selection/ownership-selection.less index ae7b5e2d..76ae0930 100644 --- a/styles/less/ui/ownership-selection/ownership-selection.less +++ b/styles/less/ui/ownership-selection/ownership-selection.less @@ -36,10 +36,6 @@ } } - .hint { - text-align: center; - } - footer { margin-top: 10px; button { diff --git a/styles/less/ui/settings/settings.less b/styles/less/ui/settings/settings.less index 34f17d53..49c9fc7c 100644 --- a/styles/less/ui/settings/settings.less +++ b/styles/less/ui/settings/settings.less @@ -16,12 +16,6 @@ } } - &.three-columns { - display: grid; - grid-template-columns: 1fr 1fr 1fr; - gap: 2px; - } - &.six-columns { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr; diff --git a/styles/less/utils/fonts.less b/styles/less/utils/fonts.less index 5c1e597a..7d84366a 100755 --- a/styles/less/utils/fonts.less +++ b/styles/less/utils/fonts.less @@ -2,14 +2,14 @@ @import './mixin.less'; :root { - --dh-font-title: 'Cinzel Decorative'; - --dh-font-subtitle: 'Cinzel'; - --dh-font-body: 'Montserrat'; + --font-title: 'Cinzel Decorative'; + --font-subtitle: 'Cinzel'; + --font-body: 'Montserrat'; } -@font-title: ~"var(--dh-font-title, 'Cinzel Decorative'), serif"; -@font-subtitle: ~"var(--dh-font-subtitle, 'Cinzel'), serif"; -@font-body: ~"var(--dh-font-body, 'Montserrat'), sans-serif"; +@font-title: ~"var(--font-title, 'Cinzel Decorative'), serif"; +@font-subtitle: ~"var(--font-subtitle, 'Cinzel'), serif"; +@font-body: ~"var(--font-body, 'Montserrat'), sans-serif"; .dh-style { .dh-typography(); diff --git a/styles/less/ux/index.less b/styles/less/ux/index.less index 0bd1b71e..dd0492da 100644 --- a/styles/less/ux/index.less +++ b/styles/less/ux/index.less @@ -1,6 +1,4 @@ @import './tooltip/tooltip.less'; @import './tooltip/battlepoints.less'; @import './tooltip/bordered-tooltip.less'; -@import './tooltip/domain-cards.less'; - @import './autocomplete/autocomplete.less'; diff --git a/styles/less/ux/tooltip/battlepoints.less b/styles/less/ux/tooltip/battlepoints.less index 9fe43a75..61c7083d 100644 --- a/styles/less/ux/tooltip/battlepoints.less +++ b/styles/less/ux/tooltip/battlepoints.less @@ -3,12 +3,7 @@ display: flex; flex-direction: column; gap: 8px; - - .battlepoint-categories-inner-container { - display: flex; - flex-direction: column; - gap: 8px; - } + margin-bottom: 16px; .battlepoint-grouping-container { display: flex; diff --git a/styles/less/ux/tooltip/bordered-tooltip.less b/styles/less/ux/tooltip/bordered-tooltip.less index 78622377..a4779d71 100644 --- a/styles/less/ux/tooltip/bordered-tooltip.less +++ b/styles/less/ux/tooltip/bordered-tooltip.less @@ -1,5 +1,4 @@ -#tooltip.bordered-tooltip, -.locked-tooltip.bordered-tooltip { +#tooltip.bordered-tooltip { border: 1px solid @golden; background-image: url('../assets/parchments/dh-parchment-dark.png'); @@ -15,7 +14,6 @@ .tooltip-header { display: flex; flex-direction: column; - align-items: center; text-align: start; padding: 5px; gap: 0px; diff --git a/styles/less/ux/tooltip/domain-cards.less b/styles/less/ux/tooltip/domain-cards.less deleted file mode 100644 index 3ef1d83a..00000000 --- a/styles/less/ux/tooltip/domain-cards.less +++ /dev/null @@ -1,18 +0,0 @@ -@import '../../utils/colors.less'; -@import '../../utils/fonts.less'; - -.theme-light .daggerheart.dh-style.tooltip { - &.domain-card { - .item-icons-list .item-icon img { - filter: @bright-beige-filter; - } - } -} - -.daggerheart.dh-style.tooltip { - &.domain-card { - .item-icons-list .item-icon img { - filter: @golden-filter !important; - } - } -} diff --git a/styles/less/ux/tooltip/tooltip.less b/styles/less/ux/tooltip/tooltip.less index bfe0c01f..4579a3d8 100644 --- a/styles/less/ux/tooltip/tooltip.less +++ b/styles/less/ux/tooltip/tooltip.less @@ -1,252 +1,7 @@ -@import '../../utils/colors.less'; -@import '../../utils/fonts.less'; - -#tooltip:has(div.daggerheart.dh-style.tooltip.card-style), -aside[role='tooltip']:has(div.daggerheart.dh-style.tooltip.card-style) { - padding: 0; - border: none; - border-radius: 10px; - height: max-content; - max-height: 650px; - width: 18rem; - background-image: url('../assets/parchments/dh-parchment-dark.png'); - outline: 1px solid light-dark(@dark-80, @beige-80); - box-shadow: 0 0 25px rgba(0, 0, 0, 0.80); - - .tooltip-title { - font-size: var(--font-size-20); - color: light-dark(@dark-blue, @golden); - font-weight: 700; - margin-bottom: 5px; - } - - .tooltip-subtitle { - margin: 0; - } - - .tooltip-image { - width: 100%; - height: 160px; - object-fit: cover; - mask-image: linear-gradient(180deg, black 88%, transparent 100%); - } - - .tooltip-description { - font-style: inherit; - text-align: inherit; - width: 100%; - padding: 5px 10px; - position: relative; - margin-top: 5px; - - &::before { - content: ''; - background: @golden; - mask-image: linear-gradient(270deg, transparent 0%, black 50%, transparent 100%); - height: 2px; - width: calc(100% - 10px); - } - - &::before { - position: absolute; - top: -5px; - } - } - - .tooltip-tags { - display: flex; - flex-direction: column; - gap: 10px; - width: 100%; - padding: 5px 10px; - position: relative; - padding-top: 10px; - max-height: 150px; - overflow-y: auto; - position: relative; - - scrollbar-width: thin; - scrollbar-color: light-dark(@dark-blue, @golden) transparent; - - &::before { - content: ''; - background: @golden; - mask-image: linear-gradient(270deg, transparent 0%, black 50%, transparent 100%); - height: 2px; - width: calc(100% - 10px); - } - - &::before { - position: absolute; - top: 0px; - } - - .tooltip-tag { - display: flex; - gap: 10px; - flex-direction: column; - - .tooltip-tag-label-container { - display: flex; - align-items: center; - gap: 5px; - - img { - width: 40px; - height: 40px; - border-radius: 3px; - } - } - } - } - - .tags { - display: flex; - gap: 5px 10px; - padding-bottom: 16px; - flex-wrap: wrap; - justify-content: center; - - &.advantages { - width: 100%; - padding: 5px 10px; - padding-bottom: 16px; - position: relative; - margin-top: 5px; - - &::before { - content: ''; - background: @golden; - mask-image: linear-gradient(270deg, transparent 0%, black 50%, transparent 100%); - height: 2px; - width: calc(100% - 10px); - } - - &::before { - position: absolute; - top: -5px; - } - - .tag { - background: @green-10; - color: @green; - border-color: @green; - } - } - - .tag { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - padding: 3px 5px; - font-size: var(--font-size-12); - font: @font-body; - - background: light-dark(@dark-15, @beige-15); - border: 1px solid light-dark(@dark, @beige); - border-radius: 3px; - } - - .label { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - font-size: var(--font-size-12); - } - } - - .item-icons-list { - position: absolute; - display: flex; - flex-direction: column; - gap: 5px; - align-items: end; - justify-content: center; - top: 25px; - right: 10px; - z-index: 1; - - .item-icon { - display: flex; - align-items: center; - justify-content: end; - text-align: center; - padding-right: 8px; - width: 50px; - height: 50px; - font-size: 1.2rem; - background: light-dark(@dark-blue-60, @dark-golden-80); - backdrop-filter: blur(8px); - border: 4px double light-dark(@beige, @golden); - color: light-dark(@beige, @golden); - border-radius: 999px; - transition: all 0.3s ease; - - .recall-label { - font-size: var(--font-size-14); - opacity: 0; - margin-right: 0.3rem; - transition: all 0.3s ease; - } - - i { - font-size: 0.8rem; - } - - img { - height: 24px; - width: 24px; - } - - &:hover { - max-width: 300px; - padding: 0 10px; - border-radius: 60px; - - .recall-label { - opacity: 1; - } - } - } - } - - .tooltip-hint { - border-radius: 3px; - padding: 3px; - background: light-dark(@dark-blue-60, @rustic-brown-80); - color: light-dark(@dark-blue, @golden); - font-size: 12px; - margin-bottom: 10px; - } -} - -aside[role='tooltip'].locked-tooltip:has(div.daggerheart.dh-style.tooltip.card-style) { - box-shadow: 0 0 25px @golden-90; - outline: 1px solid light-dark(@dark-blue, @golden); -} - -.theme-light #tooltip:has(div.daggerheart.dh-style.tooltip.card-style), -.theme-light aside[role='tooltip']:has(div.daggerheart.dh-style.tooltip.card-style) { - background-image: url('../assets/parchments/dh-parchment-light.png'); -} - -.theme-light aside[role='tooltip'].locked-tooltip:has(div.daggerheart.dh-style.tooltip) { - box-shadow: 0 0 25px @dark-blue-90; - outline: 1px solid light-dark(@dark-blue, @golden); - -} - #tooltip, -.locked-tooltip, -.daggerheart.dh-style.tooltip { +.locked-tooltip { &.wide { max-width: 480px; - - .daggerheart.dh-style.tooltip { - align-items: start; - } } .daggerheart.dh-style.tooltip { @@ -289,6 +44,11 @@ aside[role='tooltip'].locked-tooltip:has(div.daggerheart.dh-style.tooltip.card-s font-style: italic; } + .tooltip-sub-title { + margin: 0; + color: light-dark(@dark-blue, @beige); + } + .tooltip-information-section { width: 100%; display: grid; @@ -340,24 +100,48 @@ aside[role='tooltip'].locked-tooltip:has(div.daggerheart.dh-style.tooltip.card-s } } + .tooltip-tags { + width: 100%; + display: flex; + flex-direction: column; + gap: 4px; + + .tooltip-tag { + width: 100%; + display: grid; + grid-template-columns: 80px 1fr; + align-items: start; + gap: 8px; + padding: 4px; + border: 1px solid light-dark(@dark-blue, @golden); + border-radius: 6px; + + .tooltip-tag-label-container { + display: flex; + align-items: center; + flex-direction: column; + gap: 2px; + + .tooltip-tag-image { + width: 40px; + height: 40px; + } + } + + .tooltip-tag-label { + font-weight: bold; + text-align: center; + } + + .tooltip-tag-description { + display: flex; + flex-wrap: wrap; + } + } + } + .spaced { margin-bottom: 4px; } } - - .party-list { - display: flex; - flex-direction: column; - button { - width: 100%; - align-items: center; - justify-content: start; - img { - border: none; - width: 1rem; - height: 1rem; - object-fit: contain; - } - } - } } diff --git a/system.json b/system.json index 5570bdbf..7e3c6b07 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "id": "daggerheart", "title": "Daggerheart", "description": "An unofficial implementation of the Daggerheart system", - "version": "1.4.6", + "version": "1.3.1", "compatibility": { "minimum": "13.346", "verified": "13.351", @@ -19,10 +19,7 @@ "discord": "cptn_cosmo" }, { - "name": "Ikraik", - "url": "https://github.com/ikraik", - "email": "ikraik0.0gaming@gmail.com", - "discord": "ikraik" + "name": "Ikraik" }, { "name": "IrkTheImp" @@ -54,12 +51,6 @@ { "name": "chrisryan10", "discord": "lazjen" - }, - { - "name": "nsalyzyn", - "url": "https://github.com/nsalyzyn", - "email": "nsalyzyn@gmail.com", - "discord": "nsalyzyn" } ], "esmodules": ["build/daggerheart.js"], @@ -173,15 +164,6 @@ "private": false, "flags": {} }, - { - "name": "rolltables", - "label": "Rolltables", - "system": "daggerheart", - "path": "packs/rolltables.db", - "type": "RollTable", - "private": false, - "flags": {} - }, { "name": "beastforms", "label": "Beastforms", @@ -197,7 +179,7 @@ "name": "Daggerheart SRD", "sorting": "m", "color": "#08718c", - "packs": ["adversaries", "environments", "journals", "rolltables"], + "packs": ["adversaries", "environments", "journals"], "folders": [ { "name": "Character Options", diff --git a/templates/dialogs/dice-roll/header.hbs b/templates/dialogs/dice-roll/header.hbs index 21967655..b2ca18cd 100644 --- a/templates/dialogs/dice-roll/header.hbs +++ b/templates/dialogs/dice-roll/header.hbs @@ -2,7 +2,7 @@

{{#if reactionOverride}} - {{localize "DAGGERHEART.CONFIG.FeatureForm.reaction"}} + {{localize "DAGGERHEART.CONFIG.ActionType.reaction"}} {{else}} {{ifThen rollConfig.headerTitle rollConfig.headerTitle rollConfig.title}} {{/if}} diff --git a/templates/dialogs/item-transfer.hbs b/templates/dialogs/item-transfer.hbs index 0e7df3dc..2b9fa19c 100644 --- a/templates/dialogs/item-transfer.hbs +++ b/templates/dialogs/item-transfer.hbs @@ -1,26 +1,9 @@ -
-
- -
- {{#if itemImage}} - - {{else}} - - {{/if}} - -
- +
+
+ +
-
- -
- -
-
-
-
- +
+ +
\ No newline at end of file diff --git a/templates/dialogs/ownershipSelection.hbs b/templates/dialogs/ownershipSelection.hbs index ccd90cdf..b16e5d75 100644 --- a/templates/dialogs/ownershipSelection.hbs +++ b/templates/dialogs/ownershipSelection.hbs @@ -1,19 +1,23 @@
- {{#if showOwnership}} -
    - {{#each ownership as |player id|}} -
  • - - {{player.name}} - -
  • - {{/each}} -
- {{else}} - {{localize "DAGGERHEART.APPLICATIONS.OwnershipSelection.noPlayers"}} - {{/if}} +
+
+ + +
+
+
    + {{#each ownership as |player id|}} +
  • + + {{player.name}} + +
  • + {{/each}} +
diff --git a/templates/hud/tokenHUD.hbs b/templates/hud/tokenHUD.hbs index f079e5d9..09259d4a 100644 --- a/templates/hud/tokenHUD.hbs +++ b/templates/hud/tokenHUD.hbs @@ -46,12 +46,8 @@
{{#each systemStatusEffects as |status|}} -
- +
+ {{#if status.disabled}} / {{/if}} @@ -61,12 +57,8 @@ {{#if genericStatusEffects}} {{#each genericStatusEffects as |status|}} -
- +
+ {{#if status.locked}}{{/if}}
{{/each}} diff --git a/templates/settings/homebrew-settings/change-currency-icon.hbs b/templates/settings/homebrew-settings/change-currency-icon.hbs deleted file mode 100644 index 3f5073e0..00000000 --- a/templates/settings/homebrew-settings/change-currency-icon.hbs +++ /dev/null @@ -1,10 +0,0 @@ -
-
- -
- {{localize "DAGGERHEART.SETTINGS.Homebrew.currency.iconName"}} ({{localize "DAGGERHEART.SETTINGS.Homebrew.currency.iconNameHint"}}) -
- - -
-
diff --git a/templates/settings/homebrew-settings/domains.hbs b/templates/settings/homebrew-settings/domains.hbs index b65422c5..0946f211 100644 --- a/templates/settings/homebrew-settings/domains.hbs +++ b/templates/settings/homebrew-settings/domains.hbs @@ -1,5 +1,5 @@
diff --git a/templates/settings/homebrew-settings/downtime.hbs b/templates/settings/homebrew-settings/downtime.hbs index 8612f3d5..890afddc 100644 --- a/templates/settings/homebrew-settings/downtime.hbs +++ b/templates/settings/homebrew-settings/downtime.hbs @@ -1,5 +1,5 @@
diff --git a/templates/settings/homebrew-settings/itemFeatures.hbs b/templates/settings/homebrew-settings/itemFeatures.hbs index 22c23af6..1f8595de 100644 --- a/templates/settings/homebrew-settings/itemFeatures.hbs +++ b/templates/settings/homebrew-settings/itemFeatures.hbs @@ -1,5 +1,5 @@
diff --git a/templates/settings/homebrew-settings/settings.hbs b/templates/settings/homebrew-settings/settings.hbs index cdcbd461..35e2a786 100644 --- a/templates/settings/homebrew-settings/settings.hbs +++ b/templates/settings/homebrew-settings/settings.hbs @@ -1,5 +1,5 @@
@@ -25,20 +25,6 @@ {{/each}} -
- - {{localize "Token Sizes"}} - - - - {{formGroup settingFields.schema.fields.tokenSizes.fields.tiny value=settingFields._source.tokenSizes.tiny localize=true}} - {{formGroup settingFields.schema.fields.tokenSizes.fields.small value=settingFields._source.tokenSizes.small localize=true}} - {{formGroup settingFields.schema.fields.tokenSizes.fields.medium value=settingFields._source.tokenSizes.medium localize=true}} - {{formGroup settingFields.schema.fields.tokenSizes.fields.large value=settingFields._source.tokenSizes.large localize=true}} - {{formGroup settingFields.schema.fields.tokenSizes.fields.huge value=settingFields._source.tokenSizes.huge localize=true}} - {{formGroup settingFields.schema.fields.tokenSizes.fields.gargantuan value=settingFields._source.tokenSizes.gargantuan localize=true}} -
-
{{localize "DAGGERHEART.SETTINGS.Homebrew.currency.title"}} @@ -47,22 +33,18 @@ {{formGroup settingFields.schema.fields.currency.fields.title value=settingFields._source.currency.title localize=true}}
- {{formGroup settingFields.schema.fields.currency.fields.coins.fields.label value=settingFields._source.currency.coins.label localize=true}}
- {{formGroup settingFields.schema.fields.currency.fields.handfuls.fields.label value=settingFields._source.currency.handfuls.label localize=true}}
- {{formGroup settingFields.schema.fields.currency.fields.bags.fields.label value=settingFields._source.currency.bags.label localize=true}}
- {{formGroup settingFields.schema.fields.currency.fields.chests.fields.label value=settingFields._source.currency.chests.label localize=true}}
diff --git a/templates/settings/homebrew-settings/types.hbs b/templates/settings/homebrew-settings/types.hbs index bdb92ba0..f9d3bba3 100644 --- a/templates/settings/homebrew-settings/types.hbs +++ b/templates/settings/homebrew-settings/types.hbs @@ -1,5 +1,5 @@
diff --git a/templates/settings/variant-rules.hbs b/templates/settings/variant-rules.hbs index df7accb3..5cc5c90c 100644 --- a/templates/settings/variant-rules.hbs +++ b/templates/settings/variant-rules.hbs @@ -22,13 +22,6 @@
-
- -
- {{formGroup settingFields.schema.fields.massiveDamage.fields.enabled value=settingFields._source.massiveDamage.enabled localize=true}} -
-
-
- {{formGroup systemFields.size value=document._source.system.size label=(localize "DAGGERHEART.GENERAL.tokenSize") localize=true}} {{formField systemFields.description value=document._source.system.description label=(localize "DAGGERHEART.ACTORS.Adversary.FIELDS.description.label")}} {{formField systemFields.motivesAndTactics value=document._source.system.motivesAndTactics label=(localize "DAGGERHEART.ACTORS.Adversary.FIELDS.motivesAndTactics.label")}} @@ -22,12 +21,12 @@
{{localize "DAGGERHEART.GENERAL.HitPoints.plural"}} {{formGroup systemFields.resources.fields.hitPoints.fields.value value=document._source.system.resources.hitPoints.value label=(localize "DAGGERHEART.ACTORS.Adversary.FIELDS.resources.hitPoints.value.label")}} - {{formGroup systemFields.resources.fields.hitPoints.fields.max value=document._source.system.resources.hitPoints.max label=(localize "DAGGERHEART.ACTORS.Adversary.FIELDS.resources.hitPoints.max.label")}} + {{formGroup systemFields.resources.fields.hitPoints.fields.max value=document._source.system.resources.hitPoints.max}}
{{localize "DAGGERHEART.GENERAL.stress"}} {{formGroup systemFields.resources.fields.stress.fields.value value=document._source.system.resources.stress.value label=(localize "DAGGERHEART.ACTORS.Adversary.FIELDS.resources.stress.value.label")}} - {{formGroup systemFields.resources.fields.stress.fields.max value=document._source.system.resources.stress.max label=(localize "DAGGERHEART.ACTORS.Adversary.FIELDS.resources.stress.max.label")}} + {{formGroup systemFields.resources.fields.stress.fields.max value=document._source.system.resources.stress.max}}
diff --git a/templates/sheets-settings/adversary-settings/features.hbs b/templates/sheets-settings/adversary-settings/features.hbs index 2f2f5f47..ec6a9e54 100644 --- a/templates/sheets-settings/adversary-settings/features.hbs +++ b/templates/sheets-settings/adversary-settings/features.hbs @@ -9,14 +9,14 @@
{{localize tabs.features.label}}