diff --git a/.github/ISSUE_TEMPLATE/feature_report.md b/.github/ISSUE_TEMPLATE/feature_request.md similarity index 76% rename from .github/ISSUE_TEMPLATE/feature_report.md rename to .github/ISSUE_TEMPLATE/feature_request.md index df00ba37..35710e2b 100644 --- a/.github/ISSUE_TEMPLATE/feature_report.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,6 +1,6 @@ --- -name: Feature report -about: Create a feature report for suggestions on improving the system +name: Feature request +about: Create a feature request for suggestions on improving the system title: "[Feature] " labels: enhancement, discussion, maybe type: feature diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b6f4097e..b9099005 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,6 +17,10 @@ We welcome contributions of all kinds: Please be respectful and collaborative β€” we’re all here to build something great together. +### Community Translations + +Please note that we are not accepting community translations in the main project. Instead, community translations should be published as a module. + --- ## 🧭 General Guidelines @@ -40,12 +44,14 @@ We encourage contributors to leave comments or open Discussions when proposing s ## 🧾 Issue & PR Best Practices **For Issues:** + - Use clear, descriptive titles - Provide a concise explanation of the problem or idea - Include reproduction steps or example scenarios if it's a bug - Add screenshots or logs if helpful **For Pull Requests:** + - Use a clear title summarizing the change - Provide a brief description of what your code does and why - Link to any related Issues @@ -67,6 +73,6 @@ Discussions are currently happening on GitHub β€” in Issues, PRs, and [GitHub Di ## πŸ€— Thank You! -Whether you're fixing a typo or designing entire mechanics β€” every contribution matters. Thank you for helping bring *Daggerheart* to life in FoundryVTT through **Foundryborne**! +Whether you're fixing a typo or designing entire mechanics β€” every contribution matters. Thank you for helping bring _Daggerheart_ to life in FoundryVTT through **Foundryborne**! πŸΈπŸ› οΈ diff --git a/daggerheart.mjs b/daggerheart.mjs index c42a301b..f5f5e303 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -164,6 +164,9 @@ Hooks.on('ready', async () => { if (game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.appearance).displayFear !== 'hide') ui.resources.render({ force: true }); + if (!(ui.compendiumBrowser instanceof applications.ui.ItemBrowser)) + ui.compendiumBrowser = new applications.ui.ItemBrowser(); + registerCountdownHooks(); socketRegistration.registerSocketHooks(); registerRollDiceHooks(); @@ -307,3 +310,6 @@ Hooks.on('moveToken', async (movedToken, data) => { await effect.value.update({ disabled: effect.disabled }); } }); + +Hooks.on('renderCompendiumDirectory', (app, html) => applications.ui.ItemBrowser.injectSidebarButton(html)); +Hooks.on('renderDocumentDirectory', (app, html) => applications.ui.ItemBrowser.injectSidebarButton(html)); diff --git a/lang/en.json b/lang/en.json index 22870c5e..8de962bd 100755 --- a/lang/en.json +++ b/lang/en.json @@ -96,6 +96,7 @@ "attackName": "Attack Name", "includeBase": { "label": "Include Item Damage" }, "multiplier": "Multiplier", + "saveHint": "Set a default Trait to enable Reaction Roll. It can be changed later in Reaction Roll Dialog.", "resultBased": { "label": "Formula based on Hope/Fear result." }, @@ -169,7 +170,9 @@ "hint": "Add single words or short text as reminders and hints of what a character has advantage on." }, "age": "Age", + "backgroundQuestions": "Backgrounds", "companionFeatures": "Companion Features", + "connections": "Connections", "contextMenu": { "consume": "Consume Item", "equip": "Equip", @@ -266,7 +269,8 @@ "experience": "Experience", "traits": "Traits", "domainCards": "Domain Cards", - "equipment": "Equipment" + "equipment": "Equipment", + "story": "Story" }, "ancestryNamePlaceholder": "Your ancestry's name", "buttonTitle": "Character Setup", @@ -287,6 +291,7 @@ "selectSubclass": "Select Subclass", "startingItems": "Starting Items", "story": "Story", + "storyExplanation": "Select which background and connection prompts you want to copy into your character's background.", "suggestedArmor": "Suggested Armor", "suggestedPrimaryWeapon": "Suggested Primary Weapon", "suggestedSecondaryWeapon": "Suggested Secondary Weapon", @@ -310,7 +315,8 @@ "toLoadout": "Send to Loadout", "toVault": "Send to Vault", "unequip": "Unequip", - "useItem": "Use Item" + "useItem": "Use Item", + "cancelBeastform": "Cancel Beastform" }, "Countdown": { "addCountdown": "Add Countdown", @@ -1908,8 +1914,10 @@ "tier4": "tier 4", "domains": "Domains", "downtime": "Downtime", + "roll": "Roll", "rules": "Rules", - "types": "Types" + "types": "Types", + "questions": "Questions" }, "Tiers": { "singular": "Tier", @@ -1926,6 +1934,7 @@ "amount": "Amount", "any": "Any", "armor": "Armor", + "armors": "Armors", "armorScore": "Armor Score", "activeEffects": "Active Effects", "armorSlots": "Armor Slots", @@ -1960,6 +1969,7 @@ "fear": "Fear", "features": "Features", "formula": "Formula", + "gm": "GM", "healing": "Healing", "healingRoll": "Healing Roll", "hit": { @@ -1978,6 +1988,8 @@ "inactiveEffects": "Inactive Effects", "inventory": "Inventory", "itemResource": "Item Resource", + "itemQuantity": "Item Quantity", + "items": "Items", "label": "Label", "level": "Level", "levelShort": "Lv", @@ -1989,11 +2001,16 @@ "plural": "Miss" }, "maxWithThing": "Max {thing}", + "missingDragDropThing": "Drop {thing} here", "multiclass": "Multiclass", "newCategory": "New Category", "none": "None", "noTarget": "No current target", "partner": "Partner", + "player": { + "single": "Player", + "plurial": "Players" + }, "proficiency": "Proficiency", "quantity": "Quantity", "range": "Range", @@ -2010,6 +2027,7 @@ "scalable": "Scalable", "situationalBonus": "Situational Bonus", "stress": "Stress", + "subclasses": "Subclasses", "success": "Success", "take": "Take", "Target": { @@ -2018,6 +2036,7 @@ }, "title": "Title", "total": "Total", + "traitModifier": "Trait Modifier", "true": "True", "type": "Type", "unarmed": "Unarmed", @@ -2027,6 +2046,7 @@ "used": "Used", "uses": "Uses", "value": "Value", + "weapons": "Weapons", "withThing": "With {thing}" }, "ITEMS": { @@ -2110,7 +2130,8 @@ } }, "Consumable": { - "consumeOnUse": "Consume On Use" + "consumeOnUse": "Consume On Use", + "destroyOnEmpty": "Destroy On Empty" }, "DomainCard": { "type": "Type", @@ -2131,20 +2152,43 @@ "SETTINGS": { "Appearance": { "FIELDS": { - "displayFear": { "label": "Fear Display" }, - "dualityColorScheme": { "label": "Chat Style" }, - "hideAttribution": { "label": "Hide Attribution" }, + "displayFear": { + "label": "Display Fear" + }, + "showGenericStatusEffects": { + "label": "Show Foundry Status Effects" + }, + "hideAttribution": { + "label": "Hide Attribution" + }, "expandedTitle": "Auto-expand Descriptions", - "extendCharacterDescriptions": { "label": "Characters" }, - "extendAdversaryDescriptions": { "label": "Adversaries" }, - "extendEnvironmentDescriptions": { "label": "Environments" }, - "extendItemDescriptions": { "label": "Items" }, - "expandRollMessage": "Auto-expand Message Sections", - "expandRollMessageDesc": { "label": "Description" }, - "expandRollMessageRoll": { "label": "Formula" }, - "expandRollMessageDamage": { "label": "Damage/Healing" }, - "expandRollMessageTarget": { "label": "Target" }, - "showGenericStatusEffects": { "label": "Show Foundry Status Effects" } + "extendCharacterDescriptions": { + "label": "Characters" + }, + "extendAdversaryDescriptions": { + "label": "Adversaries" + }, + "extendEnvironmentDescriptions": { + "label": "Environments" + }, + "extendItemDescriptions": { + "label": "Items" + }, + "expandRollMessage": { + "title": "Auto-expand Message Sections", + "desc": { + "label": "Description" + }, + "roll": { + "label": "Formula" + }, + "damage": { + "label": "Damage/Healing" + }, + "target": { + "label": "Target" + } + } }, "fearDisplay": { "token": "Tokens", @@ -2199,10 +2243,35 @@ "playerCanEditSheet": { "label": "Players Can Manually Edit Character Settings", "hint": "Players are allowed to access the manual Character Settings and change their statistics beyond the rules." + }, + "roll": { + "roll": { + "label": "Roll", + "hint": "Auto behavior for rolls like Attack, Spellcast, etc." + }, + "damage": { + "label": "Damage/Healing Roll", + "hint": "Auto behavior for Damage & Healing rolls after the Attack/Spellcast." + }, + "save": { + "label": "Reaction Roll", + "hint": "Auto behavior if a Reaction Roll is needed. Targets must be selected before the action is made" + }, + "damageApply": { + "label": "Apply Damage/Healing", + "hint": "Automatically apply damages & healings. Targets must be selected before the action is made and Reaction Roll Automation must be different than Never. Bypass users permissions." + }, + "effect": { + "label": "Apply Effects", + "hint": "Automatically apply effects. Targets must be selected before the action is made and Reaction Roll Automation must be different than Never. Bypass users permissions." + } } }, "defeated": { "title": "Defeated Handling" + }, + "roll": { + "title": "Actions" } }, "Homebrew": { @@ -2264,10 +2333,8 @@ "hint": "System ruler setup for displaying ranges in Daggerheart" }, "appearance": { - "title": "Appearance Settings", "label": "Appearance Settings", "hint": "Modify the look of various parts of the system", - "name": "Appearance Settings", "duality": "Duality Rolls", "diceSoNice": { "title": "Dice So Nice", @@ -2388,6 +2455,7 @@ "evasionMax": "Evasion (Max)", "subtype": "Subtype", "folders": { + "characters": "Characters", "adversaries": "Adversaries", "ancestries": "Ancestries", "equipment": "Equipment", @@ -2398,7 +2466,11 @@ "environments": "Environments", "beastforms": "Beastforms", "features": "Features", - "items": "Items" + "items": "Items", + "weapons": "Weapons", + "armors": "Armors", + "consumables": "Consumables", + "loots": "Loots" } }, "Notifications": { @@ -2406,6 +2478,7 @@ "beastformInapplicable": "A beastform can only be applied to a Character.", "beastformAlreadyApplied": "The character already has a beastform applied!", "noTargetsSelected": "No targets are selected.", + "noTargetsSelectedOrPerm": "No targets are selected or with the update permission.", "attackTargetDoesNotExist": "The target token no longer exists", "insufficentAdvancements": "You don't have enough advancements left.", "noAssignedPlayerCharacter": "You have no assigned character.", @@ -2465,7 +2538,8 @@ "multiclassAlreadyPresent": "You already have a class and multiclass", "subclassesAlreadyPresent": "You already have a class and multiclass subclass", "noDiceSystem": "Your selected dice {system} does not have a {faces} dice", - "gmMenuRefresh": "You refreshed all actions and resources {types}" + "gmMenuRefresh": "You refreshed all actions and resources {types}", + "subclassAlreadyLinked": "{name} is already a subclass in the class {class}. Remove it from there if you want it to be a subclass to this class." }, "Sidebar": { "daggerheartMenu": { diff --git a/module/applications/characterCreation/characterCreation.mjs b/module/applications/characterCreation/characterCreation.mjs index f9f832e8..490294cd 100644 --- a/module/applications/characterCreation/characterCreation.mjs +++ b/module/applications/characterCreation/characterCreation.mjs @@ -1,6 +1,5 @@ import { abilities } from '../../config/actorConfig.mjs'; import { burden } from '../../config/generalConfig.mjs'; -import { ItemBrowser } from '../ui/itemBrowser.mjs'; import { createEmbeddedItemsWithEffects, createEmbeddedItemWithEffects } from '../../helpers/utils.mjs'; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; @@ -46,8 +45,6 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl }; this._dragDrop = this._createDragDropHandlers(); - - this.itemBrowser = null; } get title() { @@ -425,26 +422,30 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl equipment = ['armor', 'weapon']; const presets = { - compendium: 'daggerheart', - folder: equipment.includes(type) ? 'equipments' : type, + folder: equipment.includes(type) ? `equipments.folders.${type}s` : type, render: { noFolder: true } }; - if (type == 'domains') + if (type === 'domains') presets.filter = { 'level.max': { key: 'level.max', value: 1 }, 'system.domain': { key: 'system.domain', value: this.setup.class?.system.domains ?? null } }; + if (type === 'subclasses') + presets.filter = { + 'system.linkedClass.uuid': { key: 'system.linkedClass.uuid', value: this.setup.class?.uuid } + }; + if (equipment.includes(type)) presets.filter = { 'system.tier': { key: 'system.tier', value: 1 }, 'type': { key: 'type', value: type } }; - return (this.itemBrowser = await new ItemBrowser({ presets }).render({ force: true })); + ui.compendiumBrowser.open(presets); } static async viewItem(_, target) { @@ -562,7 +563,7 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl { overwrite: true } ); - if (this.itemBrowser) this.itemBrowser.close(); + if (ui.compendiumBrowser) ui.compendiumBrowser.close(); this.close(); } diff --git a/module/applications/dialogs/d20RollDialog.mjs b/module/applications/dialogs/d20RollDialog.mjs index d445f24c..6c227152 100644 --- a/module/applications/dialogs/d20RollDialog.mjs +++ b/module/applications/dialogs/d20RollDialog.mjs @@ -1,3 +1,5 @@ +import { abilities } from '../../config/actorConfig.mjs'; + const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api; export default class D20RollDialog extends HandlebarsApplicationMixin(ApplicationV2) { @@ -7,7 +9,7 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio this.roll = roll; this.config = config; this.config.experiences = []; - this.reactionOverride = config.roll?.type === 'reaction'; + this.reactionOverride = config.actionType === 'reaction'; if (config.source?.action) { this.item = config.data.parent.items.get(config.source.item) ?? config.data.parent; @@ -20,7 +22,7 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio static DEFAULT_OPTIONS = { tag: 'form', - id: 'roll-selection', + // id: 'roll-selection', classes: ['daggerheart', 'dialog', 'dh-style', 'views', 'roll-selection'], position: { width: 'auto' @@ -42,7 +44,7 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio }; get title() { - return this.config.title; + return `${this.config.title}${this.actor ? `: ${this.actor.name}` : ''}`; } get actor() { @@ -81,7 +83,7 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio ); context.costs = updatedCosts.map(x => ({ ...x, - label: x.keyIsID + label: x.itemId ? this.action.parent.parent.name : game.i18n.localize(CONFIG.DH.GENERAL.abilityCosts[x.key].label) })); @@ -113,15 +115,24 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio context.isLite = this.config.roll?.lite; context.extraFormula = this.config.extraFormula; context.formula = this.roll.constructFormula(this.config); + if (this.actor.system.traits) context.abilities = this.getTraitModifiers(); - context.showReaction = !context.rollConfig.type && context.rollType === 'DualityRoll'; + context.showReaction = !this.config.roll?.type && context.rollType === 'DualityRoll'; context.reactionOverride = this.reactionOverride; } return context; } + getTraitModifiers() { + return Object.values(abilities).map(a => ({ + id: a.id, + label: `${game.i18n.localize(a.label)} (${this.actor.system.traits[a.id]?.value.signedString() ?? 0})` + })); + } + static updateRollConfiguration(event, _, formData) { const { ...rest } = foundry.utils.expandObject(formData.object); + this.config.selectedRollMode = rest.selectedRollMode; if (this.config.costs) { @@ -133,6 +144,12 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio this.roll[key] = value; }); } + if (rest.hasOwnProperty('trait')) { + this.config.roll.trait = rest.trait; + this.config.title = game.i18n.format('DAGGERHEART.UI.Chat.dualityRoll.abilityCheckTitle', { + ability: game.i18n.localize(abilities[this.config.roll.trait]?.label) + }); + } this.config.extraFormula = rest.extraFormula; this.render(); } @@ -151,31 +168,29 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio this.config.experiences.indexOf(button.dataset.key) > -1 ? this.config.experiences.filter(x => x !== button.dataset.key) : [...this.config.experiences, button.dataset.key]; - if (this.config?.data?.parent?.type === 'character' || this.config?.data?.parent?.type === 'companion') { - this.config.costs = - this.config.costs.indexOf(this.config.costs.find(c => c.extKey === button.dataset.key)) > -1 - ? this.config.costs.filter(x => x.extKey !== button.dataset.key) - : [ - ...this.config.costs, - { - extKey: button.dataset.key, - key: 'hope', - value: 1, - name: this.config.data?.experiences?.[button.dataset.key]?.name - } - ]; - } + this.config.costs = + this.config.costs.indexOf(this.config.costs.find(c => c.extKey === button.dataset.key)) > -1 + ? this.config.costs.filter(x => x.extKey !== button.dataset.key) + : [ + ...this.config.costs, + { + extKey: button.dataset.key, + key: this.config?.data?.parent?.isNPC ? 'fear' : 'hope', + value: 1, + name: this.config.data?.experiences?.[button.dataset.key]?.name + } + ]; this.render(); } static toggleReaction() { if (this.config.roll) { this.reactionOverride = !this.reactionOverride; - this.config.roll.type = this.reactionOverride + this.config.actionType = this.reactionOverride ? CONFIG.DH.ITEM.actionTypes.reaction.id - : this.config.roll.type === CONFIG.DH.ITEM.actionTypes.reaction.id + : this.config.actionType === CONFIG.DH.ITEM.actionTypes.reaction.id ? null - : this.config.roll.type; + : this.config.actionType; this.render(); } } diff --git a/module/applications/hud/tokenHUD.mjs b/module/applications/hud/tokenHUD.mjs index 5c29260b..48d5ac89 100644 --- a/module/applications/hud/tokenHUD.mjs +++ b/module/applications/hud/tokenHUD.mjs @@ -1,6 +1,9 @@ export default class DHTokenHUD extends foundry.applications.hud.TokenHUD { static DEFAULT_OPTIONS = { - classes: ['daggerheart'] + classes: ['daggerheart'], + actions: { + combat: DHTokenHUD.#onToggleCombat + } }; /** @override */ @@ -11,8 +14,14 @@ export default class DHTokenHUD extends foundry.applications.hud.TokenHUD { } }; + static #nonCombatTypes = ['environment', 'companion']; + async _prepareContext(options) { const context = await super._prepareContext(options); + + context.canToggleCombat = DHTokenHUD.#nonCombatTypes.includes(this.actor.type) + ? false + : context.canToggleCombat; context.systemStatusEffects = Object.keys(context.statusEffects).reduce((acc, key) => { const effect = context.statusEffects[key]; if (effect.systemEffect) acc[key] = effect; @@ -36,6 +45,20 @@ export default class DHTokenHUD extends foundry.applications.hud.TokenHUD { return context; } + static async #onToggleCombat() { + const tokens = canvas.tokens.controlled + .filter(t => !t.actor || !DHTokenHUD.#nonCombatTypes.includes(t.actor.type)) + .map(t => t.document); + if (!this.object.controlled) tokens.push(this.document); + + try { + if (this.document.inCombat) await TokenDocument.implementation.deleteCombatants(tokens); + else await TokenDocument.implementation.createCombatants(tokens); + } catch (err) { + ui.notifications.warn(err.message); + } + } + _getStatusEffectChoices() { // Include all HUD-enabled status effects const choices = {}; diff --git a/module/applications/levelup/levelup.mjs b/module/applications/levelup/levelup.mjs index 0b3f8970..c3cc6e81 100644 --- a/module/applications/levelup/levelup.mjs +++ b/module/applications/levelup/levelup.mjs @@ -1,6 +1,5 @@ import { abilities, subclassFeatureLabels } from '../../config/actorConfig.mjs'; import { getDeleteKeys, tagifyElement } from '../../helpers/utils.mjs'; -import { ItemBrowser } from '../ui/itemBrowser.mjs'; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; @@ -12,8 +11,6 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2) this._dragDrop = this._createDragDropHandlers(); this.tabGroups.primary = 'advancements'; - - this.itemBrowser = null; } get title() { @@ -540,7 +537,6 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2) const type = target.dataset.compendium ?? target.dataset.type; const presets = { - compendium: 'daggerheart', folder: type, render: { noFolder: true @@ -559,7 +555,7 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2) }; } - return (this.itemBrowser = await new ItemBrowser({ presets }).render({ force: true })); + ui.compendiumBrowser.open(presets); } static async selectPreview(_, button) { @@ -662,7 +658,8 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2) }, {}); await this.actor.levelUp(levelupData); - if (this.itemBrowser) this.itemBrowser.close(); + + if (ui.compendiumBrowser) ui.compendiumBrowser.close(); this.close(); } } diff --git a/module/applications/settings/appearanceSettings.mjs b/module/applications/settings/appearanceSettings.mjs index f0310477..5950f961 100644 --- a/module/applications/settings/appearanceSettings.mjs +++ b/module/applications/settings/appearanceSettings.mjs @@ -3,43 +3,48 @@ import { getDiceSoNicePreset } from '../../config/generalConfig.mjs'; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; +/** + * @import {ApplicationClickAction} from "@client/applications/_types.mjs" + */ + export default class DHAppearanceSettings extends HandlebarsApplicationMixin(ApplicationV2) { - constructor() { - super({}); - - this.settings = new DhAppearance( - game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance).toObject() - ); - } - - get title() { - return game.i18n.localize('DAGGERHEART.SETTINGS.Menu.title'); - } - + /**@inheritdoc */ static DEFAULT_OPTIONS = { tag: 'form', id: 'daggerheart-appearance-settings', classes: ['daggerheart', 'dialog', 'dh-style', 'setting'], position: { width: '600', height: 'auto' }, window: { + title: 'DAGGERHEART.SETTINGS.Menu.title', icon: 'fa-solid fa-gears' }, actions: { - reset: this.reset, - save: this.save, - preview: this.preview + reset: DHAppearanceSettings.#onReset, + preview: DHAppearanceSettings.#onPreview }, - form: { handler: this.updateData, submitOnChange: true } + form: { + closeOnSubmit: true, + handler: DHAppearanceSettings.#onSubmit + } }; static PARTS = { - main: { - template: 'systems/daggerheart/templates/settings/appearance-settings.hbs' - } + header: { template: 'systems/daggerheart/templates/settings/appearance-settings/header.hbs' }, + tabs: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs' }, + main: { template: 'systems/daggerheart/templates/settings/appearance-settings/main.hbs' }, + diceSoNice: { template: 'systems/daggerheart/templates/settings/appearance-settings/diceSoNice.hbs' }, + footer: { template: 'templates/generic/form-footer.hbs' } }; /** @inheritdoc */ static TABS = { + general: { + tabs: [ + { id: 'main', label: 'DAGGERHEART.GENERAL.Tabs.general' }, + { id: 'diceSoNice', label: 'DAGGERHEART.SETTINGS.Menu.appearance.diceSoNice.title' } + ], + initial: 'main' + }, diceSoNice: { tabs: [ { id: 'hope', label: 'DAGGERHEART.GENERAL.hope' }, @@ -51,79 +56,149 @@ export default class DHAppearanceSettings extends HandlebarsApplicationMixin(App } }; - changeTab(tab, group, options) { - super.changeTab(tab, group, options); + /**@type {DhAppearance}*/ + setting; - this.render(); + static #localized = false; + + /** @inheritDoc */ + async _preFirstRender(_context, _options) { + await super._preFirstRender(_context, _options); + if (!DHAppearanceSettings.#localized) { + foundry.helpers.Localization.localizeDataModel(this.setting.constructor); + DHAppearanceSettings.#localized = true; + } } - async _prepareContext(_options) { - const context = await super._prepareContext(_options); - context.settingFields = this.settings; - - context.showDiceSoNice = game.modules.get('dice-so-nice')?.active; - if (game.dice3d) { - context.diceSoNiceTextures = game.dice3d.exports.TEXTURELIST; - context.diceSoNiceColorsets = game.dice3d.exports.COLORSETS; - context.diceSoNiceMaterials = Object.keys(game.dice3d.DiceFactory.material_options).map(key => ({ - key: key, - name: `DICESONICE.Material${key.capitalize()}` - })); - context.diceSoNiceSystems = []; - for (const [key, system] of game.dice3d.DiceFactory.systems.entries()) { - context.diceSoNiceSystems.push({ key, name: system.name }); - } + /** @inheritdoc */ + _configureRenderParts(options) { + const parts = super._configureRenderParts(options); + if (!game.modules.get('dice-so-nice')?.active) { + delete parts.diceSoNice; + delete parts.tabs; } + return parts; + } - context.diceTab = { - key: this.tabGroups.diceSoNice, - source: this.settings._source.diceSoNice[this.tabGroups.diceSoNice], - fields: this.settings.schema.fields.diceSoNice.fields[this.tabGroups.diceSoNice].fields - }; + /**@inheritdoc */ + async _prepareContext(options) { + const context = await super._prepareContext(options); + if (options.isFirstRender) + this.setting = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance); + + context.setting = this.setting; + context.fields = this.setting.schema.fields; + + context.tabs = this._prepareTabs('general'); + context.dsnTabs = this._prepareTabs('diceSoNice'); return context; } - static async updateData(event, element, formData) { - const updatedSettings = foundry.utils.expandObject(formData.object); - - await this.settings.updateSource(updatedSettings); - this.render(); + /**@inheritdoc */ + async _preparePartContext(partId, context, options) { + const partContext = await super._preparePartContext(partId, context, options); + if (partId in context.tabs) partContext.tab = partContext.tabs[partId]; + switch (partId) { + case 'diceSoNice': + await this.prepareDiceSoNiceContext(partContext); + break; + case 'footer': + partContext.buttons = [ + { type: 'button', action: 'reset', icon: 'fa-solid fa-arrow-rotate-left', label: 'Reset' }, + { type: 'submit', icon: 'fa-solid fa-floppy-disk', label: 'Save Changes' } + ]; + break; + } + return partContext; } - static async preview() { - const source = this.settings._source.diceSoNice[this.tabGroups.diceSoNice]; - let faces = 'd12'; - switch (this.tabGroups.diceSoNice) { - case 'advantage': - case 'disadvantage': - faces = 'd6'; - } - const preset = await getDiceSoNicePreset(source, faces); - const diceSoNiceRoll = await new Roll(`1${faces}`).evaluate(); + /** + * Prepare render context for the DSN part. + * @param {ApplicationRenderContext} context + * @returns {Promise} + * @protected + */ + async prepareDiceSoNiceContext(context) { + context.diceSoNiceTextures = Object.entries(game.dice3d.exports.TEXTURELIST).reduce( + (acc, [k, v]) => ({ + ...acc, + [k]: v.name + }), + {} + ); + context.diceSoNiceColorsets = Object.values(game.dice3d.exports.COLORSETS).reduce( + (acc, v) => ({ + ...acc, + [v.id]: v.description + }), + {} + ); + context.diceSoNiceMaterials = Object.keys(game.dice3d.DiceFactory.material_options).reduce( + (acc, key) => ({ + ...acc, + [key]: `DICESONICE.Material${key.capitalize()}` + }), + {} + ); + context.diceSoNiceSystems = Object.fromEntries( + [...game.dice3d.DiceFactory.systems].map(([k, v]) => [k, v.name]) + ); + + foundry.utils.mergeObject( + context.dsnTabs, + ['hope', 'fear', 'advantage', 'disadvantage'].reduce( + (acc, key) => ({ + ...acc, + [key]: { + values: this.setting.diceSoNice[key], + fields: this.setting.schema.getField(`diceSoNice.${key}`).fields + } + }), + {} + ) + ); + } + + /** + * Submit the configuration form. + * @this {DHAppearanceSettings} + * @param {SubmitEvent} event + * @param {HTMLFormElement} form + * @param {foundry.applications.ux.FormDataExtended} formData + * @returns {Promise} + */ + static async #onSubmit(event, form, formData) { + const data = this.setting.schema.clean(foundry.utils.expandObject(formData.object)); + await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance, data); + } + + /* -------------------------------------------- */ + + /** + * Submit the configuration form. + * @this {DHAppearanceSettings} + * @type {ApplicationClickAction} + */ + static async #onPreview(_, target) { + const formData = new foundry.applications.ux.FormDataExtended(target.closest('form')); + const { diceSoNice } = foundry.utils.expandObject(formData.object); + const { key } = target.dataset; + const faces = ['advantage', 'disadvantage'].includes(key) ? 'd6' : 'd12'; + const preset = await getDiceSoNicePreset(diceSoNice[key], faces); + const diceSoNiceRoll = await new foundry.dice.Roll(`1${faces}`).evaluate(); diceSoNiceRoll.dice[0].options.appearance = preset.appearance; diceSoNiceRoll.dice[0].options.modelFile = preset.modelFile; - await game.dice3d.showForRoll(diceSoNiceRoll, game.user, false); } - static async reset() { - this.settings = new DhAppearance(); - this.render(); - } - - static async save() { - await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance, this.settings.toObject()); - - this.close(); - } - - _getTabs(tabs) { - for (const v of Object.values(tabs)) { - v.active = this.tabGroups[v.group] ? this.tabGroups[v.group] === v.id : v.active; - v.cssClass = v.active ? 'active' : ''; - } - - return tabs; + /** + * Reset the form back to default values. + * @this {DHAppearanceSettings} + * @type {ApplicationClickAction} + */ + static async #onReset() { + this.setting = new this.setting.constructor(); + this.render({ force: false }); } } diff --git a/module/applications/settings/automationSettings.mjs b/module/applications/settings/automationSettings.mjs index 0157e016..4407897d 100644 --- a/module/applications/settings/automationSettings.mjs +++ b/module/applications/settings/automationSettings.mjs @@ -35,13 +35,14 @@ export default class DhAutomationSettings extends HandlebarsApplicationMixin(App header: { template: 'systems/daggerheart/templates/settings/automation-settings/header.hbs' }, general: { template: 'systems/daggerheart/templates/settings/automation-settings/general.hbs' }, rules: { template: 'systems/daggerheart/templates/settings/automation-settings/rules.hbs' }, + roll: { template: 'systems/daggerheart/templates/settings/automation-settings/roll.hbs' }, footer: { template: 'systems/daggerheart/templates/settings/automation-settings/footer.hbs' } }; /** @inheritdoc */ static TABS = { main: { - tabs: [{ id: 'general' }, { id: 'rules' }], + tabs: [{ id: 'general' }, { id: 'rules' }, { id: 'roll' }], initial: 'general', labelPrefix: 'DAGGERHEART.GENERAL.Tabs' } diff --git a/module/applications/sheets-configs/action-config.mjs b/module/applications/sheets-configs/action-config.mjs index ea3c6f31..96b6cc48 100644 --- a/module/applications/sheets-configs/action-config.mjs +++ b/module/applications/sheets-configs/action-config.mjs @@ -132,12 +132,19 @@ export default class DHActionConfig extends DaggerheartSheet(ApplicationV2) { const options = foundry.utils.deepClone(CONFIG.DH.GENERAL.abilityCosts); const resource = this.action.parent.resource; if (resource) { - options[this.action.parent.parent.id] = { + options.resource = { label: 'DAGGERHEART.GENERAL.itemResource', group: 'Global' }; } + if (this.action.parent.metadata.isQuantifiable) { + options.quantity = { + label: 'DAGGERHEART.GENERAL.itemQuantity', + group: 'Global' + }; + } + return options; } @@ -164,13 +171,14 @@ export default class DHActionConfig extends DaggerheartSheet(ApplicationV2) { _prepareSubmitData(_event, formData) { const submitData = foundry.utils.expandObject(formData.object); + + const itemAbilityCostKeys = Object.keys(CONFIG.DH.GENERAL.itemAbilityCosts); for (const keyPath of this.constructor.CLEAN_ARRAYS) { const data = foundry.utils.getProperty(submitData, keyPath); const dataValues = data ? Object.values(data) : []; if (keyPath === 'cost') { for (var value of dataValues) { - const item = this.action.parent.parent.id === value.key; - value.keyIsID = Boolean(item); + value.itemId = itemAbilityCostKeys.includes(value.key) ? this.action.parent.parent.id : null; } } diff --git a/module/applications/sheets/actors/adversary.mjs b/module/applications/sheets/actors/adversary.mjs index f575a2f2..64f48d02 100644 --- a/module/applications/sheets/actors/adversary.mjs +++ b/module/applications/sheets/actors/adversary.mjs @@ -146,9 +146,9 @@ export default class AdversarySheet extends DHBaseActorSheet { title: `Reaction Roll: ${this.actor.name}`, headerTitle: 'Adversary Reaction Roll', roll: { - type: 'reaction' + type: 'trait' }, - type: 'trait', + actionType: 'reaction', hasRoll: true, data: this.actor.getRollData() }; diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index 0328f0dd..5bc6828b 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -5,7 +5,6 @@ import { CharacterLevelup, LevelupViewMode } from '../../levelup/_module.mjs'; import DhCharacterCreation from '../../characterCreation/characterCreation.mjs'; import FilterMenu from '../../ux/filter-menu.mjs'; import { getDocFromElement, getDocFromElementSync } from '../../../helpers/utils.mjs'; -import { ItemBrowser } from '../../ui/itemBrowser.mjs'; /**@typedef {import('@client/applications/_types.mjs').ApplicationClickAction} ApplicationClickAction */ @@ -15,6 +14,8 @@ export default class CharacterSheet extends DHBaseActorSheet { static DEFAULT_OPTIONS = { classes: ['character'], position: { width: 850, height: 800 }, + /* Foundry adds disabled to all buttons and inputs if editPermission is missing. This is not desired. */ + editPermission: CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER, actions: { toggleVault: CharacterSheet.#toggleVault, rollAttribute: CharacterSheet.#rollAttribute, @@ -27,8 +28,7 @@ export default class CharacterSheet extends DHBaseActorSheet { toggleEquipItem: CharacterSheet.#toggleEquipItem, toggleResourceDice: CharacterSheet.#toggleResourceDice, handleResourceDice: CharacterSheet.#handleResourceDice, - useDowntime: this.useDowntime, - tempBrowser: CharacterSheet.#tempBrowser + useDowntime: this.useDowntime }, window: { resizable: true, @@ -132,6 +132,7 @@ export default class CharacterSheet extends DHBaseActorSheet { }); htmlElement.querySelectorAll('.inventory-item-quantity').forEach(element => { element.addEventListener('change', this.updateItemQuantity.bind(this)); + element.addEventListener('click', e => e.stopPropagation()); }); // Add listener for armor marks input @@ -148,6 +149,13 @@ export default class CharacterSheet extends DHBaseActorSheet { .querySelector('.level-value') ?.addEventListener('change', event => this.document.updateLevel(Number(event.currentTarget.value))); + const observer = this.document.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER, { + exact: true + }); + if (observer) { + this.element.querySelector('.window-content').classList.add('viewMode'); + } + this._createFilterMenus(); this._createSearchFilter(); } @@ -626,14 +634,22 @@ export default class CharacterSheet extends DHBaseActorSheet { const { key } = button.dataset; const presets = { - compendium: 'daggerheart', folder: key, + filter: + key === 'subclasses' + ? { + 'system.linkedClass.uuid': { + key: 'system.linkedClass.uuid', + value: this.document.system.class.value._stats.compendiumSource + } + } + : undefined, render: { noFolder: true } }; - return new ItemBrowser({ presets }).render({ force: true }); + ui.compendiumBrowser.open(presets); } /** @@ -661,31 +677,7 @@ export default class CharacterSheet extends DHBaseActorSheet { }) }); - this.consumeResource(result?.costs); - } - - // Remove when Action Refactor part #2 done - async consumeResource(costs) { - if (!costs?.length) return; - const usefulResources = { - ...foundry.utils.deepClone(this.actor.system.resources), - fear: { - value: game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Resources.Fear), - max: game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).maxFear, - reversed: false - } - }; - const resources = game.system.api.fields.ActionFields.CostField.getRealCosts(costs).map(c => { - const resource = usefulResources[c.key]; - return { - key: c.key, - value: (c.total ?? c.value) * (resource.isReversed ? 1 : -1), - target: resource.target, - keyIsID: resource.keyIsID - }; - }); - - await this.actor.modifyResource(resources); + if (result) game.system.api.fields.ActionFields.CostField.execute.call(this, result); } //TODO: redo toggleEquipItem method @@ -774,13 +766,6 @@ export default class CharacterSheet extends DHBaseActorSheet { }); } - /** - * Temp - */ - static async #tempBrowser(_, target) { - new ItemBrowser().render({ force: true }); - } - /** * Handle the roll values of resource dice. * @type {ApplicationClickAction} diff --git a/module/applications/sheets/actors/companion.mjs b/module/applications/sheets/actors/companion.mjs index 2b82f50a..b353adbb 100644 --- a/module/applications/sheets/actors/companion.mjs +++ b/module/applications/sheets/actors/companion.mjs @@ -8,6 +8,7 @@ export default class DhCompanionSheet extends DHBaseActorSheet { classes: ['actor', 'companion'], position: { width: 340 }, actions: { + actionRoll: DhCompanionSheet.#actionRoll, levelManagement: DhCompanionSheet.#levelManagement } }; @@ -45,6 +46,51 @@ export default class DhCompanionSheet extends DHBaseActorSheet { /* Application Clicks Actions */ /* -------------------------------------------- */ + /** + * + */ + static async #actionRoll(event) { + const partner = this.actor.system.partner; + const config = { + event, + title: `${game.i18n.localize('DAGGERHEART.GENERAL.Roll.action')}: ${this.actor.name}`, + headerTitle: `Companion ${game.i18n.localize('DAGGERHEART.GENERAL.Roll.action')}`, + roll: { + trait: partner.system.spellcastModifierTrait?.key + }, + hasRoll: true, + data: partner.getRollData() + }; + + const result = await partner.diceRoll(config); + this.consumeResource(result?.costs); + } + + // Remove when Action Refactor part #2 done + async consumeResource(costs) { + if (!costs?.length) return; + + const partner = this.actor.system.partner; + const usefulResources = { + ...foundry.utils.deepClone(partner.system.resources), + fear: { + value: game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Resources.Fear), + max: game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).maxFear, + reversed: false + } + }; + const resources = game.system.api.fields.ActionFields.CostField.getRealCosts(costs).map(c => { + const resource = usefulResources[c.key]; + return { + key: c.key, + value: (c.total ?? c.value) * (resource.isReversed ? 1 : -1), + target: resource.target + }; + }); + + await partner.modifyResource(resources); + } + /** * Opens the companions level management window. * @type {ApplicationClickAction} diff --git a/module/applications/sheets/api/application-mixin.mjs b/module/applications/sheets/api/application-mixin.mjs index de9fe53d..1a508131 100644 --- a/module/applications/sheets/api/application-mixin.mjs +++ b/module/applications/sheets/api/application-mixin.mjs @@ -1,6 +1,5 @@ const { HandlebarsApplicationMixin } = foundry.applications.api; import { getDocFromElement, getDocFromElementSync, tagifyElement } from '../../../helpers/utils.mjs'; -import { ItemBrowser } from '../../ui/itemBrowser.mjs'; const typeSettingsMap = { character: 'extendCharacterDescriptions', @@ -412,6 +411,19 @@ export default function DHApplicationMixin(Base) { ]; if (usable) { + options.unshift({ + name: 'DAGGERHEART.APPLICATIONS.ContextMenu.cancelBeastform', + icon: 'fa-solid fa-ban', + condition: target => { + const doc = getDocFromElementSync(target); + return doc && doc.system?.actions?.some(a => a.type === 'beastform'); + }, + callback: async target => + game.system.api.fields.ActionFields.BeastformField.handleActiveTransformations.call( + await getDocFromElement(target) + ) + }); + options.unshift({ name: 'DAGGERHEART.GENERAL.damage', icon: 'fa-solid fa-explosion', @@ -422,7 +434,9 @@ export default function DHApplicationMixin(Base) { callback: async (target, event) => { const doc = await getDocFromElement(target), action = doc?.system?.attack ?? doc; - return action && action.use(event, { byPassRoll: true }); + const config = action.prepareConfig(event); + config.hasRoll = false; + return action && action.workflow.get('damage').execute(config, null, true); } }); @@ -577,28 +591,27 @@ export default function DHApplicationMixin(Base) { static async #browseItem(event, target) { const type = target.dataset.compendium ?? target.dataset.type; - const presets = {}; + const presets = { + render: { + noFolder: true + } + }; switch (type) { case 'loot': + presets.folder = 'equipments.folders.loots'; + break; case 'consumable': + presets.folder = 'equipments.folders.consumables'; + break; case 'armor': + presets.folder = 'equipments.folders.armors'; + break; case 'weapon': - presets.compendium = 'daggerheart'; - presets.folder = 'equipments'; - presets.render = { - noFolder: true - }; - presets.filter = { - type: { key: 'type', value: type, forced: true } - }; + presets.folder = 'equipments.folders.weapons'; break; case 'domainCard': - presets.compendium = 'daggerheart'; presets.folder = 'domains'; - presets.render = { - noFolder: true - }; presets.filter = { 'level.max': { key: 'level.max', value: this.document.system.levelData.level.current }, 'system.domain': { key: 'system.domain', value: this.document.system.domains } @@ -608,7 +621,7 @@ export default function DHApplicationMixin(Base) { return; } - return new ItemBrowser({ presets }).render({ force: true }); + ui.compendiumBrowser.open(presets); } /** diff --git a/module/applications/sheets/items/class.mjs b/module/applications/sheets/items/class.mjs index 01f4249a..b88e6ca3 100644 --- a/module/applications/sheets/items/class.mjs +++ b/module/applications/sheets/items/class.mjs @@ -46,6 +46,10 @@ export default class ClassSheet extends DHBaseItemSheet { template: 'systems/daggerheart/templates/sheets/items/class/settings.hbs', scrollable: ['.settings'] }, + questions: { + template: 'systems/daggerheart/templates/sheets/items/class/questions.hbs', + scrollable: ['.questions'] + }, effects: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-effects.hbs', scrollable: ['.effects'] @@ -55,7 +59,13 @@ export default class ClassSheet extends DHBaseItemSheet { /** @inheritdoc */ static TABS = { primary: { - tabs: [{ id: 'description' }, { id: 'features' }, { id: 'settings' }, { id: 'effects' }], + tabs: [ + { id: 'description' }, + { id: 'features' }, + { id: 'settings' }, + { id: 'questions' }, + { id: 'effects' } + ], initial: 'description', labelPrefix: 'DAGGERHEART.GENERAL.Tabs' } @@ -119,6 +129,15 @@ export default class ClassSheet extends DHBaseItemSheet { const itemType = data.data ? data.type : item.type; const target = event.target.closest('fieldset.drop-section'); if (itemType === 'subclass') { + if (item.system.linkedClass) { + return ui.notifications.warn( + game.i18n.format('DAGGERHEART.UI.Notifications.subclassAlreadyLinked', { + name: item.name, + class: this.document.name + }) + ); + } + await item.update({ 'system.linkedClass': this.document.uuid }); await this.document.update({ 'system.subclasses': [...this.document.system.subclasses.map(x => x.uuid), item.uuid] }); @@ -181,6 +200,12 @@ export default class ClassSheet extends DHBaseItemSheet { static async #removeItemFromCollection(_event, element) { const { uuid, target } = element.dataset; const prop = foundry.utils.getProperty(this.document.system, target); + + if (target === 'subclasses') { + const subclass = await foundry.utils.fromUuid(uuid); + await subclass.update({ 'system.linkedClass': null }); + } + await this.document.update({ [`system.${target}`]: prop.filter(i => i.uuid !== uuid).map(x => x.uuid) }); } diff --git a/module/applications/ui/_module.mjs b/module/applications/ui/_module.mjs index 6a17a61e..815fc4e7 100644 --- a/module/applications/ui/_module.mjs +++ b/module/applications/ui/_module.mjs @@ -3,3 +3,4 @@ export { default as DhCombatTracker } from './combatTracker.mjs'; export * as DhCountdowns from './countdowns.mjs'; export { default as DhFearTracker } from './fearTracker.mjs'; export { default as DhHotbar } from './hotbar.mjs'; +export { ItemBrowser } from './itemBrowser.mjs'; diff --git a/module/applications/ui/chatLog.mjs b/module/applications/ui/chatLog.mjs index ba85e1f1..b95e50e1 100644 --- a/module/applications/ui/chatLog.mjs +++ b/module/applications/ui/chatLog.mjs @@ -1,5 +1,3 @@ -import { emitAsGM, GMUpdateEvent } from '../../systemRegistration/socket.mjs'; - export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLog { constructor(options) { super(options); @@ -55,21 +53,9 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo } addChatListeners = async (app, html, data) => { - html.querySelectorAll('.duality-action-damage').forEach(element => - element.addEventListener('click', event => this.onRollDamage(event, data.message)) - ); - html.querySelectorAll('.target-save').forEach(element => - element.addEventListener('click', event => this.onRollSave(event, data.message)) - ); - html.querySelectorAll('.roll-all-save-button').forEach(element => - element.addEventListener('click', event => this.onRollAllSave(event, data.message)) - ); html.querySelectorAll('.simple-roll-button').forEach(element => element.addEventListener('click', event => this.onRollSimple(event, data.message)) ); - html.querySelectorAll('.healing-button').forEach(element => - element.addEventListener('click', event => this.onHealing(event, data.message)) - ); html.querySelectorAll('.ability-use-button').forEach(element => element.addEventListener('click', event => this.abilityUseButton(event, data.message)) ); @@ -90,80 +76,6 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo super.close(options); } - async getActor(uuid) { - return await foundry.utils.fromUuid(uuid); - } - - getAction(actor, itemId, actionId) { - const item = actor.items.get(itemId), - action = - actor.system.attack?._id === actionId - ? actor.system.attack - : item.system.attack?._id === actionId - ? item.system.attack - : item?.system?.actions?.get(actionId); - return action; - } - - async onRollDamage(event, message) { - event.stopPropagation(); - const actor = await this.getActor(message.system.source.actor); - if (!actor.isOwner) return true; - if (message.system.source.item && message.system.source.action) { - const action = this.getAction(actor, message.system.source.item, message.system.source.action); - if (!action || !action?.rollDamage) return; - await action.rollDamage(event, message); - } - } - - async onRollSave(event, message) { - event.stopPropagation(); - const actor = await this.getActor(message.system.source.actor), - tokenId = event.target.closest('[data-token]')?.dataset.token, - token = game.canvas.tokens.get(tokenId); - if (!token?.actor || !token.isOwner) return true; - if (message.system.source.item && message.system.source.action) { - const action = this.getAction(actor, message.system.source.item, message.system.source.action); - if (!action || !action?.hasSave) return; - action.rollSave(token.actor, event, message).then(result => - emitAsGM( - GMUpdateEvent.UpdateSaveMessage, - action.updateSaveMessage.bind(action, result, message, token.id), - { - action: action.uuid, - message: message._id, - token: token.id, - result - } - ) - ); - } - } - - async onRollAllSave(event, message) { - event.stopPropagation(); - if (!game.user.isGM) return; - const targets = event.target.parentElement.querySelectorAll('[data-token] .target-save'); - const actor = await this.getActor(message.system.source.actor), - action = this.getAction(actor, message.system.source.item, message.system.source.action); - targets.forEach(async el => { - const tokenId = el.closest('[data-token]')?.dataset.token, - token = game.canvas.tokens.get(tokenId); - if (!token.actor) return; - if (game.user === token.actor.owner) el.dispatchEvent(new PointerEvent('click', { shiftKey: true })); - else { - token.actor.owner - .query('reactionRoll', { - actionId: action.uuid, - actorId: token.actor.uuid, - event, - message - }) - .then(result => action.updateSaveMessage(result, message, token.id)); - } - }); - } - async onRollSimple(event, message) { const buttonType = event.target.dataset.type ?? 'damage', total = message.rolls.reduce((a, c) => a + Roll.fromJSON(c).total, 0), @@ -197,8 +109,11 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo item.system.attack?.id === event.currentTarget.id ? item.system.attack : item.system.actions.get(event.currentTarget.id); - if (event.currentTarget.dataset.directDamage) action.use(event, { byPassRoll: true }); - else action.use(event); + if (event.currentTarget.dataset.directDamage) { + const config = action.prepareConfig(event); + config.hasRoll = false; + action.workflow.get('damage').execute(config, null, true); + } else action.use(event); } async actionUseButton(event, message) { diff --git a/module/applications/ui/fearTracker.mjs b/module/applications/ui/fearTracker.mjs index ace2bbb2..2b7c4dac 100644 --- a/module/applications/ui/fearTracker.mjs +++ b/module/applications/ui/fearTracker.mjs @@ -1,4 +1,4 @@ -import { emitAsGM, GMUpdateEvent, socketEvent } from "../../systemRegistration/socket.mjs"; +import { emitAsGM, GMUpdateEvent, socketEvent } from '../../systemRegistration/socket.mjs'; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; @@ -78,7 +78,7 @@ export default class FearTracker extends HandlebarsApplicationMixin(ApplicationV /** @override */ async _preRender(context, options) { - if (this.currentFear > this.maxFear) + if (this.currentFear > this.maxFear && game.user.isGM) await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Resources.Fear, this.maxFear); } @@ -106,19 +106,10 @@ export default class FearTracker extends HandlebarsApplicationMixin(ApplicationV } async updateFear(value) { - return emitAsGM(GMUpdateEvent.UpdateFear, game.settings.set.bind(game.settings, CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Resources.Fear), value); - /* if(!game.user.isGM) - await game.socket.emit(`system.${CONFIG.DH.id}`, { - action: socketEvent.GMUpdate, - data: { - action: GMUpdateEvent.UpdateFear, - update: value - } - }); - else - game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Resources.Fear, value); */ - /* if (!game.user.isGM) return; - value = Math.max(0, Math.min(this.maxFear, value)); - await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Resources.Fear, value); */ + return emitAsGM( + GMUpdateEvent.UpdateFear, + game.settings.set.bind(game.settings, CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Resources.Fear), + value + ); } } diff --git a/module/applications/ui/itemBrowser.mjs b/module/applications/ui/itemBrowser.mjs index 427ffb4b..a00f8edc 100644 --- a/module/applications/ui/itemBrowser.mjs +++ b/module/applications/ui/itemBrowser.mjs @@ -15,16 +15,13 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { this.fieldFilter = []; this.selectedMenu = { path: [], data: null }; this.config = CONFIG.DH.ITEMBROWSER.compendiumConfig; - this.presets = options.presets; - - if (this.presets?.compendium && this.presets?.folder) - ItemBrowser.selectFolder.call(this, null, null, this.presets.compendium, this.presets.folder); + this.presets = {}; } /** @inheritDoc */ static DEFAULT_OPTIONS = { id: 'itemBrowser', - classes: ['daggerheart', 'dh-style', 'dialog', 'compendium-browser'], + classes: ['daggerheart', 'dh-style', 'dialog', 'compendium-browser', 'loader'], tag: 'div', window: { frame: true, @@ -84,17 +81,13 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { } }; - /** @inheritDoc */ - async _preFirstRender(context, options) { - if (context.presets?.render?.noFolder || context.presets?.render?.lite) options.position.width = 600; - - await super._preFirstRender(context, options); - } - /** @inheritDoc */ async _preRender(context, options) { - if (context.presets?.render?.noFolder || context.presets?.render?.lite) - options.parts.splice(options.parts.indexOf('sidebar'), 1); + this.presets = options.presets ?? {}; + + const width = this.presets?.render?.noFolder === true || this.presets?.render?.lite === true ? 600 : 850; + if (this.rendered) this.setPosition({ width }); + else options.position.width = width; await super._preRender(context, options); } @@ -103,22 +96,21 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { async _onRender(context, options) { await super._onRender(context, options); - this._createSearchFilter(); - this._createFilterInputs(); - this._createDragProcess(); - - if (context.presets?.render?.lite) this.element.classList.add('lite'); - - if (context.presets?.render?.noFolder) this.element.classList.add('no-folder'); - - if (context.presets?.render?.noFilter) this.element.classList.add('no-filter'); - - if (this.presets?.filter) { - Object.entries(this.presets.filter).forEach( - ([k, v]) => (this.fieldFilter.find(c => c.name === k).value = v.value) + this.element + .querySelectorAll('[data-action="selectFolder"]') + .forEach(element => + element.classList.toggle('is-selected', element.dataset.folderId === this.selectedMenu.path.join('.')) ); - await this._onInputFilterBrowser(); - } + + this._createSearchFilter(); + + this.element.classList.toggle('lite', this.presets?.render?.lite === true); + this.element.classList.toggle('no-folder', this.presets?.render?.noFolder === true); + this.element.classList.toggle('no-filter', this.presets?.render?.noFilter === true); + this.element.querySelectorAll('.folder-list > [data-action="selectFolder"]').forEach(element => { + element.hidden = + this.presets.render?.folders?.length && !this.presets.render.folders.includes(element.dataset.folderId); + }); } _attachPartListeners(partId, htmlElement, options) { @@ -139,19 +131,23 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { async _prepareContext(options) { const context = await super._prepareContext(options); context.compendiums = this.getCompendiumFolders(foundry.utils.deepClone(this.config)); - // context.pathTitle = this.pathTile; context.menu = this.selectedMenu; context.formatLabel = this.formatLabel; context.formatChoices = this.formatChoices; - context.fieldFilter = this.fieldFilter = this._createFieldFilter(); context.items = this.items; context.presets = this.presets; return context; } + open(presets = {}) { + this.presets = presets; + ItemBrowser.selectFolder.call(this); + } + getCompendiumFolders(config, parent = null, depth = 0) { let folders = []; Object.values(config).forEach(c => { + // if(this.presets.render?.folders?.length && !this.presets.render.folders.includes(c.id)) return; const folder = { id: c.id, label: game.i18n.localize(c.label), @@ -162,16 +158,14 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { : []; folders.push(folder); }); + folders.sort((a, b) => a.label.localeCompare(b.label)); return folders; } - static async selectFolder(_, target, compend, folder) { - const config = foundry.utils.deepClone(this.config), - compendium = compend ?? target.closest('[data-compendium-id]').dataset.compendiumId, - folderId = folder ?? target.dataset.folderId, - folderPath = `${compendium}.folders.${folderId}`, - folderData = foundry.utils.getProperty(config, folderPath); + static async selectFolder(_, target) { + const folderId = target?.dataset?.folderId ?? this.presets.folder, + folderData = foundry.utils.getProperty(this.config, folderId) ?? {}; const columns = ItemBrowser.getFolderConfig(folderData).map(col => ({ ...col, @@ -179,31 +173,16 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { })); this.selectedMenu = { - path: folderPath.split('.'), + path: folderId?.split('.') ?? [], data: { ...folderData, columns: columns } }; - let items = []; - for (const key of folderData.keys) { - const comp = game.packs.get(`${compendium}.${key}`); - if (!comp) return; - items = items.concat(await comp.getDocuments({ type__in: folderData.type })); - } + await this.render({ force: true, presets: this.presets }); - this.items = ItemBrowser.sortBy(items, 'name'); - - if (target) { - target - .closest('.compendium-sidebar') - .querySelectorAll('[data-action="selectFolder"]') - .forEach(element => element.classList.remove('is-selected')); - target.classList.add('is-selected'); - } - - this.render({ force: true }); + if (this.selectedMenu?.data?.type?.length) this.loadItems(); } _replaceHTML(result, content, options) { @@ -211,6 +190,76 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { super._replaceHTML(result, content, options); } + loadItems() { + let loadTimeout = this.toggleLoader(true); + + const promises = []; + + game.packs.forEach(pack => { + promises.push( + new Promise(async resolve => { + const items = await pack.getDocuments({ type__in: this.selectedMenu?.data?.type }); + resolve(items); + }) + ); + }); + + Promise.all(promises).then(async result => { + this.items = ItemBrowser.sortBy( + result.flatMap(r => r), + 'name' + ); + this.fieldFilter = this._createFieldFilter(); + + if (this.presets?.filter) { + Object.entries(this.presets.filter).forEach(([k, v]) => { + const filter = this.fieldFilter.find(c => c.name === k); + if (filter) filter.value = v.value; + }); + // await this._onInputFilterBrowser(); + } + + const filterList = await foundry.applications.handlebars.renderTemplate( + 'systems/daggerheart/templates/ui/itemBrowser/filterContainer.hbs', + { + fieldFilter: this.fieldFilter, + presets: this.presets, + formatChoices: this.formatChoices + } + ); + + this.element.querySelector('.filter-content .wrapper').innerHTML = filterList; + const filterContainer = this.element.querySelector('.filter-header > [data-action="expandContent"]'); + if (this.fieldFilter.length === 0) filterContainer.setAttribute('disabled', ''); + else filterContainer.removeAttribute('disabled'); + + const itemList = await foundry.applications.handlebars.renderTemplate( + 'systems/daggerheart/templates/ui/itemBrowser/itemContainer.hbs', + { + items: this.items, + menu: this.selectedMenu, + formatLabel: this.formatLabel + } + ); + + this.element.querySelector('.item-list').innerHTML = itemList; + + this._createFilterInputs(); + await this._onInputFilterBrowser(); + this._createDragProcess(); + + clearTimeout(loadTimeout); + this.toggleLoader(false); + }); + } + + toggleLoader(state) { + const container = this.element.querySelector('.item-list'); + return setTimeout(() => { + container.classList.toggle('loader', state); + }, 100); + } + static expandContent(_, target) { const parent = target.parentElement; parent.classList.toggle('expanded'); @@ -243,7 +292,7 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { filters.forEach(f => { if (typeof f.field === 'string') f.field = foundry.utils.getProperty(game, f.field); else if (typeof f.choices === 'function') { - f.choices = f.choices(); + f.choices = f.choices(this.items); } // Clear field label so template uses our custom label parameter @@ -262,11 +311,8 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { /* -------------------------------------------- */ /** - * Create and initialize search filter instances for the inventory and loadout sections. + * Create and initialize search filter instance. * - * Sets up two {@link foundry.applications.ux.SearchFilter} instances: - * - One for the inventory, which filters items in the inventory grid. - * - One for the loadout, which filters items in the loadout/card grid. * @private */ _createSearchFilter() { @@ -331,6 +377,7 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { for (const li of html.querySelectorAll('.item-container')) { const itemUUID = li.dataset.itemUuid, item = this.items.find(i => i.uuid === itemUUID); + if (!item) continue; const matchesSearch = !query || foundry.applications.ux.SearchFilter.testQuery(rgx, item.name); if (matchesSearch) this.#filteredItems.browser.search.add(item.id); const { input } = this.#filteredItems.browser; @@ -422,11 +469,13 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { const newOrder = [...itemList].reverse().sort((a, b) => { const aProp = a.querySelector(`[data-item-key="${key}"]`), - bProp = b.querySelector(`[data-item-key="${key}"]`); + bProp = b.querySelector(`[data-item-key="${key}"]`), + aValue = isNaN(aProp.innerText) ? aProp.innerText : Number(aProp.innerText), + bValue = isNaN(bProp.innerText) ? bProp.innerText : Number(bProp.innerText); if (type === 'DESC') { - return aProp.innerText < bProp.innerText ? 1 : -1; + return aValue < bValue ? 1 : -1; } else { - return aProp.innerText > bProp.innerText ? 1 : -1; + return aValue > bValue ? 1 : -1; } }); @@ -455,4 +504,41 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { _canDragStart() { return true; } + + static injectSidebarButton(html) { + if (!game.user.isGM) return; + const sectionId = html.dataset.tab, + menus = { + actors: { + folder: 'adversaries', + render: { + folders: ['adversaries', 'characters', 'environments'] + } + }, + items: { + folder: 'equipments', + render: { + noFolder: true + } + }, + compendium: {} + }; + + if (Object.keys(menus).includes(sectionId)) { + const headerActions = html.querySelector('.header-actions'); + + const button = document.createElement('button'); + button.type = 'button'; + button.classList.add('open-compendium-browser'); + button.innerHTML = ` + + ${game.i18n.localize('DAGGERHEART.UI.Tooltip.compendiumBrowser')} + `; + button.addEventListener('click', event => { + ui.compendiumBrowser.open(menus[sectionId]); + }); + + headerActions.append(button); + } + } } diff --git a/module/config/generalConfig.mjs b/module/config/generalConfig.mjs index e99c6ff1..d4e6318e 100644 --- a/module/config/generalConfig.mjs +++ b/module/config/generalConfig.mjs @@ -561,6 +561,19 @@ export const refreshTypes = { } }; +export const itemAbilityCosts = { + resource: { + id: 'resource', + label: 'DAGGERHEART.GENERAL.resource', + group: 'Global' + }, + quantity: { + id: 'quantity', + label: 'DAGGERHEART.GENERAL.quantity', + group: 'Global' + } +}; + export const abilityCosts = { hitPoints: { id: 'hitPoints', @@ -586,7 +599,8 @@ export const abilityCosts = { id: 'fear', label: 'Fear', group: 'TYPES.Actor.adversary' - } + }, + resource: itemAbilityCosts.resource }; export const countdownTypes = { diff --git a/module/config/itemBrowserConfig.mjs b/module/config/itemBrowserConfig.mjs index d5afe72e..e870172f 100644 --- a/module/config/itemBrowserConfig.mjs +++ b/module/config/itemBrowserConfig.mjs @@ -149,6 +149,102 @@ export const typeConfig = { } ] }, + weapons: { + columns: [ + { + key: 'system.secondary', + label: 'DAGGERHEART.UI.ItemBrowser.subtype', + format: isSecondary => (isSecondary ? 'secondary' : isSecondary === false ? 'primary' : '-') + }, + { + key: 'system.tier', + label: 'DAGGERHEART.GENERAL.Tiers.singular' + } + ], + filters: [ + { + key: 'system.secondary', + label: 'DAGGERHEART.UI.ItemBrowser.subtype', + choices: [ + { value: false, label: 'DAGGERHEART.ITEMS.Weapon.primaryWeapon' }, + { value: true, label: 'DAGGERHEART.ITEMS.Weapon.secondaryWeapon' } + ] + }, + { + key: 'system.tier', + label: 'DAGGERHEART.GENERAL.Tiers.singular', + choices: [ + { value: '1', label: '1' }, + { value: '2', label: '2' }, + { value: '3', label: '3' }, + { value: '4', label: '4' } + ] + }, + { + key: 'system.burden', + label: 'DAGGERHEART.GENERAL.burden', + field: 'system.api.models.items.DHWeapon.schema.fields.burden' + }, + { + key: 'system.attack.roll.trait', + label: 'DAGGERHEART.GENERAL.Trait.single', + field: 'system.api.models.actions.actionsTypes.attack.schema.fields.roll.fields.trait' + }, + { + key: 'system.attack.range', + label: 'DAGGERHEART.GENERAL.range', + field: 'system.api.models.actions.actionsTypes.attack.schema.fields.range' + }, + { + key: 'system.itemFeatures', + label: 'DAGGERHEART.GENERAL.features', + choices: () => + Object.entries(CONFIG.DH.ITEM.weaponFeatures).map(([k, v]) => ({ value: k, label: v.label })), + operator: 'contains3' + } + ] + }, + armors: { + columns: [ + { + key: 'system.tier', + label: 'DAGGERHEART.GENERAL.Tiers.singular' + } + ], + filters: [ + { + key: 'system.tier', + label: 'DAGGERHEART.GENERAL.Tiers.singular', + choices: [ + { value: '1', label: '1' }, + { value: '2', label: '2' }, + { value: '3', label: '3' }, + { value: '4', label: '4' } + ] + }, + { + key: 'system.baseScore', + name: 'armor.min', + label: 'DAGGERHEART.UI.ItemBrowser.armorScoreMin', + field: 'system.api.models.items.DHArmor.schema.fields.baseScore', + operator: 'gte' + }, + { + key: 'system.baseScore', + name: 'armor.max', + label: 'DAGGERHEART.UI.ItemBrowser.armorScoreMax', + field: 'system.api.models.items.DHArmor.schema.fields.baseScore', + operator: 'lte' + }, + { + key: 'system.itemFeatures', + label: 'DAGGERHEART.GENERAL.features', + choices: () => + Object.entries(CONFIG.DH.ITEM.armorFeatures).map(([k, v]) => ({ value: k, label: v.label })), + operator: 'contains3' + } + ] + }, features: { columns: [], filters: [] @@ -257,7 +353,7 @@ export const typeConfig = { { key: 'system.domains', label: 'DAGGERHEART.GENERAL.Domain.plural', - choices: () => Object.values(CONFIG.DH.DOMAIN.domains).map(d => ({ value: d.id, label: d.label })), + choices: () => Object.values(CONFIG.DH.DOMAIN.allDomains()).map(d => ({ value: d.id, label: d.label })), operator: 'contains2' } ] @@ -265,11 +361,9 @@ export const typeConfig = { subclasses: { columns: [ { - key: 'id', - label: 'TYPES.Item.class', - format: id => { - return ''; - } + key: 'system.linkedClass', + label: 'Class', + format: linkedClass => linkedClass.name }, { key: 'system.spellcastingTrait', @@ -278,6 +372,34 @@ export const typeConfig = { ], filters: [] }, + beastforms: { + columns: [ + { + key: 'system.tier', + label: 'DAGGERHEART.GENERAL.Tiers.singular' + }, + { + key: 'system.mainTrait', + label: 'DAGGERHEART.GENERAL.Trait.single' + } + ], + filters: [ + { + key: 'system.linkedClass.uuid', + label: 'Class', + choices: items => { + const list = items.map(item => ({ + value: item.system.linkedClass.uuid, + label: item.system.linkedClass.name + })); + return list.reduce((a, c) => { + if (!a.find(i => i.value === c.value)) a.push(c); + return a; + }, []); + } + } + ] + }, beastforms: { columns: [ { @@ -305,109 +427,144 @@ export const typeConfig = { }; export const compendiumConfig = { - daggerheart: { - id: 'daggerheart', - label: 'DAGGERHEART', - folders: { - adversaries: { - id: 'adversaries', - keys: ['adversaries'], - label: 'DAGGERHEART.UI.ItemBrowser.folders.adversaries', - type: ['adversary'], - listType: 'adversaries' - }, - ancestries: { - id: 'ancestries', + characters: { + id: 'characters', + keys: ['characters'], + label: 'DAGGERHEART.UI.ItemBrowser.folders.characters', + type: ['character'] + // listType: 'characters' + }, + adversaries: { + id: 'adversaries', + keys: ['adversaries'], + label: 'DAGGERHEART.UI.ItemBrowser.folders.adversaries', + type: ['adversary'], + listType: 'adversaries' + }, + ancestries: { + id: 'ancestries', + keys: ['ancestries'], + label: 'DAGGERHEART.UI.ItemBrowser.folders.ancestries', + type: ['ancestry'] + /* folders: { + features: { + id: 'features', keys: ['ancestries'], - label: 'DAGGERHEART.UI.ItemBrowser.folders.ancestries', - type: ['ancestry'], - folders: { - features: { - id: 'features', - keys: ['ancestries'], - label: 'DAGGERHEART.UI.ItemBrowser.folders.features', - type: ['feature'] - } - } + label: 'DAGGERHEART.UI.ItemBrowser.folders.features', + type: ['feature'] + } + } */ + }, + equipments: { + id: 'equipments', + keys: ['armors', 'weapons', 'consumables', 'loot'], + label: 'DAGGERHEART.UI.ItemBrowser.folders.equipment', + type: ['armor', 'weapon', 'consumable', 'loot'], + listType: 'items', + folders: { + weapons: { + id: 'weapons', + keys: ['weapons'], + label: 'DAGGERHEART.UI.ItemBrowser.folders.weapons', + type: ['weapon'], + listType: 'weapons' }, - equipments: { - id: 'equipments', - keys: ['armors', 'weapons', 'consumables', 'loot'], - label: 'DAGGERHEART.UI.ItemBrowser.folders.equipment', - type: ['armor', 'weapon', 'consumable', 'loot'], - listType: 'items' + armors: { + id: 'armors', + keys: ['armors'], + label: 'DAGGERHEART.UI.ItemBrowser.folders.armors', + type: ['armor'], + listType: 'armors' }, - classes: { - id: 'classes', - keys: ['classes'], - label: 'DAGGERHEART.UI.ItemBrowser.folders.classes', - type: ['class'], - folders: { - features: { - id: 'features', - keys: ['classes'], - label: 'DAGGERHEART.UI.ItemBrowser.folders.features', - type: ['feature'] - }, - items: { - id: 'items', - keys: ['classes'], - label: 'DAGGERHEART.UI.ItemBrowser.folders.items', - type: ['armor', 'weapon', 'consumable', 'loot'], - listType: 'items' - } - }, - listType: 'classes' + consumables: { + id: 'consumables', + keys: ['consumables'], + label: 'DAGGERHEART.UI.ItemBrowser.folders.consumables', + type: ['consumable'] }, - subclasses: { - id: 'subclasses', - keys: ['subclasses'], - label: 'DAGGERHEART.UI.ItemBrowser.folders.subclasses', - type: ['subclass'], - listType: 'subclasses' - }, - domains: { - id: 'domains', - keys: ['domains'], - label: 'DAGGERHEART.UI.ItemBrowser.folders.domainCards', - type: ['domainCard'], - listType: 'cards' - }, - communities: { - id: 'communities', - keys: ['communities'], - label: 'DAGGERHEART.UI.ItemBrowser.folders.communities', - type: ['community'], - folders: { - features: { - id: 'features', - keys: ['communities'], - label: 'DAGGERHEART.UI.ItemBrowser.folders.features', - type: ['feature'] - } - } - }, - environments: { - id: 'environments', - keys: ['environments'], - label: 'DAGGERHEART.UI.ItemBrowser.folders.environments', - type: ['environment'] - }, - beastforms: { - id: 'beastforms', - keys: ['beastforms'], - label: 'DAGGERHEART.UI.ItemBrowser.folders.beastforms', - type: ['beastform'], - listType: 'beastforms', - folders: { - features: { - id: 'features', - keys: ['beastforms'], - label: 'DAGGERHEART.UI.ItemBrowser.folders.features', - type: ['feature'] - } - } + loots: { + id: 'loots', + keys: ['loots'], + label: 'DAGGERHEART.UI.ItemBrowser.folders.loots', + type: ['loot'] } } + }, + classes: { + id: 'classes', + keys: ['classes'], + label: 'DAGGERHEART.UI.ItemBrowser.folders.classes', + type: ['class'], + /* folders: { + features: { + id: 'features', + keys: ['classes'], + label: 'DAGGERHEART.UI.ItemBrowser.folders.features', + type: ['feature'] + }, + items: { + id: 'items', + keys: ['classes'], + label: 'DAGGERHEART.UI.ItemBrowser.folders.items', + type: ['armor', 'weapon', 'consumable', 'loot'], + listType: 'items' + } + }, */ + listType: 'classes' + }, + subclasses: { + id: 'subclasses', + keys: ['subclasses'], + label: 'DAGGERHEART.UI.ItemBrowser.folders.subclasses', + type: ['subclass'], + listType: 'subclasses' + }, + domains: { + id: 'domains', + keys: ['domains'], + label: 'DAGGERHEART.UI.ItemBrowser.folders.domainCards', + type: ['domainCard'], + listType: 'cards' + }, + communities: { + id: 'communities', + keys: ['communities'], + label: 'DAGGERHEART.UI.ItemBrowser.folders.communities', + type: ['community'] + /* folders: { + features: { + id: 'features', + keys: ['communities'], + label: 'DAGGERHEART.UI.ItemBrowser.folders.features', + type: ['feature'] + } + } */ + }, + environments: { + id: 'environments', + keys: ['environments'], + label: 'DAGGERHEART.UI.ItemBrowser.folders.environments', + type: ['environment'] + }, + beastforms: { + id: 'beastforms', + keys: ['beastforms'], + label: 'DAGGERHEART.UI.ItemBrowser.folders.beastforms', + type: ['beastform'], + listType: 'beastforms' + /* folders: { + features: { + id: 'features', + keys: ['beastforms'], + label: 'DAGGERHEART.UI.ItemBrowser.folders.features', + type: ['feature'] + } + } */ + }, + features: { + id: 'features', + keys: ['features'], + label: 'DAGGERHEART.UI.ItemBrowser.folders.features', + type: ['feature'] } }; diff --git a/module/config/itemConfig.mjs b/module/config/itemConfig.mjs index cee4bc52..7e9f75ea 100644 --- a/module/config/itemConfig.mjs +++ b/module/config/itemConfig.mjs @@ -865,6 +865,9 @@ export const weaponFeatures = { name: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.description', img: 'icons/commodities/currency/coins-crown-stack-gold.webp', + target: { + type: 'self' + }, // Should cost handful of gold, effects: [ { diff --git a/module/config/settingsConfig.mjs b/module/config/settingsConfig.mjs index 76234a97..5232cbd9 100644 --- a/module/config/settingsConfig.mjs +++ b/module/config/settingsConfig.mjs @@ -29,3 +29,22 @@ export const gameSettings = { Countdowns: 'Countdowns', LastMigrationVersion: 'LastMigrationVersion' }; + +export const actionAutomationChoices = { + never: { + id: 'never', + label: 'Never' + }, + showDialog: { + id: 'showDialog', + label: 'Show Dialog only' + }, + // npcOnly: { + // id: "npcOnly", + // label: "Always for non-characters" + // }, + always: { + id: 'always', + label: 'Always' + } +}; diff --git a/module/data/action/attackAction.mjs b/module/data/action/attackAction.mjs index 62463d15..68afc23b 100644 --- a/module/data/action/attackAction.mjs +++ b/module/data/action/attackAction.mjs @@ -51,11 +51,13 @@ export default class DHAttackAction extends DHDamageAction { const labels = []; const { roll, range, damage } = this; - if (roll.trait) labels.push(game.i18n.localize(`DAGGERHEART.CONFIG.Traits.${roll.trait}.short`)) + if (roll.trait) labels.push(game.i18n.localize(`DAGGERHEART.CONFIG.Traits.${roll.trait}.short`)); if (range) labels.push(game.i18n.localize(`DAGGERHEART.CONFIG.Range.${range}.short`)); - for (const { value, type } of damage.parts) { - const str = Roll.replaceFormulaData(value.getFormula(), this.actor?.getRollData() ?? {}); + const useAltDamage = this.actor?.effects?.find(x => x.type === 'horde')?.active; + for (const { value, valueAlt, type } of damage.parts) { + const usedValue = useAltDamage ? valueAlt : value; + const str = Roll.replaceFormulaData(usedValue.getFormula(), this.actor?.getRollData() ?? {}); const icons = Array.from(type) .map(t => CONFIG.DH.GENERAL.damageTypes[t]?.icon) diff --git a/module/data/action/baseAction.mjs b/module/data/action/baseAction.mjs index 4a803ae5..93d34700 100644 --- a/module/data/action/baseAction.mjs +++ b/module/data/action/baseAction.mjs @@ -1,14 +1,9 @@ import DhpActor from '../../documents/actor.mjs'; import D20RollDialog from '../../applications/dialogs/d20RollDialog.mjs'; import { ActionMixin } from '../fields/actionField.mjs'; -import { abilities } from '../../config/actorConfig.mjs'; const fields = foundry.data.fields; -/* - !!! I'm currently refactoring the whole Action thing, it's a WIP !!! -*/ - /* ToDo - Target Check / Target Picker @@ -20,6 +15,7 @@ const fields = foundry.data.fields; export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel) { static extraSchemas = ['cost', 'uses', 'range']; + /** @inheritDoc */ static defineSchema() { const schemaFields = { _id: new fields.DocumentIdField({ initial: () => foundry.utils.randomID() }), @@ -37,31 +33,76 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel }; this.extraSchemas.forEach(s => { - let clsField; - if ((clsField = this.getActionField(s))) schemaFields[s] = new clsField(); + let clsField = this.getActionField(s); + if (clsField) schemaFields[s] = new clsField(); }); return schemaFields; } + /** + * Create a Map containing each Action step based on fields define in schema. Ordered by Fields order property. + * + * Each step can be called individually as long as needed config is provided. + * Ex: .workflow.get("damage").execute(config) + * @returns {Map} + */ + defineWorkflow() { + const workflow = new Map(); + this.constructor.extraSchemas.forEach(s => { + let clsField = this.constructor.getActionField(s); + if (clsField?.execute) { + workflow.set(s, { order: clsField.order, execute: clsField.execute.bind(this) }); + if (s === 'damage') + workflow.set('applyDamage', { order: 75, execute: clsField.applyDamage.bind(this) }); + } + }); + return new Map([...workflow.entries()].sort(([aKey, aValue], [bKey, bValue]) => aValue.order - bValue.order)); + } + + /** + * Getter returning the workflow property or creating it the first time the property is called + */ + get workflow() { + if (this.hasOwnProperty('_workflow')) return this._workflow; + const workflow = Object.freeze(this.defineWorkflow()); + Object.defineProperty(this, '_workflow', { value: workflow, writable: false }); + return workflow; + } + + /** + * Get the Field class from ActionFields global config + * @param {string} name Field short name, equal to Action property + * @returns Action Field + */ static getActionField(name) { const field = game.system.api.fields.ActionFields[`${name.capitalize()}Field`]; return fields.DataField.isPrototypeOf(field) && field; } + /** @inheritDoc */ prepareData() { this.name = this.name || game.i18n.localize(CONFIG.DH.ACTIONS.actionTypes[this.type].name); this.img = this.img ?? this.parent?.parent?.img; } + /** + * Get Action ID + */ get id() { return this._id; } + /** + * Return Item the action is attached too. + */ get item() { return this.parent.parent; } + /** + * Return the first Actor parent found. + */ get actor() { return this.item instanceof DhpActor ? this.item @@ -74,6 +115,11 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel return 'trait'; } + /** + * Prepare base data based on Action Type & Parent Type + * @param {object} parent + * @returns {object} + */ static getSourceConfig(parent) { const updateSource = {}; if (parent?.parent?.type === 'weapon' && this === game.system.api.models.actions.actionsTypes.attack) { @@ -96,6 +142,11 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel return updateSource; } + /** + * Obtain a data object used to evaluate any dice rolls associated with this particular Action + * @param {object} [data ={}] Optional data object from previous configuration/rolls + * @returns {object} + */ getRollData(data = {}) { if (!this.actor) return null; const actorData = this.actor.getRollData(false); @@ -111,19 +162,30 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel return actorData; } - async use(event, options = {}) { + /** + * Execute each part of the Action workflow in order, calling a specific event before and after each part. + * @param {object} config Config object usually created from prepareConfig method + */ + async executeWorkflow(config) { + for (const [key, part] of this.workflow) { + if (Hooks.call(`${CONFIG.DH.id}.pre${key.capitalize()}Action`, this, config) === false) return; + if ((await part.execute(config)) === false) return; + if (Hooks.call(`${CONFIG.DH.id}.post${key.capitalize()}Action`, this, config) === false) return; + } + } + + /** + * Main method to use the Action + * @param {Event} event Event from the button used to trigger the Action + * @returns {object} + */ + 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 { byPassRoll } = options, - config = this.prepareConfig(event, byPassRoll); - for (let i = 0; i < this.constructor.extraSchemas.length; i++) { - let clsField = this.constructor.getActionField(this.constructor.extraSchemas[i]); - if (clsField?.prepareConfig) { - const keep = clsField.prepareConfig.call(this, config); - if (config.isFastForward && !keep) return; - } - } + + let config = this.prepareConfig(event); + if (!config) return; if (Hooks.call(`${CONFIG.DH.id}.preUseAction`, this, config) === false) return; @@ -133,274 +195,116 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel if (!config) return; } - if (config.hasRoll) { - const rollConfig = this.prepareRoll(config); - config.roll = rollConfig; - config = await this.actor.diceRoll(config); - if (!config) return; - } - - if (this.doFollowUp(config)) { - if (this.rollDamage && this.damage.parts.length) await this.rollDamage(event, config); - else if (this.trigger) await this.trigger(event, config); - else if (this.hasSave || this.hasEffect) { - const roll = new CONFIG.Dice.daggerheart.DHRoll(''); - roll._evaluated = true; - await CONFIG.Dice.daggerheart.DHRoll.toMessage(roll, config); - } - } - - // Consume resources - await this.consume(config); + // Execute the Action Worflow in order based of schema fields + await this.executeWorkflow(config); if (Hooks.call(`${CONFIG.DH.id}.postUseAction`, this, config) === false) return; return config; } - /* */ - prepareConfig(event, byPass = false) { - const hasRoll = this.getUseHasRoll(byPass); - return { + /** + * Create the basic config common to every action type + * @param {Event} event Event from the button used to trigger the Action + * @returns {object} + */ + prepareBaseConfig(event) { + const config = { event, - title: `${this.item.name}: ${game.i18n.localize(this.name)}`, + title: `${this.item instanceof CONFIG.Actor.documentClass ? '' : `${this.item.name}: `}${game.i18n.localize(this.name)}`, source: { item: this.item._id, action: this._id, actor: this.actor.uuid }, - dialog: { - configure: hasRoll - }, - type: this.type, - hasRoll: hasRoll, - hasDamage: this.damage?.parts?.length && this.type !== 'healing', - hasHealing: this.damage?.parts?.length && this.type === 'healing', - hasEffect: !!this.effects?.length, - isDirect: !!this.damage?.direct, + dialog: {}, + actionType: this.actionType, + hasRoll: this.hasRoll, + hasDamage: this.hasDamage, + hasHealing: this.hasHealing, + hasEffect: this.hasEffect, hasSave: this.hasSave, + isDirect: !!this.damage?.direct, selectedRollMode: game.settings.get('core', 'rollMode'), - isFastForward: event.shiftKey, data: this.getRollData(), - evaluate: hasRoll + evaluate: this.hasRoll }; + DHBaseAction.applyKeybindings(config); + return config; } + /** + * Create the config for that action used for its workflow + * @param {Event} event Event from the button used to trigger the Action + * @returns {object} + */ + prepareConfig(event) { + const config = this.prepareBaseConfig(event); + for (const clsField of Object.values(this.schema.fields)) { + if (clsField?.prepareConfig) if (clsField.prepareConfig.call(this, config) === false) return false; + } + return config; + } + + /** + * Method used to know if a configuration dialog must be shown or not when there is no roll. + * @param {*} config Object that contains workflow datas. Usually made from Action Fields prepareConfig methods. + * @returns {boolean} + */ requireConfigurationDialog(config) { return !config.event.shiftKey && !config.hasRoll && (config.costs?.length || config.uses); } - prepareRoll() { - const roll = { - baseModifiers: this.roll.getModifier(), - label: 'Attack', - type: this.actionType, - difficulty: this.roll?.difficulty, - formula: this.roll.getFormula(), - advantage: CONFIG.DH.ACTIONS.advantageState[this.roll.advState].value - }; - if (this.roll?.type === 'diceSet' || !this.hasRoll) roll.lite = true; - - return roll; - } - - doFollowUp(config) { - return !config.hasRoll; - } - + /** + * Consume Action configured resources & uses. + * That method is only used when we want those resources to be consumed outside of the use method workflow. + * @param {object} config Object that contains workflow datas. Usually made from Action Fields prepareConfig methods. + * @param {boolean} successCost + */ async consume(config, successCost = false) { - const actor = this.actor.system.partner ?? this.actor, - usefulResources = { - ...foundry.utils.deepClone(actor.system.resources), - fear: { - value: game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Resources.Fear), - max: game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).maxFear, - reversed: false - } - }; + await this.workflow.get('cost')?.execute(config, successCost); + await this.workflow.get('uses')?.execute(config, successCost); - for (var cost of config.costs) { - if (cost.keyIsID) { - usefulResources[cost.key] = { - value: cost.value, - target: this.parent.parent, - keyIsID: true - }; - } - } - - const resources = game.system.api.fields.ActionFields.CostField.getRealCosts(config.costs) - .filter( - c => - (!successCost && (!c.consumeOnSuccess || config.roll?.success)) || - (successCost && c.consumeOnSuccess) - ) - .reduce((a, c) => { - const resource = usefulResources[c.key]; - if (resource) { - a.push({ - key: c.key, - value: (c.total ?? c.value) * (resource.isReversed ? 1 : -1), - target: resource.target, - keyIsID: resource.keyIsID - }); - return a; - } - }, []); - - await actor.modifyResource(resources); - if ( - config.uses?.enabled && - ((!successCost && (!config.uses?.consumeOnSuccess || config.roll?.success)) || - (successCost && config.uses?.consumeOnSuccess)) - ) - this.update({ 'uses.value': this.uses.value + 1 }); - - if (config.roll?.success || successCost) { + if (config.roll && !config.roll.success && successCost) { setTimeout(() => { (config.message ?? config.parent).update({ 'system.successConsumed': true }); }, 50); } } - /* */ - /* ROLL */ - getUseHasRoll(byPass = false) { - return this.hasRoll && !byPass; + /** + * Set if a configuration dialog must be shown or not if a special keyboard key is pressed. + * @param {object} config Object that contains workflow datas. Usually made from Action Fields prepareConfig methods. + */ + static applyKeybindings(config) { + config.dialog.configure ??= !(config.event.shiftKey || config.event.altKey || config.event.ctrlKey); } + /** + * Getters to know which parts the action is composed of. A field can exist but configured to not be used. + * @returns {boolean} If that part is in the action. + */ + get hasRoll() { return !!this.roll?.type; } - get modifiers() { - if (!this.actor) return []; - const modifiers = []; - /** Placeholder for specific bonuses **/ - return modifiers; + get hasDamage() { + return this.damage?.parts?.length && this.type !== 'healing'; + } + + get hasHealing() { + return this.damage?.parts?.length && this.type === 'healing'; } - /* ROLL */ - /* SAVE */ get hasSave() { return !!this.save?.trait; } - /* SAVE */ - /* EFFECTS */ get hasEffect() { return this.effects?.length > 0; } - async applyEffects(event, data, targets) { - targets ??= data.system.targets; - const force = true; /* Where should this come from? */ - if (!this.effects?.length || !targets.length) return; - let effects = this.effects; - targets.forEach(async token => { - if (!token.hit && !force) return; - if (this.hasSave && token.saved.success === true) { - effects = this.effects.filter(e => e.onSave === true); - } - if (!effects.length) return; - effects.forEach(async e => { - const actor = canvas.tokens.get(token.id)?.actor, - effect = this.item.effects.get(e._id); - if (!actor || !effect) return; - await this.applyEffect(effect, actor); - }); - }); - } - - async applyEffect(effect, actor) { - const existingEffect = actor.effects.find(e => e.origin === effect.uuid); - if (existingEffect) { - return effect.update( - foundry.utils.mergeObject({ - ...effect.constructor.getInitialDuration(), - disabled: false - }) - ); - } - - // Otherwise, create a new effect on the target - const effectData = foundry.utils.mergeObject({ - ...effect.toObject(), - disabled: false, - transfer: false, - origin: effect.uuid - }); - await ActiveEffect.implementation.create(effectData, { parent: actor }); - } - /* EFFECTS */ - - /* SAVE */ - async rollSave(actor, event, message) { - if (!actor) return; - const title = actor.isNPC - ? game.i18n.localize('DAGGERHEART.GENERAL.reactionRoll') - : game.i18n.format('DAGGERHEART.UI.Chat.dualityRoll.abilityCheckTitle', { - ability: game.i18n.localize(abilities[this.save.trait]?.label) - }); - return actor.diceRoll({ - event, - title, - roll: { - trait: this.save.trait, - difficulty: this.save.difficulty ?? this.actor?.baseSaveDifficulty, - type: 'reaction' - }, - type: 'trait', - hasRoll: true, - data: actor.getRollData() - }); - } - - updateSaveMessage(result, message, targetId) { - if (!result) return; - const updateMsg = this.updateChatMessage.bind(this, message, targetId, { - result: result.roll.total, - success: result.roll.success - }); - if (game.modules.get('dice-so-nice')?.active) - game.dice3d.waitFor3DAnimationByMessageID(result.message.id ?? result.message._id).then(() => updateMsg()); - else updateMsg(); - } - - static rollSaveQuery({ actionId, actorId, event, message }) { - return new Promise(async (resolve, reject) => { - const actor = await fromUuid(actorId), - action = await fromUuid(actionId); - if (!actor || !actor?.isOwner) reject(); - action.rollSave(actor, event, message).then(result => resolve(result)); - }); - } - /* SAVE */ - - async updateChatMessage(message, targetId, changes, chain = true) { - setTimeout(async () => { - const chatMessage = ui.chat.collection.get(message._id); - - await chatMessage.update({ - flags: { - [game.system.id]: { - reactionRolls: { - [targetId]: changes - } - } - } - }); - }, 100); - if (chain) { - if (message.system.source.message) - this.updateChatMessage(ui.chat.collection.get(message.system.source.message), targetId, changes, false); - const relatedChatMessages = ui.chat.collection.filter(c => c.system.source?.message === message._id); - relatedChatMessages.forEach(c => { - this.updateChatMessage(c, targetId, changes, false); - }); - } - } - /** * Generates a list of localized tags for this action. * @returns {string[]} An array of localized tag strings. diff --git a/module/data/action/beastformAction.mjs b/module/data/action/beastformAction.mjs index 8c2dd31e..657cfde2 100644 --- a/module/data/action/beastformAction.mjs +++ b/module/data/action/beastformAction.mjs @@ -1,10 +1,9 @@ -import BeastformDialog from '../../applications/dialogs/beastformDialog.mjs'; import DHBaseAction from './baseAction.mjs'; export default class DhBeastformAction extends DHBaseAction { static extraSchemas = [...super.extraSchemas, 'beastform']; - async use(event, options) { + /* async use(event, options) { const beastformConfig = this.prepareBeastformConfig(); const abort = await this.handleActiveTransformations(); @@ -82,5 +81,5 @@ export default class DhBeastformAction extends DHBaseAction { beastformEffects.map(x => x.id) ); return existingEffects; - } + } */ } diff --git a/module/data/action/damageAction.mjs b/module/data/action/damageAction.mjs index 7deeb006..b4b3e17c 100644 --- a/module/data/action/damageAction.mjs +++ b/module/data/action/damageAction.mjs @@ -1,65 +1,5 @@ -import { setsEqual } from '../../helpers/utils.mjs'; import DHBaseAction from './baseAction.mjs'; export default class DHDamageAction extends DHBaseAction { static extraSchemas = [...super.extraSchemas, 'damage', 'target', 'effects']; - - getFormulaValue(part, data) { - let formulaValue = part.value; - - if (data.hasRoll && part.resultBased && data.roll.result.duality === -1) return part.valueAlt; - - const isAdversary = this.actor.type === 'adversary'; - if (isAdversary && this.actor.system.type === CONFIG.DH.ACTOR.adversaryTypes.horde.id) { - const hasHordeDamage = this.actor.effects.find(x => x.type === 'horde'); - if (hasHordeDamage && !hasHordeDamage.disabled) return part.valueAlt; - } - - return formulaValue; - } - - formatFormulas(formulas, systemData) { - const formattedFormulas = []; - formulas.forEach(formula => { - if (isNaN(formula.formula)) - formula.formula = Roll.replaceFormulaData(formula.formula, this.getRollData(systemData)); - const same = formattedFormulas.find( - f => setsEqual(f.damageTypes, formula.damageTypes) && f.applyTo === formula.applyTo - ); - if (same) same.formula += ` + ${formula.formula}`; - else formattedFormulas.push(formula); - }); - return formattedFormulas; - } - - async rollDamage(event, data) { - const systemData = data.system ?? data; - - let formulas = this.damage.parts.map(p => ({ - formula: this.getFormulaValue(p, systemData).getFormula(this.actor), - damageTypes: p.applyTo === 'hitPoints' && !p.type.size ? new Set(['physical']) : p.type, - applyTo: p.applyTo - })); - - if (!formulas.length) return; - - formulas = this.formatFormulas(formulas, systemData); - - delete systemData.evaluate; - const config = { - ...systemData, - roll: formulas, - dialog: {}, - data: this.getRollData() - }; - if (this.hasSave) config.onSave = this.save.damageMod; - if (data.system) { - config.source.message = data._id; - config.directDamage = false; - } else { - config.directDamage = true; - } - - return CONFIG.Dice.daggerheart.DamageRoll.build(config); - } } diff --git a/module/data/action/macroAction.mjs b/module/data/action/macroAction.mjs index 58b8eba5..b8338cd8 100644 --- a/module/data/action/macroAction.mjs +++ b/module/data/action/macroAction.mjs @@ -2,15 +2,4 @@ import DHBaseAction from './baseAction.mjs'; export default class DHMacroAction extends DHBaseAction { static extraSchemas = [...super.extraSchemas, 'macro']; - - async trigger(event, ...args) { - const fixUUID = !this.macro.includes('Macro.') ? `Macro.${this.macro}` : this.macro, - macro = await fromUuid(fixUUID); - try { - if (!macro) throw new Error(`No macro found for the UUID: ${this.macro}.`); - macro.execute(); - } catch (error) { - ui.notifications.error(error); - } - } } diff --git a/module/data/actor/adversary.mjs b/module/data/actor/adversary.mjs index ba0693f7..00c40baf 100644 --- a/module/data/actor/adversary.mjs +++ b/module/data/actor/adversary.mjs @@ -130,7 +130,7 @@ export default class DhpAdversary extends BaseDataActor { CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation ).hordeDamage; - if (autoHordeDamage && changes.system?.resources?.hitPoints?.value) { + if (autoHordeDamage && changes.system?.resources?.hitPoints?.value !== undefined) { const hordeActiveEffect = this.parent.effects.find(x => x.type === 'horde'); if (hordeActiveEffect) { const halfHP = Math.ceil(this.resources.hitPoints.max / 2); diff --git a/module/data/actor/base.mjs b/module/data/actor/base.mjs index 2b74bf1c..9653cd6d 100644 --- a/module/data/actor/base.mjs +++ b/module/data/actor/base.mjs @@ -130,11 +130,16 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel { const typeForDefeated = ['character', 'adversary', 'companion'].find(x => x === this.parent.type); if (defeatedSettings.enabled && typeForDefeated) { const resource = typeForDefeated === 'companion' ? 'stress' : 'hitPoints'; - if (changes.system.resources[resource]) { - const becameMax = changes.system.resources[resource].value === this.resources[resource].max; + const resourceValue = changes.system.resources[resource]; + if ( + resourceValue && + this.resources[resource].max && + resourceValue.value !== this.resources[resource].value + ) { + const becameMax = resourceValue.value === this.resources[resource].max; const wasMax = this.resources[resource].value === this.resources[resource].max && - this.resources[resource].value !== changes.system.resources[resource].value; + this.resources[resource].value !== resourceValue.value; if (becameMax) { this.parent.toggleDefeated(true); } else if (wasMax) { diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs index 7dd7993c..ddcc5bf5 100644 --- a/module/data/actor/character.mjs +++ b/module/data/actor/character.mjs @@ -317,7 +317,7 @@ export default class DhCharacter extends BaseDataActor { } get multiclass() { - const value = this.parent.items.find(x => x.type === 'Class' && x.system.isMulticlass); + const value = this.parent.items.find(x => x.type === 'class' && x.system.isMulticlass); const subclass = this.parent.items.find(x => x.type === 'subclass' && x.system.isMulticlass); return { @@ -443,7 +443,9 @@ export default class DhCharacter extends BaseDataActor { classFeatures.push(item); } else if (item.system.originItemType === CONFIG.DH.ITEM.featureTypes.subclass.id) { if (this.class.subclass) { - const subclassState = this.class.subclass.system.featureState; + 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 || diff --git a/module/data/chat-message/_modules.mjs b/module/data/chat-message/_modules.mjs index a4e2c1fd..7e301906 100644 --- a/module/data/chat-message/_modules.mjs +++ b/module/data/chat-message/_modules.mjs @@ -1,9 +1,9 @@ -import DHAbilityUse from "./abilityUse.mjs"; -import DHActorRoll from "./adversaryRoll.mjs"; +import DHAbilityUse from './abilityUse.mjs'; +import DHActorRoll from './actorRoll.mjs'; export const config = { - abilityUse: DHAbilityUse, - adversaryRoll: DHActorRoll, - damageRoll: DHActorRoll, - dualityRoll: DHActorRoll + abilityUse: DHAbilityUse, + adversaryRoll: DHActorRoll, + damageRoll: DHActorRoll, + dualityRoll: DHActorRoll }; diff --git a/module/data/chat-message/adversaryRoll.mjs b/module/data/chat-message/actorRoll.mjs similarity index 90% rename from module/data/chat-message/adversaryRoll.mjs rename to module/data/chat-message/actorRoll.mjs index 4431f87d..a2cb03f9 100644 --- a/module/data/chat-message/adversaryRoll.mjs +++ b/module/data/chat-message/actorRoll.mjs @@ -55,9 +55,12 @@ export default class DHActorRoll extends foundry.abstract.TypeDataModel { } get action() { - const actionItem = this.actionItem; - if (!actionItem || !this.source.action) return null; - return actionItem.system.actionsList?.find(a => a.id === this.source.action); + const actionActor = this.actionActor, + actionItem = this.actionItem; + if (!this.source.action) return null; + if (actionItem) return actionItem.system.actionsList?.find(a => a.id === this.source.action); + else if (actionActor?.system.attack?._id === this.source.action) return actionActor.system.attack; + return null; } get targetMode() { @@ -95,7 +98,7 @@ export default class DHActorRoll extends foundry.abstract.TypeDataModel { } registerTargetHook() { - if (!this.parent.isAuthor) return; + if (!this.parent.isAuthor || !this.hasTarget) return; if (this.targetMode && this.parent.targetHook !== null) { Hooks.off('targetToken', this.parent.targetHook); return (this.parent.targetHook = null); @@ -113,7 +116,7 @@ export default class DHActorRoll extends foundry.abstract.TypeDataModel { this.currentTargets = this.getTargetList(); // this.registerTargetHook(); - if (this.targetMode === true && this.hasRoll) { + if (this.hasRoll) { this.targetShort = this.targets.reduce( (a, c) => { if (c.hit) a.hit += 1; @@ -127,7 +130,8 @@ export default class DHActorRoll extends foundry.abstract.TypeDataModel { } this.canViewSecret = this.parent.speakerActor?.testUserPermission(game.user, 'OBSERVER'); - this.canButtonApply = game.user.isGM; + this.canButtonApply = game.user.isGM; //temp + this.isGM = game.user.isGM; //temp } getTargetList() { diff --git a/module/data/fields/action/_module.mjs b/module/data/fields/action/_module.mjs index e6caa963..7a33e147 100644 --- a/module/data/fields/action/_module.mjs +++ b/module/data/fields/action/_module.mjs @@ -6,6 +6,5 @@ export { default as EffectsField } from './effectsField.mjs'; export { default as SaveField } from './saveField.mjs'; export { default as BeastformField } from './beastformField.mjs'; export { default as DamageField } from './damageField.mjs'; -export { default as HealingField } from './healingField.mjs'; export { default as RollField } from './rollField.mjs'; export { default as MacroField } from './macroField.mjs'; diff --git a/module/data/fields/action/beastformField.mjs b/module/data/fields/action/beastformField.mjs index 832bd9f6..0a1caea9 100644 --- a/module/data/fields/action/beastformField.mjs +++ b/module/data/fields/action/beastformField.mjs @@ -1,6 +1,13 @@ +import BeastformDialog from '../../../applications/dialogs/beastformDialog.mjs'; + const fields = foundry.data.fields; export default class BeastformField extends fields.SchemaField { + /** + * Action Workflow order + */ + static order = 90; + constructor(options = {}, context = {}) { const beastformFields = { tierAccess: new fields.SchemaField({ @@ -27,4 +34,96 @@ export default class BeastformField extends fields.SchemaField { }; super(beastformFields, options, context); } + + /** + * Beastform Transformation Action Workflow part. + * Must be called within Action context or similar. + * @param {object} config Object that contains workflow datas. Usually made from Action Fields prepareConfig methods. + */ + static async execute(config) { + // Should not be useful anymore here + await BeastformField.handleActiveTransformations.call(this); + + const { selected, evolved, hybrid } = await BeastformDialog.configure(config, this.item); + if (!selected) return false; + + return await BeastformField.transform.call(this, selected, evolved, hybrid); + } + + /** + * Update Action Workflow config object. + * Must be called within Action context. + * @param {object} config Object that contains workflow datas. Usually made from Action Fields prepareConfig methods. + */ + prepareConfig(config) { + if (this.actor.effects.find(x => x.type === 'beastform')) { + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.beastformAlreadyApplied')); + return false; + } + + const settingsTiers = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.LevelTiers).tiers; + const actorLevel = this.actor.system.levelData.level.current; + const actorTier = + Object.values(settingsTiers).find( + tier => actorLevel >= tier.levels.start && actorLevel <= tier.levels.end + ) ?? 1; + + config.tierLimit = this.beastform.tierAccess.exact ?? actorTier; + } + + /** + * TODO by Harry + * @param {*} selectedForm + * @param {*} evolvedData + * @param {*} hybridData + * @returns + */ + static async transform(selectedForm, evolvedData, hybridData) { + const formData = evolvedData?.form ? evolvedData.form.toObject() : selectedForm.toObject(); + const beastformEffect = formData.effects.find(x => x.type === 'beastform'); + if (!beastformEffect) { + ui.notifications.error('DAGGERHEART.UI.Notifications.beastformMissingEffect'); + return false; + } + + if (evolvedData?.form) { + const evolvedForm = selectedForm.effects.find(x => x.type === 'beastform'); + if (!evolvedForm) { + ui.notifications.error('DAGGERHEART.UI.Notifications.beastformMissingEffect'); + return false; + } + + beastformEffect.changes = [...beastformEffect.changes, ...evolvedForm.changes]; + formData.system.features = [...formData.system.features, ...selectedForm.system.features.map(x => x.uuid)]; + } + + if (selectedForm.system.beastformType === CONFIG.DH.ITEM.beastformTypes.hybrid.id) { + formData.system.advantageOn = Object.values(hybridData.advantages).reduce((advantages, formCategory) => { + Object.keys(formCategory).forEach(advantageKey => { + advantages[advantageKey] = formCategory[advantageKey]; + }); + return advantages; + }, {}); + formData.system.features = [ + ...formData.system.features, + ...Object.values(hybridData.features).flatMap(x => Object.keys(x)) + ]; + } + + this.actor.createEmbeddedDocuments('Item', [formData]); + } + + /** + * Remove existing beastform effect and return true if there was one + * @returns {boolean} + */ + static async handleActiveTransformations() { + const beastformEffects = this.actor.effects.filter(x => x.type === 'beastform'); + const existingEffects = beastformEffects.length > 0; + await this.actor.deleteEmbeddedDocuments( + 'ActiveEffect', + beastformEffects.map(x => x.id) + ); + return existingEffects; + } } diff --git a/module/data/fields/action/costField.mjs b/module/data/fields/action/costField.mjs index c224fff0..e8ecf79b 100644 --- a/module/data/fields/action/costField.mjs +++ b/module/data/fields/action/costField.mjs @@ -1,6 +1,12 @@ const fields = foundry.data.fields; export default class CostField extends fields.ArrayField { + /** + * Action Workflow order + */ + static order = 150; + + /** @inheritDoc */ constructor(options = {}, context = {}) { const element = new fields.SchemaField({ key: new fields.StringField({ @@ -8,7 +14,7 @@ export default class CostField extends fields.ArrayField { required: true, initial: 'hope' }), - keyIsID: new fields.BooleanField(), + itemId: new fields.StringField({ nullable: true, initial: null }), value: new fields.NumberField({ nullable: true, initial: 1, min: 0 }), scalable: new fields.BooleanField({ initial: false }), step: new fields.NumberField({ nullable: true, initial: null }), @@ -20,18 +26,88 @@ export default class CostField extends fields.ArrayField { super(element, options, context); } - static prepareConfig(config) { + /** + * Cost Consumption Action Workflow part. + * Consume configured action resources. + * Must be called within Action context or similar. + * @param {object} config Object that contains workflow datas. Usually made from Action Fields prepareConfig methods. + * @param {boolean} [successCost=false] Consume only resources configured as "On Success only" if not already consumed. + */ + static async execute(config, successCost = false) { + const actor = this.actor.system.partner ?? this.actor, + usefulResources = { + ...foundry.utils.deepClone(actor.system.resources), + fear: { + value: game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Resources.Fear), + max: game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).maxFear, + reversed: false + } + }; + + if (this.parent?.parent) { + for (var cost of config.costs) { + if (cost.itemId) { + usefulResources[cost.key] = { + value: cost.value, + target: this.parent.parent, + itemId: cost.itemId + }; + } + } + } + + const resources = CostField.getRealCosts(config.costs) + .filter( + c => + (!successCost && (!c.consumeOnSuccess || config.roll?.success)) || + (successCost && c.consumeOnSuccess) + ) + .reduce((a, c) => { + const resource = usefulResources[c.key]; + if (resource) { + a.push({ + key: c.key, + value: (c.total ?? c.value) * (resource.isReversed ? 1 : -1), + target: resource.target, + itemId: resource.itemId + }); + return a; + } + }, []); + + await actor.modifyResource(resources); + } + + /** + * Update Action Workflow config object. + * Must be called within Action context or similar. + * @param {object} config Object that contains workflow datas. Usually made from Action Fields prepareConfig methods. + * @returns {boolean} Return false if fast-forwarded and no more uses. + */ + prepareConfig(config) { const costs = this.cost?.length ? foundry.utils.deepClone(this.cost) : []; config.costs = CostField.calcCosts.call(this, costs); const hasCost = CostField.hasCost.call(this, config.costs); - if (config.isFastForward && !hasCost) - return ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.insufficientResources')); - return hasCost; + if (config.dialog.configure === false && !hasCost) { + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.insufficientResources')); + return hasCost; + } } + /** + * + * Must be called within Action context. + * @param {*} costs + * @returns + */ static calcCosts(costs) { const resources = CostField.getResources.call(this, costs); - return costs.map(c => { + let filteredCosts = costs; + if (this.parent.metadata.isQuantifiable && this.parent.consumeOnUse === false) { + filteredCosts = filteredCosts.filter(c => c.key !== 'quantity'); + } + + return filteredCosts.map(c => { c.scale = c.scale ?? 0; c.step = c.step ?? 1; c.total = c.value + c.scale * c.step; @@ -40,13 +116,19 @@ export default class CostField extends fields.ArrayField { c.key === 'fear' ? game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Resources.Fear) : resources[c.key].isReversed - ? resources[c.key].max + ? resources[c.key].max - resources[c.key].value : resources[c.key].value; if (c.scalable) c.maxStep = Math.floor((c.max - c.value) / c.step); return c; }); } + /** + * Check if the current Actor currently has all needed resources. + * Must be called within Action context. + * @param {*} costs + * @returns {boolean} + */ static hasCost(costs) { const realCosts = CostField.getRealCosts.call(this, costs), hasFearCost = realCosts.findIndex(c => c.key === 'fear'); @@ -73,17 +155,20 @@ export default class CostField extends fields.ArrayField { ); } + /** + * Get all Actor resources + parent Item potential one. + * Must be called within Action context. + * @param {*} costs + * @returns + */ static getResources(costs) { const actorResources = foundry.utils.deepClone(this.actor.system.resources); if (this.actor.system.partner) actorResources.hope = foundry.utils.deepClone(this.actor.system.partner.system.resources.hope); const itemResources = {}; for (let itemResource of costs) { - if (itemResource.keyIsID) { - itemResources[itemResource.key] = { - value: this.parent.resource.value ?? 0, - max: CostField.formatMax.call(this, this.parent?.resource?.max) - }; + if (itemResource.itemId) { + itemResources[itemResource.key] = CostField.getItemIdCostResource.bind(this)(itemResource); } } @@ -93,6 +178,45 @@ export default class CostField extends fields.ArrayField { }; } + static getItemIdCostResource(itemResource) { + switch (itemResource.key) { + case CONFIG.DH.GENERAL.itemAbilityCosts.resource.id: + return { + value: this.parent.resource.value ?? 0, + max: CostField.formatMax.call(this, this.parent?.resource?.max) + }; + case CONFIG.DH.GENERAL.itemAbilityCosts.quantity.id: + return { + value: this.parent.quantity ?? 0, + max: this.parent.quantity ?? 0 + }; + default: + return { value: 0, max: 0 }; + } + } + + static getItemIdCostUpdate(r) { + switch (r.key) { + case CONFIG.DH.GENERAL.itemAbilityCosts.resource.id: + return { + path: 'system.resource.value', + value: r.target.system.resource.value + r.value + }; + case CONFIG.DH.GENERAL.itemAbilityCosts.quantity.id: + return { + path: 'system.quantity', + value: r.target.system.quantity + r.value + }; + default: + return { path: '', value: undefined }; + } + } + + /** + * + * @param {*} costs + * @returns + */ static getRealCosts(costs) { const realCosts = costs?.length ? costs.filter(c => c.enabled) : []; let mergedCosts = []; @@ -104,6 +228,12 @@ export default class CostField extends fields.ArrayField { return mergedCosts; } + /** + * Format scalable max cost, inject Action datas if it's a formula. + * Must be called within Action context. + * @param {number|string} max Configured maximum for that resource. + * @returns {number} The max cost value. + */ static formatMax(max) { max ??= 0; if (isNaN(max)) { diff --git a/module/data/fields/action/damageField.mjs b/module/data/fields/action/damageField.mjs index 4b4dee7d..bab46d52 100644 --- a/module/data/fields/action/damageField.mjs +++ b/module/data/fields/action/damageField.mjs @@ -1,8 +1,15 @@ import FormulaField from '../formulaField.mjs'; +import { setsEqual } from '../../../helpers/utils.mjs'; const fields = foundry.data.fields; export default class DamageField extends fields.SchemaField { + /** + * Action Workflow order + */ + static order = 20; + + /** @inheritDoc */ constructor(options, context = {}) { const damageFields = { parts: new fields.ArrayField(new fields.EmbeddedDataField(DHDamageData)), @@ -14,6 +21,152 @@ export default class DamageField extends fields.SchemaField { }; super(damageFields, options, context); } + + /** + * Roll Damage/Healing Action Workflow part. + * Must be called within Action context or similar. + * @param {object} config Object that contains workflow datas. Usually made from Action Fields prepareConfig methods. + * @param {string} [messageId=null] ChatMessage Id where the clicked button belong. + * @param {boolean} [force=false] If the method should be executed outside of Action workflow, for ChatMessage button for example. + */ + static async execute(config, messageId = null, force = false) { + if (!this.hasDamage && !this.hasHealing) return; + if ( + this.hasRoll && + DamageField.getAutomation() === CONFIG.DH.SETTINGS.actionAutomationChoices.never.id && + !force + ) + return; + + let formulas = this.damage.parts.map(p => ({ + formula: DamageField.getFormulaValue.call(this, p, config).getFormula(this.actor), + damageTypes: p.applyTo === 'hitPoints' && !p.type.size ? new Set(['physical']) : p.type, + applyTo: p.applyTo + })); + + if (!formulas.length) return false; + + formulas = DamageField.formatFormulas.call(this, formulas, config); + + const damageConfig = { + ...config, + roll: formulas, + dialog: {}, + data: this.getRollData() + }; + delete damageConfig.evaluate; + + if (DamageField.getAutomation() === CONFIG.DH.SETTINGS.actionAutomationChoices.always.id) + damageConfig.dialog.configure = false; + if (config.hasSave) config.onSave = damageConfig.onSave = this.save.damageMod; + + damageConfig.source.message = config.message?._id ?? messageId; + damageConfig.directDamage = !!damageConfig.source?.message; + + // if(damageConfig.source?.message && game.modules.get('dice-so-nice')?.active) + // await game.dice3d.waitFor3DAnimationByMessageID(damageConfig.source.message); + + const damageResult = await CONFIG.Dice.daggerheart.DamageRoll.build(damageConfig); + if (!damageResult) return false; + config.damage = damageResult.damage; + config.message ??= damageConfig.message; + } + + /** + * Apply Damage/Healing Action Worflow part. + * @param {object} config Object that contains workflow datas. Usually made from Action Fields prepareConfig methods. + * @param {*[]} targets Arrays of targets to bypass pre-selected ones. + * @param {boolean} force If the method should be executed outside of Action workflow, for ChatMessage button for example. + */ + static async applyDamage(config, targets = null, force = false) { + targets ??= config.targets.filter(target => target.hit); + if (!config.damage || !targets?.length || (!DamageField.getApplyAutomation() && !force)) return; + for (let target of targets) { + const actor = fromUuidSync(target.actorId); + if (!actor) continue; + if (!config.hasHealing && config.onSave && target.saved?.success === true) { + const mod = CONFIG.DH.ACTIONS.damageOnSave[config.onSave]?.mod ?? 1; + Object.entries(config.damage).forEach(([k, v]) => { + v.total = 0; + v.parts.forEach(part => { + part.total = Math.ceil(part.total * mod); + v.total += part.total; + }); + }); + } + + if (config.hasHealing) actor.takeHealing(config.damage); + else actor.takeDamage(config.damage, config.isDirect); + } + } + + /** + * Return value or valueAlt from damage part + * Must be called within Action context or similar. + * @param {object} part Damage Part + * @param {object} data Action getRollData + * @returns Formula value object + */ + static getFormulaValue(part, data) { + let formulaValue = part.value; + + if (data.hasRoll && part.resultBased && data.roll.result.duality === -1) return part.valueAlt; + + const isAdversary = this.actor.type === 'adversary'; + if (isAdversary && this.actor.system.type === CONFIG.DH.ACTOR.adversaryTypes.horde.id) { + const hasHordeDamage = this.actor.effects.find(x => x.type === 'horde'); + if (hasHordeDamage && !hasHordeDamage.disabled) return part.valueAlt; + } + + return formulaValue; + } + + /** + * Prepare formulas for Damage Roll + * Must be called within Action context or similar. + * @param {object[]} formulas Array of formatted formulas object + * @param {object} data Action getRollData + * @returns + */ + static formatFormulas(formulas, data) { + const formattedFormulas = []; + formulas.forEach(formula => { + if (isNaN(formula.formula)) + formula.formula = Roll.replaceFormulaData(formula.formula, this.getRollData(data)); + const same = formattedFormulas.find( + f => setsEqual(f.damageTypes, formula.damageTypes) && f.applyTo === formula.applyTo + ); + if (same) same.formula += ` + ${formula.formula}`; + else formattedFormulas.push(formula); + }); + return formattedFormulas; + } + + /** + * Return the automation setting for execute method for current user role + * @returns {string} Id from settingsConfig.mjs actionAutomationChoices + */ + static getAutomation() { + return ( + (game.user.isGM && + game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).roll.damage.gm) || + (!game.user.isGM && + game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).roll.damage.players) + ); + } + + /** + * Return the automation setting for applyDamage method for current user role + * @returns {boolean} If applyDamage should be triggered automatically + */ + static getApplyAutomation() { + return ( + (game.user.isGM && + game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).roll.damageApply.gm) || + (!game.user.isGM && + game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).roll.damageApply.players) + ); + } } export class DHActionDiceData extends foundry.abstract.DataModel { diff --git a/module/data/fields/action/effectsField.mjs b/module/data/fields/action/effectsField.mjs index ddc69d2d..0f205d72 100644 --- a/module/data/fields/action/effectsField.mjs +++ b/module/data/fields/action/effectsField.mjs @@ -1,6 +1,14 @@ +import { emitAsGM, GMUpdateEvent } from '../../../systemRegistration/socket.mjs'; + const fields = foundry.data.fields; export default class EffectsField extends fields.ArrayField { + /** + * Action Workflow order + */ + static order = 100; + + /** @inheritDoc */ constructor(options = {}, context = {}) { const element = new fields.SchemaField({ _id: new fields.DocumentIdField(), @@ -8,4 +16,85 @@ export default class EffectsField extends fields.ArrayField { }); super(element, options, context); } + + /** + * Apply Effects Action Workflow part. + * Must be called within Action context or similar. + * @param {object} config Object that contains workflow datas. Usually made from Action Fields prepareConfig methods. + * @param {object[]} [targets=null] Array of targets to override pre-selected ones. + * @param {boolean} [force=false] If the method should be executed outside of Action workflow, for ChatMessage button for example. + */ + static async execute(config, targets = null, force = false) { + if (!config.hasEffect) return; + let message = config.message ?? ui.chat.collection.get(config.parent?._id); + if (!message) { + const roll = new CONFIG.Dice.daggerheart.DHRoll(''); + roll._evaluated = true; + message = config.message = await CONFIG.Dice.daggerheart.DHRoll.toMessage(roll, config); + } + if (EffectsField.getAutomation() || force) { + targets ??= (message.system?.targets ?? config.targets).filter(t => !config.hasRoll || t.hit); + await emitAsGM(GMUpdateEvent.UpdateEffect, EffectsField.applyEffects.bind(this), targets, this.uuid); + // EffectsField.applyEffects.call(this, config.targets.filter(t => !config.hasRoll || t.hit)); + } + } + + /** + * Apply Action Effects to a list of Targets + * Must be called within Action context or similar. + * @param {object[]} targets Array of formatted targets + */ + static async applyEffects(targets) { + if (!this.effects?.length || !targets?.length) return; + let effects = this.effects; + targets.forEach(async token => { + if (this.hasSave && token.saved.success === true) effects = this.effects.filter(e => e.onSave === true); + if (!effects.length) return; + effects.forEach(async e => { + const actor = canvas.tokens.get(token.id)?.actor, + effect = this.item.effects.get(e._id); + if (!actor || !effect) return; + await EffectsField.applyEffect(effect, actor); + }); + }); + } + + /** + * Apply an Effect to a target or enable it if already on it + * @param {object} effect Effect object containing ActiveEffect UUID + * @param {object} actor Actor Document + */ + static async applyEffect(effect, actor) { + const existingEffect = actor.effects.find(e => e.origin === effect.uuid); + if (existingEffect) { + return effect.update( + foundry.utils.mergeObject({ + ...effect.constructor.getInitialDuration(), + disabled: false + }) + ); + } + + // Otherwise, create a new effect on the target + const effectData = foundry.utils.mergeObject({ + ...effect.toObject(), + disabled: false, + transfer: false, + origin: effect.uuid + }); + await ActiveEffect.implementation.create(effectData, { parent: actor }); + } + + /** + * Return the automation setting for execute method for current user role + * @returns {boolean} If execute should be triggered automatically + */ + static getAutomation() { + return ( + (game.user.isGM && + game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).roll.effect.gm) || + (!game.user.isGM && + game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).roll.effect.players) + ); + } } diff --git a/module/data/fields/action/healingField.mjs b/module/data/fields/action/healingField.mjs deleted file mode 100644 index 98f4f5ea..00000000 --- a/module/data/fields/action/healingField.mjs +++ /dev/null @@ -1,12 +0,0 @@ -import { DHDamageData } from './damageField.mjs'; - -const fields = foundry.data.fields; - -export default class HealingField extends fields.SchemaField { - constructor(options, context = {}) { - const healingFields = { - parts: new fields.ArrayField(new fields.EmbeddedDataField(DHDamageData)) - }; - super(healingFields, options, context); - } -} diff --git a/module/data/fields/action/macroField.mjs b/module/data/fields/action/macroField.mjs index 62da0da0..e37a2852 100644 --- a/module/data/fields/action/macroField.mjs +++ b/module/data/fields/action/macroField.mjs @@ -1,7 +1,29 @@ const fields = foundry.data.fields; export default class MacroField extends fields.DocumentUUIDField { + /** + * Action Workflow order + */ + static order = 70; + + /** @inheritDoc */ constructor(context = {}) { - super({ type: "Macro" }, context); + super({ type: 'Macro' }, context); + } + + /** + * Macro Action Workflow part. + * Must be called within Action context or similar or similar. + * @param {object} config Object that contains workflow datas. Usually made from Action Fields prepareConfig methods. Currently not used. + */ + static async execute(config) { + const fixUUID = !this.macro.includes('Macro.') ? `Macro.${this.macro}` : this.macro, + macro = await fromUuid(fixUUID); + try { + if (!macro) throw new Error(`No macro found for the UUID: ${this.macro}.`); + macro.execute(); + } catch (error) { + ui.notifications.error(error); + } } } diff --git a/module/data/fields/action/rangeField.mjs b/module/data/fields/action/rangeField.mjs index 221f00af..d0bceada 100644 --- a/module/data/fields/action/rangeField.mjs +++ b/module/data/fields/action/rangeField.mjs @@ -1,17 +1,23 @@ const fields = foundry.data.fields; export default class RangeField extends fields.StringField { + /** @inheritDoc */ constructor(context = {}) { const options = { choices: CONFIG.DH.GENERAL.range, required: false, blank: true, - label: "DAGGERHEART.GENERAL.range" + label: 'DAGGERHEART.GENERAL.range' }; super(options, context); } - static prepareConfig(config) { - return true; + /** + * Update Action Workflow config object. + * NOT YET IMPLEMENTED. + * @param {object} config Object that contains workflow datas. Usually made from Action Fields prepareConfig methods. + */ + prepareConfig(config) { + return; } } diff --git a/module/data/fields/action/rollField.mjs b/module/data/fields/action/rollField.mjs index a4df2a9e..98a1d5ed 100644 --- a/module/data/fields/action/rollField.mjs +++ b/module/data/fields/action/rollField.mjs @@ -5,7 +5,12 @@ export class DHActionRollData extends foundry.abstract.DataModel { static defineSchema() { return { type: new fields.StringField({ nullable: true, initial: null, choices: CONFIG.DH.GENERAL.rollTypes }), - trait: new fields.StringField({ nullable: true, initial: null, choices: CONFIG.DH.ACTOR.abilities, label: "DAGGERHEART.GENERAL.Trait.single" }), + trait: new fields.StringField({ + nullable: true, + initial: null, + choices: CONFIG.DH.ACTOR.abilities, + label: 'DAGGERHEART.GENERAL.Trait.single' + }), difficulty: new fields.NumberField({ nullable: true, initial: null, integer: true, min: 0 }), bonus: new fields.NumberField({ nullable: true, initial: null, integer: true }), advState: new fields.StringField({ @@ -71,29 +76,6 @@ export class DHActionRollData extends foundry.abstract.DataModel { const modifiers = []; if (!this.parent?.actor) return modifiers; switch (this.parent.actor.type) { - case 'character': - const spellcastingTrait = - this.type === 'spellcast' - ? (this.parent.actor?.system?.spellcastModifierTrait?.key ?? 'agility') - : null; - const trait = - this.useDefault || !this.trait - ? (spellcastingTrait ?? this.parent.item.system.attack?.roll?.trait ?? 'agility') - : this.trait; - if ( - this.type === CONFIG.DH.GENERAL.rollTypes.attack.id || - this.type === CONFIG.DH.GENERAL.rollTypes.trait.id - ) - modifiers.push({ - label: `DAGGERHEART.CONFIG.Traits.${trait}.name`, - value: this.parent.actor.system.traits[trait].value - }); - else if (this.type === CONFIG.DH.GENERAL.rollTypes.spellcast.id) - modifiers.push({ - label: `DAGGERHEART.CONFIG.RollTypes.spellcast.name`, - value: this.parent.actor.system.spellcastModifier - }); - break; case 'companion': case 'adversary': if (this.type === CONFIG.DH.GENERAL.rollTypes.attack.id) @@ -107,10 +89,79 @@ export class DHActionRollData extends foundry.abstract.DataModel { } return modifiers; } + + get rollTrait() { + if (this.parent?.actor?.type !== 'character') return null; + switch (this.type) { + case CONFIG.DH.GENERAL.rollTypes.spellcast.id: + return this.parent.actor?.system?.spellcastModifierTrait?.key ?? 'agility'; + case CONFIG.DH.GENERAL.rollTypes.attack.id: + case CONFIG.DH.GENERAL.rollTypes.trait.id: + return this.useDefault || !this.trait + ? (this.parent.item.system.attack?.roll?.trait ?? 'agility') + : this.trait; + default: + return null; + } + } } export default class RollField extends fields.EmbeddedDataField { + /** + * Action Workflow order + */ + static order = 10; + + /** @inheritDoc */ constructor(options, context = {}) { super(DHActionRollData, options, context); } + + /** + * Roll Action Workflow part. + * Must be called within Action context or similar. + * @param {object} config Object that contains workflow datas. Usually made from Action Fields prepareConfig methods. + */ + static async execute(config) { + if (!config.hasRoll) return; + config = await this.actor.diceRoll(config); + if (!config) return false; + } + + /** + * Update Action Workflow config object. + * Must be called within Action context. + * @param {object} config Object that contains workflow datas. Usually made from Action Fields prepareConfig methods. + */ + prepareConfig(config) { + if (!config.hasRoll) return; + + config.dialog.configure = RollField.getAutomation() ? !config.dialog.configure : config.dialog.configure; + + const roll = { + baseModifiers: this.roll.getModifier(), + label: 'Attack', + type: this.roll?.type, + trait: this.roll?.rollTrait, + difficulty: this.roll?.difficulty, + formula: this.roll.getFormula(), + advantage: CONFIG.DH.ACTIONS.advantageState[this.roll.advState].value + }; + if (this.roll.type === 'diceSet' || !this.hasRoll) roll.lite = true; + + config.roll = roll; + } + + /** + * Return the automation setting for execute method for current user role + * @returns {boolean} If execute should be triggered automatically + */ + static getAutomation() { + return ( + (game.user.isGM && + game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).roll.roll.gm) || + (!game.user.isGM && + game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).roll.roll.players) + ); + } } diff --git a/module/data/fields/action/saveField.mjs b/module/data/fields/action/saveField.mjs index e93a82a9..b7021135 100644 --- a/module/data/fields/action/saveField.mjs +++ b/module/data/fields/action/saveField.mjs @@ -1,6 +1,14 @@ +import { abilities } from '../../../config/actorConfig.mjs'; + const fields = foundry.data.fields; export default class SaveField extends fields.SchemaField { + /** + * Action Workflow order + */ + static order = 50; + + /** @inheritDoc */ constructor(options = {}, context = {}) { const saveFields = { trait: new fields.StringField({ @@ -16,4 +24,157 @@ export default class SaveField extends fields.SchemaField { }; super(saveFields, options, context); } + + /** + * Reaction Roll Action Workflow part. + * Must be called within Action context or similar. + * @param {object} config Object that contains workflow datas. Usually made from Action Fields prepareConfig methods. + * @param {object[]} [targets=null] Array of targets to override pre-selected ones. + * @param {boolean} [force=false] If the method should be executed outside of Action workflow, for ChatMessage button for example. + */ + static async execute(config, targets = null, force = false) { + if (!config.hasSave) return; + let message = config.message ?? ui.chat.collection.get(config.parent?._id); + + if (!message) { + const roll = new CONFIG.Dice.daggerheart.DHRoll(''); + roll._evaluated = true; + message = config.message = await CONFIG.Dice.daggerheart.DHRoll.toMessage(roll, config); + } + if (SaveField.getAutomation() !== CONFIG.DH.SETTINGS.actionAutomationChoices.never.id || force) { + targets ??= config.targets.filter(t => !config.hasRoll || t.hit); + await SaveField.rollAllSave.call(this, targets, config.event, message); + } else return false; + } + + /** + * Roll a Reaction Roll for all targets. Send a query to the owner if the User is not. + * Must be called within Action context. + * @param {object[]} targets Array of formatted targets. + * @param {Event} event Triggering event + * @param {ChatMessage} message The ChatMessage the triggered button comes from. + */ + static async rollAllSave(targets, event, message) { + if (!targets) return; + return new Promise(resolve => { + const aPromise = []; + targets.forEach(target => { + aPromise.push( + new Promise(async subResolve => { + const actor = fromUuidSync(target.actorId); + if (actor) { + const rollSave = + game.user === actor.owner + ? SaveField.rollSave.call(this, actor, event) + : actor.owner.query('reactionRoll', { + actionId: this.uuid, + actorId: actor.uuid, + event, + message + }); + const result = await rollSave; + await SaveField.updateSaveMessage.call(this, result, message, target.id); + subResolve(); + } else subResolve(); + }) + ); + }); + Promise.all(aPromise).then(result => resolve()); + }); + } + + /** + * Roll a Reaction Roll for the specified Actor against the Action difficulty. + * Must be called within Action context. + * @param {*} actor Actor document + * @param {Event} event Triggering event + * @returns {object} Actor diceRoll config result. + */ + static async rollSave(actor, event) { + if (!actor) return; + const title = actor.isNPC + ? game.i18n.localize('DAGGERHEART.GENERAL.reactionRoll') + : game.i18n.format('DAGGERHEART.UI.Chat.dualityRoll.abilityCheckTitle', { + ability: game.i18n.localize(abilities[this.save.trait]?.label) + }), + rollConfig = { + event, + title, + roll: { + trait: this.save.trait, + difficulty: this.save.difficulty ?? this.actor?.baseSaveDifficulty, + type: 'trait' + }, + actionType: 'reaction', + hasRoll: true, + data: actor.getRollData() + }; + if (SaveField.getAutomation() === CONFIG.DH.SETTINGS.actionAutomationChoices.always.id) + rollConfig.dialog = { configure: false }; + return actor.diceRoll(rollConfig); + } + + /** + * Update a Roll ChatMessage for a token according to his Reaction Roll result. + * @param {object} result Result from the Reaction Roll + * @param {object} message ChatMessage to update + * @param {string} targetId Token ID + */ + static async updateSaveMessage(result, message, targetId) { + if (!result) return; + 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); + // }, 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); + } + + /** + * Return the automation setting for execute method for current user role + * @returns {string} Id from settingsConfig.mjs actionAutomationChoices + */ + static getAutomation() { + return ( + (game.user.isGM && + game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).roll.save.gm) || + (!game.user.isGM && + game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).roll.save.players) + ); + } + + /** + * Send a query to an Actor owner to roll a Reaction Roll then send back the result. + * @param {object} param0 + * @param {string} param0.actionId Action ID + * @param {string} param0.actorId Actor ID + * @param {Event} param0.event Triggering event + * @param {ChatMessage} param0.message Chat Message to update + * @returns + */ + static rollSaveQuery({ actionId, actorId, event, message }) { + return new Promise(async (resolve, reject) => { + const actor = await fromUuid(actorId), + action = await fromUuid(actionId); + if (!actor || !actor?.isOwner) reject(); + SaveField.rollSave.call(action, actor, event, message).then(result => resolve(result)); + }); + } } diff --git a/module/data/fields/action/targetField.mjs b/module/data/fields/action/targetField.mjs index bfb01db9..486a81f1 100644 --- a/module/data/fields/action/targetField.mjs +++ b/module/data/fields/action/targetField.mjs @@ -1,6 +1,7 @@ const fields = foundry.data.fields; export default class TargetField extends fields.SchemaField { + /** @inheritDoc */ constructor(options = {}, context = {}) { const targetFields = { type: new fields.StringField({ @@ -13,44 +14,66 @@ export default class TargetField extends fields.SchemaField { super(targetFields, options, context); } - static prepareConfig(config) { - if (!this.target?.type) return []; + /** + * Update Action Workflow config object. + * Must be called within Action context. + * @param {object} config Object that contains workflow datas. Usually made from Action Fields prepareConfig methods. + */ + prepareConfig(config) { + if (!this.target?.type) return (config.targets = []); config.hasTarget = true; let targets; + // If the Action is configured as self-targeted, set targets as the owner. if (this.target?.type === CONFIG.DH.GENERAL.targetTypes.self.id) targets = [this.actor.token ?? this.actor.prototypeToken]; else { targets = Array.from(game.user.targets); if (this.target.type !== CONFIG.DH.GENERAL.targetTypes.any.id) { - targets = targets.filter(t => TargetField.isTargetFriendly.call(this, t)); + targets = targets.filter(target => TargetField.isTargetFriendly(this.actor, target, this.target.type)); if (this.target.amount && targets.length > this.target.amount) targets = []; } } config.targets = targets.map(t => TargetField.formatTarget.call(this, t)); const hasTargets = TargetField.checkTargets.call(this, this.target.amount, config.targets); - if (config.isFastForward && !hasTargets) - return ui.notifications.warn('Too many targets selected for that actions.'); - return hasTargets; + if (config.dialog.configure === false && !hasTargets) { + ui.notifications.warn('Too many targets selected for that actions.'); + return hasTargets; + } } + /** + * Check if the number of selected targets respect the amount set in the Action. + * NOT YET IMPLEMENTED. Will be with Target Picker. + * @param {number} amount Max amount of targets configured in the action. + * @param {*[]} targets Array of targeted tokens. + * @returns {boolean} If the amount of targeted tokens does not exceed action configured one. + */ static checkTargets(amount, targets) { return true; // return !amount || (targets.length > amount); } - static isTargetFriendly(target) { - const actorDisposition = this.actor.token - ? this.actor.token.disposition - : this.actor.prototypeToken.disposition, + /** + * Compare 2 Actors disposition between each other + * @param {*} actor First actor document. + * @param {*} target Second actor document. + * @param {string} type Disposition id to compare (friendly/hostile). + * @returns {boolean} If both actors respect the provided type. + */ + static isTargetFriendly(actor, target, type) { + const actorDisposition = actor.token ? actor.token.disposition : actor.prototypeToken.disposition, targetDisposition = target.document.disposition; return ( - (this.target.type === CONFIG.DH.GENERAL.targetTypes.friendly.id && - actorDisposition === targetDisposition) || - (this.target.type === CONFIG.DH.GENERAL.targetTypes.hostile.id && - actorDisposition + targetDisposition === 0) + (type === CONFIG.DH.GENERAL.targetTypes.friendly.id && actorDisposition === targetDisposition) || + (type === CONFIG.DH.GENERAL.targetTypes.hostile.id && actorDisposition + targetDisposition === 0) ); } + /** + * Format actor to useful datas for Action roll workflow. + * @param {*} actor Actor object to format. + * @returns {*} Formatted Actor. + */ static formatTarget(actor) { return { id: actor.id, diff --git a/module/data/fields/action/usesField.mjs b/module/data/fields/action/usesField.mjs index 5740e01a..d1f3ebff 100644 --- a/module/data/fields/action/usesField.mjs +++ b/module/data/fields/action/usesField.mjs @@ -3,6 +3,12 @@ import FormulaField from '../formulaField.mjs'; const fields = foundry.data.fields; export default class UsesField extends fields.SchemaField { + /** + * Action Workflow order + */ + static order = 160; + + /** @inheritDoc */ constructor(options = {}, context = {}) { const usesFields = { value: new fields.NumberField({ nullable: true, initial: null }), @@ -20,16 +26,45 @@ export default class UsesField extends fields.SchemaField { super(usesFields, options, context); } - static prepareConfig(config) { + /** + * Uses Consumption Action Workflow part. + * Increment Action spent uses by 1. + * Must be called within Action context or similar or similar. + * @param {object} config Object that contains workflow datas. Usually made from Action Fields prepareConfig methods. + * @param {boolean} [successCost=false] Consume only resources configured as "On Success only" if not already consumed. + */ + static async execute(config, successCost = false) { + if ( + config.uses?.enabled && + ((!successCost && (!config.uses?.consumeOnSuccess || config.roll?.success)) || + (successCost && config.uses?.consumeOnSuccess)) + ) + this.update({ 'uses.value': this.uses.value + 1 }); + } + + /** + * Update Action Workflow config object. + * Must be called within Action context. + * @param {object} config Object that contains workflow datas. Usually made from Action Fields prepareConfig methods. + * @returns {boolean} Return false if fast-forwarded and no more uses. + */ + prepareConfig(config) { const uses = this.uses?.max ? foundry.utils.deepClone(this.uses) : null; if (uses && !uses.value) uses.value = 0; config.uses = uses; const hasUses = UsesField.hasUses.call(this, config.uses); - if (config.isFastForward && !hasUses) - return ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.actionNoUsesRemaining')); - return hasUses; + if (config.dialog.configure === false && !hasUses) { + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.actionNoUsesRemaining')); + return hasUses; + } } + /** + * Prepare Uses object for Action Workflow + * Must be called within Action context. + * @param {object} uses + * @returns {object} + */ static calcUses(uses) { if (!uses) return null; return { @@ -39,6 +74,12 @@ export default class UsesField extends fields.SchemaField { }; } + /** + * Check if the Action still get atleast one unspent uses. + * Must be called within Action context. + * @param {*} uses + * @returns {boolean} + */ static hasUses(uses) { if (!uses) return true; let max = uses.max ?? 0; diff --git a/module/data/item/base.mjs b/module/data/item/base.mjs index fd76edd7..11be0a52 100644 --- a/module/data/item/base.mjs +++ b/module/data/item/base.mjs @@ -162,7 +162,6 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel { for (let f of this.features) { const fBase = f.item ?? f; const feature = fBase.system ? fBase : await foundry.utils.fromUuid(fBase.uuid); - const multiclass = this.isMulticlass ? 'multiclass' : null; features.push( foundry.utils.mergeObject( feature.toObject(), @@ -170,7 +169,8 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel { _stats: { compendiumSource: fBase.uuid }, system: { originItemType: this.parent.type, - identifier: multiclass ?? (f.item ? f.type : null) + identifier: f.item ? f.type : null, + multiclassOrigin: this.isMulticlass } }, { inplace: false } diff --git a/module/data/item/class.mjs b/module/data/item/class.mjs index 5e92d2fc..c233a31b 100644 --- a/module/data/item/class.mjs +++ b/module/data/item/class.mjs @@ -49,6 +49,8 @@ export default class DHClass extends BaseDataItem { suggestedSecondaryWeapon: new ForeignDocumentUUIDField({ type: 'Item' }), suggestedArmor: new ForeignDocumentUUIDField({ type: 'Item' }) }), + backgroundQuestions: new fields.ArrayField(new fields.StringField(), { initial: ['', '', ''] }), + connections: new fields.ArrayField(new fields.StringField(), { initial: ['', '', ''] }), isMulticlass: new fields.BooleanField({ initial: false }) }; } @@ -96,6 +98,20 @@ export default class DHClass extends BaseDataItem { } } } + + if (!data.system.isMulticlass) { + const addQuestions = (base, questions) => { + return `${base}${questions.map(q => `

${q}

`).join('
')}`; + }; + const backgroundQuestions = data.system.backgroundQuestions.filter(x => x); + const connections = data.system.connections.filter(x => x); + await this.actor.update({ + 'system.biography': { + background: addQuestions(this.actor.system.biography.background, backgroundQuestions), + connections: addQuestions(this.actor.system.biography.connections, connections) + } + }); + } } const allowed = await super._preCreate(data, options, user); diff --git a/module/data/item/consumable.mjs b/module/data/item/consumable.mjs index dad6a95c..5a50525a 100644 --- a/module/data/item/consumable.mjs +++ b/module/data/item/consumable.mjs @@ -1,5 +1,4 @@ import BaseDataItem from './base.mjs'; -import { ActionField } from '../fields/actionField.mjs'; export default class DHConsumable extends BaseDataItem { /** @inheritDoc */ @@ -19,7 +18,8 @@ export default class DHConsumable extends BaseDataItem { const fields = foundry.data.fields; return { ...super.defineSchema(), - consumeOnUse: new fields.BooleanField({ initial: false }) + consumeOnUse: new fields.BooleanField({ initial: true }), + destroyOnEmpty: new fields.BooleanField({ initial: true }) }; } @@ -27,5 +27,4 @@ export default class DHConsumable extends BaseDataItem { /**@override */ static DEFAULT_ICON = 'systems/daggerheart/assets/icons/documents/items/round-potion.svg'; - } diff --git a/module/data/item/feature.mjs b/module/data/item/feature.mjs index 6e1aab41..3b8fe064 100644 --- a/module/data/item/feature.mjs +++ b/module/data/item/feature.mjs @@ -29,6 +29,7 @@ export default class DHFeature extends BaseDataItem { nullable: true, initial: null }), + multiclassOrigin: new fields.BooleanField({ initial: false }), identifier: new fields.StringField() }; } diff --git a/module/data/item/subclass.mjs b/module/data/item/subclass.mjs index 46b83753..375588fb 100644 --- a/module/data/item/subclass.mjs +++ b/module/data/item/subclass.mjs @@ -1,3 +1,4 @@ +import ForeignDocumentUUIDField from '../fields/foreignDocumentUUIDField.mjs'; import ItemLinkFields from '../fields/itemLinkFields.mjs'; import BaseDataItem from './base.mjs'; @@ -25,7 +26,8 @@ export default class DHSubclass extends BaseDataItem { }), features: new ItemLinkFields(), featureState: new fields.NumberField({ required: true, initial: 1, min: 1 }), - isMulticlass: new fields.BooleanField({ initial: false }) + isMulticlass: new fields.BooleanField({ initial: false }), + linkedClass: new ForeignDocumentUUIDField({ type: 'Item', nullable: true, initial: null }) }; } @@ -50,8 +52,7 @@ export default class DHSubclass extends BaseDataItem { async _preCreate(data, options, user) { if (this.actor?.type === 'character') { - const dataUuid = - data.uuid ?? (data.folder ? `Compendium.daggerheart.subclasses.Item.${data._id}` : `Item.${data._id}`); + const dataUuid = data.uuid ?? data._stats.compendiumSource ?? `Item.${data._id}`; if (this.actor.system.class.subclass) { if (this.actor.system.multiclass.subclass) { ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.subclassesAlreadyPresent')); diff --git a/module/data/settings/Appearance.mjs b/module/data/settings/Appearance.mjs index 36f6bb5a..dfdd17e2 100644 --- a/module/data/settings/Appearance.mjs +++ b/module/data/settings/Appearance.mjs @@ -1,100 +1,46 @@ -import { fearDisplay } from '../../config/generalConfig.mjs'; - export default class DhAppearance extends foundry.abstract.DataModel { + static LOCALIZATION_PREFIXES = ['DAGGERHEART.SETTINGS.Appearance']; + static defineSchema() { - const fields = foundry.data.fields; + const { StringField, ColorField, BooleanField, SchemaField } = foundry.data.fields; + + // helper to create dice style schema + const diceStyle = ({ fg, bg, outline, edge }) => + new SchemaField({ + foreground: new ColorField({ required: true, initial: fg }), + background: new ColorField({ required: true, initial: bg }), + outline: new ColorField({ required: true, initial: outline }), + edge: new ColorField({ required: true, initial: edge }), + texture: new StringField({ initial: 'astralsea', required: true, blank: false }), + colorset: new StringField({ initial: 'inspired', required: true, blank: false }), + material: new StringField({ initial: 'metal', required: true, blank: false }), + system: new StringField({ initial: 'standard', required: true, blank: false }) + }); + return { - displayFear: new fields.StringField({ + displayFear: new StringField({ required: true, - choices: fearDisplay, - initial: fearDisplay.token.value, - label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.displayFear.label' + choices: CONFIG.DH.GENERAL.fearDisplay, + initial: CONFIG.DH.GENERAL.fearDisplay.token.value }), - diceSoNice: new fields.SchemaField({ - hope: new fields.SchemaField({ - foreground: new fields.ColorField({ required: true, initial: '#ffffff' }), - background: new fields.ColorField({ required: true, initial: '#ffe760' }), - outline: new fields.ColorField({ required: true, initial: '#000000' }), - edge: new fields.ColorField({ required: true, initial: '#ffffff' }), - texture: new fields.StringField({ initial: 'astralsea' }), - colorset: new fields.StringField({ initial: 'inspired' }), - material: new fields.StringField({ initial: 'metal' }), - system: new fields.StringField({ initial: 'standard' }) - }), - fear: new fields.SchemaField({ - foreground: new fields.ColorField({ required: true, initial: '#000000' }), - background: new fields.ColorField({ required: true, initial: '#0032b1' }), - outline: new fields.ColorField({ required: true, initial: '#ffffff' }), - edge: new fields.ColorField({ required: true, initial: '#000000' }), - texture: new fields.StringField({ initial: 'astralsea' }), - colorset: new fields.StringField({ initial: 'inspired' }), - material: new fields.StringField({ initial: 'metal' }), - system: new fields.StringField({ initial: 'standard' }) - }), - advantage: new fields.SchemaField({ - foreground: new fields.ColorField({ required: true, initial: '#ffffff' }), - background: new fields.ColorField({ required: true, initial: '#008000' }), - outline: new fields.ColorField({ required: true, initial: '#000000' }), - edge: new fields.ColorField({ required: true, initial: '#ffffff' }), - texture: new fields.StringField({ initial: 'astralsea' }), - colorset: new fields.StringField({ initial: 'inspired' }), - material: new fields.StringField({ initial: 'metal' }), - system: new fields.StringField({ initial: 'standard' }) - }), - disadvantage: new fields.SchemaField({ - foreground: new fields.ColorField({ required: true, initial: '#000000' }), - background: new fields.ColorField({ required: true, initial: '#b30000' }), - outline: new fields.ColorField({ required: true, initial: '#ffffff' }), - edge: new fields.ColorField({ required: true, initial: '#000000' }), - texture: new fields.StringField({ initial: 'astralsea' }), - colorset: new fields.StringField({ initial: 'inspired' }), - material: new fields.StringField({ initial: 'metal' }), - system: new fields.StringField({ initial: 'standard' }) - }) + diceSoNice: new SchemaField({ + hope: diceStyle({ fg: '#ffffff', bg: '#ffe760', outline: '#000000', edge: '#ffffff' }), + fear: diceStyle({ fg: '#000000', bg: '#0032b1', outline: '#ffffff', edge: '#000000' }), + advantage: diceStyle({ fg: '#ffffff', bg: '#008000', outline: '#000000', edge: '#ffffff' }), + disadvantage: diceStyle({ fg: '#000000', bg: '#b30000', outline: '#ffffff', edge: '#000000' }) }), - showGenericStatusEffects: new fields.BooleanField({ - initial: true, - label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.showGenericStatusEffects.label' + extendCharacterDescriptions: new BooleanField(), + extendAdversaryDescriptions: new BooleanField(), + extendEnvironmentDescriptions: new BooleanField(), + extendItemDescriptions: new BooleanField(), + expandRollMessage: new SchemaField({ + desc: new BooleanField(), + roll: new BooleanField(), + damage: new BooleanField(), + target: new BooleanField() }), - extendCharacterDescriptions: new fields.BooleanField({ - initial: false, - label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.extendCharacterDescriptions.label' - }), - extendAdversaryDescriptions: new fields.BooleanField({ - initial: false, - label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.extendAdversaryDescriptions.label' - }), - extendEnvironmentDescriptions: new fields.BooleanField({ - initial: false, - label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.extendEnvironmentDescriptions.label' - }), - extendItemDescriptions: new fields.BooleanField({ - initial: false, - label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.extendItemDescriptions.label' - }), - expandRollMessage: new fields.SchemaField({ - desc: new fields.BooleanField({ - initial: false, - label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.expandRollMessageDesc.label' - }), - roll: new fields.BooleanField({ - initial: false, - label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.expandRollMessageRoll.label' - }), - damage: new fields.BooleanField({ - initial: false, - label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.expandRollMessageDamage.label' - }), - target: new fields.BooleanField({ - initial: false, - label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.expandRollMessageTarget.label' - }) - }), - hideAttribution: new fields.BooleanField({ - required: true, - initial: false, - label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.hideAttribution.label' - }) + hideAttribution: new BooleanField(), + showGenericStatusEffects: new BooleanField({ initial: true }) }; } } diff --git a/module/data/settings/Automation.mjs b/module/data/settings/Automation.mjs index e1d63669..beefac0b 100644 --- a/module/data/settings/Automation.mjs +++ b/module/data/settings/Automation.mjs @@ -80,6 +80,72 @@ export default class DhAutomation extends foundry.abstract.DataModel { initial: CONFIG.DH.GENERAL.defeatedConditions.defeated.id, label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.defeated.companionDefault.label' }) + }), + roll: new fields.SchemaField({ + roll: new fields.SchemaField({ + gm: new fields.BooleanField({ + required: true, + initial: false, + label: 'DAGGERHEART.GENERAL.gm' + }), + players: new fields.BooleanField({ + required: true, + initial: false, + label: 'DAGGERHEART.GENERAL.player.plurial' + }) + }), + damage: new fields.SchemaField({ + gm: new fields.StringField({ + required: true, + initial: 'never', + choices: CONFIG.DH.SETTINGS.actionAutomationChoices, + label: 'DAGGERHEART.GENERAL.gm' + }), + players: new fields.StringField({ + required: true, + initial: 'never', + choices: CONFIG.DH.SETTINGS.actionAutomationChoices, + label: 'DAGGERHEART.GENERAL.player.plurial' + }) + }), + save: new fields.SchemaField({ + gm: new fields.StringField({ + required: true, + initial: 'never', + choices: CONFIG.DH.SETTINGS.actionAutomationChoices, + label: 'DAGGERHEART.GENERAL.gm' + }), + players: new fields.StringField({ + required: true, + initial: 'never', + choices: CONFIG.DH.SETTINGS.actionAutomationChoices, + label: 'DAGGERHEART.GENERAL.player.plurial' + }) + }), + damageApply: new fields.SchemaField({ + gm: new fields.BooleanField({ + required: true, + initial: false, + label: 'DAGGERHEART.GENERAL.gm' + }), + players: new fields.BooleanField({ + required: true, + initial: false, + label: 'DAGGERHEART.GENERAL.player.plurial' + }) + }), + effect: new fields.SchemaField({ + gm: new fields.BooleanField({ + required: true, + initial: false, + label: 'DAGGERHEART.GENERAL.gm' + }), + players: new fields.BooleanField({ + required: true, + initial: false, + label: 'DAGGERHEART.GENERAL.player.plurial' + }) + }) }) }; } diff --git a/module/dice/d20Roll.mjs b/module/dice/d20Roll.mjs index 63d84744..f0660106 100644 --- a/module/dice/d20Roll.mjs +++ b/module/dice/d20Roll.mjs @@ -128,7 +128,9 @@ export default class D20Roll extends DHRoll { applyBaseBonus() { const modifiers = foundry.utils.deepClone(this.options.roll.baseModifiers) ?? []; - modifiers.push(...this.getBonus(`roll.${this.options.type}`, `${this.options.type?.capitalize()} Bonus`)); + modifiers.push( + ...this.getBonus(`roll.${this.options.actionType}`, `${this.options.actionType?.capitalize()} Bonus`) + ); modifiers.push( ...this.getBonus(`roll.${this.options.roll.type}`, `${this.options.roll.type?.capitalize()} Bonus`) ); @@ -138,7 +140,7 @@ export default class D20Roll extends DHRoll { static postEvaluate(roll, config = {}) { const data = super.postEvaluate(roll, config); - data.type = config.roll?.type; + data.type = config.actionType; data.difficulty = config.roll.difficulty; if (config.targets?.length) { config.targets.forEach(target => { @@ -147,6 +149,7 @@ export default class D20Roll extends DHRoll { }); data.success = config.targets.some(target => target.hit); } else if (config.roll.difficulty) data.success = roll.isCritical || roll.total >= config.roll.difficulty; + config.successConsumed = data.success; data.advantage = { type: config.roll.advantage, diff --git a/module/dice/damageRoll.mjs b/module/dice/damageRoll.mjs index aa9e1d94..534867f8 100644 --- a/module/dice/damageRoll.mjs +++ b/module/dice/damageRoll.mjs @@ -9,6 +9,7 @@ export default class DamageRoll extends DHRoll { static DefaultDialog = DamageDialog; static async buildEvaluate(roll, config = {}, message = {}) { + if (config.dialog.configure === false) roll.constructFormula(config); if (config.evaluate !== false) for (const roll of config.roll) await roll.roll.evaluate(); roll._evaluated = true; @@ -46,9 +47,7 @@ export default class DamageRoll extends DHRoll { ); } await super.buildPost(roll, config, message); - if (config.source?.message) { - chatMessage.update({ 'system.damage': config.damage }); - } + if (config.source?.message) chatMessage.update({ 'system.damage': config.damage }); } static unifyDamageRoll(rolls) { diff --git a/module/dice/dhRoll.mjs b/module/dice/dhRoll.mjs index ac340c64..3865710a 100644 --- a/module/dice/dhRoll.mjs +++ b/module/dice/dhRoll.mjs @@ -28,6 +28,7 @@ export default class DHRoll extends Roll { static async buildConfigure(config = {}, message = {}) { config.hooks = [...this.getHooks(), '']; config.dialog ??= {}; + for (const hook of config.hooks) { if (Hooks.call(`${CONFIG.DH.id}.preRoll${hook.capitalize()}`, config, message) === false) return null; } @@ -88,11 +89,12 @@ export default class DHRoll extends Roll { type: this.messageType, user: game.user.id, title: roll.title, - speaker: cls.getSpeaker(), + speaker: cls.getSpeaker({ actor: roll.data?.parent }), sound: config.mute ? null : CONFIG.sounds.dice, system: config, rolls: [roll] }; + config.selectedRollMode ??= game.settings.get('core', 'rollMode'); if (roll._evaluated) { @@ -226,7 +228,7 @@ export const registerRollDiceHooks = () => { if ( !config.source?.actor || (game.user.isGM ? !hopeFearAutomation.gm : !hopeFearAutomation.players) || - config.roll.type === 'reaction' + config.actionType === 'reaction' ) return; diff --git a/module/dice/dualityRoll.mjs b/module/dice/dualityRoll.mjs index ac1047ab..8fedc368 100644 --- a/module/dice/dualityRoll.mjs +++ b/module/dice/dualityRoll.mjs @@ -19,7 +19,7 @@ export default class DualityRoll extends D20Roll { get title() { return game.i18n.localize( - `DAGGERHEART.GENERAL.${this.options?.roll?.type === CONFIG.DH.ITEM.actionTypes.reaction.id ? 'reactionRoll' : 'dualityRoll'}` + `DAGGERHEART.GENERAL.${this.options?.actionType === CONFIG.DH.ITEM.actionTypes.reaction.id ? 'reactionRoll' : 'dualityRoll'}` ); } @@ -154,9 +154,12 @@ export default class DualityRoll extends D20Roll { applyBaseBonus() { const modifiers = super.applyBaseBonus(); - if (this.options.roll.trait && this.data.traits[this.options.roll.trait]) + if (this.options.roll.trait && this.data.traits?.[this.options.roll.trait]) modifiers.unshift({ - label: `DAGGERHEART.CONFIG.Traits.${this.options.roll.trait}.name`, + label: + this.options.roll.type === CONFIG.DH.GENERAL.rollTypes.spellcast.id + ? 'DAGGERHEART.CONFIG.RollTypes.spellcast.name' + : `DAGGERHEART.CONFIG.Traits.${this.options.roll.trait}.name`, value: this.data.traits[this.options.roll.trait].value }); diff --git a/module/documents/activeEffect.mjs b/module/documents/activeEffect.mjs index f46cc9db..b2896513 100644 --- a/module/documents/activeEffect.mjs +++ b/module/documents/activeEffect.mjs @@ -167,13 +167,11 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect { if (subclass) { const featureState = subclass.system.featureState; - const featureType = subclass - ? (subclass.system.features.find(x => x.item?.uuid === this.parent.uuid)?.type ?? null) - : null; if ( - (featureType === CONFIG.DH.ITEM.featureSubTypes.specialization && featureState < 2) || - (featureType === CONFIG.DH.ITEM.featureSubTypes.mastery && featureState < 3) + (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 4ef8b3b0..79e71549 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -1,7 +1,7 @@ import { emitAsGM, GMUpdateEvent } from '../systemRegistration/socket.mjs'; import { LevelOptionType } from '../data/levelTier.mjs'; import DHFeature from '../data/item/feature.mjs'; -import { createScrollText, damageKeyToNumber, versionCompare } from '../helpers/utils.mjs'; +import { createScrollText, damageKeyToNumber } from '../helpers/utils.mjs'; import DhCompanionLevelUp from '../applications/levelup/companionLevelup.mjs'; export default class DhpActor extends Actor { @@ -14,7 +14,7 @@ export default class DhpActor extends Actor { get owner() { const user = this.hasPlayerOwner && game.users.players.find(u => this.testUserPermission(u, 'OWNER') && u.active); - if (!user) return game.user.isGM ? game.user : null; + if (!user) return game.users.activeGM; return user; } @@ -167,10 +167,10 @@ export default class DhpActor extends Actor { if (multiclass) { const multiclassItem = this.items.find(x => x.uuid === multiclass.itemUuid); const multiclassFeatures = this.items.filter( - x => x.system.originItemType === 'class' && x.system.identifier === 'multiclass' + x => x.system.originItemType === 'class' && x.system.multiclassOrigin ); const subclassFeatures = this.items.filter( - x => x.system.originItemType === 'subclass' && x.system.identifier === 'multiclass' + x => x.system.originItemType === 'subclass' && x.system.multiclassOrigin ); this.deleteEmbeddedDocuments( @@ -659,13 +659,22 @@ export default class DhpActor extends Actor { }; resources.forEach(r => { - if (r.keyIsID) { - updates.items[r.key] = { - target: r.target, - resources: { - 'system.resource.value': r.target.system.resource.value + r.value - } - }; + if (r.itemId) { + const { path, value } = game.system.api.fields.ActionFields.CostField.getItemIdCostUpdate(r); + + if ( + r.key === 'quantity' && + r.target.type === 'consumable' && + value === 0 && + r.target.system.destroyOnEmpty + ) { + r.target.delete(); + } else { + updates.items[r.key] = { + target: r.target, + resources: { [path]: value } + }; + } } else { switch (r.key) { case 'fear': @@ -782,7 +791,7 @@ export default class DhpActor extends Actor { } const parsedJSON = JSON.parse(json); - if (versionCompare(parsedJSON._stats.systemVersion, '1.1.0')) { + if (foundry.utils.isNewerVersion('1.1.0', parsedJSON._stats.systemVersion)) { const confirmed = await foundry.applications.api.DialogV2.confirm({ window: { title: game.i18n.localize('DAGGERHEART.ACTORS.Character.InvalidOldCharacterImportTitle') diff --git a/module/documents/chatMessage.mjs b/module/documents/chatMessage.mjs index c7f30e48..d7476395 100644 --- a/module/documents/chatMessage.mjs +++ b/module/documents/chatMessage.mjs @@ -1,3 +1,5 @@ +import { emitAsGM, GMUpdateEvent } from '../systemRegistration/socket.mjs'; + export default class DhpChatMessage extends foundry.documents.ChatMessage { targetHook = null; @@ -103,19 +105,29 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage { if (itemDesc && autoExpandRoll.desc) itemDesc.setAttribute('open', ''); } - if (!game.user.isGM) { + if (!this.isAuthor && !this.speakerActor?.isOwner) { const applyButtons = html.querySelector('.apply-buttons'); applyButtons?.remove(); - if (!this.isAuthor && !this.speakerActor?.isOwner) { - const buttons = html.querySelectorAll('.ability-card-footer > .ability-use-button'); - buttons.forEach(b => b.remove()); - } + const buttons = html.querySelectorAll('.ability-card-footer > .ability-use-button'); + buttons.forEach(b => b.remove()); } } addChatListeners(html) { + html.querySelectorAll('.duality-action-damage').forEach(element => + element.addEventListener('click', this.onRollDamage.bind(this)) + ); + html.querySelectorAll('.damage-button').forEach(element => - element.addEventListener('click', this.onDamage.bind(this)) + element.addEventListener('click', this.onApplyDamage.bind(this)) + ); + + html.querySelectorAll('.target-save').forEach(element => + element.addEventListener('click', this.onRollSave.bind(this)) + ); + + html.querySelectorAll('.roll-all-save-button').forEach(element => + element.addEventListener('click', this.onRollAllSave.bind(this)) ); html.querySelectorAll('.duality-action-effect').forEach(element => @@ -133,17 +145,21 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage { }); } - getTargetList() { - const targets = this.system.hitTargets ?? []; - return targets.map(target => game.canvas.tokens.documentCollection.find(t => t.actor?.uuid === target.actorId)); + async onRollDamage(event) { + event.stopPropagation(); + const config = foundry.utils.deepClone(this.system); + config.event = event; + this.system.action?.workflow.get('damage')?.execute(config, this._id, true); } - async onDamage(event) { + async onApplyDamage(event) { event.stopPropagation(); - const targets = this.getTargetList(); + const targets = this.filterPermTargets(this.system.hitTargets), + config = foundry.utils.deepClone(this.system); + config.event = event; if (this.system.onSave) { - const pendingingSaves = this.system.hitTargets.filter(t => t.saved.success === null); + const pendingingSaves = targets.filter(t => t.saved.success === null); if (pendingingSaves.length) { const confirm = await foundry.applications.api.DialogV2.confirm({ window: { title: 'Pending Reaction Rolls found' }, @@ -154,62 +170,66 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage { } if (targets.length === 0) - return ui.notifications.info(game.i18n.localize('DAGGERHEART.UI.Notifications.noTargetsSelected')); + return ui.notifications.info(game.i18n.localize('DAGGERHEART.UI.Notifications.noTargetsSelectedOrPerm')); - for (let target of targets) { - let damages = foundry.utils.deepClone(this.system.damage); - if ( - !this.system.hasHealing && - this.system.onSave && - this.system.hitTargets.find(t => t.id === target.id)?.saved?.success === true - ) { - const mod = CONFIG.DH.ACTIONS.damageOnSave[this.system.onSave]?.mod ?? 1; - Object.entries(damages).forEach(([k, v]) => { - v.total = 0; - v.parts.forEach(part => { - part.total = Math.ceil(part.total * mod); - v.total += part.total; - }); - }); - } + this.consumeOnSuccess(); + this.system.action?.workflow.get('applyDamage')?.execute(config, targets, true); + } - this.consumeOnSuccess(); - if (this.system.hasHealing) target.actor.takeHealing(damages); - else target.actor.takeDamage(damages, this.system.isDirect); + async onRollSave(event) { + event.stopPropagation(); + const tokenId = event.target.closest('[data-token]')?.dataset.token, + token = game.canvas.tokens.get(tokenId); + if (!token?.actor || !token.isOwner) return true; + if (this.system.source.item && this.system.source.action) { + const action = this.system.action; + if (!action || !action?.hasSave) return; + game.system.api.fields.ActionFields.SaveField.rollSave.call(action, token.actor, event).then(result => + emitAsGM( + GMUpdateEvent.UpdateSaveMessage, + game.system.api.fields.ActionFields.SaveField.updateSaveMessage.bind( + action, + result, + this, + token.id + ), + { + action: action.uuid, + message: this._id, + token: token.id, + result + } + ) + ); } } - getAction(actor, itemId, actionId) { - const item = actor.items.get(itemId), - action = - actor.system.attack?._id === actionId - ? actor.system.attack - : item.system.attack?._id === actionId - ? item.system.attack - : item?.system?.actions?.get(actionId); - return action; + async onRollAllSave(event) { + event.stopPropagation(); + if (!game.user.isGM) return; + const targets = this.system.hitTargets, + config = foundry.utils.deepClone(this.system); + config.event = event; + this.system.action?.workflow.get('save')?.execute(config, targets, true); } async onApplyEffect(event) { event.stopPropagation(); - const actor = await foundry.utils.fromUuid(this.system.source.actor); - if (!actor || !game.user.isGM) return true; - if (this.system.source.item && this.system.source.action) { - const action = this.getAction(actor, this.system.source.item, this.system.source.action); - if (!action || !action?.applyEffects) return; - const targets = this.getTargetList(); - if (targets.length === 0) - ui.notifications.info(game.i18n.localize('DAGGERHEART.UI.Notifications.noTargetsSelected')); - this.consumeOnSuccess(); - await action.applyEffects(event, this, targets); - } + const targets = this.filterPermTargets(this.system.hitTargets), + config = foundry.utils.deepClone(this.system); + config.event = event; + if (targets.length === 0) + ui.notifications.info(game.i18n.localize('DAGGERHEART.UI.Notifications.noTargetsSelectedOrPerm')); + this.consumeOnSuccess(); + this.system.action?.workflow.get('effects')?.execute(config, targets, true); + } + + filterPermTargets(targets) { + return targets.filter(t => fromUuidSync(t.actorId)?.canUserModify(game.user, 'update')); } consumeOnSuccess() { - if (!this.system.successConsumed && !this.targetSelection) { - const action = this.system.action; - if (action) action.consume(this.system, true); - } + if (!this.system.successConsumed && !this.targetSelection) this.system.action?.consume(this.system, true); } hoverTarget(event) { diff --git a/module/enrichers/DamageEnricher.mjs b/module/enrichers/DamageEnricher.mjs index 918edc39..a52c4b31 100644 --- a/module/enrichers/DamageEnricher.mjs +++ b/module/enrichers/DamageEnricher.mjs @@ -2,7 +2,8 @@ export default function DhDamageEnricher(match, _options) { const parts = match[1].split('|').map(x => x.trim()); let value = null, - type = null; + type = null, + inline = false; parts.forEach(part => { const split = part.split(':').map(x => x.toLowerCase().trim()); @@ -14,16 +15,19 @@ export default function DhDamageEnricher(match, _options) { case 'type': type = split[1]; break; + case 'inline': + inline = true; + break; } } }); if (!value || !value) return match[0]; - return getDamageMessage(value, type, match[0]); + return getDamageMessage(value, type, inline, match[0]); } -function getDamageMessage(damage, type, defaultElement) { +function getDamageMessage(damage, type, inline, defaultElement) { const typeIcons = type .replace('[', '') .replace(']', '') @@ -40,7 +44,7 @@ function getDamageMessage(damage, type, defaultElement) { const dualityElement = document.createElement('span'); dualityElement.innerHTML = ` - `; diff --git a/module/helpers/utils.mjs b/module/helpers/utils.mjs index 55978e29..dbf66ff4 100644 --- a/module/helpers/utils.mjs +++ b/module/helpers/utils.mjs @@ -418,14 +418,3 @@ export async function createEmbeddedItemsWithEffects(actor, baseData) { export const slugify = name => { return name.toLowerCase().replaceAll(' ', '-').replaceAll('.', ''); }; - -export const versionCompare = (current, target) => { - const currentSplit = current.split('.').map(x => Number.parseInt(x)); - const targetSplit = target.split('.').map(x => Number.parseInt(x)); - for (var i = 0; i < currentSplit.length; i++) { - if (currentSplit[i] < targetSplit[i]) return true; - if (currentSplit[i] > targetSplit[i]) return false; - } - - return false; -}; diff --git a/module/systemRegistration/handlebars.mjs b/module/systemRegistration/handlebars.mjs index e8992538..24047827 100644 --- a/module/systemRegistration/handlebars.mjs +++ b/module/systemRegistration/handlebars.mjs @@ -34,7 +34,7 @@ export const preloadHandlebarsTemplates = async function () { 'systems/daggerheart/templates/ui/chat/parts/damage-part.hbs', 'systems/daggerheart/templates/ui/chat/parts/target-part.hbs', 'systems/daggerheart/templates/ui/chat/parts/button-part.hbs', - + 'systems/daggerheart/templates/ui/itemBrowser/itemContainer.hbs', 'systems/daggerheart/templates/scene/dh-config.hbs' ]); }; diff --git a/module/systemRegistration/migrations.mjs b/module/systemRegistration/migrations.mjs index e84018fa..015c19cb 100644 --- a/module/systemRegistration/migrations.mjs +++ b/module/systemRegistration/migrations.mjs @@ -1,12 +1,15 @@ -import { versionCompare } from '../helpers/utils.mjs'; - export async function runMigrations() { let lastMigrationVersion = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.LastMigrationVersion); if (!lastMigrationVersion) lastMigrationVersion = '1.0.6'; - if (versionCompare(lastMigrationVersion, '1.1.0')) { + if (foundry.utils.isNewerVersion('1.1.0', lastMigrationVersion)) { + const lockedPacks = []; const compendiumActors = []; for (let pack of game.packs) { + if (pack.locked) { + lockedPacks.push(pack.collection); + await pack.configure({ locked: false }); + } const documents = await pack.getDocuments(); compendiumActors.push(...documents.filter(x => x.type === 'character')); } @@ -34,8 +37,119 @@ export async function runMigrations() { actor.updateEmbeddedDocuments('Item', items); }); + for (let packId of lockedPacks) { + const pack = game.packs.get(packId); + await pack.configure({ locked: true }); + } + lastMigrationVersion = '1.1.0'; } + if (foundry.utils.isNewerVersion('1.1.1', lastMigrationVersion)) { + const lockedPacks = []; + const compendiumClasses = []; + const compendiumActors = []; + for (let pack of game.packs) { + if (pack.locked) { + lockedPacks.push(pack.collection); + await pack.configure({ locked: false }); + } + const documents = await pack.getDocuments(); + compendiumClasses.push(...documents.filter(x => x.type === 'class')); + compendiumActors.push(...documents.filter(x => x.type === 'character')); + } + + [...compendiumActors, ...game.actors.filter(x => x.type === 'character')].forEach(char => { + const multiclass = char.items.find(x => x.type === 'class' && x.system.isMulticlass); + const multiclassSubclass = + multiclass?.system?.subclasses?.length > 0 ? multiclass.system.subclasses[0] : null; + char.items.forEach(item => { + if (item.type === 'feature' && item.system.identifier === 'multiclass') { + const base = item.system.originItemType === 'class' ? multiclass : multiclassSubclass; + if (base) { + const baseFeature = base.system.features.find(x => x.item.name === item.name); + if (baseFeature) { + item.update({ + system: { + multiclassOrigin: true, + identifier: baseFeature.type + } + }); + } + } + } + }); + }); + + const worldClasses = game.items.filter(x => x.type === 'class'); + for (let classVal of [...compendiumClasses, ...worldClasses]) { + for (let subclass of classVal.system.subclasses) { + await subclass.update({ 'system.linkedClass': classVal.uuid }); + } + } + + for (let packId of lockedPacks) { + const pack = game.packs.get(packId); + await pack.configure({ locked: true }); + } + + lastMigrationVersion = '1.1.1'; + } + + if (foundry.utils.isNewerVersion('1.2.0', lastMigrationVersion)) { + const lockedPacks = []; + const compendiumItems = []; + for (let pack of game.packs) { + if (pack.locked) { + lockedPacks.push(pack.collection); + await pack.configure({ locked: false }); + } + const documents = await pack.getDocuments(); + + compendiumItems.push(...documents.filter(x => x.system?.metadata?.hasActions)); + compendiumItems.push( + ...documents + .filter(x => x.items) + .flatMap(actor => actor.items.filter(x => x.system?.metadata?.hasActions)) + ); + } + + const worldItems = game.items.filter(x => x.system.metadata.hasActions); + const worldActorItems = Array.from(game.actors).flatMap(actor => + actor.items.filter(x => x.system.metadata.hasActions) + ); + + const validCostKeys = Object.keys(CONFIG.DH.GENERAL.abilityCosts); + for (let item of [...worldItems, ...worldActorItems, ...compendiumItems]) { + for (let action of item.system.actions) { + const resourceCostIndexes = Object.keys(action.cost).reduce( + (acc, index) => (!validCostKeys.includes(action.cost[index].key) ? [...acc, Number(index)] : acc), + [] + ); + if (resourceCostIndexes.length === 0) continue; + + await action.update({ + cost: action.cost.map((cost, index) => { + const { keyIsID, ...rest } = cost; + if (!resourceCostIndexes.includes(index)) return { ...rest }; + + return { + ...rest, + key: 'resource', + itemId: cost.key + }; + }) + }); + } + } + + for (let packId of lockedPacks) { + const pack = game.packs.get(packId); + await pack.configure({ locked: true }); + } + + lastMigrationVersion = '1.2.0'; + } + await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.LastMigrationVersion, lastMigrationVersion); } diff --git a/module/systemRegistration/settings.mjs b/module/systemRegistration/settings.mjs index 4828ebb0..565a7740 100644 --- a/module/systemRegistration/settings.mjs +++ b/module/systemRegistration/settings.mjs @@ -72,7 +72,7 @@ const registerMenus = () => { }); game.settings.registerMenu(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance, { - name: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.appearance.title'), + name: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.appearance.label'), label: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.appearance.label'), hint: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.appearance.hint'), icon: 'fa-solid fa-palette', diff --git a/module/systemRegistration/socket.mjs b/module/systemRegistration/socket.mjs index b47fee85..f75c7b36 100644 --- a/module/systemRegistration/socket.mjs +++ b/module/systemRegistration/socket.mjs @@ -22,6 +22,7 @@ export const socketEvent = { export const GMUpdateEvent = { UpdateDocument: 'DhGMUpdateDocument', + UpdateEffect: 'DhGMUpdateEffect', UpdateSetting: 'DhGMUpdateSetting', UpdateFear: 'DhGMUpdateFear', UpdateSaveMessage: 'DhGMUpdateSaveMessage' @@ -37,9 +38,11 @@ export const registerSocketHooks = () => { const document = data.uuid ? await fromUuid(data.uuid) : null; switch (data.action) { case GMUpdateEvent.UpdateDocument: - if (document && data.update) { - await document.update(data.update); - } + if (document && data.update) await document.update(data.update); + break; + case GMUpdateEvent.UpdateEffect: + if (document && data.update) + await game.system.api.fields.ActionFields.EffectsField.applyEffects.call(document, data.update); break; case GMUpdateEvent.UpdateSetting: await game.settings.set(CONFIG.DH.id, data.uuid, data.update); @@ -78,7 +81,7 @@ export const registerSocketHooks = () => { export const registerUserQueries = () => { CONFIG.queries.armorSlot = DamageReductionDialog.armorSlotQuery; - CONFIG.queries.reactionRoll = game.system.api.models.actions.actionsTypes.base.rollSaveQuery; + CONFIG.queries.reactionRoll = game.system.api.fields.ActionFields.SaveField.rollSaveQuery; }; export const emitAsGM = async (eventName, callback, update, uuid = null) => { diff --git a/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json b/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json index 0bc8d39d..d5ae1c67 100644 --- a/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json +++ b/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json @@ -316,7 +316,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json b/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json index c8079e49..2dde1b60 100644 --- a/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json +++ b/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json @@ -392,7 +392,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -507,7 +506,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -727,7 +725,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json b/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json index ad630902..663aa8a3 100644 --- a/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json +++ b/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json @@ -278,7 +278,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json b/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json index 720dd90b..c8f0b0d1 100644 --- a/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json +++ b/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json @@ -257,7 +257,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -345,7 +344,6 @@ "scalable": false, "key": "stress", "value": 2, - "keyIsID": false, "step": null } ], @@ -579,7 +577,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -643,7 +640,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json b/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json index 6f43714d..18906dbd 100644 --- a/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json +++ b/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json @@ -279,7 +279,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json b/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json index 5765ca72..acb1b601 100644 --- a/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json +++ b/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json @@ -285,7 +285,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -1091,7 +1090,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json b/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json index a1c06c52..e9f2c499 100644 --- a/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json +++ b/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json @@ -293,7 +293,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json b/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json index 052f5c1e..9d59323c 100644 --- a/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json +++ b/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json @@ -404,7 +404,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json b/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json index ca46acc2..e64e5c6f 100644 --- a/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json +++ b/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json @@ -253,7 +253,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -352,7 +351,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json b/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json index ff9b1215..9be9c300 100644 --- a/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json +++ b/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json @@ -364,7 +364,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json b/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json index 51d3f73d..b30bdc84 100644 --- a/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json +++ b/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json @@ -272,7 +272,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json b/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json index ed0d9abd..2f292c8f 100644 --- a/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json +++ b/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json @@ -316,7 +316,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -432,7 +431,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json b/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json index 6432afab..95a29d0b 100644 --- a/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json +++ b/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json @@ -257,7 +257,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json b/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json index 90f7bd6c..75bff568 100644 --- a/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json +++ b/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json @@ -254,7 +254,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -421,7 +420,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json b/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json index d83ce510..091b862c 100644 --- a/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json +++ b/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json @@ -257,7 +257,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -397,7 +396,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -524,7 +522,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json b/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json index 236402ea..47626209 100644 --- a/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json +++ b/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json @@ -246,7 +246,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -310,7 +309,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json b/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json index 78024303..12f715c5 100644 --- a/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json +++ b/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json @@ -270,9 +270,8 @@ "cost": [ { "scalable": false, - "key": "stress", + "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -286,7 +285,7 @@ "type": "self", "amount": null }, - "name": "Mark Stress", + "name": "Spend Fear", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", "range": "" } diff --git a/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json b/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json index b5313df2..34f27f93 100644 --- a/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json +++ b/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json @@ -285,7 +285,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -399,7 +398,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json b/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json index 61427aab..4144b8c3 100644 --- a/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json +++ b/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json @@ -252,7 +252,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -432,7 +431,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -527,7 +525,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json b/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json index 718f4a9a..ba8d1592 100644 --- a/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json +++ b/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json @@ -318,7 +318,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json b/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json index 5bdeddf9..027383e2 100644 --- a/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json +++ b/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json @@ -285,7 +285,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -349,7 +348,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json b/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json index fde75123..22408c0e 100644 --- a/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json +++ b/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json @@ -421,7 +421,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json b/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json index 7104b09f..0e501248 100644 --- a/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json +++ b/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json @@ -360,7 +360,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json b/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json index 7fb7a97d..7bc91293 100644 --- a/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json +++ b/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json @@ -252,7 +252,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -393,7 +392,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -457,7 +455,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json b/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json index 77a84dcf..0412ba4b 100644 --- a/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json +++ b/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json @@ -279,7 +279,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json b/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json index 2e08edfd..618323ce 100644 --- a/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json +++ b/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json @@ -272,7 +272,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json b/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json index a9e26e65..145b2534 100644 --- a/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json +++ b/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json @@ -277,7 +277,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -391,7 +390,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json b/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json index 6546153e..96efe6c6 100644 --- a/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json +++ b/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json @@ -370,7 +370,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json b/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json index b87fb26a..f1652c33 100644 --- a/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json +++ b/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json @@ -358,7 +358,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json b/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json index 91530e2e..a49ac9e1 100644 --- a/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json +++ b/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json @@ -252,7 +252,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], 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 73ae6429..4d4e9847 100644 --- a/src/packs/adversaries/adversary_Fallen_Warlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json +++ b/src/packs/adversaries/adversary_Fallen_Warlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json @@ -389,7 +389,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], 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 d49889b8..d0a50e2c 100644 --- a/src/packs/adversaries/adversary_Fallen_Warlord__Undefeated_Champion_RXkZTwBRi4dJ3JE5.json +++ b/src/packs/adversaries/adversary_Fallen_Warlord__Undefeated_Champion_RXkZTwBRi4dJ3JE5.json @@ -497,7 +497,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json b/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json index bfcbbba2..81f7ad37 100644 --- a/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json +++ b/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json @@ -252,7 +252,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json b/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json index b342864e..f400054b 100644 --- a/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json +++ b/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json @@ -359,7 +359,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json b/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json index a16fab7d..8de3035a 100644 --- a/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json +++ b/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json @@ -374,7 +374,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json b/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json index 9046d679..4234430c 100644 --- a/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json +++ b/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json @@ -281,7 +281,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json b/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json index 3365533c..2e697015 100644 --- a/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json +++ b/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json @@ -272,7 +272,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json b/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json index 32dee4b9..caebb002 100644 --- a/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json +++ b/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json @@ -254,7 +254,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json b/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json index a79154e5..31b3721c 100644 --- a/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json +++ b/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json @@ -335,7 +335,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -449,7 +448,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json b/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json index e68bc6f4..740fb7c9 100644 --- a/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json +++ b/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json @@ -523,7 +523,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json b/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json index 59b08577..3325eee8 100644 --- a/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json +++ b/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json @@ -455,7 +455,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json b/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json index b1da3ec3..e8fcd0ce 100644 --- a/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json +++ b/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json @@ -246,7 +246,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -418,7 +417,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -559,7 +557,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json b/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json index ca663abf..c359782a 100644 --- a/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json +++ b/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json @@ -563,7 +563,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json b/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json index aea1a4eb..4cf17ff5 100644 --- a/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json +++ b/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json @@ -279,7 +279,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json b/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json index 69b1d11d..82d74b93 100644 --- a/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json +++ b/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json @@ -272,7 +272,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -336,7 +335,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json b/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json index 52289d7b..c4f94d8e 100644 --- a/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json +++ b/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json @@ -287,7 +287,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json b/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json index 467ce106..59e35d06 100644 --- a/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json +++ b/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json @@ -259,7 +259,6 @@ "scalable": false, "key": "fear", "value": 2, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json b/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json index 8ac5ecdb..c6a3c141 100644 --- a/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json +++ b/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json @@ -519,7 +519,6 @@ "scalable": false, "key": "fear", "value": 2, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json b/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json index e2cdfbef..ca62b98f 100644 --- a/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json +++ b/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json @@ -285,7 +285,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -455,7 +454,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -570,7 +568,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json b/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json index 5982e496..d9efc9fb 100644 --- a/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json +++ b/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json @@ -532,7 +532,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json b/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json index d2d4fd83..002efede 100644 --- a/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json +++ b/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json @@ -317,7 +317,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json b/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json index fbfd0a66..edf8f3ea 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json @@ -281,7 +281,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json b/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json index 22d89d60..48430ae0 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json @@ -253,7 +253,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -352,7 +351,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], 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 3fe4bac0..31fa44f3 100644 --- a/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json +++ b/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json @@ -562,7 +562,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json b/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json index 2b16ec95..15766df4 100644 --- a/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json +++ b/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json @@ -290,7 +290,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -354,7 +353,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json b/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json index 5b06271d..315f6039 100644 --- a/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json +++ b/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json @@ -363,7 +363,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json b/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json index 9761b071..8344cc1e 100644 --- a/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json +++ b/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json @@ -334,7 +334,6 @@ "scalable": false, "key": "hitPoints", "value": 1, - "keyIsID": false, "step": null } ], @@ -481,7 +480,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json b/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json index da22947a..58b0b8e4 100644 --- a/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json +++ b/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json @@ -368,7 +368,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -484,7 +483,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json b/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json index 34727ef0..b57a7ddc 100644 --- a/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json +++ b/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json @@ -282,7 +282,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -398,7 +397,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json b/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json index fd0e6a51..b5ca05c9 100644 --- a/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json +++ b/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json @@ -275,7 +275,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json b/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json index b98e3640..ac3766d3 100644 --- a/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json +++ b/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json @@ -246,7 +246,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -310,7 +309,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json b/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json index 4f88edeb..b4868595 100644 --- a/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json +++ b/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json @@ -290,7 +290,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -354,7 +353,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json b/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json index 6681a8f2..8c2332aa 100644 --- a/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json +++ b/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json @@ -338,7 +338,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -452,7 +451,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json b/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json index 3546a587..4ada4bf1 100644 --- a/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json +++ b/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json @@ -424,7 +424,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -539,7 +538,6 @@ "scalable": false, "key": "fear", "value": 2, - "keyIsID": false, "step": null } ], @@ -660,7 +658,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json b/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json index 94634439..4eb8ba4b 100644 --- a/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json +++ b/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json @@ -272,7 +272,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json b/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json index 5509e2ff..75c438d2 100644 --- a/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json +++ b/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json @@ -452,7 +452,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json b/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json index e428a33f..97fd5789 100644 --- a/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json +++ b/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json @@ -365,7 +365,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json b/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json index 0f7b07a2..d0f8ec58 100644 --- a/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json +++ b/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json @@ -288,7 +288,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -377,7 +376,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json b/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json index 343eed99..8893201c 100644 --- a/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json +++ b/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json @@ -346,7 +346,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -411,7 +410,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json b/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json index 55dccaa4..54340160 100644 --- a/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json +++ b/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json @@ -499,7 +499,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json b/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json index 4a168cac..f9f0c5d0 100644 --- a/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json +++ b/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json @@ -275,7 +275,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json b/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json index 58e52937..93453c35 100644 --- a/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json +++ b/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json @@ -343,7 +343,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -407,7 +406,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json b/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json index ffba4d54..ac2dc316 100644 --- a/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json +++ b/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json @@ -257,7 +257,6 @@ "scalable": false, "key": "fear", "value": 2, - "keyIsID": false, "step": null } ], @@ -345,7 +344,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -532,7 +530,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json b/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json index 50bfa399..d281b974 100644 --- a/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json +++ b/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json @@ -275,7 +275,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json b/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json index d8437156..1e1b422a 100644 --- a/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json +++ b/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json @@ -464,7 +464,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json b/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json index cfa42eac..06f3c4a8 100644 --- a/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json +++ b/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json @@ -359,7 +359,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json b/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json index f444fb51..5f32df25 100644 --- a/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json +++ b/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json @@ -275,7 +275,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json b/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json index 4696285a..eb13eed0 100644 --- a/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json +++ b/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json @@ -335,7 +335,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json b/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json index 9a0e8aaf..a4ce7e26 100644 --- a/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json +++ b/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json @@ -252,7 +252,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json b/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json index bd13b3e1..86d197b2 100644 --- a/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json +++ b/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json @@ -252,7 +252,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -368,7 +367,6 @@ "scalable": false, "key": "fear", "value": 2, - "keyIsID": false, "step": null } ], @@ -432,7 +430,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json b/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json index 84a4a49a..38545446 100644 --- a/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json +++ b/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json @@ -252,7 +252,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -368,7 +367,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json b/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json index 80130503..fcce5c20 100644 --- a/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json +++ b/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json @@ -289,7 +289,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -405,7 +404,6 @@ "scalable": false, "key": "fear", "value": 2, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json b/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json index 9349713e..b4a5fbb7 100644 --- a/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json +++ b/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json @@ -252,7 +252,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -316,7 +315,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json b/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json index f448bdf0..91b83239 100644 --- a/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json +++ b/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json @@ -339,7 +339,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -427,7 +426,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json b/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json index e60fe4cc..f6957805 100644 --- a/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json +++ b/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json @@ -285,7 +285,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -450,7 +449,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json b/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json index dc35d8b9..12b26a15 100644 --- a/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json +++ b/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json @@ -362,7 +362,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -478,7 +477,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json b/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json index 1a8f1087..c54afb36 100644 --- a/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json +++ b/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json @@ -316,7 +316,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json b/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json index 6a5b19d5..f3fde38b 100644 --- a/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json +++ b/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json @@ -312,7 +312,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json b/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json index b081ca1f..139212b5 100644 --- a/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json +++ b/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json @@ -271,7 +271,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json b/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json index 5617570b..285feb7b 100644 --- a/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json +++ b/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json @@ -407,7 +407,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json b/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json index 5402a6cd..e28a4227 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json @@ -279,7 +279,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json b/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json index 34e698e5..3afcd1f7 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json @@ -279,7 +279,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -400,7 +399,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json b/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json index b16a2f85..05b0908b 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json @@ -284,7 +284,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -405,7 +404,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], 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 9b65ed36..f3e4f280 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json @@ -299,7 +299,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -666,7 +665,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], 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 8ea0f54e..350da61a 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json @@ -332,7 +332,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -554,7 +553,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json b/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json index b77c51a9..37d0328a 100644 --- a/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json +++ b/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json @@ -257,7 +257,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -321,7 +320,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -385,7 +383,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -500,7 +497,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json b/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json index c35018ba..e82fe2f6 100644 --- a/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json +++ b/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json @@ -408,18 +408,18 @@ "actionType": "action", "cost": [ { - "scalable": false, "key": "fear", + "itemId": null, "value": 1, - "keyIsID": false, + "scalable": false, "step": null, "consumeOnSuccess": false }, { - "scalable": false, - "key": "UsC0vtOBbf9Kut4v", + "key": "resource", + "itemId": "UsC0vtOBbf9Kut4v", "value": 1, - "keyIsID": true, + "scalable": false, "step": null, "consumeOnSuccess": false } @@ -527,10 +527,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.4", + "systemVersion": "1.2.0", "createdTime": 1754055703816, - "modifiedTime": 1755264604190, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325576007, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_key": "!actors.items!ZNbQ2jg35LG4t9eH.UsC0vtOBbf9Kut4v" }, diff --git a/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json b/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json index 3fa1cb51..bda226f0 100644 --- a/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json +++ b/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json @@ -254,7 +254,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -343,7 +342,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json b/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json index b30f12c6..388301f3 100644 --- a/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json +++ b/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json @@ -404,7 +404,6 @@ "scalable": false, "key": "fear", "value": 2, - "keyIsID": false, "step": null } ], @@ -571,7 +570,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json b/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json index 4d63e66a..c97721a2 100644 --- a/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json +++ b/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json @@ -397,7 +397,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json b/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json index a2f6c836..a51ce6a0 100644 --- a/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json +++ b/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json @@ -282,7 +282,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/ancestries/feature_Adaptability_BNofV1UC4ZbdFTkb.json b/src/packs/ancestries/feature_Adaptability_BNofV1UC4ZbdFTkb.json index 854e377c..8f3353d0 100644 --- a/src/packs/ancestries/feature_Adaptability_BNofV1UC4ZbdFTkb.json +++ b/src/packs/ancestries/feature_Adaptability_BNofV1UC4ZbdFTkb.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/ancestries/feature_Charge_AA2CZlJSWW8GPhrR.json b/src/packs/ancestries/feature_Charge_AA2CZlJSWW8GPhrR.json index 291785f2..7cba9e0c 100644 --- a/src/packs/ancestries/feature_Charge_AA2CZlJSWW8GPhrR.json +++ b/src/packs/ancestries/feature_Charge_AA2CZlJSWW8GPhrR.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/ancestries/feature_Danger_Sense_AXqcoxnRoWBbbKpK.json b/src/packs/ancestries/feature_Danger_Sense_AXqcoxnRoWBbbKpK.json index 595a2a6b..93cdabd5 100644 --- a/src/packs/ancestries/feature_Danger_Sense_AXqcoxnRoWBbbKpK.json +++ b/src/packs/ancestries/feature_Danger_Sense_AXqcoxnRoWBbbKpK.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/ancestries/feature_Death_Connection_WuwXH2r2uM9sDJtj.json b/src/packs/ancestries/feature_Death_Connection_WuwXH2r2uM9sDJtj.json index 3fffc763..b0d9cc7b 100644 --- a/src/packs/ancestries/feature_Death_Connection_WuwXH2r2uM9sDJtj.json +++ b/src/packs/ancestries/feature_Death_Connection_WuwXH2r2uM9sDJtj.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/ancestries/feature_Elemental_Breath_sRaE3CgkgjBF1UpV.json b/src/packs/ancestries/feature_Elemental_Breath_sRaE3CgkgjBF1UpV.json index cb77a1bf..3f50d8cf 100644 --- a/src/packs/ancestries/feature_Elemental_Breath_sRaE3CgkgjBF1UpV.json +++ b/src/packs/ancestries/feature_Elemental_Breath_sRaE3CgkgjBF1UpV.json @@ -12,7 +12,7 @@ "type": "attack", "_id": "a6WROv0OKx0lbYVa", "systemPath": "actions", - "description": "", + "description": "

Choose an element for your breath (such as electricity, fire, or ice). You can use this breath against a target or group of targets within Very Close range, treating it as an Instinct weapon that deals d8 magic damage using your Proficiency.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -102,10 +102,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753994055921, - "modifiedTime": 1755394293348, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1755938895948, + "lastModifiedBy": "tt3PwMBXcTLCtIQU" }, "_key": "!items!sRaE3CgkgjBF1UpV" } diff --git a/src/packs/ancestries/feature_Fearless_IlWvn5kCqCBMuUJn.json b/src/packs/ancestries/feature_Fearless_IlWvn5kCqCBMuUJn.json index 13cf7f84..ca954014 100644 --- a/src/packs/ancestries/feature_Fearless_IlWvn5kCqCBMuUJn.json +++ b/src/packs/ancestries/feature_Fearless_IlWvn5kCqCBMuUJn.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 2, - "keyIsID": false, "step": null } ], diff --git a/src/packs/ancestries/feature_Feline_Instincts_lNgbbYnCKgrdvA85.json b/src/packs/ancestries/feature_Feline_Instincts_lNgbbYnCKgrdvA85.json index 09d5dbbe..27e03f8b 100644 --- a/src/packs/ancestries/feature_Feline_Instincts_lNgbbYnCKgrdvA85.json +++ b/src/packs/ancestries/feature_Feline_Instincts_lNgbbYnCKgrdvA85.json @@ -20,7 +20,6 @@ "scalable": false, "key": "hope", "value": 2, - "keyIsID": false, "step": null } ], diff --git a/src/packs/ancestries/feature_Increased_Fortitude_0RN0baBxh95GT1cm.json b/src/packs/ancestries/feature_Increased_Fortitude_0RN0baBxh95GT1cm.json index 8ecbfb61..2de5bbaf 100644 --- a/src/packs/ancestries/feature_Increased_Fortitude_0RN0baBxh95GT1cm.json +++ b/src/packs/ancestries/feature_Increased_Fortitude_0RN0baBxh95GT1cm.json @@ -20,7 +20,6 @@ "scalable": false, "key": "hope", "value": 3, - "keyIsID": false, "step": null } ], diff --git a/src/packs/ancestries/feature_Long_Tongue_oWbdlh51ajn1Q5kL.json b/src/packs/ancestries/feature_Long_Tongue_oWbdlh51ajn1Q5kL.json index d474f7ca..0a569130 100644 --- a/src/packs/ancestries/feature_Long_Tongue_oWbdlh51ajn1Q5kL.json +++ b/src/packs/ancestries/feature_Long_Tongue_oWbdlh51ajn1Q5kL.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/ancestries/feature_Luckbender_U6iFjZgLYawlOlQZ.json b/src/packs/ancestries/feature_Luckbender_U6iFjZgLYawlOlQZ.json index 6059aa88..70dcaa51 100644 --- a/src/packs/ancestries/feature_Luckbender_U6iFjZgLYawlOlQZ.json +++ b/src/packs/ancestries/feature_Luckbender_U6iFjZgLYawlOlQZ.json @@ -20,7 +20,6 @@ "scalable": false, "key": "hope", "value": 3, - "keyIsID": false, "step": null } ], diff --git a/src/packs/ancestries/feature_Quick_Reactions_0NSPSuB8KSEYTJIP.json b/src/packs/ancestries/feature_Quick_Reactions_0NSPSuB8KSEYTJIP.json index 522faf75..4384e554 100644 --- a/src/packs/ancestries/feature_Quick_Reactions_0NSPSuB8KSEYTJIP.json +++ b/src/packs/ancestries/feature_Quick_Reactions_0NSPSuB8KSEYTJIP.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/ancestries/feature_Retract_UFR67BUOhNGLFyg9.json b/src/packs/ancestries/feature_Retract_UFR67BUOhNGLFyg9.json index 59e33ce4..0e3e6555 100644 --- a/src/packs/ancestries/feature_Retract_UFR67BUOhNGLFyg9.json +++ b/src/packs/ancestries/feature_Retract_UFR67BUOhNGLFyg9.json @@ -23,12 +23,12 @@ }, "effects": [], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Mark Stress", "img": "icons/magic/defensive/shield-barrier-flaming-diamond-teal.webp", - "range": "" + "range": "self" } }, "originItemType": null, @@ -111,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753996513763, - "modifiedTime": 1755394440308, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756040910699, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items!UFR67BUOhNGLFyg9" } diff --git a/src/packs/ancestries/feature_Tusks_YhxD1ujZpftPu19w.json b/src/packs/ancestries/feature_Tusks_YhxD1ujZpftPu19w.json index 746be465..09e749a3 100644 --- a/src/packs/ancestries/feature_Tusks_YhxD1ujZpftPu19w.json +++ b/src/packs/ancestries/feature_Tusks_YhxD1ujZpftPu19w.json @@ -17,7 +17,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/ancestries/feature_Wings_WquAjoOcso8lwySW.json b/src/packs/ancestries/feature_Wings_WquAjoOcso8lwySW.json index 7bc73dc6..ee14bca6 100644 --- a/src/packs/ancestries/feature_Wings_WquAjoOcso8lwySW.json +++ b/src/packs/ancestries/feature_Wings_WquAjoOcso8lwySW.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -31,12 +30,12 @@ }, "effects": [], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Mark Stress", "img": "icons/creatures/abilities/wing-batlike-white-blue.webp", - "range": "" + "range": "self" } }, "originItemType": null, @@ -113,10 +112,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753994723305, - "modifiedTime": 1755394368487, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756040981649, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items!WquAjoOcso8lwySW" } diff --git a/src/packs/beastforms/feature_Agile_xLS5YT1B6yeCiNTg.json b/src/packs/beastforms/feature_Agile_xLS5YT1B6yeCiNTg.json index 4c54bebb..bbc22d34 100644 --- a/src/packs/beastforms/feature_Agile_xLS5YT1B6yeCiNTg.json +++ b/src/packs/beastforms/feature_Agile_xLS5YT1B6yeCiNTg.json @@ -15,7 +15,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/beastforms/feature_Armored_Shell_nDQZdIF2epKlhauX.json b/src/packs/beastforms/feature_Armored_Shell_nDQZdIF2epKlhauX.json index b4d711a5..4d6a5627 100644 --- a/src/packs/beastforms/feature_Armored_Shell_nDQZdIF2epKlhauX.json +++ b/src/packs/beastforms/feature_Armored_Shell_nDQZdIF2epKlhauX.json @@ -18,13 +18,12 @@ "scalable": false, "key": "armor", "value": 1, - "keyIsID": false, "step": null } ], "uses": { "value": null, - "max": null, + "max": "", "recovery": null }, "effects": [ @@ -39,7 +38,7 @@ }, "name": "Retract", "img": "icons/creatures/reptiles/turtle-shell-glowing-green.webp", - "range": "" + "range": "self" } }, "originItemType": null, @@ -149,10 +148,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753580983699, - "modifiedTime": 1755395623887, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756041050697, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "nDQZdIF2epKlhauX", "sort": 2200000, diff --git a/src/packs/beastforms/feature_Cannonball_jp5KpPRBFBOIs46Q.json b/src/packs/beastforms/feature_Cannonball_jp5KpPRBFBOIs46Q.json index 49f5f88d..c73cc803 100644 --- a/src/packs/beastforms/feature_Cannonball_jp5KpPRBFBOIs46Q.json +++ b/src/packs/beastforms/feature_Cannonball_jp5KpPRBFBOIs46Q.json @@ -37,7 +37,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/beastforms/feature_Demolish_DfBXO8jTchwFG8dZ.json b/src/packs/beastforms/feature_Demolish_DfBXO8jTchwFG8dZ.json index 45ceee81..026db6c4 100644 --- a/src/packs/beastforms/feature_Demolish_DfBXO8jTchwFG8dZ.json +++ b/src/packs/beastforms/feature_Demolish_DfBXO8jTchwFG8dZ.json @@ -15,7 +15,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/beastforms/feature_Devastating_Strikes_HJbQcKWcFZ9NoFxs.json b/src/packs/beastforms/feature_Devastating_Strikes_HJbQcKWcFZ9NoFxs.json index 9b24e84e..a2ffb88d 100644 --- a/src/packs/beastforms/feature_Devastating_Strikes_HJbQcKWcFZ9NoFxs.json +++ b/src/packs/beastforms/feature_Devastating_Strikes_HJbQcKWcFZ9NoFxs.json @@ -18,7 +18,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/beastforms/feature_Elusive_Prey_a7Qvmm14nx9BCysA.json b/src/packs/beastforms/feature_Elusive_Prey_a7Qvmm14nx9BCysA.json index 27b3eb9c..582d3c4e 100644 --- a/src/packs/beastforms/feature_Elusive_Prey_a7Qvmm14nx9BCysA.json +++ b/src/packs/beastforms/feature_Elusive_Prey_a7Qvmm14nx9BCysA.json @@ -18,7 +18,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/beastforms/feature_Fleet_GhHsSHOa509cwCvr.json b/src/packs/beastforms/feature_Fleet_GhHsSHOa509cwCvr.json index 554cba68..dd13a8cc 100644 --- a/src/packs/beastforms/feature_Fleet_GhHsSHOa509cwCvr.json +++ b/src/packs/beastforms/feature_Fleet_GhHsSHOa509cwCvr.json @@ -15,7 +15,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/beastforms/feature_Hobbling_Strike_8u0HkK3WgtU9lWYs.json b/src/packs/beastforms/feature_Hobbling_Strike_8u0HkK3WgtU9lWYs.json index 95477418..fa90cf04 100644 --- a/src/packs/beastforms/feature_Hobbling_Strike_8u0HkK3WgtU9lWYs.json +++ b/src/packs/beastforms/feature_Hobbling_Strike_8u0HkK3WgtU9lWYs.json @@ -18,7 +18,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/beastforms/feature_Rampage_8upqfcZvi7b5hRLE.json b/src/packs/beastforms/feature_Rampage_8upqfcZvi7b5hRLE.json index 3ac9731d..eedab4d6 100644 --- a/src/packs/beastforms/feature_Rampage_8upqfcZvi7b5hRLE.json +++ b/src/packs/beastforms/feature_Rampage_8upqfcZvi7b5hRLE.json @@ -18,28 +18,27 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], "uses": { "value": null, - "max": null, + "max": "", "recovery": null }, "effects": [ { - "_id": "5TX0hHFKZHvBeWne", + "_id": "A7l4JEBC1FFQajsN", "onSave": false } ], "target": { - "type": null, + "type": "self", "amount": null }, - "name": "Gain Proficiency", + "name": "Mark Stress", "img": "icons/creatures/abilities/bear-roar-bite-brown.webp", - "range": "" + "range": "self" } }, "originItemType": null, @@ -51,7 +50,59 @@ "artist": "" } }, - "effects": [], + "effects": [ + { + "name": "Rampage", + "img": "icons/creatures/claws/claw-bear-paw-swipe-red.webp", + "origin": "Compendium.daggerheart.beastforms.Item.8upqfcZvi7b5hRLE", + "transfer": false, + "_id": "A7l4JEBC1FFQajsN", + "type": "base", + "system": { + "rangeDependence": { + "enabled": false, + "type": "withinRange", + "target": "hostile", + "range": "melee" + } + }, + "changes": [ + { + "key": "system.proficiency", + "mode": 2, + "value": "1", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "

Before you make an attack roll, you can mark a Stress to gain a +1 bonus to your Proficiency for that attack.

", + "tint": "#ffffff", + "statuses": [], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.347", + "systemId": "daggerheart", + "systemVersion": "1.1.0", + "createdTime": 1756041194412, + "modifiedTime": 1756041218646, + "lastModifiedBy": "vUIbuan0U50nfKBE" + }, + "_key": "!items.effects!8upqfcZvi7b5hRLE.A7l4JEBC1FFQajsN" + } + ], "folder": "uU8bIoZvXge0rLaU", "ownership": { "default": 0, @@ -64,10 +115,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753582591417, - "modifiedTime": 1755395649724, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756041228102, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "8upqfcZvi7b5hRLE", "sort": 2000000, diff --git a/src/packs/beastforms/feature_Snapping_Strike_Ky3rZD3sJMXYZOBC.json b/src/packs/beastforms/feature_Snapping_Strike_Ky3rZD3sJMXYZOBC.json index e49f6b47..0ab50abe 100644 --- a/src/packs/beastforms/feature_Snapping_Strike_Ky3rZD3sJMXYZOBC.json +++ b/src/packs/beastforms/feature_Snapping_Strike_Ky3rZD3sJMXYZOBC.json @@ -15,7 +15,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/beastforms/feature_Takedown_0ey4kM9ssj2otHvb.json b/src/packs/beastforms/feature_Takedown_0ey4kM9ssj2otHvb.json index a1a14198..5392665b 100644 --- a/src/packs/beastforms/feature_Takedown_0ey4kM9ssj2otHvb.json +++ b/src/packs/beastforms/feature_Takedown_0ey4kM9ssj2otHvb.json @@ -18,13 +18,12 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], "uses": { "value": null, - "max": null, + "max": "", "recovery": null }, "damage": { @@ -58,7 +57,7 @@ "includeBase": false }, "target": { - "type": "any", + "type": "self", "amount": null }, "effects": [], @@ -84,7 +83,7 @@ }, "name": "Attack", "img": "icons/creatures/abilities/paw-print-orange.webp", - "range": "" + "range": "self" } }, "originItemType": null, @@ -101,7 +100,7 @@ "name": "Takedown", "img": "icons/creatures/abilities/paw-print-orange.webp", "origin": "Item.okjlLUwEdNOKeUk3", - "transfer": false, + "transfer": true, "_id": "hE6ciIusvKEtUQ8U", "type": "base", "system": {}, @@ -113,7 +112,7 @@ "priority": null } ], - "disabled": false, + "disabled": true, "duration": { "startTime": null, "combat": null, @@ -123,7 +122,7 @@ "startRound": null, "startTurn": null }, - "description": "", + "description": "

You gain a +2 bonus to your Proficiency for this attack and the target must mark a Stress.

", "tint": "#ffffff", "statuses": [], "sort": 0, @@ -132,10 +131,11 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.346", + "coreVersion": "13.347", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "vUIbuan0U50nfKBE", + "modifiedTime": 1756041368153 }, "_key": "!items.effects!0ey4kM9ssj2otHvb.hE6ciIusvKEtUQ8U" } @@ -152,10 +152,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753621786000, - "modifiedTime": 1755395696040, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756041242273, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "0ey4kM9ssj2otHvb", "sort": 600000, diff --git a/src/packs/beastforms/feature_Trample_A0lgd6eVEfX6oqSB.json b/src/packs/beastforms/feature_Trample_A0lgd6eVEfX6oqSB.json index b55d8f6e..0db60d14 100644 --- a/src/packs/beastforms/feature_Trample_A0lgd6eVEfX6oqSB.json +++ b/src/packs/beastforms/feature_Trample_A0lgd6eVEfX6oqSB.json @@ -18,7 +18,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/beastforms/feature_Vicious_Maul_jYUBi7yLHap5ljpa.json b/src/packs/beastforms/feature_Vicious_Maul_jYUBi7yLHap5ljpa.json index 06706094..8083ec69 100644 --- a/src/packs/beastforms/feature_Vicious_Maul_jYUBi7yLHap5ljpa.json +++ b/src/packs/beastforms/feature_Vicious_Maul_jYUBi7yLHap5ljpa.json @@ -15,7 +15,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/beastforms/feature_Warning_Hiss_cTlqpQZPy5TvdDAT.json b/src/packs/beastforms/feature_Warning_Hiss_cTlqpQZPy5TvdDAT.json index 39b4a777..639966e6 100644 --- a/src/packs/beastforms/feature_Warning_Hiss_cTlqpQZPy5TvdDAT.json +++ b/src/packs/beastforms/feature_Warning_Hiss_cTlqpQZPy5TvdDAT.json @@ -18,7 +18,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/classes/class_Bard_vegl3bFOq3pcFTWT.json b/src/packs/classes/class_Bard_vegl3bFOq3pcFTWT.json index f0057263..dfa5f29c 100644 --- a/src/packs/classes/class_Bard_vegl3bFOq3pcFTWT.json +++ b/src/packs/classes/class_Bard_vegl3bFOq3pcFTWT.json @@ -63,7 +63,17 @@ "source": "Daggerheart SRD", "page": 9, "artist": "" - } + }, + "backgroundQuestions": [ + "Who from your community taught you to have such confidence in yourself?", + "You were in love once. Who did you adore, and how did they hurt you?", + "You’ve always looked up to another bard. Who are they, and why do you idolize them?" + ], + "connections": [ + "What made you realize we were going to be such good friends?", + "What do I do that annoys you?", + "Why do you grab my hand at night?" + ] }, "effects": [], "ownership": { @@ -77,10 +87,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.2", "createdTime": 1754174600538, - "modifiedTime": 1755390999058, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756399046200, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_id": "vegl3bFOq3pcFTWT", "sort": 300000, diff --git a/src/packs/classes/class_Druid_ZNwUTCyGCEcidZFv.json b/src/packs/classes/class_Druid_ZNwUTCyGCEcidZFv.json index 6b7d137d..5e30b889 100644 --- a/src/packs/classes/class_Druid_ZNwUTCyGCEcidZFv.json +++ b/src/packs/classes/class_Druid_ZNwUTCyGCEcidZFv.json @@ -63,7 +63,17 @@ "source": "Daggerheart SRD", "page": 10, "artist": "" - } + }, + "backgroundQuestions": [ + "Why was the community you grew up in so reliant on nature and its creatures?", + "Who was the first wild animal you bonded with? Why did your bond end?", + "Who has been trying to hunt you down? What do they want from you?" + ], + "connections": [ + "What did you confide in me that makes me leap into danger for you every time?", + "What animal do I say you remind me of?", + "What affectionate nickname have you given me?" + ] }, "effects": [], "folder": null, @@ -79,10 +89,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.2", "createdTime": 1754222247012, - "modifiedTime": 1755391012909, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756399003725, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!ZNwUTCyGCEcidZFv" } diff --git a/src/packs/classes/class_Guardian_nRAyoC0fOzXPDa4z.json b/src/packs/classes/class_Guardian_nRAyoC0fOzXPDa4z.json index 47677e4f..c412abba 100644 --- a/src/packs/classes/class_Guardian_nRAyoC0fOzXPDa4z.json +++ b/src/packs/classes/class_Guardian_nRAyoC0fOzXPDa4z.json @@ -59,7 +59,17 @@ "source": "Daggerheart SRD", "page": 15, "artist": "" - } + }, + "backgroundQuestions": [ + "Who from your community did you fail to protect, and why do you still think of them?", + "You’ve been tasked with protecting something important and delivering\nit somewhere dangerous. What is it, and where does it need to go?", + "You consider an aspect of yourself to be a weakness. What is it, and how has it affected you?" + ], + "connections": [ + "How did I save your life the first time we met?", + "What small gift did you give me that you notice I always carry with me?", + "What lie have you told me about yourself that I absolutely believe?" + ] }, "effects": [], "folder": null, @@ -75,10 +85,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.2", "createdTime": 1754246931974, - "modifiedTime": 1755391032291, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756398951257, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!nRAyoC0fOzXPDa4z" } diff --git a/src/packs/classes/class_Ranger_BTyfve69LKqoOi9S.json b/src/packs/classes/class_Ranger_BTyfve69LKqoOi9S.json index 51a016a4..f85f6d59 100644 --- a/src/packs/classes/class_Ranger_BTyfve69LKqoOi9S.json +++ b/src/packs/classes/class_Ranger_BTyfve69LKqoOi9S.json @@ -59,7 +59,17 @@ "source": "Daggerheart SRD", "page": 16, "artist": "" - } + }, + "backgroundQuestions": [ + "A terrible creature hurt your community, and you’ve vowed to hunt them down. What are they, and what unique trail or sign do they leave behind?", + "Your first kill almost killed you, too. What was it, and what part of you was never the same after that event?", + "You’ve traveled many dangerous lands, but what is the one place you refuse to go?" + ], + "connections": [ + "What friendly competition do we have?", + "Why do you act differently when we’re alone than when others are around?", + "What threat have you asked me to watch for, and why are you worried about it?" + ] }, "effects": [], "folder": null, @@ -75,10 +85,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.2", "createdTime": 1754268869310, - "modifiedTime": 1755391043325, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756398897309, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!BTyfve69LKqoOi9S" } diff --git a/src/packs/classes/class_Rogue_CvHlkHZfpMiCz5uT.json b/src/packs/classes/class_Rogue_CvHlkHZfpMiCz5uT.json index aa40d9bf..a0a59613 100644 --- a/src/packs/classes/class_Rogue_CvHlkHZfpMiCz5uT.json +++ b/src/packs/classes/class_Rogue_CvHlkHZfpMiCz5uT.json @@ -63,7 +63,17 @@ "source": "Daggerheart SRD", "page": 19, "artist": "" - } + }, + "backgroundQuestions": [ + "What did you get caught doing that got you exiled from your home community?", + "You used to have a different life, but you’ve tried to leave it behind. Who from your past is still chasing you?", + "Who from your past were you most sad to say goodbye to?" + ], + "connections": [ + "What did I recently convince you to do that got us both in trouble?", + "What have I discovered about your past that I hold secret from the others?", + "Who do you know from my past, and how have they influenced your feelings about me?" + ] }, "effects": [], "folder": null, @@ -79,10 +89,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.2", "createdTime": 1754325275832, - "modifiedTime": 1755391064025, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756398839983, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!CvHlkHZfpMiCz5uT" } diff --git a/src/packs/classes/class_Seraph_5ZnlJ5bEoyOTkUJv.json b/src/packs/classes/class_Seraph_5ZnlJ5bEoyOTkUJv.json index 1f020737..fa11b261 100644 --- a/src/packs/classes/class_Seraph_5ZnlJ5bEoyOTkUJv.json +++ b/src/packs/classes/class_Seraph_5ZnlJ5bEoyOTkUJv.json @@ -59,7 +59,17 @@ "source": "Daggerheart SRD", "page": 20, "artist": "" - } + }, + "backgroundQuestions": [ + "Which god did you devote yourself to? What incredible feat did they perform for you in a moment of desperation?", + "How did your appearance change after taking your oath?", + "In what strange or unique way do you communicate with your god?" + ], + "connections": [ + "What promise did you make me agree to, should you die on the battlefield?", + "Why do you ask me so many questions about my god?", + "You’ve told me to protect one member of our party above all others, even yourself. Who are they and why?" + ] }, "effects": [], "folder": null, @@ -75,10 +85,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.2", "createdTime": 1754351482530, - "modifiedTime": 1755391077728, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756398795596, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!5ZnlJ5bEoyOTkUJv" } diff --git a/src/packs/classes/class_Sorcerer_DchOzHcWIJE9FKcR.json b/src/packs/classes/class_Sorcerer_DchOzHcWIJE9FKcR.json index 2f04b0c5..a096f177 100644 --- a/src/packs/classes/class_Sorcerer_DchOzHcWIJE9FKcR.json +++ b/src/packs/classes/class_Sorcerer_DchOzHcWIJE9FKcR.json @@ -67,7 +67,17 @@ "source": "Daggerheart SRD", "page": 22, "artist": "" - } + }, + "backgroundQuestions": [ + "What did you do that made the people in your community wary of you?", + "What mentor taught you to control your untamed magic, and why are they no longer able to guide you?", + "You have a deep fear you hide from everyone. What is it, and why does it scare you?" + ], + "connections": [ + "Why do you trust me so deeply?", + "What did I do that makes you cautious around me?", + "Why do we keep our shared past a secret?" + ] }, "effects": [], "folder": null, @@ -83,10 +93,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.2", "createdTime": 1754349743129, - "modifiedTime": 1755391092028, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756398741027, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!DchOzHcWIJE9FKcR" } diff --git a/src/packs/classes/class_Warrior_xCUWwJz4WSthvLfy.json b/src/packs/classes/class_Warrior_xCUWwJz4WSthvLfy.json index 8e0de2a2..3ecb2b72 100644 --- a/src/packs/classes/class_Warrior_xCUWwJz4WSthvLfy.json +++ b/src/packs/classes/class_Warrior_xCUWwJz4WSthvLfy.json @@ -63,7 +63,17 @@ "source": "Daggerheart SRD", "page": 23, "artist": "" - } + }, + "backgroundQuestions": [ + "Who taught you to fight, and why did they stay behind when you left home?", + "Somebody defeated you in battle years ago and left you to die. Who was it, and how did they betray you?", + "What legendary place have you always wanted to visit, and why is it so special?" + ], + "connections": [ + "We knew each other long before this party came together. How?", + "What mundane task do you usually help me with off the battlefield?", + "What fear am I helping you overcome?" + ] }, "effects": [], "folder": null, @@ -79,10 +89,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.2", "createdTime": 1754255776706, - "modifiedTime": 1755391103528, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756398696324, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!xCUWwJz4WSthvLfy" } diff --git a/src/packs/classes/class_Wizard_5LwX4m8ziY3F1ZGC.json b/src/packs/classes/class_Wizard_5LwX4m8ziY3F1ZGC.json index c36cef8c..d5cc53ca 100644 --- a/src/packs/classes/class_Wizard_5LwX4m8ziY3F1ZGC.json +++ b/src/packs/classes/class_Wizard_5LwX4m8ziY3F1ZGC.json @@ -63,7 +63,17 @@ "source": "Daggerheart SRD", "page": 25, "artist": "" - } + }, + "backgroundQuestions": [ + "What responsibilities did your community once count on you for?\nHow did you let them down?", + "You’ve spent your life searching for a book or object of great\nsignificance. What is it, and why is it so important to you?", + "You have a powerful rival. Who are they, and why are you so determined to defeat them?" + ], + "connections": [ + "What favor have I asked of you that you’re not sure you can fulfill?", + "What weird hobby or strange fascination do we both share?", + "What secret about yourself have you entrusted only to me?" + ] }, "effects": [], "folder": null, @@ -79,10 +89,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.2", "createdTime": 1754253505323, - "modifiedTime": 1755391118180, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756391897762, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!5LwX4m8ziY3F1ZGC" } diff --git a/src/packs/classes/feature_Beastform_P1K0jcnH2RiS6TLd.json b/src/packs/classes/feature_Beastform_P1K0jcnH2RiS6TLd.json index a0aab233..327e611f 100644 --- a/src/packs/classes/feature_Beastform_P1K0jcnH2RiS6TLd.json +++ b/src/packs/classes/feature_Beastform_P1K0jcnH2RiS6TLd.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/classes/feature_Channel_Raw_Power_P02cbN50LIoD662z.json b/src/packs/classes/feature_Channel_Raw_Power_P02cbN50LIoD662z.json index d0b792cc..a371bfea 100644 --- a/src/packs/classes/feature_Channel_Raw_Power_P02cbN50LIoD662z.json +++ b/src/packs/classes/feature_Channel_Raw_Power_P02cbN50LIoD662z.json @@ -20,7 +20,6 @@ "scalable": false, "key": "hitPoints", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/classes/feature_Evolution_6rlxhrRwFaVgq9fe.json b/src/packs/classes/feature_Evolution_6rlxhrRwFaVgq9fe.json index 8194c296..cd011361 100644 --- a/src/packs/classes/feature_Evolution_6rlxhrRwFaVgq9fe.json +++ b/src/packs/classes/feature_Evolution_6rlxhrRwFaVgq9fe.json @@ -20,7 +20,6 @@ "scalable": false, "key": "hope", "value": 3, - "keyIsID": false, "step": null } ], diff --git a/src/packs/classes/feature_Frontline_Tank_YS1g7YdWwOaS629x.json b/src/packs/classes/feature_Frontline_Tank_YS1g7YdWwOaS629x.json index a0b56f5f..b2e30707 100644 --- a/src/packs/classes/feature_Frontline_Tank_YS1g7YdWwOaS629x.json +++ b/src/packs/classes/feature_Frontline_Tank_YS1g7YdWwOaS629x.json @@ -20,7 +20,6 @@ "scalable": false, "key": "hope", "value": 3, - "keyIsID": false, "step": null } ], @@ -60,7 +59,7 @@ "includeBase": false }, "target": { - "type": "any", + "type": "self", "amount": null }, "effects": [], @@ -81,7 +80,7 @@ }, "name": "Spend Hope", "img": "icons/magic/defensive/shield-barrier-flaming-pentagon-orange.webp", - "range": "" + "range": "self" } }, "originItemType": null, @@ -105,10 +104,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754246687097, - "modifiedTime": 1755391259920, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756034159296, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items!YS1g7YdWwOaS629x" } diff --git a/src/packs/classes/feature_Hold_Them_Off_2Cyb9ZeuAesf5Sb3.json b/src/packs/classes/feature_Hold_Them_Off_2Cyb9ZeuAesf5Sb3.json index f2e99b8f..0c831a14 100644 --- a/src/packs/classes/feature_Hold_Them_Off_2Cyb9ZeuAesf5Sb3.json +++ b/src/packs/classes/feature_Hold_Them_Off_2Cyb9ZeuAesf5Sb3.json @@ -5,14 +5,14 @@ "_id": "2Cyb9ZeuAesf5Sb3", "img": "icons/magic/defensive/barrier-shield-dome-deflect-teal.webp", "system": { - "description": "

Spend 3 Hope when you succeed on an attack with a weapon to use that same roll against two additional adversaries within range of the attack.

", + "description": "

Spend 3 Hope when you succeed on an attack with a weapon to use that same roll against two additional adversaries within range of the attack.

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

Spend 3 Hope when you succeed on an attack with a weapon to use that same roll against two additional adversaries within range of the attack.

", + "description": "

Spend 3 Hope when you succeed on an attack with a weapon to use that same roll against two additional adversaries within range of the attack.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -20,7 +20,6 @@ "scalable": false, "key": "hope", "value": 3, - "keyIsID": false, "step": null } ], @@ -60,10 +59,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754268431889, - "modifiedTime": 1755391281371, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756034191317, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items!2Cyb9ZeuAesf5Sb3" } diff --git a/src/packs/classes/feature_Life_Support_lSlvSUHbOoX36q2j.json b/src/packs/classes/feature_Life_Support_lSlvSUHbOoX36q2j.json index 64256829..2ee5cba8 100644 --- a/src/packs/classes/feature_Life_Support_lSlvSUHbOoX36q2j.json +++ b/src/packs/classes/feature_Life_Support_lSlvSUHbOoX36q2j.json @@ -20,7 +20,6 @@ "scalable": false, "key": "hope", "value": 3, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/classes/feature_Make_a_Scene_N9E5skDDK2VgvohR.json b/src/packs/classes/feature_Make_a_Scene_N9E5skDDK2VgvohR.json index 3d92768d..1627a77a 100644 --- a/src/packs/classes/feature_Make_a_Scene_N9E5skDDK2VgvohR.json +++ b/src/packs/classes/feature_Make_a_Scene_N9E5skDDK2VgvohR.json @@ -19,7 +19,6 @@ "scalable": false, "key": "hope", "value": 3, - "keyIsID": false, "step": null } ], diff --git a/src/packs/classes/feature_No_Mercy_njj2C3tMDeCHHOoh.json b/src/packs/classes/feature_No_Mercy_njj2C3tMDeCHHOoh.json index b131fcdf..caa2462c 100644 --- a/src/packs/classes/feature_No_Mercy_njj2C3tMDeCHHOoh.json +++ b/src/packs/classes/feature_No_Mercy_njj2C3tMDeCHHOoh.json @@ -20,7 +20,6 @@ "scalable": false, "key": "hope", "value": 3, - "keyIsID": false, "step": null, "consumeOnSuccess": false } @@ -38,12 +37,12 @@ } ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Spend Hope", "img": "icons/magic/holy/barrier-shield-winged-blue.webp", - "range": "" + "range": "self" } }, "originItemType": null, @@ -119,10 +118,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754257270096, - "modifiedTime": 1755391439746, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756034406042, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items!njj2C3tMDeCHHOoh" } diff --git a/src/packs/classes/feature_Not_This_Time_h3VE0jhcM5xHKBs4.json b/src/packs/classes/feature_Not_This_Time_h3VE0jhcM5xHKBs4.json index fe59bd63..b8053ed2 100644 --- a/src/packs/classes/feature_Not_This_Time_h3VE0jhcM5xHKBs4.json +++ b/src/packs/classes/feature_Not_This_Time_h3VE0jhcM5xHKBs4.json @@ -20,7 +20,6 @@ "scalable": false, "key": "hope", "value": 3, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/classes/feature_Ranger_s_Focus_ncLx2P8BOUtrAD38.json b/src/packs/classes/feature_Ranger_s_Focus_ncLx2P8BOUtrAD38.json index 4f798663..2060a2e1 100644 --- a/src/packs/classes/feature_Ranger_s_Focus_ncLx2P8BOUtrAD38.json +++ b/src/packs/classes/feature_Ranger_s_Focus_ncLx2P8BOUtrAD38.json @@ -17,7 +17,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, @@ -29,7 +28,12 @@ "max": "", "recovery": null }, - "effects": [], + "effects": [ + { + "_id": "SXi2dQWqpwY9fap4", + "onSave": false + } + ], "target": { "type": "any", "amount": null @@ -47,7 +51,52 @@ "artist": "" } }, - "effects": [], + "effects": [ + { + "name": "Ranger's Focus", + "img": "icons/magic/perception/eye-ringed-green.webp", + "origin": "Compendium.daggerheart.classes.Item.ncLx2P8BOUtrAD38", + "transfer": false, + "_id": "SXi2dQWqpwY9fap4", + "type": "base", + "system": { + "rangeDependence": { + "enabled": false, + "type": "withinRange", + "target": "hostile", + "range": "melee" + } + }, + "changes": [], + "disabled": false, + "duration": { + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "

Until this feature ends or the ranger makes a different creature their Focus, they gain the following benefits against this adversary:

  • They know precisely what direction they are in.

  • When they deal damage to them, the adverasry must mark a Stress.

  • When they fail an attack against them, they can end their Ranger’s Focus feature to reroll their Duality Dice.

", + "tint": "#ffffff", + "statuses": [], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.347", + "systemId": "daggerheart", + "systemVersion": "1.1.0", + "createdTime": 1756034238996, + "modifiedTime": 1756034332923, + "lastModifiedBy": "vUIbuan0U50nfKBE" + }, + "_key": "!items.effects!ncLx2P8BOUtrAD38.SXi2dQWqpwY9fap4" + } + ], "sort": 0, "ownership": { "default": 0, @@ -60,10 +109,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754268505051, - "modifiedTime": 1755391289388, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756034239047, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items!ncLx2P8BOUtrAD38" } diff --git a/src/packs/classes/feature_Rogue_s_Dodge_hVaaPIjxoextIgSL.json b/src/packs/classes/feature_Rogue_s_Dodge_hVaaPIjxoextIgSL.json index 244f46c5..c96fe2fc 100644 --- a/src/packs/classes/feature_Rogue_s_Dodge_hVaaPIjxoextIgSL.json +++ b/src/packs/classes/feature_Rogue_s_Dodge_hVaaPIjxoextIgSL.json @@ -20,7 +20,6 @@ "scalable": false, "key": "hope", "value": 3, - "keyIsID": false, "step": null } ], @@ -36,7 +35,7 @@ } ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Spend Hope", @@ -76,7 +75,7 @@ "priority": null } ], - "disabled": true, + "disabled": false, "duration": { "startTime": null, "combat": null, @@ -95,12 +94,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.346", + "coreVersion": "13.347", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754323997794, - "modifiedTime": 1754351805065, - "lastModifiedBy": "MQSznptE5yLT7kj8" + "modifiedTime": 1756034385415, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items.effects!hVaaPIjxoextIgSL.hhVjBro2osGDTT5g" } @@ -117,10 +116,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754323951411, - "modifiedTime": 1755391319440, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756034357629, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items!hVaaPIjxoextIgSL" } diff --git a/src/packs/classes/feature_Sneak_Attack_5QqpEwmwkPfZHpMW.json b/src/packs/classes/feature_Sneak_Attack_5QqpEwmwkPfZHpMW.json index eb637edd..8984606c 100644 --- a/src/packs/classes/feature_Sneak_Attack_5QqpEwmwkPfZHpMW.json +++ b/src/packs/classes/feature_Sneak_Attack_5QqpEwmwkPfZHpMW.json @@ -7,35 +7,7 @@ "system": { "description": "

When you succeed on an attack while Cloaked or while an ally is within Melee range of your target, add a number of d6s equal to your tier to your damage roll.

  • Level 1 -> Tier 1

  • Levels 2–4 -> Tier 2

  • Levels 5–7 -> Tier 3

  • Levels 8–10 -> Tier 4

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

When you succeed on an attack while Cloaked or while an ally is within Melee range of your target, add a number of d6s equal to your tier to your damage roll.

  • Level 1 -> Tier 1

  • Levels 2–4 -> Tier 2

  • Levels 5–7 -> Tier 3

  • Levels 8–10 -> Tier 4

", - "chatDisplay": true, - "actionType": "action", - "cost": [], - "uses": { - "value": null, - "max": "", - "recovery": null - }, - "effects": [ - { - "_id": "380jFzw756qSy5ae", - "onSave": false - } - ], - "target": { - "type": "any", - "amount": null - }, - "name": "Use Sneak Attack", - "img": "icons/skills/melee/strike-dagger-skull-white.webp", - "range": "" - } - }, + "actions": {}, "originItemType": null, "originId": null, "attribution": { @@ -115,10 +87,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754324216454, - "modifiedTime": 1755391313725, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756034698108, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items!5QqpEwmwkPfZHpMW" } diff --git a/src/packs/classes/feature_Volatile_Magic_ieiQlD0joWSqt53D.json b/src/packs/classes/feature_Volatile_Magic_ieiQlD0joWSqt53D.json index 08c89b32..65e4c0c8 100644 --- a/src/packs/classes/feature_Volatile_Magic_ieiQlD0joWSqt53D.json +++ b/src/packs/classes/feature_Volatile_Magic_ieiQlD0joWSqt53D.json @@ -19,7 +19,6 @@ "scalable": false, "key": "hope", "value": 3, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/classes/loot_Strange_Dirty_Penant_LriTeh9hkwzEaCr1.json b/src/packs/classes/loot_Strange_Dirty_Pendant_LriTeh9hkwzEaCr1.json similarity index 80% rename from src/packs/classes/loot_Strange_Dirty_Penant_LriTeh9hkwzEaCr1.json rename to src/packs/classes/loot_Strange_Dirty_Pendant_LriTeh9hkwzEaCr1.json index ba307e05..3ca7b938 100644 --- a/src/packs/classes/loot_Strange_Dirty_Penant_LriTeh9hkwzEaCr1.json +++ b/src/packs/classes/loot_Strange_Dirty_Pendant_LriTeh9hkwzEaCr1.json @@ -1,6 +1,6 @@ { "folder": "1gQpPaxdgvCxYlLs", - "name": "Strange Dirty Penant", + "name": "Strange Dirty Pendant", "type": "loot", "_id": "LriTeh9hkwzEaCr1", "img": "icons/equipment/neck/necklace-carved-stone-spiral.webp", @@ -20,12 +20,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.346", + "coreVersion": "13.347", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754222150005, - "modifiedTime": 1754246254311, - "lastModifiedBy": "LgnbNMLaxandgMQq" + "modifiedTime": 1756136989085, + "lastModifiedBy": "HKcDBUU22bYKtQmH" }, "_key": "!items!LriTeh9hkwzEaCr1" } diff --git a/src/packs/communities/feature_Dedicated_7aXWdH3gzaYREK0X.json b/src/packs/communities/feature_Dedicated_7aXWdH3gzaYREK0X.json index 223afcf6..5591af1e 100644 --- a/src/packs/communities/feature_Dedicated_7aXWdH3gzaYREK0X.json +++ b/src/packs/communities/feature_Dedicated_7aXWdH3gzaYREK0X.json @@ -12,7 +12,7 @@ "type": "effect", "_id": "ZBVqSlsDUKf8uGrI", "systemPath": "actions", - "description": "", + "description": "

Record three sayings or values your upbringing instilled in you. Once per rest, when you describe how you’re embodying one of these principles through your current action, you can roll a d20 as your Hope Die

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -48,10 +48,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754010247432, - "modifiedTime": 1755394895431, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1755938935013, + "lastModifiedBy": "tt3PwMBXcTLCtIQU" }, "sort": 0, "ownership": { diff --git a/src/packs/communities/feature_Nomadic_Pack_2RSrQouA2zEJ5Xee.json b/src/packs/communities/feature_Nomadic_Pack_2RSrQouA2zEJ5Xee.json index 2e4c3507..b2f8eeb3 100644 --- a/src/packs/communities/feature_Nomadic_Pack_2RSrQouA2zEJ5Xee.json +++ b/src/packs/communities/feature_Nomadic_Pack_2RSrQouA2zEJ5Xee.json @@ -17,7 +17,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Adjust_Reality_Zp2S2EnLS5Iv3XuT.json b/src/packs/domains/domainCard_Adjust_Reality_Zp2S2EnLS5Iv3XuT.json index e816526d..051e27f0 100644 --- a/src/packs/domains/domainCard_Adjust_Reality_Zp2S2EnLS5Iv3XuT.json +++ b/src/packs/domains/domainCard_Adjust_Reality_Zp2S2EnLS5Iv3XuT.json @@ -22,7 +22,6 @@ "scalable": false, "key": "hope", "value": 5, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/domains/domainCard_Arcana_Touched_5PvMQKCjrgSxzstn.json b/src/packs/domains/domainCard_Arcana_Touched_5PvMQKCjrgSxzstn.json index 1f7f2aad..da201cbe 100644 --- a/src/packs/domains/domainCard_Arcana_Touched_5PvMQKCjrgSxzstn.json +++ b/src/packs/domains/domainCard_Arcana_Touched_5PvMQKCjrgSxzstn.json @@ -26,10 +26,10 @@ "actionType": "action", "cost": [ { - "scalable": false, - "key": "5PvMQKCjrgSxzstn", + "key": "resource", + "itemId": "5PvMQKCjrgSxzstn", "value": 1, - "keyIsID": true, + "scalable": false, "step": null, "consumeOnSuccess": false } @@ -63,10 +63,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753922784408, - "modifiedTime": 1755428012661, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575261, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_id": "5PvMQKCjrgSxzstn", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Arcane_Reflection_JzSvxy9Mu3RJp1jV.json b/src/packs/domains/domainCard_Arcane_Reflection_JzSvxy9Mu3RJp1jV.json index 2a6789be..d9f887c6 100644 --- a/src/packs/domains/domainCard_Arcane_Reflection_JzSvxy9Mu3RJp1jV.json +++ b/src/packs/domains/domainCard_Arcane_Reflection_JzSvxy9Mu3RJp1jV.json @@ -23,7 +23,6 @@ "key": "hope", "value": 1, "step": 1, - "keyIsID": false, "consumeOnSuccess": false } ], diff --git a/src/packs/domains/domainCard_Astral_Projection_YNOCNmZ96sCp9NEr.json b/src/packs/domains/domainCard_Astral_Projection_YNOCNmZ96sCp9NEr.json index 1927078e..619ab731 100644 --- a/src/packs/domains/domainCard_Astral_Projection_YNOCNmZ96sCp9NEr.json +++ b/src/packs/domains/domainCard_Astral_Projection_YNOCNmZ96sCp9NEr.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Battle_Monster_P0ezScyQ5t8ruByf.json b/src/packs/domains/domainCard_Battle_Monster_P0ezScyQ5t8ruByf.json index 7c2f5e54..13178c37 100644 --- a/src/packs/domains/domainCard_Battle_Monster_P0ezScyQ5t8ruByf.json +++ b/src/packs/domains/domainCard_Battle_Monster_P0ezScyQ5t8ruByf.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 4, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/domains/domainCard_Blink_Out_Qu0iA4s3Xov10Erd.json b/src/packs/domains/domainCard_Blink_Out_Qu0iA4s3Xov10Erd.json index d211ab8f..c069362d 100644 --- a/src/packs/domains/domainCard_Blink_Out_Qu0iA4s3Xov10Erd.json +++ b/src/packs/domains/domainCard_Blink_Out_Qu0iA4s3Xov10Erd.json @@ -23,7 +23,6 @@ "scalable": true, "key": "hope", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Bold_Presence_tdsL00yTSLNgZWs6.json b/src/packs/domains/domainCard_Bold_Presence_tdsL00yTSLNgZWs6.json index 164ffb48..2c80d1d5 100644 --- a/src/packs/domains/domainCard_Bold_Presence_tdsL00yTSLNgZWs6.json +++ b/src/packs/domains/domainCard_Bold_Presence_tdsL00yTSLNgZWs6.json @@ -22,7 +22,6 @@ "scalable": false, "key": "hope", "value": 1, - "keyIsID": false, "step": null } ], @@ -43,7 +42,7 @@ }, "name": "Spend Hope", "img": "icons/magic/holy/barrier-shield-winged-blue.webp", - "range": "" + "range": "self" }, "OdRTXMOXhZFiZHES": { "type": "effect", @@ -81,10 +80,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784418, - "modifiedTime": 1755429846358, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756038980509, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "tdsL00yTSLNgZWs6", "sort": 3400000, @@ -93,7 +92,7 @@ "name": "Bold Presence", "img": "icons/magic/holy/barrier-shield-winged-blue.webp", "origin": "Compendium.daggerheart.domains.Item.tdsL00yTSLNgZWs6", - "transfer": true, + "transfer": false, "_id": "2XEYhuAcRGTtqvED", "type": "base", "system": { @@ -112,7 +111,7 @@ "priority": null } ], - "disabled": true, + "disabled": false, "duration": { "startTime": null, "combat": null, @@ -131,12 +130,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.346", + "coreVersion": "13.347", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754241531511, - "modifiedTime": 1754241605959, - "lastModifiedBy": "MQSznptE5yLT7kj8" + "modifiedTime": 1756038989398, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items.effects!tdsL00yTSLNgZWs6.2XEYhuAcRGTtqvED" } diff --git a/src/packs/domains/domainCard_Bolt_Beacon_BNevJyGk7hmN7XOY.json b/src/packs/domains/domainCard_Bolt_Beacon_BNevJyGk7hmN7XOY.json index 89fac249..5363b3d8 100644 --- a/src/packs/domains/domainCard_Bolt_Beacon_BNevJyGk7hmN7XOY.json +++ b/src/packs/domains/domainCard_Bolt_Beacon_BNevJyGk7hmN7XOY.json @@ -23,7 +23,6 @@ "scalable": false, "key": "hope", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Bone_Touched_ON5bvnoQBy0SYc9Y.json b/src/packs/domains/domainCard_Bone_Touched_ON5bvnoQBy0SYc9Y.json index d398e708..922a77d9 100644 --- a/src/packs/domains/domainCard_Bone_Touched_ON5bvnoQBy0SYc9Y.json +++ b/src/packs/domains/domainCard_Bone_Touched_ON5bvnoQBy0SYc9Y.json @@ -22,7 +22,6 @@ "scalable": false, "key": "hope", "value": 3, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/domains/domainCard_Book_of_Ava_YtZzYBtR0yLPPA93.json b/src/packs/domains/domainCard_Book_of_Ava_YtZzYBtR0yLPPA93.json index 3fa7e50c..0c460a1d 100644 --- a/src/packs/domains/domainCard_Book_of_Ava_YtZzYBtR0yLPPA93.json +++ b/src/packs/domains/domainCard_Book_of_Ava_YtZzYBtR0yLPPA93.json @@ -92,7 +92,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Book_of_Exota_oVs2MSC6Uf5GbgEG.json b/src/packs/domains/domainCard_Book_of_Exota_oVs2MSC6Uf5GbgEG.json index 1073b715..611c71cb 100644 --- a/src/packs/domains/domainCard_Book_of_Exota_oVs2MSC6Uf5GbgEG.json +++ b/src/packs/domains/domainCard_Book_of_Exota_oVs2MSC6Uf5GbgEG.json @@ -66,7 +66,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Book_of_Grynn_R0LNheiZycZlZzV3.json b/src/packs/domains/domainCard_Book_of_Grynn_R0LNheiZycZlZzV3.json index c7f334db..83974d28 100644 --- a/src/packs/domains/domainCard_Book_of_Grynn_R0LNheiZycZlZzV3.json +++ b/src/packs/domains/domainCard_Book_of_Grynn_R0LNheiZycZlZzV3.json @@ -19,7 +19,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Book_of_Illiat_df4iRqQzRntrF6Qw.json b/src/packs/domains/domainCard_Book_of_Illiat_df4iRqQzRntrF6Qw.json index 35bfe6b9..1d4084d6 100644 --- a/src/packs/domains/domainCard_Book_of_Illiat_df4iRqQzRntrF6Qw.json +++ b/src/packs/domains/domainCard_Book_of_Illiat_df4iRqQzRntrF6Qw.json @@ -73,8 +73,7 @@ "scalable": true, "key": "hope", "value": 1, - "step": 1, - "keyIsID": false + "step": 1 } ], "uses": { @@ -129,7 +128,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Book_of_Korvax_cWRFHJdxEZ0M1dAg.json b/src/packs/domains/domainCard_Book_of_Korvax_cWRFHJdxEZ0M1dAg.json index be949650..d2e80c21 100644 --- a/src/packs/domains/domainCard_Book_of_Korvax_cWRFHJdxEZ0M1dAg.json +++ b/src/packs/domains/domainCard_Book_of_Korvax_cWRFHJdxEZ0M1dAg.json @@ -65,7 +65,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, @@ -122,7 +121,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Book_of_Ronin_SZMNR3uGNinJcN4N.json b/src/packs/domains/domainCard_Book_of_Ronin_SZMNR3uGNinJcN4N.json index b6f8bfcc..862d5da9 100644 --- a/src/packs/domains/domainCard_Book_of_Ronin_SZMNR3uGNinJcN4N.json +++ b/src/packs/domains/domainCard_Book_of_Ronin_SZMNR3uGNinJcN4N.json @@ -28,7 +28,7 @@ "includeBase": false }, "target": { - "type": "any", + "type": "self", "amount": null }, "effects": [ @@ -59,7 +59,7 @@ }, "name": "Transform", "img": "icons/containers/barrels/barrel-reinforced-cherry-brown.webp", - "range": "" + "range": "self" }, "h7i4ZuDYuYLnjze6": { "type": "attack", @@ -126,10 +126,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784424, - "modifiedTime": 1755429102985, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756038121293, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "SZMNR3uGNinJcN4N", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Book_of_Sitil_eq8VNqYMRHhF9xw9.json b/src/packs/domains/domainCard_Book_of_Sitil_eq8VNqYMRHhF9xw9.json index 4ee7c45c..1002b85c 100644 --- a/src/packs/domains/domainCard_Book_of_Sitil_eq8VNqYMRHhF9xw9.json +++ b/src/packs/domains/domainCard_Book_of_Sitil_eq8VNqYMRHhF9xw9.json @@ -30,12 +30,12 @@ } ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Adjust Appearance", "img": "icons/magic/defensive/shield-barrier-blades-teal.webp", - "range": "" + "range": "self" }, "wBQkw3P4Esj6kOx2": { "type": "effect", @@ -49,7 +49,6 @@ "scalable": false, "key": "hope", "value": 2, - "keyIsID": false, "step": null } ], @@ -132,10 +131,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784424, - "modifiedTime": 1755428993189, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756037990822, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "eq8VNqYMRHhF9xw9", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Book_of_Vagras_aknDDYtN7EObv94t.json b/src/packs/domains/domainCard_Book_of_Vagras_aknDDYtN7EObv94t.json index 28e768a2..1e3b3bf4 100644 --- a/src/packs/domains/domainCard_Book_of_Vagras_aknDDYtN7EObv94t.json +++ b/src/packs/domains/domainCard_Book_of_Vagras_aknDDYtN7EObv94t.json @@ -70,7 +70,6 @@ "scalable": false, "key": "hope", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Book_of_Vyola_VOIgm2j2Ijszwc5m.json b/src/packs/domains/domainCard_Book_of_Vyola_VOIgm2j2Ijszwc5m.json index b001346c..9ecf339a 100644 --- a/src/packs/domains/domainCard_Book_of_Vyola_VOIgm2j2Ijszwc5m.json +++ b/src/packs/domains/domainCard_Book_of_Vyola_VOIgm2j2Ijszwc5m.json @@ -65,7 +65,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Book_of_Yarrow_J1ovx2FpNDvPq1o6.json b/src/packs/domains/domainCard_Book_of_Yarrow_J1ovx2FpNDvPq1o6.json index 8cef1c1e..2896a467 100644 --- a/src/packs/domains/domainCard_Book_of_Yarrow_J1ovx2FpNDvPq1o6.json +++ b/src/packs/domains/domainCard_Book_of_Yarrow_J1ovx2FpNDvPq1o6.json @@ -68,7 +68,6 @@ "scalable": false, "key": "hope", "value": 5, - "keyIsID": false, "step": null } ], @@ -89,7 +88,7 @@ }, "name": "Magic Immunity", "img": "icons/magic/defensive/barrier-shield-dome-deflect-teal.webp", - "range": "" + "range": "self" } }, "attribution": { @@ -105,10 +104,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784429, - "modifiedTime": 1755429115570, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756038143042, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "J1ovx2FpNDvPq1o6", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Boost_VKAHS6eWz28ukcDs.json b/src/packs/domains/domainCard_Boost_VKAHS6eWz28ukcDs.json index ebc99d4e..f4d69fcd 100644 --- a/src/packs/domains/domainCard_Boost_VKAHS6eWz28ukcDs.json +++ b/src/packs/domains/domainCard_Boost_VKAHS6eWz28ukcDs.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/domains/domainCard_Breaking_Blow_8UANBgSdhMZ0sqfO.json b/src/packs/domains/domainCard_Breaking_Blow_8UANBgSdhMZ0sqfO.json index 567d7d57..a660200b 100644 --- a/src/packs/domains/domainCard_Breaking_Blow_8UANBgSdhMZ0sqfO.json +++ b/src/packs/domains/domainCard_Breaking_Blow_8UANBgSdhMZ0sqfO.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } @@ -41,7 +40,7 @@ ], "target": { "type": "any", - "amount": null + "amount": 1 }, "name": "Mark Stress", "img": "icons/skills/wounds/bone-broken-knee-beam.webp", @@ -61,10 +60,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784431, - "modifiedTime": 1755428345979, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756037935304, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "8UANBgSdhMZ0sqfO", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Chain_Lightning_0kAVO6rordCfZqYP.json b/src/packs/domains/domainCard_Chain_Lightning_0kAVO6rordCfZqYP.json index 5c1132f9..9193247f 100644 --- a/src/packs/domains/domainCard_Chain_Lightning_0kAVO6rordCfZqYP.json +++ b/src/packs/domains/domainCard_Chain_Lightning_0kAVO6rordCfZqYP.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 2, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/domains/domainCard_Champion_s_Edge_rnejRbUQsNGX1GMC.json b/src/packs/domains/domainCard_Champion_s_Edge_rnejRbUQsNGX1GMC.json index 80176175..48c35a57 100644 --- a/src/packs/domains/domainCard_Champion_s_Edge_rnejRbUQsNGX1GMC.json +++ b/src/packs/domains/domainCard_Champion_s_Edge_rnejRbUQsNGX1GMC.json @@ -19,7 +19,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, @@ -96,7 +95,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, @@ -173,7 +171,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Chokehold_R5GYUalYXLLFRlNl.json b/src/packs/domains/domainCard_Chokehold_R5GYUalYXLLFRlNl.json index 1785da8e..0036cad9 100644 --- a/src/packs/domains/domainCard_Chokehold_R5GYUalYXLLFRlNl.json +++ b/src/packs/domains/domainCard_Chokehold_R5GYUalYXLLFRlNl.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -57,7 +56,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Cloaking_Blast_Zhw7PtK8nMPlsOqD.json b/src/packs/domains/domainCard_Cloaking_Blast_Zhw7PtK8nMPlsOqD.json index f19833c5..a853cbcf 100644 --- a/src/packs/domains/domainCard_Cloaking_Blast_Zhw7PtK8nMPlsOqD.json +++ b/src/packs/domains/domainCard_Cloaking_Blast_Zhw7PtK8nMPlsOqD.json @@ -22,7 +22,6 @@ "scalable": true, "key": "hope", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } @@ -40,12 +39,12 @@ } ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Become Cloaked", "img": "icons/magic/perception/shadow-stealth-eyes-purple.webp", - "range": "" + "range": "self" } }, "attribution": { @@ -61,10 +60,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784435, - "modifiedTime": 1755428020354, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756037373705, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "Zhw7PtK8nMPlsOqD", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Codex_Touched_7Pu83ABdMukTxu3e.json b/src/packs/domains/domainCard_Codex_Touched_7Pu83ABdMukTxu3e.json index 69c40e15..e06b2cff 100644 --- a/src/packs/domains/domainCard_Codex_Touched_7Pu83ABdMukTxu3e.json +++ b/src/packs/domains/domainCard_Codex_Touched_7Pu83ABdMukTxu3e.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Confusing_Aura_R8NDiJXJWmC48WSr.json b/src/packs/domains/domainCard_Confusing_Aura_R8NDiJXJWmC48WSr.json index b4f0d1b5..47ab3b32 100644 --- a/src/packs/domains/domainCard_Confusing_Aura_R8NDiJXJWmC48WSr.json +++ b/src/packs/domains/domainCard_Confusing_Aura_R8NDiJXJWmC48WSr.json @@ -70,7 +70,6 @@ "key": "stress", "value": 1, "step": 1, - "keyIsID": false, "consumeOnSuccess": false } ], diff --git a/src/packs/domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json b/src/packs/domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json index 9d243ade..43bc16e1 100644 --- a/src/packs/domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json +++ b/src/packs/domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -36,7 +35,7 @@ "includeBase": false }, "target": { - "type": "any", + "type": "self", "amount": null }, "effects": [ @@ -67,7 +66,7 @@ }, "name": "Tekaira's Armored Beetles: Stress", "img": "icons/creatures/invertebrates/wasp-swarm-attack.webp", - "range": "" + "range": "self" }, "533qzPIjcccpiMey": { "type": "effect", @@ -78,7 +77,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, @@ -112,7 +110,6 @@ "scalable": false, "key": "hope", "value": 1, - "keyIsID": false, "step": null } ], @@ -195,10 +192,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784438, - "modifiedTime": 1755429481288, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756038512929, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "rZPH0BY8Sznc9sFG", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Conjured_Steeds_Jkp6cMDiHHaBZQRS.json b/src/packs/domains/domainCard_Conjured_Steeds_Jkp6cMDiHHaBZQRS.json index a4361133..28cb6834 100644 --- a/src/packs/domains/domainCard_Conjured_Steeds_Jkp6cMDiHHaBZQRS.json +++ b/src/packs/domains/domainCard_Conjured_Steeds_Jkp6cMDiHHaBZQRS.json @@ -22,8 +22,7 @@ "scalable": true, "key": "hope", "value": 1, - "step": 1, - "keyIsID": false + "step": 1 } ], "uses": { diff --git a/src/packs/domains/domainCard_Corrosive_Projectile_qJaSNTuDfbPVr8Lb.json b/src/packs/domains/domainCard_Corrosive_Projectile_qJaSNTuDfbPVr8Lb.json index ef1cd258..5bd95b01 100644 --- a/src/packs/domains/domainCard_Corrosive_Projectile_qJaSNTuDfbPVr8Lb.json +++ b/src/packs/domains/domainCard_Corrosive_Projectile_qJaSNTuDfbPVr8Lb.json @@ -93,8 +93,7 @@ "scalable": true, "key": "stress", "value": 0, - "step": 2, - "keyIsID": false + "step": 2 } ], "uses": { diff --git a/src/packs/domains/domainCard_Dark_Whispers_yL2qrSWmTwXVOySH.json b/src/packs/domains/domainCard_Dark_Whispers_yL2qrSWmTwXVOySH.json index b92f15cd..019e4d51 100644 --- a/src/packs/domains/domainCard_Dark_Whispers_yL2qrSWmTwXVOySH.json +++ b/src/packs/domains/domainCard_Dark_Whispers_yL2qrSWmTwXVOySH.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Deadly_Focus_xxZOXC4tiZQ6kg1e.json b/src/packs/domains/domainCard_Deadly_Focus_xxZOXC4tiZQ6kg1e.json index df82f1aa..9246896d 100644 --- a/src/packs/domains/domainCard_Deadly_Focus_xxZOXC4tiZQ6kg1e.json +++ b/src/packs/domains/domainCard_Deadly_Focus_xxZOXC4tiZQ6kg1e.json @@ -26,17 +26,17 @@ }, "effects": [ { - "_id": "6sR46Hd554DiLHy4", + "_id": "TFWiAUDCfGaax5MU", "onSave": false } ], "target": { - "type": "any", - "amount": null + "type": "self", + "amount": 1 }, "name": "Focus", "img": "icons/skills/targeting/crosshair-pointed-orange.webp", - "range": "" + "range": "self" } }, "attribution": { @@ -52,20 +52,20 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784443, - "modifiedTime": 1755428127375, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756037604544, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "xxZOXC4tiZQ6kg1e", "sort": 3400000, "effects": [ { "name": "Deadly Focus", - "img": "systems/daggerheart/assets/icons/domains/domain-card/blade.png", + "img": "icons/skills/targeting/crosshair-pointed-orange.webp", "origin": "Compendium.daggerheart.domains.Item.xxZOXC4tiZQ6kg1e", - "transfer": true, - "_id": "6sR46Hd554DiLHy4", + "transfer": false, + "_id": "TFWiAUDCfGaax5MU", "type": "base", "system": { "rangeDependence": { @@ -83,7 +83,7 @@ "priority": null } ], - "disabled": true, + "disabled": false, "duration": { "startTime": null, "combat": null, @@ -93,7 +93,7 @@ "startRound": null, "startTurn": null }, - "description": "", + "description": "

Until you attack another creature, you defeat the target, or the battle ends, gain a +1 bonus to your Proficiency.

", "tint": "#ffffff", "statuses": [], "sort": 0, @@ -102,14 +102,14 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.346", + "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1754244951545, - "modifiedTime": 1754304242570, - "lastModifiedBy": "MQSznptE5yLT7kj8" + "systemVersion": "1.1.0", + "createdTime": 1756037548255, + "modifiedTime": 1756037588317, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, - "_key": "!items.effects!xxZOXC4tiZQ6kg1e.6sR46Hd554DiLHy4" + "_key": "!items.effects!xxZOXC4tiZQ6kg1e.TFWiAUDCfGaax5MU" } ], "ownership": { diff --git a/src/packs/domains/domainCard_Deathrun_xFOSn8IVVNizgHFq.json b/src/packs/domains/domainCard_Deathrun_xFOSn8IVVNizgHFq.json index a4e50ac7..8d6ea214 100644 --- a/src/packs/domains/domainCard_Deathrun_xFOSn8IVVNizgHFq.json +++ b/src/packs/domains/domainCard_Deathrun_xFOSn8IVVNizgHFq.json @@ -19,7 +19,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Deft_Deceiver_38znCh6kHTkaPwYi.json b/src/packs/domains/domainCard_Deft_Deceiver_38znCh6kHTkaPwYi.json index c55fc136..3daad187 100644 --- a/src/packs/domains/domainCard_Deft_Deceiver_38znCh6kHTkaPwYi.json +++ b/src/packs/domains/domainCard_Deft_Deceiver_38znCh6kHTkaPwYi.json @@ -19,7 +19,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Deft_Maneuvers_dc4rAXlv95srZUct.json b/src/packs/domains/domainCard_Deft_Maneuvers_dc4rAXlv95srZUct.json index 1880da2e..ae4932bf 100644 --- a/src/packs/domains/domainCard_Deft_Maneuvers_dc4rAXlv95srZUct.json +++ b/src/packs/domains/domainCard_Deft_Maneuvers_dc4rAXlv95srZUct.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/domains/domainCard_Divination_K8oFepK24UVsAX8B.json b/src/packs/domains/domainCard_Divination_K8oFepK24UVsAX8B.json index 5c97f2dc..4c0a599d 100644 --- a/src/packs/domains/domainCard_Divination_K8oFepK24UVsAX8B.json +++ b/src/packs/domains/domainCard_Divination_K8oFepK24UVsAX8B.json @@ -22,7 +22,6 @@ "scalable": false, "key": "hope", "value": 3, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/domains/domainCard_Earthquake_C0qLOwSSvZ6PG3Ws.json b/src/packs/domains/domainCard_Earthquake_C0qLOwSSvZ6PG3Ws.json index 83ebfad4..e69e928c 100644 --- a/src/packs/domains/domainCard_Earthquake_C0qLOwSSvZ6PG3Ws.json +++ b/src/packs/domains/domainCard_Earthquake_C0qLOwSSvZ6PG3Ws.json @@ -19,12 +19,12 @@ "actionType": "action", "cost": [ { - "consumeOnSuccess": true, - "scalable": false, - "key": "C0qLOwSSvZ6PG3Ws", + "key": "resource", + "itemId": "C0qLOwSSvZ6PG3Ws", "value": 1, - "keyIsID": true, - "step": null + "scalable": false, + "step": null, + "consumeOnSuccess": true } ], "uses": { @@ -113,10 +113,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753922784449, - "modifiedTime": 1755428045130, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575299, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_id": "C0qLOwSSvZ6PG3Ws", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Endless_Charisma_tNzFNlVHghloKsFi.json b/src/packs/domains/domainCard_Endless_Charisma_tNzFNlVHghloKsFi.json index 6c11b1b2..0277175a 100644 --- a/src/packs/domains/domainCard_Endless_Charisma_tNzFNlVHghloKsFi.json +++ b/src/packs/domains/domainCard_Endless_Charisma_tNzFNlVHghloKsFi.json @@ -19,7 +19,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Enrapture_a8lFiKX1o8T924ze.json b/src/packs/domains/domainCard_Enrapture_a8lFiKX1o8T924ze.json index 5aca5a59..a933e609 100644 --- a/src/packs/domains/domainCard_Enrapture_a8lFiKX1o8T924ze.json +++ b/src/packs/domains/domainCard_Enrapture_a8lFiKX1o8T924ze.json @@ -73,7 +73,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Falling_Sky_hZJp9mdkMnqKDROe.json b/src/packs/domains/domainCard_Falling_Sky_hZJp9mdkMnqKDROe.json index 60018023..f827cd09 100644 --- a/src/packs/domains/domainCard_Falling_Sky_hZJp9mdkMnqKDROe.json +++ b/src/packs/domains/domainCard_Falling_Sky_hZJp9mdkMnqKDROe.json @@ -23,8 +23,7 @@ "scalable": true, "key": "stress", "value": 1, - "step": 1, - "keyIsID": false + "step": 1 } ], "uses": { diff --git a/src/packs/domains/domainCard_Flight_54GUjNuBEy7xdzMz.json b/src/packs/domains/domainCard_Flight_54GUjNuBEy7xdzMz.json index 97a3fcf7..d3ba4c1d 100644 --- a/src/packs/domains/domainCard_Flight_54GUjNuBEy7xdzMz.json +++ b/src/packs/domains/domainCard_Flight_54GUjNuBEy7xdzMz.json @@ -71,10 +71,10 @@ "actionType": "action", "cost": [ { - "scalable": false, - "key": "54GUjNuBEy7xdzMz", + "key": "resource", + "itemId": "54GUjNuBEy7xdzMz", "value": 1, - "keyIsID": true, + "scalable": false, "step": null, "consumeOnSuccess": false } @@ -114,10 +114,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753922784454, - "modifiedTime": 1755427958620, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575249, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_id": "54GUjNuBEy7xdzMz", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Force_of_Nature_LzVpMkD5I4QeaIHf.json b/src/packs/domains/domainCard_Force_of_Nature_LzVpMkD5I4QeaIHf.json index ff9b1ebf..517c42f6 100644 --- a/src/packs/domains/domainCard_Force_of_Nature_LzVpMkD5I4QeaIHf.json +++ b/src/packs/domains/domainCard_Force_of_Nature_LzVpMkD5I4QeaIHf.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -38,12 +37,12 @@ } ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Transform", "img": "icons/magic/nature/elemental-plant-humanoid.webp", - "range": "" + "range": "self" }, "1rLoYS90AZizJujS": { "type": "effect", @@ -54,7 +53,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, @@ -89,10 +87,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784456, - "modifiedTime": 1755429633230, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756038760003, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "LzVpMkD5I4QeaIHf", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Forceful_Push_z8FFPhDh2SdFkFfS.json b/src/packs/domains/domainCard_Forceful_Push_z8FFPhDh2SdFkFfS.json index 3212a11c..7f7cb2b5 100644 --- a/src/packs/domains/domainCard_Forceful_Push_z8FFPhDh2SdFkFfS.json +++ b/src/packs/domains/domainCard_Forceful_Push_z8FFPhDh2SdFkFfS.json @@ -19,7 +19,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Forest_Sprites_JrkUMTzaFmQNBHVm.json b/src/packs/domains/domainCard_Forest_Sprites_JrkUMTzaFmQNBHVm.json index a881ec6c..ecfaba75 100644 --- a/src/packs/domains/domainCard_Forest_Sprites_JrkUMTzaFmQNBHVm.json +++ b/src/packs/domains/domainCard_Forest_Sprites_JrkUMTzaFmQNBHVm.json @@ -23,8 +23,7 @@ "scalable": true, "key": "hope", "value": 1, - "step": 1, - "keyIsID": false + "step": 1 } ], "uses": { diff --git a/src/packs/domains/domainCard_Frenzy_MMl7abdGRLl7TJLO.json b/src/packs/domains/domainCard_Frenzy_MMl7abdGRLl7TJLO.json index 87dddb15..c6323551 100644 --- a/src/packs/domains/domainCard_Frenzy_MMl7abdGRLl7TJLO.json +++ b/src/packs/domains/domainCard_Frenzy_MMl7abdGRLl7TJLO.json @@ -31,12 +31,12 @@ } ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Frenzy", "img": "icons/magic/fire/projectile-wave-yellow.webp", - "range": "" + "range": "self" } }, "attribution": { @@ -52,10 +52,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784459, - "modifiedTime": 1755428186983, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756037770198, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "MMl7abdGRLl7TJLO", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Full_Surge_SgvjJfMyubZowPxS.json b/src/packs/domains/domainCard_Full_Surge_SgvjJfMyubZowPxS.json index 15ffb49e..61ee12e0 100644 --- a/src/packs/domains/domainCard_Full_Surge_SgvjJfMyubZowPxS.json +++ b/src/packs/domains/domainCard_Full_Surge_SgvjJfMyubZowPxS.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 3, - "keyIsID": false, "step": null } ], @@ -43,7 +42,7 @@ }, "name": "Mark Stress", "img": "icons/magic/control/buff-flight-wings-runes-purple.webp", - "range": "" + "range": "self" } }, "attribution": { @@ -59,10 +58,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784460, - "modifiedTime": 1755429931329, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756039042961, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "SgvjJfMyubZowPxS", "sort": 3400000, @@ -71,7 +70,7 @@ "name": "Full Surge", "img": "icons/magic/symbols/ring-circle-smoke-blue.webp", "origin": "Compendium.daggerheart.domains.Item.SgvjJfMyubZowPxS", - "transfer": true, + "transfer": false, "_id": "H5q5iYImr69TfZcp", "type": "base", "system": { @@ -120,7 +119,7 @@ "priority": null } ], - "disabled": true, + "disabled": false, "duration": { "startTime": null, "combat": null, @@ -139,12 +138,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.346", + "coreVersion": "13.347", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754242182511, - "modifiedTime": 1754242229676, - "lastModifiedBy": "MQSznptE5yLT7kj8" + "modifiedTime": 1756039048089, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items.effects!SgvjJfMyubZowPxS.H5q5iYImr69TfZcp" } diff --git a/src/packs/domains/domainCard_Gifted_Tracker_VZ2b4zfRzV73XTuT.json b/src/packs/domains/domainCard_Gifted_Tracker_VZ2b4zfRzV73XTuT.json index f4cc79de..de38e408 100644 --- a/src/packs/domains/domainCard_Gifted_Tracker_VZ2b4zfRzV73XTuT.json +++ b/src/packs/domains/domainCard_Gifted_Tracker_VZ2b4zfRzV73XTuT.json @@ -22,8 +22,7 @@ "scalable": true, "key": "hope", "value": 1, - "step": 1, - "keyIsID": false + "step": 1 } ], "uses": { diff --git a/src/packs/domains/domainCard_Glancing_Blow_nCNCqSH7UgW4O3To.json b/src/packs/domains/domainCard_Glancing_Blow_nCNCqSH7UgW4O3To.json index 71e1a34a..cde0c6f0 100644 --- a/src/packs/domains/domainCard_Glancing_Blow_nCNCqSH7UgW4O3To.json +++ b/src/packs/domains/domainCard_Glancing_Blow_nCNCqSH7UgW4O3To.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/domains/domainCard_Glyph_of_Nightfall_B5HXqYRJiL3xMNKT.json b/src/packs/domains/domainCard_Glyph_of_Nightfall_B5HXqYRJiL3xMNKT.json index d630e5f7..d24686a8 100644 --- a/src/packs/domains/domainCard_Glyph_of_Nightfall_B5HXqYRJiL3xMNKT.json +++ b/src/packs/domains/domainCard_Glyph_of_Nightfall_B5HXqYRJiL3xMNKT.json @@ -23,7 +23,6 @@ "scalable": false, "key": "hope", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Grace_Touched_KAuNb51AwhD8KEXk.json b/src/packs/domains/domainCard_Grace_Touched_KAuNb51AwhD8KEXk.json index 2a59fb30..11a9c47a 100644 --- a/src/packs/domains/domainCard_Grace_Touched_KAuNb51AwhD8KEXk.json +++ b/src/packs/domains/domainCard_Grace_Touched_KAuNb51AwhD8KEXk.json @@ -22,7 +22,6 @@ "scalable": false, "key": "armor", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Ground_Pound_WnGldYhJPDhx8v9X.json b/src/packs/domains/domainCard_Ground_Pound_WnGldYhJPDhx8v9X.json index 02091c6c..2b27f9d6 100644 --- a/src/packs/domains/domainCard_Ground_Pound_WnGldYhJPDhx8v9X.json +++ b/src/packs/domains/domainCard_Ground_Pound_WnGldYhJPDhx8v9X.json @@ -22,7 +22,6 @@ "scalable": false, "key": "hope", "value": 2, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Healing_Field_GlRm1Dxlc0Z1b04o.json b/src/packs/domains/domainCard_Healing_Field_GlRm1Dxlc0Z1b04o.json index d97dea73..49001e24 100644 --- a/src/packs/domains/domainCard_Healing_Field_GlRm1Dxlc0Z1b04o.json +++ b/src/packs/domains/domainCard_Healing_Field_GlRm1Dxlc0Z1b04o.json @@ -19,11 +19,12 @@ "actionType": "action", "cost": [ { - "scalable": false, - "key": "GlRm1Dxlc0Z1b04o", + "key": "resource", + "itemId": "GlRm1Dxlc0Z1b04o", "value": 1, - "keyIsID": true, - "step": null + "scalable": false, + "step": null, + "consumeOnSuccess": false } ], "uses": { @@ -94,18 +95,20 @@ "actionType": "action", "cost": [ { - "scalable": false, "key": "hope", + "itemId": null, "value": 2, - "keyIsID": false, - "step": null + "scalable": false, + "step": null, + "consumeOnSuccess": false }, { - "scalable": false, - "key": "GlRm1Dxlc0Z1b04o", + "key": "resource", + "itemId": "GlRm1Dxlc0Z1b04o", "value": 1, - "keyIsID": true, - "step": null + "scalable": false, + "step": null, + "consumeOnSuccess": false } ], "uses": { @@ -189,10 +192,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753922784466, - "modifiedTime": 1755429518847, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575341, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_id": "GlRm1Dxlc0Z1b04o", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Healing_Hands_WTlhnQMajc1r8i50.json b/src/packs/domains/domainCard_Healing_Hands_WTlhnQMajc1r8i50.json index 2f626025..5fbe8470 100644 --- a/src/packs/domains/domainCard_Healing_Hands_WTlhnQMajc1r8i50.json +++ b/src/packs/domains/domainCard_Healing_Hands_WTlhnQMajc1r8i50.json @@ -75,7 +75,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -151,7 +150,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } @@ -228,7 +226,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } @@ -305,7 +302,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/domains/domainCard_Healing_Strike_XtSc0jIJLOoMTMYS.json b/src/packs/domains/domainCard_Healing_Strike_XtSc0jIJLOoMTMYS.json index 76af7794..68c2143b 100644 --- a/src/packs/domains/domainCard_Healing_Strike_XtSc0jIJLOoMTMYS.json +++ b/src/packs/domains/domainCard_Healing_Strike_XtSc0jIJLOoMTMYS.json @@ -22,7 +22,6 @@ "scalable": false, "key": "hope", "value": 2, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/domains/domainCard_Hold_the_Line_kdFoLo3KXwn4LqTG.json b/src/packs/domains/domainCard_Hold_the_Line_kdFoLo3KXwn4LqTG.json index b572243f..cbca693c 100644 --- a/src/packs/domains/domainCard_Hold_the_Line_kdFoLo3KXwn4LqTG.json +++ b/src/packs/domains/domainCard_Hold_the_Line_kdFoLo3KXwn4LqTG.json @@ -19,7 +19,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, @@ -43,7 +42,7 @@ }, "name": "Spend Hope", "img": "icons/magic/holy/barrier-shield-winged-blue.webp", - "range": "" + "range": "self" }, "SKG6Gu0uJZxtYTnz": { "type": "effect", @@ -87,10 +86,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784468, - "modifiedTime": 1755429945423, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756039072992, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "kdFoLo3KXwn4LqTG", "sort": 3400000, @@ -99,7 +98,7 @@ "name": "Hold the Line", "img": "icons/magic/defensive/shield-barrier-blue.webp", "origin": "Compendium.daggerheart.domains.Item.kdFoLo3KXwn4LqTG", - "transfer": true, + "transfer": false, "_id": "y82y3nUStyL8DIJL", "type": "base", "system": { @@ -111,7 +110,7 @@ } }, "changes": [], - "disabled": true, + "disabled": false, "duration": { "startTime": null, "combat": null, @@ -130,18 +129,18 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.346", + "coreVersion": "13.347", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754242295342, - "modifiedTime": 1754242434181, - "lastModifiedBy": "MQSznptE5yLT7kj8" + "modifiedTime": 1756039077113, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items.effects!kdFoLo3KXwn4LqTG.y82y3nUStyL8DIJL" }, { "name": "Hold the Line", - "img": "systems/daggerheart/assets/icons/domains/domain-card/valor.png", + "img": "icons/skills/melee/shield-block-bash-blue.webp", "origin": "Compendium.daggerheart.domains.Item.kdFoLo3KXwn4LqTG", "transfer": false, "_id": "WTYg0b8nE1XbnMiA", @@ -176,12 +175,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.346", + "coreVersion": "13.347", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754242400483, - "modifiedTime": 1754242409060, - "lastModifiedBy": "MQSznptE5yLT7kj8" + "modifiedTime": 1756039151398, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items.effects!kdFoLo3KXwn4LqTG.WTYg0b8nE1XbnMiA" } diff --git a/src/packs/domains/domainCard_Hush_gwmYasmfgXZ7tFS6.json b/src/packs/domains/domainCard_Hush_gwmYasmfgXZ7tFS6.json index f60aaf26..c82cb6a1 100644 --- a/src/packs/domains/domainCard_Hush_gwmYasmfgXZ7tFS6.json +++ b/src/packs/domains/domainCard_Hush_gwmYasmfgXZ7tFS6.json @@ -23,7 +23,6 @@ "scalable": false, "key": "hope", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Hypnotic_Shimmer_2ZeuCGVatQdPOVC6.json b/src/packs/domains/domainCard_Hypnotic_Shimmer_2ZeuCGVatQdPOVC6.json index 7579ac02..d7ad18c6 100644 --- a/src/packs/domains/domainCard_Hypnotic_Shimmer_2ZeuCGVatQdPOVC6.json +++ b/src/packs/domains/domainCard_Hypnotic_Shimmer_2ZeuCGVatQdPOVC6.json @@ -14,7 +14,7 @@ "type": "attack", "_id": "kLMAuyZktmohOSXa", "systemPath": "actions", - "description": "

Make a Spellcast Roll against all adversaries in front of you within Close range. Once per rest on a success, create an illusion of flashing colors and lights that temporarily Stuns targets you succeed against and forces them to mark a Stress. While Stunned, they can’t use reactions and can’t take any other actions until they clear this condition.

", + "description": "

Make a Spellcast Roll against all adversaries in front of you within Close range. Once per rest on a success, create an illusion of flashing colors and lights that temporarily Stuns targets you succeed against and forces them to mark a Stress. While Stunned, they can’t use reactions and can’t take any other actions until they clear this condition.

@Template[type:infront|range:c]

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -102,10 +102,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784471, - "modifiedTime": 1755429167606, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756038232979, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "2ZeuCGVatQdPOVC6", "sort": 3400000, diff --git a/src/packs/domains/domainCard_I_Am_Your_Shield_KOf6LLpMRNwjezDx.json b/src/packs/domains/domainCard_I_Am_Your_Shield_KOf6LLpMRNwjezDx.json index 866589a1..258499a7 100644 --- a/src/packs/domains/domainCard_I_Am_Your_Shield_KOf6LLpMRNwjezDx.json +++ b/src/packs/domains/domainCard_I_Am_Your_Shield_KOf6LLpMRNwjezDx.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_I_See_It_Coming_Kp6RejHGimnuoBom.json b/src/packs/domains/domainCard_I_See_It_Coming_Kp6RejHGimnuoBom.json index 0633f0e3..d44ae867 100644 --- a/src/packs/domains/domainCard_I_See_It_Coming_Kp6RejHGimnuoBom.json +++ b/src/packs/domains/domainCard_I_See_It_Coming_Kp6RejHGimnuoBom.json @@ -23,7 +23,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Inspirational_Words_cWu1o82ZF7GvnbXc.json b/src/packs/domains/domainCard_Inspirational_Words_cWu1o82ZF7GvnbXc.json index ceb386d3..5b24a20e 100644 --- a/src/packs/domains/domainCard_Inspirational_Words_cWu1o82ZF7GvnbXc.json +++ b/src/packs/domains/domainCard_Inspirational_Words_cWu1o82ZF7GvnbXc.json @@ -27,11 +27,12 @@ "actionType": "action", "cost": [ { - "scalable": false, - "key": "cWu1o82ZF7GvnbXc", + "key": "resource", + "itemId": "cWu1o82ZF7GvnbXc", "value": 1, + "scalable": false, "step": null, - "keyIsID": true + "consumeOnSuccess": false } ], "uses": { @@ -102,11 +103,12 @@ "actionType": "action", "cost": [ { - "scalable": false, - "key": "cWu1o82ZF7GvnbXc", + "key": "resource", + "itemId": "cWu1o82ZF7GvnbXc", "value": 1, - "keyIsID": true, - "step": null + "scalable": false, + "step": null, + "consumeOnSuccess": false } ], "uses": { @@ -177,11 +179,12 @@ "actionType": "action", "cost": [ { - "scalable": false, - "key": "cWu1o82ZF7GvnbXc", + "key": "resource", + "itemId": "cWu1o82ZF7GvnbXc", "value": 1, - "keyIsID": true, - "step": null + "scalable": false, + "step": null, + "consumeOnSuccess": false } ], "uses": { @@ -257,10 +260,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753922784473, - "modifiedTime": 1755429148644, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575659, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_id": "cWu1o82ZF7GvnbXc", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Invigoration_X8OfkEoI5gLTRf1B.json b/src/packs/domains/domainCard_Invigoration_X8OfkEoI5gLTRf1B.json index e655d21b..fe5da256 100644 --- a/src/packs/domains/domainCard_Invigoration_X8OfkEoI5gLTRf1B.json +++ b/src/packs/domains/domainCard_Invigoration_X8OfkEoI5gLTRf1B.json @@ -23,7 +23,6 @@ "key": "hope", "value": 1, "step": 1, - "keyIsID": false, "consumeOnSuccess": false } ], diff --git a/src/packs/domains/domainCard_Invisibility_KHkzA4Zrw8EWN1CH.json b/src/packs/domains/domainCard_Invisibility_KHkzA4Zrw8EWN1CH.json index ac5337f1..000711a8 100644 --- a/src/packs/domains/domainCard_Invisibility_KHkzA4Zrw8EWN1CH.json +++ b/src/packs/domains/domainCard_Invisibility_KHkzA4Zrw8EWN1CH.json @@ -23,7 +23,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Know_Thy_Enemy_O38MQMhJWdZnXi6b.json b/src/packs/domains/domainCard_Know_Thy_Enemy_O38MQMhJWdZnXi6b.json index 2a86115c..75b94c59 100644 --- a/src/packs/domains/domainCard_Know_Thy_Enemy_O38MQMhJWdZnXi6b.json +++ b/src/packs/domains/domainCard_Know_Thy_Enemy_O38MQMhJWdZnXi6b.json @@ -23,7 +23,6 @@ "scalable": false, "key": "hope", "value": 1, - "keyIsID": false, "step": null } ], @@ -78,7 +77,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/domains/domainCard_Lead_by_Example_YWCRplmtwpCjpq5i.json b/src/packs/domains/domainCard_Lead_by_Example_YWCRplmtwpCjpq5i.json index fa6f3c10..86e8b1ca 100644 --- a/src/packs/domains/domainCard_Lead_by_Example_YWCRplmtwpCjpq5i.json +++ b/src/packs/domains/domainCard_Lead_by_Example_YWCRplmtwpCjpq5i.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -39,7 +38,7 @@ ], "target": { "type": "any", - "amount": null + "amount": 1 }, "name": "Mark Stress", "img": "icons/magic/control/buff-flight-wings-runes-purple.webp", @@ -59,10 +58,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784475, - "modifiedTime": 1755429951881, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756039181179, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "YWCRplmtwpCjpq5i", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Life_Ward_OszbCj0jTqq2ADx9.json b/src/packs/domains/domainCard_Life_Ward_OszbCj0jTqq2ADx9.json index 1c680cd4..12884992 100644 --- a/src/packs/domains/domainCard_Life_Ward_OszbCj0jTqq2ADx9.json +++ b/src/packs/domains/domainCard_Life_Ward_OszbCj0jTqq2ADx9.json @@ -22,7 +22,6 @@ "scalable": false, "key": "hope", "value": 3, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/domains/domainCard_Manifest_Wall_TtGOtWkbr23VhHfH.json b/src/packs/domains/domainCard_Manifest_Wall_TtGOtWkbr23VhHfH.json index 077ea5d0..c938aca6 100644 --- a/src/packs/domains/domainCard_Manifest_Wall_TtGOtWkbr23VhHfH.json +++ b/src/packs/domains/domainCard_Manifest_Wall_TtGOtWkbr23VhHfH.json @@ -23,7 +23,6 @@ "scalable": false, "key": "hope", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Mass_Enrapture_ubpixIgZrJXKyM3b.json b/src/packs/domains/domainCard_Mass_Enrapture_ubpixIgZrJXKyM3b.json index 29da4453..60f93510 100644 --- a/src/packs/domains/domainCard_Mass_Enrapture_ubpixIgZrJXKyM3b.json +++ b/src/packs/domains/domainCard_Mass_Enrapture_ubpixIgZrJXKyM3b.json @@ -73,7 +73,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Mending_Touch_TGjR4vJVNbQRV8zr.json b/src/packs/domains/domainCard_Mending_Touch_TGjR4vJVNbQRV8zr.json index 12940038..84278082 100644 --- a/src/packs/domains/domainCard_Mending_Touch_TGjR4vJVNbQRV8zr.json +++ b/src/packs/domains/domainCard_Mending_Touch_TGjR4vJVNbQRV8zr.json @@ -22,7 +22,6 @@ "scalable": false, "key": "hope", "value": 2, - "keyIsID": false, "step": null, "consumeOnSuccess": false } @@ -99,7 +98,6 @@ "scalable": false, "key": "hope", "value": 2, - "keyIsID": false, "step": null, "consumeOnSuccess": false } @@ -173,18 +171,18 @@ "actionType": "action", "cost": [ { - "scalable": false, "key": "hope", + "itemId": null, "value": 2, - "keyIsID": false, + "scalable": false, "step": null, "consumeOnSuccess": false }, { - "scalable": false, - "key": "TGjR4vJVNbQRV8zr", + "key": "resource", + "itemId": "TGjR4vJVNbQRV8zr", "value": 1, - "keyIsID": true, + "scalable": false, "step": null, "consumeOnSuccess": false } @@ -258,18 +256,18 @@ "actionType": "action", "cost": [ { - "scalable": false, "key": "hope", + "itemId": null, "value": 2, - "keyIsID": false, + "scalable": false, "step": null, "consumeOnSuccess": false }, { - "scalable": false, - "key": "TGjR4vJVNbQRV8zr", + "key": "resource", + "itemId": "TGjR4vJVNbQRV8zr", "value": 1, - "keyIsID": true, + "scalable": false, "step": null, "consumeOnSuccess": false } @@ -356,10 +354,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753922784482, - "modifiedTime": 1755429662900, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575507, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_id": "TGjR4vJVNbQRV8zr", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Midnight_Spirit_FXLsB3QbQvTtqX5B.json b/src/packs/domains/domainCard_Midnight_Spirit_FXLsB3QbQvTtqX5B.json index 7809506f..8cb485e4 100644 --- a/src/packs/domains/domainCard_Midnight_Spirit_FXLsB3QbQvTtqX5B.json +++ b/src/packs/domains/domainCard_Midnight_Spirit_FXLsB3QbQvTtqX5B.json @@ -19,7 +19,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, @@ -49,7 +48,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Midnight_Touched_uSyGKVxOJcnp28po.json b/src/packs/domains/domainCard_Midnight_Touched_uSyGKVxOJcnp28po.json index ac120ef6..39c82f3a 100644 --- a/src/packs/domains/domainCard_Midnight_Touched_uSyGKVxOJcnp28po.json +++ b/src/packs/domains/domainCard_Midnight_Touched_uSyGKVxOJcnp28po.json @@ -89,7 +89,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Natural_Familiar_Tag303LoRNC5zGgl.json b/src/packs/domains/domainCard_Natural_Familiar_Tag303LoRNC5zGgl.json index 974ea647..1e2c783d 100644 --- a/src/packs/domains/domainCard_Natural_Familiar_Tag303LoRNC5zGgl.json +++ b/src/packs/domains/domainCard_Natural_Familiar_Tag303LoRNC5zGgl.json @@ -22,7 +22,6 @@ "scalable": true, "key": "hope", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } @@ -104,7 +103,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Nature_s_Tongue_atWLorlCOxcrq8WB.json b/src/packs/domains/domainCard_Nature_s_Tongue_atWLorlCOxcrq8WB.json index d290126d..4ede0a27 100644 --- a/src/packs/domains/domainCard_Nature_s_Tongue_atWLorlCOxcrq8WB.json +++ b/src/packs/domains/domainCard_Nature_s_Tongue_atWLorlCOxcrq8WB.json @@ -65,7 +65,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Never_Upstaged_McdncxmO9K1YNP7Y.json b/src/packs/domains/domainCard_Never_Upstaged_McdncxmO9K1YNP7Y.json index 5549707f..7d8ec8bc 100644 --- a/src/packs/domains/domainCard_Never_Upstaged_McdncxmO9K1YNP7Y.json +++ b/src/packs/domains/domainCard_Never_Upstaged_McdncxmO9K1YNP7Y.json @@ -25,18 +25,20 @@ "actionType": "action", "cost": [ { - "scalable": false, - "key": "McdncxmO9K1YNP7Y", + "key": "resource", + "itemId": "McdncxmO9K1YNP7Y", "value": 1, - "keyIsID": true, - "step": null + "scalable": false, + "step": null, + "consumeOnSuccess": false }, { - "scalable": false, "key": "stress", + "itemId": null, "value": 1, - "keyIsID": false, - "step": null + "scalable": false, + "step": null, + "consumeOnSuccess": false } ], "uses": { @@ -67,18 +69,20 @@ "actionType": "action", "cost": [ { - "scalable": false, "key": "stress", + "itemId": null, "value": 1, - "keyIsID": false, - "step": null + "scalable": false, + "step": null, + "consumeOnSuccess": false }, { - "scalable": false, - "key": "McdncxmO9K1YNP7Y", + "key": "resource", + "itemId": "McdncxmO9K1YNP7Y", "value": 2, - "keyIsID": true, - "step": null + "scalable": false, + "step": null, + "consumeOnSuccess": false } ], "uses": { @@ -109,18 +113,20 @@ "actionType": "action", "cost": [ { - "scalable": false, "key": "stress", + "itemId": null, "value": 1, - "keyIsID": false, - "step": null + "scalable": false, + "step": null, + "consumeOnSuccess": false }, { - "scalable": false, - "key": "McdncxmO9K1YNP7Y", + "key": "resource", + "itemId": "McdncxmO9K1YNP7Y", "value": 3, - "keyIsID": true, - "step": null + "scalable": false, + "step": null, + "consumeOnSuccess": false } ], "uses": { @@ -151,18 +157,20 @@ "actionType": "action", "cost": [ { - "scalable": false, - "key": "McdncxmO9K1YNP7Y", + "key": "resource", + "itemId": "McdncxmO9K1YNP7Y", "value": 4, - "keyIsID": true, - "step": null + "scalable": false, + "step": null, + "consumeOnSuccess": false }, { - "scalable": false, "key": "stress", + "itemId": null, "value": 1, - "keyIsID": false, - "step": null + "scalable": false, + "step": null, + "consumeOnSuccess": false } ], "uses": { @@ -198,10 +206,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753922784486, - "modifiedTime": 1755429215057, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575431, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_id": "McdncxmO9K1YNP7Y", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Night_Terror_zcldCuqOg3dphUVI.json b/src/packs/domains/domainCard_Night_Terror_zcldCuqOg3dphUVI.json index c2abcab4..f2f9a556 100644 --- a/src/packs/domains/domainCard_Night_Terror_zcldCuqOg3dphUVI.json +++ b/src/packs/domains/domainCard_Night_Terror_zcldCuqOg3dphUVI.json @@ -70,11 +70,12 @@ "actionType": "action", "cost": [ { - "scalable": true, - "key": "zcldCuqOg3dphUVI", + "key": "resource", + "itemId": "zcldCuqOg3dphUVI", "value": 1, + "scalable": true, "step": 1, - "keyIsID": true + "consumeOnSuccess": false } ], "uses": { @@ -135,10 +136,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753922784487, - "modifiedTime": 1755429413469, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575872, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_id": "zcldCuqOg3dphUVI", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Notorious_IqxzvvjZiYbgx21A.json b/src/packs/domains/domainCard_Notorious_IqxzvvjZiYbgx21A.json index 7f9244dc..4f9e09e2 100644 --- a/src/packs/domains/domainCard_Notorious_IqxzvvjZiYbgx21A.json +++ b/src/packs/domains/domainCard_Notorious_IqxzvvjZiYbgx21A.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Onslaught_I7pNsQ9Yx6mRJX4V.json b/src/packs/domains/domainCard_Onslaught_I7pNsQ9Yx6mRJX4V.json index 79fe6211..20a677d0 100644 --- a/src/packs/domains/domainCard_Onslaught_I7pNsQ9Yx6mRJX4V.json +++ b/src/packs/domains/domainCard_Onslaught_I7pNsQ9Yx6mRJX4V.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/domains/domainCard_Overwhelming_Aura_iEBLySZD9z8CLdz7.json b/src/packs/domains/domainCard_Overwhelming_Aura_iEBLySZD9z8CLdz7.json index 72a79735..20bf8aeb 100644 --- a/src/packs/domains/domainCard_Overwhelming_Aura_iEBLySZD9z8CLdz7.json +++ b/src/packs/domains/domainCard_Overwhelming_Aura_iEBLySZD9z8CLdz7.json @@ -23,7 +23,6 @@ "scalable": false, "key": "hope", "value": 2, - "keyIsID": false, "step": null } ], @@ -38,7 +37,7 @@ "includeBase": false }, "target": { - "type": "any", + "type": "self", "amount": null }, "effects": [ @@ -69,7 +68,7 @@ }, "name": "Cast", "img": "icons/magic/holy/angel-winged-humanoid-blue.webp", - "range": "" + "range": "self" } }, "attribution": { @@ -85,10 +84,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784491, - "modifiedTime": 1755429784343, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756038903709, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "iEBLySZD9z8CLdz7", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Phantom_Retreat_0vdpIn06ifF3xxqZ.json b/src/packs/domains/domainCard_Phantom_Retreat_0vdpIn06ifF3xxqZ.json index 43c2d220..3ee2198a 100644 --- a/src/packs/domains/domainCard_Phantom_Retreat_0vdpIn06ifF3xxqZ.json +++ b/src/packs/domains/domainCard_Phantom_Retreat_0vdpIn06ifF3xxqZ.json @@ -19,7 +19,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, @@ -49,7 +48,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Premonition_aC43NiFQLpOADyjO.json b/src/packs/domains/domainCard_Premonition_aC43NiFQLpOADyjO.json index 5ec9f9b8..8678a0f8 100644 --- a/src/packs/domains/domainCard_Premonition_aC43NiFQLpOADyjO.json +++ b/src/packs/domains/domainCard_Premonition_aC43NiFQLpOADyjO.json @@ -19,10 +19,10 @@ "actionType": "action", "cost": [ { - "scalable": false, - "key": "aC43NiFQLpOADyjO", + "key": "resource", + "itemId": "aC43NiFQLpOADyjO", "value": 1, - "keyIsID": true, + "scalable": false, "step": null, "consumeOnSuccess": false } @@ -63,10 +63,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753922784494, - "modifiedTime": 1755427986895, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575616, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_id": "aC43NiFQLpOADyjO", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Rage_Up_GRL0cvs96vrTDckZ.json b/src/packs/domains/domainCard_Rage_Up_GRL0cvs96vrTDckZ.json index d9d67737..f7e72b9f 100644 --- a/src/packs/domains/domainCard_Rage_Up_GRL0cvs96vrTDckZ.json +++ b/src/packs/domains/domainCard_Rage_Up_GRL0cvs96vrTDckZ.json @@ -14,7 +14,7 @@ "type": "effect", "_id": "LmjwPg03xLnoGTHm", "systemPath": "actions", - "description": "", + "description": "

You can mark a Stress to gain a bonus to your damage roll equal to twice your Strength.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -22,8 +22,7 @@ "scalable": false, "key": "stress", "value": 1, - "step": 1, - "keyIsID": false, + "step": null, "consumeOnSuccess": false } ], @@ -40,18 +39,18 @@ } ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Mark 1 Stress", "img": "icons/magic/control/silhouette-aura-energy.webp", - "range": "" + "range": "self" }, "fKY9NcYBwCFwMsgV": { "type": "effect", "_id": "fKY9NcYBwCFwMsgV", "systemPath": "actions", - "description": "", + "description": "

You can mark a Stress to gain a bonus to your damage roll equal to twice your Strength.

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -59,7 +58,6 @@ "scalable": false, "key": "stress", "value": 2, - "keyIsID": false, "step": null, "consumeOnSuccess": false } @@ -77,12 +75,12 @@ } ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Mark 2 Stress", "img": "icons/magic/control/silhouette-aura-energy.webp", - "range": "" + "range": "self" } }, "attribution": { @@ -98,10 +96,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784496, - "modifiedTime": 1755428155116, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756037744719, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "GRL0cvs96vrTDckZ", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Rain_of_Blades_Ucenef6JpjQxwXni.json b/src/packs/domains/domainCard_Rain_of_Blades_Ucenef6JpjQxwXni.json index 630960f4..a15778c3 100644 --- a/src/packs/domains/domainCard_Rain_of_Blades_Ucenef6JpjQxwXni.json +++ b/src/packs/domains/domainCard_Rain_of_Blades_Ucenef6JpjQxwXni.json @@ -14,12 +14,11 @@ "type": "attack", "_id": "WTnjKQs2uI1TuF9r", "systemPath": "actions", - "description": "

Spend a Hope to make a Spellcast Roll and conjure throwing blades that strike out at all targets within Very Close range.Β Targets you succeed against take d8+2 magic damage using your Proficiency.

", + "description": "

Spend a Hope to make a Spellcast Roll and conjure throwing blades that strike out at all targets within Very Close range.Β Targets you succeed against take d8+2 magic damage using your Proficiency.

@Template[type:emanation|range:vc]

", "chatDisplay": true, "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, @@ -154,10 +153,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784497, - "modifiedTime": 1755429293162, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756038335767, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "Ucenef6JpjQxwXni", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Rapid_Riposte_tceJDcCUefrMS2Ov.json b/src/packs/domains/domainCard_Rapid_Riposte_tceJDcCUefrMS2Ov.json index 6da00db8..2f3bb3a0 100644 --- a/src/packs/domains/domainCard_Rapid_Riposte_tceJDcCUefrMS2Ov.json +++ b/src/packs/domains/domainCard_Rapid_Riposte_tceJDcCUefrMS2Ov.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/domains/domainCard_Reaper_s_Strike_MCgNRlh0s5XUPCfl.json b/src/packs/domains/domainCard_Reaper_s_Strike_MCgNRlh0s5XUPCfl.json index 0bc016be..df98b899 100644 --- a/src/packs/domains/domainCard_Reaper_s_Strike_MCgNRlh0s5XUPCfl.json +++ b/src/packs/domains/domainCard_Reaper_s_Strike_MCgNRlh0s5XUPCfl.json @@ -19,7 +19,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Reckless_2ooUo2yoilGifY81.json b/src/packs/domains/domainCard_Reckless_2ooUo2yoilGifY81.json index 28847ad5..3784874b 100644 --- a/src/packs/domains/domainCard_Reckless_2ooUo2yoilGifY81.json +++ b/src/packs/domains/domainCard_Reckless_2ooUo2yoilGifY81.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/domains/domainCard_Redirect_faU0XkJCbar69PiN.json b/src/packs/domains/domainCard_Redirect_faU0XkJCbar69PiN.json index c30bfb3c..86c765a2 100644 --- a/src/packs/domains/domainCard_Redirect_faU0XkJCbar69PiN.json +++ b/src/packs/domains/domainCard_Redirect_faU0XkJCbar69PiN.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/domains/domainCard_Restoration_wUQFsRtww18naYaq.json b/src/packs/domains/domainCard_Restoration_wUQFsRtww18naYaq.json index 89ebb736..1d64e639 100644 --- a/src/packs/domains/domainCard_Restoration_wUQFsRtww18naYaq.json +++ b/src/packs/domains/domainCard_Restoration_wUQFsRtww18naYaq.json @@ -27,11 +27,11 @@ "actionType": "action", "cost": [ { - "scalable": true, - "key": "wUQFsRtww18naYaq", + "key": "resource", + "itemId": "wUQFsRtww18naYaq", "value": 1, + "scalable": true, "step": null, - "keyIsID": true, "consumeOnSuccess": false } ], @@ -104,11 +104,11 @@ "actionType": "action", "cost": [ { - "scalable": true, - "key": "wUQFsRtww18naYaq", + "key": "resource", + "itemId": "wUQFsRtww18naYaq", "value": 1, + "scalable": true, "step": 1, - "keyIsID": true, "consumeOnSuccess": false } ], @@ -181,11 +181,11 @@ "actionType": "action", "cost": [ { - "scalable": true, - "key": "wUQFsRtww18naYaq", + "key": "resource", + "itemId": "wUQFsRtww18naYaq", "value": 1, + "scalable": true, "step": null, - "keyIsID": true, "consumeOnSuccess": false } ], @@ -218,10 +218,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753922784502, - "modifiedTime": 1755429742185, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575854, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_id": "wUQFsRtww18naYaq", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Rune_Ward_GEhBUmv9Bj7oJfHk.json b/src/packs/domains/domainCard_Rune_Ward_GEhBUmv9Bj7oJfHk.json index 5e45f832..8a1d15d4 100644 --- a/src/packs/domains/domainCard_Rune_Ward_GEhBUmv9Bj7oJfHk.json +++ b/src/packs/domains/domainCard_Rune_Ward_GEhBUmv9Bj7oJfHk.json @@ -19,7 +19,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Safe_Haven_lmBLMPuR8qLbuzNf.json b/src/packs/domains/domainCard_Safe_Haven_lmBLMPuR8qLbuzNf.json index 2ab645bd..7f542794 100644 --- a/src/packs/domains/domainCard_Safe_Haven_lmBLMPuR8qLbuzNf.json +++ b/src/packs/domains/domainCard_Safe_Haven_lmBLMPuR8qLbuzNf.json @@ -22,7 +22,6 @@ "scalable": false, "key": "hope", "value": 2, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Sage_Touched_VOSFaQHZbmhMyXwi.json b/src/packs/domains/domainCard_Sage_Touched_VOSFaQHZbmhMyXwi.json index 625ed0d0..9d2ccec7 100644 --- a/src/packs/domains/domainCard_Sage_Touched_VOSFaQHZbmhMyXwi.json +++ b/src/packs/domains/domainCard_Sage_Touched_VOSFaQHZbmhMyXwi.json @@ -19,11 +19,12 @@ "actionType": "action", "cost": [ { - "scalable": false, - "key": "VOSFaQHZbmhMyXwi", + "key": "resource", + "itemId": "VOSFaQHZbmhMyXwi", "value": 1, - "keyIsID": true, - "step": null + "scalable": false, + "step": null, + "consumeOnSuccess": false } ], "uses": { @@ -54,11 +55,12 @@ "actionType": "action", "cost": [ { - "scalable": false, - "key": "VOSFaQHZbmhMyXwi", + "key": "resource", + "itemId": "VOSFaQHZbmhMyXwi", "value": 1, - "keyIsID": true, - "step": null + "scalable": false, + "step": null, + "consumeOnSuccess": false } ], "uses": { @@ -101,10 +103,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753922784507, - "modifiedTime": 1755429585605, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575562, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_id": "VOSFaQHZbmhMyXwi", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Salvation_Beam_4uAFGp3LxiC07woC.json b/src/packs/domains/domainCard_Salvation_Beam_4uAFGp3LxiC07woC.json index baaba0a6..7009df65 100644 --- a/src/packs/domains/domainCard_Salvation_Beam_4uAFGp3LxiC07woC.json +++ b/src/packs/domains/domainCard_Salvation_Beam_4uAFGp3LxiC07woC.json @@ -14,7 +14,7 @@ "type": "healing", "_id": "dmnB4ZMSk8lsB8Lg", "systemPath": "actions", - "description": "

Make a Spellcast Roll (16). On a success, mark any number of Stress to target a line of allies within Far range. You can clear Hit Points on the targets equal to the number of Stress marked, divided among them however you’d like.

", + "description": "

Make a Spellcast Roll (16). On a success, mark any number of Stress to target a line of allies within Far range. You can clear Hit Points on the targets equal to the number of Stress marked, divided among them however you’d like.

@Template[type:ray|range:f]

", "chatDisplay": true, "actionType": "action", "cost": [ @@ -23,8 +23,7 @@ "scalable": true, "key": "stress", "value": 1, - "step": null, - "keyIsID": false + "step": null } ], "uses": { @@ -101,10 +100,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784508, - "modifiedTime": 1755429792958, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756038941872, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "4uAFGp3LxiC07woC", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Second_Wind_ffPbSEvLuFrFsMxl.json b/src/packs/domains/domainCard_Second_Wind_ffPbSEvLuFrFsMxl.json index 90756d98..671ffcfb 100644 --- a/src/packs/domains/domainCard_Second_Wind_ffPbSEvLuFrFsMxl.json +++ b/src/packs/domains/domainCard_Second_Wind_ffPbSEvLuFrFsMxl.json @@ -19,10 +19,10 @@ "actionType": "action", "cost": [ { - "scalable": false, - "key": "ffPbSEvLuFrFsMxl", + "key": "resource", + "itemId": "ffPbSEvLuFrFsMxl", "value": 1, - "keyIsID": true, + "scalable": false, "step": null, "consumeOnSuccess": false } @@ -96,10 +96,10 @@ "actionType": "action", "cost": [ { - "scalable": false, - "key": "ffPbSEvLuFrFsMxl", + "key": "resource", + "itemId": "ffPbSEvLuFrFsMxl", "value": 1, - "keyIsID": true, + "scalable": false, "step": null, "consumeOnSuccess": false } @@ -185,10 +185,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753922784509, - "modifiedTime": 1755429692907, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575706, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_id": "ffPbSEvLuFrFsMxl", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Shape_Material_db4xV3YErHRslbVE.json b/src/packs/domains/domainCard_Shape_Material_db4xV3YErHRslbVE.json index 87f8bb7a..e3b3569c 100644 --- a/src/packs/domains/domainCard_Shape_Material_db4xV3YErHRslbVE.json +++ b/src/packs/domains/domainCard_Shape_Material_db4xV3YErHRslbVE.json @@ -19,7 +19,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Shield_Aura_rfIv6lln40Fh6EIl.json b/src/packs/domains/domainCard_Shield_Aura_rfIv6lln40Fh6EIl.json index e03eaf12..8abd548c 100644 --- a/src/packs/domains/domainCard_Shield_Aura_rfIv6lln40Fh6EIl.json +++ b/src/packs/domains/domainCard_Shield_Aura_rfIv6lln40Fh6EIl.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/domains/domainCard_Shrug_It_Off_JwfhtgmmuRxg4zhI.json b/src/packs/domains/domainCard_Shrug_It_Off_JwfhtgmmuRxg4zhI.json index d61473c9..cded950d 100644 --- a/src/packs/domains/domainCard_Shrug_It_Off_JwfhtgmmuRxg4zhI.json +++ b/src/packs/domains/domainCard_Shrug_It_Off_JwfhtgmmuRxg4zhI.json @@ -23,7 +23,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Smite_U1uWJE94HZVudujz.json b/src/packs/domains/domainCard_Smite_U1uWJE94HZVudujz.json index 245db4a2..1b707341 100644 --- a/src/packs/domains/domainCard_Smite_U1uWJE94HZVudujz.json +++ b/src/packs/domains/domainCard_Smite_U1uWJE94HZVudujz.json @@ -22,7 +22,6 @@ "scalable": false, "key": "hope", "value": 3, - "keyIsID": false, "step": null, "consumeOnSuccess": false } @@ -40,12 +39,12 @@ } ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Charge Smite", "img": "icons/skills/melee/sword-winged-holy-orange.webp", - "range": "" + "range": "self" } }, "attribution": { @@ -61,10 +60,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784519, - "modifiedTime": 1755429734196, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756038851464, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "U1uWJE94HZVudujz", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Specter_of_the_Dark_iQhgqmLwhcSTYnvr.json b/src/packs/domains/domainCard_Specter_of_the_Dark_iQhgqmLwhcSTYnvr.json index 02d43c56..94720b86 100644 --- a/src/packs/domains/domainCard_Specter_of_the_Dark_iQhgqmLwhcSTYnvr.json +++ b/src/packs/domains/domainCard_Specter_of_the_Dark_iQhgqmLwhcSTYnvr.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -38,12 +37,12 @@ } ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Become Spectral", "img": "icons/magic/unholy/silhouette-light-fire-blue.webp", - "range": "" + "range": "self" } }, "attribution": { @@ -59,10 +58,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784520, - "modifiedTime": 1755429431607, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756038467712, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "iQhgqmLwhcSTYnvr", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Spellcharge_ewhIzXQ2h9fS9I8c.json b/src/packs/domains/domainCard_Spellcharge_ewhIzXQ2h9fS9I8c.json index c0b78538..64382b12 100644 --- a/src/packs/domains/domainCard_Spellcharge_ewhIzXQ2h9fS9I8c.json +++ b/src/packs/domains/domainCard_Spellcharge_ewhIzXQ2h9fS9I8c.json @@ -25,11 +25,12 @@ "actionType": "action", "cost": [ { - "scalable": true, - "key": "ewhIzXQ2h9fS9I8c", + "key": "resource", + "itemId": "ewhIzXQ2h9fS9I8c", "value": 1, - "keyIsID": true, - "step": null + "scalable": true, + "step": null, + "consumeOnSuccess": false } ], "uses": { @@ -60,10 +61,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753922784521, - "modifiedTime": 1755429406322, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575684, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_id": "ewhIzXQ2h9fS9I8c", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Splintering_Strike_TYKfM3H9vBXyWiH4.json b/src/packs/domains/domainCard_Splintering_Strike_TYKfM3H9vBXyWiH4.json index 20f8deca..24a0433f 100644 --- a/src/packs/domains/domainCard_Splintering_Strike_TYKfM3H9vBXyWiH4.json +++ b/src/packs/domains/domainCard_Splintering_Strike_TYKfM3H9vBXyWiH4.json @@ -19,7 +19,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Stealth_Expertise_NIUhmuQGwbb3UClZ.json b/src/packs/domains/domainCard_Stealth_Expertise_NIUhmuQGwbb3UClZ.json index f5a140d6..bb2d4eaa 100644 --- a/src/packs/domains/domainCard_Stealth_Expertise_NIUhmuQGwbb3UClZ.json +++ b/src/packs/domains/domainCard_Stealth_Expertise_NIUhmuQGwbb3UClZ.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Strategic_Approach_5b1awkgTmMp3FVrm.json b/src/packs/domains/domainCard_Strategic_Approach_5b1awkgTmMp3FVrm.json index b984da10..697f29cd 100644 --- a/src/packs/domains/domainCard_Strategic_Approach_5b1awkgTmMp3FVrm.json +++ b/src/packs/domains/domainCard_Strategic_Approach_5b1awkgTmMp3FVrm.json @@ -27,10 +27,10 @@ "actionType": "action", "cost": [ { - "scalable": false, - "key": "5b1awkgTmMp3FVrm", + "key": "resource", + "itemId": "5b1awkgTmMp3FVrm", "value": 1, - "keyIsID": true, + "scalable": false, "step": null, "consumeOnSuccess": false } @@ -64,10 +64,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753922784523, - "modifiedTime": 1755428265451, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575271, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_id": "5b1awkgTmMp3FVrm", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Stunning_Sunlight_lRHo6ZkK1zybeEoG.json b/src/packs/domains/domainCard_Stunning_Sunlight_lRHo6ZkK1zybeEoG.json index 103765e3..df23f8c0 100644 --- a/src/packs/domains/domainCard_Stunning_Sunlight_lRHo6ZkK1zybeEoG.json +++ b/src/packs/domains/domainCard_Stunning_Sunlight_lRHo6ZkK1zybeEoG.json @@ -23,8 +23,7 @@ "scalable": true, "key": "hope", "value": 1, - "step": null, - "keyIsID": false + "step": null } ], "uses": { diff --git a/src/packs/domains/domainCard_Support_Tank_stId5syX7YpP2JGz.json b/src/packs/domains/domainCard_Support_Tank_stId5syX7YpP2JGz.json index 1d5f2cf7..7e0dcf37 100644 --- a/src/packs/domains/domainCard_Support_Tank_stId5syX7YpP2JGz.json +++ b/src/packs/domains/domainCard_Support_Tank_stId5syX7YpP2JGz.json @@ -22,7 +22,6 @@ "scalable": false, "key": "hope", "value": 2, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Thorn_Skin_oUipGK84E2KjoKqh.json b/src/packs/domains/domainCard_Thorn_Skin_oUipGK84E2KjoKqh.json index 6c56de38..eba9736d 100644 --- a/src/packs/domains/domainCard_Thorn_Skin_oUipGK84E2KjoKqh.json +++ b/src/packs/domains/domainCard_Thorn_Skin_oUipGK84E2KjoKqh.json @@ -19,7 +19,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, @@ -33,12 +32,12 @@ }, "effects": [], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Spend Hope", "img": "icons/magic/nature/thorns-hand-glow-green.webp", - "range": "" + "range": "self" }, "IVAyyVf8gqFWB7bP": { "type": "effect", @@ -49,11 +48,12 @@ "actionType": "action", "cost": [ { - "scalable": true, - "key": "oUipGK84E2KjoKqh", + "key": "resource", + "itemId": "oUipGK84E2KjoKqh", "value": 1, + "scalable": true, "step": 1, - "keyIsID": true + "consumeOnSuccess": false } ], "uses": { @@ -92,10 +92,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753922784531, - "modifiedTime": 1755429528391, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575772, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_id": "oUipGK84E2KjoKqh", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Thought_Delver_B4choj481tqajWb9.json b/src/packs/domains/domainCard_Thought_Delver_B4choj481tqajWb9.json index ed0e7184..9dbbd376 100644 --- a/src/packs/domains/domainCard_Thought_Delver_B4choj481tqajWb9.json +++ b/src/packs/domains/domainCard_Thought_Delver_B4choj481tqajWb9.json @@ -19,7 +19,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Towering_Stalk_n0P3VS1WfxvmXbB6.json b/src/packs/domains/domainCard_Towering_Stalk_n0P3VS1WfxvmXbB6.json index a4ab4541..3b5a5f97 100644 --- a/src/packs/domains/domainCard_Towering_Stalk_n0P3VS1WfxvmXbB6.json +++ b/src/packs/domains/domainCard_Towering_Stalk_n0P3VS1WfxvmXbB6.json @@ -19,18 +19,20 @@ "actionType": "action", "cost": [ { - "scalable": false, "key": "stress", + "itemId": null, "value": 1, - "keyIsID": false, - "step": null + "scalable": false, + "step": null, + "consumeOnSuccess": false }, { - "scalable": false, - "key": "n0P3VS1WfxvmXbB6", + "key": "resource", + "itemId": "n0P3VS1WfxvmXbB6", "value": 1, - "keyIsID": true, - "step": null + "scalable": false, + "step": null, + "consumeOnSuccess": false } ], "uses": { @@ -110,7 +112,6 @@ "scalable": false, "key": "hitPoints", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } @@ -144,10 +145,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753922784534, - "modifiedTime": 1755429505289, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575741, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_id": "n0P3VS1WfxvmXbB6", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Transcendent_Union_kVkoCLBXLAIifqpz.json b/src/packs/domains/domainCard_Transcendent_Union_kVkoCLBXLAIifqpz.json index 91539c93..ecee943e 100644 --- a/src/packs/domains/domainCard_Transcendent_Union_kVkoCLBXLAIifqpz.json +++ b/src/packs/domains/domainCard_Transcendent_Union_kVkoCLBXLAIifqpz.json @@ -22,7 +22,6 @@ "scalable": false, "key": "hope", "value": 5, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/domains/domainCard_Twilight_Toll_SDjjV61TC1NceV1m.json b/src/packs/domains/domainCard_Twilight_Toll_SDjjV61TC1NceV1m.json index 620e0558..0f64514f 100644 --- a/src/packs/domains/domainCard_Twilight_Toll_SDjjV61TC1NceV1m.json +++ b/src/packs/domains/domainCard_Twilight_Toll_SDjjV61TC1NceV1m.json @@ -26,11 +26,12 @@ "actionType": "action", "cost": [ { - "scalable": true, - "key": "SDjjV61TC1NceV1m", + "key": "resource", + "itemId": "SDjjV61TC1NceV1m", "value": 1, + "scalable": true, "step": 1, - "keyIsID": true + "consumeOnSuccess": false } ], "uses": { @@ -90,10 +91,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753922784535, - "modifiedTime": 1755429419135, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575478, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_id": "SDjjV61TC1NceV1m", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Uncanny_Disguise_TV56wSysbU5xAlOa.json b/src/packs/domains/domainCard_Uncanny_Disguise_TV56wSysbU5xAlOa.json index 1d0456ce..687a4312 100644 --- a/src/packs/domains/domainCard_Uncanny_Disguise_TV56wSysbU5xAlOa.json +++ b/src/packs/domains/domainCard_Uncanny_Disguise_TV56wSysbU5xAlOa.json @@ -28,7 +28,7 @@ "includeBase": false }, "target": { - "type": "any", + "type": "self", "amount": null }, "effects": [ @@ -39,7 +39,7 @@ ], "name": "Don Facade", "img": "icons/magic/control/debuff-energy-hold-pink.webp", - "range": "" + "range": "self" }, "OoNND7VcWoBQdtFK": { "type": "effect", @@ -50,11 +50,12 @@ "actionType": "action", "cost": [ { - "scalable": false, - "key": "TV56wSysbU5xAlOa", + "key": "resource", + "itemId": "TV56wSysbU5xAlOa", "value": 1, - "keyIsID": true, - "step": null + "scalable": false, + "step": null, + "consumeOnSuccess": false } ], "uses": { @@ -91,10 +92,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753922784537, - "modifiedTime": 1755429298602, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575516, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_id": "TV56wSysbU5xAlOa", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Unleash_Chaos_o62i0QdbUDIiAhSq.json b/src/packs/domains/domainCard_Unleash_Chaos_o62i0QdbUDIiAhSq.json index 8137b243..066501dc 100644 --- a/src/packs/domains/domainCard_Unleash_Chaos_o62i0QdbUDIiAhSq.json +++ b/src/packs/domains/domainCard_Unleash_Chaos_o62i0QdbUDIiAhSq.json @@ -27,11 +27,11 @@ "actionType": "action", "cost": [ { - "scalable": true, - "key": "o62i0QdbUDIiAhSq", + "key": "resource", + "itemId": "o62i0QdbUDIiAhSq", "value": 1, + "scalable": true, "step": 1, - "keyIsID": true, "consumeOnSuccess": false } ], @@ -113,7 +113,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } @@ -126,12 +125,12 @@ }, "effects": [], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Replenish Tokens", "img": "icons/commodities/gems/gem-faceted-diamond-blue.webp", - "range": "" + "range": "self" } }, "attribution": { @@ -147,10 +146,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753922784537, - "modifiedTime": 1755427920648, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575757, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_id": "o62i0QdbUDIiAhSq", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Vanishing_Dodge_GBMIElIpk4cvk1Bd.json b/src/packs/domains/domainCard_Vanishing_Dodge_GBMIElIpk4cvk1Bd.json index 29ba6f90..660e3c7a 100644 --- a/src/packs/domains/domainCard_Vanishing_Dodge_GBMIElIpk4cvk1Bd.json +++ b/src/packs/domains/domainCard_Vanishing_Dodge_GBMIElIpk4cvk1Bd.json @@ -19,7 +19,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, @@ -38,7 +37,7 @@ } ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Vanish", @@ -59,10 +58,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784539, - "modifiedTime": 1755429382850, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756038425727, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "GBMIElIpk4cvk1Bd", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Veil_of_Night_gV4L5ZZmfPrEbIDh.json b/src/packs/domains/domainCard_Veil_of_Night_gV4L5ZZmfPrEbIDh.json index 3e0a4623..ad78023c 100644 --- a/src/packs/domains/domainCard_Veil_of_Night_gV4L5ZZmfPrEbIDh.json +++ b/src/packs/domains/domainCard_Veil_of_Night_gV4L5ZZmfPrEbIDh.json @@ -28,7 +28,7 @@ "includeBase": false }, "target": { - "type": "any", + "type": "self", "amount": null }, "effects": [ @@ -59,7 +59,7 @@ }, "name": "Cast", "img": "icons/magic/unholy/barrier-shield-glowing-pink.webp", - "range": "" + "range": "self" } }, "attribution": { @@ -75,10 +75,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753922784541, - "modifiedTime": 1755429328234, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756038378309, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_id": "gV4L5ZZmfPrEbIDh", "sort": 3400000, diff --git a/src/packs/domains/domainCard_Versatile_Fighter_wQ53ImDswEHv5SGQ.json b/src/packs/domains/domainCard_Versatile_Fighter_wQ53ImDswEHv5SGQ.json index 6d4db3d1..21f92663 100644 --- a/src/packs/domains/domainCard_Versatile_Fighter_wQ53ImDswEHv5SGQ.json +++ b/src/packs/domains/domainCard_Versatile_Fighter_wQ53ImDswEHv5SGQ.json @@ -22,7 +22,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/domains/domainCard_Vicious_Entangle_qvpvTnkAoRn9vYO4.json b/src/packs/domains/domainCard_Vicious_Entangle_qvpvTnkAoRn9vYO4.json index 042cb330..c78bebca 100644 --- a/src/packs/domains/domainCard_Vicious_Entangle_qvpvTnkAoRn9vYO4.json +++ b/src/packs/domains/domainCard_Vicious_Entangle_qvpvTnkAoRn9vYO4.json @@ -97,7 +97,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Wall_Walk_1ROT08E1UVBwHLAS.json b/src/packs/domains/domainCard_Wall_Walk_1ROT08E1UVBwHLAS.json index 0b32e34d..f57206be 100644 --- a/src/packs/domains/domainCard_Wall_Walk_1ROT08E1UVBwHLAS.json +++ b/src/packs/domains/domainCard_Wall_Walk_1ROT08E1UVBwHLAS.json @@ -19,7 +19,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Whirlwind_anO0arioUy7I5zBg.json b/src/packs/domains/domainCard_Whirlwind_anO0arioUy7I5zBg.json index a4614046..14dc5fc9 100644 --- a/src/packs/domains/domainCard_Whirlwind_anO0arioUy7I5zBg.json +++ b/src/packs/domains/domainCard_Whirlwind_anO0arioUy7I5zBg.json @@ -19,7 +19,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/domains/domainCard_Wild_Fortress_9dFvcM1i3bxG3BSA.json b/src/packs/domains/domainCard_Wild_Fortress_9dFvcM1i3bxG3BSA.json index 57c0fd94..cfe14983 100644 --- a/src/packs/domains/domainCard_Wild_Fortress_9dFvcM1i3bxG3BSA.json +++ b/src/packs/domains/domainCard_Wild_Fortress_9dFvcM1i3bxG3BSA.json @@ -23,7 +23,6 @@ "scalable": false, "key": "hope", "value": 2, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/domainCard_Wild_Surge_DjnKlZQYaWdQGKcK.json b/src/packs/domains/domainCard_Wild_Surge_DjnKlZQYaWdQGKcK.json index 06eb5b84..11fcf48e 100644 --- a/src/packs/domains/domainCard_Wild_Surge_DjnKlZQYaWdQGKcK.json +++ b/src/packs/domains/domainCard_Wild_Surge_DjnKlZQYaWdQGKcK.json @@ -28,7 +28,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/domains/folders_Splendor_TL1TutmbeCVJ06nR.json b/src/packs/domains/folders_Splendor_TL1TutmbeCVJ06nR.json index c0870ecf..87cc7469 100644 --- a/src/packs/domains/folders_Splendor_TL1TutmbeCVJ06nR.json +++ b/src/packs/domains/folders_Splendor_TL1TutmbeCVJ06nR.json @@ -6,18 +6,18 @@ "sorting": "m", "_id": "TL1TutmbeCVJ06nR", "description": "", - "sort": 800000, + "sort": 900000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.346", + "coreVersion": "13.347", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1748717133557, - "modifiedTime": 1752681441081, - "lastModifiedBy": "YNJ4HgHtFrTI89mx" + "modifiedTime": 1756038952388, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!folders!TL1TutmbeCVJ06nR" } diff --git a/src/packs/domains/folders_Valor_yPVeShe47ETIqs9q.json b/src/packs/domains/folders_Valor_yPVeShe47ETIqs9q.json index 0a65d51f..f6361e50 100644 --- a/src/packs/domains/folders_Valor_yPVeShe47ETIqs9q.json +++ b/src/packs/domains/folders_Valor_yPVeShe47ETIqs9q.json @@ -6,18 +6,18 @@ "sorting": "m", "_id": "yPVeShe47ETIqs9q", "description": "", - "sort": 900000, + "sort": 800000, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.346", + "coreVersion": "13.347", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1748717138700, - "modifiedTime": 1752681443619, - "lastModifiedBy": "YNJ4HgHtFrTI89mx" + "modifiedTime": 1756038952388, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!folders!yPVeShe47ETIqs9q" } diff --git a/src/packs/environments/environment_Ambushers_uXZpebPR77YQ1oXI.json b/src/packs/environments/environment_Ambushers_uXZpebPR77YQ1oXI.json index 6510bc5c..4efb6b52 100644 --- a/src/packs/environments/environment_Ambushers_uXZpebPR77YQ1oXI.json +++ b/src/packs/environments/environment_Ambushers_uXZpebPR77YQ1oXI.json @@ -183,7 +183,6 @@ "scalable": false, "key": "fear", "value": 2, - "keyIsID": false, "step": null } ], diff --git a/src/packs/environments/environment_Chaos_Realm_2Z1mKc65LxNk2PqR.json b/src/packs/environments/environment_Chaos_Realm_2Z1mKc65LxNk2PqR.json index d31300b5..0c566991 100644 --- a/src/packs/environments/environment_Chaos_Realm_2Z1mKc65LxNk2PqR.json +++ b/src/packs/environments/environment_Chaos_Realm_2Z1mKc65LxNk2PqR.json @@ -371,7 +371,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -486,7 +485,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json b/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json index 43a0f61f..ab8daf7d 100644 --- a/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json +++ b/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json @@ -455,7 +455,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json b/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json index b924328f..38821a59 100644 --- a/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json +++ b/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json @@ -272,7 +272,6 @@ "scalable": false, "key": "fear", "value": 2, - "keyIsID": false, "step": null } ], @@ -336,7 +335,6 @@ "scalable": false, "key": "fear", "value": 3, - "keyIsID": false, "step": null } ], diff --git a/src/packs/environments/environment_Hallowed_Temple_dsA6j69AnaJhUyqH.json b/src/packs/environments/environment_Hallowed_Temple_dsA6j69AnaJhUyqH.json index 8eed0247..8ae4134d 100644 --- a/src/packs/environments/environment_Hallowed_Temple_dsA6j69AnaJhUyqH.json +++ b/src/packs/environments/environment_Hallowed_Temple_dsA6j69AnaJhUyqH.json @@ -379,7 +379,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/environments/environment_Imperial_Court_jr1xAoXzVwVblzxI.json b/src/packs/environments/environment_Imperial_Court_jr1xAoXzVwVblzxI.json index 1a9888f1..bbf23666 100644 --- a/src/packs/environments/environment_Imperial_Court_jr1xAoXzVwVblzxI.json +++ b/src/packs/environments/environment_Imperial_Court_jr1xAoXzVwVblzxI.json @@ -227,7 +227,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -420,7 +419,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/environments/environment_Necromancer_s_Ossuary_h3KyRL7AshhLAmcH.json b/src/packs/environments/environment_Necromancer_s_Ossuary_h3KyRL7AshhLAmcH.json index dc76c382..fc14d738 100644 --- a/src/packs/environments/environment_Necromancer_s_Ossuary_h3KyRL7AshhLAmcH.json +++ b/src/packs/environments/environment_Necromancer_s_Ossuary_h3KyRL7AshhLAmcH.json @@ -462,7 +462,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/environments/environment_Outpost_Town_YezryR32uo39xRxW.json b/src/packs/environments/environment_Outpost_Town_YezryR32uo39xRxW.json index ef961283..82bf42e3 100644 --- a/src/packs/environments/environment_Outpost_Town_YezryR32uo39xRxW.json +++ b/src/packs/environments/environment_Outpost_Town_YezryR32uo39xRxW.json @@ -301,7 +301,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/environments/environment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json b/src/packs/environments/environment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json index abd838dd..9c86d63d 100644 --- a/src/packs/environments/environment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json +++ b/src/packs/environments/environment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json @@ -235,7 +235,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json b/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json index 47ec74e2..79c89611 100644 --- a/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json +++ b/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json @@ -225,7 +225,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], @@ -392,7 +391,6 @@ "scalable": false, "key": "fear", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/items/armors/armor_Dragonscale_Armor_mdQ69eFHyAQUDmE7.json b/src/packs/items/armors/armor_Dragonscale_Armor_mdQ69eFHyAQUDmE7.json index 33924bf9..1e690af7 100644 --- a/src/packs/items/armors/armor_Dragonscale_Armor_mdQ69eFHyAQUDmE7.json +++ b/src/packs/items/armors/armor_Dragonscale_Armor_mdQ69eFHyAQUDmE7.json @@ -23,7 +23,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/armors/armor_Dunamis_Silkchain_hAY6UgdGT7dj22Pr.json b/src/packs/items/armors/armor_Dunamis_Silkchain_hAY6UgdGT7dj22Pr.json index 4b08aa31..c90ff961 100644 --- a/src/packs/items/armors/armor_Dunamis_Silkchain_hAY6UgdGT7dj22Pr.json +++ b/src/packs/items/armors/armor_Dunamis_Silkchain_hAY6UgdGT7dj22Pr.json @@ -16,11 +16,12 @@ "img": "icons/magic/time/hourglass-brown-orange.webp", "cost": [ { - "key": "armorSlot", + "key": "resource", + "itemId": "armorSlot", "value": 1, - "keyIsID": false, "scalable": false, - "step": null + "step": null, + "consumeOnSuccess": false } ], "roll": { @@ -100,10 +101,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753809264956, - "modifiedTime": 1755431812730, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575974, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_key": "!items!hAY6UgdGT7dj22Pr" } diff --git a/src/packs/items/armors/armor_Runes_of_Fortification_P4qAEDJUoNLgVRsA.json b/src/packs/items/armors/armor_Runes_of_Fortification_P4qAEDJUoNLgVRsA.json index ab892847..0de3a7f9 100644 --- a/src/packs/items/armors/armor_Runes_of_Fortification_P4qAEDJUoNLgVRsA.json +++ b/src/packs/items/armors/armor_Runes_of_Fortification_P4qAEDJUoNLgVRsA.json @@ -18,7 +18,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/armors/armor_Runetan_Floating_Armor_tHlBUDQC24YMZqd6.json b/src/packs/items/armors/armor_Runetan_Floating_Armor_tHlBUDQC24YMZqd6.json index 1edf8517..52aa1978 100644 --- a/src/packs/items/armors/armor_Runetan_Floating_Armor_tHlBUDQC24YMZqd6.json +++ b/src/packs/items/armors/armor_Runetan_Floating_Armor_tHlBUDQC24YMZqd6.json @@ -18,7 +18,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/consumables/consumable_Acidpaste_cfVFmS8vT9dbq9s1.json b/src/packs/items/consumables/consumable_Acidpaste_cfVFmS8vT9dbq9s1.json index e092929a..9bbca941 100644 --- a/src/packs/items/consumables/consumable_Acidpaste_cfVFmS8vT9dbq9s1.json +++ b/src/packs/items/consumables/consumable_Acidpaste_cfVFmS8vT9dbq9s1.json @@ -14,7 +14,16 @@ "description": "

This paste eats away walls and other surfaces in bright flashes.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "cfVFmS8vT9dbq9s1", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -31,6 +40,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -51,10 +61,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753590344700, - "modifiedTime": 1755432861888, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336051101, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!cfVFmS8vT9dbq9s1" } diff --git a/src/packs/items/consumables/consumable_Armor_Stitcher_VlbsCjvvLNfTzNXb.json b/src/packs/items/consumables/consumable_Armor_Stitcher_VlbsCjvvLNfTzNXb.json index 62049319..b06f1634 100644 --- a/src/packs/items/consumables/consumable_Armor_Stitcher_VlbsCjvvLNfTzNXb.json +++ b/src/packs/items/consumables/consumable_Armor_Stitcher_VlbsCjvvLNfTzNXb.json @@ -20,7 +20,16 @@ "key": "hope", "value": 1, "step": 1, - "keyIsID": false + "itemId": null, + "consumeOnSuccess": false + }, + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "VlbsCjvvLNfTzNXb", + "step": null, + "consumeOnSuccess": false } ], "uses": { @@ -30,15 +39,16 @@ }, "effects": [], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Stitch", "img": "icons/skills/trades/textiles-stitching-leather-brown.webp", - "range": "" + "range": "self" } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -59,10 +69,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753588973384, - "modifiedTime": 1755432710896, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336337676, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!VlbsCjvvLNfTzNXb" } diff --git a/src/packs/items/consumables/consumable_Attune_Potion_JGD3M9hBHtVAA8XP.json b/src/packs/items/consumables/consumable_Attune_Potion_JGD3M9hBHtVAA8XP.json index 9e316540..ad6dea85 100644 --- a/src/packs/items/consumables/consumable_Attune_Potion_JGD3M9hBHtVAA8XP.json +++ b/src/packs/items/consumables/consumable_Attune_Potion_JGD3M9hBHtVAA8XP.json @@ -14,7 +14,16 @@ "description": "

You gain a +1 bonus to your next Instinct Roll.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "JGD3M9hBHtVAA8XP", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -32,10 +41,11 @@ }, "name": "Drink", "img": "icons/consumables/potions/bottle-conical-corked-purple.webp", - "range": "" + "range": "self" } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 60, @@ -101,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753587033468, - "modifiedTime": 1755432536588, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336352911, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!JGD3M9hBHtVAA8XP" } diff --git a/src/packs/items/consumables/consumable_Blinding_Orb_eAXHdzA5qNPldOpn.json b/src/packs/items/consumables/consumable_Blinding_Orb_eAXHdzA5qNPldOpn.json index e0e2eb55..1e875f98 100644 --- a/src/packs/items/consumables/consumable_Blinding_Orb_eAXHdzA5qNPldOpn.json +++ b/src/packs/items/consumables/consumable_Blinding_Orb_eAXHdzA5qNPldOpn.json @@ -14,7 +14,16 @@ "description": "

You can activate this orb to create a flash of bright light. All targets within Close range become Vulnerable until they mark HP.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "eAXHdzA5qNPldOpn", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 62, @@ -96,10 +106,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753592512731, - "modifiedTime": 1755433077981, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336362549, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!eAXHdzA5qNPldOpn" } diff --git a/src/packs/items/consumables/consumable_Blood_of_the_Yorgi_pDGzmczoTlKGmKgd.json b/src/packs/items/consumables/consumable_Blood_of_the_Yorgi_pDGzmczoTlKGmKgd.json index a1b70dc6..545ce424 100644 --- a/src/packs/items/consumables/consumable_Blood_of_the_Yorgi_pDGzmczoTlKGmKgd.json +++ b/src/packs/items/consumables/consumable_Blood_of_the_Yorgi_pDGzmczoTlKGmKgd.json @@ -14,7 +14,16 @@ "description": "

You can drink this blood to disappear from where you are and immediately reappear at a point you can see within Very Far range.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "pDGzmczoTlKGmKgd", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -22,15 +31,16 @@ }, "effects": [], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Drink", "img": "icons/consumables/potions/potion-tube-corked-bat-gold-red.webp", - "range": "" + "range": "veryFar" } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -51,10 +61,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753589954973, - "modifiedTime": 1755432804800, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336370750, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!pDGzmczoTlKGmKgd" } diff --git a/src/packs/items/consumables/consumable_Bolster_Potion_FOPQNqXbiVO0ilYL.json b/src/packs/items/consumables/consumable_Bolster_Potion_FOPQNqXbiVO0ilYL.json index 7519c7ab..56bd6696 100644 --- a/src/packs/items/consumables/consumable_Bolster_Potion_FOPQNqXbiVO0ilYL.json +++ b/src/packs/items/consumables/consumable_Bolster_Potion_FOPQNqXbiVO0ilYL.json @@ -14,7 +14,16 @@ "description": "

You gain a +1 bonus to your next Strength Roll.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "FOPQNqXbiVO0ilYL", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -32,10 +41,11 @@ }, "name": "Drink", "img": "icons/consumables/potions/potion-vial-tube-yellow.webp", - "range": "" + "range": "self" } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 60, @@ -101,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753586850134, - "modifiedTime": 1755432522101, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336378610, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!FOPQNqXbiVO0ilYL" } diff --git a/src/packs/items/consumables/consumable_Bonding_Honey_PfQvqopXgvroBklL.json b/src/packs/items/consumables/consumable_Bonding_Honey_PfQvqopXgvroBklL.json index 64984603..73dcfc1f 100644 --- a/src/packs/items/consumables/consumable_Bonding_Honey_PfQvqopXgvroBklL.json +++ b/src/packs/items/consumables/consumable_Bonding_Honey_PfQvqopXgvroBklL.json @@ -14,7 +14,16 @@ "description": "

This honey can be used to glue two objects together permanently.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "PfQvqopXgvroBklL", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -31,6 +40,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 62, @@ -51,10 +61,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753592033119, - "modifiedTime": 1755433017227, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336387437, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!PfQvqopXgvroBklL" } diff --git a/src/packs/items/consumables/consumable_Bridge_Seed_RrIasiMCt6mqVTps.json b/src/packs/items/consumables/consumable_Bridge_Seed_RrIasiMCt6mqVTps.json index 6a199792..777adc08 100644 --- a/src/packs/items/consumables/consumable_Bridge_Seed_RrIasiMCt6mqVTps.json +++ b/src/packs/items/consumables/consumable_Bridge_Seed_RrIasiMCt6mqVTps.json @@ -14,7 +14,16 @@ "description": "

Thick vines grow from your location to a point of your choice within Far range, allowing you to climb up or across them. The vines dissipate on your next short rest.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "RrIasiMCt6mqVTps", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -31,6 +40,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -51,10 +61,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753591685990, - "modifiedTime": 1755432982976, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336396404, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!RrIasiMCt6mqVTps" } diff --git a/src/packs/items/consumables/consumable_Channelstone_IKMVQ6VwtapwoUim.json b/src/packs/items/consumables/consumable_Channelstone_IKMVQ6VwtapwoUim.json index 76e8833a..85e8ed29 100644 --- a/src/packs/items/consumables/consumable_Channelstone_IKMVQ6VwtapwoUim.json +++ b/src/packs/items/consumables/consumable_Channelstone_IKMVQ6VwtapwoUim.json @@ -14,7 +14,16 @@ "description": "

You can use this stone to take a spell or grimoire from your vault, use it once, and return it to your vault.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "IKMVQ6VwtapwoUim", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -31,6 +40,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -51,10 +61,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753590192533, - "modifiedTime": 1755432844735, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336406347, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!IKMVQ6VwtapwoUim" } diff --git a/src/packs/items/consumables/consumable_Charm_Potion_CVBbFfOY75YwyQsp.json b/src/packs/items/consumables/consumable_Charm_Potion_CVBbFfOY75YwyQsp.json index 46e8f8e6..ae60104a 100644 --- a/src/packs/items/consumables/consumable_Charm_Potion_CVBbFfOY75YwyQsp.json +++ b/src/packs/items/consumables/consumable_Charm_Potion_CVBbFfOY75YwyQsp.json @@ -14,7 +14,16 @@ "description": "

You gain a +1 bonus to your next Presence Roll.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "CVBbFfOY75YwyQsp", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 60, @@ -101,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753587097370, - "modifiedTime": 1755432545153, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336420032, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!CVBbFfOY75YwyQsp" } diff --git a/src/packs/items/consumables/consumable_Circle_of_the_Void_elsyP6VhHw1JjGSl.json b/src/packs/items/consumables/consumable_Circle_of_the_Void_elsyP6VhHw1JjGSl.json index aa4917eb..a6ca40ba 100644 --- a/src/packs/items/consumables/consumable_Circle_of_the_Void_elsyP6VhHw1JjGSl.json +++ b/src/packs/items/consumables/consumable_Circle_of_the_Void_elsyP6VhHw1JjGSl.json @@ -17,10 +17,11 @@ "cost": [ { "scalable": false, - "key": "stress", + "key": "quantity", "value": 1, - "keyIsID": false, - "step": null + "itemId": "elsyP6VhHw1JjGSl", + "step": null, + "consumeOnSuccess": false } ], "uses": { @@ -39,6 +40,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -59,10 +61,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753590692159, - "modifiedTime": 1755432898488, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336427253, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!elsyP6VhHw1JjGSl" } diff --git a/src/packs/items/consumables/consumable_Control_Potion_eeBhZSGLjuNZuJuI.json b/src/packs/items/consumables/consumable_Control_Potion_eeBhZSGLjuNZuJuI.json index 17fc697d..3c58799a 100644 --- a/src/packs/items/consumables/consumable_Control_Potion_eeBhZSGLjuNZuJuI.json +++ b/src/packs/items/consumables/consumable_Control_Potion_eeBhZSGLjuNZuJuI.json @@ -14,7 +14,16 @@ "description": "

You gain a +1 bonus to your next Finesse Roll.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "eeBhZSGLjuNZuJuI", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 60, @@ -101,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753586944889, - "modifiedTime": 1755432529169, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336435661, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!eeBhZSGLjuNZuJuI" } diff --git a/src/packs/items/consumables/consumable_Death_Tea_xDnJeF1grkmKck8Q.json b/src/packs/items/consumables/consumable_Death_Tea_xDnJeF1grkmKck8Q.json index e0b8a28c..fe22618c 100644 --- a/src/packs/items/consumables/consumable_Death_Tea_xDnJeF1grkmKck8Q.json +++ b/src/packs/items/consumables/consumable_Death_Tea_xDnJeF1grkmKck8Q.json @@ -14,7 +14,16 @@ "description": "

After you drink this tea, you instantly kill your target when you critically succeed on an attack. If you don’t critically succeed on an attack before your next long rest, you die.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "xDnJeF1grkmKck8Q", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -27,15 +36,16 @@ } ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Drink", "img": "icons/consumables/drinks/wine-amphora-clay-gray.webp", - "range": "" + "range": "self" } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 62, @@ -101,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753592717630, - "modifiedTime": 1755433085832, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336445925, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!xDnJeF1grkmKck8Q" } diff --git a/src/packs/items/consumables/consumable_Dragonbloom_Tea_wM18PWWW2Ami4fBG.json b/src/packs/items/consumables/consumable_Dragonbloom_Tea_wM18PWWW2Ami4fBG.json index 9389ca85..3bb5766f 100644 --- a/src/packs/items/consumables/consumable_Dragonbloom_Tea_wM18PWWW2Ami4fBG.json +++ b/src/packs/items/consumables/consumable_Dragonbloom_Tea_wM18PWWW2Ami4fBG.json @@ -11,13 +11,22 @@ "type": "attack", "_id": "rcHEz3ImUDwo6lPC", "systemPath": "actions", - "description": "", + "description": "

You can drink this tea to unleash a fiery breath attack. Make an Instinct Roll against all adversaries in front of you within Close range. Targets you succeed against take d20 physical damage using your Proficiency.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "consumeOnSuccess": false, + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "wM18PWWW2Ami4fBG", + "step": null + } + ], "uses": { "value": null, - "max": null, + "max": "", "recovery": null }, "damage": { @@ -80,6 +89,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -100,10 +110,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753591525829, - "modifiedTime": 1755432974525, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336455635, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!wM18PWWW2Ami4fBG" } diff --git a/src/packs/items/consumables/consumable_Dripfang_Poison_eU8VpbWB2NHIL47n.json b/src/packs/items/consumables/consumable_Dripfang_Poison_eU8VpbWB2NHIL47n.json index 81c57691..73f1b3c2 100644 --- a/src/packs/items/consumables/consumable_Dripfang_Poison_eU8VpbWB2NHIL47n.json +++ b/src/packs/items/consumables/consumable_Dripfang_Poison_eU8VpbWB2NHIL47n.json @@ -14,7 +14,16 @@ "description": "

A creature who consumes this poison takes 8d10 direct magic damage.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "eU8VpbWB2NHIL47n", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -62,6 +71,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -82,10 +92,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753590938047, - "modifiedTime": 1755432918239, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336465398, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!eU8VpbWB2NHIL47n" } diff --git a/src/packs/items/consumables/consumable_Enlighten_Potion_aWHSO2AqDufi7nL4.json b/src/packs/items/consumables/consumable_Enlighten_Potion_aWHSO2AqDufi7nL4.json index 87be77e4..dc8260d0 100644 --- a/src/packs/items/consumables/consumable_Enlighten_Potion_aWHSO2AqDufi7nL4.json +++ b/src/packs/items/consumables/consumable_Enlighten_Potion_aWHSO2AqDufi7nL4.json @@ -14,7 +14,16 @@ "description": "

You gain a +1 bonus to your next Knowledge Roll.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "aWHSO2AqDufi7nL4", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 60, @@ -101,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753587185754, - "modifiedTime": 1755432555520, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336472979, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!aWHSO2AqDufi7nL4" } diff --git a/src/packs/items/consumables/consumable_Feast_of_Xuria_aX6NyxkNzu0LcJpt.json b/src/packs/items/consumables/consumable_Feast_of_Xuria_aX6NyxkNzu0LcJpt.json index e463d5c3..4b4c8236 100644 --- a/src/packs/items/consumables/consumable_Feast_of_Xuria_aX6NyxkNzu0LcJpt.json +++ b/src/packs/items/consumables/consumable_Feast_of_Xuria_aX6NyxkNzu0LcJpt.json @@ -14,7 +14,16 @@ "description": "

You can eat this meal to clear all HP and Stress and gain 1d4 Hope.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "aX6NyxkNzu0LcJpt", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -125,6 +134,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 62, @@ -145,10 +155,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753591925502, - "modifiedTime": 1755433009779, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336480162, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!aX6NyxkNzu0LcJpt" } diff --git a/src/packs/items/consumables/consumable_Featherbone_DpxEMpwfasEBpORU.json b/src/packs/items/consumables/consumable_Featherbone_DpxEMpwfasEBpORU.json index 31a5b7fd..023edb88 100644 --- a/src/packs/items/consumables/consumable_Featherbone_DpxEMpwfasEBpORU.json +++ b/src/packs/items/consumables/consumable_Featherbone_DpxEMpwfasEBpORU.json @@ -14,30 +14,90 @@ "description": "

You can use this bone to control your falling speed for a number of minutes equal to your level.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "DpxEMpwfasEBpORU", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", "recovery": null }, - "effects": [], + "effects": [ + { + "_id": "VfJIJBW96e45xQHY", + "onSave": false + } + ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Use", "img": "icons/commodities/bones/bones-stack-worn-brown.webp", - "range": "" + "range": "self" } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, "artist": "" } }, - "effects": [], + "effects": [ + { + "name": "Featherbone", + "img": "icons/commodities/bones/bones-stack-worn-brown.webp", + "origin": "Compendium.daggerheart.consumables.Item.DpxEMpwfasEBpORU", + "transfer": false, + "_id": "VfJIJBW96e45xQHY", + "type": "base", + "system": { + "rangeDependence": { + "enabled": false, + "type": "withinRange", + "target": "hostile", + "range": "melee" + } + }, + "changes": [], + "disabled": false, + "duration": { + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "

You can use this bone to control your falling speed for a number of minutes equal to your level.

", + "tint": "#ffffff", + "statuses": [], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.347", + "systemId": "daggerheart", + "systemVersion": "1.1.0", + "createdTime": 1756041997551, + "modifiedTime": 1756042000517, + "lastModifiedBy": "vUIbuan0U50nfKBE" + }, + "_key": "!items.effects!DpxEMpwfasEBpORU.VfJIJBW96e45xQHY" + } + ], "folder": null, "sort": 0, "ownership": { @@ -51,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753590624634, - "modifiedTime": 1755432889504, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336487822, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!DpxEMpwfasEBpORU" } diff --git a/src/packs/items/consumables/consumable_Gill_Salve_Nvbb9mze6o5D0AEg.json b/src/packs/items/consumables/consumable_Gill_Salve_Nvbb9mze6o5D0AEg.json index 5e770de0..b76ff1f9 100644 --- a/src/packs/items/consumables/consumable_Gill_Salve_Nvbb9mze6o5D0AEg.json +++ b/src/packs/items/consumables/consumable_Gill_Salve_Nvbb9mze6o5D0AEg.json @@ -14,30 +14,90 @@ "description": "

You can apply this salve to your neck to breathe underwater for a number of minutes equal to your level.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "Nvbb9mze6o5D0AEg", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", "recovery": null }, - "effects": [], + "effects": [ + { + "_id": "5rL9CY5GO9SJcEZq", + "onSave": false + } + ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Apply", "img": "icons/commodities/materials/bowl-powder-blue.webp", - "range": "" + "range": "self" } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, "artist": "" } }, - "effects": [], + "effects": [ + { + "name": "Gill Salve", + "img": "icons/commodities/materials/bowl-powder-blue.webp", + "origin": "Compendium.daggerheart.consumables.Item.Nvbb9mze6o5D0AEg", + "transfer": false, + "_id": "5rL9CY5GO9SJcEZq", + "type": "base", + "system": { + "rangeDependence": { + "enabled": false, + "type": "withinRange", + "target": "hostile", + "range": "melee" + } + }, + "changes": [], + "disabled": false, + "duration": { + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "

You can apply this salve to your neck to breathe underwater for a number of minutes equal to your level.

", + "tint": "#ffffff", + "statuses": [], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.347", + "systemId": "daggerheart", + "systemVersion": "1.1.0", + "createdTime": 1756041968799, + "modifiedTime": 1756041978849, + "lastModifiedBy": "vUIbuan0U50nfKBE" + }, + "_key": "!items.effects!Nvbb9mze6o5D0AEg.5rL9CY5GO9SJcEZq" + } + ], "folder": null, "sort": 0, "ownership": { @@ -51,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753589241094, - "modifiedTime": 1755432719146, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336496390, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!Nvbb9mze6o5D0AEg" } diff --git a/src/packs/items/consumables/consumable_Grindletooth_Venom_8WkhvSzeOmLdnoLJ.json b/src/packs/items/consumables/consumable_Grindletooth_Venom_8WkhvSzeOmLdnoLJ.json index e2150bed..b208c3ac 100644 --- a/src/packs/items/consumables/consumable_Grindletooth_Venom_8WkhvSzeOmLdnoLJ.json +++ b/src/packs/items/consumables/consumable_Grindletooth_Venom_8WkhvSzeOmLdnoLJ.json @@ -14,7 +14,16 @@ "description": "

You can apply this venom to a weapon that deals physical damage to add a d6 to your next damage roll with that weapon.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "8WkhvSzeOmLdnoLJ", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 60, @@ -108,10 +118,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753587386639, - "modifiedTime": 1755432584688, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336506199, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!8WkhvSzeOmLdnoLJ" } diff --git a/src/packs/items/consumables/consumable_Growing_Potion_fl2f3ees8RFMze9t.json b/src/packs/items/consumables/consumable_Growing_Potion_fl2f3ees8RFMze9t.json index 055fd275..5563b561 100644 --- a/src/packs/items/consumables/consumable_Growing_Potion_fl2f3ees8RFMze9t.json +++ b/src/packs/items/consumables/consumable_Growing_Potion_fl2f3ees8RFMze9t.json @@ -14,7 +14,16 @@ "description": "

You can drink this potion to double your size until you choose to drop this form or your next rest. While in this form, you have a +2 bonus to Strength and a +1 bonus to your Proficiency.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "fl2f3ees8RFMze9t", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 62, @@ -107,10 +117,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753592174440, - "modifiedTime": 1755433036930, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336513568, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!fl2f3ees8RFMze9t" } diff --git a/src/packs/items/consumables/consumable_Health_Potion_Aruc2NLutWuVIjP1.json b/src/packs/items/consumables/consumable_Health_Potion_Aruc2NLutWuVIjP1.json index 22afde4d..c600d102 100644 --- a/src/packs/items/consumables/consumable_Health_Potion_Aruc2NLutWuVIjP1.json +++ b/src/packs/items/consumables/consumable_Health_Potion_Aruc2NLutWuVIjP1.json @@ -14,7 +14,16 @@ "description": "

Clear 1d4+1 HP.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "Aruc2NLutWuVIjP1", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -75,6 +84,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -95,10 +105,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753588839527, - "modifiedTime": 1755432692443, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336520901, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!Aruc2NLutWuVIjP1" } diff --git a/src/packs/items/consumables/consumable_Homet_s_Secret_Potion_VSwa1LpQ9PjZKsWF.json b/src/packs/items/consumables/consumable_Homet_s_Secret_Potion_VSwa1LpQ9PjZKsWF.json index 9f814705..8488df03 100644 --- a/src/packs/items/consumables/consumable_Homet_s_Secret_Potion_VSwa1LpQ9PjZKsWF.json +++ b/src/packs/items/consumables/consumable_Homet_s_Secret_Potion_VSwa1LpQ9PjZKsWF.json @@ -14,7 +14,16 @@ "description": "

After drinking this potion, the next successful attack you make critically succeeds.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "VSwa1LpQ9PjZKsWF", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -101,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753589998065, - "modifiedTime": 1755432817234, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336528677, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!VSwa1LpQ9PjZKsWF" } diff --git a/src/packs/items/consumables/consumable_Hopehold_Flare_EhaQCPJ8oiqpRIwB.json b/src/packs/items/consumables/consumable_Hopehold_Flare_EhaQCPJ8oiqpRIwB.json index 75c96d1b..6cb963a8 100644 --- a/src/packs/items/consumables/consumable_Hopehold_Flare_EhaQCPJ8oiqpRIwB.json +++ b/src/packs/items/consumables/consumable_Hopehold_Flare_EhaQCPJ8oiqpRIwB.json @@ -14,7 +14,16 @@ "description": "

When you use this flare, allies within Close range roll a d6 when they spend a Hope. On a result of 6, they gain the effect of that Hope without spending it. The flare lasts until the end of the scene.

@Template[type:emanation|range:c]

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "EhaQCPJ8oiqpRIwB", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -31,6 +40,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -51,10 +61,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753590388618, - "modifiedTime": 1755432869271, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336535700, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!EhaQCPJ8oiqpRIwB" } diff --git a/src/packs/items/consumables/consumable_Improved_Arcane_Shard_nQTo6mNoPTEVBtkm.json b/src/packs/items/consumables/consumable_Improved_Arcane_Shard_nQTo6mNoPTEVBtkm.json index 2319ae44..09ba52dc 100644 --- a/src/packs/items/consumables/consumable_Improved_Arcane_Shard_nQTo6mNoPTEVBtkm.json +++ b/src/packs/items/consumables/consumable_Improved_Arcane_Shard_nQTo6mNoPTEVBtkm.json @@ -14,7 +14,16 @@ "description": "

You can make a Finesse Roll to throw this shard at a group of adversaries within Far range. Targets you succeed against take 2d20 magic damage.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "consumeOnSuccess": false, + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "nQTo6mNoPTEVBtkm", + "step": null + } + ], "uses": { "value": null, "max": "", @@ -82,6 +91,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -102,10 +112,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753589403341, - "modifiedTime": 1755432739380, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336543336, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!nQTo6mNoPTEVBtkm" } diff --git a/src/packs/items/consumables/consumable_Improved_Grindletooth_Venom_BqBWXXe9T07AMV4u.json b/src/packs/items/consumables/consumable_Improved_Grindletooth_Venom_BqBWXXe9T07AMV4u.json index 1ad9bdb4..240e2bd3 100644 --- a/src/packs/items/consumables/consumable_Improved_Grindletooth_Venom_BqBWXXe9T07AMV4u.json +++ b/src/packs/items/consumables/consumable_Improved_Grindletooth_Venom_BqBWXXe9T07AMV4u.json @@ -14,7 +14,16 @@ "description": "

You can apply this venom to a weapon that deals physical damage to add a d8 to your next damage roll with that weapon.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "BqBWXXe9T07AMV4u", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 60, @@ -108,10 +118,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753588170670, - "modifiedTime": 1755432643893, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336563205, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!BqBWXXe9T07AMV4u" } diff --git a/src/packs/items/consumables/consumable_Jar_of_Lost_Voices_yUol6M5b8jsbk9za.json b/src/packs/items/consumables/consumable_Jar_of_Lost_Voices_yUol6M5b8jsbk9za.json index cff7849b..7a9a8193 100644 --- a/src/packs/items/consumables/consumable_Jar_of_Lost_Voices_yUol6M5b8jsbk9za.json +++ b/src/packs/items/consumables/consumable_Jar_of_Lost_Voices_yUol6M5b8jsbk9za.json @@ -14,7 +14,16 @@ "description": "

You can open this jar to release a deafening echo of voices for a number of minutes equal to your Instinct. Creatures within Far range unprepared for the sound take 6d8 magic damage.

@Template[type:emanation|range:f]

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "yUol6M5b8jsbk9za", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -62,6 +71,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -82,10 +92,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753591372075, - "modifiedTime": 1755432964594, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336570894, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!yUol6M5b8jsbk9za" } diff --git a/src/packs/items/consumables/consumable_Jumping_Root_c2putn9apuurJhWX.json b/src/packs/items/consumables/consumable_Jumping_Root_c2putn9apuurJhWX.json index 352c229d..9f9939a8 100644 --- a/src/packs/items/consumables/consumable_Jumping_Root_c2putn9apuurJhWX.json +++ b/src/packs/items/consumables/consumable_Jumping_Root_c2putn9apuurJhWX.json @@ -14,7 +14,16 @@ "description": "

Eat this root to leap up to Far range once without needing to roll.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "c2putn9apuurJhWX", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -31,6 +40,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -51,10 +61,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753588566489, - "modifiedTime": 1755432674260, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336580501, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!c2putn9apuurJhWX" } diff --git a/src/packs/items/consumables/consumable_Knowledge_Stone_nL9IALzm9BNi5oSt.json b/src/packs/items/consumables/consumable_Knowledge_Stone_nL9IALzm9BNi5oSt.json index 17a2992e..398d12f5 100644 --- a/src/packs/items/consumables/consumable_Knowledge_Stone_nL9IALzm9BNi5oSt.json +++ b/src/packs/items/consumables/consumable_Knowledge_Stone_nL9IALzm9BNi5oSt.json @@ -14,7 +14,16 @@ "description": "

If you die while holding this stone, an ally can take a card from your loadout to place in their loadout or vault. After they take this knowledge, the stone crumbles.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "nL9IALzm9BNi5oSt", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -31,6 +40,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 62, @@ -51,10 +61,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753592240392, - "modifiedTime": 1755433061047, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336587702, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!nL9IALzm9BNi5oSt" } diff --git a/src/packs/items/consumables/consumable_Major_Arcane_Shard_AA7bmiwv00lshPrC.json b/src/packs/items/consumables/consumable_Major_Arcane_Shard_AA7bmiwv00lshPrC.json index 002bd46d..1cc164a2 100644 --- a/src/packs/items/consumables/consumable_Major_Arcane_Shard_AA7bmiwv00lshPrC.json +++ b/src/packs/items/consumables/consumable_Major_Arcane_Shard_AA7bmiwv00lshPrC.json @@ -14,7 +14,16 @@ "description": "

You can make a Finesse Roll to throw this shard at a group of adversaries within Far range. Targets you succeed against take 4d20 magic damage.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "consumeOnSuccess": false, + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "AA7bmiwv00lshPrC", + "step": null + } + ], "uses": { "value": null, "max": "", @@ -80,6 +89,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -100,10 +110,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753590515261, - "modifiedTime": 1755432877237, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336596900, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!AA7bmiwv00lshPrC" } diff --git a/src/packs/items/consumables/consumable_Major_Attune_Potion_CCPFm5iXXwvyYYwR.json b/src/packs/items/consumables/consumable_Major_Attune_Potion_CCPFm5iXXwvyYYwR.json index 127bcd72..05e4fe5d 100644 --- a/src/packs/items/consumables/consumable_Major_Attune_Potion_CCPFm5iXXwvyYYwR.json +++ b/src/packs/items/consumables/consumable_Major_Attune_Potion_CCPFm5iXXwvyYYwR.json @@ -14,7 +14,16 @@ "description": "

You gain a +1 bonus to your Instinct until your next rest.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "CCPFm5iXXwvyYYwR", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -101,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753589747286, - "modifiedTime": 1755432778983, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336603508, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!CCPFm5iXXwvyYYwR" } diff --git a/src/packs/items/consumables/consumable_Major_Bolster_Potion_mnyQDRtngWWQeRXF.json b/src/packs/items/consumables/consumable_Major_Bolster_Potion_mnyQDRtngWWQeRXF.json index 90d28bc8..12f5bf1d 100644 --- a/src/packs/items/consumables/consumable_Major_Bolster_Potion_mnyQDRtngWWQeRXF.json +++ b/src/packs/items/consumables/consumable_Major_Bolster_Potion_mnyQDRtngWWQeRXF.json @@ -14,7 +14,16 @@ "description": "

You gain a +1 bonus to your Strength until your next rest.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "mnyQDRtngWWQeRXF", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -101,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753589623872, - "modifiedTime": 1755432764001, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336610323, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!mnyQDRtngWWQeRXF" } diff --git a/src/packs/items/consumables/consumable_Major_Charm_Potion_IJLAUlQymbSjzsri.json b/src/packs/items/consumables/consumable_Major_Charm_Potion_IJLAUlQymbSjzsri.json index 8d5d83c6..84a18028 100644 --- a/src/packs/items/consumables/consumable_Major_Charm_Potion_IJLAUlQymbSjzsri.json +++ b/src/packs/items/consumables/consumable_Major_Charm_Potion_IJLAUlQymbSjzsri.json @@ -14,7 +14,16 @@ "description": "

You gain a +1 bonus to your Presence until your next rest.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "IJLAUlQymbSjzsri", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -101,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753589816684, - "modifiedTime": 1755432785816, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336617341, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!IJLAUlQymbSjzsri" } diff --git a/src/packs/items/consumables/consumable_Major_Control_Potion_80s1FLmTLtohZ5GH.json b/src/packs/items/consumables/consumable_Major_Control_Potion_80s1FLmTLtohZ5GH.json index dfab73ea..782e543c 100644 --- a/src/packs/items/consumables/consumable_Major_Control_Potion_80s1FLmTLtohZ5GH.json +++ b/src/packs/items/consumables/consumable_Major_Control_Potion_80s1FLmTLtohZ5GH.json @@ -14,7 +14,16 @@ "description": "

You gain a +1 bonus to your Finesse until your next rest.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "80s1FLmTLtohZ5GH", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -101,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753589675185, - "modifiedTime": 1755432772014, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336639693, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!80s1FLmTLtohZ5GH" } diff --git a/src/packs/items/consumables/consumable_Major_Enlighten_Potion_SDdv1G2veMLKrxcJ.json b/src/packs/items/consumables/consumable_Major_Enlighten_Potion_SDdv1G2veMLKrxcJ.json index c51237fc..a827a738 100644 --- a/src/packs/items/consumables/consumable_Major_Enlighten_Potion_SDdv1G2veMLKrxcJ.json +++ b/src/packs/items/consumables/consumable_Major_Enlighten_Potion_SDdv1G2veMLKrxcJ.json @@ -14,7 +14,16 @@ "description": "

You gain a +1 bonus to your Knowledge until your next rest.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "SDdv1G2veMLKrxcJ", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -101,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753589874661, - "modifiedTime": 1755432794986, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336647833, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!SDdv1G2veMLKrxcJ" } diff --git a/src/packs/items/consumables/consumable_Major_Health_Potion_cM7pHe8bBAxSZ2xR.json b/src/packs/items/consumables/consumable_Major_Health_Potion_cM7pHe8bBAxSZ2xR.json index 49d0f6f7..3e83a73c 100644 --- a/src/packs/items/consumables/consumable_Major_Health_Potion_cM7pHe8bBAxSZ2xR.json +++ b/src/packs/items/consumables/consumable_Major_Health_Potion_cM7pHe8bBAxSZ2xR.json @@ -14,7 +14,16 @@ "description": "

Clear 1d4+2 HP.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "cM7pHe8bBAxSZ2xR", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -75,6 +84,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -95,10 +105,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753591046168, - "modifiedTime": 1755432927907, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336654766, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!cM7pHe8bBAxSZ2xR" } diff --git a/src/packs/items/consumables/consumable_Major_Stamina_Potion_I4cQ03xbxnc81EGa.json b/src/packs/items/consumables/consumable_Major_Stamina_Potion_I4cQ03xbxnc81EGa.json index f28faa25..a7cd987e 100644 --- a/src/packs/items/consumables/consumable_Major_Stamina_Potion_I4cQ03xbxnc81EGa.json +++ b/src/packs/items/consumables/consumable_Major_Stamina_Potion_I4cQ03xbxnc81EGa.json @@ -14,7 +14,16 @@ "description": "

Clear 1d4+2 Stress.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "I4cQ03xbxnc81EGa", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -75,6 +84,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -95,10 +105,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753591113317, - "modifiedTime": 1755432935058, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336661213, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!I4cQ03xbxnc81EGa" } diff --git a/src/packs/items/consumables/consumable_Major_Stride_Potion_yK6eEDUrsPbZA8G0.json b/src/packs/items/consumables/consumable_Major_Stride_Potion_yK6eEDUrsPbZA8G0.json index 80dcead1..60cd96b2 100644 --- a/src/packs/items/consumables/consumable_Major_Stride_Potion_yK6eEDUrsPbZA8G0.json +++ b/src/packs/items/consumables/consumable_Major_Stride_Potion_yK6eEDUrsPbZA8G0.json @@ -14,7 +14,16 @@ "description": "

You gain a +1 bonus to your Agility until your next rest.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "yK6eEDUrsPbZA8G0", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -101,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753589545730, - "modifiedTime": 1755432751630, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336667559, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!yK6eEDUrsPbZA8G0" } diff --git a/src/packs/items/consumables/consumable_Minor_Health_Potion_tPfKtKRRjv8qdSqy.json b/src/packs/items/consumables/consumable_Minor_Health_Potion_tPfKtKRRjv8qdSqy.json index bc7bb074..5dc8ca28 100644 --- a/src/packs/items/consumables/consumable_Minor_Health_Potion_tPfKtKRRjv8qdSqy.json +++ b/src/packs/items/consumables/consumable_Minor_Health_Potion_tPfKtKRRjv8qdSqy.json @@ -14,7 +14,16 @@ "description": "

Clear 1d4 HP.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "tPfKtKRRjv8qdSqy", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -75,6 +84,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 60, @@ -95,10 +105,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753587253431, - "modifiedTime": 1755432566654, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336675059, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!tPfKtKRRjv8qdSqy" } diff --git a/src/packs/items/consumables/consumable_Minor_Stamina_Potion_b6vGSPFWOlzZZDLO.json b/src/packs/items/consumables/consumable_Minor_Stamina_Potion_b6vGSPFWOlzZZDLO.json index b4bd2a2c..81b000f7 100644 --- a/src/packs/items/consumables/consumable_Minor_Stamina_Potion_b6vGSPFWOlzZZDLO.json +++ b/src/packs/items/consumables/consumable_Minor_Stamina_Potion_b6vGSPFWOlzZZDLO.json @@ -14,7 +14,16 @@ "description": "

Clear 1d4 Stress.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "b6vGSPFWOlzZZDLO", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -75,6 +84,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 60, @@ -95,10 +105,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753587324465, - "modifiedTime": 1755432574155, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336685650, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!b6vGSPFWOlzZZDLO" } diff --git a/src/packs/items/consumables/consumable_Mirror_of_Marigold_UFQVwgYOUZ88UxcH.json b/src/packs/items/consumables/consumable_Mirror_of_Marigold_UFQVwgYOUZ88UxcH.json index 1415d195..7c80bc78 100644 --- a/src/packs/items/consumables/consumable_Mirror_of_Marigold_UFQVwgYOUZ88UxcH.json +++ b/src/packs/items/consumables/consumable_Mirror_of_Marigold_UFQVwgYOUZ88UxcH.json @@ -16,11 +16,12 @@ "actionType": "action", "cost": [ { - "keyIsID": false, - "key": "hope", - "value": 1, "scalable": false, - "step": null + "key": "quantity", + "value": 1, + "itemId": "UFQVwgYOUZ88UxcH", + "step": null, + "consumeOnSuccess": false } ], "uses": { @@ -39,6 +40,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 62, @@ -59,10 +61,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753592792213, - "modifiedTime": 1755433095534, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336692719, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!UFQVwgYOUZ88UxcH" } diff --git a/src/packs/items/consumables/consumable_Morphing_Clay_f1NHVSIHJJCIOaBl.json b/src/packs/items/consumables/consumable_Morphing_Clay_f1NHVSIHJJCIOaBl.json index ce16c984..4afc72ba 100644 --- a/src/packs/items/consumables/consumable_Morphing_Clay_f1NHVSIHJJCIOaBl.json +++ b/src/packs/items/consumables/consumable_Morphing_Clay_f1NHVSIHJJCIOaBl.json @@ -16,11 +16,12 @@ "actionType": "action", "cost": [ { - "keyIsID": false, - "key": "hope", - "value": 1, "scalable": false, - "step": null + "key": "quantity", + "value": 1, + "itemId": "f1NHVSIHJJCIOaBl", + "step": null, + "consumeOnSuccess": false } ], "uses": { @@ -44,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -109,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753588254032, - "modifiedTime": 1755432657276, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336699132, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!f1NHVSIHJJCIOaBl" } diff --git a/src/packs/items/consumables/consumable_Mythic_Dust_Zsh2AvZr8EkGtLyw.json b/src/packs/items/consumables/consumable_Mythic_Dust_Zsh2AvZr8EkGtLyw.json index f720881e..5c5f4325 100644 --- a/src/packs/items/consumables/consumable_Mythic_Dust_Zsh2AvZr8EkGtLyw.json +++ b/src/packs/items/consumables/consumable_Mythic_Dust_Zsh2AvZr8EkGtLyw.json @@ -14,7 +14,16 @@ "description": "

You can apply this dust to a weapon that deals magic damage to add a d12 to your next damage roll with that weapon.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "Zsh2AvZr8EkGtLyw", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -108,10 +118,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753590241722, - "modifiedTime": 1755432854453, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336705787, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!Zsh2AvZr8EkGtLyw" } diff --git a/src/packs/items/consumables/consumable_Ogre_Musk_qr1bosjFcUfuwq4B.json b/src/packs/items/consumables/consumable_Ogre_Musk_qr1bosjFcUfuwq4B.json index 38ef8357..be940eab 100644 --- a/src/packs/items/consumables/consumable_Ogre_Musk_qr1bosjFcUfuwq4B.json +++ b/src/packs/items/consumables/consumable_Ogre_Musk_qr1bosjFcUfuwq4B.json @@ -14,7 +14,16 @@ "description": "

You can use this musk to prevent anyone from tracking you by mundane or magical means until your next rest.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "qr1bosjFcUfuwq4B", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -101,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753591168468, - "modifiedTime": 1755432944044, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336713230, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!qr1bosjFcUfuwq4B" } diff --git a/src/packs/items/consumables/consumable_Potion_of_Stability_dvL8oaxpEF6jKvYN.json b/src/packs/items/consumables/consumable_Potion_of_Stability_dvL8oaxpEF6jKvYN.json index 41b29bdf..c7fa2bbb 100644 --- a/src/packs/items/consumables/consumable_Potion_of_Stability_dvL8oaxpEF6jKvYN.json +++ b/src/packs/items/consumables/consumable_Potion_of_Stability_dvL8oaxpEF6jKvYN.json @@ -14,7 +14,16 @@ "description": "

You can drink this potion to choose one additional downtime move.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "dvL8oaxpEF6jKvYN", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 60, @@ -107,10 +117,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753588038000, - "modifiedTime": 1755432626825, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336720970, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!dvL8oaxpEF6jKvYN" } diff --git a/src/packs/items/consumables/consumable_Redthorn_Saliva_s2Exl2XFuoOhtIov.json b/src/packs/items/consumables/consumable_Redthorn_Saliva_s2Exl2XFuoOhtIov.json index e14b5524..82e4d4b9 100644 --- a/src/packs/items/consumables/consumable_Redthorn_Saliva_s2Exl2XFuoOhtIov.json +++ b/src/packs/items/consumables/consumable_Redthorn_Saliva_s2Exl2XFuoOhtIov.json @@ -14,7 +14,16 @@ "description": "

You can apply this saliva to a weapon that deals physical damage to add a d12 to your next damage roll with that weapon.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "s2Exl2XFuoOhtIov", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -108,10 +118,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753590061810, - "modifiedTime": 1755432828838, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336727954, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!s2Exl2XFuoOhtIov" } diff --git a/src/packs/items/consumables/consumable_Replication_Parchment_yJkwz4AP6yhGo8Vj.json b/src/packs/items/consumables/consumable_Replication_Parchment_yJkwz4AP6yhGo8Vj.json index 68681ddd..7e07b702 100644 --- a/src/packs/items/consumables/consumable_Replication_Parchment_yJkwz4AP6yhGo8Vj.json +++ b/src/packs/items/consumables/consumable_Replication_Parchment_yJkwz4AP6yhGo8Vj.json @@ -14,7 +14,16 @@ "description": "

By touching this piece of parchment to another, you can perfectly copy the second parchment’s contents. Once used, this parchment becomes mundane paper.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "yJkwz4AP6yhGo8Vj", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -31,6 +40,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -51,10 +61,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753589306667, - "modifiedTime": 1755432726696, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336734771, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!yJkwz4AP6yhGo8Vj" } diff --git a/src/packs/items/consumables/consumable_Shrinking_Potion_HGixKenQwhyRAYNk.json b/src/packs/items/consumables/consumable_Shrinking_Potion_HGixKenQwhyRAYNk.json index f2336545..08af29cc 100644 --- a/src/packs/items/consumables/consumable_Shrinking_Potion_HGixKenQwhyRAYNk.json +++ b/src/packs/items/consumables/consumable_Shrinking_Potion_HGixKenQwhyRAYNk.json @@ -14,7 +14,16 @@ "description": "

You can drink this potion to halve your size until you choose to drop this form or your next rest. While in this form, you have a +2 bonus to Agility and a βˆ’1 penalty to your Proficiency.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "HGixKenQwhyRAYNk", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 62, @@ -107,10 +117,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753592077792, - "modifiedTime": 1755433027028, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336741086, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!HGixKenQwhyRAYNk" } diff --git a/src/packs/items/consumables/consumable_Sleeping_Sap_XZavUVlHEvE2srEt.json b/src/packs/items/consumables/consumable_Sleeping_Sap_XZavUVlHEvE2srEt.json index a397074b..b627695a 100644 --- a/src/packs/items/consumables/consumable_Sleeping_Sap_XZavUVlHEvE2srEt.json +++ b/src/packs/items/consumables/consumable_Sleeping_Sap_XZavUVlHEvE2srEt.json @@ -14,7 +14,16 @@ "description": "

You can drink this potion to fall asleep for a full night’s rest. You clear all Stress upon waking.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "XZavUVlHEvE2srEt", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -76,6 +85,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 62, @@ -96,10 +106,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753591837472, - "modifiedTime": 1755432997515, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336748248, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!XZavUVlHEvE2srEt" } diff --git a/src/packs/items/consumables/consumable_Snap_Powder_cg6VtQ0eVZjDdcK0.json b/src/packs/items/consumables/consumable_Snap_Powder_cg6VtQ0eVZjDdcK0.json index 86879588..cdc760ff 100644 --- a/src/packs/items/consumables/consumable_Snap_Powder_cg6VtQ0eVZjDdcK0.json +++ b/src/packs/items/consumables/consumable_Snap_Powder_cg6VtQ0eVZjDdcK0.json @@ -17,10 +17,11 @@ "cost": [ { "scalable": false, - "key": "stress", + "key": "quantity", "value": 1, - "keyIsID": false, - "step": null + "itemId": "cg6VtQ0eVZjDdcK0", + "step": null, + "consumeOnSuccess": false } ], "uses": { @@ -84,6 +85,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -104,10 +106,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753588752841, - "modifiedTime": 1755432682259, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336754402, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!cg6VtQ0eVZjDdcK0" } diff --git a/src/packs/items/consumables/consumable_Stamina_Potion_hf3k1POoVSooJyN2.json b/src/packs/items/consumables/consumable_Stamina_Potion_hf3k1POoVSooJyN2.json index 8837f815..d278c6fe 100644 --- a/src/packs/items/consumables/consumable_Stamina_Potion_hf3k1POoVSooJyN2.json +++ b/src/packs/items/consumables/consumable_Stamina_Potion_hf3k1POoVSooJyN2.json @@ -14,7 +14,16 @@ "description": "

Clear 1d4+1 Stress.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "hf3k1POoVSooJyN2", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -75,6 +84,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -95,10 +105,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753588904835, - "modifiedTime": 1755432700497, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336761163, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!hf3k1POoVSooJyN2" } diff --git a/src/packs/items/consumables/consumable_Stardrop_y4c1jrlHrf0wBWOq.json b/src/packs/items/consumables/consumable_Stardrop_y4c1jrlHrf0wBWOq.json index 7d6bf0cd..b4c16c8d 100644 --- a/src/packs/items/consumables/consumable_Stardrop_y4c1jrlHrf0wBWOq.json +++ b/src/packs/items/consumables/consumable_Stardrop_y4c1jrlHrf0wBWOq.json @@ -14,7 +14,16 @@ "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]

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "y4c1jrlHrf0wBWOq", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -62,6 +71,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 62, @@ -82,10 +92,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753592933782, - "modifiedTime": 1755433102382, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336777144, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!y4c1jrlHrf0wBWOq" } diff --git a/src/packs/items/consumables/consumable_Stride_Potion_lNtcrkgFGOJNaroE.json b/src/packs/items/consumables/consumable_Stride_Potion_lNtcrkgFGOJNaroE.json index 3849ac0d..dd8a354b 100644 --- a/src/packs/items/consumables/consumable_Stride_Potion_lNtcrkgFGOJNaroE.json +++ b/src/packs/items/consumables/consumable_Stride_Potion_lNtcrkgFGOJNaroE.json @@ -14,7 +14,16 @@ "description": "

You gain a +1 bonus to your next Agility Roll.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "lNtcrkgFGOJNaroE", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 60, @@ -101,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753585993187, - "modifiedTime": 1755432512018, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336784139, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!lNtcrkgFGOJNaroE" } diff --git a/src/packs/items/consumables/consumable_Sun_Tree_Sap_kwexUzdM9wm1Qums.json b/src/packs/items/consumables/consumable_Sun_Tree_Sap_kwexUzdM9wm1Qums.json index 3ee1ec60..f79704f4 100644 --- a/src/packs/items/consumables/consumable_Sun_Tree_Sap_kwexUzdM9wm1Qums.json +++ b/src/packs/items/consumables/consumable_Sun_Tree_Sap_kwexUzdM9wm1Qums.json @@ -14,7 +14,16 @@ "description": "

Consume this sap to roll a [[/r d6]]. On a result of 5–6, clear 2 HP. On a result of 2–4, clear 3 Stress. On a result of 1, see through the veil of death and return changed, gaining one scar.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "consumeOnSuccess": false, + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "kwexUzdM9wm1Qums", + "step": null + } + ], "uses": { "value": null, "max": "", @@ -55,6 +64,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -75,10 +85,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753590791260, - "modifiedTime": 1755432908523, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336791229, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!kwexUzdM9wm1Qums" } diff --git a/src/packs/items/consumables/consumable_Sweet_Moss_GrDrRqWgv7gvl9vn.json b/src/packs/items/consumables/consumable_Sweet_Moss_GrDrRqWgv7gvl9vn.json index 8dac2f79..e366ddbe 100644 --- a/src/packs/items/consumables/consumable_Sweet_Moss_GrDrRqWgv7gvl9vn.json +++ b/src/packs/items/consumables/consumable_Sweet_Moss_GrDrRqWgv7gvl9vn.json @@ -14,7 +14,16 @@ "description": "

You can consume this moss during a rest to clear 1d10 HP.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "GrDrRqWgv7gvl9vn", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -80,7 +89,16 @@ "description": "

You can consume this moss during a rest to clear 1d10 Stress.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "GrDrRqWgv7gvl9vn", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -141,6 +159,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 62, @@ -161,10 +180,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753592391195, - "modifiedTime": 1755433069335, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336804065, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!GrDrRqWgv7gvl9vn" } diff --git a/src/packs/items/consumables/consumable_Unstable_Arcane_Shard_mUepnLbkvFk0ha4Z.json b/src/packs/items/consumables/consumable_Unstable_Arcane_Shard_mUepnLbkvFk0ha4Z.json index ab941d10..8194d7b2 100644 --- a/src/packs/items/consumables/consumable_Unstable_Arcane_Shard_mUepnLbkvFk0ha4Z.json +++ b/src/packs/items/consumables/consumable_Unstable_Arcane_Shard_mUepnLbkvFk0ha4Z.json @@ -14,7 +14,16 @@ "description": "

You can make a Finesse Roll to throw this shard at a group of adversaries within Far range. Targets you succeed against take 1d20 magic damage.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "consumeOnSuccess": false, + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "mUepnLbkvFk0ha4Z", + "step": null + } + ], "uses": { "value": null, "max": "", @@ -82,6 +91,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 60, @@ -102,10 +112,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753587732694, - "modifiedTime": 1755432611972, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336811267, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!mUepnLbkvFk0ha4Z" } diff --git a/src/packs/items/consumables/consumable_Varik_Leaves_hvy5BkG3F6iOIXTx.json b/src/packs/items/consumables/consumable_Varik_Leaves_hvy5BkG3F6iOIXTx.json index aef91404..cec9395e 100644 --- a/src/packs/items/consumables/consumable_Varik_Leaves_hvy5BkG3F6iOIXTx.json +++ b/src/packs/items/consumables/consumable_Varik_Leaves_hvy5BkG3F6iOIXTx.json @@ -14,7 +14,16 @@ "description": "

You can eat these paired leaves to immediately gain 2 Hope.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "hvy5BkG3F6iOIXTx", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -76,6 +85,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 60, @@ -96,10 +106,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753587484164, - "modifiedTime": 1755432594538, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336817973, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!hvy5BkG3F6iOIXTx" } diff --git a/src/packs/items/consumables/consumable_Vial_of_Darksmoke_Nwv5ydGf0MWnzq1n.json b/src/packs/items/consumables/consumable_Vial_of_Darksmoke_Nwv5ydGf0MWnzq1n.json index 56957a44..4959dc10 100644 --- a/src/packs/items/consumables/consumable_Vial_of_Darksmoke_Nwv5ydGf0MWnzq1n.json +++ b/src/packs/items/consumables/consumable_Vial_of_Darksmoke_Nwv5ydGf0MWnzq1n.json @@ -14,7 +14,16 @@ "description": "

When an adversary attacks you, use this vial and roll a number of d6s equal to your Agility. Add the highest result to your Evasion against the attack.

", "chatDisplay": true, "actionType": "reaction", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "Nwv5ydGf0MWnzq1n", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -31,6 +40,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -51,10 +61,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753588345314, - "modifiedTime": 1755432665859, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336825474, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!Nwv5ydGf0MWnzq1n" } diff --git a/src/packs/items/consumables/consumable_Vial_of_Moondrip_VqEX5YwK5oL3r1t6.json b/src/packs/items/consumables/consumable_Vial_of_Moondrip_VqEX5YwK5oL3r1t6.json index 26dc7ede..b849d989 100644 --- a/src/packs/items/consumables/consumable_Vial_of_Moondrip_VqEX5YwK5oL3r1t6.json +++ b/src/packs/items/consumables/consumable_Vial_of_Moondrip_VqEX5YwK5oL3r1t6.json @@ -14,7 +14,16 @@ "description": "

When you drink the contents of this vial, you can see in total darkness until your next rest.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "VqEX5YwK5oL3r1t6", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 60, @@ -101,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753587590537, - "modifiedTime": 1755432602190, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336832961, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!VqEX5YwK5oL3r1t6" } diff --git a/src/packs/items/consumables/consumable_Wingsprout_n10vozlmosVR6lo4.json b/src/packs/items/consumables/consumable_Wingsprout_n10vozlmosVR6lo4.json index 32552f86..eb3aeb5c 100644 --- a/src/packs/items/consumables/consumable_Wingsprout_n10vozlmosVR6lo4.json +++ b/src/packs/items/consumables/consumable_Wingsprout_n10vozlmosVR6lo4.json @@ -14,7 +14,16 @@ "description": "

You gain magic wings that allow you to fly for a number of minutes equal to your level.

", "chatDisplay": true, "actionType": "action", - "cost": [], + "cost": [ + { + "scalable": false, + "key": "quantity", + "value": 1, + "itemId": "n10vozlmosVR6lo4", + "step": null, + "consumeOnSuccess": false + } + ], "uses": { "value": null, "max": "", @@ -36,6 +45,7 @@ } }, "consumeOnUse": true, + "destroyOnEmpty": true, "attribution": { "source": "Daggerheart SRD", "page": 61, @@ -101,10 +111,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753591283853, - "modifiedTime": 1755432952411, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756336840548, + "lastModifiedBy": "gbAAZWyczKwejDNh" }, "_key": "!items!n10vozlmosVR6lo4" } diff --git a/src/packs/items/loot/loot_Belt_of_Unity_gFzkUGCjkRJtyoe9.json b/src/packs/items/loot/loot_Belt_of_Unity_gFzkUGCjkRJtyoe9.json index acd9ffee..eaa9def5 100644 --- a/src/packs/items/loot/loot_Belt_of_Unity_gFzkUGCjkRJtyoe9.json +++ b/src/packs/items/loot/loot_Belt_of_Unity_gFzkUGCjkRJtyoe9.json @@ -19,7 +19,6 @@ "scalable": false, "key": "hope", "value": 5, - "keyIsID": false, "step": null } ], diff --git a/src/packs/items/loot/loot_Glamour_Stone_Pj17cvdJ1XG1jv6I.json b/src/packs/items/loot/loot_Glamour_Stone_Pj17cvdJ1XG1jv6I.json index 6b233757..98714741 100644 --- a/src/packs/items/loot/loot_Glamour_Stone_Pj17cvdJ1XG1jv6I.json +++ b/src/packs/items/loot/loot_Glamour_Stone_Pj17cvdJ1XG1jv6I.json @@ -11,12 +11,11 @@ "type": "effect", "_id": "ATQgH12mufTOQLKs", "systemPath": "actions", - "description": "", + "description": "

Activate this pebble-sized stone to memorize the appearance of someone you can see. Spend a Hope to magically recreate this guise on yourself as an illusion.

", "chatDisplay": true, "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, @@ -25,17 +24,22 @@ ], "uses": { "value": null, - "max": null, + "max": "", "recovery": null }, - "effects": [], + "effects": [ + { + "_id": "K5SB6tfuDkdVaQYe", + "onSave": false + } + ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Create Illusion", "img": "icons/commodities/treasure/token-engraved-purple-glowing.webp", - "range": "" + "range": "self" } }, "attribution": { @@ -44,7 +48,52 @@ "artist": "" } }, - "effects": [], + "effects": [ + { + "name": "Glamour Stone", + "img": "icons/commodities/treasure/token-engraved-purple-glowing.webp", + "origin": "Compendium.daggerheart.loot.Item.Pj17cvdJ1XG1jv6I", + "transfer": false, + "_id": "K5SB6tfuDkdVaQYe", + "type": "base", + "system": { + "rangeDependence": { + "enabled": false, + "type": "withinRange", + "target": "hostile", + "range": "melee" + } + }, + "changes": [], + "disabled": false, + "duration": { + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "

Activate this pebble-sized stone to memorize the appearance of someone you can see. Spend a Hope to magically recreate this guise on yourself as an illusion.

", + "tint": "#ffffff", + "statuses": [], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.347", + "systemId": "daggerheart", + "systemVersion": "1.1.0", + "createdTime": 1756042876194, + "modifiedTime": 1756042884422, + "lastModifiedBy": "vUIbuan0U50nfKBE" + }, + "_key": "!items.effects!Pj17cvdJ1XG1jv6I.K5SB6tfuDkdVaQYe" + } + ], "folder": null, "sort": 0, "ownership": { @@ -58,10 +107,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753625773657, - "modifiedTime": 1755431995057, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756042876216, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items!Pj17cvdJ1XG1jv6I" } diff --git a/src/packs/items/loot/loot_Glider_CiXwelozmBDcPY48.json b/src/packs/items/loot/loot_Glider_CiXwelozmBDcPY48.json index 2457d2e2..2dfce26c 100644 --- a/src/packs/items/loot/loot_Glider_CiXwelozmBDcPY48.json +++ b/src/packs/items/loot/loot_Glider_CiXwelozmBDcPY48.json @@ -19,7 +19,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/items/loot/loot_Hopekeeper_Locket_9DcFR75tsnBYIp6Z.json b/src/packs/items/loot/loot_Hopekeeper_Locket_9DcFR75tsnBYIp6Z.json index 83356cb6..f1eac926 100644 --- a/src/packs/items/loot/loot_Hopekeeper_Locket_9DcFR75tsnBYIp6Z.json +++ b/src/packs/items/loot/loot_Hopekeeper_Locket_9DcFR75tsnBYIp6Z.json @@ -16,7 +16,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/items/loot/loot_Paragon_s_Chain_F4hoRfvVdZq5bhhI.json b/src/packs/items/loot/loot_Paragon_s_Chain_F4hoRfvVdZq5bhhI.json index ab2f2cc3..59260e5d 100644 --- a/src/packs/items/loot/loot_Paragon_s_Chain_F4hoRfvVdZq5bhhI.json +++ b/src/packs/items/loot/loot_Paragon_s_Chain_F4hoRfvVdZq5bhhI.json @@ -16,7 +16,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/items/loot/loot_Piercing_Arrows_I63LTFD6GXHgyGpR.json b/src/packs/items/loot/loot_Piercing_Arrows_I63LTFD6GXHgyGpR.json index 9a056431..26845282 100644 --- a/src/packs/items/loot/loot_Piercing_Arrows_I63LTFD6GXHgyGpR.json +++ b/src/packs/items/loot/loot_Piercing_Arrows_I63LTFD6GXHgyGpR.json @@ -11,7 +11,7 @@ "type": "effect", "_id": "DW5AqEM0F8XaUqpn", "systemPath": "actions", - "description": "", + "description": "

Three times per rest when you succeed on an attack with one of these arrows, you can add your Proficiency to the damage roll.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -108,10 +108,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753625947079, - "modifiedTime": 1755432020809, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756042964027, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items!I63LTFD6GXHgyGpR" } diff --git a/src/packs/items/loot/loot_Premium_Bedroll_QGYPNBIufpBguwjC.json b/src/packs/items/loot/loot_Premium_Bedroll_QGYPNBIufpBguwjC.json index f000d904..1a2b7f62 100644 --- a/src/packs/items/loot/loot_Premium_Bedroll_QGYPNBIufpBguwjC.json +++ b/src/packs/items/loot/loot_Premium_Bedroll_QGYPNBIufpBguwjC.json @@ -17,11 +17,11 @@ "cost": [], "uses": { "value": null, - "max": null, + "max": "", "recovery": null }, "target": { - "type": "any", + "type": "self", "amount": null }, "effects": [], @@ -89,10 +89,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753624827945, - "modifiedTime": 1755431895118, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756042976231, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items!QGYPNBIufpBguwjC" } diff --git a/src/packs/items/loot/loot_Ring_of_Resistance_aUqRifqR5JXXa1dN.json b/src/packs/items/loot/loot_Ring_of_Resistance_aUqRifqR5JXXa1dN.json index 628fe395..1fa60198 100644 --- a/src/packs/items/loot/loot_Ring_of_Resistance_aUqRifqR5JXXa1dN.json +++ b/src/packs/items/loot/loot_Ring_of_Resistance_aUqRifqR5JXXa1dN.json @@ -11,7 +11,7 @@ "type": "effect", "_id": "4swwe8SZeh2KyPtl", "systemPath": "actions", - "description": "", + "description": "

Once per long rest, you can activate this ring after a successful attack against you to halve the damage.

", "chatDisplay": true, "actionType": "action", "cost": [], @@ -20,14 +20,19 @@ "max": 1, "recovery": "longRest" }, - "effects": [], + "effects": [ + { + "_id": "Sj7uGf560T7u4rlX", + "onSave": false + } + ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Activate", "img": "icons/equipment/finger/ring-shield-silver.webp", - "range": "" + "range": "self" } }, "attribution": { @@ -36,7 +41,65 @@ "artist": "" } }, - "effects": [], + "effects": [ + { + "name": "Ring of Resistance", + "img": "icons/equipment/finger/ring-shield-silver.webp", + "origin": "Compendium.daggerheart.loot.Item.aUqRifqR5JXXa1dN", + "transfer": false, + "_id": "Sj7uGf560T7u4rlX", + "type": "base", + "system": { + "rangeDependence": { + "enabled": false, + "type": "withinRange", + "target": "hostile", + "range": "melee" + } + }, + "changes": [ + { + "key": "system.resistance.magical.resistance", + "mode": 5, + "value": "1", + "priority": null + }, + { + "key": "system.resistance.physical.resistance", + "mode": 5, + "value": "1", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "

Once per long rest, you can activate this ring after a successful attack against you to halve the damage.

", + "tint": "#ffffff", + "statuses": [], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.347", + "systemId": "daggerheart", + "systemVersion": "1.1.0", + "createdTime": 1756043003002, + "modifiedTime": 1756043032046, + "lastModifiedBy": "vUIbuan0U50nfKBE" + }, + "_key": "!items.effects!aUqRifqR5JXXa1dN.Sj7uGf560T7u4rlX" + } + ], "folder": null, "sort": 0, "ownership": { @@ -50,10 +113,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753638222884, - "modifiedTime": 1755432185583, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756043010729, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items!aUqRifqR5JXXa1dN" } diff --git a/src/packs/items/loot/loot_Ring_of_Silence_K1ysGnTpNyxPu5Au.json b/src/packs/items/loot/loot_Ring_of_Silence_K1ysGnTpNyxPu5Au.json index b6de3da5..d6e15140 100644 --- a/src/packs/items/loot/loot_Ring_of_Silence_K1ysGnTpNyxPu5Au.json +++ b/src/packs/items/loot/loot_Ring_of_Silence_K1ysGnTpNyxPu5Au.json @@ -11,12 +11,11 @@ "type": "effect", "_id": "Y4mvuJ4tncrKhyjY", "systemPath": "actions", - "description": "", + "description": "

Spend a Hope to activate this ring. Your footsteps are silent until your next rest.

", "chatDisplay": true, "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, @@ -28,14 +27,19 @@ "max": 1, "recovery": "shortRest" }, - "effects": [], + "effects": [ + { + "_id": "9JSLRu7amQ4iuIO7", + "onSave": false + } + ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Activate", "img": "icons/equipment/finger/ring-ball-purple.webp", - "range": "" + "range": "self" } }, "attribution": { @@ -47,9 +51,11 @@ "effects": [ { "name": "Ring of Silence", - "type": "base", - "_id": "aCt3QjdeTREZAlEa", "img": "icons/equipment/finger/ring-ball-purple.webp", + "origin": "Compendium.daggerheart.loot.Item.K1ysGnTpNyxPu5Au", + "transfer": false, + "_id": "9JSLRu7amQ4iuIO7", + "type": "base", "system": { "rangeDependence": { "enabled": false, @@ -59,7 +65,7 @@ } }, "changes": [], - "disabled": true, + "disabled": false, "duration": { "startTime": null, "combat": null, @@ -69,10 +75,8 @@ "startRound": null, "startTurn": null }, - "description": "

Your footsteps are silent until your next rest.

", - "origin": null, + "description": "

Your footsteps are silent until your next rest.

", "tint": "#ffffff", - "transfer": true, "statuses": [], "sort": 0, "flags": {}, @@ -80,14 +84,14 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.346", + "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "0.0.1", - "createdTime": 1753990311274, - "modifiedTime": 1753990345889, - "lastModifiedBy": "MQSznptE5yLT7kj8" + "systemVersion": "1.1.0", + "createdTime": 1756043091753, + "modifiedTime": 1756043101742, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, - "_key": "!items.effects!K1ysGnTpNyxPu5Au.aCt3QjdeTREZAlEa" + "_key": "!items.effects!K1ysGnTpNyxPu5Au.9JSLRu7amQ4iuIO7" } ], "folder": null, @@ -103,10 +107,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1753637775628, - "modifiedTime": 1755432151648, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756043091776, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items!K1ysGnTpNyxPu5Au" } diff --git a/src/packs/items/loot/loot_Ring_of_Unbreakable_Resolve_kn71qCQY0DnjmQBJ.json b/src/packs/items/loot/loot_Ring_of_Unbreakable_Resolve_kn71qCQY0DnjmQBJ.json index e4a4511f..99f856da 100644 --- a/src/packs/items/loot/loot_Ring_of_Unbreakable_Resolve_kn71qCQY0DnjmQBJ.json +++ b/src/packs/items/loot/loot_Ring_of_Unbreakable_Resolve_kn71qCQY0DnjmQBJ.json @@ -19,7 +19,6 @@ "scalable": false, "key": "hope", "value": 4, - "keyIsID": false, "step": null } ], diff --git a/src/packs/items/loot/loot_Shard_of_Memory_2ULPgNyqCrxea0v0.json b/src/packs/items/loot/loot_Shard_of_Memory_2ULPgNyqCrxea0v0.json index f6d004e4..efc12e63 100644 --- a/src/packs/items/loot/loot_Shard_of_Memory_2ULPgNyqCrxea0v0.json +++ b/src/packs/items/loot/loot_Shard_of_Memory_2ULPgNyqCrxea0v0.json @@ -19,7 +19,6 @@ "scalable": false, "key": "hope", "value": 2, - "keyIsID": false, "step": null } ], diff --git a/src/packs/items/weapons/weapon_Advanced_Light_Frame_Wheelchair_BuMfupnCzHbziQ8o.json b/src/packs/items/weapons/weapon_Advanced_Light_Frame_Wheelchair_BuMfupnCzHbziQ8o.json index 9321abf8..03b69488 100644 --- a/src/packs/items/weapons/weapon_Advanced_Light_Frame_Wheelchair_BuMfupnCzHbziQ8o.json +++ b/src/packs/items/weapons/weapon_Advanced_Light_Frame_Wheelchair_BuMfupnCzHbziQ8o.json @@ -17,7 +17,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Advanced_Rapier_KxFne76d7cak15dO.json b/src/packs/items/weapons/weapon_Advanced_Rapier_KxFne76d7cak15dO.json index 9352e5de..7e7226d2 100644 --- a/src/packs/items/weapons/weapon_Advanced_Rapier_KxFne76d7cak15dO.json +++ b/src/packs/items/weapons/weapon_Advanced_Rapier_KxFne76d7cak15dO.json @@ -18,7 +18,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Advanced_Whip_01izMUSJcAUo79IX.json b/src/packs/items/weapons/weapon_Advanced_Whip_01izMUSJcAUo79IX.json index 99cae67f..dfbb4906 100644 --- a/src/packs/items/weapons/weapon_Advanced_Whip_01izMUSJcAUo79IX.json +++ b/src/packs/items/weapons/weapon_Advanced_Whip_01izMUSJcAUo79IX.json @@ -18,7 +18,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Axe_of_Fortunis_YcS1rHgfnSlla8Xf.json b/src/packs/items/weapons/weapon_Axe_of_Fortunis_YcS1rHgfnSlla8Xf.json index eb5c8e2b..f7f748ae 100644 --- a/src/packs/items/weapons/weapon_Axe_of_Fortunis_YcS1rHgfnSlla8Xf.json +++ b/src/packs/items/weapons/weapon_Axe_of_Fortunis_YcS1rHgfnSlla8Xf.json @@ -18,7 +18,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Bladed_Whip_5faflfNz20cFW1EM.json b/src/packs/items/weapons/weapon_Bladed_Whip_5faflfNz20cFW1EM.json index c7a74b26..dba962aa 100644 --- a/src/packs/items/weapons/weapon_Bladed_Whip_5faflfNz20cFW1EM.json +++ b/src/packs/items/weapons/weapon_Bladed_Whip_5faflfNz20cFW1EM.json @@ -18,7 +18,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Bloodstaff_IoMVDz92WVvfGGdc.json b/src/packs/items/weapons/weapon_Bloodstaff_IoMVDz92WVvfGGdc.json index 1273d9a8..fb41b73f 100644 --- a/src/packs/items/weapons/weapon_Bloodstaff_IoMVDz92WVvfGGdc.json +++ b/src/packs/items/weapons/weapon_Bloodstaff_IoMVDz92WVvfGGdc.json @@ -18,7 +18,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Buckler_EmFTp9wzT6MHSaNz.json b/src/packs/items/weapons/weapon_Buckler_EmFTp9wzT6MHSaNz.json index 8e6ef6ca..2a7e0db6 100644 --- a/src/packs/items/weapons/weapon_Buckler_EmFTp9wzT6MHSaNz.json +++ b/src/packs/items/weapons/weapon_Buckler_EmFTp9wzT6MHSaNz.json @@ -20,11 +20,12 @@ }, "cost": [ { - "key": "armorSlot", + "key": "resource", + "itemId": "armorSlot", "value": 1, - "keyIsID": false, "scalable": false, - "step": null + "step": null, + "consumeOnSuccess": false } ], "effects": [ @@ -196,10 +197,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1753795181779, - "modifiedTime": 1755430450631, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575921, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_key": "!items!EmFTp9wzT6MHSaNz" } diff --git a/src/packs/items/weapons/weapon_Dual_Ended_Sword_nXjuBa215H1sTUK3.json b/src/packs/items/weapons/weapon_Dual_Ended_Sword_nXjuBa215H1sTUK3.json index 1c4f75ce..9b43770c 100644 --- a/src/packs/items/weapons/weapon_Dual_Ended_Sword_nXjuBa215H1sTUK3.json +++ b/src/packs/items/weapons/weapon_Dual_Ended_Sword_nXjuBa215H1sTUK3.json @@ -18,7 +18,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Hammer_of_Wrath_1R4uzOpWD8bkYRUm.json b/src/packs/items/weapons/weapon_Hammer_of_Wrath_1R4uzOpWD8bkYRUm.json index 0a1d9dab..bf29dc34 100644 --- a/src/packs/items/weapons/weapon_Hammer_of_Wrath_1R4uzOpWD8bkYRUm.json +++ b/src/packs/items/weapons/weapon_Hammer_of_Wrath_1R4uzOpWD8bkYRUm.json @@ -18,7 +18,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Impact_Gauntlet_Zg6IutksQVOqAg8K.json b/src/packs/items/weapons/weapon_Impact_Gauntlet_Zg6IutksQVOqAg8K.json index b817a332..ca842d59 100644 --- a/src/packs/items/weapons/weapon_Impact_Gauntlet_Zg6IutksQVOqAg8K.json +++ b/src/packs/items/weapons/weapon_Impact_Gauntlet_Zg6IutksQVOqAg8K.json @@ -22,7 +22,6 @@ { "key": "hope", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Improved_Light_Frame_Wheelchair_ZJsetdHKV77ygtCE.json b/src/packs/items/weapons/weapon_Improved_Light_Frame_Wheelchair_ZJsetdHKV77ygtCE.json index e774d93d..8922d621 100644 --- a/src/packs/items/weapons/weapon_Improved_Light_Frame_Wheelchair_ZJsetdHKV77ygtCE.json +++ b/src/packs/items/weapons/weapon_Improved_Light_Frame_Wheelchair_ZJsetdHKV77ygtCE.json @@ -17,7 +17,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Improved_Rapier_LFPH8nD2f4Blv3AM.json b/src/packs/items/weapons/weapon_Improved_Rapier_LFPH8nD2f4Blv3AM.json index 7c79855b..229d1682 100644 --- a/src/packs/items/weapons/weapon_Improved_Rapier_LFPH8nD2f4Blv3AM.json +++ b/src/packs/items/weapons/weapon_Improved_Rapier_LFPH8nD2f4Blv3AM.json @@ -18,7 +18,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Improved_Whip_ftTp8VlsBQ1r4LFD.json b/src/packs/items/weapons/weapon_Improved_Whip_ftTp8VlsBQ1r4LFD.json index 9f44f5bc..b52bf465 100644 --- a/src/packs/items/weapons/weapon_Improved_Whip_ftTp8VlsBQ1r4LFD.json +++ b/src/packs/items/weapons/weapon_Improved_Whip_ftTp8VlsBQ1r4LFD.json @@ -18,7 +18,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Legendary_Light_Frame_Wheelchair_Xt8tVSn5Fu6ly6LF.json b/src/packs/items/weapons/weapon_Legendary_Light_Frame_Wheelchair_Xt8tVSn5Fu6ly6LF.json index 7d9fc299..a9b35948 100644 --- a/src/packs/items/weapons/weapon_Legendary_Light_Frame_Wheelchair_Xt8tVSn5Fu6ly6LF.json +++ b/src/packs/items/weapons/weapon_Legendary_Light_Frame_Wheelchair_Xt8tVSn5Fu6ly6LF.json @@ -17,7 +17,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Legendary_Rapier_BakN97v4jTePcXiZ.json b/src/packs/items/weapons/weapon_Legendary_Rapier_BakN97v4jTePcXiZ.json index eaa6768c..b4df7c8c 100644 --- a/src/packs/items/weapons/weapon_Legendary_Rapier_BakN97v4jTePcXiZ.json +++ b/src/packs/items/weapons/weapon_Legendary_Rapier_BakN97v4jTePcXiZ.json @@ -18,7 +18,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Legendary_Whip_Wcdbf6yS3LEt7nsg.json b/src/packs/items/weapons/weapon_Legendary_Whip_Wcdbf6yS3LEt7nsg.json index 603f8fae..736db796 100644 --- a/src/packs/items/weapons/weapon_Legendary_Whip_Wcdbf6yS3LEt7nsg.json +++ b/src/packs/items/weapons/weapon_Legendary_Whip_Wcdbf6yS3LEt7nsg.json @@ -18,7 +18,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Light_Frame_Wheelchair_iaGnlUkShBgdeMo0.json b/src/packs/items/weapons/weapon_Light_Frame_Wheelchair_iaGnlUkShBgdeMo0.json index 62090883..72aa2931 100644 --- a/src/packs/items/weapons/weapon_Light_Frame_Wheelchair_iaGnlUkShBgdeMo0.json +++ b/src/packs/items/weapons/weapon_Light_Frame_Wheelchair_iaGnlUkShBgdeMo0.json @@ -18,7 +18,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Powered_Gauntlet_bW3xw5S9DbaLCN3E.json b/src/packs/items/weapons/weapon_Powered_Gauntlet_bW3xw5S9DbaLCN3E.json index 2e88d91c..f75537d3 100644 --- a/src/packs/items/weapons/weapon_Powered_Gauntlet_bW3xw5S9DbaLCN3E.json +++ b/src/packs/items/weapons/weapon_Powered_Gauntlet_bW3xw5S9DbaLCN3E.json @@ -22,7 +22,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Rapier_zkAgEW6zMkRZalEm.json b/src/packs/items/weapons/weapon_Rapier_zkAgEW6zMkRZalEm.json index 45f5d8e7..7b6129ce 100644 --- a/src/packs/items/weapons/weapon_Rapier_zkAgEW6zMkRZalEm.json +++ b/src/packs/items/weapons/weapon_Rapier_zkAgEW6zMkRZalEm.json @@ -18,7 +18,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Ricochet_Axes_E9QDh5o9eQ1Qx0kH.json b/src/packs/items/weapons/weapon_Ricochet_Axes_E9QDh5o9eQ1Qx0kH.json index 9c0f0eae..c00a90b6 100644 --- a/src/packs/items/weapons/weapon_Ricochet_Axes_E9QDh5o9eQ1Qx0kH.json +++ b/src/packs/items/weapons/weapon_Ricochet_Axes_E9QDh5o9eQ1Qx0kH.json @@ -19,8 +19,7 @@ "key": "stress", "value": 1, "scalable": true, - "step": 1, - "keyIsID": false + "step": 1 } ], "_id": "x9cz8u1utQ6DtoKA", diff --git a/src/packs/items/weapons/weapon_Runes_of_Ruination_EG6mZhr3ib56r974.json b/src/packs/items/weapons/weapon_Runes_of_Ruination_EG6mZhr3ib56r974.json index b062a33a..533f7ca9 100644 --- a/src/packs/items/weapons/weapon_Runes_of_Ruination_EG6mZhr3ib56r974.json +++ b/src/packs/items/weapons/weapon_Runes_of_Ruination_EG6mZhr3ib56r974.json @@ -18,7 +18,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Swinging_Ropeblade_1jOJHHKdtk3s2jaY.json b/src/packs/items/weapons/weapon_Swinging_Ropeblade_1jOJHHKdtk3s2jaY.json index 03e4053f..141d92c1 100644 --- a/src/packs/items/weapons/weapon_Swinging_Ropeblade_1jOJHHKdtk3s2jaY.json +++ b/src/packs/items/weapons/weapon_Swinging_Ropeblade_1jOJHHKdtk3s2jaY.json @@ -18,7 +18,6 @@ { "key": "hope", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Wand_of_Enthrallment_tP6vmnrmTq2h5sj7.json b/src/packs/items/weapons/weapon_Wand_of_Enthrallment_tP6vmnrmTq2h5sj7.json index 88522c0b..425c9ea1 100644 --- a/src/packs/items/weapons/weapon_Wand_of_Enthrallment_tP6vmnrmTq2h5sj7.json +++ b/src/packs/items/weapons/weapon_Wand_of_Enthrallment_tP6vmnrmTq2h5sj7.json @@ -22,7 +22,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/items/weapons/weapon_Whip_CmtWqw6DwoePnX7W.json b/src/packs/items/weapons/weapon_Whip_CmtWqw6DwoePnX7W.json index dd75905f..36490a5d 100644 --- a/src/packs/items/weapons/weapon_Whip_CmtWqw6DwoePnX7W.json +++ b/src/packs/items/weapons/weapon_Whip_CmtWqw6DwoePnX7W.json @@ -18,7 +18,6 @@ { "key": "stress", "value": 1, - "keyIsID": false, "scalable": false, "step": null } diff --git a/src/packs/subclasses/feature_Act_of_Reprisal_k7vvMJtEcxMWUUrW.json b/src/packs/subclasses/feature_Act_of_Reprisal_k7vvMJtEcxMWUUrW.json index 441bf12a..a73eb3d7 100644 --- a/src/packs/subclasses/feature_Act_of_Reprisal_k7vvMJtEcxMWUUrW.json +++ b/src/packs/subclasses/feature_Act_of_Reprisal_k7vvMJtEcxMWUUrW.json @@ -29,7 +29,7 @@ } ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Mark Adversary", @@ -98,10 +98,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754243143650, - "modifiedTime": 1755391854504, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756035614382, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items!k7vvMJtEcxMWUUrW" } diff --git a/src/packs/subclasses/feature_Adept_v511C6GMShsBblah.json b/src/packs/subclasses/feature_Adept_v511C6GMShsBblah.json index 4e5b9d0b..3cfe1052 100644 --- a/src/packs/subclasses/feature_Adept_v511C6GMShsBblah.json +++ b/src/packs/subclasses/feature_Adept_v511C6GMShsBblah.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/subclasses/feature_Adrenaline_uByM34yQlw38yf1V.json b/src/packs/subclasses/feature_Adrenaline_uByM34yQlw38yf1V.json index c1b11484..e15129b0 100644 --- a/src/packs/subclasses/feature_Adrenaline_uByM34yQlw38yf1V.json +++ b/src/packs/subclasses/feature_Adrenaline_uByM34yQlw38yf1V.json @@ -7,36 +7,7 @@ "system": { "description": "

While you're Vulnerable, add your level to your damage rolls.

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

While you're Vulnerable, add your level to your damage rolls.

", - "chatDisplay": true, - "actionType": "action", - "cost": [], - "uses": { - "value": null, - "max": "", - "recovery": null, - "consumeOnSuccess": false - }, - "effects": [ - { - "_id": "HMx9uZ54mvMiH95x", - "onSave": false - } - ], - "target": { - "type": "self", - "amount": null - }, - "name": "Apply", - "img": "icons/magic/unholy/hand-marked-pink.webp", - "range": "" - } - }, + "actions": {}, "originItemType": null, "originId": null, "attribution": { @@ -116,10 +87,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754319984350, - "modifiedTime": 1755392070263, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756035779655, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items!uByM34yQlw38yf1V" } diff --git a/src/packs/subclasses/feature_Apex_Predator_lwH3E0Zyf4gbVOd0.json b/src/packs/subclasses/feature_Apex_Predator_lwH3E0Zyf4gbVOd0.json index 31d79e90..545f2116 100644 --- a/src/packs/subclasses/feature_Apex_Predator_lwH3E0Zyf4gbVOd0.json +++ b/src/packs/subclasses/feature_Apex_Predator_lwH3E0Zyf4gbVOd0.json @@ -17,7 +17,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/subclasses/feature_Battle_Bonded_hWsKyed1vfILg0I8.json b/src/packs/subclasses/feature_Battle_Bonded_hWsKyed1vfILg0I8.json index 259a25da..1efb24e2 100644 --- a/src/packs/subclasses/feature_Battle_Bonded_hWsKyed1vfILg0I8.json +++ b/src/packs/subclasses/feature_Battle_Bonded_hWsKyed1vfILg0I8.json @@ -16,7 +16,59 @@ "artist": "" } }, - "effects": [], + "effects": [ + { + "name": "Battle Bonded", + "type": "base", + "system": { + "rangeDependence": { + "enabled": false, + "type": "withinRange", + "target": "hostile", + "range": "melee" + } + }, + "_id": "IZhakv6EuG8DO4a3", + "img": "icons/creatures/mammals/humanoid-wolf-dog-blue.webp", + "changes": [ + { + "key": "system.evasion", + "mode": 2, + "value": "2", + "priority": null + } + ], + "disabled": true, + "duration": { + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "

When an adversary attacks you while they’re within your companion’s Melee range, you gain a +2 bonus to your Evasion against the attack.

", + "origin": null, + "tint": "#ffffff", + "transfer": true, + "statuses": [], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.347", + "systemId": "daggerheart", + "systemVersion": "1.1.0", + "createdTime": 1756035661033, + "modifiedTime": 1756035696385, + "lastModifiedBy": "vUIbuan0U50nfKBE" + }, + "_key": "!items.effects!hWsKyed1vfILg0I8.IZhakv6EuG8DO4a3" + } + ], "sort": 0, "ownership": { "default": 0, diff --git a/src/packs/subclasses/feature_Clarity_of_Nature_etaQ01yGJhBLDUqZ.json b/src/packs/subclasses/feature_Clarity_of_Nature_etaQ01yGJhBLDUqZ.json index a0c614a5..ff56a435 100644 --- a/src/packs/subclasses/feature_Clarity_of_Nature_etaQ01yGJhBLDUqZ.json +++ b/src/packs/subclasses/feature_Clarity_of_Nature_etaQ01yGJhBLDUqZ.json @@ -17,11 +17,12 @@ "actionType": "action", "cost": [ { - "scalable": false, - "key": "etaQ01yGJhBLDUqZ", + "key": "resource", + "itemId": "etaQ01yGJhBLDUqZ", "value": 1, - "keyIsID": true, - "step": null + "scalable": false, + "step": null, + "consumeOnSuccess": false } ], "uses": { @@ -105,10 +106,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1754179740310, - "modifiedTime": 1755391695859, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575203, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_key": "!items!etaQ01yGJhBLDUqZ" } diff --git a/src/packs/subclasses/feature_Contacts_Everywhere_cXbRm744mW6UXGam.json b/src/packs/subclasses/feature_Contacts_Everywhere_cXbRm744mW6UXGam.json index 2b69d05e..75a5f905 100644 --- a/src/packs/subclasses/feature_Contacts_Everywhere_cXbRm744mW6UXGam.json +++ b/src/packs/subclasses/feature_Contacts_Everywhere_cXbRm744mW6UXGam.json @@ -20,7 +20,6 @@ "scalable": false, "key": "hitPoints", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/subclasses/feature_Defender_Jdktv5p1K2PfgxrT.json b/src/packs/subclasses/feature_Defender_Jdktv5p1K2PfgxrT.json index 515f12da..017a0752 100644 --- a/src/packs/subclasses/feature_Defender_Jdktv5p1K2PfgxrT.json +++ b/src/packs/subclasses/feature_Defender_Jdktv5p1K2PfgxrT.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/subclasses/feature_Elemental_Dominion_EFUJHrkTuyv8uA9l.json b/src/packs/subclasses/feature_Elemental_Dominion_EFUJHrkTuyv8uA9l.json index 11317c54..5cad10d1 100644 --- a/src/packs/subclasses/feature_Elemental_Dominion_EFUJHrkTuyv8uA9l.json +++ b/src/packs/subclasses/feature_Elemental_Dominion_EFUJHrkTuyv8uA9l.json @@ -74,7 +74,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/subclasses/feature_Elemental_Incarnation_f37TTgCc0Q3Ih1A1.json b/src/packs/subclasses/feature_Elemental_Incarnation_f37TTgCc0Q3Ih1A1.json index 56387284..02af8c17 100644 --- a/src/packs/subclasses/feature_Elemental_Incarnation_f37TTgCc0Q3Ih1A1.json +++ b/src/packs/subclasses/feature_Elemental_Incarnation_f37TTgCc0Q3Ih1A1.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -106,7 +105,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -141,7 +139,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -206,7 +203,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/subclasses/feature_Elementalist_dPcqKN5NeDkjB1HW.json b/src/packs/subclasses/feature_Elementalist_dPcqKN5NeDkjB1HW.json index dd2d8597..bfb4df2c 100644 --- a/src/packs/subclasses/feature_Elementalist_dPcqKN5NeDkjB1HW.json +++ b/src/packs/subclasses/feature_Elementalist_dPcqKN5NeDkjB1HW.json @@ -17,7 +17,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, @@ -38,12 +37,12 @@ } ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Bonus to Roll", "img": "icons/sundries/gaming/dice-runed-tan.webp", - "range": "" + "range": "self" }, "S7HvFD3qIR3ifJRL": { "type": "effect", @@ -54,7 +53,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, @@ -75,12 +73,12 @@ } ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Bonus to Damage", "img": "icons/sundries/gaming/dice-runed-tan.webp", - "range": "" + "range": "self" } }, "originItemType": null, @@ -115,7 +113,7 @@ "priority": null } ], - "disabled": true, + "disabled": false, "duration": { "startTime": null, "combat": null, @@ -134,10 +132,11 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.346", + "coreVersion": "13.347", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "vUIbuan0U50nfKBE", + "modifiedTime": 1756035533156 }, "_key": "!items.effects!dPcqKN5NeDkjB1HW.EY87mY6ULfIt3XC8" }, @@ -170,7 +169,7 @@ "priority": null } ], - "disabled": true, + "disabled": false, "duration": { "startTime": null, "combat": null, @@ -189,10 +188,11 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.346", + "coreVersion": "13.347", "systemId": "daggerheart", "systemVersion": "0.0.1", - "lastModifiedBy": null + "lastModifiedBy": "vUIbuan0U50nfKBE", + "modifiedTime": 1756035536128 }, "_key": "!items.effects!dPcqKN5NeDkjB1HW.WwibpgaO6Kkks7aZ" } @@ -209,10 +209,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754349507020, - "modifiedTime": 1755392284524, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756035526712, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items!dPcqKN5NeDkjB1HW" } diff --git a/src/packs/subclasses/feature_Elusive_Predator_Cjtc43V3IzAmfIFG.json b/src/packs/subclasses/feature_Elusive_Predator_Cjtc43V3IzAmfIFG.json index fed36288..d0787ec3 100644 --- a/src/packs/subclasses/feature_Elusive_Predator_Cjtc43V3IzAmfIFG.json +++ b/src/packs/subclasses/feature_Elusive_Predator_Cjtc43V3IzAmfIFG.json @@ -16,7 +16,59 @@ "artist": "" } }, - "effects": [], + "effects": [ + { + "name": "Elusive Predator", + "type": "base", + "system": { + "rangeDependence": { + "enabled": false, + "type": "withinRange", + "target": "hostile", + "range": "melee" + } + }, + "_id": "X4llFOcAcdJLbear", + "img": "icons/creatures/mammals/beast-horned-scaled-glowing-orange.webp", + "changes": [ + { + "key": "system.evasion", + "mode": 2, + "value": "2", + "priority": null + } + ], + "disabled": true, + "duration": { + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "

When your Focus makes an attack against you, you gain a +2 bonus to your Evasion against the attack.

", + "origin": null, + "tint": "#ffffff", + "transfer": true, + "statuses": [], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null, + "duplicateSource": null, + "exportSource": null, + "coreVersion": "13.347", + "systemId": "daggerheart", + "systemVersion": "1.1.0", + "createdTime": 1756035709943, + "modifiedTime": 1756035734622, + "lastModifiedBy": "vUIbuan0U50nfKBE" + }, + "_key": "!items.effects!Cjtc43V3IzAmfIFG.X4llFOcAcdJLbear" + } + ], "sort": 0, "ownership": { "default": 0, diff --git a/src/packs/subclasses/feature_Heart_of_a_Poet_Ce0sn0kqAw3PFe0k.json b/src/packs/subclasses/feature_Heart_of_a_Poet_Ce0sn0kqAw3PFe0k.json index f0088f38..0b5b61f5 100644 --- a/src/packs/subclasses/feature_Heart_of_a_Poet_Ce0sn0kqAw3PFe0k.json +++ b/src/packs/subclasses/feature_Heart_of_a_Poet_Ce0sn0kqAw3PFe0k.json @@ -16,7 +16,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/subclasses/feature_Loyal_Protector_hd7UeBPr86Mz21Pe.json b/src/packs/subclasses/feature_Loyal_Protector_hd7UeBPr86Mz21Pe.json index 667fefd8..e7f060d5 100644 --- a/src/packs/subclasses/feature_Loyal_Protector_hd7UeBPr86Mz21Pe.json +++ b/src/packs/subclasses/feature_Loyal_Protector_hd7UeBPr86Mz21Pe.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/subclasses/feature_Manipulate_Magic_UNg4eyNfEQrMdD7G.json b/src/packs/subclasses/feature_Manipulate_Magic_UNg4eyNfEQrMdD7G.json index 6981cd57..46ac1a9d 100644 --- a/src/packs/subclasses/feature_Manipulate_Magic_UNg4eyNfEQrMdD7G.json +++ b/src/packs/subclasses/feature_Manipulate_Magic_UNg4eyNfEQrMdD7G.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/subclasses/feature_Natural_Evasion_TnuLBtHQGbqyzn82.json b/src/packs/subclasses/feature_Natural_Evasion_TnuLBtHQGbqyzn82.json index 41c12fe9..33804ae4 100644 --- a/src/packs/subclasses/feature_Natural_Evasion_TnuLBtHQGbqyzn82.json +++ b/src/packs/subclasses/feature_Natural_Evasion_TnuLBtHQGbqyzn82.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/subclasses/feature_Nemesis_DPKmipNRlSAMs2Cg.json b/src/packs/subclasses/feature_Nemesis_DPKmipNRlSAMs2Cg.json index aa7a3458..1d8f3b8f 100644 --- a/src/packs/subclasses/feature_Nemesis_DPKmipNRlSAMs2Cg.json +++ b/src/packs/subclasses/feature_Nemesis_DPKmipNRlSAMs2Cg.json @@ -20,7 +20,6 @@ "scalable": false, "key": "hope", "value": 2, - "keyIsID": false, "step": null } ], diff --git a/src/packs/subclasses/feature_Partner_in_Arms_G54qY96XK62hgoK9.json b/src/packs/subclasses/feature_Partner_in_Arms_G54qY96XK62hgoK9.json index 1dab1e94..b0b37c6d 100644 --- a/src/packs/subclasses/feature_Partner_in_Arms_G54qY96XK62hgoK9.json +++ b/src/packs/subclasses/feature_Partner_in_Arms_G54qY96XK62hgoK9.json @@ -20,7 +20,6 @@ "scalable": false, "key": "armor", "value": 1, - "keyIsID": false, "step": null } ], diff --git a/src/packs/subclasses/feature_Regeneration_KRyrbSLVGreIOTZe.json b/src/packs/subclasses/feature_Regeneration_KRyrbSLVGreIOTZe.json index a0349e7c..9947cc38 100644 --- a/src/packs/subclasses/feature_Regeneration_KRyrbSLVGreIOTZe.json +++ b/src/packs/subclasses/feature_Regeneration_KRyrbSLVGreIOTZe.json @@ -20,7 +20,6 @@ "scalable": false, "key": "hope", "value": 3, - "keyIsID": false, "step": null } ], diff --git a/src/packs/subclasses/feature_Revenge_oNfA5F9cKwNR7joq.json b/src/packs/subclasses/feature_Revenge_oNfA5F9cKwNR7joq.json index ad653f1e..83113e14 100644 --- a/src/packs/subclasses/feature_Revenge_oNfA5F9cKwNR7joq.json +++ b/src/packs/subclasses/feature_Revenge_oNfA5F9cKwNR7joq.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 2, - "keyIsID": false, "step": null } ], diff --git a/src/packs/subclasses/feature_Rousing_Speech_PCmYTX02JLzBpgml.json b/src/packs/subclasses/feature_Rousing_Speech_PCmYTX02JLzBpgml.json index be204300..a2708a8c 100644 --- a/src/packs/subclasses/feature_Rousing_Speech_PCmYTX02JLzBpgml.json +++ b/src/packs/subclasses/feature_Rousing_Speech_PCmYTX02JLzBpgml.json @@ -19,7 +19,6 @@ "scalable": false, "key": "hitPoints", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/subclasses/feature_Ruthless_Predator_Qny2J3R35bvC0Cey.json b/src/packs/subclasses/feature_Ruthless_Predator_Qny2J3R35bvC0Cey.json index 8ac4675a..f53d7b4a 100644 --- a/src/packs/subclasses/feature_Ruthless_Predator_Qny2J3R35bvC0Cey.json +++ b/src/packs/subclasses/feature_Ruthless_Predator_Qny2J3R35bvC0Cey.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -36,12 +35,12 @@ } ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Mark Stress", "img": "icons/creatures/mammals/wolf-shadow-black.webp", - "range": "" + "range": "self" } }, "originItemType": null, @@ -117,10 +116,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754266926055, - "modifiedTime": 1755391927605, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756035422344, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items!Qny2J3R35bvC0Cey" } diff --git a/src/packs/subclasses/feature_Shadow_Stepper_hAwTXjhyphiE3aeW.json b/src/packs/subclasses/feature_Shadow_Stepper_hAwTXjhyphiE3aeW.json index c46446d0..fe624444 100644 --- a/src/packs/subclasses/feature_Shadow_Stepper_hAwTXjhyphiE3aeW.json +++ b/src/packs/subclasses/feature_Shadow_Stepper_hAwTXjhyphiE3aeW.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -36,12 +35,12 @@ } ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Mark Stress", "img": "icons/magic/unholy/projectile-smoke-trail-pink.webp", - "range": "" + "range": "far" } }, "originItemType": null, @@ -110,10 +109,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754318976447, - "modifiedTime": 1755392035163, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756035450401, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items!hAwTXjhyphiE3aeW" } diff --git a/src/packs/subclasses/feature_Sparing_Touch_GfOSgVJW8bS1OjNq.json b/src/packs/subclasses/feature_Sparing_Touch_GfOSgVJW8bS1OjNq.json index 311cb456..6b1bc11a 100644 --- a/src/packs/subclasses/feature_Sparing_Touch_GfOSgVJW8bS1OjNq.json +++ b/src/packs/subclasses/feature_Sparing_Touch_GfOSgVJW8bS1OjNq.json @@ -24,10 +24,10 @@ "actionType": "action", "cost": [ { - "scalable": false, - "key": "GfOSgVJW8bS1OjNq", + "key": "resource", + "itemId": "GfOSgVJW8bS1OjNq", "value": 1, - "keyIsID": true, + "scalable": false, "step": null, "consumeOnSuccess": false } @@ -101,10 +101,10 @@ "actionType": "action", "cost": [ { - "scalable": false, - "key": "GfOSgVJW8bS1OjNq", + "key": "resource", + "itemId": "GfOSgVJW8bS1OjNq", "value": 1, - "keyIsID": true, + "scalable": false, "step": null, "consumeOnSuccess": false } @@ -191,10 +191,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.2.0", "createdTime": 1754353243691, - "modifiedTime": 1755392184339, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756325575182, + "lastModifiedBy": "bjJtdJOhqWr47GhC" }, "_key": "!items!GfOSgVJW8bS1OjNq" } diff --git a/src/packs/subclasses/feature_Spirit_Weapon_McoS0RxNLOg3SfSt.json b/src/packs/subclasses/feature_Spirit_Weapon_McoS0RxNLOg3SfSt.json index 54a8303a..d7b2c877 100644 --- a/src/packs/subclasses/feature_Spirit_Weapon_McoS0RxNLOg3SfSt.json +++ b/src/packs/subclasses/feature_Spirit_Weapon_McoS0RxNLOg3SfSt.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/subclasses/feature_Thrive_in_Chaos_1nmFmkNXY6OYyyju.json b/src/packs/subclasses/feature_Thrive_in_Chaos_1nmFmkNXY6OYyyju.json index a8952599..953802de 100644 --- a/src/packs/subclasses/feature_Thrive_in_Chaos_1nmFmkNXY6OYyyju.json +++ b/src/packs/subclasses/feature_Thrive_in_Chaos_1nmFmkNXY6OYyyju.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/subclasses/feature_Transcendence_th6HZwEFnVBjUtqm.json b/src/packs/subclasses/feature_Transcendence_th6HZwEFnVBjUtqm.json index b0cc2c4f..da7da282 100644 --- a/src/packs/subclasses/feature_Transcendence_th6HZwEFnVBjUtqm.json +++ b/src/packs/subclasses/feature_Transcendence_th6HZwEFnVBjUtqm.json @@ -20,7 +20,6 @@ "scalable": false, "key": "hitPoints", "value": 1, - "keyIsID": false, "step": null, "consumeOnSuccess": false } diff --git a/src/packs/subclasses/feature_Vanishing_Act_iyIg1VLwO8C6jvFZ.json b/src/packs/subclasses/feature_Vanishing_Act_iyIg1VLwO8C6jvFZ.json index d56182e9..c8065dbb 100644 --- a/src/packs/subclasses/feature_Vanishing_Act_iyIg1VLwO8C6jvFZ.json +++ b/src/packs/subclasses/feature_Vanishing_Act_iyIg1VLwO8C6jvFZ.json @@ -20,7 +20,6 @@ "scalable": false, "key": "stress", "value": 1, - "keyIsID": false, "step": null } ], @@ -36,12 +35,12 @@ } ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Mark Stress", "img": "icons/magic/unholy/strike-hand-glow-pink.webp", - "range": "" + "range": "self" } }, "originItemType": null, @@ -57,7 +56,7 @@ "name": "Vanishing Act: Cloaked", "img": "icons/magic/unholy/strike-hand-glow-pink.webp", "origin": "Compendium.daggerheart.subclasses.Item.iyIg1VLwO8C6jvFZ", - "transfer": true, + "transfer": false, "_id": "czrwqq44sEr0uJ8O", "type": "base", "system": { @@ -88,12 +87,12 @@ "compendiumSource": null, "duplicateSource": null, "exportSource": null, - "coreVersion": "13.346", + "coreVersion": "13.347", "systemId": "daggerheart", "systemVersion": "0.0.1", "createdTime": 1754322584884, - "modifiedTime": 1754352062188, - "lastModifiedBy": "MQSznptE5yLT7kj8" + "modifiedTime": 1756035920880, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items.effects!iyIg1VLwO8C6jvFZ.czrwqq44sEr0uJ8O" } @@ -110,10 +109,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754321406972, - "modifiedTime": 1755392101482, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1756035929726, + "lastModifiedBy": "vUIbuan0U50nfKBE" }, "_key": "!items!iyIg1VLwO8C6jvFZ" } diff --git a/src/packs/subclasses/feature_Weapon_Specialist_HAqtoKUTrk8Mip1n.json b/src/packs/subclasses/feature_Weapon_Specialist_HAqtoKUTrk8Mip1n.json index 886f2e21..4773af61 100644 --- a/src/packs/subclasses/feature_Weapon_Specialist_HAqtoKUTrk8Mip1n.json +++ b/src/packs/subclasses/feature_Weapon_Specialist_HAqtoKUTrk8Mip1n.json @@ -17,7 +17,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/subclasses/feature_Wings_of_Light_KkQH0tYhagIqe2MT.json b/src/packs/subclasses/feature_Wings_of_Light_KkQH0tYhagIqe2MT.json index 9580889b..c46a1ecf 100644 --- a/src/packs/subclasses/feature_Wings_of_Light_KkQH0tYhagIqe2MT.json +++ b/src/packs/subclasses/feature_Wings_of_Light_KkQH0tYhagIqe2MT.json @@ -40,7 +40,6 @@ "actionType": "action", "cost": [ { - "keyIsID": false, "key": "hope", "value": 1, "scalable": false, diff --git a/src/packs/subclasses/subclass_Beastbound_TIUsIlTS1WkK5vr2.json b/src/packs/subclasses/subclass_Beastbound_TIUsIlTS1WkK5vr2.json index 14f64dca..fcfc2cc8 100644 --- a/src/packs/subclasses/subclass_Beastbound_TIUsIlTS1WkK5vr2.json +++ b/src/packs/subclasses/subclass_Beastbound_TIUsIlTS1WkK5vr2.json @@ -35,7 +35,8 @@ "source": "Daggerheart SRD", "page": 17, "artist": "" - } + }, + "linkedClass": "Compendium.daggerheart.classes.Item.BTyfve69LKqoOi9S" }, "effects": [], "sort": 0, @@ -50,10 +51,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754268237448, - "modifiedTime": 1755391910037, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1755943503629, + "lastModifiedBy": "tt3PwMBXcTLCtIQU" }, "_key": "!items!TIUsIlTS1WkK5vr2" } diff --git a/src/packs/subclasses/subclass_Call_Of_The_Brave_NAFU9roaVG7f3RNJ.json b/src/packs/subclasses/subclass_Call_Of_The_Brave_NAFU9roaVG7f3RNJ.json index 7abd2d61..0ce7cd36 100644 --- a/src/packs/subclasses/subclass_Call_Of_The_Brave_NAFU9roaVG7f3RNJ.json +++ b/src/packs/subclasses/subclass_Call_Of_The_Brave_NAFU9roaVG7f3RNJ.json @@ -31,7 +31,8 @@ "source": "Daggerheart SRD", "page": 24, "artist": "" - } + }, + "linkedClass": "Compendium.daggerheart.classes.Item.xCUWwJz4WSthvLfy" }, "effects": [], "sort": 0, @@ -46,10 +47,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754256077777, - "modifiedTime": 1755392366229, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1755943544886, + "lastModifiedBy": "tt3PwMBXcTLCtIQU" }, "_key": "!items!NAFU9roaVG7f3RNJ" } diff --git a/src/packs/subclasses/subclass_Call_Of_The_Slayer_bcNe5qP3o6CKadhK.json b/src/packs/subclasses/subclass_Call_Of_The_Slayer_bcNe5qP3o6CKadhK.json index 69cdf70f..f14668b2 100644 --- a/src/packs/subclasses/subclass_Call_Of_The_Slayer_bcNe5qP3o6CKadhK.json +++ b/src/packs/subclasses/subclass_Call_Of_The_Slayer_bcNe5qP3o6CKadhK.json @@ -27,7 +27,8 @@ "source": "Daggerheart SRD", "page": 24, "artist": "" - } + }, + "linkedClass": "Compendium.daggerheart.classes.Item.xCUWwJz4WSthvLfy" }, "effects": [], "sort": 0, @@ -42,10 +43,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754256112978, - "modifiedTime": 1755392375946, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1755943545973, + "lastModifiedBy": "tt3PwMBXcTLCtIQU" }, "_key": "!items!bcNe5qP3o6CKadhK" } diff --git a/src/packs/subclasses/subclass_Divine_Wielder_M5mpGoAj8LRkylrY.json b/src/packs/subclasses/subclass_Divine_Wielder_M5mpGoAj8LRkylrY.json index 19449650..9ae4872c 100644 --- a/src/packs/subclasses/subclass_Divine_Wielder_M5mpGoAj8LRkylrY.json +++ b/src/packs/subclasses/subclass_Divine_Wielder_M5mpGoAj8LRkylrY.json @@ -31,7 +31,8 @@ "source": "Daggerheart SRD", "page": 21, "artist": "" - } + }, + "linkedClass": "Compendium.daggerheart.classes.Item.5ZnlJ5bEoyOTkUJv" }, "effects": [], "sort": 0, @@ -46,10 +47,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754352806098, - "modifiedTime": 1755392139199, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1755943522722, + "lastModifiedBy": "tt3PwMBXcTLCtIQU" }, "_key": "!items!M5mpGoAj8LRkylrY" } diff --git a/src/packs/subclasses/subclass_Elemental_Origin_wg1H0hROc2acHwZh.json b/src/packs/subclasses/subclass_Elemental_Origin_wg1H0hROc2acHwZh.json index f9fadc3d..ac00d7ad 100644 --- a/src/packs/subclasses/subclass_Elemental_Origin_wg1H0hROc2acHwZh.json +++ b/src/packs/subclasses/subclass_Elemental_Origin_wg1H0hROc2acHwZh.json @@ -27,7 +27,8 @@ "source": "Daggerheart SRD", "page": 22, "artist": "" - } + }, + "linkedClass": "Compendium.daggerheart.classes.Item.DchOzHcWIJE9FKcR" }, "effects": [], "sort": 0, @@ -42,10 +43,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754349604941, - "modifiedTime": 1755392260989, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1755943535524, + "lastModifiedBy": "tt3PwMBXcTLCtIQU" }, "_key": "!items!wg1H0hROc2acHwZh" } diff --git a/src/packs/subclasses/subclass_Nightwalker_h161OSIK24Up4qNd.json b/src/packs/subclasses/subclass_Nightwalker_h161OSIK24Up4qNd.json index f4a72013..cf2ff2d5 100644 --- a/src/packs/subclasses/subclass_Nightwalker_h161OSIK24Up4qNd.json +++ b/src/packs/subclasses/subclass_Nightwalker_h161OSIK24Up4qNd.json @@ -35,7 +35,8 @@ "source": "Daggerheart SRD", "page": 19, "artist": "" - } + }, + "linkedClass": "Compendium.daggerheart.classes.Item.CvHlkHZfpMiCz5uT" }, "effects": [], "sort": 0, @@ -50,10 +51,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754322815758, - "modifiedTime": 1755392009996, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1755943514465, + "lastModifiedBy": "tt3PwMBXcTLCtIQU" }, "_key": "!items!h161OSIK24Up4qNd" } diff --git a/src/packs/subclasses/subclass_Primal_Origin_GLpRVxnY5E82khxH.json b/src/packs/subclasses/subclass_Primal_Origin_GLpRVxnY5E82khxH.json index 0462164c..b7bb2dc6 100644 --- a/src/packs/subclasses/subclass_Primal_Origin_GLpRVxnY5E82khxH.json +++ b/src/packs/subclasses/subclass_Primal_Origin_GLpRVxnY5E82khxH.json @@ -27,7 +27,8 @@ "source": "Daggerheart SRD", "page": 22, "artist": "" - } + }, + "linkedClass": "Compendium.daggerheart.classes.Item.DchOzHcWIJE9FKcR" }, "effects": [], "sort": 0, @@ -42,10 +43,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754349604941, - "modifiedTime": 1755392267640, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1755943536628, + "lastModifiedBy": "tt3PwMBXcTLCtIQU" }, "_key": "!items!GLpRVxnY5E82khxH" } diff --git a/src/packs/subclasses/subclass_School_Of_Knowledge_qqQlgCqhOivUFoQn.json b/src/packs/subclasses/subclass_School_Of_Knowledge_qqQlgCqhOivUFoQn.json index 1e582722..eb21a9b2 100644 --- a/src/packs/subclasses/subclass_School_Of_Knowledge_qqQlgCqhOivUFoQn.json +++ b/src/packs/subclasses/subclass_School_Of_Knowledge_qqQlgCqhOivUFoQn.json @@ -39,7 +39,8 @@ "source": "Daggerheart SRD", "page": 25, "artist": "" - } + }, + "linkedClass": "Compendium.daggerheart.classes.Item.5LwX4m8ziY3F1ZGC" }, "effects": [], "sort": 0, @@ -54,10 +55,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754253538384, - "modifiedTime": 1755392466418, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1755943553625, + "lastModifiedBy": "tt3PwMBXcTLCtIQU" }, "_key": "!items!qqQlgCqhOivUFoQn" } diff --git a/src/packs/subclasses/subclass_School_Of_War_4y9Ph7RsCIAbkwTk.json b/src/packs/subclasses/subclass_School_Of_War_4y9Ph7RsCIAbkwTk.json index 9c69d8c8..18468eee 100644 --- a/src/packs/subclasses/subclass_School_Of_War_4y9Ph7RsCIAbkwTk.json +++ b/src/packs/subclasses/subclass_School_Of_War_4y9Ph7RsCIAbkwTk.json @@ -39,7 +39,8 @@ "source": "Daggerheart SRD", "page": 25, "artist": "" - } + }, + "linkedClass": "Compendium.daggerheart.classes.Item.5LwX4m8ziY3F1ZGC" }, "effects": [], "sort": 0, @@ -54,10 +55,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754253587683, - "modifiedTime": 1755392474218, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1755943555081, + "lastModifiedBy": "tt3PwMBXcTLCtIQU" }, "_key": "!items!4y9Ph7RsCIAbkwTk" } diff --git a/src/packs/subclasses/subclass_Stalwart_rKRxFBlkbh9cDK8K.json b/src/packs/subclasses/subclass_Stalwart_rKRxFBlkbh9cDK8K.json index f6693e6d..af30bf9c 100644 --- a/src/packs/subclasses/subclass_Stalwart_rKRxFBlkbh9cDK8K.json +++ b/src/packs/subclasses/subclass_Stalwart_rKRxFBlkbh9cDK8K.json @@ -39,7 +39,8 @@ "source": "Daggerheart SRD", "page": 16, "artist": "" - } + }, + "linkedClass": "Compendium.daggerheart.classes.Item.nRAyoC0fOzXPDa4z" }, "effects": [], "sort": 0, @@ -54,10 +55,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754245881893, - "modifiedTime": 1755391787981, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1755943487549, + "lastModifiedBy": "tt3PwMBXcTLCtIQU" }, "_key": "!items!rKRxFBlkbh9cDK8K" } diff --git a/src/packs/subclasses/subclass_Syndicate_95QxNZwgyEm1LqdG.json b/src/packs/subclasses/subclass_Syndicate_95QxNZwgyEm1LqdG.json index 5d2af915..4318cf68 100644 --- a/src/packs/subclasses/subclass_Syndicate_95QxNZwgyEm1LqdG.json +++ b/src/packs/subclasses/subclass_Syndicate_95QxNZwgyEm1LqdG.json @@ -27,7 +27,8 @@ "source": "Daggerheart SRD", "page": 20, "artist": "" - } + }, + "linkedClass": "Compendium.daggerheart.classes.Item.CvHlkHZfpMiCz5uT" }, "effects": [], "sort": 0, @@ -42,10 +43,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754323643089, - "modifiedTime": 1755392018277, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1755943515526, + "lastModifiedBy": "tt3PwMBXcTLCtIQU" }, "_key": "!items!95QxNZwgyEm1LqdG" } diff --git a/src/packs/subclasses/subclass_Troubadour_ld8MIvk0xVJydSBz.json b/src/packs/subclasses/subclass_Troubadour_ld8MIvk0xVJydSBz.json index c8f9ede3..d3ff41ce 100644 --- a/src/packs/subclasses/subclass_Troubadour_ld8MIvk0xVJydSBz.json +++ b/src/packs/subclasses/subclass_Troubadour_ld8MIvk0xVJydSBz.json @@ -26,7 +26,8 @@ "source": "Daggerheart SRD", "page": 9, "artist": "" - } + }, + "linkedClass": "Compendium.daggerheart.classes.Item.vegl3bFOq3pcFTWT" }, "effects": [], "ownership": { @@ -40,10 +41,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754174653653, - "modifiedTime": 1755391532634, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1755943465827, + "lastModifiedBy": "tt3PwMBXcTLCtIQU" }, "_id": "ld8MIvk0xVJydSBz", "sort": 100000, diff --git a/src/packs/subclasses/subclass_Vengeance_SUo8NPBPO8aN193u.json b/src/packs/subclasses/subclass_Vengeance_SUo8NPBPO8aN193u.json index 11d7f047..d8bf2b7f 100644 --- a/src/packs/subclasses/subclass_Vengeance_SUo8NPBPO8aN193u.json +++ b/src/packs/subclasses/subclass_Vengeance_SUo8NPBPO8aN193u.json @@ -31,7 +31,8 @@ "source": "Daggerheart SRD", "page": 16, "artist": "" - } + }, + "linkedClass": "Compendium.daggerheart.classes.Item.nRAyoC0fOzXPDa4z" }, "effects": [], "sort": 0, @@ -46,10 +47,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754246011733, - "modifiedTime": 1755391794966, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1755943488691, + "lastModifiedBy": "tt3PwMBXcTLCtIQU" }, "_key": "!items!SUo8NPBPO8aN193u" } diff --git a/src/packs/subclasses/subclass_Warden_of_Renewal_xp0XMjYT85Q7E90o.json b/src/packs/subclasses/subclass_Warden_of_Renewal_xp0XMjYT85Q7E90o.json index 053552cc..07606cc9 100644 --- a/src/packs/subclasses/subclass_Warden_of_Renewal_xp0XMjYT85Q7E90o.json +++ b/src/packs/subclasses/subclass_Warden_of_Renewal_xp0XMjYT85Q7E90o.json @@ -34,7 +34,8 @@ "source": "Daggerheart SRD", "page": 11, "artist": "" - } + }, + "linkedClass": "Compendium.daggerheart.classes.Item.ZNwUTCyGCEcidZFv" }, "effects": [], "folder": "AZWrSJzGXltzQhAJ", @@ -50,10 +51,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754221346981, - "modifiedTime": 1755391677508, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1755943479431, + "lastModifiedBy": "tt3PwMBXcTLCtIQU" }, "_key": "!items!xp0XMjYT85Q7E90o" } diff --git a/src/packs/subclasses/subclass_Warden_of_the_Elements_W9hs5kxOWeY7eA4Q.json b/src/packs/subclasses/subclass_Warden_of_the_Elements_W9hs5kxOWeY7eA4Q.json index 515666a2..40e39611 100644 --- a/src/packs/subclasses/subclass_Warden_of_the_Elements_W9hs5kxOWeY7eA4Q.json +++ b/src/packs/subclasses/subclass_Warden_of_the_Elements_W9hs5kxOWeY7eA4Q.json @@ -26,7 +26,8 @@ "source": "Daggerheart SRD", "page": 11, "artist": "" - } + }, + "linkedClass": "Compendium.daggerheart.classes.Item.ZNwUTCyGCEcidZFv" }, "effects": [], "folder": "AZWrSJzGXltzQhAJ", @@ -42,10 +43,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754221102716, - "modifiedTime": 1755391669341, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1755943478132, + "lastModifiedBy": "tt3PwMBXcTLCtIQU" }, "_key": "!items!W9hs5kxOWeY7eA4Q" } diff --git a/src/packs/subclasses/subclass_Wayfinder_zsUglcU4NgZ8tNgZ.json b/src/packs/subclasses/subclass_Wayfinder_zsUglcU4NgZ8tNgZ.json index 66c31f99..c8261fb8 100644 --- a/src/packs/subclasses/subclass_Wayfinder_zsUglcU4NgZ8tNgZ.json +++ b/src/packs/subclasses/subclass_Wayfinder_zsUglcU4NgZ8tNgZ.json @@ -31,7 +31,8 @@ "source": "Daggerheart SRD", "page": 17, "artist": "" - } + }, + "linkedClass": "Compendium.daggerheart.classes.Item.BTyfve69LKqoOi9S" }, "effects": [], "sort": 0, @@ -46,10 +47,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754268318903, - "modifiedTime": 1755391902003, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1755943505016, + "lastModifiedBy": "tt3PwMBXcTLCtIQU" }, "_key": "!items!zsUglcU4NgZ8tNgZ" } diff --git a/src/packs/subclasses/subclass_Winged_Sentinel_y7ERWRIpJsdP9Re4.json b/src/packs/subclasses/subclass_Winged_Sentinel_y7ERWRIpJsdP9Re4.json index 975363c7..e6089c6f 100644 --- a/src/packs/subclasses/subclass_Winged_Sentinel_y7ERWRIpJsdP9Re4.json +++ b/src/packs/subclasses/subclass_Winged_Sentinel_y7ERWRIpJsdP9Re4.json @@ -31,7 +31,8 @@ "source": "Daggerheart SRD", "page": 21, "artist": "" - } + }, + "linkedClass": "Compendium.daggerheart.classes.Item.5ZnlJ5bEoyOTkUJv" }, "effects": [], "sort": 0, @@ -46,10 +47,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754354451615, - "modifiedTime": 1755392149951, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1755943523928, + "lastModifiedBy": "tt3PwMBXcTLCtIQU" }, "_key": "!items!y7ERWRIpJsdP9Re4" } diff --git a/src/packs/subclasses/subclass_Wordsmith_XTSODVM8st75Os8M.json b/src/packs/subclasses/subclass_Wordsmith_XTSODVM8st75Os8M.json index 896c82ed..8fdc305c 100644 --- a/src/packs/subclasses/subclass_Wordsmith_XTSODVM8st75Os8M.json +++ b/src/packs/subclasses/subclass_Wordsmith_XTSODVM8st75Os8M.json @@ -30,7 +30,8 @@ "source": "Daggerheart SRD", "page": 9, "artist": "" - } + }, + "linkedClass": "Compendium.daggerheart.classes.Item.vegl3bFOq3pcFTWT" }, "effects": [], "ownership": { @@ -44,10 +45,10 @@ "exportSource": null, "coreVersion": "13.347", "systemId": "daggerheart", - "systemVersion": "1.0.5", + "systemVersion": "1.1.0", "createdTime": 1754174655078, - "modifiedTime": 1755391551654, - "lastModifiedBy": "VZIeX2YDvX338Zvr" + "modifiedTime": 1755943467695, + "lastModifiedBy": "tt3PwMBXcTLCtIQU" }, "_id": "XTSODVM8st75Os8M", "sort": 200000, diff --git a/styles/less/global/chat.less b/styles/less/global/chat.less index d2822b1b..95ea956f 100644 --- a/styles/less/global/chat.less +++ b/styles/less/global/chat.less @@ -86,7 +86,7 @@ .flavor-text { font-size: var(--font-size-12); line-height: 20px; - color: var(--color-dark-4); + color: light-dark(@dark, @beige); text-align: center; display: block; } diff --git a/styles/less/global/elements.less b/styles/less/global/elements.less index 397420b2..65e825a9 100755 --- a/styles/less/global/elements.less +++ b/styles/less/global/elements.less @@ -603,9 +603,12 @@ display: flex; justify-content: space-between; align-items: center; + gap: 0.25rem 0.5rem; + flex-wrap: wrap; label { - font-size: var(--font-size-16); + font-size: var(--font-size-14); + font-weight: normal; } .form-fields { @@ -613,6 +616,21 @@ gap: 4px; align-items: center; } + + &.setting-two-values { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 0.25rem 0.5rem; + + .form-group { + justify-content: end; + flex-wrap: nowrap; + } + + .hint { + grid-column: 1 / -1; + } + } } } diff --git a/styles/less/global/enrichment.less b/styles/less/global/enrichment.less new file mode 100644 index 00000000..2ad3975a --- /dev/null +++ b/styles/less/global/enrichment.less @@ -0,0 +1,14 @@ +.measured-template-button, +.enriched-damage-button, +.duality-roll-button { + display: inline; + + &.inline { + min-height: unset; + height: 18px; + } + + i { + font-size: 12px; + } +} diff --git a/styles/less/global/global.less b/styles/less/global/global.less new file mode 100644 index 00000000..7e60dffc --- /dev/null +++ b/styles/less/global/global.less @@ -0,0 +1,53 @@ +.drag-area { + display: flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + width: 100%; + height: 40px; + border: 1px dashed light-dark(@dark-blue-50, @beige-50); + border-radius: 3px; + color: light-dark(@dark-blue-50, @beige-50); + font-family: @font-body; +} + +.daggerheart.dh-style { + .hint { + flex: 0 0 100%; + margin: 0; + color: var(--color-form-hint); + } + + .form-group:hover { + .hint { + color: var(--color-form-hint-hover); + } + } + + .loader { + position: relative; + overflow: hidden !important; + + div { + opacity: 0.5; + } + + &:before { + font-family: 'Font Awesome 6 Pro'; + content: '\f110'; + position: absolute; + height: 100%; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + animation: spinner 1.5s linear infinite; + } + } + + @keyframes spinner { + to { + transform: rotate(360deg); + } + } +} diff --git a/styles/less/global/index.less b/styles/less/global/index.less index d6c8459e..db61304a 100644 --- a/styles/less/global/index.less +++ b/styles/less/global/index.less @@ -2,6 +2,8 @@ @import './dialog.less'; @import './chat.less'; @import './elements.less'; +@import './enrichment.less'; +@import './global.less'; @import './tab-navigation.less'; @import './tab-form-footer.less'; @import './tab-actions.less'; diff --git a/styles/less/sheets-settings/environment-settings/adversaries.less b/styles/less/sheets-settings/environment-settings/adversaries.less index 85342f7e..1a27eaca 100644 --- a/styles/less/sheets-settings/environment-settings/adversaries.less +++ b/styles/less/sheets-settings/environment-settings/adversaries.less @@ -34,17 +34,5 @@ width: 100%; } } - - .adversaries-dragger { - display: flex; - align-items: center; - justify-content: center; - box-sizing: border-box; - width: 100%; - height: 40px; - border: 1px dashed light-dark(@dark-blue-50, @beige-50); - border-radius: 3px; - color: light-dark(@dark-blue-50, @beige-50); - } } } diff --git a/styles/less/sheets/actors/character/inventory.less b/styles/less/sheets/actors/character/inventory.less index 9fd48921..5605a3d0 100644 --- a/styles/less/sheets/actors/character/inventory.less +++ b/styles/less/sheets/actors/character/inventory.less @@ -26,10 +26,6 @@ outline: 2px solid light-dark(@dark, @golden); } - &:placeholder { - color: light-dark(@dark-blue-50, @beige-50); - } - &::-webkit-search-cancel-button { -webkit-appearance: none; display: none; diff --git a/styles/less/sheets/actors/character/loadout.less b/styles/less/sheets/actors/character/loadout.less index 08246efb..eba55890 100644 --- a/styles/less/sheets/actors/character/loadout.less +++ b/styles/less/sheets/actors/character/loadout.less @@ -26,10 +26,6 @@ outline: 2px solid light-dark(@dark, @golden); } - &:placeholder { - color: light-dark(@dark-blue-50, @beige-50); - } - &::-webkit-search-cancel-button { -webkit-appearance: none; display: none; diff --git a/styles/less/sheets/actors/character/sheet.less b/styles/less/sheets/actors/character/sheet.less index 68792c99..ee6580fd 100644 --- a/styles/less/sheets/actors/character/sheet.less +++ b/styles/less/sheets/actors/character/sheet.less @@ -11,6 +11,21 @@ padding-bottom: 0; overflow-x: auto; + &.viewMode { + button:not(.btn-toggle-view), + input:not(.search), + .controls, + .character-sidebar-sheet, + .img-portait, + .name-row, + .hope-section, + .downtime-section, + .character-traits, + .card-list { + pointer-events: none; + } + } + .character-sidebar-sheet { grid-row: 1 / span 2; grid-column: 1; diff --git a/styles/less/sheets/actors/companion/details.less b/styles/less/sheets/actors/companion/details.less index 2df14b23..cbdc25e6 100644 --- a/styles/less/sheets/actors/companion/details.less +++ b/styles/less/sheets/actors/companion/details.less @@ -77,4 +77,17 @@ } } } + + .action-section { + display: flex; + padding: 0 10px; + margin-top: 20px; + width: 100%; + + button { + height: 40px; + width: 100%; + font-weight: 600; + } + } } diff --git a/styles/less/sheets/items/class.less b/styles/less/sheets/items/class.less index 686715c6..526aa77f 100644 --- a/styles/less/sheets/items/class.less +++ b/styles/less/sheets/items/class.less @@ -43,4 +43,18 @@ } } } + + .tab.questions { + .questions-container { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 8px; + + .questions-section { + display: flex; + flex-direction: column; + gap: 4px; + } + } + } } diff --git a/styles/less/ui/chat/ability-use.less b/styles/less/ui/chat/ability-use.less index 7743bfa3..88302d0d 100644 --- a/styles/less/ui/chat/ability-use.less +++ b/styles/less/ui/chat/ability-use.less @@ -2,7 +2,7 @@ @import '../../utils/fonts.less'; @import '../../utils/spacing.less'; -.theme-light { +#interface.theme-light { .daggerheart.chat.domain-card { .domain-card-move .domain-card-header { border-bottom: 1px solid @dark-blue; diff --git a/styles/less/ui/chat/action.less b/styles/less/ui/chat/action.less index 38df5d05..817b0acd 100644 --- a/styles/less/ui/chat/action.less +++ b/styles/less/ui/chat/action.less @@ -2,7 +2,7 @@ @import '../../utils/fonts.less'; @import '../../utils/spacing.less'; -.theme-light { +#interface.theme-light { .daggerheart.chat.action { .action-move .action-section { border-bottom: 1px solid @dark-blue; @@ -79,6 +79,7 @@ display: flex; flex-direction: column; gap: 5px; + color: @beige; .title { font-size: var(--font-size-20); diff --git a/styles/less/ui/chat/chat.less b/styles/less/ui/chat/chat.less index 9eb35cd6..828e2774 100644 --- a/styles/less/ui/chat/chat.less +++ b/styles/less/ui/chat/chat.less @@ -2,52 +2,137 @@ @import '../../utils/fonts.less'; @import '../../utils/spacing.less'; -.theme-light { - .daggerheart, - #chat-notifications { +#interface.theme-light { + .daggerheart.chat-sidebar .chat-log, + #chat-notifications .chat-log { --text-color: @dark-blue; --bg-color: @dark-blue-40; - .message-content .chat-roll { - .roll-part-header { - span, - span:before, - span:after { - color: @dark-blue; - } - &:before { - background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, @dark-blue 100%); - color: @dark-blue; + .chat-message { + .roll-formula { + background: @dark-15; + color: @dark; + } + + &.duality { + background-image: url(../assets/parchments/dh-parchment-dark.png); + + .message-content { + color: @beige; } - &:after { - background: linear-gradient(90deg, @dark-blue 0%, rgba(0, 0, 0, 0) 100%); - color: @dark-blue; + .roll-formula { + background: @dark-15; + color: @dark; + } + + .message-header { + .message-sub-header-container { + color: @beige; + h4 { + color: @golden; + } + } + .message-header-metadata { + .message-metadata { + color: @beige; + } + } + } + + &.hope { + --text-color: @golden; + --bg-color: @golden-40; + .message-header, + .message-content { + background-color: @golden-bg; + } + .roll-formula { + background: var(--bg-color); + color: var(--text-color); + } + } + + &.fear { + --text-color: @chat-blue; + --bg-color: @chat-blue-40; + .message-header, + .message-content { + background-color: @chat-blue-bg; + } + .roll-formula { + background: var(--bg-color); + color: var(--text-color); + } + } + + &.critical { + --text-color: @chat-purple; + --bg-color: @chat-purple-40; + .message-header, + .message-content { + background-color: @chat-purple-bg; + } + .roll-formula { + background: var(--bg-color); + color: var(--text-color); + } } } - .roll-section { - .roll-part-content { - .roll-result-value { + + &:not(.duality) { + .font-20 { + color: @dark; + } + + .roll-die { + color: @beige; + } + + fieldset { + color: @dark-blue; + border-color: @dark-blue; + + legend { color: @dark-blue; } + } + .chat-roll { + .roll-part-header { + color: @dark-blue; - .dice-tooltip .wrapper .roll-die { - color: @beige; + span::before, + span::after { + color: @dark-blue; + } + + &:before { + background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, @dark-blue 100%); + } + + &:after { + background: linear-gradient(90deg, @dark-blue 0%, rgba(0, 0, 0, 0) 100%); + } + } + + .roll-part-content { + &.dice-result { + color: @dark; + } + .roll-result-container { + color: @dark-blue; + } } } } } - - .chat-message .roll-formula { - background: @dark-15; - color: @dark; - } } } .daggerheart.chat { &.resource-roll { .reroll-message { + color: @beige; text-align: center; font-size: var(--font-size-18); margin-bottom: 0; diff --git a/styles/less/ui/chat/downtime.less b/styles/less/ui/chat/downtime.less index 7a1053fb..5496a2a3 100644 --- a/styles/less/ui/chat/downtime.less +++ b/styles/less/ui/chat/downtime.less @@ -2,7 +2,7 @@ @import '../../utils/fonts.less'; @import '../../utils/spacing.less'; -.theme-light { +#interface.theme-light { .daggerheart.chat.downtime { .downtime-moves-list .downtime-move { &:hover { diff --git a/styles/less/ui/chat/sheet.less b/styles/less/ui/chat/sheet.less index 59fa39dc..3d47a9b5 100644 --- a/styles/less/ui/chat/sheet.less +++ b/styles/less/ui/chat/sheet.less @@ -1,8 +1,8 @@ @import '../../utils/colors.less'; @import '../../utils/fonts.less'; -.theme-light { - .chat-message .message-content { +#interface.theme-light { + .chat-message:not(.duality) .message-content { color: @dark; blockquote { @@ -58,6 +58,12 @@ font-family: @font-body; font-weight: bold; } + + .dice-roll .dice-formula, + .dice-roll .dice-total { + background: @dark-blue-40; + color: @dark-blue; + } } } @@ -158,8 +164,8 @@ .dice-roll .dice-total { box-shadow: none; border: none; - background: light-dark(@dark-blue-40, @golden-40); - color: light-dark(@dark-blue, @golden); + background: @golden-10; + color: @golden; font-weight: 600; align-content: center; } diff --git a/styles/less/ui/item-browser/item-browser.less b/styles/less/ui/item-browser/item-browser.less index d891e73d..23844128 100644 --- a/styles/less/ui/item-browser/item-browser.less +++ b/styles/less/ui/item-browser/item-browser.less @@ -71,6 +71,7 @@ } .compendium-results { + position: relative; padding: 16px; } @@ -101,10 +102,14 @@ .folder-list, .item-list-header, .item-header > div { - gap: 10px; cursor: pointer; } + .item-list-header, + .item-header > div { + gap: 10px; + } + .item-filter { display: flex; align-items: center; @@ -146,10 +151,6 @@ outline: 2px solid light-dark(@dark, @golden); } - &:placeholder { - color: light-dark(@dark-blue-50, @beige-50); - } - &::-webkit-search-cancel-button { -webkit-appearance: none; display: none; @@ -232,7 +233,8 @@ } .item-list-header, - .item-list { + .item-list, + .compendium-sidebar > .folder-list { overflow-y: auto; scrollbar-gutter: stable; scrollbar-width: thin; @@ -277,11 +279,11 @@ } &[data-sort-type='ASC']:after { - content: '\f0d7'; + content: '\f884'; } &[data-sort-type='DESC']:after { - content: '\f0d8'; + content: '\f885'; } } } @@ -290,6 +292,7 @@ display: flex; flex-direction: column; gap: 5px; + flex: 1; .item-container { &:hover { @@ -349,6 +352,8 @@ display: grid; grid-template-rows: 0fr; transition: all 0.3s ease-in-out; + width: 100%; + .wrapper { overflow: hidden; display: grid; @@ -387,8 +392,12 @@ margin: 0; .title { - margin: 0; text-align: center; + font-weight: bold; + } + + .hint { + flex: unset; } } @@ -400,6 +409,7 @@ &.lite, &.no-folder { + .compendium-sidebar, .menu-path { display: none; } diff --git a/styles/less/ui/settings/homebrew-settings/domains.less b/styles/less/ui/settings/homebrew-settings/domains.less index 84e013c2..da258fcd 100644 --- a/styles/less/ui/settings/homebrew-settings/domains.less +++ b/styles/less/ui/settings/homebrew-settings/domains.less @@ -53,6 +53,10 @@ display: grid; grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr; gap: 8px; + max-height: 184px; + overflow: auto; + scrollbar-width: thin; + scrollbar-color: light-dark(#18162e, #f3c267) transparent; .domain-container { position: relative; diff --git a/styles/less/ui/settings/settings.less b/styles/less/ui/settings/settings.less index cee5475f..788db394 100644 --- a/styles/less/ui/settings/settings.less +++ b/styles/less/ui/settings/settings.less @@ -4,7 +4,7 @@ fieldset { display: flex; flex-direction: column; - gap: 4px; + gap: 0.5rem; &.two-columns { display: grid; @@ -16,6 +16,12 @@ } } + &.six-columns { + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr; + gap: 2px; + } + &.start-align { align-self: flex-start; } @@ -26,6 +32,7 @@ display: flex; align-items: center; gap: 8px; + flex-wrap: nowrap; } .settings-items { @@ -103,28 +110,9 @@ gap: 4px; } - .trait-array-container { - display: flex; - justify-content: space-evenly; - gap: 8px; - margin-bottom: 16px; - - .trait-array-item { - position: relative; - display: flex; - justify-content: center; - - label { - position: absolute; - top: -7px; - font-size: var(--font-size-12); - font-variant: petite-caps; - z-index: 2; - } - - input { - text-align: center; - } + .trait-item { + input { + text-align: center; } } diff --git a/system.json b/system.json index d72c53d5..4eeeff1a 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.1.0", + "version": "1.2.0", "compatibility": { "minimum": "13", "verified": "13.347", diff --git a/templates/actionTypes/beastform.hbs b/templates/actionTypes/beastform.hbs index b2710208..b9bea445 100644 --- a/templates/actionTypes/beastform.hbs +++ b/templates/actionTypes/beastform.hbs @@ -1,9 +1,4 @@ -
- -
{{localize "DAGGERHEART.ACTIONS.Config.beastform.label"}}
-
- -
- {{formGroup fields.tierAccess.fields.exact value=beastform.tierAccess.exact labelAttr="label" valueAttr="key" localize=true blank=""}} -
+
+ {{localize "DAGGERHEART.ACTIONS.Config.beastform.label"}} + {{formGroup fields.tierAccess.fields.exact value=source.tierAccess.exact name="beastform.tierAccess.exact" labelAttr="label" valueAttr="key" localize=true blank=""}}
\ No newline at end of file diff --git a/templates/actionTypes/damage.hbs b/templates/actionTypes/damage.hbs index 6a94752b..96bb361c 100644 --- a/templates/actionTypes/damage.hbs +++ b/templates/actionTypes/damage.hbs @@ -56,7 +56,7 @@
{{formField ../fields.valueAlt.fields.flatMultiplier value=dmg.valueAlt.flatMultiplier name=(concat ../path "damage.parts." realIndex ".valueAlt.flatMultiplier") label="DAGGERHEART.ACTIONS.Settings.multiplier" classes="inline-child" localize=true }} - {{formField ../fields.valueAlt.fields.dice value=dmg.valueAlt.dice name=(concat ../path "damage.parts." realIndex ".valueAlt.dice") classes="inline-child"}} + {{formField ../fields.valueAlt.fields.dice value=dmg.valueAlt.dice name=(concat ../path "damage.parts." realIndex ".valueAlt.dice") classes="inline-child" localize=true}} {{formField ../fields.valueAlt.fields.bonus value=dmg.valueAlt.bonus name=(concat ../path "damage.parts." realIndex ".valueAlt.bonus") localize=true classes="inline-child"}}
@@ -70,7 +70,7 @@ {{#*inline "formula"}} {{#unless dmg.base}} - {{formField fields.custom.fields.enabled value=source.custom.enabled name=(concat path "damage.parts." realIndex "." target ".custom.enabled") classes="checkbox"}} + {{formField fields.custom.fields.enabled value=source.custom.enabled name=(concat path "damage.parts." realIndex "." target ".custom.enabled") classes="checkbox" localize=true}} {{/unless}} {{#if source.custom.enabled}} {{formField fields.custom.fields.formula value=source.custom.formula name=(concat path "damage.parts." realIndex "." target ".custom.formula") localize=true}} @@ -79,8 +79,8 @@ {{#unless @root.isNPC}} {{formField fields.multiplier value=source.multiplier name=(concat path "damage.parts." realIndex "." target ".multiplier") localize=true}} {{/unless}} - {{#if (eq source.multiplier 'flat')}}{{formField fields.flatMultiplier value=source.flatMultiplier name=(concat path "damage.parts." realIndex "." target ".flatMultiplier") }}{{/if}} - {{formField fields.dice value=source.dice name=(concat path "damage.parts." realIndex "." target ".dice")}} + {{#if (eq source.multiplier 'flat')}}{{formField fields.flatMultiplier value=source.flatMultiplier name=(concat path "damage.parts." realIndex "." target ".flatMultiplier") localize=true }}{{/if}} + {{formField fields.dice value=source.dice name=(concat path "damage.parts." realIndex "." target ".dice") localize=true}} {{formField fields.bonus value=source.bonus name=(concat path "damage.parts." realIndex "." target ".bonus") localize=true}} {{/if}} diff --git a/templates/actionTypes/save.hbs b/templates/actionTypes/save.hbs index 90bc0483..85536c87 100644 --- a/templates/actionTypes/save.hbs +++ b/templates/actionTypes/save.hbs @@ -1,6 +1,9 @@ -
- {{localize "DAGGERHEART.GENERAL.save"}} - {{formField fields.trait label="Trait" name="save.trait" value=source.trait localize=true}} - {{formField fields.difficulty label="Difficulty" name="save.difficulty" value=source.difficulty disabled=(not source.trait) placeholder=@root.baseSaveDifficulty}} - {{formField fields.damageMod label="Damage on Save" name="save.damageMod" value=source.damageMod localize=true disabled=(not source.trait)}} +
+ {{localize "DAGGERHEART.GENERAL.Roll.reaction"}} +

{{localize "DAGGERHEART.ACTIONS.Settings.saveHint"}}

+
+ {{formField fields.trait label="Trait" name="save.trait" value=source.trait localize=true}} + {{formField fields.difficulty label="Difficulty" name="save.difficulty" value=source.difficulty disabled=(not source.trait) placeholder=@root.baseSaveDifficulty}} + {{formField fields.damageMod label="Damage on Save" name="save.damageMod" value=source.damageMod localize=true disabled=(not source.trait)}} +
\ No newline at end of file diff --git a/templates/dialogs/dice-roll/rollSelection.hbs b/templates/dialogs/dice-roll/rollSelection.hbs index b2feaa0b..6a4655d6 100644 --- a/templates/dialogs/dice-roll/rollSelection.hbs +++ b/templates/dialogs/dice-roll/rollSelection.hbs @@ -75,16 +75,8 @@ {{#each experiences}} {{#if name}}
- {{#if (includes ../selectedExperiences id)}} - - {{else}} - - {{/if}} - {{#if (eq @root.rollType 'D20Roll')}} - {{name}} +{{modifier}} - {{else}} - {{name}} +{{value}} - {{/if}} + + {{name}} +{{value}}
{{/if}} {{/each}} @@ -126,6 +118,12 @@ {{selectOptions diceOptions selected=@root.roll.dAdvantage.denomination}} + {{#if abilities}} + {{localize "DAGGERHEART.GENERAL.traitModifier"}} + + {{/if}} {{/unless}} {{#if @root.rallyDie.length}} {{localize "DAGGERHEART.CLASS.Feature.rallyDice"}} diff --git a/templates/settings/appearance-settings.hbs b/templates/settings/appearance-settings.hbs deleted file mode 100644 index aa094d69..00000000 --- a/templates/settings/appearance-settings.hbs +++ /dev/null @@ -1,116 +0,0 @@ -
-
-

{{localize 'DAGGERHEART.SETTINGS.Menu.appearance.name'}}

-
- - {{formGroup settingFields.schema.fields.hideAttribution value=settingFields._source.hideAttribution localize=true}} - -
- {{localize 'DAGGERHEART.GENERAL.fear'}} - {{formGroup settingFields.schema.fields.displayFear value=settingFields._source.displayFear localize=true}} - {{formGroup settingFields.schema.fields.showGenericStatusEffects value=settingFields._source.showGenericStatusEffects localize=true}} -
- -
- {{localize 'DAGGERHEART.SETTINGS.Appearance.FIELDS.expandedTitle'}} - {{formGroup settingFields.schema.fields.extendCharacterDescriptions value=settingFields._source.extendCharacterDescriptions localize=true}} - {{formGroup settingFields.schema.fields.extendAdversaryDescriptions value=settingFields._source.extendAdversaryDescriptions localize=true}} - {{formGroup settingFields.schema.fields.extendEnvironmentDescriptions value=settingFields._source.extendEnvironmentDescriptions localize=true}} - {{formGroup settingFields.schema.fields.extendItemDescriptions value=settingFields._source.extendItemDescriptions localize=true}} -
- -
- {{localize 'DAGGERHEART.SETTINGS.Appearance.FIELDS.expandRollMessage'}} - {{formGroup settingFields.schema.fields.expandRollMessage.fields.desc value=settingFields.expandRollMessage.desc localize=true}} - {{formGroup settingFields.schema.fields.expandRollMessage.fields.roll value=settingFields.expandRollMessage.roll localize=true}} - {{formGroup settingFields.schema.fields.expandRollMessage.fields.damage value=settingFields.expandRollMessage.damage localize=true}} - {{formGroup settingFields.schema.fields.expandRollMessage.fields.target value=settingFields.expandRollMessage.target localize=true}} -
- - {{#if showDiceSoNice}} -
- {{localize "DAGGERHEART.SETTINGS.Menu.appearance.diceSoNice.title"}} -
{{localize "DAGGERHEART.SETTINGS.Menu.appearance.diceSoNice.hint"}}
- -
- -
- -
-
- - -
- -
-
- - {{formInput diceTab.fields.foreground value=diceTab.source.foreground localize=true}} -
-
- - {{formInput diceTab.fields.background value=diceTab.source.background localize=true}} -
-
- - {{formInput diceTab.fields.outline value=diceTab.source.outline localize=true}} -
-
- - {{formInput diceTab.fields.edge value=diceTab.source.edge localize=true}} -
-
- - -
-
- - -
-
- - -
-
- -
-
-
-
- {{/if}} - -
- - -
-
- \ No newline at end of file diff --git a/templates/settings/appearance-settings/diceSoNice.hbs b/templates/settings/appearance-settings/diceSoNice.hbs new file mode 100644 index 00000000..6321332d --- /dev/null +++ b/templates/settings/appearance-settings/diceSoNice.hbs @@ -0,0 +1,67 @@ +
+
+
{{localize "DAGGERHEART.SETTINGS.Menu.appearance.diceSoNice.hint"}}
+ +
+ +
+ {{#each dsnTabs as |dsnTab|}} +
+
+
+ + {{formInput fields.system value=values.system localize=true choices=@root.diceSoNiceSystems}} +
+
+
+ + {{formInput fields.foreground value=values.foreground localize=true}} +
+
+ + {{formInput fields.background value=values.background localize=true}} +
+
+ + {{formInput fields.outline value=values.outline localize=true}} +
+
+ + {{formInput fields.edge value=values.edge localize=true}} +
+
+ + {{formInput fields.colorset value=values.colorset choices=@root.diceSoNiceColorsets localize=true}} +
+
+ + {{formInput fields.texture value=values.texture choices=@root.diceSoNiceTextures localize=true}} +
+
+ + {{formInput fields.material value=values.material choices=@root.diceSoNiceMaterials localize=true}} +
+
+ +
+
+
+
+ {{/each}} +
+
\ No newline at end of file diff --git a/templates/settings/appearance-settings/header.hbs b/templates/settings/appearance-settings/header.hbs new file mode 100644 index 00000000..110fd2b0 --- /dev/null +++ b/templates/settings/appearance-settings/header.hbs @@ -0,0 +1,3 @@ +
+

{{localize 'DAGGERHEART.SETTINGS.Menu.appearance.label'}}

+
\ No newline at end of file diff --git a/templates/settings/appearance-settings/main.hbs b/templates/settings/appearance-settings/main.hbs new file mode 100644 index 00000000..9cab271a --- /dev/null +++ b/templates/settings/appearance-settings/main.hbs @@ -0,0 +1,46 @@ +
+ {{formGroup + fields.displayFear + value=setting.displayFear + localize=true}} + {{formGroup + fields.showGenericStatusEffects + value=setting.showGenericStatusEffects + localize=true}} + {{formGroup + fields.hideAttribution + value=setting.hideAttribution + localize=true}} + +
+ {{localize 'DAGGERHEART.SETTINGS.Appearance.FIELDS.expandedTitle'}} + {{formGroup + fields.extendCharacterDescriptions + value=setting.extendCharacterDescriptions + localize=true}} + {{formGroup + fields.extendAdversaryDescriptions + value=setting.extendAdversaryDescriptions + localize=true}} + {{formGroup + fields.extendEnvironmentDescriptions + value=setting.extendEnvironmentDescriptions + localize=true}} + {{formGroup + fields.extendItemDescriptions + value=setting.extendItemDescriptions + localize=true}} +
+ +
+ {{localize 'DAGGERHEART.SETTINGS.Appearance.FIELDS.expandRollMessage.title'}} + {{formGroup fields.expandRollMessage.fields.desc value=setting.expandRollMessage.desc + localize=true}} + {{formGroup fields.expandRollMessage.fields.roll value=setting.expandRollMessage.roll + localize=true}} + {{formGroup fields.expandRollMessage.fields.damage + value=setting.expandRollMessage.damage localize=true}} + {{formGroup fields.expandRollMessage.fields.target + value=setting.expandRollMessage.target localize=true}} +
+
\ No newline at end of file diff --git a/templates/settings/automation-settings/general.hbs b/templates/settings/automation-settings/general.hbs index 04d08a9f..211ee68e 100644 --- a/templates/settings/automation-settings/general.hbs +++ b/templates/settings/automation-settings/general.hbs @@ -3,7 +3,7 @@ data-tab="{{tabs.general.id}}" data-group="{{tabs.general.group}}" > -
+
{{formGroup settingFields.schema.fields.hopeFear.fields.gm value=settingFields._source.hopeFear.gm localize=true}} {{formGroup settingFields.schema.fields.hopeFear.fields.players value=settingFields._source.hopeFear.players localize=true}} diff --git a/templates/settings/automation-settings/roll.hbs b/templates/settings/automation-settings/roll.hbs new file mode 100644 index 00000000..5769bf61 --- /dev/null +++ b/templates/settings/automation-settings/roll.hbs @@ -0,0 +1,22 @@ +
+
+ + {{localize "DAGGERHEART.SETTINGS.Automation.roll.title"}} + + {{#each settingFields.schema.fields.roll.fields as | field |}} + {{!-- {{formGroup field value=(lookup @root.settingFields.roll field.name) localize=true rootId="automation-roll"}} --}} +
+ + {{#with (lookup @root.settingFields.roll field.name) as | values |}} + {{formGroup field.fields.gm value=values.gm rootId=(concat "automation-roll-" field.name "-gm") localize=true}} + {{formGroup field.fields.players value=values.players rootId=(concat "automation-roll-" field.name "-players") localize=true}} + {{/with}} +

{{localize (concat "DAGGERHEART.SETTINGS.Automation.FIELDS.roll." field.name ".hint")}}

+
+ {{/each}} +
+
\ No newline at end of file diff --git a/templates/settings/homebrew-settings.hbs b/templates/settings/homebrew-settings.hbs deleted file mode 100644 index 4e2c442f..00000000 --- a/templates/settings/homebrew-settings.hbs +++ /dev/null @@ -1,90 +0,0 @@ -
-
-

{{localize 'DAGGERHEART.SETTINGS.Menu.homebrew.name'}}

-
- {{formGroup settingFields.schema.fields.maxFear value=settingFields._source.maxFear localize=true}} - {{formGroup settingFields.schema.fields.maxDomains value=settingFields._source.maxDomains localize=true}} - {{formGroup settingFields.schema.fields.maxLoadout value=settingFields._source.maxLoadout localize=true}} -
- -

{{localize "DAGGERHEART.SETTINGS.Homebrew.FIELDS.traitArray.label"}}

-
- {{#each settingFields._source.traitArray as |trait index|}} -
- - -
- {{/each}} -
- -
- - {{localize "DAGGERHEART.SETTINGS.Homebrew.currency.title"}} - - {{formGroup settingFields.schema.fields.currency.fields.enabled value=settingFields._source.currency.enabled localize=true}} - {{formGroup settingFields.schema.fields.currency.fields.title value=settingFields._source.currency.title localize=true}} - {{formGroup settingFields.schema.fields.currency.fields.coins value=settingFields._source.currency.coins localize=true}} - {{formGroup settingFields.schema.fields.currency.fields.handfuls value=settingFields._source.currency.handfuls localize=true}} - {{formGroup settingFields.schema.fields.currency.fields.bags value=settingFields._source.currency.bags localize=true}} - {{formGroup settingFields.schema.fields.currency.fields.chests value=settingFields._source.currency.chests localize=true}} - -
- -
- {{localize "DAGGERHEART.SETTINGS.Homebrew.downtimeMoves"}} - -
- - {{localize "DAGGERHEART.APPLICATIONS.Downtime.longRest.title"}} - - - - -
- -
- -
-
- -
- {{#each settingFields._source.restMoves.longRest.moves as |move id|}} - {{> "systems/daggerheart/templates/settings/components/settings-item-line.hbs" this type="longRest" id=id }} - {{/each}} -
-
- -
- - {{localize "DAGGERHEART.APPLICATIONS.Downtime.shortRest.title"}} - - - - -
- -
- -
-
- -
- {{#each settingFields._source.restMoves.shortRest.moves as |move id|}} - {{> "systems/daggerheart/templates/settings/components/settings-item-line.hbs" this type="shortRest" id=id }} - {{/each}} -
-
-
- -
- - -
-
- \ No newline at end of file diff --git a/templates/settings/homebrew-settings/settings.hbs b/templates/settings/homebrew-settings/settings.hbs index 1c7c787d..893e1bc3 100644 --- a/templates/settings/homebrew-settings/settings.hbs +++ b/templates/settings/homebrew-settings/settings.hbs @@ -12,15 +12,18 @@ {{formGroup settingFields.schema.fields.maxLoadout value=settingFields._source.maxLoadout localize=true}}
-

{{localize "DAGGERHEART.SETTINGS.Homebrew.FIELDS.traitArray.label"}}

-
+
+ + {{localize "DAGGERHEART.SETTINGS.Homebrew.FIELDS.traitArray.label"}} + + {{#each settingFields._source.traitArray as |trait index|}} -
- - -
+
+ {{localize "DAGGERHEART.GENERAL.Modifier.single"}} {{add index 1}} + +
{{/each}} -
+
diff --git a/templates/sheets-settings/action-settings/effect.hbs b/templates/sheets-settings/action-settings/effect.hbs index 26a097af..51c15aae 100644 --- a/templates/sheets-settings/action-settings/effect.hbs +++ b/templates/sheets-settings/action-settings/effect.hbs @@ -6,7 +6,6 @@ {{#if fields.roll}}{{> 'systems/daggerheart/templates/actionTypes/roll.hbs' fields=fields.roll.fields source=source.roll}}{{/if}} {{#if fields.save}}{{> 'systems/daggerheart/templates/actionTypes/save.hbs' fields=fields.save.fields source=source.save}}{{/if}} {{#if fields.damage}}{{> 'systems/daggerheart/templates/actionTypes/damage.hbs' fields=fields.damage.fields.parts.element.fields source=source.damage directField=fields.damage.fields.direct }}{{/if}} - {{#if fields.resource}}{{> 'systems/daggerheart/templates/actionTypes/resource.hbs' fields=fields.resource.fields source=source.resource}}{{/if}} {{#if fields.macro}}{{> 'systems/daggerheart/templates/actionTypes/macro.hbs' fields=fields.macro source=source.macro}}{{/if}} {{#if fields.effects}}{{> 'systems/daggerheart/templates/actionTypes/effect.hbs' fields=fields.effects.element.fields source=source.effects}}{{/if}} {{#if fields.beastform}}{{> 'systems/daggerheart/templates/actionTypes/beastform.hbs' fields=fields.beastform.fields source=source.beastform}}{{/if}} diff --git a/templates/sheets-settings/environment-settings/adversaries.hbs b/templates/sheets-settings/environment-settings/adversaries.hbs index e1d90e81..bcee7320 100644 --- a/templates/sheets-settings/environment-settings/adversaries.hbs +++ b/templates/sheets-settings/environment-settings/adversaries.hbs @@ -25,7 +25,7 @@ {{/each}} -
+
{{localize "DAGGERHEART.GENERAL.dropActorsHere"}}
diff --git a/templates/sheets/actors/character/inventory.hbs b/templates/sheets/actors/character/inventory.hbs index ee5b6034..017d37d9 100644 --- a/templates/sheets/actors/character/inventory.hbs +++ b/templates/sheets/actors/character/inventory.hbs @@ -10,9 +10,6 @@ - - -
diff --git a/templates/sheets/actors/companion/details.hbs b/templates/sheets/actors/companion/details.hbs index dd28e745..eee2122c 100644 --- a/templates/sheets/actors/companion/details.hbs +++ b/templates/sheets/actors/companion/details.hbs @@ -56,4 +56,7 @@
{{/each}} +
+ +
\ No newline at end of file diff --git a/templates/sheets/global/partials/inventory-item-V2.hbs b/templates/sheets/global/partials/inventory-item-V2.hbs index b456c17d..a4ecec3a 100644 --- a/templates/sheets/global/partials/inventory-item-V2.hbs +++ b/templates/sheets/global/partials/inventory-item-V2.hbs @@ -65,7 +65,7 @@ Parameters: {{#if (and (not hideResources) (eq item.system.resource.type 'simple'))}} {{> "systems/daggerheart/templates/sheets/global/partials/item-resource.hbs"}} {{/if}} - {{#if (and (not hideResources) item.system.quantity)}} + {{#if (and (not hideResources) (gte item.system.quantity 0))}}
diff --git a/templates/sheets/items/class/features.hbs b/templates/sheets/items/class/features.hbs index 4e6a7e6f..6ed449dc 100644 --- a/templates/sheets/items/class/features.hbs +++ b/templates/sheets/items/class/features.hbs @@ -27,6 +27,9 @@
{{localize "TYPES.Item.subclass"}}
+ {{#unless source.system.subclasses}} +
{{localize "DAGGERHEART.GENERAL.missingDragDropThing" thing=(localize "DAGGERHEART.GENERAL.subclasses")}}
+ {{/unless}} {{#each source.system.subclasses as |subclass index|}}
  • diff --git a/templates/sheets/items/class/questions.hbs b/templates/sheets/items/class/questions.hbs new file mode 100644 index 00000000..590881b3 --- /dev/null +++ b/templates/sheets/items/class/questions.hbs @@ -0,0 +1,27 @@ +
    +
    +
    + {{localize "DAGGERHEART.ACTORS.Character.backgroundQuestions"}} + +
    + {{#each source.system.backgroundQuestions as | question index |}} + + {{/each}} +
    +
    + +
    + {{localize "DAGGERHEART.ACTORS.Character.connections"}} + +
    + {{#each source.system.connections as | connection index |}} + + {{/each}} +
    +
    +
    +
    \ No newline at end of file diff --git a/templates/sheets/items/class/settings.hbs b/templates/sheets/items/class/settings.hbs index 9ac2b14f..8e8254ee 100644 --- a/templates/sheets/items/class/settings.hbs +++ b/templates/sheets/items/class/settings.hbs @@ -45,6 +45,8 @@ {{#unless (eq document.parent.type 'character')}}{{/unless}}
  • + {{else}} +
    {{localize "DAGGERHEART.GENERAL.missingDragDropThing" thing=(localize "DAGGERHEART.GENERAL.weapons")}}
    {{/if}}
    @@ -60,6 +62,8 @@ {{#unless (eq document.parent.type 'character')}}{{/unless}} + {{else}} +
    {{localize "DAGGERHEART.GENERAL.missingDragDropThing" thing=(localize "DAGGERHEART.GENERAL.weapons")}}
    {{/if}} @@ -75,6 +79,8 @@ {{#unless (eq document.parent.type 'character')}}{{/unless}} + {{else}} +
    {{localize "DAGGERHEART.GENERAL.missingDragDropThing" thing=(localize "DAGGERHEART.GENERAL.armors")}}
    {{/if}} @@ -85,6 +91,9 @@
    {{localize "DAGGERHEART.GENERAL.take"}}
    + {{#unless source.system.inventory.take}} +
    {{localize "DAGGERHEART.GENERAL.missingDragDropThing" thing=(localize "DAGGERHEART.GENERAL.items")}}
    + {{/unless}} {{#each source.system.inventory.take}} {{#if this}}
    @@ -102,6 +111,9 @@
    {{localize "DAGGERHEART.ITEMS.Class.guide.inventory.thenChoose"}}
    + {{#unless source.system.inventory.choiceA}} +
    {{localize "DAGGERHEART.GENERAL.missingDragDropThing" thing=(localize "DAGGERHEART.GENERAL.items")}}
    + {{/unless}} {{#each source.system.inventory.choiceA}} {{#if this}}
    @@ -119,6 +131,9 @@
    {{localize "DAGGERHEART.ITEMS.Class.guide.inventory.andEither"}}
    + {{#unless source.system.inventory.choiceB}} +
    {{localize "DAGGERHEART.GENERAL.missingDragDropThing" thing=(localize "DAGGERHEART.GENERAL.items")}}
    + {{/unless}} {{#each source.system.inventory.choiceB}} {{#if this}}
    diff --git a/templates/sheets/items/consumable/settings.hbs b/templates/sheets/items/consumable/settings.hbs index 71bb2a83..7cc75f6f 100644 --- a/templates/sheets/items/consumable/settings.hbs +++ b/templates/sheets/items/consumable/settings.hbs @@ -10,5 +10,8 @@ {{localize "DAGGERHEART.ITEMS.Consumable.consumeOnUse"}} {{formField systemFields.consumeOnUse value=source.system.consumeOnUse}} + + {{localize "DAGGERHEART.ITEMS.Consumable.destroyOnEmpty"}} + {{formField systemFields.destroyOnEmpty value=source.system.destroyOnEmpty}}
    \ No newline at end of file diff --git a/templates/ui/chat/parts/button-part.hbs b/templates/ui/chat/parts/button-part.hbs index f83972f7..21317939 100644 --- a/templates/ui/chat/parts/button-part.hbs +++ b/templates/ui/chat/parts/button-part.hbs @@ -1,17 +1,17 @@
    {{#if hasDamage}} {{#unless (empty damage)}} - {{#if canButtonApply}}{{/if}} + {{else}} {{/unless}} {{/if}} {{#if hasHealing}} {{#unless (empty damage)}} - {{#if canButtonApply}}{{/if}} + {{else}} {{/unless}} {{/if}} - {{#if (and hasEffect canButtonApply)}}{{/if}} + {{#if (and hasEffect)}}{{/if}}
    \ No newline at end of file diff --git a/templates/ui/chat/parts/damage-part.hbs b/templates/ui/chat/parts/damage-part.hbs index 05b6b825..97828bd2 100644 --- a/templates/ui/chat/parts/damage-part.hbs +++ b/templates/ui/chat/parts/damage-part.hbs @@ -13,10 +13,10 @@ {{#each damage as | roll index | }}
    - {{localize (concat 'DAGGERHEART.CONFIG.HealingType.' index '.inChatRoll')}}
    {{localize "DAGGERHEART.GENERAL.total"}}: {{roll.total}}
    {{#if (and (eq index "hitPoints")../isDirect)}}
    {{localize "DAGGERHEART.CONFIG.DamageType.direct.short"}}
    {{/if}} + {{#if ../hasHealing}}{{localize (concat 'DAGGERHEART.CONFIG.HealingType.' index '.name')}}{{else}}{{localize (concat 'DAGGERHEART.CONFIG.HealingType.' index '.inChatRoll')}}{{/if}}
    {{localize "DAGGERHEART.GENERAL.total"}}: {{roll.total}}
    {{#if (and (eq index "hitPoints") ../isDirect)}}
    {{localize "DAGGERHEART.CONFIG.DamageType.direct.short"}}
    {{/if}}
    {{#each roll.parts}} - {{#if damageTypes.length}} + {{#if (and (not @root.hasHealing) damageTypes.length)}}