diff --git a/daggerheart.mjs b/daggerheart.mjs index 0bbbd274..5960c6b1 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -3,7 +3,6 @@ import * as applications from './module/applications/_module.mjs'; import * as data from './module/data/_module.mjs'; import * as models from './module/data/_module.mjs'; import * as documents from './module/documents/_module.mjs'; -import { macros } from './module/_module.mjs'; import * as collections from './module/documents/collections/_module.mjs'; import * as dice from './module/dice/_module.mjs'; import * as fields from './module/data/fields/_module.mjs'; @@ -21,6 +20,7 @@ import { } from './module/systemRegistration/_module.mjs'; import { placeables, DhTokenLayer } from './module/canvas/_module.mjs'; import './node_modules/@yaireo/tagify/dist/tagify.css'; +import TemplateManager from './module/documents/templateManager.mjs'; import TokenManager from './module/documents/tokenManager.mjs'; CONFIG.DH = SYSTEM; @@ -44,7 +44,6 @@ CONFIG.Item.dataModels = models.items.config; CONFIG.ActiveEffect.documentClass = documents.DhActiveEffect; CONFIG.ActiveEffect.dataModels = models.activeEffects.config; -CONFIG.ActiveEffect.changeTypes = { ...CONFIG.ActiveEffect.changeTypes, ...models.activeEffects.changeEffects }; CONFIG.Combat.documentClass = documents.DhpCombat; CONFIG.Combat.dataModels = { base: models.DhCombat }; @@ -56,13 +55,11 @@ CONFIG.ChatMessage.documentClass = documents.DhChatMessage; CONFIG.ChatMessage.template = 'systems/daggerheart/templates/ui/chat/chat-message.hbs'; CONFIG.Canvas.rulerClass = placeables.DhRuler; -CONFIG.Canvas.layers.regions.layerClass = placeables.DhRegionLayer; +CONFIG.Canvas.layers.templates.layerClass = placeables.DhTemplateLayer; CONFIG.Canvas.layers.tokens.layerClass = DhTokenLayer; CONFIG.MeasuredTemplate.objectClass = placeables.DhMeasuredTemplate; -CONFIG.Region.objectClass = placeables.DhRegion; - CONFIG.RollTable.documentClass = documents.DhRollTable; CONFIG.RollTable.resultTemplate = 'systems/daggerheart/templates/ui/chat/table-result.hbs'; @@ -86,6 +83,7 @@ CONFIG.ui.resources = applications.ui.DhFearTracker; CONFIG.ui.countdowns = applications.ui.DhCountdowns; CONFIG.ux.ContextMenu = applications.ux.DHContextMenu; CONFIG.ux.TooltipManager = documents.DhTooltipManager; +CONFIG.ux.TemplateManager = new TemplateManager(); CONFIG.ux.TokenManager = new TokenManager(); CONFIG.debug.triggers = false; @@ -95,7 +93,6 @@ Hooks.once('init', () => { data, models, documents, - macros, dice, fields }; @@ -214,7 +211,6 @@ Hooks.once('init', () => { SYSTEM.id, applications.sheetConfigs.ActiveEffectConfig, { - types: ['base', 'beastform', 'horde'], makeDefault: true, label: sheetLabel('DOCUMENT.ActiveEffect') } @@ -272,6 +268,7 @@ Hooks.on('setup', () => { ...damageThresholds, 'proficiency', 'evasion', + 'armorScore', 'scars', 'levelData.level.current' ] @@ -405,17 +402,6 @@ Hooks.on('chatMessage', (_, message) => { } }); -Hooks.on(CONFIG.DH.HOOKS.hooksConfig.tagTeamStart, async data => { - if (data.openForAllPlayers && data.partyId) { - const party = game.actors.get(data.partyId); - if (!party) return; - - const dialog = new game.system.api.applications.dialogs.TagTeamDialog(party); - dialog.tabGroups.application = 'tagTeamRoll'; - await dialog.render({ force: true }); - } -}); - const updateActorsRangeDependentEffects = async token => { const rangeMeasurement = game.settings.get( CONFIG.DH.id, diff --git a/lang/en.json b/lang/en.json index 5dc09a1e..4032b6ed 100755 --- a/lang/en.json +++ b/lang/en.json @@ -14,9 +14,7 @@ "beastform": "Beastform" }, "ActiveEffect": { - "base": "Standard", - "beastform": "Beastform", - "horde": "Horde" + "beastform": "Beastform" }, "Actor": { "character": "Character", @@ -153,8 +151,7 @@ "Config": { "rangeDependence": { "title": "Range Dependence" - }, - "stacking": { "title": "Stacking" } + } }, "RangeDependance": { "hint": "Settings for an optional distance at which this effect should activate", @@ -452,7 +449,7 @@ "text": "Are you sure you want to delete {name}?" }, "DamageReduction": { - "maxUseableArmor": "Useable Armor Slots", + "armorMarks": "Armor Marks", "armorWithStress": "Spend 1 stress to use an extra mark", "thresholdImmunities": "Threshold Immunities", "stress": "Stress", @@ -678,35 +675,16 @@ }, "TagTeamSelect": { "title": "Tag Team Roll", - "FIELDS": { - "initiator": { - "memberId": { "label": "Initiating Character" }, - "cost": { "label": "Initiation Cost" } - } - }, "leaderTitle": "Initiating Character", "membersTitle": "Participants", "partyTeam": "Party Team", "hopeCost": "Hope Cost", "initiatingCharacter": "Initiating Character", - "selectParticipants": "Select the two participants", - "startTagTeamRoll": "Start Tag Team Roll", - "openDialogForAll": "Open Dialog For All", - "rollType": "Roll Type", - "makeYourRoll": "Make your roll", - "cancelTagTeamRoll": "Cancel Tag Team Roll", - "finishTagTeamRoll": "Finish Tag Team Roll", "linkMessageHint": "Make a roll from your character sheet to link it to the Tag Team Roll", "damageNotRolled": "Damage not rolled in chat message yet", "insufficientHope": "The initiating character doesn't have enough hope", - "createTagTeam": "Create Tag Team Roll", - "chatMessageRollTitle": "Roll", - "cancelConfirmTitle": "Cancel Tag Team Roll", - "cancelConfirmText": "Are you sure you want to cancel the Tag Team Roll? This will close it for all other players too.", - "hints": { - "completeRolls": "Set up and complete the rolls for the characters", - "selectRoll": "Select which roll value to be used for the Tag Team" - } + "createTagTeam": "Create TagTeam Roll", + "chatMessageRollTitle": "Roll" }, "TokenConfig": { "actorSizeUsed": "Actor size is set, determining the dimensions" @@ -719,15 +697,6 @@ } }, "CONFIG": { - "ActiveEffectDuration": { - "temporary": "Temporary", - "act": "Next Spotlight", - "scene": "Next Scene", - "shortRest": "Next Rest", - "longRest": "Next Long Rest", - "session": "Next Session", - "custom": "Custom" - }, "AdversaryTrait": { "relentless": { "name": "Relentless", @@ -795,11 +764,6 @@ "bruiser": "for each Bruiser adversary.", "solo": "for each Solo adversary." }, - "ArmorInteraction": { - "none": { "label": "Ignores Armor" }, - "active": { "label": "Active w/ Armor" }, - "inactive": { "label": "Inactive w/ Armor" } - }, "ArmorFeature": { "burning": { "name": "Burning", @@ -1255,11 +1219,6 @@ "selectType": "Select Action Type", "selectAction": "Action Selection" }, - "TagTeamRollTypes": { - "trait": "Trait", - "ability": "Ability", - "damageAbility": "Damage Ability" - }, "TargetTypes": { "any": "Any", "friendly": "Friendly", @@ -1272,8 +1231,8 @@ "cone": "Cone", "emanation": "Emanation", "inFront": "In Front", - "rectangle": "Rectangle", - "line": "Line" + "rect": "Rectangle", + "ray": "Ray" }, "TokenSize": { "tiny": "Tiny", @@ -1888,17 +1847,6 @@ "name": "Healing Roll" } }, - "ChangeTypes": { - "armor": { - "newArmorEffect": "Armor Effect", - "FIELDS": { - "interaction": { - "label": "Armor Interaction", - "hint": "Does the character wearing armor suppress this effect?" - } - } - } - }, "Duration": { "passive": "Passive", "temporary": "Temporary" @@ -1923,10 +1871,6 @@ } }, "GENERAL": { - "Ability": { - "single": "Ability", - "plural": "Abilities" - }, "Action": { "single": "Action", "plural": "Actions" @@ -2308,7 +2252,6 @@ "duality": "Duality", "dualityDice": "Duality Dice", "dualityRoll": "Duality Roll", - "effect": "Effect", "enabled": "Enabled", "evasion": "Evasion", "equipment": "Equipment", @@ -2381,10 +2324,6 @@ "rerolled": "Rerolled", "rerollThing": "Reroll {thing}", "resource": "Resource", - "result": { - "single": "Result", - "plural": "Results" - }, "roll": "Roll", "rollAll": "Roll All", "rollDamage": "Roll Damage", @@ -2547,14 +2486,6 @@ "secondaryWeapon": "Secondary Weapon" } }, - "MACROS": { - "Spotlight": { - "errors": { - "noActiveCombat": "There is no active encounter", - "noCombatantSelected": "A combatant token must be either selected or hovered to spotlight it" - } - } - }, "ROLLTABLES": { "FIELDS": { "formulaName": { "label": "Formula Name" } @@ -2626,10 +2557,6 @@ "hint": "Automatically increase the GM's fear pool on a fear duality roll result." }, "FIELDS": { - "autoExpireActiveEffects": { - "label": "Auto Expire Active Effects", - "hint": "Active Effects with set durations will automatically be removed when their durations are up" - }, "damageReductionRulesDefault": { "label": "Damage Reduction Rules Default", "hint": "Wether using armor and reductions has rules on by default" @@ -2798,12 +2725,6 @@ "setResourceIdentifier": "Set Resource Identifier" } }, - "Keybindings": { - "spotlight": { - "name": "Spotlight Combatant", - "hint": "Move the spotlight to a hovered or selected token that's present in an active encounter" - } - }, "Menu": { "title": "Daggerheart Game Settings", "automation": { @@ -3002,8 +2923,6 @@ }, "EffectsDisplay": { "removeThing": "[Right Click] Remove {thing}", - "increaseStacks": "[Left Click] Increment Stacks", - "decreaseStacks": "[Right Click] Decrement Stacks", "appliedBy": "Applied By: {by}" }, "ItemBrowser": { @@ -3130,9 +3049,6 @@ "knowTheTide": "Know The Tide gained a token", "lackingItemTransferPermission": "User {user} lacks owner permission needed to transfer items to {target}" }, - "Progress": { - "migrationLabel": "Performing system migration. Please wait and do not close Foundry." - }, "Sidebar": { "actorDirectory": { "tier": "Tier {tier} {type}", diff --git a/module/_module.mjs b/module/_module.mjs index 4a00e97c..2e1d6fb4 100644 --- a/module/_module.mjs +++ b/module/_module.mjs @@ -7,4 +7,3 @@ export * as documents from './documents/_module.mjs'; export * as enrichers from './enrichers/_module.mjs'; export * as helpers from './helpers/_module.mjs'; export * as systemRegistration from './systemRegistration/_module.mjs'; -export * as macros from './macros/_modules.mjs'; diff --git a/module/applications/characterCreation/characterCreation.mjs b/module/applications/characterCreation/characterCreation.mjs index e6c0f299..aa764c56 100644 --- a/module/applications/characterCreation/characterCreation.mjs +++ b/module/applications/characterCreation/characterCreation.mjs @@ -554,7 +554,7 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl experiences: { ...this.setup.experiences, ...Object.keys(this.character.system.experiences).reduce((acc, key) => { - acc[`${key}`] = _del; + acc[`-=${key}`] = null; return acc; }, {}) } diff --git a/module/applications/dialogs/characterResetDialog.mjs b/module/applications/dialogs/characterResetDialog.mjs index aecebc7c..0836af9c 100644 --- a/module/applications/dialogs/characterResetDialog.mjs +++ b/module/applications/dialogs/characterResetDialog.mjs @@ -77,8 +77,8 @@ export default class CharacterResetDialog extends HandlebarsApplicationMixin(App if (!this.data.optional.portrait.keep) { foundry.utils.setProperty(update, 'img', this.actor.schema.fields.img.initial(this.actor)); - foundry.utils.setProperty(update, 'prototypeToken.texture', _replace({})); - foundry.utils.setProperty(update, 'prototypeToken.ring', _replace({})); + foundry.utils.setProperty(update, 'prototypeToken.==texture', {}); + foundry.utils.setProperty(update, 'prototypeToken.==ring', {}); } if (this.data.optional.biography.keep) @@ -89,7 +89,7 @@ export default class CharacterResetDialog extends HandlebarsApplicationMixin(App const { system, ...rest } = update; await this.actor.update({ ...rest, - system: _replace(system ?? {}) + '==system': system ?? {} }); const inventoryItemTypes = ['weapon', 'armor', 'consumable', 'loot']; diff --git a/module/applications/dialogs/d20RollDialog.mjs b/module/applications/dialogs/d20RollDialog.mjs index 64fa168a..8e79ba58 100644 --- a/module/applications/dialogs/d20RollDialog.mjs +++ b/module/applications/dialogs/d20RollDialog.mjs @@ -35,6 +35,7 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio updateIsAdvantage: this.updateIsAdvantage, selectExperience: this.selectExperience, toggleReaction: this.toggleReaction, + toggleTagTeamRoll: this.toggleTagTeamRoll, toggleSelectedEffect: this.toggleSelectedEffect, submitRoll: this.submitRoll }, @@ -70,8 +71,8 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio context.rollConfig = this.config; context.hasRoll = !!this.config.roll; context.canRoll = true; - context.selectedMessageMode = this.config.selectedMessageMode ?? game.settings.get('core', 'messageMode'); - context.rollModes = Object.entries(CONFIG.ChatMessage.modes).map(([action, { label, icon }]) => ({ + context.selectedRollMode = this.config.selectedRollMode ?? game.settings.get('core', 'rollMode'); + context.rollModes = Object.entries(CONFIG.Dice.rollModes).map(([action, { label, icon }]) => ({ action, label, icon @@ -132,6 +133,12 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio context.reactionOverride = this.reactionOverride; } + const tagTeamSetting = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll); + if (this.actor && tagTeamSetting.members[this.actor.id] && !this.config.skips?.createMessage) { + context.activeTagTeamRoll = true; + context.tagTeamSelected = this.config.tagTeamSelected; + } + return context; } @@ -142,10 +149,10 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio })); } - static updateRollConfiguration(_event, _, formData) { + static updateRollConfiguration(event, _, formData) { const { ...rest } = foundry.utils.expandObject(formData.object); - this.config.selectedMessageMode = rest.selectedMessageMode; + this.config.selectedRollMode = rest.selectedRollMode; if (this.config.costs) { this.config.costs = foundry.utils.mergeObject(this.config.costs, rest.costs); @@ -208,6 +215,11 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio } } + static toggleTagTeamRoll() { + this.config.tagTeamSelected = !this.config.tagTeamSelected; + this.render(); + } + static toggleSelectedEffect(_event, button) { this.selectedEffects[button.dataset.key].selected = !this.selectedEffects[button.dataset.key].selected; this.render(); diff --git a/module/applications/dialogs/damageDialog.mjs b/module/applications/dialogs/damageDialog.mjs index d00a744d..b24570cc 100644 --- a/module/applications/dialogs/damageDialog.mjs +++ b/module/applications/dialogs/damageDialog.mjs @@ -52,8 +52,8 @@ export default class DamageDialog extends HandlebarsApplicationMixin(Application context.formula = this.roll.constructFormula(this.config); context.hasHealing = this.config.hasHealing; context.directDamage = this.config.directDamage; - context.selectedMessageMode = this.config.selectedMessageMode; - context.rollModes = Object.entries(CONFIG.ChatMessage.modes).map(([action, { label, icon }]) => ({ + context.selectedRollMode = this.config.selectedRollMode; + context.rollModes = Object.entries(CONFIG.Dice.rollModes).map(([action, { label, icon }]) => ({ action, label, icon @@ -69,7 +69,7 @@ export default class DamageDialog extends HandlebarsApplicationMixin(Application const { ...rest } = foundry.utils.expandObject(formData.object); foundry.utils.mergeObject(this.config.roll, rest.roll); foundry.utils.mergeObject(this.config.modifiers, rest.modifiers); - this.config.selectedMessageMode = rest.selectedMessageMode; + this.config.selectedRollMode = rest.selectedRollMode; this.render(); } diff --git a/module/applications/dialogs/damageReductionDialog.mjs b/module/applications/dialogs/damageReductionDialog.mjs index 930ca1a1..cd0a5cf7 100644 --- a/module/applications/dialogs/damageReductionDialog.mjs +++ b/module/applications/dialogs/damageReductionDialog.mjs @@ -1,4 +1,4 @@ -import { damageKeyToNumber, getArmorSources, getDamageLabel } from '../../helpers/utils.mjs'; +import { damageKeyToNumber, getDamageLabel } from '../../helpers/utils.mjs'; const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api; @@ -10,7 +10,6 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap this.reject = reject; this.actor = actor; this.damage = damage; - this.damageType = damageType; this.rulesDefault = game.settings.get( CONFIG.DH.id, @@ -21,20 +20,14 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap this.rulesDefault ); - const orderedArmorSources = getArmorSources(actor).filter(s => !s.disabled); - const armor = orderedArmorSources.reduce((acc, { document }) => { - const { current, max } = document.type === 'armor' ? document.system.armor : document.system.armorData; - acc.push({ - effect: document, - marks: [...Array(max).keys()].reduce((acc, _, index) => { - const spent = index < current; - acc[foundry.utils.randomID()] = { selected: false, disabled: spent, spent }; - return acc; - }, {}) - }); + const canApplyArmor = damageType.every(t => actor.system.armorApplicableDamageTypes[t] === true); + const availableArmor = actor.system.armorScore - actor.system.armor.system.marks.value; + const maxArmorMarks = canApplyArmor ? availableArmor : 0; + const armor = [...Array(maxArmorMarks).keys()].reduce((acc, _) => { + acc[foundry.utils.randomID()] = { selected: false }; return acc; - }, []); + }, {}); const stress = [...Array(actor.system.rules.damageReduction.maxArmorMarked.stressExtra ?? 0).keys()].reduce( (acc, _) => { acc[foundry.utils.randomID()] = { selected: false }; @@ -128,11 +121,13 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap context.thresholdImmunities = Object.keys(this.thresholdImmunities).length > 0 ? this.thresholdImmunities : null; - const { selectedStressMarks, stressReductions, currentMarks, currentDamage, maxArmorUsed, availableArmor } = + const { selectedArmorMarks, selectedStressMarks, stressReductions, currentMarks, currentDamage } = this.getDamageInfo(); - context.armorScore = this.actor.system.armorScore.max; + context.armorScore = this.actor.system.armorScore; context.armorMarks = currentMarks; + context.basicMarksUsed = + selectedArmorMarks.length === this.actor.system.rules.damageReduction.maxArmorMarked.value; const stressReductionStress = this.availableStressReductions ? stressReductions.reduce((acc, red) => acc + red.cost, 0) @@ -146,30 +141,16 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap } : null; - context.maxArmorUsed = maxArmorUsed; - context.availableArmor = availableArmor; - context.basicMarksUsed = availableArmor === 0 || selectedStressMarks.length; - - const armorSources = []; - for (const source of this.marks.armor) { - const parent = source.effect.origin - ? await foundry.utils.fromUuid(source.effect.origin) - : source.effect.parent; - - const useEffectName = parent.type === 'armor' || parent instanceof Actor; - const label = useEffectName ? source.effect.name : parent.name; - armorSources.push({ - label: label, - uuid: source.effect.uuid, - marks: source.marks - }); - } + const maxArmor = this.actor.system.rules.damageReduction.maxArmorMarked.value; context.marks = { - armor: armorSources, + armor: Object.keys(this.marks.armor).reduce((acc, key, index) => { + const mark = this.marks.armor[key]; + if (!this.rulesOn || index + 1 <= maxArmor) acc[key] = mark; + + return acc; + }, {}), stress: this.marks.stress }; - - context.usesStressArmor = Object.keys(context.marks.stress).length; context.availableStressReductions = this.availableStressReductions; context.damage = getDamageLabel(this.damage); @@ -186,31 +167,27 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap } getDamageInfo = () => { - const selectedArmorMarks = this.marks.armor.flatMap(x => Object.values(x.marks).filter(x => x.selected)); + const selectedArmorMarks = Object.values(this.marks.armor).filter(x => x.selected); const selectedStressMarks = Object.values(this.marks.stress).filter(x => x.selected); const stressReductions = this.availableStressReductions ? Object.values(this.availableStressReductions).filter(red => red.selected) : []; - const currentMarks = this.actor.system.armorScore.value + selectedArmorMarks.length; - - const maxArmorUsed = this.actor.system.rules.damageReduction.maxArmorMarked.value + selectedStressMarks.length; - const availableArmor = - maxArmorUsed - - this.marks.armor.reduce((acc, source) => { - acc += Object.values(source.marks).filter(x => x.selected).length; - return acc; - }, 0); + const currentMarks = + this.actor.system.armor.system.marks.value + selectedArmorMarks.length + selectedStressMarks.length; const armorMarkReduction = selectedArmorMarks.length * this.actor.system.rules.damageReduction.increasePerArmorMark; - let currentDamage = Math.max(this.damage - armorMarkReduction - stressReductions.length, 0); + let currentDamage = Math.max( + this.damage - armorMarkReduction - selectedStressMarks.length - stressReductions.length, + 0 + ); if (this.reduceSeverity) { currentDamage = Math.max(currentDamage - this.reduceSeverity, 0); } if (this.thresholdImmunities[currentDamage]) currentDamage = 0; - return { selectedStressMarks, stressReductions, currentMarks, currentDamage, maxArmorUsed, availableArmor }; + return { selectedArmorMarks, selectedStressMarks, stressReductions, currentMarks, currentDamage }; }; static toggleRules() { @@ -218,10 +195,13 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap const maxArmor = this.actor.system.rules.damageReduction.maxArmorMarked.value; this.marks = { - armor: this.marks.armor.map((mark, index) => { + armor: Object.keys(this.marks.armor).reduce((acc, key, index) => { + const mark = this.marks.armor[key]; const keepSelectValue = !this.rulesOn || index + 1 <= maxArmor; - return { ...mark, selected: keepSelectValue ? mark.selected : false }; - }), + acc[key] = { ...mark, selected: keepSelectValue ? mark.selected : false }; + + return acc; + }, {}), stress: this.marks.stress }; @@ -229,8 +209,8 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap } static setMarks(_, target) { - const currentMark = foundry.utils.getProperty(this.marks, target.dataset.path); - const { selectedStressMarks, stressReductions, currentDamage, availableArmor } = this.getDamageInfo(); + const currentMark = this.marks[target.dataset.type][target.dataset.key]; + const { selectedStressMarks, stressReductions, currentMarks, currentDamage } = this.getDamageInfo(); if (!currentMark.selected && currentDamage === 0) { ui.notifications.info(game.i18n.localize('DAGGERHEART.UI.Notifications.damageAlreadyNone')); @@ -238,18 +218,12 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap } if (this.rulesOn) { - if (target.dataset.type === 'armor' && !currentMark.selected && !availableArmor) { + if (!currentMark.selected && currentMarks === this.actor.system.armorScore) { ui.notifications.info(game.i18n.localize('DAGGERHEART.UI.Notifications.noAvailableArmorMarks')); return; } } - const stressUsed = selectedStressMarks.length; - if (target.dataset.type === 'armor' && stressUsed) { - const updateResult = this.updateStressArmor(target.dataset.id, !currentMark.selected); - if (updateResult === false) return; - } - if (currentMark.selected) { const currentDamageLabel = getDamageLabel(currentDamage); for (let reduction of stressReductions) { @@ -258,16 +232,8 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap } } - if (target.dataset.type === 'stress' && currentMark.armorMarkId) { - for (const source of this.marks.armor) { - const match = Object.keys(source.marks).find(key => key === currentMark.armorMarkId); - if (match) { - source.marks[match].selected = false; - break; - } - } - - currentMark.armorMarkId = null; + if (target.dataset.type === 'armor' && selectedStressMarks.length > 0) { + selectedStressMarks.forEach(mark => (mark.selected = false)); } } @@ -275,25 +241,6 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap this.render(); } - updateStressArmor(armorMarkId, select) { - let stressMarkKey = null; - if (select) { - stressMarkKey = Object.keys(this.marks.stress).find( - key => this.marks.stress[key].selected && !this.marks.stress[key].armorMarkId - ); - } else { - stressMarkKey = Object.keys(this.marks.stress).find( - key => this.marks.stress[key].armorMarkId === armorMarkId - ); - if (!stressMarkKey) - stressMarkKey = Object.keys(this.marks.stress).find(key => this.marks.stress[key].selected); - } - - if (!stressMarkKey) return false; - - this.marks.stress[stressMarkKey].armorMarkId = select ? armorMarkId : null; - } - static useStressReduction(_, target) { const damageValue = Number(target.dataset.reduction); const stressReduction = this.availableStressReductions[damageValue]; @@ -332,18 +279,11 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap } static async takeDamage() { - const { selectedStressMarks, stressReductions, currentDamage } = this.getDamageInfo(); - const armorChanges = this.marks.armor.reduce((acc, source) => { - const amount = Object.values(source.marks).filter(x => x.selected).length; - if (amount) acc.push({ uuid: source.effect.uuid, amount }); + const { selectedArmorMarks, selectedStressMarks, stressReductions, currentDamage } = this.getDamageInfo(); + const armorSpent = selectedArmorMarks.length + selectedStressMarks.length; + const stressSpent = selectedStressMarks.length + stressReductions.reduce((acc, red) => acc + red.cost, 0); - return acc; - }, []); - const stressSpent = - selectedStressMarks.filter(x => x.armorMarkId).length + - stressReductions.reduce((acc, red) => acc + red.cost, 0); - - this.resolve({ modifiedDamage: currentDamage, armorChanges, stressSpent }); + this.resolve({ modifiedDamage: currentDamage, armorSpent, stressSpent }); await this.close(true); } diff --git a/module/applications/dialogs/downtime.mjs b/module/applications/dialogs/downtime.mjs index 3475dee7..4c01c2a9 100644 --- a/module/applications/dialogs/downtime.mjs +++ b/module/applications/dialogs/downtime.mjs @@ -1,4 +1,4 @@ -import { expireActiveEffects, refreshIsAllowed } from '../../helpers/utils.mjs'; +import { refreshIsAllowed } from '../../helpers/utils.mjs'; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; @@ -203,7 +203,7 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV const msg = { user: game.user.id, system: { - moves: moves.map(move => ({ ...move, actions: Array.from(move.actions) })), + moves: moves, actor: this.actor.uuid }, speaker: cls.getSpeaker(), @@ -264,8 +264,6 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV await feature.update({ 'system.resource.value': resetValue }); } - expireActiveEffects(this.actor, [this.shortRest ? 'shortRest' : 'longRest']); - this.close(); } else { this.render(); diff --git a/module/applications/dialogs/rerollDamageDialog.mjs b/module/applications/dialogs/rerollDamageDialog.mjs index b821bd24..e1b75eb7 100644 --- a/module/applications/dialogs/rerollDamageDialog.mjs +++ b/module/applications/dialogs/rerollDamageDialog.mjs @@ -1,3 +1,5 @@ +import { RefreshType, socketEvent } from '../../systemRegistration/socket.mjs'; + const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api; export default class RerollDamageDialog extends HandlebarsApplicationMixin(ApplicationV2) { @@ -121,8 +123,16 @@ export default class RerollDamageDialog extends HandlebarsApplicationMixin(Appli return acc; }, {}) }; - await this.message.update(update); + + Hooks.callAll(socketEvent.Refresh, { refreshType: RefreshType.TagTeamRoll }); + await game.socket.emit(`system.${CONFIG.DH.id}`, { + action: socketEvent.Refresh, + data: { + refreshType: RefreshType.TagTeamRoll + } + }); + await this.close(); } diff --git a/module/applications/dialogs/tagTeamDialog.mjs b/module/applications/dialogs/tagTeamDialog.mjs index 27003162..d1a1e123 100644 --- a/module/applications/dialogs/tagTeamDialog.mjs +++ b/module/applications/dialogs/tagTeamDialog.mjs @@ -1,7 +1,5 @@ -import { MemberData } from '../../data/tagTeamData.mjs'; import { getCritDamageBonus } from '../../helpers/utils.mjs'; -import { emitAsGM, GMUpdateEvent, RefreshType, socketEvent } from '../../systemRegistration/socket.mjs'; -import Party from '../sheets/actors/party.mjs'; +import { GMUpdateEvent, RefreshType, socketEvent } from '../../systemRegistration/socket.mjs'; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; @@ -9,23 +7,15 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio constructor(party) { super(); + this.data = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll); this.party = party; - this.partyMembers = party.system.partyMembers - .filter(x => Party.DICE_ROLL_ACTOR_TYPES.includes(x.type)) - .map(member => ({ - ...member.toObject(), - uuid: member.uuid, - id: member.id, - selected: false - })); - this.intiator = null; - this.openForAllPlayers = true; - this.tabGroups.application = Object.keys(party.system.tagTeam.members).length - ? 'tagTeamRoll' - : 'initialization'; - - Hooks.on(socketEvent.Refresh, this.tagTeamRefresh.bind()); + this.setupHooks = Hooks.on(socketEvent.Refresh, ({ refreshType }) => { + if (refreshType === RefreshType.TagTeamRoll) { + this.data = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll); + this.render(); + } + }); } get title() { @@ -34,722 +24,324 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio static DEFAULT_OPTIONS = { tag: 'form', - id: 'TagTeamDialog', classes: ['daggerheart', 'views', 'dh-style', 'dialog', 'tag-team-dialog'], position: { width: 550, height: 'auto' }, actions: { - toggleSelectMember: TagTeamDialog.#toggleSelectMember, - startTagTeamRoll: TagTeamDialog.#startTagTeamRoll, - makeRoll: TagTeamDialog.#makeRoll, - removeRoll: TagTeamDialog.#removeRoll, - rerollDice: TagTeamDialog.#rerollDice, - makeDamageRoll: TagTeamDialog.#makeDamageRoll, - removeDamageRoll: TagTeamDialog.#removeDamageRoll, - rerollDamageDice: TagTeamDialog.#rerollDamageDice, - selectRoll: TagTeamDialog.#selectRoll, - cancelRoll: TagTeamDialog.#onCancelRoll, - finishRoll: TagTeamDialog.#finishRoll + removeMember: TagTeamDialog.#removeMember, + unlinkMessage: TagTeamDialog.#unlinkMessage, + selectMessage: TagTeamDialog.#selectMessage, + createTagTeam: TagTeamDialog.#createTagTeam }, form: { handler: this.updateData, submitOnChange: true, closeOnSubmit: false } }; static PARTS = { - initialization: { - id: 'initialization', - template: 'systems/daggerheart/templates/dialogs/tagTeamDialog/initialization.hbs' - }, - rollSelection: { - id: 'rollSelection', - template: 'systems/daggerheart/templates/dialogs/tagTeamDialog/rollSelection.hbs' - }, - tagTeamRoll: { - id: 'tagTeamRoll', - template: 'systems/daggerheart/templates/dialogs/tagTeamDialog/tagTeamRoll.hbs' - } - }; - - /** @inheritdoc */ - static TABS = { application: { - tabs: [{ id: 'initialization' }, { id: 'tagTeamRoll' }] + id: 'tag-team-dialog', + template: 'systems/daggerheart/templates/dialogs/tagTeamDialog.hbs' } }; - _attachPartListeners(partId, htmlElement, options) { - super._attachPartListeners(partId, htmlElement, options); - - for (const element of htmlElement.querySelectorAll('.roll-type-select')) - element.addEventListener('change', this.updateRollType.bind(this)); - } - - _configureRenderParts(options) { - const { initialization, rollSelection, tagTeamRoll } = super._configureRenderParts(options); - const augmentedParts = { initialization }; - for (const memberKey of Object.keys(this.party.system.tagTeam.members)) { - augmentedParts[memberKey] = { - id: memberKey, - template: 'systems/daggerheart/templates/dialogs/tagTeamDialog/tagTeamMember.hbs' - }; - } - augmentedParts.rollSelection = rollSelection; - augmentedParts.tagTeamRoll = tagTeamRoll; - - return augmentedParts; - } - - /**@inheritdoc */ - async _onRender(context, options) { - await super._onRender(context, options); - - if (this.element.querySelector('.team-container')) return; - const initializationPart = this.element.querySelector('.initialization-container'); - initializationPart.insertAdjacentHTML('afterend', '
'); - const teamContainer = this.element.querySelector('.team-container'); - for (const memberContainer of this.element.querySelectorAll('.team-member-container')) - teamContainer.appendChild(memberContainer); - } - async _prepareContext(_options) { const context = await super._prepareContext(_options); - context.isEditable = this.getIsEditable(); - context.fields = this.party.system.schema.fields.tagTeam.fields; - context.data = this.party.system.tagTeam; - context.rollTypes = CONFIG.DH.GENERAL.tagTeamRollTypes; - context.traitOptions = CONFIG.DH.ACTOR.abilities; - context.members = {}; - context.allHaveRolled = Object.keys(this.party.system.tagTeam.members).every(key => { - const data = this.party.system.tagTeam.members[key]; - return Boolean(data.rollData); + context.hopeCost = this.hopeCost; + context.data = this.data; + + context.memberOptions = this.party.filter(c => !this.data.members[c.id]); + context.selectedCharacterOptions = this.party.filter(c => this.data.members[c.id]); + + context.members = Object.keys(this.data.members).map(id => { + const roll = this.data.members[id].messageId ? game.messages.get(this.data.members[id].messageId) : null; + + context.usesDamage = + context.usesDamage === undefined + ? roll?.system.hasDamage + : context.usesDamage && roll?.system.hasDamage; + return { + character: this.party.find(x => x.id === id), + selected: this.data.members[id].selected, + roll: roll, + damageValues: roll + ? Object.keys(roll.system.damage).map(key => ({ + key: key, + name: game.i18n.localize(CONFIG.DH.GENERAL.healingTypes[key].label), + total: roll.system.damage[key].total + })) + : null + }; }); + const initiatorChar = this.party.find(x => x.id === this.data.initiator.id); + context.initiator = { + character: initiatorChar, + cost: this.data.initiator.cost + }; + + const selectedMember = Object.values(context.members).find(x => x.selected && x.roll); + const selectedIsCritical = selectedMember?.roll?.system?.isCritical; + context.selectedData = { + result: selectedMember + ? `${selectedMember.roll.system.roll.total} ${selectedMember.roll.system.roll.result.label}` + : null, + damageValues: null + }; + + for (const member of Object.values(context.members)) { + if (!member.roll) continue; + if (context.usesDamage) { + if (!context.selectedData.damageValues) context.selectedData.damageValues = {}; + for (let damage of member.damageValues) { + const damageTotal = member.roll.system.isCritical + ? damage.total + : selectedIsCritical + ? damage.total + (await getCritDamageBonus(member.roll.system.damage[damage.key].formula)) + : damage.total; + if (context.selectedData.damageValues[damage.key]) { + context.selectedData.damageValues[damage.key].total += damageTotal; + } else { + context.selectedData.damageValues[damage.key] = { + ...foundry.utils.deepClone(damage), + total: damageTotal + }; + } + } + } + } + + context.showResult = Object.values(context.members).reduce((enabled, member) => { + if (!member.roll) return enabled; + if (context.usesDamage) { + enabled = enabled === null ? member.damageValues.length > 0 : enabled && member.damageValues.length > 0; + } else { + enabled = enabled === null ? Boolean(member.roll) : enabled && Boolean(member.roll); + } + + return enabled; + }, null); + + context.createDisabled = + !context.selectedData.result || + !this.data.initiator.id || + Object.keys(this.data.members).length === 0 || + Object.values(context.members).some(x => + context.usesDamage ? !x.damageValues || x.damageValues.length === 0 : !x.roll + ); + return context; } - async _preparePartContext(partId, context, options) { - const partContext = await super._preparePartContext(partId, context, options); - partContext.partId = partId; - switch (partId) { - case 'initialization': - partContext.tagTeamFields = this.party.system.schema.fields.tagTeam.fields; - partContext.memberSelection = this.partyMembers; - const selectedMembers = partContext.memberSelection.filter(x => x.selected); + async updateSource(update) { + await this.data.updateSource(update); - partContext.allSelected = selectedMembers.length === 2; - partContext.canStartTagTeam = partContext.allSelected && this.initiator; - partContext.initiator = this.initiator; - partContext.initiatorOptions = selectedMembers.map(x => ({ value: x.id, label: x.name })); - partContext.initiatorDisabled = !selectedMembers.length; - partContext.openForAllPlayers = this.openForAllPlayers; - - break; - case 'rollSelection': - partContext.members = Object.keys(this.party.system.tagTeam.members).reduce((acc, key) => { - const member = this.party.system.tagTeam.members[key]; - acc[key] = { selected: member.selected }; - return acc; - }, {}); - break; - case 'tagTeamRoll': - const selectedRoll = Object.values(this.party.system.tagTeam.members).find(member => member.selected); - const critSelected = !selectedRoll - ? undefined - : (selectedRoll?.rollData?.options?.roll?.isCritical ?? false); - - partContext.hintText = await this.getInfoTexts(this.party.system.tagTeam.members); - partContext.joinedRoll = await this.getJoinedRoll({ - overrideIsCritical: critSelected, - displayVersion: true - }); - - break; - } - - if (Object.keys(this.party.system.tagTeam.members).includes(partId)) { - const data = this.party.system.tagTeam.members[partId]; - const actor = game.actors.get(partId); - - const rollOptions = []; - const damageRollOptions = []; - for (const item of actor.items) { - if (item.system.metadata.hasActions) { - const actions = [...item.system.actions, ...(item.system.attack ? [item.system.attack] : [])]; - for (const action of actions) { - if (action.hasRoll) { - const actionItem = { - value: action.uuid, - label: action.name, - group: item.name, - baseAction: action.baseAction - }; - - if (action.hasDamage) damageRollOptions.push(actionItem); - else rollOptions.push(actionItem); - } - } - } - } - - const selectedRoll = Object.values(this.party.system.tagTeam.members).find(member => member.selected); - const critSelected = !selectedRoll - ? undefined - : (selectedRoll?.rollData?.options?.roll?.isCritical ?? false); - - const damage = data.rollData?.options?.damage; - partContext.hasDamage |= Boolean(damage); - const critHitPointsDamage = await this.getCriticalDamage(damage); - - partContext.members[partId] = { - ...data, - isEditable: actor.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER), - key: partId, - readyToRoll: Boolean(data.rollChoice), - hasRolled: Boolean(data.rollData), - rollOptions, - damageRollOptions, - damage: damage, - critDamage: critHitPointsDamage, - useCritDamage: critSelected || (critSelected === undefined && data.rollData?.options?.roll?.isCritical) - }; - } - - return partContext; - } - - getUpdatingParts(target) { - const { initialization, rollSelection, tagTeamRoll } = this.constructor.PARTS; - const isInitialization = this.tabGroups.application === initialization.id; - const updatingMember = target.closest('.team-member-container')?.dataset?.memberKey; - - return [ - ...(isInitialization ? [initialization.id] : []), - ...(updatingMember ? [updatingMember] : []), - ...(!isInitialization ? [rollSelection.id] : []), - ...(!isInitialization ? [tagTeamRoll.id] : []) - ]; - } - - static async updateData(event, _, formData) { - const { initiator, openForAllPlayers, ...partyData } = foundry.utils.expandObject(formData.object); - this.initiator = initiator; - this.openForAllPlayers = openForAllPlayers !== undefined ? openForAllPlayers : this.openForAllPlayers; - - this.updatePartyData(partyData, this.getUpdatingParts(event.target)); - } - - async updatePartyData(update, updatingParts, options = { render: true }) { - const gmUpdate = async update => { - await this.party.update(update); - this.render({ parts: updatingParts }); - game.socket.emit(`system.${CONFIG.DH.id}`, { + if (game.user.isGM) { + await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll, this.data.toObject()); + Hooks.callAll(socketEvent.Refresh, { refreshType: RefreshType.TagTeamRoll }); + await game.socket.emit(`system.${CONFIG.DH.id}`, { action: socketEvent.Refresh, - data: { refreshType: RefreshType.TagTeamRoll, action: 'refresh', parts: updatingParts } + data: { + refreshType: RefreshType.TagTeamRoll + } }); - }; - - await emitAsGM( - GMUpdateEvent.UpdateDocument, - gmUpdate, - update, - this.party.uuid, - options.render - ? { refreshType: RefreshType.TagTeamRoll, action: 'refresh', parts: updatingParts } - : undefined - ); + } else { + await game.socket.emit(`system.${CONFIG.DH.id}`, { + action: socketEvent.GMUpdate, + data: { + action: GMUpdateEvent.UpdateSetting, + uuid: CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll, + update: this.data.toObject(), + refresh: { refreshType: RefreshType.TagTeamRoll } + } + }); + } } - getIsEditable() { - return this.party.system.partyMembers.some(actor => { - const selected = Boolean(this.party.system.tagTeam.members[actor.id]); - return selected && actor.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER); + static async updateData(_event, _element, formData) { + const { selectedAddMember, initiator } = foundry.utils.expandObject(formData.object); + const update = { initiator: initiator }; + if (selectedAddMember) { + const member = await foundry.utils.fromUuid(selectedAddMember); + update[`members.${member.id}`] = { messageId: null }; + } + + await this.updateSource(update); + this.render(); + } + + static async #removeMember(_, button) { + const update = { [`members.-=${button.dataset.characterId}`]: null }; + if (this.data.initiator.id === button.dataset.characterId) { + update.iniator = { id: null }; + } + + await this.updateSource(update); + } + + static async #unlinkMessage(_, button) { + await this.updateSource({ [`members.${button.id}.messageId`]: null }); + } + + static async #selectMessage(_, button) { + const member = this.data.members[button.id]; + const currentSelected = Object.keys(this.data.members).find(key => this.data.members[key].selected); + const curretSelectedUpdate = + currentSelected && currentSelected !== button.id ? { [`${currentSelected}`]: { selected: false } } : {}; + await this.updateSource({ + members: { + [`${button.id}`]: { selected: !member.selected }, + ...curretSelectedUpdate + } }); } - tagTeamRefresh = ({ refreshType, action, parts }) => { - if (refreshType !== RefreshType.TagTeamRoll) return; + static async #createTagTeam() { + const mainRollId = Object.keys(this.data.members).find(key => this.data.members[key].selected); + const mainRoll = game.messages.get(this.data.members[mainRollId].messageId); - switch (action) { - case 'startTagTeamRoll': - this.tabGroups.application = 'tagTeamRoll'; - break; - case 'refresh': - this.render({ parts }); - break; - case 'close': - this.close(); - break; - } - }; - - async close(options = {}) { - /* Opt out of Foundry's standard behavior of closing all application windows marked as UI when Escape is pressed */ - if (options.closeKey) return; - - Hooks.off(socketEvent.Refresh, this.tagTeamRefresh); - return super.close(options); - } - - checkInitiatorHopeError(initiator) { - if (initiator.cost && initiator.memberId) { - const actor = game.actors.get(initiator.memberId); - if (actor.system.resources.hope.value < initiator.cost) { + if (this.data.initiator.cost) { + const initiator = this.party.find(x => x.id === this.data.initiator.id); + if (initiator.system.resources.hope.value < this.data.initiator.cost) { return ui.notifications.warn( game.i18n.localize('DAGGERHEART.APPLICATIONS.TagTeamSelect.insufficientHope') ); } } - } - //#region Initialization - static #toggleSelectMember(_, button) { - const member = this.partyMembers.find(x => x.id === button.dataset.id); - if (member.selected && this.initiator?.memberId === member.id) this.initiator = null; + const secondaryRolls = Object.keys(this.data.members) + .filter(key => key !== mainRollId) + .map(key => game.messages.get(this.data.members[key].messageId)); - member.selected = !member.selected; - this.render(); - } + const systemData = foundry.utils.deepClone(mainRoll).system.toObject(); + const criticalRoll = systemData.roll.isCritical; + for (let roll of secondaryRolls) { + if (roll.system.hasDamage) { + for (let key in roll.system.damage) { + var damage = roll.system.damage[key]; + const damageTotal = + !roll.system.isCritical && criticalRoll + ? (await getCritDamageBonus(damage.formula)) + damage.total + : damage.total; + const updatedDamageParts = damage.parts; + if (systemData.damage[key]) { + if (!roll.system.isCritical && criticalRoll) { + for (let part of updatedDamageParts) { + const criticalDamage = await getCritDamageBonus(part.formula); + if (criticalDamage) { + damage.formula = `${damage.formula} + ${criticalDamage}`; + part.formula = `${part.formula} + ${criticalDamage}`; + part.modifierTotal = part.modifierTotal + criticalDamage; + part.total += criticalDamage; + part.roll = new Roll(part.formula); + } + } + } - static async #startTagTeamRoll() { - const error = this.checkInitiatorHopeError(this.initiator); - if (error) return error; - - await this.party.update({ - 'system.tagTeam': _replace( - new game.system.api.data.TagTeamData({ - ...this.party.system.tagTeam.toObject(), - initiator: this.initiator, - members: this.partyMembers.reduce((acc, member) => { - if (member.selected) - acc[member.id] = { - name: member.name, - img: member.img, - rollType: CONFIG.DH.GENERAL.tagTeamRollTypes.trait.id - }; - return acc; - }, {}) - }) - ) - }); - - const hookData = { openForAllPlayers: this.openForAllPlayers, partyId: this.party.id }; - Hooks.callAll(CONFIG.DH.HOOKS.hooksConfig.tagTeamStart, hookData); - game.socket.emit(`system.${CONFIG.DH.id}`, { - action: socketEvent.TagTeamStart, - data: hookData - }); - - this.render(); - } - //#endregion - //#region Tag Team Roll - - async getInfoTexts(members) { - let rollsAreFinished = true; - let rollIsSelected = false; - for (const member of Object.values(members)) { - const rollFinished = Boolean(member.rollData); - const damageFinished = - member.rollData?.options?.hasDamage !== undefined ? member.rollData.options.damage : true; - - rollsAreFinished = rollsAreFinished && rollFinished && damageFinished; - rollIsSelected = rollIsSelected || member.selected; - } - - let hint = null; - if (!rollsAreFinished) hint = game.i18n.localize('DAGGERHEART.APPLICATIONS.TagTeamSelect.hints.completeRolls'); - else if (!rollIsSelected) hint = game.i18n.localize('DAGGERHEART.APPLICATIONS.TagTeamSelect.hints.selectRoll'); - - return hint; - } - - async updateRollType(event) { - this.updatePartyData( - { - [`system.tagTeam.members.${event.target.dataset.member}`]: { - rollType: event.target.value, - rollChoice: null - } - }, - this.getUpdatingParts(event.target) - ); - } - - static async #removeRoll(_, button) { - this.updatePartyData( - { - [`system.tagTeam.members.${button.dataset.member}`]: { - rollData: null, - rollChoice: null, - selected: false - } - }, - this.getUpdatingParts(button) - ); - } - - static async #makeRoll(event, button) { - const { member } = button.dataset; - - let result = null; - switch (this.party.system.tagTeam.members[member].rollType) { - case CONFIG.DH.GENERAL.tagTeamRollTypes.trait.id: - result = await this.makeTraitRoll(member); - break; - case CONFIG.DH.GENERAL.tagTeamRollTypes.ability.id: - case CONFIG.DH.GENERAL.tagTeamRollTypes.damageAbility.id: - result = await this.makeAbilityRoll(event, member); - break; - } - - if (!result) return; - - if (!game.modules.get('dice-so-nice')?.active) foundry.audio.AudioHelper.play({ src: CONFIG.sounds.dice }); - - const rollData = result.messageRoll.toJSON(); - delete rollData.options.messageRoll; - this.updatePartyData( - { - [`system.tagTeam.members.${member}.rollData`]: rollData - }, - this.getUpdatingParts(button) - ); - } - - async makeTraitRoll(memberKey) { - const actor = game.actors.find(x => x.id === memberKey); - if (!actor) return; - - const memberData = this.party.system.tagTeam.members[memberKey]; - return await actor.rollTrait(memberData.rollChoice, { - skips: { - createMessage: true, - resources: true, - triggers: true - } - }); - } - - async makeAbilityRoll(event, memberKey) { - const actor = game.actors.find(x => x.id === memberKey); - if (!actor) return; - - const memberData = this.party.system.tagTeam.members[memberKey]; - const action = await foundry.utils.fromUuid(memberData.rollChoice); - - return await action.use(event, { - skips: { - createMessage: true, - resources: true, - triggers: true - } - }); - } - - static async #rerollDice(_, button) { - const { member, diceType } = button.dataset; - const memberData = this.party.system.tagTeam.members[member]; - - const dieIndex = diceType === 'hope' ? 0 : diceType === 'fear' ? 2 : 4; - - const { parsedRoll, newRoll } = await game.system.api.dice.DualityRoll.reroll( - memberData.rollData, - dieIndex, - diceType - ); - const rollData = parsedRoll.toJSON(); - this.updatePartyData( - { - [`system.tagTeam.members.${member}.rollData`]: { - ...rollData, - options: { - ...rollData.options, - roll: newRoll + systemData.damage[key].formula = `${systemData.damage[key].formula} + ${damage.formula}`; + systemData.damage[key].total += damageTotal; + systemData.damage[key].parts = [...systemData.damage[key].parts, ...updatedDamageParts]; + } else { + systemData.damage[key] = { ...damage, total: damageTotal, parts: updatedDamageParts }; } } - }, - this.getUpdatingParts(button) - ); - } - - static async #makeDamageRoll(event, button) { - const { memberKey } = button.dataset; - const actor = game.actors.find(x => x.id === memberKey); - if (!actor) return; - - const memberData = this.party.system.tagTeam.members[memberKey]; - const action = await foundry.utils.fromUuid(memberData.rollChoice); - const config = { - ...memberData.rollData.options, - dialog: { - configure: !event.shiftKey - }, - skips: { - createMessage: true, - resources: true, - triggers: true - } - }; - - await action.workflow.get('damage').execute(config, null, true); - if (!config.damage) return; - - const current = this.party.system.tagTeam.members[memberKey].rollData; - await this.updatePartyData( - { - [`system.tagTeam.members.${memberKey}.rollData`]: { - ...current, - options: { - ...current.options, - damage: config.damage - } - } - }, - this.getUpdatingParts(button) - ); - } - - static async #removeDamageRoll(_, button) { - const { memberKey } = button.dataset; - const current = this.party.system.tagTeam.members[memberKey].rollData; - this.updatePartyData( - { - [`system.tagTeam.members.${memberKey}.rollData`]: { - ...current, - options: { - ...current.options, - damage: null - } - } - }, - this.getUpdatingParts(button) - ); - } - - static async #rerollDamageDice(_, button) { - const { memberKey, damageKey, part, dice } = button.dataset; - const memberData = this.party.system.tagTeam.members[memberKey]; - const partData = memberData.rollData.options.damage[damageKey].parts[part]; - const activeDiceResultKey = Object.keys(partData.dice[dice].results).find( - index => partData.dice[dice].results[index].active - ); - const { parsedRoll, rerolledDice } = await game.system.api.dice.DamageRoll.reroll( - partData, - dice, - activeDiceResultKey - ); - - const rollData = this.party.system.tagTeam.members[memberKey].rollData; - rollData.options.damage[damageKey].parts = rollData.options.damage[damageKey].parts.map((damagePart, index) => { - if (index !== Number.parseInt(part)) return damagePart; - - return { - ...damagePart, - total: parsedRoll.total, - dice: rerolledDice - }; - }); - rollData.options.damage[damageKey].total = rollData.options.damage[damageKey].parts.reduce((acc, part) => { - acc += part.total; - return acc; - }, 0); - - this.updatePartyData( - { - [`system.tagTeam.members.${memberKey}.rollData`]: rollData - }, - this.getUpdatingParts(button) - ); - } - - async getCriticalDamage(damage) { - const newDamage = foundry.utils.deepClone(damage); - for (let key in newDamage) { - var damage = newDamage[key]; - damage.formula = ''; - damage.total = 0; - - for (let part of damage.parts) { - const criticalDamage = await getCritDamageBonus(part.formula); - if (criticalDamage) { - part.modifierTotal += criticalDamage; - part.total += criticalDamage; - part.formula = `${part.dice.map(x => x.formula).join(' + ')} + ${part.modifierTotal}`; - part.roll = new Roll(part.formula); - } - - damage.formula = [damage.formula, part.formula].filter(x => x).join(' + '); - damage.total += part.total; } } - return newDamage; - } - - async getNonCriticalDamage(config) { - const newDamage = foundry.utils.deepClone(config.damage); - for (let key in newDamage) { - var damage = newDamage[key]; - damage.formula = ''; - damage.total = 0; - - for (let part of damage.parts) { - const critDamageBonus = await getCritDamageBonus(part.formula); - part.modifierTotal -= critDamageBonus; - part.total -= critDamageBonus; - part.formula = `${part.dice.map(x => x.formula).join(' + ')} + ${part.modifierTotal}`; - part.roll = new Roll(part.formula); - - damage.formula = [damage.formula, part.formula].filter(x => x).join(' + '); - damage.total += part.total; - } - } - - return newDamage; - } - - static async #selectRoll(_, button) { - const { memberKey } = button.dataset; - this.updatePartyData( - { - [`system.tagTeam.members`]: Object.entries(this.party.system.tagTeam.members).reduce( - (acc, [key, member]) => { - acc[key] = { selected: key === memberKey ? !member.selected : false }; - return acc; - }, - {} - ) - }, - this.getUpdatingParts(button) - ); - } - - async getJoinedRoll({ overrideIsCritical, displayVersion } = {}) { - const memberValues = Object.values(this.party.system.tagTeam.members); - const selectedRoll = memberValues.find(x => x.selected); - let baseMainRoll = selectedRoll ?? memberValues[0]; - let baseSecondaryRoll = selectedRoll - ? memberValues.find(x => !x.selected) - : memberValues.length > 1 - ? memberValues[1] - : null; - - if (!baseMainRoll?.rollData || !baseSecondaryRoll) return null; - - const mainRoll = new MemberData(baseMainRoll.toObject()); - const secondaryRollData = new MemberData(baseSecondaryRoll.toObject()).rollData; - const systemData = mainRoll.rollData.options; - const isCritical = overrideIsCritical ?? systemData.roll.isCritical; - if (isCritical) systemData.damage = await this.getCriticalDamage(systemData.damage); - - if (secondaryRollData?.options.hasDamage) { - const secondaryDamage = (displayVersion ? overrideIsCritical : isCritical) - ? await this.getCriticalDamage(secondaryRollData.options.damage) - : secondaryRollData.options.damage; - if (systemData.damage) { - for (const key in secondaryDamage) { - const damage = secondaryDamage[key]; - systemData.damage[key].formula = [systemData.damage[key].formula, damage.formula] - .filter(x => x) - .join(' + '); - systemData.damage[key].total += damage.total; - systemData.damage[key].parts.push(...damage.parts); - } - } else { - systemData.damage = secondaryDamage; - } - } - - return mainRoll; - } - - static async #onCancelRoll(_event, _button, options = { confirm: true }) { - this.cancelRoll(options); - } - - async cancelRoll(options = { confirm: true }) { - if (options.confirm) { - const confirmed = await foundry.applications.api.DialogV2.confirm({ - window: { - title: game.i18n.localize('DAGGERHEART.APPLICATIONS.TagTeamSelect.cancelConfirmTitle') - }, - content: game.i18n.localize('DAGGERHEART.APPLICATIONS.TagTeamSelect.cancelConfirmText') - }); - - if (!confirmed) return; - } - - await this.updatePartyData( - { - 'system.tagTeam': { - initiator: null, - members: _replace({}) - } - }, - [], - { render: false } - ); - - this.close(); - game.socket.emit(`system.${CONFIG.DH.id}`, { - action: socketEvent.Refresh, - data: { refreshType: RefreshType.TagTeamRoll, action: 'close' } - }); - } - - static async #finishRoll() { - const error = this.checkInitiatorHopeError(this.party.system.tagTeam.initiator); - if (error) return error; - - const mainRoll = (await this.getJoinedRoll()).rollData; - - const mainActor = this.party.system.partyMembers.find(x => x.uuid === mainRoll.options.source.actor); - mainRoll.options.title = game.i18n.localize('DAGGERHEART.APPLICATIONS.TagTeamSelect.chatMessageRollTitle'); + systemData.title = game.i18n.localize('DAGGERHEART.APPLICATIONS.TagTeamSelect.chatMessageRollTitle'); const cls = getDocumentClass('ChatMessage'), msgData = { type: 'dualityRoll', user: game.user.id, title: game.i18n.localize('DAGGERHEART.APPLICATIONS.TagTeamSelect.title'), - speaker: cls.getSpeaker({ actor: mainActor }), - system: mainRoll.options, - rolls: [mainRoll], + speaker: cls.getSpeaker({ actor: this.party.find(x => x.id === mainRollId) }), + system: systemData, + rolls: mainRoll.rolls, sound: null, flags: { core: { RollTable: true } } }; await cls.create(msgData); - /* Handle resource updates from the finished TagTeamRoll */ - const tagTeamData = this.party.system.tagTeam; const fearUpdate = { key: 'fear', value: null, total: null, enabled: true }; - for (let memberId in tagTeamData.members) { + for (let memberId of Object.keys(this.data.members)) { const resourceUpdates = []; - const rollGivesHope = mainRoll.options.roll.isCritical || mainRoll.options.roll.result.duality === 1; - if (memberId === tagTeamData.initiator.memberId) { - const value = tagTeamData.initiator.cost + const rollGivesHope = systemData.roll.isCritical || systemData.roll.result.duality === 1; + if (memberId === this.data.initiator.id) { + const value = this.data.initiator.cost ? rollGivesHope - ? 1 - tagTeamData.initiator.cost - : -tagTeamData.initiator.cost + ? 1 - this.data.initiator.cost + : -this.data.initiator.cost : 1; resourceUpdates.push({ key: 'hope', value: value, total: -value, enabled: true }); } else if (rollGivesHope) { resourceUpdates.push({ key: 'hope', value: 1, total: -1, enabled: true }); } - if (mainRoll.options.roll.isCritical) - resourceUpdates.push({ key: 'stress', value: -1, total: 1, enabled: true }); - if (mainRoll.options.roll.result.duality === -1) { + if (systemData.roll.isCritical) resourceUpdates.push({ key: 'stress', value: -1, total: 1, enabled: true }); + if (systemData.roll.result.duality === -1) { fearUpdate.value = fearUpdate.value === null ? 1 : fearUpdate.value + 1; fearUpdate.total = fearUpdate.total === null ? -1 : fearUpdate.total - 1; } - game.actors.get(memberId).modifyResource(resourceUpdates); + this.party.find(x => x.id === memberId).modifyResource(resourceUpdates); } if (fearUpdate.value) { - mainActor.modifyResource([fearUpdate]); + this.party.find(x => x.id === mainRollId).modifyResource([fearUpdate]); } - /* Fin */ - this.cancelRoll({ confirm: false }); + /* Improve by fetching default from schema */ + const update = { members: [], initiator: { id: null, cost: 3 } }; + if (game.user.isGM) { + await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll, update); + Hooks.callAll(socketEvent.Refresh, { refreshType: RefreshType.TagTeamRoll }); + await game.socket.emit(`system.${CONFIG.DH.id}`, { + action: socketEvent.Refresh, + data: { + refreshType: RefreshType.TagTeamRoll + } + }); + } else { + await game.socket.emit(`system.${CONFIG.DH.id}`, { + action: socketEvent.GMUpdate, + data: { + action: GMUpdateEvent.UpdateSetting, + uuid: CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll, + update: update, + refresh: { refreshType: RefreshType.TagTeamRoll } + } + }); + } } - //#endregion + static async assignRoll(char, message) { + const settings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll); + const character = settings.members[char.id]; + if (!character) return; + + await settings.updateSource({ [`members.${char.id}.messageId`]: message.id }); + + if (game.user.isGM) { + await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll, settings); + Hooks.callAll(socketEvent.Refresh, { refreshType: RefreshType.TagTeamRoll }); + await game.socket.emit(`system.${CONFIG.DH.id}`, { + action: socketEvent.Refresh, + data: { + refreshType: RefreshType.TagTeamRoll + } + }); + } else { + await game.socket.emit(`system.${CONFIG.DH.id}`, { + action: socketEvent.GMUpdate, + data: { + action: GMUpdateEvent.UpdateSetting, + uuid: CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll, + update: settings, + refresh: { refreshType: RefreshType.TagTeamRoll } + } + }); + } + } + + async close(options = {}) { + Hooks.off(socketEvent.Refresh, this.setupHooks); + await super.close(options); + } } diff --git a/module/applications/levelup/companionLevelup.mjs b/module/applications/levelup/companionLevelup.mjs index d6bf2d78..7f11ccff 100644 --- a/module/applications/levelup/companionLevelup.mjs +++ b/module/applications/levelup/companionLevelup.mjs @@ -67,7 +67,7 @@ export default class DhCompanionLevelUp extends BaseLevelUp { break; case 'summary': const levelKeys = Object.keys(this.levelup.levels); - const actorDamageDice = this.actor.system.attack.damage.parts.hitPoints.value.dice; + const actorDamageDice = this.actor.system.attack.damage.parts[0].value.dice; const actorRange = this.actor.system.attack.range; let achievementExperiences = []; diff --git a/module/applications/levelup/levelup.mjs b/module/applications/levelup/levelup.mjs index c4616d9a..ba6110cc 100644 --- a/module/applications/levelup/levelup.mjs +++ b/module/applications/levelup/levelup.mjs @@ -477,7 +477,7 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2) const secondaryData = Object.keys( foundry.utils.getProperty(this.levelup, `${target.dataset.path}.secondaryData`) ).reduce((acc, key) => { - acc[key] = _del; + acc[`-=${key}`] = null; return acc; }, {}); await this.levelup.updateSource({ @@ -511,9 +511,9 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2) const current = foundry.utils.getProperty(this.levelup, `${basePath}.${button.dataset.option}`); if (Number(button.dataset.cost) > 1 || Object.keys(current).length === 1) { // Simple handling that doesn't cover potential Custom LevelTiers. - update[`${basePath}.${button.dataset.option}`] = _del; + update[`${basePath}.-=${button.dataset.option}`] = null; } else { - update[`${basePath}.${button.dataset.option}.${button.dataset.checkboxNr}`] = _del; + update[`${basePath}.${button.dataset.option}.-=${button.dataset.checkboxNr}`] = null; } } else { if (this.levelup.levels[this.levelup.currentLevel].nrSelections.available < Number(button.dataset.cost)) { diff --git a/module/applications/scene/sceneConfigSettings.mjs b/module/applications/scene/sceneConfigSettings.mjs index ce312a45..57a2bda4 100644 --- a/module/applications/scene/sceneConfigSettings.mjs +++ b/module/applications/scene/sceneConfigSettings.mjs @@ -62,15 +62,7 @@ export default class DhSceneConfigSettings extends foundry.applications.sheets.S } async _onDrop(event) { - event.stopPropagation(); const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event); - if (data.type === 'Level') { - const level = await foundry.documents.Level.fromDropData(data); - if (level?.parent === this.document) return this._onSortLevel(event, level); - - return; - } - const item = await foundry.utils.fromUuid(data.uuid); if (item instanceof game.system.api.documents.DhpActor && item.type === 'environment') { let sceneUuid = data.uuid; @@ -122,7 +114,7 @@ export default class DhSceneConfigSettings extends foundry.applications.sheets.S for (const key of Object.keys(this.document._source.flags.daggerheart?.sceneEnvironments ?? {})) { if (!submitData.flags.daggerheart.sceneEnvironments[key]) { - submitData.flags.daggerheart.sceneEnvironments[key] = _del; + submitData.flags.daggerheart.sceneEnvironments[`-=${key}`] = null; } } diff --git a/module/applications/settings/homebrewSettings.mjs b/module/applications/settings/homebrewSettings.mjs index 9f0b22c4..9cc0ecb1 100644 --- a/module/applications/settings/homebrewSettings.mjs +++ b/module/applications/settings/homebrewSettings.mjs @@ -298,7 +298,7 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli const isDowntime = ['shortRest', 'longRest'].includes(type); const path = isDowntime ? `restMoves.${type}.moves` : `itemFeatures.${type}`; await this.settings.updateSource({ - [`${path}.${id}`]: _del + [`${path}.-=${id}`]: null }); game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew, this.settings.toObject()); @@ -322,7 +322,7 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli const fields = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).schema.fields; const removeUpdate = Object.keys(this.settings.restMoves[target.dataset.type].moves).reduce((acc, key) => { - acc[key] = _del; + acc[`-=${key}`] = null; return acc; }, {}); @@ -382,7 +382,7 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli [`itemFeatures.${target.dataset.type}`]: Object.keys( this.settings.itemFeatures[target.dataset.type] ).reduce((acc, key) => { - acc[key] = _del; + acc[`-=${key}`] = null; return acc; }, {}) @@ -455,12 +455,12 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli if (!confirmed) return; await this.settings.updateSource({ - [`domains.${this.selected.domain}`]: _del + [`domains.-=${this.selected.domain}`]: null }); const currentSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew); if (currentSettings.domains[this.selected.domain]) { - await currentSettings.updateSource({ [`domains.${this.selected.domain}`]: _del }); + await currentSettings.updateSource({ [`domains.-=${this.selected.domain}`]: null }); await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew, currentSettings); } @@ -507,7 +507,7 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli static async deleteAdversaryType(_, target) { const { key } = target.dataset; - await this.settings.updateSource({ [`adversaryTypes.${key}`]: _del }); + await this.settings.updateSource({ [`adversaryTypes.-=${key}`]: null }); this.selected.adversaryType = this.selected.adversaryType === key ? null : this.selected.adversaryType; this.render(); @@ -563,7 +563,7 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli const { actorType, resourceKey } = target.dataset; await this.settings.updateSource({ - [`resources.${actorType}.resources.${resourceKey}`]: _del + [`resources.${actorType}.resources.-=${resourceKey}`]: null }); game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew, this.settings.toObject()); diff --git a/module/applications/sheets-configs/_module.mjs b/module/applications/sheets-configs/_module.mjs index 4b83a042..d3fb3c39 100644 --- a/module/applications/sheets-configs/_module.mjs +++ b/module/applications/sheets-configs/_module.mjs @@ -3,6 +3,7 @@ export { default as ActionSettingsConfig } from './action-settings-config.mjs'; export { default as CharacterSettings } from './character-settings.mjs'; export { default as AdversarySettings } from './adversary-settings.mjs'; export { default as CompanionSettings } from './companion-settings.mjs'; +export { default as SettingActiveEffectConfig } from './setting-active-effect-config.mjs'; export { default as SettingFeatureConfig } from './setting-feature-config.mjs'; export { default as EnvironmentSettings } from './environment-settings.mjs'; export { default as ActiveEffectConfig } from './activeEffectConfig.mjs'; diff --git a/module/applications/sheets-configs/action-base-config.mjs b/module/applications/sheets-configs/action-base-config.mjs index 05a3177d..ce0e7e24 100644 --- a/module/applications/sheets-configs/action-base-config.mjs +++ b/module/applications/sheets-configs/action-base-config.mjs @@ -1,4 +1,3 @@ -import { getUnusedDamageTypes } from '../../helpers/utils.mjs'; import DaggerheartSheet from '../sheets/daggerheart-sheet.mjs'; const { ApplicationV2 } = foundry.applications.api; @@ -105,7 +104,7 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2) } }; - static CLEAN_ARRAYS = ['cost', 'effects', 'summon']; + static CLEAN_ARRAYS = ['damage.parts', 'cost', 'effects', 'summon']; _getTabs(tabs) { for (const v of Object.values(tabs)) { @@ -154,13 +153,8 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2) context.openSection = this.openSection; context.tabs = this._getTabs(this.constructor.TABS); context.config = CONFIG.DH; - if (this.action.hasDamage) { - context.allDamageTypesUsed = !getUnusedDamageTypes(this.action.damage.parts).length; - - if (this.action.damage.hasOwnProperty('includeBase') && this.action.type === 'attack') - context.hasBaseDamage = !!this.action.parent.attack; - } - + if (this.action.damage?.hasOwnProperty('includeBase') && this.action.type === 'attack') + context.hasBaseDamage = !!this.action.parent.attack; context.costOptions = this.getCostOptions(); context.getRollTypeOptions = this.getRollTypeOptions(); context.disableOption = this.disableOption.bind(this); @@ -297,64 +291,18 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2) static addDamage(_event) { if (!this.action.damage.parts) return; - - const choices = getUnusedDamageTypes(this.action.damage.parts); - const content = new foundry.data.fields.StringField({ - label: game.i18n.localize('Damage Type'), - choices, - required: true - }).toFormGroup( - {}, - { - name: 'type', - localize: true, - nameAttr: 'value', - labelAttr: 'label' - } - ).outerHTML; - - const callback = (_, button) => { - const data = this.action.toObject(); - const type = choices[button.form.elements.type.value].value; - const part = this.action.schema.fields.damage.fields.parts.element.getInitialValue(); - part.applyTo = type; - if (type === CONFIG.DH.GENERAL.healingTypes.hitPoints.id) - part.type = this.action.schema.fields.damage.fields.parts.element.fields.type.element.initial; - - data.damage.parts[type] = part; - this.constructor.updateForm.bind(this)(null, null, { object: foundry.utils.flattenObject(data) }); - }; - - const typeDialog = new foundry.applications.api.DialogV2({ - buttons: [ - foundry.utils.mergeObject( - { - action: 'ok', - label: 'Confirm', - icon: 'fas fa-check', - default: true - }, - { callback: callback } - ) - ], - content: content, - rejectClose: false, - modal: false, - window: { - title: game.i18n.localize('Add Damage') - }, - position: { width: 300 } - }); - - typeDialog.render(true); + const data = this.action.toObject(), + part = {}; + if (this.action.actor?.isNPC) part.value = { multiplier: 'flat' }; + data.damage.parts.push(part); + this.constructor.updateForm.bind(this)(null, null, { object: foundry.utils.flattenObject(data) }); } static removeDamage(_event, button) { if (!this.action.damage.parts) return; - const data = this.action.toObject(); - const key = button.dataset.key; - delete data.damage.parts[key]; - data.damage.parts[`${key}`] = _del; + const data = this.action.toObject(), + index = button.dataset.index; + data.damage.parts.splice(index, 1); this.constructor.updateForm.bind(this)(null, null, { object: foundry.utils.flattenObject(data) }); } diff --git a/module/applications/sheets-configs/action-config.mjs b/module/applications/sheets-configs/action-config.mjs index e15b0391..0dbc377a 100644 --- a/module/applications/sheets-configs/action-config.mjs +++ b/module/applications/sheets-configs/action-config.mjs @@ -24,13 +24,12 @@ export default class DHActionConfig extends DHActionBaseConfig { const effectData = this._addEffectData.bind(this)(); const data = this.action.toObject(); - const created = await this.action.item.createEmbeddedDocuments('ActiveEffect', [ - game.system.api.data.activeEffects.BaseEffect.getDefaultObject() - ]); - - data.effects.push({ _id: created[0]._id }); + const [created] = await this.action.item.createEmbeddedDocuments('ActiveEffect', [effectData], { + render: false + }); + data.effects.push({ _id: created._id }); this.constructor.updateForm.bind(this)(null, null, { object: foundry.utils.flattenObject(data) }); - this.action.item.effects.get(created[0]._id).sheet.render(true); + this.action.item.effects.get(created._id).sheet.render(true); } /** diff --git a/module/applications/sheets-configs/action-settings-config.mjs b/module/applications/sheets-configs/action-settings-config.mjs index 9cb866bc..91b85802 100644 --- a/module/applications/sheets-configs/action-settings-config.mjs +++ b/module/applications/sheets-configs/action-settings-config.mjs @@ -55,7 +55,7 @@ export default class DHActionSettingsConfig extends DHActionBaseConfig { static async editEffect(event) { const id = event.target.closest('[data-effect-id]')?.dataset?.effectId; - const updatedEffect = await game.system.api.applications.sheetConfigs.ActiveEffectConfig.configureSetting( + const updatedEffect = await game.system.api.applications.sheetConfigs.SettingActiveEffectConfig.configure( this.getEffectDetails(id) ); if (!updatedEffect) return; diff --git a/module/applications/sheets-configs/activeEffectConfig.mjs b/module/applications/sheets-configs/activeEffectConfig.mjs index 834a57a8..1f2ba5e0 100644 --- a/module/applications/sheets-configs/activeEffectConfig.mjs +++ b/module/applications/sheets-configs/activeEffectConfig.mjs @@ -18,7 +18,6 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac settings: { template: 'systems/daggerheart/templates/sheets/activeEffect/settings.hbs' }, changes: { template: 'systems/daggerheart/templates/sheets/activeEffect/changes.hbs', - templates: ['systems/daggerheart/templates/sheets/activeEffect/change.hbs'], scrollable: ['ol[data-changes]'] }, footer: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-form-footer.hbs' } @@ -150,18 +149,6 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac minLength: 0 }); }); - - htmlElement - .querySelector('.stacking-change-checkbox') - ?.addEventListener('change', this.stackingChangeToggle.bind(this)); - - htmlElement - .querySelector('.armor-change-checkbox') - ?.addEventListener('change', this.armorChangeToggle.bind(this)); - - htmlElement - .querySelector('.armor-damage-thresholds-checkbox') - ?.addEventListener('change', this.armorDamageThresholdToggle.bind(this)); } async _prepareContext(options) { @@ -186,166 +173,8 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac })); } break; - case 'settings': - const groups = { - time: _loc('EFFECT.DURATION.UNITS.GROUPS.time'), - combat: _loc('EFFECT.DURATION.UNITS.GROUPS.combat') - }; - partContext.durationUnits = CONST.ACTIVE_EFFECT_DURATION_UNITS.map(value => ({ - value, - label: _loc(`EFFECT.DURATION.UNITS.${value}`), - group: CONST.ACTIVE_EFFECT_TIME_DURATION_UNITS.includes(value) ? groups.time : groups.combat - })); - break; - case 'changes': - const singleTypes = ['armor']; - const typedChanges = context.source.changes.reduce((acc, change, index) => { - if (singleTypes.includes(change.type)) { - acc[change.type] = { ...change, index }; - } - return acc; - }, {}); - partContext.changes = partContext.changes.filter(c => !!c); - partContext.typedChanges = typedChanges; - break; } return partContext; } - - stackingChangeToggle(event) { - const stackingFields = this.document.system.schema.fields.stacking.fields; - const systemData = { - stacking: event.target.checked - ? { value: stackingFields.value.initial, max: stackingFields.max.initial } - : null - }; - return this.submit({ updateData: { system: systemData } }); - } - - armorChangeToggle(event) { - if (event.target.checked) { - this.addArmorChange(); - } else { - this.removeTypedChange(event.target.dataset.index); - } - } - - /* Could be generalised if needed later */ - addArmorChange() { - const submitData = this._processFormData(null, this.form, new FormDataExtended(this.form)); - const changes = Object.values(submitData.system?.changes ?? {}); - changes.push(game.system.api.data.activeEffects.changeTypes.armor.getInitialValue()); - return this.submit({ updateData: { system: { changes } } }); - } - - removeTypedChange(indexString) { - const submitData = this._processFormData(null, this.form, new FormDataExtended(this.form)); - const changes = Object.values(submitData.system.changes); - const index = Number(indexString); - changes.splice(index, 1); - return this.submit({ updateData: { system: { changes } } }); - } - - armorDamageThresholdToggle(event) { - const submitData = this._processFormData(null, this.form, new FormDataExtended(this.form)); - const changes = Object.values(submitData.system?.changes ?? {}); - const index = Number(event.target.dataset.index); - if (event.target.checked) { - changes[index].value.damageThresholds = { major: 0, severe: 0 }; - } else { - changes[index].value.damageThresholds = null; - } - - return this.submit({ updateData: { system: { changes } } }); - } - - /** @inheritdoc */ - _renderChange(context) { - const { change, index, defaultPriority } = context; - if (!(change.type in CONFIG.DH.GENERAL.baseActiveEffectModes)) return null; - - const changeTypesSchema = this.document.system.schema.fields.changes.element.types; - const fields = context.fields ?? (changeTypesSchema[change.type] ?? changeTypesSchema.add).fields; - if (typeof change.value !== 'string') change.value = JSON.stringify(change.value); - Object.assign( - change, - ['key', 'type', 'value', 'priority'].reduce((paths, fieldName) => { - paths[`${fieldName}Path`] = `system.changes.${index}.${fieldName}`; - return paths; - }, {}) - ); - return ( - game.system.api.documents.DhActiveEffect.CHANGE_TYPES[change.type].render?.( - change, - index, - defaultPriority - ) ?? - foundry.applications.handlebars.renderTemplate( - 'systems/daggerheart/templates/sheets/activeEffect/change.hbs', - { - change, - index, - defaultPriority, - fields, - types: Object.keys(CONFIG.DH.GENERAL.baseActiveEffectModes).reduce((r, key) => { - r[key] = CONFIG.DH.GENERAL.baseActiveEffectModes[key].label; - return r; - }, {}) - } - ) - ); - } - - /** @inheritDoc */ - _onChangeForm(_formConfig, event) { - if (foundry.utils.isElementInstanceOf(event.target, 'select') && event.target.name === 'system.duration.type') { - const durationSection = this.element.querySelector('.custom-duration-section'); - if (event.target.value === 'custom') durationSection.classList.add('visible'); - else durationSection.classList.remove('visible'); - - const durationDescription = this.element.querySelector('.duration-description'); - if (event.target.value === 'temporary') durationDescription.classList.add('visible'); - else durationDescription.classList.remove('visible'); - } - } - - /** @inheritDoc */ - _processFormData(event, form, formData) { - const submitData = super._processFormData(event, form, formData); - if (submitData.start && !submitData.start.time) submitData.start.time = '0'; - else if (!submitData) submitData.start = null; - - return submitData; - } - - /** @inheritDoc */ - _processSubmitData(event, form, submitData, options) { - if (this.options.isSetting) { - // Settings should update source instead - this.document.updateSource(submitData); - this.render(); - } else { - return super._processSubmitData(event, form, submitData, options); - } - } - - /** Creates an active effect config for a setting */ - static async configureSetting(effect, options = {}) { - const document = new CONFIG.ActiveEffect.documentClass({ ...foundry.utils.duplicate(effect), _id: effect.id }); - return new Promise(resolve => { - const app = new this({ document, ...options, isSetting: true }); - app.addEventListener( - 'close', - () => { - const newEffect = app.document.toObject(true); - newEffect.id = newEffect._id; - delete newEffect._id; - resolve(newEffect); - }, - { once: true } - ); - app.render({ force: true }); - }); - } } diff --git a/module/applications/sheets-configs/adversary-settings.mjs b/module/applications/sheets-configs/adversary-settings.mjs index 6593f23d..d3d215be 100644 --- a/module/applications/sheets-configs/adversary-settings.mjs +++ b/module/applications/sheets-configs/adversary-settings.mjs @@ -95,7 +95,7 @@ export default class DHAdversarySettings extends DHBaseActorSettings { }); if (!confirmed) return; - await this.actor.update({ [`system.experiences.${target.dataset.experience}`]: _del }); + await this.actor.update({ [`system.experiences.-=${target.dataset.experience}`]: null }); } async _onDragStart(event) { diff --git a/module/applications/sheets-configs/character-settings.mjs b/module/applications/sheets-configs/character-settings.mjs index c655b23f..20a09cfc 100644 --- a/module/applications/sheets-configs/character-settings.mjs +++ b/module/applications/sheets-configs/character-settings.mjs @@ -101,8 +101,8 @@ export default class DHCharacterSettings extends DHBaseActorSettings { if (relinkAchievementData.length > 0) { relinkAchievementData.forEach(data => { - updates[`system.levelData.levelups.${data.levelKey}.achievements.experiences.${data.experience}`] = - _del; + updates[`system.levelData.levelups.${data.levelKey}.achievements.experiences.-=${data.experience}`] = + null; }); } else if (relinkSelectionData.length > 0) { relinkSelectionData.forEach(data => { @@ -137,7 +137,7 @@ export default class DHCharacterSettings extends DHBaseActorSettings { await this.actor.update({ ...updates, - [`system.experiences.${target.dataset.experience}`]: _del + [`system.experiences.-=${target.dataset.experience}`]: null }); } } diff --git a/module/applications/sheets-configs/companion-settings.mjs b/module/applications/sheets-configs/companion-settings.mjs index 6c1265af..8aa21479 100644 --- a/module/applications/sheets-configs/companion-settings.mjs +++ b/module/applications/sheets-configs/companion-settings.mjs @@ -117,6 +117,6 @@ export default class DHCompanionSettings extends DHBaseActorSettings { }); if (!confirmed) return; - await this.actor.update({ [`system.experiences.${target.dataset.experience}`]: _del }); + await this.actor.update({ [`system.experiences.-=${target.dataset.experience}`]: null }); } } diff --git a/module/applications/sheets-configs/environment-settings.mjs b/module/applications/sheets-configs/environment-settings.mjs index bc0efef2..15f5701d 100644 --- a/module/applications/sheets-configs/environment-settings.mjs +++ b/module/applications/sheets-configs/environment-settings.mjs @@ -68,9 +68,9 @@ export default class DHEnvironmentSettings extends DHBaseActorSettings { */ static async #addCategory() { await this.actor.update({ - [`system.potentialAdversaries.${foundry.utils.randomID()}`]: { - label: game.i18n.localize('DAGGERHEART.ACTORS.Environment.newAdversary') - } + [`system.potentialAdversaries.${foundry.utils.randomID()}.label`]: game.i18n.localize( + 'DAGGERHEART.ACTORS.Environment.newAdversary' + ) }); } @@ -79,7 +79,7 @@ export default class DHEnvironmentSettings extends DHBaseActorSettings { * @type {ApplicationClickAction} */ static async #removeCategory(_, target) { - await this.actor.update({ [`system.potentialAdversaries.${target.dataset.categoryId}`]: _del }); + await this.actor.update({ [`system.potentialAdversaries.-=${target.dataset.categoryId}`]: null }); } /** @@ -138,8 +138,4 @@ export default class DHEnvironmentSettings extends DHBaseActorSettings { this.render(); } } - - async _onDropItem(event, item) { - console.log(item); - } } diff --git a/module/applications/sheets-configs/setting-active-effect-config.mjs b/module/applications/sheets-configs/setting-active-effect-config.mjs new file mode 100644 index 00000000..12ac90d1 --- /dev/null +++ b/module/applications/sheets-configs/setting-active-effect-config.mjs @@ -0,0 +1,223 @@ +import autocomplete from 'autocompleter'; + +const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; + +export default class SettingActiveEffectConfig extends HandlebarsApplicationMixin(ApplicationV2) { + constructor(effect) { + super({}); + + this.effect = foundry.utils.deepClone(effect); + this.changeChoices = game.system.api.applications.sheetConfigs.ActiveEffectConfig.getChangeChoices(); + } + + static DEFAULT_OPTIONS = { + classes: ['daggerheart', 'sheet', 'dh-style', 'active-effect-config', 'standard-form'], + tag: 'form', + position: { + width: 560 + }, + form: { + submitOnChange: false, + closeOnSubmit: false, + handler: SettingActiveEffectConfig.#onSubmit + }, + actions: { + editImage: SettingActiveEffectConfig.#editImage, + addChange: SettingActiveEffectConfig.#addChange, + deleteChange: SettingActiveEffectConfig.#deleteChange + } + }; + + static PARTS = { + header: { template: 'systems/daggerheart/templates/sheets/activeEffect/header.hbs' }, + tabs: { template: 'templates/generic/tab-navigation.hbs' }, + details: { template: 'systems/daggerheart/templates/sheets/activeEffect/details.hbs', scrollable: [''] }, + settings: { template: 'systems/daggerheart/templates/sheets/activeEffect/settings.hbs' }, + changes: { + template: 'systems/daggerheart/templates/sheets/activeEffect/changes.hbs', + scrollable: ['ol[data-changes]'] + }, + footer: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-form-footer.hbs' } + }; + + static TABS = { + sheet: { + tabs: [ + { id: 'details', icon: 'fa-solid fa-book' }, + { id: 'settings', icon: 'fa-solid fa-bars', label: 'DAGGERHEART.GENERAL.Tabs.settings' }, + { id: 'changes', icon: 'fa-solid fa-gears' } + ], + initial: 'details', + labelPrefix: 'EFFECT.TABS' + } + }; + + /**@inheritdoc */ + async _onFirstRender(context, options) { + await super._onFirstRender(context, options); + } + + async _prepareContext(_options) { + const context = await super._prepareContext(_options); + context.source = this.effect; + context.fields = game.system.api.documents.DhActiveEffect.schema.fields; + context.systemFields = game.system.api.data.activeEffects.BaseEffect._schema.fields; + + return context; + } + + _attachPartListeners(partId, htmlElement, options) { + super._attachPartListeners(partId, htmlElement, options); + const changeChoices = this.changeChoices; + + htmlElement.querySelectorAll('.effect-change-input').forEach(element => { + autocomplete({ + input: element, + fetch: function (text, update) { + if (!text) { + update(changeChoices); + } else { + text = text.toLowerCase(); + var suggestions = changeChoices.filter(n => n.label.toLowerCase().includes(text)); + update(suggestions); + } + }, + render: function (item, search) { + const label = game.i18n.localize(item.label); + const matchIndex = label.toLowerCase().indexOf(search); + + const beforeText = label.slice(0, matchIndex); + const matchText = label.slice(matchIndex, matchIndex + search.length); + const after = label.slice(matchIndex + search.length, label.length); + + const element = document.createElement('li'); + element.innerHTML = + `${beforeText}${matchText ? `${matchText}` : ''}${after}`.replaceAll( + ' ', + ' ' + ); + if (item.hint) { + element.dataset.tooltip = game.i18n.localize(item.hint); + } + + return element; + }, + renderGroup: function (label) { + const itemElement = document.createElement('div'); + itemElement.textContent = game.i18n.localize(label); + return itemElement; + }, + onSelect: function (item) { + element.value = `system.${item.value}`; + }, + click: e => e.fetch(), + customize: function (_input, _inputRect, container) { + container.style.zIndex = foundry.applications.api.ApplicationV2._maxZ; + }, + minLength: 0 + }); + }); + } + + async _preparePartContext(partId, context) { + if (partId in context.tabs) context.tab = context.tabs[partId]; + switch (partId) { + case 'details': + context.statuses = CONFIG.statusEffects.map(s => ({ value: s.id, label: game.i18n.localize(s.name) })); + context.isActorEffect = false; + context.isItemEffect = true; + const useGeneric = game.settings.get( + CONFIG.DH.id, + CONFIG.DH.SETTINGS.gameSettings.appearance + ).showGenericStatusEffects; + if (!useGeneric) { + context.statuses = [ + ...context.statuses, + Object.values(CONFIG.DH.GENERAL.conditions).map(status => ({ + value: status.id, + label: game.i18n.localize(status.name) + })) + ]; + } + break; + case 'changes': + context.modes = Object.entries(CONST.ACTIVE_EFFECT_MODES).reduce((modes, [key, value]) => { + modes[value] = game.i18n.localize(`EFFECT.MODE_${key}`); + return modes; + }, {}); + + context.priorities = ActiveEffectConfig.DEFAULT_PRIORITIES; + break; + } + + return context; + } + + static async #onSubmit(_event, _form, formData) { + this.data = foundry.utils.expandObject(formData.object); + this.close(); + } + + /** + * Edit a Document image. + * @this {DocumentSheetV2} + * @type {ApplicationClickAction} + */ + static async #editImage(_event, target) { + if (target.nodeName !== 'IMG') { + throw new Error('The editImage action is available only for IMG elements.'); + } + + const attr = target.dataset.edit; + const current = foundry.utils.getProperty(this.effect, attr); + const fp = new FilePicker.implementation({ + current, + type: 'image', + callback: path => (target.src = path), + position: { + top: this.position.top + 40, + left: this.position.left + 10 + } + }); + + await fp.browse(); + } + + /** + * Add a new change to the effect's changes array. + * @this {ActiveEffectConfig} + * @type {ApplicationClickAction} + */ + static async #addChange() { + const { changes, ...rest } = foundry.utils.expandObject(new FormDataExtended(this.form).object); + const updatedChanges = Object.values(changes ?? {}); + updatedChanges.push({}); + + this.effect = { ...rest, changes: updatedChanges }; + this.render(); + } + + /** + * Delete a change from the effect's changes array. + * @this {ActiveEffectConfig} + * @type {ApplicationClickAction} + */ + static async #deleteChange(event) { + const submitData = foundry.utils.expandObject(new FormDataExtended(this.form).object); + const updatedChanges = Object.values(submitData.changes); + const row = event.target.closest('li'); + const index = Number(row.dataset.index) || 0; + updatedChanges.splice(index, 1); + + this.effect = { ...submitData, changes: updatedChanges }; + this.render(); + } + + static async configure(effect, options = {}) { + return new Promise(resolve => { + const app = new this(effect, options); + app.addEventListener('close', () => resolve(app.data), { once: true }); + app.render({ force: true }); + }); + } +} diff --git a/module/applications/sheets-configs/setting-feature-config.mjs b/module/applications/sheets-configs/setting-feature-config.mjs index f90bb52f..28e686ea 100644 --- a/module/applications/sheets-configs/setting-feature-config.mjs +++ b/module/applications/sheets-configs/setting-feature-config.mjs @@ -147,7 +147,7 @@ export default class SettingFeatureConfig extends HandlebarsApplicationMixin(App const effectIndex = this.move.effects.findIndex(x => x.id === id); const effect = this.move.effects[effectIndex]; const updatedEffect = - await game.system.api.applications.sheetConfigs.ActiveEffectConfig.configureSetting(effect); + await game.system.api.applications.sheetConfigs.SettingActiveEffectConfig.configure(effect); if (!updatedEffect) return; await this.updateMove({ @@ -205,7 +205,7 @@ export default class SettingFeatureConfig extends HandlebarsApplicationMixin(App } }); } else { - await this.updateMove({ [`${this.actionsPath}.${target.dataset.id}`]: _del }); + await this.updateMove({ [`${this.actionsPath}.-=${target.dataset.id}`]: null }); } this.render(); diff --git a/module/applications/sheets-configs/token-config-mixin.mjs b/module/applications/sheets-configs/token-config-mixin.mjs index bed7f628..c29b54ff 100644 --- a/module/applications/sheets-configs/token-config-mixin.mjs +++ b/module/applications/sheets-configs/token-config-mixin.mjs @@ -67,9 +67,9 @@ export default function DHTokenConfigMixin(Base) { changes.height = tokenSize; } - // const deletions = { actorId: _del }; - // const mergeOptions = { inplace: false, performDeletions: true, actorLink: false }; - this._preview.updateSource(changes); + const deletions = { '-=actorId': null, '-=actorLink': null }; + const mergeOptions = { inplace: false, performDeletions: true }; + this._preview.updateSource(mergeObject(changes, deletions, mergeOptions)); if (this._preview?.object?.destroyed === false) { this._preview.object.initializeSources(); diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index f2686fdd..14dd1ae7 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -1,9 +1,10 @@ import DHBaseActorSheet from '../api/base-actor.mjs'; import DhDeathMove from '../../dialogs/deathMove.mjs'; +import { abilities } from '../../../config/actorConfig.mjs'; import { CharacterLevelup, LevelupViewMode } from '../../levelup/_module.mjs'; import DhCharacterCreation from '../../characterCreation/characterCreation.mjs'; import FilterMenu from '../../ux/filter-menu.mjs'; -import { getArmorSources, getDocFromElement, getDocFromElementSync } from '../../../helpers/utils.mjs'; +import { getDocFromElement, getDocFromElementSync } from '../../../helpers/utils.mjs'; /**@typedef {import('@client/applications/_types.mjs').ApplicationClickAction} ApplicationClickAction */ @@ -34,8 +35,7 @@ export default class CharacterSheet extends DHBaseActorSheet { cancelBeastform: CharacterSheet.#cancelBeastform, toggleResourceManagement: CharacterSheet.#toggleResourceManagement, useDowntime: this.useDowntime, - viewParty: CharacterSheet.#viewParty, - toggleArmorMangement: CharacterSheet.#toggleArmorManagement + viewParty: CharacterSheet.#viewParty }, window: { resizable: true, @@ -639,12 +639,12 @@ export default class CharacterSheet extends DHBaseActorSheet { } async updateArmorMarks(event) { - const inputValue = Number(event.currentTarget.value); - const { value, max } = this.document.system.armorScore; - const changeValue = Math.min(inputValue - value, max - value); + const armor = this.document.system.armor; + if (!armor) return; - event.currentTarget.value = inputValue < 0 ? 0 : value + changeValue; - this.document.system.updateArmorValue({ value: changeValue }); + const maxMarks = this.document.system.armorScore; + const value = Math.min(Math.max(Number(event.currentTarget.value), 0), maxMarks); + await armor.update({ 'system.marks.value': value }); } /* -------------------------------------------- */ @@ -720,16 +720,35 @@ export default class CharacterSheet extends DHBaseActorSheet { * Rolls an attribute check based on the clicked button's dataset attribute. * @type {ApplicationClickAction} */ - static async #rollAttribute(_event, button) { - const result = await this.document.rollTrait(button.dataset.attribute); + static async #rollAttribute(event, button) { + const abilityLabel = game.i18n.localize(abilities[button.dataset.attribute].label); + const config = { + event: event, + title: `${game.i18n.localize('DAGGERHEART.GENERAL.dualityRoll')}: ${this.actor.name}`, + headerTitle: game.i18n.format('DAGGERHEART.UI.Chat.dualityRoll.abilityCheckTitle', { + ability: abilityLabel + }), + effects: await game.system.api.data.actions.actionsTypes.base.getEffects(this.document), + roll: { + trait: button.dataset.attribute, + type: 'trait' + }, + hasRoll: true, + actionType: 'action', + headerTitle: `${game.i18n.localize('DAGGERHEART.GENERAL.dualityRoll')}: ${this.actor.name}`, + title: game.i18n.format('DAGGERHEART.UI.Chat.dualityRoll.abilityCheckTitle', { + ability: abilityLabel + }) + }; + const result = await this.document.diceRoll(config); if (!result) return; /* This could be avoided by baking config.costs into config.resourceUpdates. Didn't feel like messing with it at the time */ const costResources = result.costs?.filter(x => x.enabled).map(cost => ({ ...cost, value: -cost.value, total: -cost.total })) || {}; - result.resourceUpdates.addResources(costResources); - await result.resourceUpdates.updateResources(); + config.resourceUpdates.addResources(costResources); + await config.resourceUpdates.updateResources(); } //TODO: redo toggleEquipItem method @@ -804,13 +823,10 @@ export default class CharacterSheet extends DHBaseActorSheet { * Toggles ArmorScore resource value. * @type {ApplicationClickAction} */ - static async #toggleArmor(_, button, _element) { - const { value, max } = this.document.system.armorScore; - const inputValue = Number.parseInt(button.dataset.value); - const newValue = value >= inputValue ? inputValue - 1 : inputValue; - const changeValue = Math.min(newValue - value, max - value); - - this.document.system.updateArmorValue({ value: changeValue }); + static async #toggleArmor(_, button, element) { + const ArmorValue = Number.parseInt(button.dataset.value); + const newValue = this.document.system.armor.system.marks.value >= ArmorValue ? ArmorValue - 1 : ArmorValue; + await this.document.system.armor.update({ 'system.marks.value': newValue }); } /** @@ -936,99 +952,6 @@ export default class CharacterSheet extends DHBaseActorSheet { }); } - static async #toggleArmorManagement(_event, target) { - const existingTooltip = document.body.querySelector('.locked-tooltip .armor-management-container'); - if (existingTooltip) { - game.tooltip.dismissLockedTooltips(); - return; - } - - const armorSources = getArmorSources(this.document) - .filter(s => !s.disabled) - .toReversed() - .map(({ name, document, data }) => ({ - ...data, - uuid: document.uuid, - name - })); - if (!armorSources.length) return; - - const useResourcePips = game.settings.get( - CONFIG.DH.id, - CONFIG.DH.SETTINGS.gameSettings.appearance - ).useResourcePips; - const html = document.createElement('div'); - html.innerHTML = await foundry.applications.handlebars.renderTemplate( - `systems/daggerheart/templates/ui/tooltip/armorManagement.hbs`, - { - sources: armorSources, - useResourcePips - } - ); - - game.tooltip.dismissLockedTooltips(); - game.tooltip.activate(target, { - html, - locked: true, - cssClass: 'bordered-tooltip', - direction: 'DOWN' - }); - - html.querySelectorAll('.armor-slot').forEach(element => { - element.addEventListener('click', CharacterSheet.armorSourcePipUpdate); - }); - } - - static async armorSourceInput(event) { - const effect = await foundry.utils.fromUuid(event.target.dataset.uuid); - const value = Math.max(Math.min(Number.parseInt(event.target.value), effect.system.armorData.max), 0); - event.target.value = value; - const progressBar = event.target.closest('.status-bar.armor-slots').querySelector('progress'); - progressBar.value = value; - } - - /** Update specific armor source */ - static async armorSourcePipUpdate(event) { - const target = event.target.closest('.armor-slot'); - const { uuid, value } = target.dataset; - const document = await foundry.utils.fromUuid(uuid); - - let inputValue = Number.parseInt(value); - let decreasing = false; - let newCurrent = 0; - - if (document.type === 'armor') { - decreasing = document.system.armor.current >= inputValue; - newCurrent = decreasing ? inputValue - 1 : inputValue; - await document.update({ 'system.armor.current': newCurrent }); - } else if (document.system.armorData) { - const { current } = document.system.armorData; - decreasing = current >= inputValue; - newCurrent = decreasing ? inputValue - 1 : inputValue; - - const newChanges = document.system.changes.map(change => ({ - ...change, - value: change.type === 'armor' ? { ...change.value, current: newCurrent } : change.value - })); - - await document.update({ 'system.changes': newChanges }); - } else { - return; - } - - const container = target.closest('.slot-bar'); - for (const armorSlot of container.querySelectorAll('.armor-slot i')) { - const index = Number.parseInt(armorSlot.dataset.index); - if (decreasing && index >= newCurrent) { - armorSlot.classList.remove('fa-shield'); - armorSlot.classList.add('fa-shield-halved'); - } else if (!decreasing && index < newCurrent) { - armorSlot.classList.add('fa-shield'); - armorSlot.classList.remove('fa-shield-halved'); - } - } - } - static async #toggleResourceManagement(event, button) { event.stopPropagation(); const existingTooltip = document.body.querySelector('.locked-tooltip .resource-management-container'); @@ -1062,6 +985,7 @@ export default class CharacterSheet extends DHBaseActorSheet { ); const target = button.closest('.resource-section'); + game.tooltip.dismissLockedTooltips(); game.tooltip.activate(target, { html, diff --git a/module/applications/sheets/actors/party.mjs b/module/applications/sheets/actors/party.mjs index c5e77112..1b1722db 100644 --- a/module/applications/sheets/actors/party.mjs +++ b/module/applications/sheets/actors/party.mjs @@ -35,7 +35,9 @@ export default class Party extends DHBaseActorSheet { refeshActions: Party.#refeshActions, triggerRest: Party.#triggerRest, tagTeamRoll: Party.#tagTeamRoll, - groupRoll: Party.#groupRoll + groupRoll: Party.#groupRoll, + selectRefreshable: DaggerheartMenu.selectRefreshable, + refreshActors: DaggerheartMenu.refreshActors }, dragDrop: [{ dragSelector: '[data-item-id]', dropSelector: null }] }; @@ -118,7 +120,6 @@ export default class Party extends DHBaseActorSheet { secrets: this.document.isOwner, relativeTo: this.document }); - context.tagTeamActive = Boolean(this.document.system.tagTeam.initiator); } /** @@ -189,14 +190,11 @@ export default class Party extends DHBaseActorSheet { * Toggles a armor slot resource value. * @type {ApplicationClickAction} */ - static async #toggleArmorSlot(_, target) { - const actor = game.actors.get(target.dataset.actorId); - const { value, max } = actor.system.armorScore; - const inputValue = Number.parseInt(target.dataset.value); - const newValue = value >= inputValue ? inputValue - 1 : inputValue; - const changeValue = Math.min(newValue - value, max - value); - - await actor.system.updateArmorValue({ value: changeValue }); + static async #toggleArmorSlot(_, target, element) { + const armorItem = await foundry.utils.fromUuid(target.dataset.itemUuid); + const armorValue = Number.parseInt(target.dataset.value); + const newValue = armorItem.system.marks.value >= armorValue ? armorValue - 1 : armorValue; + await armorItem.update({ 'system.marks.value': newValue }); this.render(); } @@ -257,7 +255,11 @@ export default class Party extends DHBaseActorSheet { } static async #tagTeamRoll() { - new game.system.api.applications.dialogs.TagTeamDialog(this.document).render({ force: true }); + new game.system.api.applications.dialogs.TagTeamDialog( + this.document.system.partyMembers.filter(x => Party.DICE_ROLL_ACTOR_TYPES.includes(x.type)) + ).render({ + force: true + }); } static async #groupRoll(_params) { diff --git a/module/applications/sheets/api/application-mixin.mjs b/module/applications/sheets/api/application-mixin.mjs index 83313454..b18176ec 100644 --- a/module/applications/sheets/api/application-mixin.mjs +++ b/module/applications/sheets/api/application-mixin.mjs @@ -72,17 +72,20 @@ const typeSettingsMap = { */ export default function DHApplicationMixin(Base) { class DHSheetV2 extends HandlebarsApplicationMixin(Base) { - #nonHeaderAttribution = ['environment', 'ancestry', 'community', 'domainCard']; - /** * @param {DHSheetV2Configuration} [options={}] */ constructor(options = {}) { super(options); - - this._setupDragDrop(); + /** + * @type {foundry.applications.ux.DragDrop[]} + * @private + */ + this._dragDrop = this._createDragDropHandlers(); } + #nonHeaderAttribution = ['environment', 'ancestry', 'community', 'domainCard']; + /** * The default options for the sheet. * @type {DHSheetV2Configuration} @@ -174,9 +177,7 @@ export default function DHApplicationMixin(Base) { /**@inheritdoc */ _attachPartListeners(partId, htmlElement, options) { super._attachPartListeners(partId, htmlElement, options); - - /* Core dragDrop from ActorDocument is always only 1. Possible we could refactor our own */ - if (Array.isArray(this._dragDrop)) this._dragDrop.forEach(d => d.bind(htmlElement)); + this._dragDrop.forEach(d => d.bind(htmlElement)); // Handle delta inputs for (const deltaInput of htmlElement.querySelectorAll('input[data-allow-delta]')) { @@ -354,19 +355,14 @@ export default function DHApplicationMixin(Base) { * @returns {foundry.applications.ux.DragDrop[]} * @private */ - _setupDragDrop() { - if (this._dragDrop) { - this._dragDrop.callbacks.dragStart = this._onDragStart; - this._dragDrop.callback.drop = this._onDrop; - } else { - this._dragDrop = this.options.dragDrop.map(d => { - d.callbacks = { - dragstart: this._onDragStart.bind(this), - drop: this._onDrop.bind(this) - }; - return new foundry.applications.ux.DragDrop.implementation(d); - }); - } + _createDragDropHandlers() { + return this.options.dragDrop.map(d => { + d.callbacks = { + dragstart: this._onDragStart.bind(this), + drop: this._onDrop.bind(this) + }; + return new foundry.applications.ux.DragDrop.implementation(d); + }); } /** @@ -503,10 +499,7 @@ export default function DHApplicationMixin(Base) { icon: 'fa-solid fa-explosion', condition: target => { const doc = getDocFromElementSync(target); - return ( - !foundry.utils.isEmpty(doc?.system?.attack?.damage.parts) || - !foundry.utils.isEmpty(doc?.damage?.parts) - ); + return doc?.system?.attack?.damage.parts.length || doc?.damage?.parts.length; }, callback: async (target, event) => { const doc = await getDocFromElement(target), @@ -749,13 +742,11 @@ export default function DHApplicationMixin(Base) { const cls = type === 'action' ? game.system.api.models.actions.actionsTypes.base : getDocumentClass(documentClass); - const data = { name: cls.defaultName({ type, parent }), type, system: systemData }; - if (inVault) data['system.inVault'] = true; if (disabled) data.disabled = true; if (type === 'domainCard' && parent?.system.domains?.length) { diff --git a/module/applications/sheets/api/base-actor.mjs b/module/applications/sheets/api/base-actor.mjs index 4b0fd7d9..6f994faf 100644 --- a/module/applications/sheets/api/base-actor.mjs +++ b/module/applications/sheets/api/base-actor.mjs @@ -160,7 +160,7 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { inactives: [] }; - for (const effect of this.actor.allApplicableEffects({ noTransferArmor: true })) { + for (const effect of this.actor.allApplicableEffects()) { const list = effect.active ? context.effects.actives : context.effects.inactives; list.push(effect); } diff --git a/module/applications/sheets/items/armor.mjs b/module/applications/sheets/items/armor.mjs index 54685fee..2550b415 100644 --- a/module/applications/sheets/items/armor.mjs +++ b/module/applications/sheets/items/armor.mjs @@ -47,15 +47,6 @@ export default class ArmorSheet extends ItemAttachmentSheet(DHBaseItemSheet) { return context; } - async updateArmorEffect(event) { - const value = Number.parseInt(event.target.value); - const armorEffect = this.document.system.armorEffect; - if (Number.isNaN(value) || !armorEffect) return; - - await armorEffect.system.armorChange.updateArmorMax(value); - this.render(); - } - /** * Callback function used by `tagifyElement`. * @param {Array} selectedOptions - The currently selected tag objects. diff --git a/module/applications/sheets/items/beastform.mjs b/module/applications/sheets/items/beastform.mjs index 0c9991c4..880c0796 100644 --- a/module/applications/sheets/items/beastform.mjs +++ b/module/applications/sheets/items/beastform.mjs @@ -102,7 +102,7 @@ export default class BeastformSheet extends DHBaseItemSheet { async advantageOnRemove(event) { await this.document.update({ - [`system.advantageOn.${event.detail.data.value}`]: _del + [`system.advantageOn.-=${event.detail.data.value}`]: null }); } } diff --git a/module/applications/sheets/rollTables/rollTable.mjs b/module/applications/sheets/rollTables/rollTable.mjs index d7498e80..9ead6814 100644 --- a/module/applications/sheets/rollTables/rollTable.mjs +++ b/module/applications/sheets/rollTables/rollTable.mjs @@ -108,15 +108,14 @@ export default class DhRollTableSheet extends foundry.applications.sheets.RollTa getSystemFlagUpdate() { const deleteUpdate = Object.keys(this.document._source.flags.daggerheart?.altFormula ?? {}).reduce( (acc, formulaKey) => { - if (!this.daggerheartFlag.altFormula[formulaKey]) acc.altFormula[formulaKey] = _del; + if (!this.daggerheartFlag.altFormula[formulaKey]) acc.altFormula[`-=${formulaKey}`] = null; return acc; }, { altFormula: {} } ); - const flagData = this.daggerheartFlag.toObject(); - return { ...flagData, altFormula: { ...flagData.altFormula, ...deleteUpdate.altFormula } }; + return { ['flags.daggerheart']: foundry.utils.mergeObject(this.daggerheartFlag.toObject(), deleteUpdate) }; } static async #addFormula() { @@ -128,7 +127,7 @@ export default class DhRollTableSheet extends foundry.applications.sheets.RollTa static async #removeFormula(_event, target) { await this.daggerheartFlag.updateSource({ - [`altFormula.${target.dataset.key}`]: _del + [`altFormula.-=${target.dataset.key}`]: null }); this.render({ internalRefresh: true }); } diff --git a/module/applications/sidebar/sidebar.mjs b/module/applications/sidebar/sidebar.mjs index 64f7473d..ab6b0cdb 100644 --- a/module/applications/sidebar/sidebar.mjs +++ b/module/applications/sidebar/sidebar.mjs @@ -1,19 +1,52 @@ export default class DhSidebar extends foundry.applications.sidebar.Sidebar { - static buildTabs() { - const { settings, ...tabs } = super.TABS; - return { - ...tabs, - daggerheartMenu: { - tooltip: 'DAGGERHEART.UI.Sidebar.daggerheartMenu.title', - img: 'systems/daggerheart/assets/logos/FoundryBorneLogoWhite.svg', - gmOnly: true - }, - settings - }; - } - /** @override */ - static TABS = DhSidebar.buildTabs(); + static TABS = { + chat: { + documentName: 'ChatMessage' + }, + combat: { + documentName: 'Combat' + }, + scenes: { + documentName: 'Scene', + gmOnly: true + }, + actors: { + documentName: 'Actor' + }, + items: { + documentName: 'Item' + }, + journal: { + documentName: 'JournalEntry', + tooltip: 'SIDEBAR.TabJournal' + }, + tables: { + documentName: 'RollTable' + }, + cards: { + documentName: 'Cards' + }, + macros: { + documentName: 'Macro' + }, + playlists: { + documentName: 'Playlist' + }, + compendium: { + tooltip: 'SIDEBAR.TabCompendium', + icon: 'fa-solid fa-book-atlas' + }, + daggerheartMenu: { + tooltip: 'DAGGERHEART.UI.Sidebar.daggerheartMenu.title', + img: 'systems/daggerheart/assets/logos/FoundryBorneLogoWhite.svg', + gmOnly: true + }, + settings: { + tooltip: 'SIDEBAR.TabSettings', + icon: 'fa-solid fa-gears' + } + }; /** @override */ static PARTS = { diff --git a/module/applications/ui/_module.mjs b/module/applications/ui/_module.mjs index 80d3ebe4..8c5c020e 100644 --- a/module/applications/ui/_module.mjs +++ b/module/applications/ui/_module.mjs @@ -7,4 +7,3 @@ export { default as DhFearTracker } from './fearTracker.mjs'; export { default as DhHotbar } from './hotbar.mjs'; export { default as DhSceneNavigation } from './sceneNavigation.mjs'; export { ItemBrowser } from './itemBrowser.mjs'; -export { default as DhProgress } from './progress.mjs'; diff --git a/module/applications/ui/chatLog.mjs b/module/applications/ui/chatLog.mjs index e29498e6..2b489f58 100644 --- a/module/applications/ui/chatLog.mjs +++ b/module/applications/ui/chatLog.mjs @@ -190,24 +190,7 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo const target = event.target.closest('[data-die-index]'); if (target.dataset.type === 'damage') { - const { damageType, part, dice, result } = target.dataset; - const damagePart = message.system.damage[damageType].parts[part]; - const { parsedRoll, rerolledDice } = await game.system.api.dice.DamageRoll.reroll(damagePart, dice, result); - const damageParts = message.system.damage[damageType].parts.map((damagePart, index) => { - if (index !== Number(part)) return damagePart; - return { - ...damagePart, - total: parsedRoll.total, - dice: rerolledDice - }; - }); - const updateMessage = game.messages.get(message._id); - await updateMessage.update({ - [`system.damage.${damageType}`]: { - total: parsedRoll.total, - parts: damageParts - } - }); + game.system.api.dice.DamageRoll.reroll(target, message); } else { let originalRoll_parsed = message.rolls.map(roll => JSON.parse(roll))[0]; const rollClass = @@ -221,16 +204,20 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo if (!game.modules.get('dice-so-nice')?.active) foundry.audio.AudioHelper.play({ src: CONFIG.sounds.dice }); - const { newRoll, parsedRoll } = await rollClass.reroll( - originalRoll_parsed, - target.dataset.dieIndex, - target.dataset.type - ); + const { newRoll, parsedRoll } = await rollClass.reroll(originalRoll_parsed, target, message); await game.messages.get(message._id).update({ 'system.roll': newRoll, 'rolls': [parsedRoll] }); + + Hooks.callAll(socketEvent.Refresh, { refreshType: RefreshType.TagTeamRoll }); + await game.socket.emit(`system.${CONFIG.DH.id}`, { + action: socketEvent.Refresh, + data: { + refreshType: RefreshType.TagTeamRoll + } + }); } } diff --git a/module/applications/ui/combatTracker.mjs b/module/applications/ui/combatTracker.mjs index 345c6fcd..fc47f085 100644 --- a/module/applications/ui/combatTracker.mjs +++ b/module/applications/ui/combatTracker.mjs @@ -1,5 +1,4 @@ import { AdversaryBPPerEncounter } from '../../config/encounterConfig.mjs'; -import { expireActiveEffects } from '../../helpers/utils.mjs'; export default class DhCombatTracker extends foundry.applications.sidebar.tabs.CombatTracker { static DEFAULT_OPTIONS = { @@ -178,8 +177,6 @@ export default class DhCombatTracker extends foundry.applications.sidebar.tabs.C if (autoPoints) { update.system.actionTokens = Math.max(combatant.system.actionTokens - 1, 0); } - - if (combatant.actor) expireActiveEffects(combatant.actor, [CONFIG.DH.GENERAL.activeEffectDurations.act.id]); } await this.viewed.update({ diff --git a/module/applications/ui/countdownEdit.mjs b/module/applications/ui/countdownEdit.mjs index 8bb9fc1d..7f1deea3 100644 --- a/module/applications/ui/countdownEdit.mjs +++ b/module/applications/ui/countdownEdit.mjs @@ -233,6 +233,6 @@ export default class CountdownEdit extends HandlebarsApplicationMixin(Applicatio } if (this.editingCountdowns.has(countdownId)) this.editingCountdowns.delete(countdownId); - this.updateSetting({ [`countdowns.${countdownId}`]: _del }); + this.updateSetting({ [`countdowns.-=${countdownId}`]: null }); } } diff --git a/module/applications/ui/countdowns.mjs b/module/applications/ui/countdowns.mjs index 0f83a05f..42920a4a 100644 --- a/module/applications/ui/countdowns.mjs +++ b/module/applications/ui/countdowns.mjs @@ -52,6 +52,10 @@ export default class DhCountdowns extends HandlebarsApplicationMixin(Application } }; + get element() { + return document.body.querySelector('.daggerheart.dh-style.countdowns'); + } + /**@inheritdoc */ async _renderFrame(options) { const frame = await super._renderFrame(options); @@ -64,7 +68,6 @@ export default class DhCountdowns extends HandlebarsApplicationMixin(Application const header = frame.querySelector('.window-header'); header.querySelector('button[data-action="close"]').remove(); - header.querySelector('button[data-action="toggleControls"]').remove(); if (game.user.isGM) { const editTooltip = game.i18n.localize('DAGGERHEART.APPLICATIONS.CountdownEdit.editTitle'); @@ -275,8 +278,10 @@ export default class DhCountdowns extends HandlebarsApplicationMixin(Application return acc; }, {}) }; - await emitAsGM(GMUpdateEvent.UpdateCountdowns, DhCountdowns.gmSetSetting.bind(settings), settings, null, { - refreshType: RefreshType.Countdown + await emitAsGM(GMUpdateEvent.UpdateCountdowns, + DhCountdowns.gmSetSetting.bind(settings), + settings, null, { + refreshType: RefreshType.Countdown }); } diff --git a/module/applications/ui/effectsDisplay.mjs b/module/applications/ui/effectsDisplay.mjs index 035041e1..8c0c939c 100644 --- a/module/applications/ui/effectsDisplay.mjs +++ b/module/applications/ui/effectsDisplay.mjs @@ -1,4 +1,3 @@ -import { getIconVisibleActiveEffects } from '../../helpers/utils.mjs'; import { RefreshType } from '../../systemRegistration/socket.mjs'; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; @@ -49,9 +48,11 @@ export default class DhEffectsDisplay extends HandlebarsApplicationMixin(Applica _attachPartListeners(partId, htmlElement, options) { super._attachPartListeners(partId, htmlElement, options); - for (const element of this.element?.querySelectorAll('.effect-container a') ?? []) { - element.addEventListener('click', e => this.#onClickEffect(e)); - element.addEventListener('contextmenu', e => this.#onClickEffect(e, -1)); + + if (this.element) { + this.element.querySelectorAll('.effect-container a').forEach(element => { + element.addEventListener('contextmenu', this.removeEffect.bind(this)); + }); } } @@ -71,7 +72,7 @@ export default class DhEffectsDisplay extends HandlebarsApplicationMixin(Applica ? game.user.character : null : canvas.tokens.controlled[0].actor; - return getIconVisibleActiveEffects(actor?.getActiveEffects() ?? []); + return actor?.getActiveEffects() ?? []; }; toggleHidden(token, focused) { @@ -85,21 +86,11 @@ export default class DhEffectsDisplay extends HandlebarsApplicationMixin(Applica this.render(); } - async #onClickEffect(event, delta = 1) { + async removeEffect(event) { const element = event.target.closest('.effect-container'); const effects = DhEffectsDisplay.getTokenEffects(); const effect = effects.find(x => x.id === element.dataset.effectId); - if (!effect || (delta >= 0 && !effect.system.stacking)) { - return; - } - - const maxValue = effect.system.stacking?.max ?? Infinity; - const newValue = Math.clamp((effect.system.stacking?.value ?? 1) + delta, 0, maxValue); - if (newValue > 0) { - await effect.update({ 'system.stacking.value': newValue }); - } else { - await effect.delete(); - } + await effect.delete(); this.render(); } diff --git a/module/applications/ui/progress.mjs b/module/applications/ui/progress.mjs deleted file mode 100644 index 2fb1b445..00000000 --- a/module/applications/ui/progress.mjs +++ /dev/null @@ -1,27 +0,0 @@ -export default class DhProgress { - #notification; - - constructor({ max, label = '' }) { - this.max = max; - this.label = label; - this.#notification = ui.notifications.info(this.label, { progress: true }); - } - - updateMax(newMax) { - this.max = newMax; - } - - advance({ by = 1, label = this.label } = {}) { - if (this.value === this.max) return; - this.value = (this.value ?? 0) + Math.abs(by); - this.#notification.update({ message: label, pct: this.value / this.max }); - } - - close({ label = '' } = {}) { - this.#notification.update({ message: label, pct: 1 }); - } - - static createMigrationProgress(max = 0) { - return new DhProgress({ max, label: game.i18n.localize('DAGGERHEART.UI.Progress.migrationLabel') }); - } -} diff --git a/module/applications/ui/sceneNavigation.mjs b/module/applications/ui/sceneNavigation.mjs index a0005fc7..67bfe0b4 100644 --- a/module/applications/ui/sceneNavigation.mjs +++ b/module/applications/ui/sceneNavigation.mjs @@ -31,7 +31,7 @@ export default class DhSceneNavigation extends foundry.applications.ui.SceneNavi const environments = daggerheartInfo.sceneEnvironments.filter( x => x && x.testUserPermission(game.user, 'LIMITED') ); - const hasEnvironments = environments.length > 0 && x.active; + const hasEnvironments = environments.length > 0 && x.isView; return { ...x, hasEnvironments, @@ -39,10 +39,9 @@ export default class DhSceneNavigation extends foundry.applications.ui.SceneNavi environments: environments }; }); - context.scenes.active = extendScenes(context.scenes.active); context.scenes.inactive = extendScenes(context.scenes.inactive); - context.scenes.viewed = context.scenes.viewed ? extendScenes([context.scenes.viewed])[0] : null; + return context; } diff --git a/module/applications/ux/contextMenu.mjs b/module/applications/ux/contextMenu.mjs index 4e4ec6a4..081e6ba0 100644 --- a/module/applications/ux/contextMenu.mjs +++ b/module/applications/ux/contextMenu.mjs @@ -1,4 +1,97 @@ +/** + * @typedef ContextMenuEntry + * @property {string} name The context menu label. Can be localized. + * @property {string} [icon] A string containing an HTML icon element for the menu item. + * @property {string} [classes] Additional CSS classes to apply to this menu item. + * @property {string} [group] An identifier for a group this entry belongs to. + * @property {ContextMenuJQueryCallback} callback The function to call when the menu item is clicked. + * @property {ContextMenuCondition|boolean} [condition] A function to call or boolean value to determine if this entry + * appears in the menu. + */ + +/** + * @callback ContextMenuCondition + * @param {jQuery|HTMLElement} html The element of the context menu entry. + * @returns {boolean} Whether the entry should be rendered in the context menu. + */ + +/** + * @callback ContextMenuCallback + * @param {HTMLElement} target The element that the context menu has been triggered for. + * @returns {unknown} + */ + +/** + * @callback ContextMenuJQueryCallback + * @param {HTMLElement|jQuery} target The element that the context menu has been triggered for. Will + * either be a jQuery object or an HTMLElement instance, depending + * on how the ContextMenu was configured. + * @returns {unknown} + */ + +/** + * @typedef ContextMenuOptions + * @property {string} [eventName="contextmenu"] Optionally override the triggering event which can spawn the menu. If + * the menu is using fixed positioning, this event must be a MouseEvent. + * @property {ContextMenuCallback} [onOpen] A function to call when the context menu is opened. + * @property {ContextMenuCallback} [onClose] A function to call when the context menu is closed. + * @property {boolean} [fixed=false] If true, the context menu is given a fixed position rather than being + * injected into the target. + * @property {boolean} [jQuery=true] If true, callbacks will be passed jQuery objects instead of HTMLElement + * instances. + */ + +/** + * @typedef ContextMenuRenderOptions + * @property {Event} [event] The event that triggered the context menu opening. + * @property {boolean} [animate=true] Animate the context menu opening. + */ + +/** + * A subclass of ContextMenu. + * @extends {foundry.applications.ux.ContextMenu} + */ export default class DHContextMenu extends foundry.applications.ux.ContextMenu { + /** + * @param {HTMLElement|jQuery} container - The HTML element that contains the context menu targets. + * @param {string} selector - A CSS selector which activates the context menu. + * @param {ContextMenuEntry[]} menuItems - An Array of entries to display in the menu + * @param {ContextMenuOptions} [options] - Additional options to configure the context menu. + */ + constructor(container, selector, menuItems, options) { + super(container, selector, menuItems, options); + + /** @deprecated since v13 until v15 */ + this.#jQuery = options.jQuery; + } + + /** + * Whether to pass jQuery objects or HTMLElement instances to callback. + * @type {boolean} + */ + #jQuery; + + /**@inheritdoc */ + activateListeners(menu) { + menu.addEventListener('click', this.#onClickItem.bind(this)); + } + + /** + * Handle click events on context menu items. + * @param {PointerEvent} event The click event + */ + #onClickItem(event) { + event.preventDefault(); + event.stopPropagation(); + const element = event.target.closest('.context-item'); + if (!element) return; + const item = this.menuItems.find(i => i.element === element); + item?.callback(this.#jQuery ? $(this.target) : this.target, event); + this.close(); + } + + /* -------------------------------------------- */ + /** * Trigger a context menu event in response to a normal click on a additional options button. * @param {PointerEvent} event diff --git a/module/canvas/placeables/_module.mjs b/module/canvas/placeables/_module.mjs index 8746aabd..78242839 100644 --- a/module/canvas/placeables/_module.mjs +++ b/module/canvas/placeables/_module.mjs @@ -1,6 +1,5 @@ export { default as DhMeasuredTemplate } from './measuredTemplate.mjs'; export { default as DhRuler } from './ruler.mjs'; -export { default as DhRegion } from './region.mjs'; -export { default as DhRegionLayer } from './regionLayer.mjs'; +export { default as DhTemplateLayer } from './templateLayer.mjs'; export { default as DhTokenPlaceable } from './token.mjs'; export { default as DhTokenRuler } from './tokenRuler.mjs'; diff --git a/module/canvas/placeables/region.mjs b/module/canvas/placeables/region.mjs deleted file mode 100644 index 7ad94b2f..00000000 --- a/module/canvas/placeables/region.mjs +++ /dev/null @@ -1,12 +0,0 @@ -import DhMeasuredTemplate from './measuredTemplate.mjs'; - -export default class DhRegion extends foundry.canvas.placeables.Region { - /**@inheritdoc */ - _formatMeasuredDistance(distance) { - const range = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules).rangeMeasurement; - if (!range.enabled) return super._formatMeasuredDistance(distance); - - const { distance: resultDistance, units } = DhMeasuredTemplate.getRangeLabels(distance, range); - return `${resultDistance} ${units}`; - } -} diff --git a/module/canvas/placeables/regionLayer.mjs b/module/canvas/placeables/regionLayer.mjs deleted file mode 100644 index 81fd96db..00000000 --- a/module/canvas/placeables/regionLayer.mjs +++ /dev/null @@ -1,98 +0,0 @@ -export default class DhRegionLayer extends foundry.canvas.layers.RegionLayer { - static prepareSceneControls() { - const sc = foundry.applications.ui.SceneControls; - const { tools, ...rest } = super.prepareSceneControls(); - - return { - ...rest, - tools: { - select: tools.select, - templateMode: tools.templateMode, - rectangle: tools.rectangle, - circle: tools.circle, - ellipse: tools.ellipse, - cone: tools.cone, - inFront: { - name: 'inFront', - order: 7, - title: 'CONTROLS.inFront', - icon: 'fa-solid fa-eye', - toolclip: { - src: 'toolclips/tools/measure-cone.webm', - heading: 'CONTROLS.inFront', - items: sc.buildToolclipItems(['create', 'move', 'edit', 'hide', 'delete', 'rotate']) - } - }, - ring: { ...tools.ring, order: 8 }, - line: { ...tools.line, order: 9 }, - emanation: { ...tools.emanation, order: 10 }, - polygon: { ...tools.polygon, order: 11 }, - hole: { ...tools.hole, order: 12 }, - snap: { ...tools.snap, order: 13 }, - clear: { ...tools.clear, order: 14 } - } - }; - } - - /** @inheritDoc */ - _isCreationToolActive() { - return this.active && (game.activeTool === 'inFront' || game.activeTool in foundry.data.BaseShapeData.TYPES); - } - - _createDragShapeData(event) { - const hole = ui.controls.controls[this.options.name].tools.hole?.active ?? false; - if (game.activeTool === 'inFront') return { type: 'cone', x: 0, y: 0, radius: 0, angle: 180, hole }; - - const shape = super._createDragShapeData(event); - const token = - shape?.type === 'emanation' && shape.base?.type === 'token' - ? this.#findTokenInBounds(event.interactionData.origin) - : null; - if (token) { - shape.base.width = token.width; - shape.base.height = token.height; - event.interactionData.origin = token.getCenterPoint(); - } - return shape; - } - - async placeRegion(data, options = {}) { - const preConfirm = ({ _event, document, _create, _options }) => { - const shape = document.shapes[0]; - const isEmanation = shape.type === 'emanation'; - if (isEmanation) { - const token = this.#findTokenInBounds(shape.base.origin); - if (!token) return options.preConfirm?.() ?? true; - const shapeData = shape.toObject(); - document.updateSource({ - shapes: [ - { - ...shapeData, - base: { - ...shapeData.base, - height: token.height, - width: token.width, - x: token.x, - y: token.y - } - } - ] - }); - } - - return options?.preConfirm?.() ?? true; - }; - - super.placeRegion(data, { ...options, preConfirm }); - } - - /** Searches for token at origin point, returning null if there are no tokens or multiple overlapping tokens */ - #findTokenInBounds(origin) { - const { x, y } = origin; - const gridSize = canvas.grid.size; - const inBounds = canvas.scene.tokens.filter(t => { - return x.between(t.x, t.x + t.width * gridSize) && y.between(t.y, t.y + t.height * gridSize); - }); - return inBounds.length === 1 ? inBounds[0] : null; - } -} diff --git a/module/canvas/placeables/templateLayer.mjs b/module/canvas/placeables/templateLayer.mjs new file mode 100644 index 00000000..551a06cc --- /dev/null +++ b/module/canvas/placeables/templateLayer.mjs @@ -0,0 +1,116 @@ +export default class DhTemplateLayer extends foundry.canvas.layers.TemplateLayer { + static prepareSceneControls() { + const sc = foundry.applications.ui.SceneControls; + return { + name: 'templates', + order: 2, + title: 'CONTROLS.GroupMeasure', + icon: 'fa-solid fa-ruler-combined', + visible: game.user.can('TEMPLATE_CREATE'), + onChange: (event, active) => { + if (active) canvas.templates.activate(); + }, + onToolChange: () => canvas.templates.setAllRenderFlags({ refreshState: true }), + tools: { + circle: { + name: 'circle', + order: 1, + title: 'CONTROLS.MeasureCircle', + icon: 'fa-regular fa-circle', + toolclip: { + src: 'toolclips/tools/measure-circle.webm', + heading: 'CONTROLS.MeasureCircle', + items: sc.buildToolclipItems(['create', 'move', 'edit', 'hide', 'delete']) + } + }, + cone: { + name: 'cone', + order: 2, + title: 'CONTROLS.MeasureCone', + icon: 'fa-solid fa-angle-left', + toolclip: { + src: 'toolclips/tools/measure-cone.webm', + heading: 'CONTROLS.MeasureCone', + items: sc.buildToolclipItems(['create', 'move', 'edit', 'hide', 'delete', 'rotate']) + } + }, + inFront: { + name: 'inFront', + order: 3, + title: 'CONTROLS.inFront', + icon: 'fa-solid fa-eye', + toolclip: { + src: 'toolclips/tools/measure-cone.webm', + heading: 'CONTROLS.inFront', + items: sc.buildToolclipItems(['create', 'move', 'edit', 'hide', 'delete', 'rotate']) + } + }, + rect: { + name: 'rect', + order: 4, + title: 'CONTROLS.MeasureRect', + icon: 'fa-regular fa-square', + toolclip: { + src: 'toolclips/tools/measure-rect.webm', + heading: 'CONTROLS.MeasureRect', + items: sc.buildToolclipItems(['create', 'move', 'edit', 'hide', 'delete', 'rotate']) + } + }, + ray: { + name: 'ray', + order: 5, + title: 'CONTROLS.MeasureRay', + icon: 'fa-solid fa-up-down', + toolclip: { + src: 'toolclips/tools/measure-ray.webm', + heading: 'CONTROLS.MeasureRay', + items: sc.buildToolclipItems(['create', 'move', 'edit', 'hide', 'delete', 'rotate']) + } + }, + clear: { + name: 'clear', + order: 6, + title: 'CONTROLS.MeasureClear', + icon: 'fa-solid fa-trash', + visible: game.user.isGM, + onChange: () => canvas.templates.deleteAll(), + button: true + } + }, + activeTool: 'circle' + }; + } + + _onDragLeftStart(event) { + const interaction = event.interactionData; + + // Snap the origin to the grid + if (!event.shiftKey) interaction.origin = this.getSnappedPoint(interaction.origin); + + // Create a pending MeasuredTemplateDocument + const tool = game.activeTool === 'inFront' ? 'cone' : game.activeTool; + const previewData = { + user: game.user.id, + t: tool, + x: interaction.origin.x, + y: interaction.origin.y, + sort: Math.max(this.getMaxSort() + 1, 0), + distance: 1, + direction: 0, + fillColor: game.user.color || '#FF0000', + hidden: event.altKey + }; + const defaults = CONFIG.MeasuredTemplate.defaults; + if (game.activeTool === 'cone') previewData.angle = defaults.angle; + else if (game.activeTool === 'inFront') previewData.angle = 180; + else if (game.activeTool === 'ray') previewData.width = defaults.width * canvas.dimensions.distance; + const cls = foundry.utils.getDocumentClass('MeasuredTemplate'); + const doc = new cls(previewData, { parent: canvas.scene }); + + // Create a preview MeasuredTemplate object + const template = new this.constructor.placeableClass(doc); + doc._object = template; + interaction.preview = this.preview.addChild(template); + template.draw(); + } +} diff --git a/module/canvas/placeables/token.mjs b/module/canvas/placeables/token.mjs index 35d34f83..148466c1 100644 --- a/module/canvas/placeables/token.mjs +++ b/module/canvas/placeables/token.mjs @@ -1,4 +1,3 @@ -import { getIconVisibleActiveEffects } from '../../helpers/utils.mjs'; import DhMeasuredTemplate from './measuredTemplate.mjs'; export default class DhTokenPlaceable extends foundry.canvas.placeables.Token { @@ -21,7 +20,7 @@ export default class DhTokenPlaceable extends foundry.canvas.placeables.Token { this.effects.overlay = null; // Categorize effects - const activeEffects = getIconVisibleActiveEffects(Array.from(this.actor?.allApplicableEffects() ?? [])); + const activeEffects = this.actor?.getActiveEffects() ?? []; const overlayEffect = activeEffects.findLast(e => e.img && e.getFlag?.('core', 'overlay')); // Draw effects @@ -30,8 +29,8 @@ export default class DhTokenPlaceable extends foundry.canvas.placeables.Token { if (!effect.img) continue; const promise = effect === overlayEffect - ? this._drawOverlay(effect.img, effect.tint, effect) - : this._drawEffect(effect.img, effect.tint, effect); + ? this._drawOverlay(effect.img, effect.tint) + : this._drawEffect(effect.img, effect.tint); promises.push( promise.then(e => { if (e) e.zIndex = i; @@ -45,39 +44,6 @@ export default class DhTokenPlaceable extends foundry.canvas.placeables.Token { this.renderFlags.set({ refreshEffects: true }); } - /**@inheritdoc */ - async _drawEffect(src, tint, effect) { - if (!src) return; - const tex = await foundry.canvas.loadTexture(src, { fallback: 'icons/svg/hazard.svg' }); - const icon = new PIXI.Sprite(tex); - icon.tint = tint ?? 0xffffff; - - if (effect.system.stacking?.value > 1) { - const stackOverlay = new PIXI.Text(effect.system.stacking.value, { - fill: '#f3c267', - stroke: '#000000', - fontSize: 96, - strokeThickness: 4 - }); - const nrDigits = Math.floor(Math.log10(effect.system.stacking.value)) + 1; - stackOverlay.y = -8; - /* This does not account for 1:s being much less wide than other digits. I don't think it's desired however as it makes it look jumpy */ - stackOverlay.x = icon.width - 8 - nrDigits * 56; - stackOverlay.anchor.set(0, 0); - - icon.addChild(stackOverlay); - } - - return this.effects.addChild(icon); - } - - async _drawOverlay(src, tint, effect) { - const icon = await this._drawEffect(src, tint, effect); - if (icon) icon.alpha = 0.8; - this.effects.overlay = icon ?? null; - return icon; - } - /** * Returns the distance from this token to another token object. * This value is corrected to handle alternate token sizes and other grid types diff --git a/module/config/generalConfig.mjs b/module/config/generalConfig.mjs index c15cae56..f1c21d26 100644 --- a/module/config/generalConfig.mjs +++ b/module/config/generalConfig.mjs @@ -70,12 +70,8 @@ export const range = { } }; -/* circle|cone|rect|ray used to be CONST.MEASURED_TEMPLATE_TYPES. Hardcoded for now */ export const templateTypes = { - CIRCLE: 'circle', - CONE: 'cone', - RECTANGLE: 'rectangle', - LINE: 'line', + ...CONST.MEASURED_TEMPLATE_TYPES, EMANATION: 'emanation', INFRONT: 'inFront' }; @@ -245,8 +241,8 @@ export const defaultRestOptions = { type: 'friendly' }, damage: { - parts: { - hitPoints: { + parts: [ + { applyTo: healingTypes.hitPoints.id, value: { custom: { @@ -255,7 +251,7 @@ export const defaultRestOptions = { } } } - } + ] } } }, @@ -279,8 +275,8 @@ export const defaultRestOptions = { type: 'self' }, damage: { - parts: { - stress: { + parts: [ + { applyTo: healingTypes.stress.id, value: { custom: { @@ -289,7 +285,7 @@ export const defaultRestOptions = { } } } - } + ] } } }, @@ -314,8 +310,8 @@ export const defaultRestOptions = { type: 'friendly' }, damage: { - parts: { - armor: { + parts: [ + { applyTo: healingTypes.armor.id, value: { custom: { @@ -324,7 +320,7 @@ export const defaultRestOptions = { } } } - } + ] } } }, @@ -348,8 +344,8 @@ export const defaultRestOptions = { type: 'self' }, damage: { - parts: { - hope: { + parts: [ + { applyTo: healingTypes.hope.id, value: { custom: { @@ -358,7 +354,7 @@ export const defaultRestOptions = { } } } - } + ] } }, prepareWithFriends: { @@ -372,8 +368,8 @@ export const defaultRestOptions = { type: 'self' }, damage: { - parts: { - hope: { + parts: [ + { applyTo: healingTypes.hope.id, value: { custom: { @@ -382,7 +378,7 @@ export const defaultRestOptions = { } } } - } + ] } } }, @@ -409,8 +405,8 @@ export const defaultRestOptions = { type: 'friendly' }, damage: { - parts: { - hitPoints: { + parts: [ + { applyTo: healingTypes.hitPoints.id, value: { custom: { @@ -419,7 +415,7 @@ export const defaultRestOptions = { } } } - } + ] } } }, @@ -443,8 +439,8 @@ export const defaultRestOptions = { type: 'self' }, damage: { - parts: { - stress: { + parts: [ + { applyTo: healingTypes.stress.id, value: { custom: { @@ -453,7 +449,7 @@ export const defaultRestOptions = { } } } - } + ] } } }, @@ -478,8 +474,8 @@ export const defaultRestOptions = { type: 'friendly' }, damage: { - parts: { - armor: { + parts: [ + { applyTo: healingTypes.armor.id, value: { custom: { @@ -488,7 +484,7 @@ export const defaultRestOptions = { } } } - } + ] } } }, @@ -512,8 +508,8 @@ export const defaultRestOptions = { type: 'self' }, damage: { - parts: { - hope: { + parts: [ + { applyTo: healingTypes.hope.id, value: { custom: { @@ -522,7 +518,7 @@ export const defaultRestOptions = { } } } - } + ] } }, prepareWithFriends: { @@ -536,8 +532,8 @@ export const defaultRestOptions = { type: 'self' }, damage: { - parts: { - hope: { + parts: [ + { applyTo: healingTypes.hope.id, value: { custom: { @@ -546,7 +542,7 @@ export const defaultRestOptions = { } } } - } + ] } } }, @@ -958,102 +954,3 @@ export const sceneRangeMeasurementSetting = { label: 'Custom' } }; - -export const tagTeamRollTypes = { - trait: { - id: 'trait', - label: 'DAGGERHEART.CONFIG.TagTeamRollTypes.trait' - }, - ability: { - id: 'ability', - label: 'DAGGERHEART.CONFIG.TagTeamRollTypes.ability' - }, - damageAbility: { - id: 'damageAbility', - label: 'DAGGERHEART.CONFIG.TagTeamRollTypes.damageAbility' - } -}; - -export const baseActiveEffectModes = { - custom: { - id: 'custom', - priority: 0, - label: 'EFFECT.CHANGES.TYPES.custom' - }, - multiply: { - id: 'multiply', - priority: 10, - label: 'EFFECT.CHANGES.TYPES.multiply' - }, - add: { - id: 'add', - priority: 20, - label: 'EFFECT.CHANGES.TYPES.add' - }, - subtract: { - id: 'subtract', - priority: 20, - label: 'EFFECT.CHANGES.TYPES.subtract' - }, - downgrade: { - id: 'downgrade', - priority: 30, - label: 'EFFECT.CHANGES.TYPES.downgrade' - }, - upgrade: { - id: 'upgrade', - priority: 40, - label: 'EFFECT.CHANGES.TYPES.upgrade' - }, - override: { - id: 'override', - priority: 50, - label: 'EFFECT.CHANGES.TYPES.override' - } -}; - -export const activeEffectModes = { - armor: { - id: 'armor', - priority: 20, - label: 'TYPES.ActiveEffect.armor' - }, - ...baseActiveEffectModes -}; - -export const activeEffectArmorInteraction = { - none: { id: 'none', label: 'DAGGERHEART.CONFIG.ArmorInteraction.none.label' }, - active: { id: 'active', label: 'DAGGERHEART.CONFIG.ArmorInteraction.active.label' }, - inactive: { id: 'inactive', label: 'DAGGERHEART.CONFIG.ArmorInteraction.inactive.label' } -}; - -export const activeEffectDurations = { - temporary: { - id: 'temporary', - label: 'DAGGERHEART.CONFIG.ActiveEffectDuration.temporary' - }, - act: { - id: 'act', - label: 'DAGGERHEART.CONFIG.ActiveEffectDuration.act' - }, - scene: { - id: 'scene', - label: 'DAGGERHEART.CONFIG.ActiveEffectDuration.scene' - }, - shortRest: { - id: 'shortRest', - label: 'DAGGERHEART.CONFIG.ActiveEffectDuration.shortRest' - }, - longRest: { - id: 'longRest', - label: 'DAGGERHEART.CONFIG.ActiveEffectDuration.longRest' - }, - session: { - id: 'session', - label: 'DAGGERHEART.CONFIG.ActiveEffectDuration.session' - }, - custom: { - id: 'custom', - label: 'DAGGERHEART.CONFIG.ActiveEffectDuration.custom' - } -}; diff --git a/module/config/hooksConfig.mjs b/module/config/hooksConfig.mjs index 8d04be6d..61ba594c 100644 --- a/module/config/hooksConfig.mjs +++ b/module/config/hooksConfig.mjs @@ -1,5 +1,4 @@ export const hooksConfig = { effectDisplayToggle: 'DHEffectDisplayToggle', - lockedTooltipDismissed: 'DHLockedTooltipDismissed', - tagTeamStart: 'DHTagTeamRollStart' + lockedTooltipDismissed: 'DHLockedTooltipDismissed' }; diff --git a/module/config/itemConfig.mjs b/module/config/itemConfig.mjs index a3e785c3..77328987 100644 --- a/module/config/itemConfig.mjs +++ b/module/config/itemConfig.mjs @@ -14,8 +14,8 @@ export const armorFeatures = { type: 'hostile' }, damage: { - parts: { - stress: { + parts: [ + { applyTo: 'stress', value: { custom: { @@ -24,7 +24,7 @@ export const armorFeatures = { } } } - } + ] } } ] @@ -489,18 +489,15 @@ export const weaponFeatures = { description: 'DAGGERHEART.CONFIG.WeaponFeature.barrier.effects.barrier.description', img: 'icons/skills/melee/shield-block-bash-blue.webp', changes: [ + { + key: 'system.armorScore', + mode: 2, + value: 'ITEM.@system.tier + 1' + }, { key: 'system.evasion', mode: 2, value: '-1' - }, - { - key: 'Armor', - type: 'armor', - typeData: { - type: 'armor', - max: 'ITEM.@system.tier + 1' - } } ] } @@ -735,8 +732,8 @@ export const weaponFeatures = { type: 'hostile' }, damage: { - parts: { - stress: { + parts: [ + { applyTo: 'stress', value: { custom: { @@ -745,7 +742,7 @@ export const weaponFeatures = { } } } - } + ] } } ], @@ -792,6 +789,11 @@ export const weaponFeatures = { description: 'DAGGERHEART.CONFIG.WeaponFeature.doubleDuty.effects.doubleDuty.description', img: 'icons/skills/melee/sword-shield-stylized-white.webp', changes: [ + { + key: 'system.armorScore', + mode: 2, + value: '1' + }, { key: 'system.bonuses.damage.primaryWeapon.bonus', mode: 2, @@ -806,22 +808,6 @@ export const weaponFeatures = { type: 'withinRange' } } - }, - { - name: 'DAGGERHEART.CONFIG.WeaponFeature.doubleDuty.effects.doubleDuty.name', - description: 'DAGGERHEART.CONFIG.WeaponFeature.doubleDuty.effects.doubleDuty.description', - img: 'icons/skills/melee/sword-shield-stylized-white.webp', - changes: [ - { - key: 'Armor', - type: 'armor', - value: 0, - typeData: { - type: 'armor', - max: 1 - } - } - ] } ] }, @@ -928,8 +914,8 @@ export const weaponFeatures = { type: 'self' }, damage: { - parts: { - hitPoints: { + parts: [ + { applyTo: 'hitPoints', value: { custom: { @@ -938,7 +924,7 @@ export const weaponFeatures = { } } } - } + ] } } ] @@ -1205,13 +1191,9 @@ export const weaponFeatures = { img: 'icons/skills/melee/shield-block-gray-orange.webp', changes: [ { - key: 'Armor', - type: 'armor', - value: 0, - typeData: { - type: 'armor', - max: 'ITEM.@system.tier' - } + key: 'system.armorScore', + mode: 2, + value: 'ITEM.@system.tier' } ] } diff --git a/module/config/settingsConfig.mjs b/module/config/settingsConfig.mjs index 36892731..0b28f0ab 100644 --- a/module/config/settingsConfig.mjs +++ b/module/config/settingsConfig.mjs @@ -1,7 +1,3 @@ -export const keybindings = { - spotlight: 'DHSpotlight' -}; - export const menu = { Automation: { Name: 'GameSettingsAutomation', @@ -38,6 +34,7 @@ export const gameSettings = { LevelTiers: 'LevelTiers', Countdowns: 'Countdowns', LastMigrationVersion: 'LastMigrationVersion', + TagTeamRoll: 'TagTeamRoll', SpotlightRequestQueue: 'SpotlightRequestQueue', CompendiumBrowserSettings: 'CompendiumBrowserSettings' }; diff --git a/module/data/_module.mjs b/module/data/_module.mjs index 43ff7807..52fa689e 100644 --- a/module/data/_module.mjs +++ b/module/data/_module.mjs @@ -1,9 +1,9 @@ export { default as DhCombat } from './combat.mjs'; export { default as DhCombatant } from './combatant.mjs'; +export { default as DhTagTeamRoll } from './tagTeamRoll.mjs'; export { default as DhRollTable } from './rollTable.mjs'; export { default as RegisteredTriggers } from './registeredTriggers.mjs'; export { default as CompendiumBrowserSettings } from './compendiumBrowserSettings.mjs'; -export { default as TagTeamData } from './tagTeamData.mjs'; export * as countdowns from './countdowns.mjs'; export * as actions from './action/_module.mjs'; diff --git a/module/data/action/attackAction.mjs b/module/data/action/attackAction.mjs index a2d47309..60112c40 100644 --- a/module/data/action/attackAction.mjs +++ b/module/data/action/attackAction.mjs @@ -26,23 +26,23 @@ export default class DHAttackAction extends DHDamageAction { return { value: { multiplier: 'prof', - dice: this.item?.system?.attack.damage.parts.hitPoints.value.dice, - bonus: this.item?.system?.attack.damage.parts.hitPoints.value.bonus ?? 0 + dice: this.item?.system?.attack.damage.parts[0].value.dice, + bonus: this.item?.system?.attack.damage.parts[0].value.bonus ?? 0 }, - type: this.item?.system?.attack.damage.parts.hitPoints.type, + type: this.item?.system?.attack.damage.parts[0].type, base: true }; } get damageFormula() { - const hitPointsPart = this.damage.parts.hitPoints; + const hitPointsPart = this.damage.parts.find(x => x.applyTo === CONFIG.DH.GENERAL.healingTypes.hitPoints.id); if (!hitPointsPart) return '0'; return hitPointsPart.value.getFormula(); } get altDamageFormula() { - const hitPointsPart = this.damage.parts.hitPoints; + const hitPointsPart = this.damage.parts.find(x => x.applyTo === CONFIG.DH.GENERAL.healingTypes.hitPoints.id); if (!hitPointsPart) return '0'; return hitPointsPart.valueAlt.getFormula(); @@ -50,8 +50,9 @@ export default class DHAttackAction extends DHDamageAction { async use(event, options) { const result = await super.use(event, options); + if (!result.message) return; - if (result.message?.system.action.roll?.type === 'attack') { + if (result.message.system.action.roll?.type === 'attack') { const { updateCountdowns } = game.system.api.applications.ui.DhCountdowns; await updateCountdowns(CONFIG.DH.GENERAL.countdownProgressionTypes.characterAttack.id); } diff --git a/module/data/action/baseAction.mjs b/module/data/action/baseAction.mjs index 1f75d382..992e1714 100644 --- a/module/data/action/baseAction.mjs +++ b/module/data/action/baseAction.mjs @@ -207,10 +207,10 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel * @param {Event} event Event from the button used to trigger the Action * @returns {object} */ - async use(event, configOptions = {}) { + async use(event) { if (!this.actor) throw new Error("An Action can't be used outside of an Actor context."); - let config = this.prepareConfig(event, configOptions); + let config = this.prepareConfig(event); if (!config) return; config.effects = await game.system.api.data.actions.actionsTypes.base.getEffects(this.actor, this.item); @@ -231,7 +231,7 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel if (Hooks.call(`${CONFIG.DH.id}.postUseAction`, this, config) === false) return; - if (this.chatDisplay && !config.skips.createMessage && !config.actionChatMessageHandled) await this.toChat(); + if (this.chatDisplay && !config.actionChatMessageHandled) await this.toChat(); return config; } @@ -241,7 +241,7 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel * @param {Event} event Event from the button used to trigger the Action * @returns {object} */ - prepareBaseConfig(event, configOptions = {}) { + prepareBaseConfig(event) { const isActor = this.item instanceof CONFIG.Actor.documentClass; const actionTitle = game.i18n.localize(this.name); const itemTitle = isActor || this.item.name === actionTitle ? '' : `${this.item.name} - `; @@ -264,20 +264,11 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel hasSave: this.hasSave, onSave: this.save?.damageMod, isDirect: !!this.damage?.direct, - selectedMessageMode: game.settings.get('core', 'messageMode'), + selectedRollMode: game.settings.get('core', 'rollMode'), data: this.getRollData(), evaluate: this.hasRoll, resourceUpdates: new ResourceUpdateMap(this.actor), - targetUuid: this.targetUuid, - ...configOptions, - skips: { - resources: false, - triggers: false, - createMessage: false, - updateCountdowns: false, - reaction: false, - ...(configOptions.skips ?? {}) - } + targetUuid: this.targetUuid }; DHBaseAction.applyKeybindings(config); @@ -289,8 +280,8 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel * @param {Event} event Event from the button used to trigger the Action * @returns {object} */ - prepareConfig(event, configOptions = {}) { - const config = this.prepareBaseConfig(event, configOptions); + 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; } @@ -306,19 +297,17 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel static async getEffects(actor, effectParent) { if (!actor) return []; - return Array.from(await actor.allApplicableEffects({ noTransferArmor: true, noSelfArmor: true })).filter( - effect => { - /* Effects on weapons only ever apply for the weapon itself */ - if (effect.parent.type === 'weapon') { - /* Unless they're secondary - then they apply only to other primary weapons */ - if (effect.parent.system.secondary) { - if (effectParent?.type !== 'weapon' || effectParent?.system.secondary) return false; - } else if (effectParent?.id !== effect.parent.id) return false; - } - - return !effect.isSuppressed; + return Array.from(await actor.allApplicableEffects()).filter(effect => { + /* Effects on weapons only ever apply for the weapon itself */ + if (effect.parent.type === 'weapon') { + /* Unless they're secondary - then they apply only to other primary weapons */ + if (effect.parent.system.secondary) { + if (effectParent?.type !== 'weapon' || effectParent?.system.secondary) return false; + } else if (effectParent?.id !== effect.parent.id) return false; } - ); + + return !effect.isSuppressed; + }); } /** @@ -337,7 +326,6 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel * @param {boolean} successCost */ async consume(config, successCost = false) { - config.resourceUpdates = new ResourceUpdateMap(config.actionActor); await this.workflow.get('cost')?.execute(config, successCost); await this.workflow.get('uses')?.execute(config, successCost); @@ -366,11 +354,11 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel } get hasDamage() { - return Boolean(Object.keys(this.damage?.parts ?? {}).length) && this.type !== 'healing'; + return this.damage?.parts?.length && this.type !== 'healing'; } get hasHealing() { - return Boolean(Object.keys(this.damage?.parts ?? {}).length) && this.type === 'healing'; + return this.damage?.parts?.length && this.type === 'healing'; } get hasSave() { @@ -390,15 +378,6 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel return tags; } - - static migrateData(source) { - if (source.damage?.parts && Array.isArray(source.damage.parts)) { - source.damage.parts = source.damage.parts.reduce((acc, part) => { - acc[part.applyTo] = part; - return acc; - }, {}); - } - } } export class ResourceUpdateMap extends Map { diff --git a/module/data/action/beastformAction.mjs b/module/data/action/beastformAction.mjs index 8855b122..657cfde2 100644 --- a/module/data/action/beastformAction.mjs +++ b/module/data/action/beastformAction.mjs @@ -2,4 +2,84 @@ import DHBaseAction from './baseAction.mjs'; export default class DhBeastformAction extends DHBaseAction { static extraSchemas = [...super.extraSchemas, 'beastform']; + + /* async use(event, options) { + const beastformConfig = this.prepareBeastformConfig(); + + const abort = await this.handleActiveTransformations(); + if (abort) return; + + const calcCosts = game.system.api.fields.ActionFields.CostField.calcCosts.call(this, this.cost); + const hasCost = game.system.api.fields.ActionFields.CostField.hasCost.call(this, calcCosts); + if (!hasCost) { + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.insufficientResources')); + return; + } + + const { selected, evolved, hybrid } = await BeastformDialog.configure(beastformConfig, this.item); + if (!selected) return; + + const result = await super.use(event, options); + if (!result) return; + + await this.transform(selected, evolved, hybrid); + } + + prepareBeastformConfig(config) { + 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; + + return { + tierLimit: this.beastform.tierAccess.exact ?? actorTier + }; + } + + 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; + } + + if (evolvedData?.form) { + const evolvedForm = selectedForm.effects.find(x => x.type === 'beastform'); + if (!evolvedForm) { + ui.notifications.error('DAGGERHEART.UI.Notifications.beastformMissingEffect'); + return; + } + + 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]); + } + + 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/activeEffect/_module.mjs b/module/data/activeEffect/_module.mjs index 3c933a9c..1a50088a 100644 --- a/module/data/activeEffect/_module.mjs +++ b/module/data/activeEffect/_module.mjs @@ -1,7 +1,6 @@ import BaseEffect from './baseEffect.mjs'; import BeastformEffect from './beastformEffect.mjs'; import HordeEffect from './hordeEffect.mjs'; -export { changeTypes, changeEffects } from './changeTypes/_module.mjs'; export { BaseEffect, BeastformEffect, HordeEffect }; diff --git a/module/data/activeEffect/baseEffect.mjs b/module/data/activeEffect/baseEffect.mjs index bac50c56..ea74531d 100644 --- a/module/data/activeEffect/baseEffect.mjs +++ b/module/data/activeEffect/baseEffect.mjs @@ -12,50 +12,11 @@ * "Anything that uses another data model value as its value": +1 - Effects that increase traits have to be calculated first at Base priority. (EX: Raise evasion by half your agility) */ -import { getScrollTextData } from '../../helpers/utils.mjs'; -import { changeTypes } from './_module.mjs'; - -export default class BaseEffect extends foundry.data.ActiveEffectTypeDataModel { +export default class BaseEffect extends foundry.abstract.TypeDataModel { static defineSchema() { const fields = foundry.data.fields; - const baseChanges = Object.keys(CONFIG.DH.GENERAL.baseActiveEffectModes).reduce((r, type) => { - r[type] = new fields.SchemaField({ - key: new fields.StringField({ required: true }), - type: new fields.StringField({ - required: true, - choices: [type], - initial: type, - validate: BaseEffect.#validateType - }), - value: new fields.AnyField({ - required: true, - nullable: true, - serializable: true, - initial: '' - }), - phase: new fields.StringField({ required: true, blank: false, initial: 'initial' }), - priority: new fields.NumberField() - }); - return r; - }, {}); - return { - ...super.defineSchema(), - changes: new fields.ArrayField( - new fields.TypedSchemaField( - { ...changeTypes, ...baseChanges }, - { initial: baseChanges.add.getInitialValue() } - ) - ), - duration: new fields.SchemaField({ - type: new fields.StringField({ - choices: CONFIG.DH.GENERAL.activeEffectDurations, - blank: true, - label: 'DAGGERHEART.GENERAL.type' - }), - description: new fields.HTMLField({ label: 'DAGGERHEART.GENERAL.description' }) - }), rangeDependence: new fields.SchemaField({ enabled: new fields.BooleanField({ required: true, @@ -80,57 +41,10 @@ export default class BaseEffect extends foundry.data.ActiveEffectTypeDataModel { initial: CONFIG.DH.GENERAL.range.melee.id, label: 'DAGGERHEART.GENERAL.range' }) - }), - stacking: new fields.SchemaField( - { - value: new fields.NumberField({ - initial: 1, - min: 1, - integer: true, - nullable: false, - label: 'DAGGERHEART.GENERAL.value' - }), - max: new fields.NumberField({ integer: true, label: 'DAGGERHEART.GENERAL.max' }) - }, - { nullable: true, initial: null } - ) + }) }; } - /** - * Validate that an {@link EffectChangeData#type} string is well-formed. - * @param {string} type The string to be validated - * @returns {true} - * @throws {Error} An error if the type string is malformed - */ - static #validateType(type) { - if (type.length < 3) throw new Error('must be at least three characters long'); - if (!/^custom\.-?\d+$/.test(type) && !type.split('.').every(s => /^[a-z0-9]+$/i.test(s))) { - throw new Error( - 'A change type must either be a sequence of dot-delimited, alpha-numeric substrings or of the form' + - ' "custom.{number}"' - ); - } - return true; - } - - get isSuppressed() { - for (const change of this.changes) { - if (change.isSuppressed) return true; - } - } - - get armorChange() { - return this.changes.find(x => x.type === CONFIG.DH.GENERAL.activeEffectModes.armor.id); - } - - get armorData() { - const armorChange = this.armorChange; - if (!armorChange) return null; - - return armorChange.getArmorData(); - } - static getDefaultObject() { return { name: 'New Effect', @@ -150,32 +64,4 @@ export default class BaseEffect extends foundry.data.ActiveEffectTypeDataModel { } }; } - - async _preUpdate(changed, options, userId) { - const allowed = await super._preUpdate(changed, options, userId); - if (allowed === false) return false; - - const autoSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation); - if ( - autoSettings.resourceScrollTexts && - this.parent.actor?.type === 'character' && - this.parent.actor.system.resources.armor - ) { - const armorEffect = changed.system?.changes?.find(x => x.type === 'armor'); - const newArmorTotal = - armorEffect?.value?.current + (this.parent.actor.system.armor?.system?.armor?.current ?? 0); - - if (armorEffect && newArmorTotal !== this.parent.actor.system.armorScore.value) { - const armorData = getScrollTextData(this.parent.actor, { value: newArmorTotal }, 'armor'); - options.scrollingTextData = [armorData]; - } - } - } - - _onUpdate(changed, options, userId) { - super._onUpdate(changed, options, userId); - - if (this.parent.actor && options.scrollingTextData) - this.parent.actor.queueScrollText(options.scrollingTextData); - } } diff --git a/module/data/activeEffect/beastformEffect.mjs b/module/data/activeEffect/beastformEffect.mjs index 128c0c52..effc3ba3 100644 --- a/module/data/activeEffect/beastformEffect.mjs +++ b/module/data/activeEffect/beastformEffect.mjs @@ -5,7 +5,6 @@ export default class BeastformEffect extends BaseEffect { static defineSchema() { const fields = foundry.data.fields; return { - ...super.defineSchema(), characterTokenData: new fields.SchemaField({ usesDynamicToken: new fields.BooleanField({ initial: false }), tokenImg: new fields.FilePathField({ @@ -100,7 +99,7 @@ export default class BeastformEffect extends BaseEffect { token.flags.daggerheart?.beastformSubjectTexture ?? this.characterTokenData.tokenRingImg } }, - 'flags.daggerheart': { beastformTokenImg: _del, beastformSubjectTexture: _del } + 'flags.daggerheart': { '-=beastformTokenImg': null, '-=beastformSubjectTexture': null } }; }; diff --git a/module/data/activeEffect/changeTypes/_module.mjs b/module/data/activeEffect/changeTypes/_module.mjs deleted file mode 100644 index cf872304..00000000 --- a/module/data/activeEffect/changeTypes/_module.mjs +++ /dev/null @@ -1,9 +0,0 @@ -import Armor from './armor.mjs'; - -export const changeEffects = { - armor: Armor.changeEffect -}; - -export const changeTypes = { - armor: Armor -}; diff --git a/module/data/activeEffect/changeTypes/armor.mjs b/module/data/activeEffect/changeTypes/armor.mjs deleted file mode 100644 index f400d41b..00000000 --- a/module/data/activeEffect/changeTypes/armor.mjs +++ /dev/null @@ -1,206 +0,0 @@ -import { itemAbleRollParse } from '../../../helpers/utils.mjs'; - -const fields = foundry.data.fields; - -export default class ArmorChange extends foundry.abstract.DataModel { - static defineSchema() { - return { - type: new fields.StringField({ required: true, choices: ['armor'], initial: 'armor' }), - priority: new fields.NumberField(), - phase: new fields.StringField({ required: true, blank: false, initial: 'initial' }), - value: new fields.SchemaField({ - current: new fields.NumberField({ integer: true, min: 0, initial: 0 }), - max: new fields.StringField({ - required: true, - nullable: false, - initial: '1', - label: 'DAGGERHEART.GENERAL.max' - }), - damageThresholds: new fields.SchemaField( - { - major: new fields.StringField({ - initial: '0', - label: 'DAGGERHEART.GENERAL.DamageThresholds.majorThreshold' - }), - severe: new fields.StringField({ - initial: '0', - label: 'DAGGERHEART.GENERAL.DamageThresholds.severeThreshold' - }) - }, - { nullable: true, initial: null } - ), - interaction: new fields.StringField({ - required: true, - choices: CONFIG.DH.GENERAL.activeEffectArmorInteraction, - initial: CONFIG.DH.GENERAL.activeEffectArmorInteraction.none.id, - label: 'DAGGERHEART.EFFECTS.ChangeTypes.armor.FIELDS.interaction.label', - hint: 'DAGGERHEART.EFFECTS.ChangeTypes.armor.FIELDS.interaction.hint' - }) - }) - }; - } - - static changeEffect = { - label: 'Armor', - defaultPriority: 20, - handler: (actor, change, _options, _field, replacementData) => { - const parsedMax = itemAbleRollParse(change.value.max, actor, change.effect.parent); - game.system.api.documents.DhActiveEffect.applyChange( - actor, - { - ...change, - key: 'system.armorScore.value', - type: CONFIG.DH.GENERAL.activeEffectModes.add.id, - value: change.value.current - }, - replacementData - ); - game.system.api.documents.DhActiveEffect.applyChange( - actor, - { - ...change, - key: 'system.armorScore.max', - type: CONFIG.DH.GENERAL.activeEffectModes.add.id, - value: parsedMax - }, - replacementData - ); - - if (change.value.damageThresholds) { - const getThresholdValue = value => { - const parsed = itemAbleRollParse(value, actor, change.effect.parent); - const roll = new Roll(parsed).evaluateSync(); - return roll ? (roll.isDeterministic ? roll.total : null) : null; - }; - const major = getThresholdValue(change.value.damageThresholds.major); - const severe = getThresholdValue(change.value.damageThresholds.severe); - - if (major) { - game.system.api.documents.DhActiveEffect.applyChange( - actor, - { - ...change, - key: 'system.damageThresholds.major', - type: CONFIG.DH.GENERAL.activeEffectModes.override.id, - priority: 50, - value: major - }, - replacementData - ); - } - - if (severe) { - game.system.api.documents.DhActiveEffect.applyChange( - actor, - { - ...change, - key: 'system.damageThresholds.severe', - type: CONFIG.DH.GENERAL.activeEffectModes.override.id, - priority: 50, - value: severe - }, - replacementData - ); - } - } - - return {}; - }, - render: null - }; - - get isSuppressed() { - switch (this.value.interaction) { - case CONFIG.DH.GENERAL.activeEffectArmorInteraction.active.id: - return !this.parent.parent?.actor.system.armor; - case CONFIG.DH.GENERAL.activeEffectArmorInteraction.inactive.id: - return Boolean(this.parent.parent?.actor.system.armor); - default: - return false; - } - } - - static getInitialValue() { - return { - type: CONFIG.DH.GENERAL.activeEffectModes.armor.id, - value: { - current: 0, - max: 0 - }, - phase: 'initial', - priority: 20 - }; - } - - static getDefaultArmorEffect() { - return { - name: game.i18n.localize('DAGGERHEART.EFFECTS.ChangeTypes.armor.newArmorEffect'), - img: 'icons/equipment/chest/breastplate-helmet-metal.webp', - system: { - changes: [ArmorChange.getInitialValue()] - } - }; - } - - /* Helpers */ - - getArmorData() { - const actor = this.parent.parent?.actor?.type === 'character' ? this.parent.parent.actor : null; - const maxParse = actor ? itemAbleRollParse(this.value.max, actor, this.parent.parent.parent) : null; - const maxRoll = maxParse ? new Roll(maxParse).evaluateSync() : null; - const maxEvaluated = maxRoll ? (maxRoll.isDeterministic ? maxRoll.total : null) : null; - - return { - current: this.value.current, - max: maxEvaluated ?? this.value.max - }; - } - - async updateArmorMax(newMax) { - const newChanges = [ - ...this.parent.changes.map(change => ({ - ...change, - value: - change.type === 'armor' - ? { - ...change.value, - current: Math.min(change.value.current, newMax), - max: newMax - } - : change.value - })) - ]; - await this.parent.parent.update({ 'system.changes': newChanges }); - } - - static orderEffectsForAutoChange(armorEffects, increasing) { - const getEffectWeight = effect => { - switch (effect.parent.type) { - case 'class': - case 'subclass': - case 'ancestry': - case 'community': - case 'feature': - case 'domainCard': - return 2; - case 'armor': - return 3; - case 'loot': - case 'consumable': - return 4; - case 'weapon': - return 5; - case 'character': - return 6; - default: - return 1; - } - }; - - return armorEffects - .filter(x => !x.disabled && !x.isSuppressed) - .sort((a, b) => - increasing ? getEffectWeight(b) - getEffectWeight(a) : getEffectWeight(a) - getEffectWeight(b) - ); - } -} diff --git a/module/data/actor/adversary.mjs b/module/data/actor/adversary.mjs index 73673896..2053ac99 100644 --- a/module/data/actor/adversary.mjs +++ b/module/data/actor/adversary.mjs @@ -85,14 +85,14 @@ export default class DhpAdversary extends DhCreature { type: 'attack' }, damage: { - parts: { - hitPoints: { + parts: [ + { type: ['physical'], value: { multiplier: 'flat' } } - } + ] } } }), @@ -265,12 +265,12 @@ export default class DhpAdversary extends DhCreature { } // Update damage in item actions - // Parse damage, and convert all formula matches in the descriptions to the new damage for (const action of Object.values(item.system.actions)) { + if (!action.damage) continue; + + // Parse damage, and convert all formula matches in the descriptions to the new damage try { const result = this.#adjustActionDamage(action, { ...damageMeta, type: 'action' }); - if (!result) continue; - for (const { previousFormula, formula } of Object.values(result)) { const oldFormulaRegexp = new RegExp( previousFormula.replace(' ', '').replace('+', '(?:\\s)?\\+(?:\\s)?') @@ -372,14 +372,16 @@ export default class DhpAdversary extends DhCreature { /** * Updates damage to reflect a specific value. * @throws if damage structure is invalid for conversion - * @returns the converted formula and value as a simplified term, or null if it doesn't deal HP damage + * @returns the converted formula and value as a simplified term */ #adjustActionDamage(action, damageMeta) { - if (!action.damage?.parts.hitPoints) return null; + // The current algorithm only returns a value if there is a single damage part + const hpDamageParts = action.damage.parts.filter(d => d.applyTo === 'hitPoints'); + if (hpDamageParts.length !== 1) throw new Error('incorrect number of hp parts'); const result = {}; for (const property of ['value', 'valueAlt']) { - const data = action.damage.parts.hitPoints[property]; + const data = hpDamageParts[0][property]; const previousFormula = data.custom.enabled ? data.custom.formula : [data.flatMultiplier ? `${data.flatMultiplier}${data.dice}` : 0, data.bonus ?? 0] diff --git a/module/data/actor/base.mjs b/module/data/actor/base.mjs index 89ba5db2..e2f910a0 100644 --- a/module/data/actor/base.mjs +++ b/module/data/actor/base.mjs @@ -189,6 +189,21 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel { return true; } + async _preDelete() { + /* Clear all partyMembers from tagTeam setting.*/ + /* Revisit this when tagTeam is improved for many parties */ + if (this.parent.parties.size > 0) { + const tagTeam = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll); + await tagTeam.updateSource({ + initiator: this.parent.id === tagTeam.initiator ? null : tagTeam.initiator, + members: Object.keys(tagTeam.members).find(x => x === this.parent.id) + ? { [`-=${this.parent.id}`]: null } + : {} + }); + await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll, tagTeam); + } + } + async _preUpdate(changes, options, userId) { const allowed = await super._preUpdate(changes, options, userId); if (allowed === false) return; diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs index 2878ad0c..cde7d280 100644 --- a/module/data/actor/character.mjs +++ b/module/data/actor/character.mjs @@ -6,7 +6,6 @@ import DhCreature from './creature.mjs'; import { attributeField, stressDamageReductionRule, bonusField } from '../fields/actorField.mjs'; import { ActionField } from '../fields/actionField.mjs'; import DHCharacterSettings from '../../applications/sheets-configs/character-settings.mjs'; -import { getArmorSources } from '../../helpers/utils.mjs'; export default class DhCharacter extends DhCreature { /**@override */ @@ -42,16 +41,17 @@ export default class DhCharacter extends DhCreature { label: 'DAGGERHEART.GENERAL.proficiency' }), evasion: new fields.NumberField({ initial: 0, integer: true, label: 'DAGGERHEART.GENERAL.evasion' }), + armorScore: new fields.NumberField({ integer: true, initial: 0, label: 'DAGGERHEART.GENERAL.armorScore' }), damageThresholds: new fields.SchemaField({ - major: new fields.NumberField({ - integer: true, - initial: 0, - label: 'DAGGERHEART.GENERAL.DamageThresholds.majorThreshold' - }), severe: new fields.NumberField({ integer: true, initial: 0, label: 'DAGGERHEART.GENERAL.DamageThresholds.severeThreshold' + }), + major: new fields.NumberField({ + integer: true, + initial: 0, + label: 'DAGGERHEART.GENERAL.DamageThresholds.majorThreshold' }) }), experiences: new fields.TypedObjectField( @@ -96,8 +96,8 @@ export default class DhCharacter extends DhCreature { trait: 'strength' }, damage: { - parts: { - hitPoints: { + parts: [ + { type: ['physical'], value: { custom: { @@ -106,7 +106,7 @@ export default class DhCharacter extends DhCreature { } } } - } + ] } } }), @@ -465,101 +465,6 @@ export default class DhCharacter extends DhCreature { } } - async updateArmorValue({ value: armorChange = 0, clear = false }) { - if (armorChange === 0 && !clear) return; - - const increasing = armorChange >= 0; - let remainingChange = Math.abs(armorChange); - const orderedSources = getArmorSources(this.parent).filter(s => !s.disabled); - - const handleArmorData = (embeddedUpdates, doc, armorData) => { - let usedArmorChange = 0; - if (clear) { - usedArmorChange -= armorData.current; - } else { - if (increasing) { - const remainingArmor = armorData.max - armorData.current; - usedArmorChange = Math.min(remainingChange, remainingArmor); - remainingChange -= usedArmorChange; - } else { - const changeChange = Math.min(armorData.current, remainingChange); - usedArmorChange -= changeChange; - remainingChange -= changeChange; - } - } - - if (!usedArmorChange) return usedArmorChange; - else { - if (!embeddedUpdates[doc.id]) embeddedUpdates[doc.id] = { doc: doc, updates: [] }; - - return usedArmorChange; - } - }; - - const armorUpdates = []; - const effectUpdates = []; - for (const { document: armorSource } of orderedSources) { - const usedArmorChange = handleArmorData( - armorSource.type === 'armor' ? armorUpdates : effectUpdates, - armorSource.parent, - armorSource.type === 'armor' ? armorSource.system.armor : armorSource.system.armorData - ); - if (!usedArmorChange) continue; - - if (armorSource.type === 'armor') { - armorUpdates[armorSource.parent.id].updates.push({ - '_id': armorSource.id, - 'system.armor.current': armorSource.system.armor.current + usedArmorChange - }); - } else { - effectUpdates[armorSource.parent.id].updates.push({ - '_id': armorSource.id, - 'system.changes': armorSource.system.changes.map(change => ({ - ...change, - value: - change.type === 'armor' - ? { - ...change.value, - current: armorSource.system.armorChange.value.current + usedArmorChange - } - : change.value - })) - }); - } - - if (remainingChange === 0 && !clear) break; - } - - const armorUpdateValues = Object.values(armorUpdates); - for (const [index, { doc, updates }] of armorUpdateValues.entries()) - await doc.updateEmbeddedDocuments('Item', updates, { render: index === armorUpdateValues.length - 1 }); - - const effectUpdateValues = Object.values(effectUpdates); - for (const [index, { doc, updates }] of effectUpdateValues.entries()) - await doc.updateEmbeddedDocuments('ActiveEffect', updates, { - render: index === effectUpdateValues.length - 1 - }); - } - - async updateArmorEffectValue({ uuid, value }) { - const source = await foundry.utils.fromUuid(uuid); - if (source.type === 'armor') { - await source.update({ - 'system.armor.current': source.system.armor.current + value - }); - } else { - const effectValue = source.system.armorChange.value; - await source.update({ - 'system.changes': [ - { - ...source.system.armorChange, - value: { ...effectValue, current: effectValue.current + value } - } - ] - }); - } - } - get sheetLists() { const ancestryFeatures = [], communityFeatures = [], @@ -683,10 +588,6 @@ export default class DhCharacter extends DhCreature { prepareBaseData() { super.prepareBaseData(); - this.armorScore = { - max: this.armor?.system.armor.max ?? 0, - value: this.armor?.system.armor.current ?? 0 - }; this.evasion += this.class.value?.system?.evasion ?? 0; const currentLevel = this.levelData.level.current; @@ -736,12 +637,14 @@ export default class DhCharacter extends DhCreature { } } + const armor = this.armor; + this.armorScore = armor ? armor.system.baseScore : 0; this.damageThresholds = { - major: this.armor - ? this.armor.system.baseThresholds.major + this.levelData.level.current + major: armor + ? armor.system.baseThresholds.major + this.levelData.level.current : this.levelData.level.current, - severe: this.armor - ? this.armor.system.baseThresholds.severe + this.levelData.level.current + severe: armor + ? armor.system.baseThresholds.severe + this.levelData.level.current : this.levelData.level.current * 2 }; @@ -774,12 +677,13 @@ export default class DhCharacter extends DhCreature { this.attack.roll.trait = this.rules.attack.roll.trait ?? this.attack.roll.trait; this.resources.armor = { - ...this.armorScore, label: 'DAGGERHEART.GENERAL.armor', + value: this.armor?.system?.marks?.value ?? 0, + max: this.armorScore, isReversed: true }; - this.attack.damage.parts.hitPoints.value.custom.formula = `@prof${this.basicAttackDamageDice}${this.rules.attack.damage.bonus ? ` + ${this.rules.attack.damage.bonus}` : ''}`; + this.attack.damage.parts[0].value.custom.formula = `@prof${this.basicAttackDamageDice}${this.rules.attack.damage.bonus ? ` + ${this.rules.attack.damage.bonus}` : ''}`; } getRollData() { diff --git a/module/data/actor/companion.mjs b/module/data/actor/companion.mjs index 81d0aa8a..7a8f0e64 100644 --- a/module/data/actor/companion.mjs +++ b/module/data/actor/companion.mjs @@ -81,15 +81,15 @@ export default class DhCompanion extends DhCreature { bonus: 0 }, damage: { - parts: { - hitPoints: { + parts: [ + { type: ['physical'], value: { dice: 'd6', multiplier: 'prof' } } - } + ] } } }), @@ -135,9 +135,7 @@ export default class DhCompanion extends DhCreature { break; case 'vicious': if (selection.data[0] === 'damage') { - this.attack.damage.parts.hitPoints.value.dice = adjustDice( - this.attack.damage.parts.hitPoints.value.dice - ); + this.attack.damage.parts[0].value.dice = adjustDice(this.attack.damage.parts[0].value.dice); } else { this.attack.range = adjustRange(this.attack.range).id; } diff --git a/module/data/actor/environment.mjs b/module/data/actor/environment.mjs index e06f038c..0aaf8eb0 100644 --- a/module/data/actor/environment.mjs +++ b/module/data/actor/environment.mjs @@ -75,6 +75,10 @@ export default class DhEnvironment extends BaseDataActor { ); scene.update({ 'flags.daggerheart.sceneEnvironments': newSceneEnvironments }).then(() => { Hooks.callAll(socketEvent.Refresh, { refreshType: RefreshType.Scene }); + game.socket.emit(`system.${CONFIG.DH.id}`, { + action: socketEvent.Refresh, + data: { refreshType: RefreshType.TagTeamRoll } + }); }); } } diff --git a/module/data/actor/party.mjs b/module/data/actor/party.mjs index 2c797803..236d65db 100644 --- a/module/data/actor/party.mjs +++ b/module/data/actor/party.mjs @@ -1,6 +1,5 @@ import BaseDataActor from './base.mjs'; import ForeignDocumentUUIDArrayField from '../fields/foreignDocumentUUIDArrayField.mjs'; -import TagTeamData from '../tagTeamData.mjs'; export default class DhParty extends BaseDataActor { /**@inheritdoc */ @@ -15,8 +14,7 @@ export default class DhParty extends BaseDataActor { handfuls: new fields.NumberField({ initial: 1, integer: true }), bags: new fields.NumberField({ initial: 0, integer: true }), chests: new fields.NumberField({ initial: 0, integer: true }) - }), - tagTeam: new fields.EmbeddedDataField(TagTeamData) + }) }; } @@ -42,6 +40,23 @@ export default class DhParty extends BaseDataActor { } } + async _preDelete() { + /* Clear all partyMembers from tagTeam setting.*/ + /* Revisit this when tagTeam is improved for many parties */ + const tagTeam = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll); + await tagTeam.updateSource({ + initiator: this.partyMembers.some(x => x.id === tagTeam.initiator) ? null : tagTeam.initiator, + members: Object.keys(tagTeam.members).reduce((acc, key) => { + if (this.partyMembers.find(x => x.id === key)) { + acc[`-=${key}`] = null; + } + + return acc; + }, {}) + }); + await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll, tagTeam); + } + _onDelete(options, userId) { super._onDelete(options, userId); diff --git a/module/data/fields/_module.mjs b/module/data/fields/_module.mjs index 930814e2..2a8ba454 100644 --- a/module/data/fields/_module.mjs +++ b/module/data/fields/_module.mjs @@ -1,7 +1,7 @@ export { ActionCollection } from './actionField.mjs'; -export { default as IterableTypedObjectField } from './iterableTypedObjectField.mjs'; export { default as FormulaField } from './formulaField.mjs'; export { default as ForeignDocumentUUIDField } from './foreignDocumentUUIDField.mjs'; export { default as ForeignDocumentUUIDArrayField } from './foreignDocumentUUIDArrayField.mjs'; export { default as TriggerField } from './triggerField.mjs'; +export { default as MappingField } from './mappingField.mjs'; export * as ActionFields from './action/_module.mjs'; diff --git a/module/data/fields/action/damageField.mjs b/module/data/fields/action/damageField.mjs index b7ef852e..6439344b 100644 --- a/module/data/fields/action/damageField.mjs +++ b/module/data/fields/action/damageField.mjs @@ -1,6 +1,5 @@ import FormulaField from '../formulaField.mjs'; import { setsEqual } from '../../../helpers/utils.mjs'; -import IterableTypedObjectField from '../iterableTypedObjectField.mjs'; const fields = foundry.data.fields; @@ -13,7 +12,7 @@ export default class DamageField extends fields.SchemaField { /** @inheritDoc */ constructor(options, context = {}) { const damageFields = { - parts: new IterableTypedObjectField(DHDamageData), + parts: new fields.ArrayField(new fields.EmbeddedDataField(DHDamageData)), includeBase: new fields.BooleanField({ initial: false, label: 'DAGGERHEART.ACTIONS.Settings.includeBase.label' @@ -50,9 +49,9 @@ export default class DamageField extends fields.SchemaField { formulas = DamageField.formatFormulas.call(this, formulas, config); const damageConfig = { - dialog: {}, ...config, roll: formulas, + dialog: {}, data: this.getRollData() }; delete damageConfig.evaluate; diff --git a/module/data/fields/action/effectsField.mjs b/module/data/fields/action/effectsField.mjs index 9a4ffc31..6afd470b 100644 --- a/module/data/fields/action/effectsField.mjs +++ b/module/data/fields/action/effectsField.mjs @@ -27,7 +27,7 @@ export default class EffectsField extends fields.ArrayField { 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 && !config.skips.createMessage) { + if (!message) { const roll = new CONFIG.Dice.daggerheart.DHRoll(''); roll._evaluated = true; message = config.message = await CONFIG.Dice.daggerheart.DHRoll.toMessage(roll, config); @@ -106,11 +106,22 @@ export default class EffectsField extends fields.ArrayField { } /** - * Apply an Effect to a target + * 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?.() ?? effect), disabled: false, diff --git a/module/data/fields/action/saveField.mjs b/module/data/fields/action/saveField.mjs index 0629353e..c9030036 100644 --- a/module/data/fields/action/saveField.mjs +++ b/module/data/fields/action/saveField.mjs @@ -38,7 +38,7 @@ export default class SaveField extends fields.SchemaField { if (!config.hasSave) return; let message = config.message ?? ui.chat.collection.get(config.parent?._id); - if (!message && !config.skips.createMessage) { + if (!message) { const roll = new CONFIG.Dice.daggerheart.DHRoll(''); roll._evaluated = true; message = config.message = await CONFIG.Dice.daggerheart.DHRoll.toMessage(roll, config); diff --git a/module/data/fields/actionField.mjs b/module/data/fields/actionField.mjs index ffdc25cd..89c3c287 100644 --- a/module/data/fields/actionField.mjs +++ b/module/data/fields/actionField.mjs @@ -1,5 +1,6 @@ import DHActionConfig from '../../applications/sheets-configs/action-config.mjs'; import { itemAbleRollParse } from '../../helpers/utils.mjs'; +import MappingField from './mappingField.mjs'; /** * Specialized collection type for stored actions. @@ -10,9 +11,9 @@ export class ActionCollection extends Collection { constructor(model, entries) { super(); this.#model = model; - for (const [key, value] of entries) { - if (!(value instanceof game.system.api.models.actions.actionsTypes.base)) continue; - this.set(key, value); + for (const entry of entries) { + if (!(entry instanceof game.system.api.models.actions.actionsTypes.base)) continue; + this.set(entry._id, entry); } } @@ -60,7 +61,7 @@ export class ActionCollection extends Collection { /** * Field that stores actions. */ -export class ActionsField extends foundry.data.fields.TypedObjectField { +export class ActionsField extends MappingField { constructor(options) { super(new ActionField(), options); } @@ -69,7 +70,7 @@ export class ActionsField extends foundry.data.fields.TypedObjectField { /** @inheritDoc */ initialize(value, model, options) { - const actions = Object.entries(super.initialize(value, model, options)); + const actions = Object.values(super.initialize(value, model, options)); return new ActionCollection(model, actions); } } @@ -87,11 +88,10 @@ export class ActionField extends foundry.data.fields.ObjectField { /* -------------------------------------------- */ /** @override */ - _cleanType(value, options, _state) { + _cleanType(value, options) { if (!(typeof value === 'object')) value = {}; - value = super._cleanType(value, options, _state); const cls = this.getModel(value); - if (cls) return cls.cleanData(value, options, _state); + if (cls) return cls.cleanData(value, options); return value; } @@ -111,17 +111,9 @@ export class ActionField extends foundry.data.fields.ObjectField { * @param {object} sourceData Candidate source data of the root model. * @param {any} fieldData The value of this field within the source data. */ - _migrate(sourceData, _fieldData) { - const source = sourceData ?? this.options.initial; - if (!source) return sourceData; - - const cls = this.getModel(source); - if (cls) { - cls.migrateDataSafe(source); - return source; - } - - return sourceData; + migrateSource(sourceData, fieldData) { + const cls = this.getModel(fieldData); + if (cls) cls.migrateDataSafe(fieldData); } } @@ -245,11 +237,11 @@ export function ActionMixin(Base) { : foundry.utils.getProperty(result, basePath); } - async delete() { + delete() { if (!this.inCollection) return this.item; const action = foundry.utils.getProperty(this.item, `system.${this.systemPath}`)?.get(this.id); if (!action) return this.item; - await this.item.update({ [`system.${this.systemPath}.${this.id}`]: _del }); // Does not work. Unsure why. It worked in v13 <_<' + this.item.update({ [`system.${this.systemPath}.-=${this.id}`]: null }); this.constructor._sheets.get(this.uuid)?.close(); } @@ -310,7 +302,7 @@ export function ActionMixin(Base) { } }; - ChatMessage.applyMode(msg, game.settings.get('core', 'messageMode')); + ChatMessage.applyRollMode(msg, game.settings.get('core', 'rollMode')); cls.create(msg); } } diff --git a/module/data/fields/actorField.mjs b/module/data/fields/actorField.mjs index 7a57aa46..a3c17281 100644 --- a/module/data/fields/actorField.mjs +++ b/module/data/fields/actorField.mjs @@ -52,8 +52,8 @@ class ResourcesField extends fields.TypedObjectField { return key in CONFIG.DH.RESOURCE[this.actorType].all; } - _cleanType(value, options, _state) { - value = super._cleanType(value, options, _state); + _cleanType(value, options) { + value = super._cleanType(value, options); // If not partial, ensure all data exists if (!options.partial) { diff --git a/module/data/fields/foreignDocumentUUIDArrayField.mjs b/module/data/fields/foreignDocumentUUIDArrayField.mjs index 456c0593..0ddd126c 100644 --- a/module/data/fields/foreignDocumentUUIDArrayField.mjs +++ b/module/data/fields/foreignDocumentUUIDArrayField.mjs @@ -14,7 +14,7 @@ export default class ForeignDocumentUUIDArrayField extends foundry.data.fields.A /** @inheritdoc */ initialize(value, model, options = {}) { - const v = super.initialize(value ?? [], model, options); + const v = super.initialize(value, model, options); return () => { const data = v.map(entry => (typeof entry === 'function' ? entry() : entry)); return this.options.prune ? data.filter(d => !!d) : data; diff --git a/module/data/fields/iterableTypedObjectField.mjs b/module/data/fields/iterableTypedObjectField.mjs deleted file mode 100644 index d360b641..00000000 --- a/module/data/fields/iterableTypedObjectField.mjs +++ /dev/null @@ -1,32 +0,0 @@ -export default class IterableTypedObjectField extends foundry.data.fields.TypedObjectField { - constructor(model, options = { collectionClass: foundry.utils.Collection }, context = {}) { - super(new foundry.data.fields.EmbeddedDataField(model), options, context); - this.#elementClass = model; - } - - #elementClass; - - /** Initializes an object with an iterator. This modifies the prototype instead of */ - initialize(values) { - const object = Object.create(IterableObjectPrototype); - for (const [key, value] of Object.entries(values)) { - object[key] = new this.#elementClass(value); - } - return object; - } -} - -/** - * The prototype of an iterable object. - * This allows the functionality of a class but also allows foundry.utils.getType() to return "Object" instead of "Unknown". - */ -const IterableObjectPrototype = { - [Symbol.iterator]: function* () { - for (const value of Object.values(this)) { - yield value; - } - }, - map: function (func) { - return Array.from(this, func); - } -}; diff --git a/module/data/fields/mappingField.mjs b/module/data/fields/mappingField.mjs new file mode 100644 index 00000000..31d91c76 --- /dev/null +++ b/module/data/fields/mappingField.mjs @@ -0,0 +1,128 @@ +/** + * A subclass of ObjectField that represents a mapping of keys to the provided DataField type. + * + * @param {DataField} model The class of DataField which should be embedded in this field. + * @param {MappingFieldOptions} [options={}] Options which configure the behavior of the field. + * @property {string[]} [initialKeys] Keys that will be created if no data is provided. + * @property {MappingFieldInitialValueBuilder} [initialValue] Function to calculate the initial value for a key. + * @property {boolean} [initialKeysOnly=false] Should the keys in the initialized data be limited to the keys provided + * by `options.initialKeys`? + */ +export default class MappingField extends foundry.data.fields.ObjectField { + constructor(model, options) { + if (!(model instanceof foundry.data.fields.DataField)) { + throw new Error('MappingField must have a DataField as its contained element'); + } + super(options); + + /** + * The embedded DataField definition which is contained in this field. + * @type {DataField} + */ + this.model = model; + model.parent = this; + } + + /* -------------------------------------------- */ + + /** @inheritDoc */ + static get _defaults() { + return foundry.utils.mergeObject(super._defaults, { + initialKeys: null, + initialValue: null, + initialKeysOnly: false + }); + } + + /* -------------------------------------------- */ + + /** @inheritDoc */ + _cleanType(value, options) { + Object.entries(value).forEach(([k, v]) => { + if (k.startsWith('-=')) return; + value[k] = this.model.clean(v, options); + }); + return value; + } + + /* -------------------------------------------- */ + + /** @inheritDoc */ + getInitialValue(data) { + let keys = this.initialKeys; + const initial = super.getInitialValue(data); + if (!keys || !foundry.utils.isEmpty(initial)) return initial; + if (!(keys instanceof Array)) keys = Object.keys(keys); + for (const key of keys) initial[key] = this._getInitialValueForKey(key); + return initial; + } + + /* -------------------------------------------- */ + + /** + * Get the initial value for the provided key. + * @param {string} key Key within the object being built. + * @param {object} [object] Any existing mapping data. + * @returns {*} Initial value based on provided field type. + */ + _getInitialValueForKey(key, object) { + const initial = this.model.getInitialValue(); + return this.initialValue?.(key, initial, object) ?? initial; + } + + /* -------------------------------------------- */ + + /** @override */ + _validateType(value, options = {}) { + if (foundry.utils.getType(value) !== 'Object') throw new Error('must be an Object'); + const errors = this._validateValues(value, options); + if (!foundry.utils.isEmpty(errors)) { + const failure = new foundry.data.validation.DataModelValidationFailure(); + failure.elements = Object.entries(errors).map(([id, failure]) => ({ id, failure })); + throw failure.asError(); + } + } + + /* -------------------------------------------- */ + + /** + * Validate each value of the object. + * @param {object} value The object to validate. + * @param {object} options Validation options. + * @returns {Record} An object of value-specific errors by key. + */ + _validateValues(value, options) { + const errors = {}; + for (const [k, v] of Object.entries(value)) { + if (k.startsWith('-=')) continue; + const error = this.model.validate(v, options); + if (error) errors[k] = error; + } + return errors; + } + + /* -------------------------------------------- */ + + /** @override */ + initialize(value, model, options = {}) { + if (!value) return value; + const obj = {}; + const initialKeys = this.initialKeys instanceof Array ? this.initialKeys : Object.keys(this.initialKeys ?? {}); + const keys = this.initialKeysOnly ? initialKeys : Object.keys(value); + for (const key of keys) { + const data = value[key] ?? this._getInitialValueForKey(key, value); + obj[key] = this.model.initialize(data, model, options); + } + return obj; + } + + /* -------------------------------------------- */ + + /** @inheritDoc */ + _getField(path) { + if (path.length === 0) return this; + else if (path.length === 1) return this.model; + path.shift(); + return this.model._getField(path); + } +} diff --git a/module/data/item/armor.mjs b/module/data/item/armor.mjs index b0e4847f..0958a9f3 100644 --- a/module/data/item/armor.mjs +++ b/module/data/item/armor.mjs @@ -19,14 +19,7 @@ export default class DHArmor extends AttachableItem { ...super.defineSchema(), tier: new fields.NumberField({ required: true, integer: true, initial: 1, min: 1 }), equipped: new fields.BooleanField({ initial: false }), - armor: new fields.SchemaField({ - current: new fields.NumberField({ integer: true, min: 0, initial: 0 }), - max: new fields.NumberField({ required: true, integer: true, initial: 0 }) - }), - baseThresholds: new fields.SchemaField({ - major: new fields.NumberField({ integer: true, initial: 0 }), - severe: new fields.NumberField({ integer: true, initial: 0 }) - }), + baseScore: new fields.NumberField({ integer: true, initial: 0 }), armorFeatures: new fields.ArrayField( new fields.SchemaField({ value: new fields.StringField({ @@ -35,7 +28,14 @@ export default class DHArmor extends AttachableItem { effectIds: new fields.ArrayField(new fields.StringField({ required: true })), actionIds: new fields.ArrayField(new fields.StringField({ required: true })) }) - ) + ), + marks: new fields.SchemaField({ + value: new fields.NumberField({ initial: 0, integer: true }) + }), + baseThresholds: new fields.SchemaField({ + major: new fields.NumberField({ integer: true, initial: 0 }), + severe: new fields.NumberField({ integer: true, initial: 0 }) + }) }; } @@ -84,7 +84,7 @@ export default class DHArmor extends AttachableItem { } await this.parent.deleteEmbeddedDocuments('ActiveEffect', effectIds); changes.system.actions = actionIds.reduce((acc, id) => { - acc[id] = _del; + acc[`-=${id}`] = null; return acc; }, {}); @@ -151,20 +151,13 @@ export default class DHArmor extends AttachableItem { } } - /** @inheritDoc */ - static migrateDocumentData(source) { - if (!source.system.armor) { - source.system.armor = { current: source.system.marks?.value ?? 0, max: source.system.baseScore ?? 0 }; - } - } - /** * Generates a list of localized tags based on this item's type-specific properties. * @returns {string[]} An array of localized tag strings. */ _getTags() { const tags = [ - `${game.i18n.localize('DAGGERHEART.ITEMS.Armor.baseScore')}: ${this.armor.max}`, + `${game.i18n.localize('DAGGERHEART.ITEMS.Armor.baseScore')}: ${this.baseScore}`, `${game.i18n.localize('DAGGERHEART.ITEMS.Armor.baseThresholds.base')}: ${this.baseThresholds.major} / ${this.baseThresholds.severe}` ]; @@ -176,7 +169,9 @@ export default class DHArmor extends AttachableItem { * @returns {(string | { value: string, icons: string[] })[]} An array of localized strings and damage label objects. */ _getLabels() { - const labels = [`${game.i18n.localize('DAGGERHEART.ITEMS.Armor.baseScore')}: ${this.armor.max}`]; + const labels = []; + if (this.baseScore) + labels.push(`${game.i18n.localize('DAGGERHEART.ITEMS.Armor.baseScore')}: ${this.baseScore}`); return labels; } diff --git a/module/data/item/base.mjs b/module/data/item/base.mjs index 21a11149..6f3256e3 100644 --- a/module/data/item/base.mjs +++ b/module/data/item/base.mjs @@ -222,22 +222,17 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel { const autoSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation); const armorChanged = - changed.system?.armor?.current !== undefined && changed.system.armor.current !== this.armor.current; + changed.system?.marks?.value !== undefined && changed.system.marks.value !== this.marks.value; if (armorChanged && autoSettings.resourceScrollTexts && this.parent.parent?.type === 'character') { - const armorChangeValue = changed.system.armor.current - this.armor.current; - const armorData = getScrollTextData( - this.parent.parent, - { value: armorChangeValue + this.parent.parent.system.armorScore.value }, - 'armor' - ); + const armorData = getScrollTextData(this.parent.parent, changed.system.marks, 'armor'); options.scrollingTextData = [armorData]; } if (changed.system?.actions) { const triggersToRemove = Object.keys(changed.system.actions).reduce((acc, key) => { - const action = changed.system.actions[key]; - if (action && Object.keys(action).length === 0) { - acc.push(...this.actions.get(key).triggers.map(x => x.trigger)); + if (!changed.system.actions[key]) { + const strippedKey = key.replace('-=', ''); + acc.push(...this.actions.get(strippedKey).triggers.map(x => x.trigger)); } return acc; diff --git a/module/data/item/beastform.mjs b/module/data/item/beastform.mjs index e15d75f3..27327151 100644 --- a/module/data/item/beastform.mjs +++ b/module/data/item/beastform.mjs @@ -100,13 +100,13 @@ export default class DHBeastform extends BaseDataItem { static getBeastformAttackData(effect) { if (!effect) return null; - const mainTrait = effect.system.changes.find(x => x.key === 'system.rules.attack.roll.trait')?.value; - const traitBonus = effect.system.changes.find(x => x.key === `system.traits.${mainTrait}.value`)?.value ?? 0; - const evasionBonus = effect.system.changes.find(x => x.key === 'system.evasion')?.value ?? 0; + const mainTrait = effect.changes.find(x => x.key === 'system.rules.attack.roll.trait')?.value; + const traitBonus = effect.changes.find(x => x.key === `system.traits.${mainTrait}.value`)?.value ?? 0; + const evasionBonus = effect.changes.find(x => x.key === 'system.evasion')?.value ?? 0; - const damageDiceIndex = effect.system.changes.find(x => x.key === 'system.rules.attack.damage.diceIndex'); + const damageDiceIndex = effect.changes.find(x => x.key === 'system.rules.attack.damage.diceIndex'); const damageDice = damageDiceIndex ? Object.keys(CONFIG.DH.GENERAL.diceTypes)[damageDiceIndex.value] : null; - const damageBonus = effect.system.changes.find(x => x.key === 'system.rules.attack.damage.bonus')?.value ?? 0; + const damageBonus = effect.changes.find(x => x.key === 'system.rules.attack.damage.bonus')?.value ?? 0; return { trait: game.i18n.localize(CONFIG.DH.ACTOR.abilities[mainTrait]?.label), @@ -169,17 +169,17 @@ export default class DHBeastform extends BaseDataItem { const beastformEffect = this.parent.effects.find(x => x.type === 'beastform'); await beastformEffect.updateSource({ + changes: [ + ...beastformEffect.changes, + { + key: 'system.advantageSources', + mode: 2, + value: Object.values(this.advantageOn) + .map(x => x.value) + .join(', ') + } + ], system: { - changes: [ - ...beastformEffect.system.changes, - { - key: 'system.advantageSources', - mode: 2, - value: Object.values(this.advantageOn) - .map(x => x.value) - .join(', ') - } - ], characterTokenData: { usesDynamicToken: this.parent.parent.prototypeToken.ring.enabled, tokenImg: this.parent.parent.prototypeToken.texture.src, diff --git a/module/data/item/subclass.mjs b/module/data/item/subclass.mjs index d421cc6d..06a80f7b 100644 --- a/module/data/item/subclass.mjs +++ b/module/data/item/subclass.mjs @@ -52,9 +52,6 @@ export default class DHSubclass extends BaseDataItem { } async _preCreate(data, options, user) { - const allowed = await super._preCreate(data, options, user); - if (allowed === false) return; - if (this.actor?.type === 'character') { const dataUuid = data.uuid ?? data._stats.compendiumSource ?? `Item.${data._id}`; if (this.actor.system.class.subclass) { @@ -89,6 +86,9 @@ export default class DHSubclass extends BaseDataItem { } } } + + const allowed = await super._preCreate(data, options, user); + if (allowed === false) return; } /**@inheritdoc */ diff --git a/module/data/item/weapon.mjs b/module/data/item/weapon.mjs index 9335037c..bb7fde0a 100644 --- a/module/data/item/weapon.mjs +++ b/module/data/item/weapon.mjs @@ -63,15 +63,15 @@ export default class DHWeapon extends AttachableItem { type: 'attack' }, damage: { - parts: { - hitPoints: { + parts: [ + { type: ['physical'], value: { multiplier: 'prof', dice: 'd8' } } - } + ] } } }), @@ -148,7 +148,7 @@ export default class DHWeapon extends AttachableItem { await this.parent.deleteEmbeddedDocuments('ActiveEffect', removedEffectsUpdate); changes.system.actions = removedActionsUpdate.reduce((acc, id) => { - acc[id] = _del; + acc[`-=${id}`] = null; return acc; }, {}); diff --git a/module/data/settings/Automation.mjs b/module/data/settings/Automation.mjs index 35e87327..20fe0baf 100644 --- a/module/data/settings/Automation.mjs +++ b/module/data/settings/Automation.mjs @@ -196,11 +196,6 @@ export default class DhAutomation extends foundry.abstract.DataModel { }) }) }), - autoExpireActiveEffects: new fields.BooleanField({ - required: true, - initial: true, - label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.autoExpireActiveEffects.label' - }), triggers: new fields.SchemaField({ enabled: new fields.BooleanField({ nullable: false, diff --git a/module/data/tagTeamData.mjs b/module/data/tagTeamData.mjs deleted file mode 100644 index 25158606..00000000 --- a/module/data/tagTeamData.mjs +++ /dev/null @@ -1,47 +0,0 @@ -export default class TagTeamData extends foundry.abstract.DataModel { - static defineSchema() { - const fields = foundry.data.fields; - - return { - initiator: new fields.SchemaField( - { - memberId: new fields.StringField({ - required: true, - label: 'DAGGERHEART.APPLICATIONS.TagTeamSelect.FIELDS.initiator.memberId.label' - }), - cost: new fields.NumberField({ - integer: true, - initial: 3, - label: 'DAGGERHEART.APPLICATIONS.TagTeamSelect.FIELDS.initiator.cost.label' - }) - }, - { nullable: true, initial: null } - ), - members: new fields.TypedObjectField(new fields.EmbeddedDataField(MemberData)) - }; - } -} - -export class MemberData extends foundry.abstract.DataModel { - static defineSchema() { - const fields = foundry.data.fields; - - return { - name: new fields.StringField({ required: true }), - img: new fields.StringField({ required: true }), - rollType: new fields.StringField({ - required: true, - choices: CONFIG.DH.GENERAL.tagTeamRollTypes, - initial: CONFIG.DH.GENERAL.tagTeamRollTypes.trait.id, - label: 'Roll Type' - }), - rollChoice: new fields.StringField({ nullable: true, initial: null }), - rollData: new fields.JSONField({ nullable: true, initial: null }), - selected: new fields.BooleanField({ initial: false }) - }; - } - - get roll() { - return this.rollData ? CONFIG.Dice.daggerheart.DualityRoll.fromData(this.rollData) : null; - } -} diff --git a/module/data/tagTeamRoll.mjs b/module/data/tagTeamRoll.mjs new file mode 100644 index 00000000..de71a11b --- /dev/null +++ b/module/data/tagTeamRoll.mjs @@ -0,0 +1,20 @@ +import { DhCharacter } from './actor/_module.mjs'; + +export default class DhTagTeamRoll extends foundry.abstract.DataModel { + static defineSchema() { + const fields = foundry.data.fields; + + return { + initiator: new fields.SchemaField({ + id: new fields.StringField({ nullable: true, initial: null }), + cost: new fields.NumberField({ integer: true, min: 0, initial: 3 }) + }), + members: new fields.TypedObjectField( + new fields.SchemaField({ + messageId: new fields.StringField({ required: true, nullable: true, initial: null }), + selected: new fields.BooleanField({ required: true, initial: false }) + }) + ) + }; + } +} diff --git a/module/dice/damageRoll.mjs b/module/dice/damageRoll.mjs index 58c0cd02..ef5f9434 100644 --- a/module/dice/damageRoll.mjs +++ b/module/dice/damageRoll.mjs @@ -1,5 +1,6 @@ import DamageDialog from '../applications/dialogs/damageDialog.mjs'; import { parseRallyDice } from '../helpers/utils.mjs'; +import { RefreshType, socketEvent } from '../systemRegistration/socket.mjs'; import DHRoll from './dhRoll.mjs'; export default class DamageRoll extends DHRoll { @@ -33,7 +34,7 @@ export default class DamageRoll extends DHRoll { static async buildPost(roll, config, message) { const chatMessage = config.source?.message ? ui.chat.collection.get(config.source.message) - : getDocumentClass('ChatMessage').applyMode({}, config.rollMode ?? 'public'); + : getDocumentClass('ChatMessage').applyRollMode({}, config.rollMode ?? CONST.DICE_ROLL_MODES.PUBLIC); if (game.modules.get('dice-so-nice')?.active) { const pool = foundry.dice.terms.PoolTerm.fromRolls( Object.values(config.damage).flatMap(r => r.parts.map(p => p.roll)) @@ -196,7 +197,7 @@ export default class DamageRoll extends DHRoll { if (config.data.parent.appliedEffects) { // Bardic Rally const rallyChoices = config.data?.parent?.appliedEffects.reduce((a, c) => { - const change = c.system.changes.find(ch => ch.key === 'system.bonuses.rally'); + const change = c.changes.find(ch => ch.key === 'system.bonuses.rally'); if (change) a.push({ value: c.id, label: parseRallyDice(change.value, c) }); return a; }, []); @@ -280,7 +281,10 @@ export default class DamageRoll extends DHRoll { return mods; } - static async reroll(rollPart, dice, result) { + static async reroll(target, message) { + const { damageType, part, dice, result } = target.dataset; + const rollPart = message.system.damage[damageType].parts[part]; + let diceIndex = 0; let parsedRoll = game.system.api.dice.DamageRoll.fromData({ ...rollPart.roll, @@ -349,6 +353,29 @@ export default class DamageRoll extends DHRoll { }; }); - return { parsedRoll, rerolledDice }; + const updateMessage = game.messages.get(message._id); + const damageParts = updateMessage.system.damage[damageType].parts.map((damagePart, index) => { + if (index !== Number(part)) return damagePart; + return { + ...rollPart, + total: parsedRoll.total, + dice: rerolledDice + }; + }); + await updateMessage.update({ + [`system.damage.${damageType}`]: { + ...updateMessage, + total: parsedRoll.total, + parts: damageParts + } + }); + + Hooks.callAll(socketEvent.Refresh, { refreshType: RefreshType.TagTeamRoll }); + await game.socket.emit(`system.${CONFIG.DH.id}`, { + action: socketEvent.Refresh, + data: { + refreshType: RefreshType.TagTeamRoll + } + }); } } diff --git a/module/dice/dhRoll.mjs b/module/dice/dhRoll.mjs index a5d95cd1..c216e740 100644 --- a/module/dice/dhRoll.mjs +++ b/module/dice/dhRoll.mjs @@ -21,9 +21,6 @@ export default class DHRoll extends Roll { static async build(config = {}, message = {}) { const roll = await this.buildConfigure(config, message); if (!roll) return; - - if (config.skips?.createMessage) config.messageRoll = roll; - await this.buildEvaluate(roll, config, (message = {})); await this.buildPost(roll, config, (message = {})); return config; @@ -33,6 +30,12 @@ export default class DHRoll extends Roll { config.hooks = [...this.getHooks(), '']; config.dialog ??= {}; + const actorIdSplit = config.source?.actor?.split('.'); + if (actorIdSplit) { + const tagTeamSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll); + config.tagTeamSelected = Boolean(tagTeamSettings.members[actorIdSplit[actorIdSplit.length - 1]]); + } + for (const hook of config.hooks) { if (Hooks.call(`${CONFIG.DH.id}.preRoll${hook.capitalize()}`, config, message) === false) return null; } @@ -117,10 +120,10 @@ export default class DHRoll extends Roll { rolls: [roll] }; - config.selectedMessageMode ??= game.settings.get('core', 'messageMode'); + config.selectedRollMode ??= game.settings.get('core', 'rollMode'); if (roll._evaluated) { - const message = await cls.create(msgData, { messageMode: config.selectedMessageMode }); + const message = await cls.create(msgData, { rollMode: config.selectedRollMode }); if (config.tagTeamSelected) { game.system.api.applications.dialogs.TagTeamDialog.assignRoll(message.speakerActor, message); @@ -266,12 +269,12 @@ export default class DHRoll extends Roll { const changeKeys = this.getActionChangeKeys(); return ( this.options.effects?.reduce((acc, effect) => { - if (effect.system.changes.some(x => changeKeys.some(key => x.key.includes(key)))) { + if (effect.changes.some(x => changeKeys.some(key => x.key.includes(key)))) { acc[effect.id] = { id: effect.id, name: effect.name, description: effect.description, - changes: effect.system.changes, + changes: effect.changes, origEffect: effect, selected: !effect.disabled }; diff --git a/module/dice/dualityRoll.mjs b/module/dice/dualityRoll.mjs index 03035f68..75fbdf55 100644 --- a/module/dice/dualityRoll.mjs +++ b/module/dice/dualityRoll.mjs @@ -67,7 +67,7 @@ export default class DualityRoll extends D20Roll { setRallyChoices() { return this.data?.parent?.appliedEffects.reduce((a, c) => { - const change = c.system.changes.find(ch => ch.key === 'system.bonuses.rally'); + const change = c.changes.find(ch => ch.key === 'system.bonuses.rally'); if (change) a.push({ value: c.id, label: parseRallyDice(change.value, c) }); return a; }, []); @@ -179,7 +179,7 @@ export default class DualityRoll extends D20Roll { static async buildConfigure(config = {}, message = {}) { config.dialog ??= {}; config.guaranteedCritical = config.data?.parent?.appliedEffects.reduce((a, c) => { - const change = c.system.changes.find(ch => ch.key === 'system.rules.roll.guaranteedCritical'); + const change = c.changes.find(ch => ch.key === 'system.rules.roll.guaranteedCritical'); if (change) a = true; return a; }, false); @@ -374,9 +374,9 @@ export default class DualityRoll extends D20Roll { } } - static async reroll(rollBase, dieIndex, diceType) { - let parsedRoll = game.system.api.dice.DualityRoll.fromData({ ...rollBase, evaluated: false }); - const term = parsedRoll.terms[dieIndex]; + static async reroll(rollString, target, message) { + let parsedRoll = game.system.api.dice.DualityRoll.fromData({ ...rollString, evaluated: false }); + const term = parsedRoll.terms[target.dataset.dieIndex]; await term.reroll(`/r1=${term.total}`); const result = await parsedRoll.evaluate(); @@ -393,35 +393,35 @@ export default class DualityRoll extends D20Roll { options: { appearance: {} } }; - const diceSoNicePresets = await getDiceSoNicePresets(`d${term._faces}`, `d${term._faces}`); - if (diceSoNicePresets[diceType]) { - diceSoNiceRoll.dice[0].options = diceSoNicePresets[diceType]; + const diceSoNicePresets = await getDiceSoNicePresets(result, `d${term._faces}`, `d${term._faces}`); + const type = target.dataset.type; + if (diceSoNicePresets[type]) { + diceSoNiceRoll.dice[0].options = diceSoNicePresets[type]; } await game.dice3d.showForRoll(diceSoNiceRoll, game.user, true); - } else { - foundry.audio.AudioHelper.play({ src: CONFIG.sounds.dice }); } const newRoll = game.system.api.dice.DualityRoll.postEvaluate(parsedRoll, { - targets: parsedRoll.options.targets ?? [], + targets: message.system.targets, roll: { - advantage: parsedRoll.options.roll.advantage?.type, - difficulty: parsedRoll.options.roll.difficulty ? Number(parsedRoll.options.roll.difficulty) : null + advantage: message.system.roll.advantage?.type, + difficulty: message.system.roll.difficulty ? Number(message.system.roll.difficulty) : null } }); const extraIndex = newRoll.advantage ? 3 : 2; newRoll.extra = newRoll.extra.slice(extraIndex); - const actor = parsedRoll.options.source.actor - ? await foundry.utils.fromUuid(parsedRoll.options.source.actor) - : null; + const tagTeamSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll); + + const actor = message.system.source.actor ? await foundry.utils.fromUuid(message.system.source.actor) : null; const config = { - source: { actor: parsedRoll.options.source.actor ?? '' }, - targets: parsedRoll.targets, + source: { actor: message.system.source.actor ?? '' }, + targets: message.system.targets, + tagTeamSelected: Object.values(tagTeamSettings.members).some(x => x.messageId === message._id), roll: newRoll, - rerolledRoll: parsedRoll.roll, + rerolledRoll: message.system.roll, resourceUpdates: new ResourceUpdateMap(actor) }; diff --git a/module/documents/_module.mjs b/module/documents/_module.mjs index aa08f0f4..b9cfd3f2 100644 --- a/module/documents/_module.mjs +++ b/module/documents/_module.mjs @@ -8,4 +8,5 @@ export { default as DhRollTable } from './rollTable.mjs'; export { default as DhScene } from './scene.mjs'; export { default as DhToken } from './token.mjs'; export { default as DhTooltipManager } from './tooltipManager.mjs'; +export { default as DhTemplateManager } from './templateManager.mjs'; export { default as DhTokenManager } from './tokenManager.mjs'; diff --git a/module/documents/activeEffect.mjs b/module/documents/activeEffect.mjs index 4aeba3af..dd5f1b55 100644 --- a/module/documents/activeEffect.mjs +++ b/module/documents/activeEffect.mjs @@ -1,5 +1,5 @@ import { itemAbleRollParse } from '../helpers/utils.mjs'; -import { RefreshType } from '../systemRegistration/socket.mjs'; +import { RefreshType, socketEvent } from '../systemRegistration/socket.mjs'; export default class DhActiveEffect extends foundry.documents.ActiveEffect { /* -------------------------------------------- */ @@ -8,8 +8,6 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect { /**@override */ get isSuppressed() { - if (this.system.isSuppressed === true) return true; - // If this is a copied effect from an attachment, never suppress it // (These effects have attachmentSource metadata) if (this.flags?.daggerheart?.attachmentSource) { @@ -17,7 +15,7 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect { } // Then apply the standard suppression rules - if (['weapon', 'armor'].includes(this.parent?.type) && this.transfer) { + if (['weapon', 'armor'].includes(this.parent?.type)) { return !this.parent.system.equipped; } @@ -52,55 +50,10 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect { }); } - /** - * Whether this Active Effect is eligible to be registered with the {@link ActiveEffectRegistry} - */ - get isExpiryTrackable() { - return ( - this.persisted && - !this.inCompendium && - this.modifiesActor && - this.start && - this.isTemporary && - !this.isExpired - ); - } - /* -------------------------------------------- */ /* Event Handlers */ /* -------------------------------------------- */ - /** @inheritdoc */ - static async createDialog(data = {}, createOptions = {}, options = {}) { - const { folders, types, template, context = {}, ...dialogOptions } = options; - - if (types?.length === 0) { - throw new Error('The array of sub-types to restrict to must not be empty.'); - } - - const creatableEffects = types || ['base']; - const documentTypes = this.TYPES.filter(type => creatableEffects.includes(type)).map(type => { - const labelKey = `TYPES.ActiveEffect.${type}`; - const label = game.i18n.has(labelKey) ? game.i18n.localize(labelKey) : type; - - return { value: type, label }; - }); - - if (!documentTypes.length) { - throw new Error('No document types were permitted to be created.'); - } - - const sortedTypes = documentTypes.sort((a, b) => a.label.localeCompare(b.label, game.i18n.lang)); - - return await super.createDialog(data, createOptions, { - folders, - types, - template, - context: { types: sortedTypes, ...context }, - ...dialogOptions - }); - } - /**@inheritdoc*/ async _preCreate(data, options, user) { const update = {}; @@ -108,18 +61,6 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect { update.img = 'icons/magic/life/heart-cross-blue.webp'; } - const existingEffect = this.actor.effects.find(x => x.origin === data.origin); - const stacks = Boolean(data.system?.stacking); - if (existingEffect && !stacks) return false; - - if (existingEffect && stacks) { - const incrementedValue = existingEffect.system.stacking.value + 1; - await existingEffect.update({ - 'system.stacking.value': Math.min(incrementedValue, existingEffect.system.stacking.max ?? Infinity) - }); - return false; - } - const statuses = Object.keys(data.statuses ?? {}); const immuneStatuses = statuses.filter( @@ -168,24 +109,23 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect { /* -------------------------------------------- */ /**@inheritdoc*/ - static applyChangeField(model, change, field) { - change.value = Number.isNumeric(change.value) - ? change.value - : DhActiveEffect.getChangeValue(model, change, change.effect); - super.applyChangeField(model, change, field); + static applyField(model, change, field) { + change.value = DhActiveEffect.getChangeValue(model, change, change.effect); + super.applyField(model, change, field); } - static _applyChangeUnguided(actor, change, changes, options) { + _applyLegacy(actor, change, changes) { change.value = DhActiveEffect.getChangeValue(actor, change, change.effect); - super._applyChangeUnguided(actor, change, changes, options); + super._applyLegacy(actor, change, changes); } + /** */ static getChangeValue(model, change, effect) { - let key = change.value.toString(); - const isOriginTarget = key.toLowerCase().includes('origin.@'); + let value = change.value; + const isOriginTarget = value.toLowerCase().includes('origin.@'); let parseModel = model; if (isOriginTarget && effect.origin) { - key = change.key.replaceAll(/origin\.@/gi, '@'); + value = change.value.replaceAll(/origin\.@/gi, '@'); try { const originEffect = foundry.utils.fromUuidSync(effect.origin); const doc = @@ -196,11 +136,8 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect { } catch (_) {} } - const stackingParsedValue = effect.system.stacking - ? Roll.replaceFormulaData(key, { stacks: effect.system.stacking.value }) - : key; - const evalValue = itemAbleRollParse(stackingParsedValue, parseModel, effect.parent); - return evalValue ?? key; + const evalValue = this.effectSafeEval(itemAbleRollParse(value, parseModel, effect.parent)); + return evalValue ?? value; } /** diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index 3e3dfde4..13843bb8 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -4,7 +4,6 @@ import DHFeature from '../data/item/feature.mjs'; import { createScrollText, damageKeyToNumber, getDamageKey } from '../helpers/utils.mjs'; import DhCompanionLevelUp from '../applications/levelup/companionLevelup.mjs'; import { ResourceUpdateMap } from '../data/action/baseAction.mjs'; -import { abilities } from '../config/actorConfig.mjs'; export default class DhpActor extends Actor { parties = new Set(); @@ -30,18 +29,6 @@ export default class DhpActor extends Actor { return this.system.metadata.isNPC; } - prepareData() { - super.prepareData(); - - // Update effects if it is the user's character or is controlled - if (canvas.ready) { - const controlled = canvas.tokens.controlled.some(t => t.actor === this); - if (game.user.character === this || controlled) { - ui.effectsDisplay.render(); - } - } - } - /* -------------------------------------------- */ /** @inheritDoc */ @@ -155,7 +142,7 @@ export default class DhpActor extends Actor { } const updatedLevelups = Object.keys(this.system.levelData.levelups).reduce((acc, level) => { - if (Number(level) > usedLevel) acc[level] = _del; + if (Number(level) > usedLevel) acc[`-=${level}`] = null; return acc; }, {}); @@ -200,7 +187,7 @@ export default class DhpActor extends Actor { if (experiences.length > 0) { const getUpdate = () => ({ 'system.experiences': experiences.reduce((acc, key) => { - acc[key] = _del; + acc[`-=${key}`] = null; return acc; }, {}) }); @@ -522,30 +509,6 @@ export default class DhpActor extends Actor { return await rollClass.build(config); } - async rollTrait(trait, options = {}) { - const abilityLabel = game.i18n.localize(abilities[trait].label); - const config = { - event: event, - title: `${game.i18n.localize('DAGGERHEART.GENERAL.dualityRoll')}: ${this.name}`, - headerTitle: game.i18n.format('DAGGERHEART.UI.Chat.dualityRoll.abilityCheckTitle', { - ability: abilityLabel - }), - effects: await game.system.api.data.actions.actionsTypes.base.getEffects(this), - roll: { - trait: trait, - type: 'trait' - }, - hasRoll: true, - actionType: 'action', - headerTitle: `${game.i18n.localize('DAGGERHEART.GENERAL.dualityRoll')}: ${this.name}`, - title: game.i18n.format('DAGGERHEART.UI.Chat.dualityRoll.abilityCheckTitle', { - ability: abilityLabel - }), - ...options - }; - return await this.diceRoll(config); - } - get rollClass() { return CONFIG.Dice.daggerheart[['character', 'companion'].includes(this.type) ? 'DualityRoll' : 'D20Roll']; } @@ -610,7 +573,8 @@ export default class DhpActor extends Actor { const availableStress = this.system.resources.stress.max - this.system.resources.stress.value; const canUseArmor = - this.system.armorScore.value < this.system.armorScore.max && + this.system.armor && + this.system.armor.system.marks.value < this.system.armorScore && type.every(t => this.system.armorApplicableDamageTypes[t] === true); const canUseStress = Object.keys(stressDamageReduction).reduce((acc, x) => { const rule = stressDamageReduction[x]; @@ -650,7 +614,12 @@ export default class DhpActor extends Actor { const hpDamage = updates.find(u => u.key === CONFIG.DH.GENERAL.healingTypes.hitPoints.id); if (hpDamage?.value) { hpDamage.value = this.convertDamageToThreshold(hpDamage.value); - if (this.type === 'character' && !isDirect && this.#canReduceDamage(hpDamage.value, hpDamage.damageTypes)) { + if ( + this.type === 'character' && + !isDirect && + this.system.armor && + this.#canReduceDamage(hpDamage.value, hpDamage.damageTypes) + ) { const armorSlotResult = await this.owner.query( 'armorSlot', { @@ -663,10 +632,12 @@ export default class DhpActor extends Actor { } ); if (armorSlotResult) { - const { modifiedDamage, armorChanges, stressSpent } = armorSlotResult; + const { modifiedDamage, armorSpent, stressSpent } = armorSlotResult; updates.find(u => u.key === 'hitPoints').value = modifiedDamage; - for (const armorChange of armorChanges) { - updates.push({ value: armorChange.amount, key: 'armor', uuid: armorChange.uuid }); + if (armorSpent) { + const armorUpdate = updates.find(u => u.key === 'armor'); + if (armorUpdate) armorUpdate.value += armorSpent; + else updates.push({ value: armorSpent, key: 'armor' }); } if (stressSpent) { const stressUpdate = updates.find(u => u.key === 'stress'); @@ -803,8 +774,12 @@ export default class DhpActor extends Actor { ); break; case 'armor': - if (!r.uuid) this.system.updateArmorValue(r); - else this.system.updateArmorEffectValue(r); + if (this.system.armor?.system?.marks) { + updates.armor.resources['system.marks.value'] = Math.max( + Math.min(valueFunc(this.system.armor.system.marks, r), this.system.armorScore), + 0 + ); + } break; default: if (this.system.resources?.[r.key]) { @@ -1020,20 +995,4 @@ export default class DhpActor extends Actor { return allTokens; } - - /**@inheritdoc */ - *allApplicableEffects({ noSelfArmor, noTransferArmor } = {}) { - for (const effect of this.effects) { - if (!noSelfArmor || effect.type !== 'armor') yield effect; - } - for (const item of this.items) { - for (const effect of item.effects) { - if (effect.transfer && (!noTransferArmor || effect.type !== 'armor')) yield effect; - } - } - } - - applyActiveEffects(phase) { - super.applyActiveEffects(phase); - } } diff --git a/module/documents/chatMessage.mjs b/module/documents/chatMessage.mjs index 8b094678..53921329 100644 --- a/module/documents/chatMessage.mjs +++ b/module/documents/chatMessage.mjs @@ -177,6 +177,14 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage { config.effects = await game.system.api.data.actions.actionsTypes.base.getEffects(actor, item); await this.system.action.workflow.get('damage')?.execute(config, this._id, true); } + + Hooks.callAll(socketEvent.Refresh, { refreshType: RefreshType.TagTeamRoll }); + await game.socket.emit(`system.${CONFIG.DH.id}`, { + action: socketEvent.Refresh, + data: { + refreshType: RefreshType.TagTeamRoll + } + }); } async onApplyDamage(event) { diff --git a/module/documents/item.mjs b/module/documents/item.mjs index 56048a81..67f7d253 100644 --- a/module/documents/item.mjs +++ b/module/documents/item.mjs @@ -230,14 +230,4 @@ export default class DHItem extends foundry.documents.Item { async _preDelete() { this.deleteTriggers(); } - - /** @inheritDoc */ - static migrateData(source) { - const documentClass = game.system.api.data.items[`DH${source.type?.capitalize()}`]; - if (documentClass?.migrateDocumentData) { - documentClass.migrateDocumentData(source); - } - - return super.migrateData(source); - } } diff --git a/module/documents/rollTable.mjs b/module/documents/rollTable.mjs index 59652f44..50b8fe63 100644 --- a/module/documents/rollTable.mjs +++ b/module/documents/rollTable.mjs @@ -76,7 +76,7 @@ export default class DhRollTable extends foundry.documents.RollTable { } async toMessage(results, { roll, messageData = {}, messageOptions = {} } = {}) { - messageOptions.rollMode ??= game.settings.get('core', 'messageMode'); + messageOptions.rollMode ??= game.settings.get('core', 'rollMode'); // Construct chat data messageData = foundry.utils.mergeObject( diff --git a/module/documents/templateManager.mjs b/module/documents/templateManager.mjs new file mode 100644 index 00000000..cf15c2e3 --- /dev/null +++ b/module/documents/templateManager.mjs @@ -0,0 +1,105 @@ +/** + * A singleton class that handles preview templates. + */ + +export default class DhTemplateManager { + #activePreview; + + /** + * Create a template preview, deactivating any existing ones. + * @param {object} data + */ + async createPreview(data) { + const template = await canvas.templates._createPreview(data, { renderSheet: false }); + + this.#activePreview = { + document: template.document, + object: template, + origin: { x: template.document.x, y: template.document.y } + }; + + this.#activePreview.events = { + contextmenu: this.#cancelTemplate.bind(this), + mousedown: this.#confirmTemplate.bind(this), + mousemove: this.#onDragMouseMove.bind(this), + wheel: this.#onMouseWheel.bind(this) + }; + canvas.stage.on('mousemove', this.#activePreview.events.mousemove); + canvas.stage.on('mousedown', this.#activePreview.events.mousedown); + + canvas.app.view.addEventListener('wheel', this.#activePreview.events.wheel, true); + canvas.app.view.addEventListener('contextmenu', this.#activePreview.events.contextmenu); + } + + /** + * Handles the movement of the temlate preview on mousedrag. + * @param {mousemove Event} event + */ + #onDragMouseMove(event) { + event.stopPropagation(); + const { moveTime, object } = this.#activePreview; + const update = {}; + + const now = Date.now(); + if (now - (moveTime || 0) <= 16) return; + this.#activePreview.moveTime = now; + + let cursor = event.getLocalPosition(canvas.templates); + + Object.assign(update, canvas.grid.getCenterPoint(cursor)); + + object.document.updateSource(update); + object.renderFlags.set({ refresh: true }); + } + + /** + * Handles the rotation of the preview template on scrolling. + * @param {wheel Event} event + */ + #onMouseWheel(event) { + if (!this.#activePreview) { + return; + } + if (!event.shiftKey && !event.ctrlKey) return; + event.stopPropagation(); + event.preventDefault(); + const { moveTime, object } = this.#activePreview; + + const now = Date.now(); + if (now - (moveTime || 0) <= 16) return; + this.#activePreview.moveTime = now; + + const multiplier = event.shiftKey ? 0.2 : 0.1; + + object.document.updateSource({ + direction: object.document.direction + event.deltaY * multiplier + }); + object.renderFlags.set({ refresh: true }); + } + + /** + * Cancels the preview template on right-click. + * @param {contextmenu Event} event + */ + #cancelTemplate(event) { + const { mousemove, mousedown, contextmenu, wheel } = this.#activePreview.events; + canvas.templates._onDragLeftCancel(event); + + canvas.stage.off('mousemove', mousemove); + canvas.stage.off('mousedown', mousedown); + canvas.app.view.removeEventListener('contextmenu', contextmenu); + canvas.app.view.removeEventListener('wheel', wheel); + } + + /** + * Creates a real MeasuredTemplate at the preview location and cancels the preview. + * @param {click Event} event + */ + #confirmTemplate(event) { + event.stopPropagation(); + this.#cancelTemplate(event); + + canvas.scene.createEmbeddedDocuments('MeasuredTemplate', [this.#activePreview.document.toObject()]); + this.#activePreview = undefined; + } +} diff --git a/module/documents/token.mjs b/module/documents/token.mjs index 8e810689..4ee7ce05 100644 --- a/module/documents/token.mjs +++ b/module/documents/token.mjs @@ -494,62 +494,4 @@ export default class DHToken extends CONFIG.Token.documentClass { game.system.registeredTriggers.unregisterItemTriggers(this.actor.items); } } - - /* V14 TEMP until foundry fixes: https://discord.com/channels/170995199584108546/1421197211194228907/1467296028700049566 */ - _onRelatedUpdate(update = {}, operation = {}) { - this.#refreshOverrides(operation); - this._prepareBars(); - - // Update tracked Combat resource - const combatant = this.combatant; - if (combatant) { - const isActorUpdate = [this, null, undefined].includes(operation.parent); - const resource = game.combat.settings.resource; - const updates = Array.isArray(update) ? update : [update]; - if (isActorUpdate && resource && updates.some(u => foundry.utils.hasProperty(u.system ?? {}, resource))) { - combatant.updateResource(); - } - ui.combat.render(); - } - - // Trigger redraws on the token - if (this.parent.isView) { - if (this.object?.hasActiveHUD) canvas.tokens.hud.render(); - this.object?.renderFlags.set({ redrawEffects: true }); - for (const key of ['bar1', 'bar2']) { - const name = `${this.object?.objectId}.animate${key.capitalize()}`; - const easing = foundry.canvas.animation.CanvasAnimation.easeInOutCosine; - this.object?.animate({ [key]: this[key] }, { name, easing }); - } - for (const app of foundry.applications.sheets.TokenConfig.instances()) { - app._preview?.updateSource({ delta: this.toObject().delta }, { diff: false, recursive: false }); - app._preview?.object?.renderFlags.set({ refreshBars: true, redrawEffects: true }); - } - } - } - - /* V14 TEMP until foundry fixes: https://discord.com/channels/170995199584108546/1421197211194228907/1467296028700049566 */ - #refreshOverrides(operation) { - if (!this.actor) return; - - const { deepClone, mergeObject, equals, isEmpty } = foundry.utils; - const oldOverrides = deepClone(this._overrides) ?? {}; - const newOverrides = deepClone(this.actor?.tokenOverrides ?? {}, { prune: true }); - if (!equals(oldOverrides, newOverrides)) { - this._overrides = newOverrides; - this.reset(); - - // Send emulated update data to the PlaceableObject - if (!canvas.ready || canvas.scene !== this.scene) return; - const { width, height, depth, ...changes } = mergeObject( - mergeObject(oldOverrides, this, { insertKeys: false, insertValues: false }), - this._overrides - ); - this.object?._onUpdate(changes, {}, game.user.id); - - // Hand off size changes to a secondary handler requiring downstream implementation. - const sizeChanges = deepClone({ width, height, depth }, { prune: true }); - if (!isEmpty(sizeChanges)) this._onOverrideSize(sizeChanges, operation); - } - } } diff --git a/module/enrichers/TemplateEnricher.mjs b/module/enrichers/TemplateEnricher.mjs index fd0e78eb..4bc8fdeb 100644 --- a/module/enrichers/TemplateEnricher.mjs +++ b/module/enrichers/TemplateEnricher.mjs @@ -49,8 +49,6 @@ export default function DhTemplateEnricher(match, _options) { } export const renderMeasuredTemplate = async event => { - const { LINE, RECTANGLE, INFRONT, CONE } = CONFIG.DH.GENERAL.templateTypes; - const button = event.currentTarget, type = button.dataset.type, range = button.dataset.range, @@ -59,9 +57,13 @@ export const renderMeasuredTemplate = async event => { if (!type || !range || !game.canvas.scene) return; - const usedType = type === 'inFront' ? 'cone' : type; + const usedType = type === 'inFront' ? 'cone' : type === 'emanation' ? 'circle' : type; const usedAngle = - type === CONE ? (angle ?? CONFIG.MeasuredTemplate.defaults.angle) : type === INFRONT ? '180' : undefined; + type === CONST.MEASURED_TEMPLATE_TYPES.CONE + ? (angle ?? CONFIG.MeasuredTemplate.defaults.angle) + : type === CONFIG.DH.GENERAL.templateTypes.INFRONT + ? '180' + : undefined; let baseDistance = range; if (Number.isNaN(Number(range))) { @@ -69,49 +71,18 @@ export const renderMeasuredTemplate = async event => { range ]; } - - const dimensionConstant = game.scenes.active.grid.size / game.scenes.active.grid.distance; - - baseDistance *= dimensionConstant; - - const length = baseDistance; - const radius = length; - - const shapeWidth = type === LINE ? 5 * dimensionConstant : type === RECTANGLE ? length : undefined; + const distance = type === CONFIG.DH.GENERAL.templateTypes.EMANATION ? baseDistance + 2.5 : baseDistance; const { width, height } = game.canvas.scene.dimensions; - const shapeData = { + const data = { x: width / 2, y: height / 2, - base: { - type: 'token', - x: 0, - y: 0, - width: 1, - height: 1, - shape: game.canvas.grid.isHexagonal ? CONST.TOKEN_SHAPES.ELLIPSE_1 : CONST.TOKEN_SHAPES.RECTANGLE_1 - }, t: usedType, - length: length, - width: shapeWidth, - height: length, + distance: distance, + width: type === CONST.MEASURED_TEMPLATE_TYPES.RAY ? 5 : undefined, angle: usedAngle, - radius: radius, - direction: direction, - type: usedType + direction: direction }; - await canvas.regions.placeRegion( - { - name: usedType.capitalize(), - shapes: [shapeData], - restriction: { enabled: false, type: 'move', priority: 0 }, - behaviors: [], - displayMeasurements: true, - locked: false, - ownership: { default: CONST.DOCUMENT_OWNERSHIP_LEVELS.NONE }, - visibility: CONST.REGION_VISIBILITY.ALWAYS - }, - { create: true } - ); + CONFIG.ux.TemplateManager.createPreview(data); }; diff --git a/module/helpers/handlebarsHelper.mjs b/module/helpers/handlebarsHelper.mjs index 7f30d970..2faea830 100644 --- a/module/helpers/handlebarsHelper.mjs +++ b/module/helpers/handlebarsHelper.mjs @@ -49,8 +49,9 @@ export default class RegisterHandlebarsHelpers { } static damageSymbols(damageParts) { - const allTypes = [...new Set([...damageParts].flatMap(x => Array.from(x.type)))]; - const symbols = allTypes.map(p => CONFIG.DH.GENERAL.damageTypes[p].icon); + const symbols = [...new Set(damageParts.reduce((a, c) => a.concat([...c.type]), []))].map( + p => CONFIG.DH.GENERAL.damageTypes[p].icon + ); return new Handlebars.SafeString(Array.from(symbols).map(symbol => ``)); } diff --git a/module/helpers/utils.mjs b/module/helpers/utils.mjs index 131f94b7..b49a98ca 100644 --- a/module/helpers/utils.mjs +++ b/module/helpers/utils.mjs @@ -177,10 +177,10 @@ export const getDeleteKeys = (property, innerProperty, innerPropertyDefaultValue [innerProperty]: innerPropertyDefaultValue }; } else { - acc[`${key}.${innerProperty}`] = _del; + acc[`${key}.-=${innerProperty}`] = null; } } else { - acc[`${key}`] = _del; + acc[`-=${key}`] = null; } return acc; @@ -422,12 +422,7 @@ export async function createEmbeddedItemWithEffects(actor, baseData, update) { ...baseData, id: data.id, uuid: data.uuid, - _uuid: data.uuid, - effects: data.effects?.map(effect => effect.toObject()), - _stats: { - ...data._stats, - compendiumSource: data.pack ? `Compendium.${data.pack}.Item.${data.id}` : null - } + effects: data.effects?.map(effect => effect.toObject()) } ]); @@ -480,8 +475,6 @@ export async function waitForDiceSoNice(message) { } export function refreshIsAllowed(allowedTypes, typeToCheck) { - if (!allowedTypes) return true; - switch (typeToCheck) { case CONFIG.DH.GENERAL.refreshTypes.scene.id: case CONFIG.DH.GENERAL.refreshTypes.session.id: @@ -498,38 +491,9 @@ export function refreshIsAllowed(allowedTypes, typeToCheck) { } } -function expireActiveEffectIsAllowed(allowedTypes, typeToCheck) { - if (typeToCheck === CONFIG.DH.GENERAL.activeEffectDurations.act.id) return true; - - return refreshIsAllowed(allowedTypes, typeToCheck); -} - -export function expireActiveEffects(actor, allowedTypes = null) { - const shouldExpireEffects = game.settings.get( - CONFIG.DH.id, - CONFIG.DH.SETTINGS.gameSettings.Automation - ).autoExpireActiveEffects; - if (!shouldExpireEffects) return; - - const effectsToExpire = actor - .getActiveEffects() - .filter(effect => { - if (!effect.system?.duration.type) return false; - - const { temporary, custom } = CONFIG.DH.GENERAL.activeEffectDurations; - if ([temporary.id, custom.id].includes(effect.system.duration.type)) return false; - - return expireActiveEffectIsAllowed(allowedTypes, effect.system.duration.type); - }) - .map(x => x.id); - - actor.deleteEmbeddedDocuments('ActiveEffect', effectsToExpire); -} - export async function getCritDamageBonus(formula) { const critRoll = new Roll(formula); - await critRoll.evaluate(); - return critRoll.dice.reduce((acc, dice) => acc + dice.faces * dice.results.filter(r => r.active).length, 0); + return critRoll.dice.reduce((acc, dice) => acc + dice.faces * dice.number, 0); } export function htmlToText(html) { @@ -539,16 +503,6 @@ export function htmlToText(html) { return tempDivElement.textContent || tempDivElement.innerText || ''; } -export function getIconVisibleActiveEffects(effects) { - return effects.filter(effect => { - if (!(effect instanceof game.system.api.documents.DhActiveEffect)) return true; - - const alwaysShown = effect.showIcon === CONST.ACTIVE_EFFECT_SHOW_ICON.ALWAYS; - const conditionalShown = effect.showIcon === CONST.ACTIVE_EFFECT_SHOW_ICON.CONDITIONAL && !effect.transfer; // TODO: system specific logic - - return !effect.disabled && (alwaysShown || conditionalShown); - }); -} export async function getFeaturesHTMLData(features) { const result = []; for (const feature of features) { @@ -634,8 +588,6 @@ export async function RefreshFeatures( const refreshedActors = {}; for (let actor of game.actors) { if (actorTypes.includes(actor.type) && actor.prototypeToken.actorLink) { - expireActiveEffects(actor, refreshTypes); - const updates = {}; for (let item of actor.items) { if ( @@ -730,79 +682,3 @@ export async function RefreshFeatures( return refreshedActors; } - -export function getUnusedDamageTypes(parts) { - const usedKeys = Object.keys(parts); - return Object.keys(CONFIG.DH.GENERAL.healingTypes).reduce((acc, key) => { - if (!usedKeys.includes(key)) - acc.push({ - value: key, - label: game.i18n.localize(CONFIG.DH.GENERAL.healingTypes[key].label) - }); - - return acc; - }, []); -} - -/** Returns resolved armor sources ordered by application order */ -export function getArmorSources(actor) { - const rawArmorSources = Array.from(actor.allApplicableEffects()).filter(x => x.system.armorData); - if (actor.system.armor) rawArmorSources.push(actor.system.armor); - - const data = rawArmorSources.map(doc => { - // Get the origin item. Since the actor is already loaded, it should already be cached - // Consider the relative function versions if this causes an issue - const origin = doc.origin ? foundry.utils.fromUuidSync(doc.origin) : doc; - return { - origin, - name: origin.name, - document: doc, - data: doc.system.armor ?? doc.system.armorData, - disabled: !!doc.disabled || !!doc.isSuppressed - }; - }); - - return sortBy(data, ({ origin }) => { - switch (origin?.type) { - case 'class': - case 'subclass': - case 'ancestry': - case 'community': - case 'feature': - case 'domainCard': - return 2; - case 'loot': - case 'consumable': - return 3; - case 'character': - return 4; - case 'weapon': - return 5; - case 'armor': - return 6; - default: - return 1; - } - }); -} - -/** - * Returns an array sorted by a function that returns a thing to compare, or an array to compare in order - * Similar to lodash's sortBy function. - */ -export function sortBy(arr, fn) { - const directCompare = (a, b) => (a < b ? -1 : a > b ? 1 : 0); - const cmp = (a, b) => { - const resultA = fn(a); - const resultB = fn(b); - if (Array.isArray(resultA) && Array.isArray(resultB)) { - for (let idx = 0; idx < Math.min(resultA.length, resultB.length); idx++) { - const result = directCompare(resultA[idx], resultB[idx]); - if (result !== 0) return result; - } - return 0; - } - return directCompare(resultA, resultB); - }; - return arr.sort(cmp); -} diff --git a/module/macros/_modules.mjs b/module/macros/_modules.mjs deleted file mode 100644 index d4a5599f..00000000 --- a/module/macros/_modules.mjs +++ /dev/null @@ -1 +0,0 @@ -export { default as spotlightCombatant } from './spotlightCombatant.mjs'; diff --git a/module/macros/spotlightCombatant.mjs b/module/macros/spotlightCombatant.mjs deleted file mode 100644 index 68a26ff9..00000000 --- a/module/macros/spotlightCombatant.mjs +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Spotlights a combatant. - * The combatant can be selected in a number of ways. If many are applied at the same time, the following order is used: - * 1) SelectedCombatant - * 2) HoveredCombatant - */ -const spotlightCombatant = () => { - if (!game.combat) - return ui.notifications.error(game.i18n.localize('DAGGERHEART.MACROS.Spotlight.errors.noActiveCombat')); - - const selectedCombatant = canvas.tokens.controlled.length > 0 ? canvas.tokens.controlled[0].combatant : null; - const hoveredCombatant = game.canvas.tokens.hover?.combatant; - - const combatant = selectedCombatant ?? hoveredCombatant; - if (!combatant) - return ui.notifications.error(game.i18n.localize('DAGGERHEART.MACROS.Spotlight.errors.noCombatantSelected')); - - ui.combat.setCombatantSpotlight(combatant.id); -}; - -export default spotlightCombatant; diff --git a/module/systemRegistration/handlebars.mjs b/module/systemRegistration/handlebars.mjs index e01eec90..d45554d4 100644 --- a/module/systemRegistration/handlebars.mjs +++ b/module/systemRegistration/handlebars.mjs @@ -39,7 +39,6 @@ export const preloadHandlebarsTemplates = async function () { 'systems/daggerheart/templates/ui/tooltip/parts/tooltipChips.hbs', 'systems/daggerheart/templates/ui/tooltip/parts/tooltipTags.hbs', 'systems/daggerheart/templates/dialogs/downtime/activities.hbs', - 'systems/daggerheart/templates/dialogs/tagTeamDialog/parts/tagTeamDamageParts.hbs', 'systems/daggerheart/templates/dialogs/dice-roll/costSelection.hbs', 'systems/daggerheart/templates/ui/chat/parts/roll-part.hbs', 'systems/daggerheart/templates/ui/chat/parts/description-part.hbs', @@ -49,7 +48,6 @@ export const preloadHandlebarsTemplates = async function () { 'systems/daggerheart/templates/ui/itemBrowser/itemContainer.hbs', 'systems/daggerheart/templates/scene/dh-config.hbs', 'systems/daggerheart/templates/settings/appearance-settings/diceSoNiceTab.hbs', - 'systems/daggerheart/templates/ui/tooltip/parts/beastformData.hbs', - 'systems/daggerheart/templates/sheets/activeEffect/typeChanges/armorChange.hbs' + 'systems/daggerheart/templates/ui/tooltip/parts/beastformData.hbs' ]); }; diff --git a/module/systemRegistration/migrations.mjs b/module/systemRegistration/migrations.mjs index 458ee6ef..743d42a4 100644 --- a/module/systemRegistration/migrations.mjs +++ b/module/systemRegistration/migrations.mjs @@ -193,11 +193,11 @@ export async function runMigrations() { } if (foundry.utils.isNewerVersion('1.2.7', lastMigrationVersion)) { - const tagTeam = game.settings.get(CONFIG.DH.id, 'TagTeamRoll'); + const tagTeam = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll); const initatorMissing = tagTeam.initiator && !game.actors.some(actor => actor.id === tagTeam.initiator); const missingMembers = Object.keys(tagTeam.members).reduce((acc, id) => { if (!game.actors.some(actor => actor.id === id)) { - acc[id] = _del; + acc[`-=${id}`] = null; } return acc; }, {}); @@ -206,7 +206,7 @@ export async function runMigrations() { initiator: initatorMissing ? null : tagTeam.initiator, members: missingMembers }); - await game.settings.set(CONFIG.DH.id, 'TagTeamRoll', tagTeam); + await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll, tagTeam); lastMigrationVersion = '1.2.7'; } @@ -246,101 +246,6 @@ export async function runMigrations() { lastMigrationVersion = '1.6.0'; } - - if (foundry.utils.isNewerVersion('2.0.0', lastMigrationVersion)) { - const progress = game.system.api.applications.ui.DhProgress.createMigrationProgress(0); - const progressBuffer = 50; - - //#region Data Setup - const lockedPacks = []; - const itemPacks = game.packs.filter(x => x.metadata.type === 'Item'); - const actorPacks = game.packs.filter(x => x.metadata.type === 'Actor'); - - const getIndexes = async (packs, type) => { - const indexes = []; - for (const pack of packs) { - const indexValues = pack.index.values().reduce((acc, index) => { - if (!type || index.type === type) acc.push(index.uuid); - return acc; - }, []); - - if (indexValues.length && pack.locked) { - lockedPacks.push(pack.collection); - await pack.configure({ locked: false }); - } - - indexes.push(...indexValues); - } - - return indexes; - }; - - const itemEntries = await getIndexes(itemPacks); - const characterEntries = await getIndexes(actorPacks, 'character'); - - const worldItems = game.items; - const worldCharacters = game.actors.filter(x => x.type === 'character'); - - /* The async fetches are the mainstay of time. Leaving 1 progress for the sync logic */ - const newMax = itemEntries.length + characterEntries.length + progressBuffer; - progress.updateMax(newMax); - - const compendiumItems = []; - for (const entry of itemEntries) { - const item = await foundry.utils.fromUuid(entry); - compendiumItems.push(item); - progress.advance(); - } - - const compendiumCharacters = []; - for (const entry of characterEntries) { - const character = await foundry.utils.fromUuid(entry); - compendiumCharacters.push(character); - progress.advance(); - } - //#endregion - - /* Migrate existing effects modifying armor, creating new Armor Effects instead */ - const migrateEffects = async entity => { - for (const effect of entity.effects) { - if (effect.system.changes.every(x => x.key !== 'system.armorScore')) continue; - - effect.update({ - 'system.changes': effect.system.changes.map(change => ({ - ...change, - type: change.key === 'system.armorScore' ? 'armor' : change.type, - value: change.key === 'system.armorScore' ? { current: 0, max: change.value } : change.value - })) - }); - } - }; - - /* Migrate existing armors effects */ - const migrateItems = async items => { - for (const item of items) { - await migrateEffects(item); - } - }; - - await migrateItems([...compendiumItems, ...worldItems]); - progress.advance({ by: progressBuffer / 2 }); - - for (const actor of [...compendiumCharacters, ...worldCharacters]) { - await migrateEffects(actor); - await migrateItems(actor.items); - } - - progress.advance({ by: progressBuffer / 2 }); - - for (let packId of lockedPacks) { - const pack = game.packs.get(packId); - await pack.configure({ locked: true }); - } - - progress.close(); - - lastMigrationVersion = '2.0.0'; - } //#endregion 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 5c7c7542..e7ec37f5 100644 --- a/module/systemRegistration/settings.mjs +++ b/module/systemRegistration/settings.mjs @@ -15,10 +15,9 @@ import { DhMetagamingSettings, DhVariantRuleSettings } from '../applications/settings/_module.mjs'; -import { CompendiumBrowserSettings } from '../data/_module.mjs'; +import { CompendiumBrowserSettings, DhTagTeamRoll } from '../data/_module.mjs'; export const registerDHSettings = () => { - registerKeyBindings(); registerMenuSettings(); registerMenus(); registerNonConfigSettings(); @@ -34,25 +33,6 @@ export const registerDHSettings = () => { }); }; -export const registerKeyBindings = () => { - game.keybindings.register(CONFIG.DH.id, CONFIG.DH.SETTINGS.keybindings.spotlight, { - name: game.i18n.localize('DAGGERHEART.SETTINGS.Keybindings.spotlight.name'), - hint: game.i18n.localize('DAGGERHEART.SETTINGS.Keybindings.spotlight.hint'), - uneditable: [], - editable: [ - { - key: 's', - modifiers: [] - } - ], - onDown: game.system.api.macros.spotlightCombatant, - onUp: () => {}, - restricted: true, - reservedModifiers: [], - precedence: CONST.KEYBINDING_PRECEDENCE.NORMAL - }); -}; - const registerMenuSettings = () => { game.settings.register(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules, { scope: 'world', @@ -177,6 +157,12 @@ const registerNonConfigSettings = () => { type: DhCountdowns }); + game.settings.register(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll, { + scope: 'world', + config: false, + type: DhTagTeamRoll + }); + game.settings.register(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.CompendiumBrowserSettings, { scope: 'world', config: false, diff --git a/module/systemRegistration/socket.mjs b/module/systemRegistration/socket.mjs index fb152959..173ef02b 100644 --- a/module/systemRegistration/socket.mjs +++ b/module/systemRegistration/socket.mjs @@ -15,9 +15,6 @@ export function handleSocketEvent({ action = null, data = {} } = {}) { case socketEvent.DowntimeTrigger: Party.downtimeMoveQuery(data); break; - case socketEvent.TagTeamStart: - Hooks.callAll(CONFIG.DH.HOOKS.hooksConfig.tagTeamStart, data); - break; } } @@ -25,8 +22,7 @@ export const socketEvent = { GMUpdate: 'DhGMUpdate', Refresh: 'DhRefresh', DhpFearUpdate: 'DhFearUpdate', - DowntimeTrigger: 'DowntimeTrigger', - TagTeamStart: 'DhTagTeamStart' + DowntimeTrigger: 'DowntimeTrigger' }; export const GMUpdateEvent = { diff --git a/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json b/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json index 0dd182fa..e2b3a444 100644 --- a/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json +++ b/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json @@ -91,8 +91,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -118,7 +118,7 @@ }, "base": false } - }, + ], "includeBase": false }, "_id": "TCKVaVweyJzhEArX", @@ -343,7 +343,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -400,18 +400,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "act" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -423,16 +423,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!89yAh30vaNQOALlz.ctXYwil2D1zfsekT.9PsnogEPsp1OOK64" } ], @@ -471,8 +461,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -499,7 +489,7 @@ } } }, - "armor": { + { "value": { "custom": { "enabled": true, @@ -524,7 +514,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -598,8 +588,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -626,7 +616,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -652,8 +642,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -680,7 +670,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json b/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json index c4b4eb2a..16fb61d8 100644 --- a/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json +++ b/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json @@ -75,8 +75,8 @@ }, "range": "veryClose", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -102,7 +102,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -400,8 +400,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -427,7 +427,7 @@ } } } - }, + ], "includeBase": false, "direct": true }, @@ -508,7 +508,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -581,8 +581,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -608,7 +608,7 @@ } } }, - "hope": { + { "value": { "custom": { "enabled": true, @@ -633,7 +633,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json b/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json index 4c63297d..23f1f339 100644 --- a/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json +++ b/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json @@ -72,8 +72,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -100,7 +100,7 @@ }, "base": false } - } + ] }, "img": "icons/weapons/daggers/dagger-bone-black.webp", "type": "attack", diff --git a/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json b/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json index dfae0598..d4e506cb 100644 --- a/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json +++ b/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json @@ -85,8 +85,8 @@ }, "range": "far", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -112,7 +112,7 @@ }, "base": false } - } + ] }, "img": "icons/magic/unholy/beam-ringed-impact-purple.webp", "type": "attack", @@ -256,7 +256,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -336,8 +336,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -363,7 +363,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -414,8 +414,8 @@ "recovery": null }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -440,7 +440,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -488,19 +488,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until you roll with Hope.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Vulnerable until you roll with Hope.

", "tint": "#ffffff", @@ -512,16 +511,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!WPEOIGfclNJxWb87.4EECsXzHFG0RoIg0.KGdf2eqcXkdigg0u" } ], @@ -619,7 +608,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -692,8 +681,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -719,7 +708,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json b/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json index 965c5168..5a13b3d9 100644 --- a/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json +++ b/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json @@ -80,8 +80,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "img": "icons/weapons/bows/longbow-recurve-leather-brown.webp", "type": "attack", @@ -246,8 +246,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -273,7 +273,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json b/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json index 67e10c53..5b15bc09 100644 --- a/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json +++ b/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json @@ -68,8 +68,8 @@ "description": "

A group of trained archers bearing massive bows.

", "attack": { "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -95,7 +95,7 @@ "resultBased": false, "base": false } - } + ] }, "name": "Longbow", "img": "icons/weapons/bows/longbow-recurve-leather-brown.webp", @@ -270,8 +270,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -295,7 +295,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -368,8 +368,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -393,7 +393,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json b/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json index 4b3a872a..8b553c83 100644 --- a/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json +++ b/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json @@ -81,8 +81,8 @@ }, "range": "close", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -108,7 +108,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -277,21 +277,20 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until you clear a HP.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

Vulnerable until you clear a HP.

", + "description": "

Vulnerable until you clear a HP.

", "tint": "#ffffff", "statuses": [ "vulnerable" @@ -301,16 +300,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!h5RuhzGL17dW5FBT.Fz2lnUEeBxsDpx0G.2iBVUGHtGW3I9VIj" } ], diff --git a/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json b/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json index 74ed8dfd..96a1b752 100644 --- a/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json +++ b/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json @@ -80,8 +80,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "range": "melee", "type": "attack", @@ -309,7 +309,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -382,8 +382,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -409,7 +409,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -482,8 +482,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -509,7 +509,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -582,8 +582,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -609,7 +609,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -667,21 +667,20 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until their next roll with Hope.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

Vulnerable until your next roll with Hope.

", + "description": "

Vulnerable until your next roll with Hope.

", "tint": "#ffffff", "statuses": [ "vulnerable" @@ -691,16 +690,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!dgH3fW9FTYLaIDvS.XtnByqUr9AuYU9Ip.9NQcCXMhjyBReJRd" } ], @@ -737,8 +726,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -763,7 +752,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -836,7 +825,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -894,21 +883,20 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until the cube is defeated.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

Vulnerable until the cube is defeated.

", + "description": "

Vulnerable until the cube is defeated.

", "tint": "#ffffff", "statuses": [ "vulnerable" @@ -918,16 +906,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!dgH3fW9FTYLaIDvS.ijIaKjroxq3xZd9Z.S7kJlhnV8Nexzi8l" } ], @@ -964,8 +942,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -991,7 +969,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -1071,8 +1049,8 @@ "recovery": null }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -1097,7 +1075,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -1165,8 +1143,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -1192,7 +1170,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json b/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json index cfc71120..da5de611 100644 --- a/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json +++ b/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json @@ -84,8 +84,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -111,7 +111,7 @@ }, "base": false } - } + ] }, "img": "icons/creatures/claws/claw-straight-brown.webp", "type": "attack", @@ -284,8 +284,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -311,7 +311,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -368,19 +368,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until you break free with a successful Strength Roll.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

You are Restrained until you break free with a successful Strength Roll.

", "tint": "#ffffff", @@ -392,16 +391,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!71qKDLKO3CsrNkdy.zgR0MEqyobKp2yXr.U50Ccm9emMqAxma6" } ], @@ -441,8 +430,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -468,7 +457,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json b/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json index a315f91a..8ee7c56c 100644 --- a/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json +++ b/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json @@ -80,8 +80,8 @@ "name": "Longsword", "img": "icons/weapons/swords/sword-guard.webp", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", @@ -246,7 +246,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -319,7 +319,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -376,19 +376,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until you break free with a successful attack, Finesse Roll, or Strength Roll.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

You are Restrained until you break free with a successful attack, Finesse Roll, or Strength Roll.

", "tint": "#ffffff", @@ -400,16 +399,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!B4LZcGuBAHzyVdzy.9gizFt9ovKL05DXu.LmzztuktRkwOCy1a" } ], diff --git a/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json b/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json index 8863641d..c829c3f9 100644 --- a/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json +++ b/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json @@ -83,8 +83,8 @@ }, "range": "veryClose", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -110,7 +110,7 @@ }, "base": false } - } + ] }, "img": "icons/skills/melee/unarmed-punch-fist-yellow-red.webp", "type": "attack", @@ -280,8 +280,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -307,7 +307,7 @@ } } } - }, + ], "includeBase": false, "direct": true }, @@ -389,8 +389,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -415,7 +415,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -452,18 +452,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -475,16 +475,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!2UeZ0tEe7AzgSJNd.69reUZ5tv3splqyO.CjMrSdL6kgD8mKRQ" } ], diff --git a/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json b/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json index cb081441..5b2d2e41 100644 --- a/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json +++ b/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json @@ -79,8 +79,8 @@ }, "range": "veryClose", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -106,7 +106,7 @@ }, "base": false } - }, + ], "direct": true }, "name": "Club", @@ -336,8 +336,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false, @@ -365,7 +365,7 @@ } } } - }, + ], "includeBase": false, "direct": true }, @@ -412,8 +412,8 @@ "recovery": null }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -438,7 +438,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -507,8 +507,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -534,7 +534,7 @@ } } } - }, + ], "includeBase": false, "direct": true }, diff --git a/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json b/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json index a95db1b7..f548870a 100644 --- a/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json +++ b/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json @@ -74,8 +74,8 @@ }, "range": "close", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -101,7 +101,7 @@ }, "base": false } - } + ] }, "img": "icons/magic/light/beam-rays-magenta.webp", "type": "attack", @@ -383,8 +383,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -410,7 +410,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -483,8 +483,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -508,7 +508,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json b/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json index 5cbc1f82..35c43a3b 100644 --- a/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json +++ b/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json @@ -67,8 +67,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -95,7 +95,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false diff --git a/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json b/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json index 067248c9..310eefce 100644 --- a/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json +++ b/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json @@ -72,8 +72,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -99,7 +99,7 @@ }, "base": false } - } + ] }, "name": "Fist Slam", "img": "icons/skills/melee/unarmed-punch-fist-yellow-red.webp", @@ -332,8 +332,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -359,7 +359,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -534,8 +534,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -561,7 +561,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json b/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json index aba9ea46..668cd943 100644 --- a/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json +++ b/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json @@ -84,8 +84,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -111,7 +111,7 @@ }, "base": false } - } + ] }, "img": "icons/weapons/daggers/dagger-straight-cracked.webp", "type": "attack", @@ -256,8 +256,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -282,7 +282,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -320,19 +320,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until the scene ends or they succeed on a social action against the Courtesan.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Vulnerable until the scene ends or they succeed on a social action against the Courtesan.

", "tint": "#ffffff", @@ -344,16 +343,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!ZxWaWPdzFIUPNC62.rSMUPC5GhR982ifg.blcRqns0PHqiuPac" } ], diff --git a/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json b/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json index 8777ee06..6721666f 100644 --- a/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json +++ b/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json @@ -79,8 +79,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -106,7 +106,7 @@ }, "base": false } - } + ] }, "img": "icons/weapons/daggers/dagger-twin-green.webp", "type": "attack", @@ -253,8 +253,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -279,7 +279,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -336,18 +336,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "scene" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -359,16 +359,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!CBBuEXAlLKFMJdjg.LYNaKEYcYMgvF4Rf.YNMhgBZW8ndrCjIp" } ], diff --git a/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json b/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json index cbb48681..14eb579b 100644 --- a/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json +++ b/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json @@ -84,8 +84,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -111,7 +111,7 @@ }, "base": false } - } + ] }, "range": "far", "img": "icons/weapons/staves/staff-ornate-purple.webp", @@ -256,8 +256,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -283,7 +283,7 @@ } } }, - "stress": { + { "value": { "custom": { "enabled": true, @@ -308,7 +308,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -422,32 +422,31 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.resistance.magical.resistance", - "value": 1, - "priority": null, - "type": "override" - }, - { - "key": "system.resistance.physical.resistance", - "value": 1, - "priority": null, - "type": "override" - } - ], - "duration": { - "type": "temporary", - "description": "

Until the Cult Adept marks their last HP.

" } }, + "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": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Resistance to all damage until the Adept marks their last HP

", "tint": "#ffffff", @@ -457,16 +456,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!0NxCSugvKQ4W8OYZ.IHWDn097sRgjlZXO.U9lWz1LgeAiK5L85" } ], @@ -544,19 +533,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until you break free with a successful Strength or Instinct Roll.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

You are Restrained in smoky chains until you break free with a successful Strength or Instinct Roll. A target Restrained by this feature must spend a Hope to make an action roll.

", "tint": "#ffffff", @@ -568,16 +556,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!0NxCSugvKQ4W8OYZ.JpSrduK3vjd9h098.lNH6srSPyEprXZ4o" } ], @@ -614,8 +592,8 @@ "recovery": "scene" }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -640,7 +618,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json b/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json index e65f3202..57e7a7c7 100644 --- a/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json +++ b/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json @@ -74,8 +74,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -101,7 +101,7 @@ }, "base": false } - } + ] }, "range": "melee", "type": "attack", @@ -300,8 +300,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -326,7 +326,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -384,18 +384,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -407,16 +407,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!tyBOpLfigAhI9bU3.ohASSruBxcvuItIK.LwWxRz7FTMA80VdA" } ], diff --git a/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json b/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json index 4f04a85a..a0c0713d 100644 --- a/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json +++ b/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json @@ -66,8 +66,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -94,7 +94,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", diff --git a/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json b/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json index aed2e08a..cd745eb6 100644 --- a/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json +++ b/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json @@ -79,8 +79,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -106,7 +106,7 @@ }, "base": false } - } + ] }, "img": "icons/magic/nature/root-vines-grow-brown.webp", "type": "attack", @@ -245,8 +245,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -271,7 +271,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -325,8 +325,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -350,7 +350,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -407,19 +407,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until the Deeproot Defender takes Severe damage.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

You are Restrained until the Defender takes Severe damage.

", "tint": "#ffffff", @@ -431,16 +430,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!9x2xY9zwc3xzbXo5.rreGFW5TbhUoZf2T.F3E7fiz01AbF2kr5" } ], diff --git a/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json b/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json index 1a3538da..e4ba41fb 100644 --- a/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json +++ b/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json @@ -80,8 +80,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", diff --git a/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json b/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json index e2f58709..830848c3 100644 --- a/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json +++ b/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json @@ -80,8 +80,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "far", @@ -354,25 +354,25 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.rules.dualityRoll.defaultHopeDice", - "value": "d8", - "priority": null, - "type": "override" - } - ], - "duration": { - "type": "shortRest" } }, + "changes": [ + { + "key": "system.rules.dualityRoll.defaultHopeDice", + "mode": 5, + "value": "d8", + "priority": null + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

All targets affected replace their Hope Die with a d8 until they roll a success with Hope or their next rest.

", "tint": "#ffffff", @@ -382,16 +382,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!kE4dfhqmIQpNd44e.FC8PIf4BVkhmoJX8.6WSx03mFbpbPWnOI" } ], @@ -435,8 +425,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -461,7 +451,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -515,8 +505,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -542,7 +532,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json b/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json index 9f954437..16bc1d1f 100644 --- a/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json +++ b/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json @@ -81,8 +81,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -108,7 +108,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -251,8 +251,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -277,7 +277,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -329,8 +329,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -355,7 +355,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -414,8 +414,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -441,7 +441,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -550,8 +550,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -576,7 +576,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json b/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json index c083b183..31f9b942 100644 --- a/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json +++ b/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json @@ -80,8 +80,8 @@ }, "range": "far", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - }, + ], "direct": true }, "img": "icons/magic/symbols/rune-sigil-rough-white-teal.webp", @@ -352,7 +352,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json b/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json index 201b17fd..2341ee8a 100644 --- a/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json +++ b/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json @@ -81,8 +81,8 @@ }, "img": "icons/skills/melee/unarmed-punch-fist-yellow-red.webp", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -108,7 +108,7 @@ }, "base": false } - }, + ], "direct": true }, "type": "attack", @@ -317,25 +317,25 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.rules.dualityRoll.defaultFearDice", - "value": "d20", - "priority": null, - "type": "override" - } - ], - "duration": { - "type": "scene" } }, + "changes": [ + { + "key": "system.rules.dualityRoll.defaultFearDice", + "mode": 5, + "value": "d20", + "priority": null + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

You use a d20 as your Fear Die until the end of the scene.

", "tint": "#ffffff", @@ -345,16 +345,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!5lphJAgzoqZI3VoG.a33PW8UkziliowlR.gFeHLGgeRoDdd3VG" } ], @@ -398,8 +388,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -425,7 +415,7 @@ } } } - }, + ], "includeBase": false, "direct": true }, diff --git a/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json b/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json index 2043d960..7482c734 100644 --- a/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json +++ b/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json @@ -74,8 +74,8 @@ "motivesAndTactics": "Cause fear, consume fl esh, please masters", "attack": { "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -101,7 +101,7 @@ "resultBased": false, "base": false } - } + ] }, "name": "Claws and Fangs", "img": "icons/creatures/abilities/mouth-teeth-rows-red.webp", @@ -269,8 +269,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -295,7 +295,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -349,8 +349,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -376,7 +376,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json b/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json index 23d5550e..16ec7643 100644 --- a/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json +++ b/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json @@ -78,8 +78,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -105,7 +105,7 @@ }, "base": false } - } + ] }, "img": "icons/creatures/claws/claw-hooked-curved.webp", "type": "attack", @@ -312,8 +312,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -337,7 +337,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -397,8 +397,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -424,7 +424,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json b/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json index 939a5307..e3ecda4e 100644 --- a/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json +++ b/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json @@ -79,8 +79,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -106,7 +106,7 @@ }, "base": false } - } + ] }, "img": "icons/creatures/claws/claw-straight-brown.webp", "type": "attack", @@ -247,8 +247,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -272,7 +272,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -352,8 +352,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -377,7 +377,7 @@ } } } - }, + ], "includeBase": false, "direct": true }, @@ -435,19 +435,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until they clear at least 1 HP.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -459,16 +458,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!wNzeuQLfLUMvgHlQ.85XrqDvLP30YOO43.YNKHEFQ4ucGr4Rmc" } ], diff --git a/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json b/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json index c69ee84e..ca9ce647 100644 --- a/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json +++ b/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json @@ -81,8 +81,8 @@ }, "range": "far", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -108,7 +108,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -251,7 +251,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -297,8 +297,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -324,7 +324,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -438,8 +438,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -464,7 +464,7 @@ }, "type": [] }, - "stress": { + { "value": { "custom": { "enabled": true, @@ -489,7 +489,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json b/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json index 1909a74a..9386944f 100644 --- a/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json +++ b/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json @@ -68,8 +68,8 @@ "motivesAndTactics": "Avoid larger predators, shock prey, tear apart", "attack": { "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -95,7 +95,7 @@ "resultBased": false, "base": false } - } + ] }, "name": "Shocking Bite", "img": "icons/creatures/abilities/mouth-teeth-sharp.webp", @@ -270,8 +270,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -297,7 +297,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json b/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json index 2c2633ea..5c25f63e 100644 --- a/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json +++ b/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json @@ -67,8 +67,8 @@ }, "range": "close", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -95,7 +95,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false diff --git a/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json b/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json index df3e6d12..de5db0b2 100644 --- a/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json +++ b/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json @@ -98,8 +98,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -125,7 +125,7 @@ }, "base": false } - }, + ], "includeBase": false }, "target": { @@ -276,8 +276,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -303,7 +303,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json b/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json index 70e56980..408d5102 100644 --- a/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json +++ b/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json @@ -79,8 +79,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -106,7 +106,7 @@ }, "base": false } - } + ] }, "img": "icons/creatures/claws/claw-hooked-barbed.webp", "range": "melee", diff --git a/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json b/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json index 8c0d7b95..931e4c0a 100644 --- a/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json +++ b/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json @@ -67,8 +67,8 @@ "img": "icons/weapons/axes/axe-battle-skull-black.webp", "range": "veryClose", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -95,7 +95,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -256,8 +256,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -282,7 +282,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json b/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json index 06db1453..fc064958 100644 --- a/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json +++ b/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json @@ -80,8 +80,8 @@ }, "range": "far", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "img": "icons/weapons/staves/staff-animal-skull-bull.webp", "type": "attack", @@ -251,8 +251,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -278,7 +278,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -385,41 +385,30 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until youbreak free with a successful Instinct Roll.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Restrained and Vulnerable until you break free, ending both conditions, with a successful Instinct Roll.

", "tint": "#ffffff", "statuses": [ - "vulnerable", - "restrained" + "restrained", + "vulnerable" ], "sort": 0, "flags": {}, "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!PELRry1vqjBzSAlr.ecp9o8t1dQFXGsse.Q99saHj6NOY2PSXf" } ], @@ -482,8 +471,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -508,7 +497,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -583,19 +572,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

A target can break free from their regret with a successful Presence or Strength Roll.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Vulnerable until you break free from your regret with a successful Presence or Strength Roll. If you fail to break free, you lose a Hope.

", "tint": "#ffffff", @@ -607,16 +595,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!PELRry1vqjBzSAlr.gwSgBhkcekCGvXxz.pWDg0MADoohKu40O" } ], 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 9fa49107..8f3865e9 100644 --- a/src/packs/adversaries/adversary_Fallen_Warlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json +++ b/src/packs/adversaries/adversary_Fallen_Warlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json @@ -67,8 +67,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -94,7 +94,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", @@ -337,7 +337,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -416,8 +416,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -443,7 +443,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -516,8 +516,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -543,7 +543,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -653,8 +653,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -679,7 +679,7 @@ } } } - }, + ], "includeBase": false }, "target": { 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 5ad77ab0..89d61c1c 100644 --- a/src/packs/adversaries/adversary_Fallen_Warlord__Undefeated_Champion_RXkZTwBRi4dJ3JE5.json +++ b/src/packs/adversaries/adversary_Fallen_Warlord__Undefeated_Champion_RXkZTwBRi4dJ3JE5.json @@ -67,8 +67,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -94,7 +94,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", @@ -338,7 +338,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -410,8 +410,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -437,7 +437,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -697,8 +697,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -724,7 +724,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -792,8 +792,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -818,7 +818,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json b/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json index c6a482dd..6d09a490 100644 --- a/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json +++ b/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json @@ -81,8 +81,8 @@ }, "range": "far", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -108,7 +108,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -269,8 +269,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -294,7 +294,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -352,19 +352,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until you break free with a successful Finesse or Strength Roll.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

You are Restrained until you break free with a successful Finesse or Strength Roll.

", "tint": "#ffffff", @@ -376,16 +375,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!8VZIgU12cB3cvlyH.6ZrDjgnWufJohkp1.vb1sZCOLwDNLsr3j" } ], diff --git a/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json b/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json index 8948c8b6..4f76b706 100644 --- a/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json +++ b/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json @@ -81,8 +81,8 @@ }, "range": "veryClose", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -108,7 +108,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -251,8 +251,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -278,7 +278,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -351,8 +351,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -378,7 +378,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -452,8 +452,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -479,7 +479,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json b/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json index a8a33586..b0ba4170 100644 --- a/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json +++ b/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json @@ -98,8 +98,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -125,7 +125,7 @@ }, "base": false } - }, + ], "includeBase": false }, "target": { @@ -345,8 +345,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -372,7 +372,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -430,18 +430,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "act" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Vulnerable until the next time you act.

", "tint": "#ffffff", @@ -453,16 +453,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!OMQ0v6PE8s1mSU0K.MabIQE1Kjn60j08J.m6qqQZxukDPVcGdQ" } ], @@ -499,8 +489,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -526,7 +516,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -643,8 +633,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -670,7 +660,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json b/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json index a74cb88d..fbb30d40 100644 --- a/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json +++ b/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json @@ -74,8 +74,8 @@ "motivesAndTactics": "Fly away, harass, steal blood", "attack": { "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -101,7 +101,7 @@ "resultBased": false, "base": false } - } + ] }, "name": "Proboscis", "img": "icons/skills/wounds/blood-cells-vessel-red.webp", diff --git a/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json b/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json index 822ee035..d1df6b57 100644 --- a/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json +++ b/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json @@ -72,8 +72,8 @@ "name": "Claws", "img": "icons/creatures/claws/claw-straight-brown.webp", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -100,7 +100,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", @@ -272,7 +272,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json b/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json index 376ebace..adcdf015 100644 --- a/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json +++ b/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json @@ -62,8 +62,8 @@ "name": "Warhammer", "img": "icons/weapons/hammers/hammer-double-stone-worn.webp", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -90,7 +90,7 @@ }, "base": false } - } + ] }, "range": "veryClose", "roll": { diff --git a/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json b/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json index 03a0272d..99b5ed46 100644 --- a/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json +++ b/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json @@ -80,8 +80,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", @@ -253,8 +253,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -280,7 +280,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -354,8 +354,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -381,7 +381,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -438,18 +438,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "shortRest" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

You are Poisoned until your next rest or until you succeed on a Knowledge Roll (16). While Poisoned, you must roll a d6 before you make an action roll. On a result of 4 or lower, you must mark a Stress.

[[/dr trait=knowledge difficulty=16]]

", "tint": "#ffffff", @@ -459,16 +459,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!fmfntuJ8mHRCAktP.lANiDkxxth2sGacT.oILkLJlGNZl7KI1R" } ], @@ -508,8 +498,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -535,7 +525,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json b/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json index 5876f55c..f02a1c52 100644 --- a/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json +++ b/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json @@ -75,8 +75,8 @@ }, "range": "veryClose", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -102,7 +102,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -240,8 +240,8 @@ "recovery": null }, "damage": { - "parts": { - "armor": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -266,7 +266,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -326,8 +326,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -351,7 +351,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -459,8 +459,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -486,7 +486,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -532,7 +532,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json b/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json index 1fcfcce4..deeafa37 100644 --- a/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json +++ b/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json @@ -80,8 +80,8 @@ }, "range": "far", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "img": "icons/weapons/bows/shortbow-recurve-yellow.webp", "type": "attack", @@ -335,25 +335,25 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.rules.conditionImmunities.hidden", - "value": 1, - "priority": null, - "type": "override" - } - ], - "duration": { - "type": "scene" } }, + "changes": [ + { + "key": "system.rules.conditionImmunities.hidden", + "mode": 5, + "value": "1", + "priority": null + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

You Glow until the end of the scene and can’t become Hidden. Attack rolls made against you have advantage.

", "tint": "#ffffff", @@ -363,16 +363,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!8mJYMpbLTb8qIOrr.NepVGKOo1lHYjA1F.bYBrgiSwHwYfQyjn" } ], @@ -409,8 +399,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -436,7 +426,7 @@ } } }, - "stress": { + { "value": { "custom": { "enabled": true, @@ -461,7 +451,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -541,7 +531,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -652,8 +642,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -679,7 +669,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json b/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json index 077373b2..a20d80e6 100644 --- a/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json +++ b/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json @@ -75,8 +75,8 @@ }, "range": "veryClose", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -102,7 +102,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -268,8 +268,8 @@ "recovery": null }, "damage": { - "parts": { - "armor": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -294,7 +294,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -422,8 +422,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -449,7 +449,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -507,19 +507,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until your next roll with Hope.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Vulnerable until your next roll with Hope.

", "tint": "#ffffff", @@ -531,16 +530,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!dsfB3YhoL5SudvS2.q45DiEFlXqcXZ5hv.38MUzfbH64EMLVse" } ], @@ -578,8 +567,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -605,7 +594,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json b/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json index b44bb9cc..be037b10 100644 --- a/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json +++ b/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json @@ -75,8 +75,8 @@ }, "range": "veryClose", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -102,7 +102,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -245,8 +245,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -272,7 +272,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -401,7 +401,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -459,41 +459,30 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

You can break free with a successful Strength or Instinct Roll.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

You are Restrained and Vulnerable as you are drowning. You can break free, ending both conditions, with a successful Strength or Instinct Roll.

", "tint": "#ffffff", "statuses": [ - "vulnerable", - "restrained" + "restrained", + "vulnerable" ], "sort": 0, "flags": {}, "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!xIICT6tEdnA7dKDV.bcwFQeuU6ZfIGjau.X8NF2OB23mSpDvlx" } ], diff --git a/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json b/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json index a3a76d7a..b03b5495 100644 --- a/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json +++ b/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json @@ -79,8 +79,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -106,7 +106,7 @@ }, "base": false } - } + ] }, "img": "icons/creatures/slimes/slime-movement-dripping-pseudopods-green.webp", "type": "attack", @@ -277,8 +277,8 @@ "recovery": null }, "damage": { - "parts": { - "armor": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -303,7 +303,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -356,8 +356,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -383,7 +383,7 @@ } } }, - "stress": { + { "value": { "custom": { "enabled": true, @@ -408,7 +408,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -465,19 +465,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

If the Green Ooze takes Severe damage, the target is freed.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

You must mark an additional Stress when you make an action roll. If the Ooze takes Severe damage, you are freed.

", "tint": "#ffffff", @@ -487,16 +486,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!SHXedd9zZPVfUgUa.Sm9Sk4mSvcq6PkmR.yk5kR5OVLCgDWfgY" } ], diff --git a/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json b/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json index eb7eafc1..8cce1b94 100644 --- a/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json +++ b/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json @@ -75,8 +75,8 @@ "name": "Sanctified Longbow", "img": "icons/weapons/bows/shortbow-recurve-yellow.webp", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -102,7 +102,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -314,8 +314,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -341,7 +341,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json b/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json index 6a131c86..95a2ecd0 100644 --- a/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json +++ b/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json @@ -65,8 +65,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -93,7 +93,7 @@ }, "base": false } - } + ] }, "img": "icons/skills/melee/sword-shield-stylized-white.webp", "type": "attack", diff --git a/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json b/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json index 84034a7e..89d82a0b 100644 --- a/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json +++ b/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json @@ -79,8 +79,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -106,7 +106,7 @@ }, "base": false } - } + ] }, "img": "icons/weapons/polearms/spear-hooked-rounded.webp", "type": "attack", @@ -278,8 +278,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -305,7 +305,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json b/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json index f0c050a9..75afed49 100644 --- a/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json +++ b/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json @@ -85,8 +85,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -112,7 +112,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", @@ -258,7 +258,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -398,8 +398,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -425,7 +425,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json b/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json index 322e4658..d5891359 100644 --- a/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json +++ b/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json @@ -80,8 +80,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", @@ -244,8 +244,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -270,7 +270,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -322,7 +322,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -394,8 +394,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -420,7 +420,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -542,8 +542,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -568,7 +568,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json b/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json index 3dc96fd5..0a952540 100644 --- a/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json +++ b/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json @@ -80,8 +80,8 @@ }, "range": "veryClose", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "img": "icons/skills/melee/strike-blade-hooked-orange-blue.webp", "type": "attack", @@ -391,21 +391,20 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until the High Seraph is defeated. The High Seraph can only mark one target at a time.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

While Guilty, you don’t gain Hope on a result with Hope.

", + "description": "

While Guilty, you don’t gain Hope on a result with Hope.

", "tint": "#ffffff", "statuses": [], "sort": 0, @@ -413,16 +412,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!r1mbfSSwKWdcFdAU.FilEB21L5q9XxKE1.O8G0oOf9f3qzNOAT" } ], @@ -466,8 +455,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -493,7 +482,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json b/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json index 1615dec8..3bb8ae96 100644 --- a/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json +++ b/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json @@ -80,8 +80,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", @@ -274,8 +274,8 @@ "recovery": null }, "damage": { - "parts": { - "armor": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -300,7 +300,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -352,8 +352,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -378,7 +378,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -436,19 +436,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

When the Huge Green Ooze takes Severe damage, all Enveloped targets are freed and the condition is cleared.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

While Enveloped, you must mark an additional Stress every time you make an action roll. When the Ooze takes Severe damage, all Enveloped targets are freed and the condition is cleared.

", "tint": "#ffffff", @@ -458,16 +457,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!6hbqmxDXFOzZJDk4.pfXYuH7rtsyVjSXh.EwZ8owroJxFpg81e" } ], diff --git a/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json b/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json index 7e71af98..4c6fd61f 100644 --- a/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json +++ b/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json @@ -75,8 +75,8 @@ }, "range": "close", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -102,7 +102,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -300,8 +300,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -326,7 +326,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -394,8 +394,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -420,7 +420,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -507,26 +507,25 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.resistance.magical.immunity", - "value": 1, - "priority": null, - "type": "override" - } - ], - "duration": { - "type": "temporary", - "description": "

Until the next roll with Fear.

" } }, + "changes": [ + { + "key": "system.resistance.magical.immunity", + "mode": 5, + "value": "1", + "priority": null + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

While Dazed, they can’t use their Regeneration action but are immune to magic damage.

", "tint": "#ffffff", @@ -536,16 +535,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!MI126iMOOobQ1Obn.sJzjcRBgYRp5f53E.iBJ3YhEkVsGKEIVk" } ], diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Bandit_5Lh1T0zaT8Pkr2U2.json b/src/packs/adversaries/adversary_Jagged_Knife_Bandit_5Lh1T0zaT8Pkr2U2.json index bfbff494..ae359eaf 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Bandit_5Lh1T0zaT8Pkr2U2.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Bandit_5Lh1T0zaT8Pkr2U2.json @@ -79,8 +79,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -106,7 +106,7 @@ }, "base": false } - } + ] }, "img": "icons/weapons/daggers/dagger-twin-green.webp", "type": "attack", @@ -272,8 +272,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -299,7 +299,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json b/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json index c6b2554e..6ca9749c 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json @@ -80,8 +80,8 @@ }, "img": "icons/weapons/staves/staff-blue-jewel.webp", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -278,18 +278,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Whenever you roll with Hope, the hexer can mark a stress to make the roll be with Fear instead.

", "tint": "#ffffff", @@ -299,16 +299,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!MbBPIOxaxXYNApXz.Bl8L0RCGOgVUzuXo.ihy3kvEGSOEKdNfT" } ], @@ -347,8 +337,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -374,7 +364,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json b/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json index 3ce6a165..c38260e9 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json @@ -85,8 +85,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -112,7 +112,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", @@ -277,7 +277,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -334,26 +334,25 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.rules.attack.damage.hpDamageTakenMultiplier", - "value": 2, - "priority": null, - "type": "override" - } - ], - "duration": { - "type": "temporary", - "description": "

The target can break free, clearing both conditions, with a successful Strength Roll or is freed automatically if the Jagged Knife Kneebreaker takes Major or greater damage.

" } }, + "changes": [ + { + "key": "system.rules.attack.damage.hpDamageTakenMultiplier", + "mode": 5, + "value": "2", + "priority": null + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -366,16 +365,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!CBKixLH3yhivZZuL.Sa4Nt0eoDjirBKGf.d7sB1Qa1kJMnglqu" } ], diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json b/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json index cfcdea8b..a52ec1c9 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json @@ -64,8 +64,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -92,7 +92,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json b/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json index 8820f30c..c139d76f 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json @@ -80,8 +80,8 @@ }, "range": "close", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -364,8 +364,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -391,7 +391,7 @@ } } }, - "stress": { + { "value": { "custom": { "enabled": true, @@ -416,7 +416,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -491,8 +491,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -518,7 +518,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json b/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json index 81b95d8b..bca035c1 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json @@ -80,8 +80,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", @@ -246,8 +246,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -273,7 +273,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Sniper_1zuyof1XuIfi3aMG.json b/src/packs/adversaries/adversary_Jagged_Knife_Sniper_1zuyof1XuIfi3aMG.json index 62253d69..6fd02cb5 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Sniper_1zuyof1XuIfi3aMG.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Sniper_1zuyof1XuIfi3aMG.json @@ -81,8 +81,8 @@ }, "range": "far", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -108,7 +108,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -246,8 +246,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -273,7 +273,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json b/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json index 562b42b8..86d69c37 100644 --- a/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json +++ b/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json @@ -75,8 +75,8 @@ }, "range": "veryClose", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -102,7 +102,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -296,7 +296,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -417,7 +417,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -490,8 +490,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -516,7 +516,7 @@ }, "type": [] }, - "hope": { + { "value": { "custom": { "enabled": true, @@ -541,7 +541,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { 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 01435922..71cb7a8d 100644 --- a/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json +++ b/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json @@ -90,8 +90,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -117,7 +117,7 @@ }, "base": false } - } + ] }, "range": "melee", "type": "attack", @@ -392,8 +392,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -417,7 +417,7 @@ } } }, - "stress": { + { "value": { "custom": { "enabled": true, @@ -442,7 +442,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json b/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json index 4494e0e8..3b84774e 100644 --- a/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json +++ b/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json @@ -80,8 +80,8 @@ }, "range": "close", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "img": "icons/creatures/tentacles/tentacles-octopus-black-pink.webp", "type": "attack", @@ -327,7 +327,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -385,41 +385,30 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until you break free with a successful Strength Roll or the Kraken takes Major or greater damage.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

You are Restrained and Vulnerable until you break free with a successful Strength Roll or the Kraken takes Major or greater damage. While Restrained and Vulnerable in this way, you must mark a Stress when you make an action roll.

", "tint": "#ffffff", "statuses": [ - "vulnerable", - "restrained" + "restrained", + "vulnerable" ], "sort": 0, "flags": {}, "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!4nqv3ZwJGjnmic8j.vz2BWhispgR7mSWF.Xes6ZIE01CCN67KF" } ], @@ -456,8 +445,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -483,7 +472,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -557,8 +546,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -584,7 +573,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json b/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json index 25740e52..528df6a9 100644 --- a/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json +++ b/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json @@ -80,8 +80,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "range": "melee", "type": "attack", @@ -244,8 +244,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -269,7 +269,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -342,7 +342,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -400,41 +400,30 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until you break free with a successful Finesse or Strength Roll (13).

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

You are Restrained and Vulnerable until you break free, ending both conditions, with a successful Finesse or Strength Roll (13).

[[/dr trait=finesse difficulty=13]]
[[/dr trait=strength difficulty=13]]

", "tint": "#ffffff", "statuses": [ - "vulnerable", - "restrained" + "restrained", + "vulnerable" ], "sort": 0, "flags": {}, "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!niBpVU7yeo5ccskE.tP2DD751nOLxFVps.zMut1PRphlwE0xOa" } ], diff --git a/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json b/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json index 2131023a..3cec6e0b 100644 --- a/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json +++ b/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json @@ -86,8 +86,8 @@ }, "range": "close", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -113,7 +113,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -254,8 +254,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false, @@ -283,7 +283,7 @@ } } } - }, + ], "includeBase": false, "direct": true }, @@ -469,8 +469,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -496,7 +496,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Merchant_Al3w2CgjfdT3p9ma.json b/src/packs/adversaries/adversary_Merchant_Al3w2CgjfdT3p9ma.json index 482ba727..880b1a6e 100644 --- a/src/packs/adversaries/adversary_Merchant_Al3w2CgjfdT3p9ma.json +++ b/src/packs/adversaries/adversary_Merchant_Al3w2CgjfdT3p9ma.json @@ -79,8 +79,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -106,7 +106,7 @@ }, "base": false } - } + ] }, "img": "icons/weapons/clubs/club-baton-blue.webp", "type": "attack", @@ -272,8 +272,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -298,7 +298,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json b/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json index 7ace67ac..15c0aeb9 100644 --- a/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json +++ b/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json @@ -85,8 +85,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -112,7 +112,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", @@ -249,8 +249,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -275,7 +275,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json b/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json index 21564421..b1732c71 100644 --- a/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json +++ b/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json @@ -74,8 +74,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -101,7 +101,7 @@ }, "base": false } - } + ] }, "range": "close", "type": "attack", @@ -317,8 +317,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -343,7 +343,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -380,18 +380,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "shortRest" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Vulnerable until your next rest or you clear a HP.

", "tint": "#ffffff", @@ -403,16 +403,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!sRn4bqerfARvhgSV.oAxhAawgcK7DAdpa.KIyV2eXDmmymXY5y" } ], @@ -458,8 +448,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -485,7 +475,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -567,8 +557,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -594,7 +584,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json b/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json index 8f5f51f3..0fceeba1 100644 --- a/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json +++ b/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json @@ -74,8 +74,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -101,7 +101,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", @@ -299,8 +299,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -325,7 +325,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -385,8 +385,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -412,7 +412,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -544,8 +544,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -571,7 +571,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json b/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json index 0cc9703c..2980a141 100644 --- a/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json +++ b/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json @@ -75,8 +75,8 @@ }, "range": "far", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -102,7 +102,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -297,8 +297,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -324,7 +324,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -405,8 +405,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -432,7 +432,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -511,8 +511,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -537,7 +537,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -578,8 +578,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -604,7 +604,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -674,8 +674,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -701,7 +701,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json b/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json index b2217e66..f05ba5fc 100644 --- a/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json +++ b/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json @@ -66,8 +66,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -94,7 +94,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", diff --git a/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json b/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json index b4734967..85981374 100644 --- a/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json +++ b/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json @@ -74,8 +74,8 @@ }, "range": "veryClose", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -101,7 +101,7 @@ }, "base": false } - } + ] }, "img": "icons/weapons/axes/axe-double.webp", "type": "attack", @@ -300,8 +300,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -327,7 +327,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -373,8 +373,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -401,7 +401,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -454,8 +454,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -479,7 +479,7 @@ } } } - }, + ], "includeBase": false, "direct": true }, diff --git a/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json b/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json index 8d5845a9..5320a0ed 100644 --- a/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json +++ b/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json @@ -85,8 +85,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -112,7 +112,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", @@ -381,8 +381,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": false, @@ -408,7 +408,7 @@ }, "type": [] } - }, + ], "includeBase": false, "direct": false }, diff --git a/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json b/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json index 2eaa9619..8bc7fe10 100644 --- a/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json +++ b/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json @@ -81,8 +81,8 @@ }, "range": "veryClose", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -108,7 +108,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -244,8 +244,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -270,7 +270,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -361,8 +361,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false, @@ -390,7 +390,7 @@ } } } - }, + ], "includeBase": false, "direct": true }, @@ -444,18 +444,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "scene" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Attacks made by the Hunter against a Deathlocked target deal direct damage.

", "tint": "#ffffff", @@ -465,16 +465,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!mVV7a7KQAORoPMgZ.r1T70u9n3bRfUTX5.YznseQP43jNrk07h" } ], @@ -518,7 +508,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -591,8 +581,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -618,7 +608,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json b/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json index c5feed37..3c110024 100644 --- a/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json +++ b/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json @@ -73,8 +73,8 @@ }, "range": "veryClose", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "multiplier": "flat", "flatMultiplier": 3, @@ -100,7 +100,7 @@ }, "base": false } - } + ] }, "img": "icons/skills/melee/blood-slash-foam-red.webp", "type": "attack", @@ -273,8 +273,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false, @@ -302,7 +302,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -399,26 +399,25 @@ "type": "withinRange", "target": "any", "range": "self" - }, - "changes": [ - { - "key": "system.resistance.physical.resistance", - "value": 1, - "priority": null, - "type": "add" - } - ], - "duration": { - "type": "temporary", - "description": "

Can end this effect instead of moving while they are spotlighted.

" } }, + "changes": [ + { + "key": "system.resistance.physical.resistance", + "mode": 2, + "value": "1", + "priority": null + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Mark a Stress to Root the Treant in place. The Treant is Restrained while Rooted and can end this effect instead of moving while they are spotlighted. While Rooted the Treant has resistance to physical damage.

", "tint": "#ffffff", @@ -428,16 +427,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!XK78QUfY8c8Go8Uv.sqkgw26P2KiQVtXT.3PY5KIG6d3dr3dty" } ], diff --git a/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json b/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json index 343cfdc1..66fa5ba1 100644 --- a/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json +++ b/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json @@ -80,8 +80,8 @@ }, "range": "far", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "img": "icons/magic/symbols/rune-sigil-rough-white-teal.webp", "type": "attack", @@ -244,8 +244,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -270,7 +270,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -322,8 +322,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -348,7 +348,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -407,8 +407,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -434,7 +434,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -514,7 +514,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -620,8 +620,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -647,7 +647,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json b/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json index 0f73354e..5b565b8c 100644 --- a/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json +++ b/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json @@ -74,8 +74,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -101,7 +101,7 @@ }, "base": false } - } + ] }, "img": "icons/creatures/tentacles/tentacle-earth-green.webp", "type": "attack", @@ -263,7 +263,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -384,7 +384,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -442,20 +442,20 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "scene" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

Unstuck from reality until the end of the scene. When you spend Hope or mark Armor Slots, HP, or Stress, you must double the amount spent or marked.

", + "description": "

Unstuck from reality until the end of the scene. When you spend Hope or mark Armor Slots, HP, or Stress, you must double the amount spent or marked.

", "tint": "#ffffff", "statuses": [], "sort": 0, @@ -463,16 +463,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!A0SeeDzwjvqOsyof.K3MQO1I42nmfM2F2.edEZER9ImWicMwRb" } ], @@ -509,7 +499,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Outer_Realms_Corrupter_ms6nuOl3NFkhPj1k.json b/src/packs/adversaries/adversary_Outer_Realms_Corrupter_ms6nuOl3NFkhPj1k.json index 6c78dced..83fbf4fa 100644 --- a/src/packs/adversaries/adversary_Outer_Realms_Corrupter_ms6nuOl3NFkhPj1k.json +++ b/src/packs/adversaries/adversary_Outer_Realms_Corrupter_ms6nuOl3NFkhPj1k.json @@ -75,8 +75,8 @@ }, "img": "icons/creatures/tentacles/tentacles-thing-green.webp", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -102,7 +102,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -238,8 +238,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -264,7 +264,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -316,8 +316,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -342,7 +342,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json b/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json index 5a7a605a..5347bf49 100644 --- a/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json +++ b/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json @@ -60,8 +60,8 @@ }, "attack": { "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -88,7 +88,7 @@ }, "base": false } - } + ] }, "name": "Claws and Teeth", "roll": { diff --git a/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json b/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json index 999f89b9..b63e8cb7 100644 --- a/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json +++ b/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json @@ -85,8 +85,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -112,7 +112,7 @@ }, "base": false } - } + ] }, "img": "icons/commodities/biological/hand-clawed-blue.webp", "type": "attack", @@ -252,8 +252,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -281,7 +281,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -360,8 +360,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -386,7 +386,7 @@ }, "type": [] }, - "stress": { + { "value": { "custom": { "enabled": true, @@ -411,7 +411,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -487,8 +487,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -513,7 +513,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json b/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json index a6ce78d5..e3da56b6 100644 --- a/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json +++ b/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json @@ -75,8 +75,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -102,7 +102,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -238,8 +238,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -264,7 +264,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -348,8 +348,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -375,7 +375,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -433,19 +433,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "shortRest", - "description": "" } }, + "changes": [], "disabled": true, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Vulnerable until your next rest.

", "tint": "#ffffff", @@ -457,16 +456,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!CP6iRfHdyFWniTHY.CKy2r6FguyTSO9Fm.Q5eeh0B6qaXFS1Ck" } ], diff --git a/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json b/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json index bee77686..db284f40 100644 --- a/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json +++ b/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json @@ -80,8 +80,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", diff --git a/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json b/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json index 428a9607..5b00ec60 100644 --- a/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json +++ b/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json @@ -85,8 +85,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -112,7 +112,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", @@ -251,8 +251,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -277,7 +277,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -401,8 +401,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -426,7 +426,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -501,8 +501,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -528,7 +528,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Pirate_Raiders_5YgEajn0wa4i85kC.json b/src/packs/adversaries/adversary_Pirate_Raiders_5YgEajn0wa4i85kC.json index 94137c2f..41f79b49 100644 --- a/src/packs/adversaries/adversary_Pirate_Raiders_5YgEajn0wa4i85kC.json +++ b/src/packs/adversaries/adversary_Pirate_Raiders_5YgEajn0wa4i85kC.json @@ -74,8 +74,8 @@ "description": "

Seafaring scoundrels moving in a ravaging pack.

", "attack": { "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -101,7 +101,7 @@ "resultBased": false, "base": false } - } + ] }, "name": "Cutlass", "img": "icons/weapons/swords/scimitar-worn-blue.webp", @@ -272,8 +272,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -298,7 +298,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Pirate_Tough_mhcVkVFrzIJ18FDm.json b/src/packs/adversaries/adversary_Pirate_Tough_mhcVkVFrzIJ18FDm.json index 2817b191..69b59211 100644 --- a/src/packs/adversaries/adversary_Pirate_Tough_mhcVkVFrzIJ18FDm.json +++ b/src/packs/adversaries/adversary_Pirate_Tough_mhcVkVFrzIJ18FDm.json @@ -67,8 +67,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -94,7 +94,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", @@ -269,8 +269,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -295,7 +295,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -347,8 +347,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -374,7 +374,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json b/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json index f74da475..2c10ae3f 100644 --- a/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json +++ b/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json @@ -79,8 +79,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -106,7 +106,7 @@ }, "base": false } - } + ] }, "img": "icons/creatures/slimes/slime-movement-dripping-pseudopods-green.webp", "type": "attack", @@ -272,8 +272,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -299,7 +299,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -350,8 +350,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -377,7 +377,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -409,19 +409,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until they’re extinguished with a successful Finesse Roll (14)

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

You are Ignited until you are extinguished with a successful Finesse Roll (14). While Ignited, you take 1d4 magic damage whenever you make an action roll.

[[/dr trait=finesse difficulty=14]]

", "tint": "#ffffff", @@ -431,16 +430,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!9rVlbJVrDNn1x7PS.JU9uVwZSM0ItnZRq.9UBLk9M87VIUziAQ" } ], diff --git a/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json b/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json index 6755d27f..7672961c 100644 --- a/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json +++ b/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json @@ -57,8 +57,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -85,7 +85,7 @@ }, "base": false } - } + ] }, "img": "icons/creatures/abilities/mouth-teeth-sharp.webp", "type": "attack", diff --git a/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json b/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json index e215a444..8593ec01 100644 --- a/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json +++ b/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json @@ -86,8 +86,8 @@ }, "range": "far", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -113,7 +113,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -249,8 +249,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -275,7 +275,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json b/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json index 93bfef2c..d17c3f86 100644 --- a/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json +++ b/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json @@ -85,8 +85,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -112,7 +112,7 @@ }, "base": false } - } + ] }, "img": "icons/weapons/staves/staff-ornate-purple.webp", "type": "attack", @@ -256,7 +256,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -336,8 +336,8 @@ "recovery": null }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -362,7 +362,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json b/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json index ed6d7775..514be8f5 100644 --- a/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json +++ b/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json @@ -61,8 +61,8 @@ "attack": { "name": "Longsword", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -89,7 +89,7 @@ }, "base": false } - } + ] }, "roll": { "bonus": 3, diff --git a/src/packs/adversaries/adversary_Shambling_Zombie_2nXz4ilAY4xuhKLm.json b/src/packs/adversaries/adversary_Shambling_Zombie_2nXz4ilAY4xuhKLm.json index 5161f8e2..7c3925ac 100644 --- a/src/packs/adversaries/adversary_Shambling_Zombie_2nXz4ilAY4xuhKLm.json +++ b/src/packs/adversaries/adversary_Shambling_Zombie_2nXz4ilAY4xuhKLm.json @@ -74,8 +74,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -101,7 +101,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", @@ -266,8 +266,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -292,7 +292,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json b/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json index f9bad7ea..e385a6c5 100644 --- a/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json +++ b/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json @@ -75,8 +75,8 @@ }, "range": "veryClose", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -102,7 +102,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -238,8 +238,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -264,7 +264,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -316,8 +316,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -343,7 +343,7 @@ } } }, - "armor": { + { "value": { "custom": { "enabled": true, @@ -368,7 +368,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json b/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json index 38f77982..a72c6d46 100644 --- a/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json +++ b/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json @@ -79,8 +79,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -106,7 +106,7 @@ }, "base": false } - } + ] }, "img": "icons/creatures/abilities/mouth-teeth-sharp.webp", "range": "melee", @@ -244,8 +244,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -271,7 +271,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -350,7 +350,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -408,21 +408,20 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until you mark 2 Stress.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

While Entranced, you can’t act and are Vulnerable.

", + "description": "

While Entranced, you can’t act and are Vulnerable.

", "tint": "#ffffff", "statuses": [ "vulnerable" @@ -432,16 +431,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!BK4jwyXSRx7IOQiO.Ks3HpB4W1l5FqR7p.xrm5786ckKbMYHjn" } ], diff --git a/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json b/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json index f0dde9f0..9d837ac0 100644 --- a/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json +++ b/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json @@ -74,8 +74,8 @@ }, "range": "far", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -101,7 +101,7 @@ }, "base": false } - } + ] }, "img": "icons/weapons/bows/shortbow-leather.webp", "type": "attack", @@ -310,8 +310,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -337,7 +337,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json b/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json index e4cbab5e..4013d7fe 100644 --- a/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json +++ b/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json @@ -58,8 +58,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -86,7 +86,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", diff --git a/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json b/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json index 8b2042f3..3c26dd28 100644 --- a/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json +++ b/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json @@ -74,8 +74,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -101,7 +101,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", @@ -240,8 +240,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -266,7 +266,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -326,8 +326,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -353,7 +353,7 @@ } } }, - "stress": { + { "value": { "custom": { "enabled": true, @@ -378,7 +378,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -452,8 +452,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -479,7 +479,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json b/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json index 726b06e1..28003d5c 100644 --- a/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json +++ b/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json @@ -73,8 +73,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -100,7 +100,7 @@ }, "base": false } - } + ] }, "img": "icons/weapons/swords/sword-guard-brass-worn.webp", "type": "attack", @@ -310,7 +310,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json b/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json index 5b9cbb65..e6cc30f7 100644 --- a/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json +++ b/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json @@ -80,8 +80,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "range": "far", "type": "attack", @@ -343,8 +343,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -370,7 +370,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json b/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json index 0572e018..b70a5d53 100644 --- a/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json +++ b/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json @@ -76,8 +76,8 @@ "name": "Longbow", "img": "icons/weapons/bows/longbow-recurve-skull-brown.webp", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -103,7 +103,7 @@ }, "base": false } - } + ] }, "roll": { "bonus": 3, @@ -456,8 +456,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -483,7 +483,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json b/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json index 85893254..577a7d25 100644 --- a/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json +++ b/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json @@ -81,8 +81,8 @@ }, "range": "veryClose", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -108,7 +108,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -350,8 +350,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -377,7 +377,7 @@ } } }, - "stress": { + { "value": { "custom": { "enabled": true, @@ -402,7 +402,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json b/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json index 90c7d68f..13d6ed84 100644 --- a/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json +++ b/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json @@ -80,8 +80,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -108,7 +108,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", @@ -280,8 +280,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -307,7 +307,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -439,8 +439,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -466,7 +466,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json b/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json index 0e160edb..5affdc44 100644 --- a/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json +++ b/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json @@ -79,8 +79,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -106,7 +106,7 @@ }, "base": false } - } + ] }, "img": "icons/weapons/daggers/dagger-curved-purple.webp", "range": "melee", @@ -329,8 +329,8 @@ "recovery": null }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -354,7 +354,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json b/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json index e7738a46..603182cc 100644 --- a/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json +++ b/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json @@ -80,8 +80,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", @@ -244,8 +244,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -271,7 +271,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -330,7 +330,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -410,8 +410,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -435,7 +435,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json b/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json index c50c426d..de3ef9f2 100644 --- a/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json +++ b/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json @@ -80,8 +80,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "range": "melee", "type": "attack", @@ -276,8 +276,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -301,7 +301,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -359,18 +359,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -382,16 +382,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!3aAS2Qm3R6cgaYfE.tQgxiSS48TJ3X1Dl.6UgMuuJ8ZygbCsDh" } ], @@ -435,8 +425,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -462,7 +452,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -573,8 +563,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -600,7 +590,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json b/src/packs/adversaries/adversary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json index 28d5dabe..014b3dc6 100644 --- a/src/packs/adversaries/adversary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json +++ b/src/packs/adversaries/adversary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json @@ -68,8 +68,8 @@ "description": "

A skittering mass of ordinary rodents moving as one like a ravenous wave.

", "attack": { "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -95,7 +95,7 @@ "resultBased": false, "base": false } - } + ] }, "name": "Claws", "img": "icons/creatures/claws/claw-straight-brown.webp", diff --git a/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json b/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json index f3ce03c3..2ec5e924 100644 --- a/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json +++ b/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json @@ -80,8 +80,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", @@ -246,8 +246,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -273,7 +273,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -353,8 +353,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -380,7 +380,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json b/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json index f8f93cf2..40297eb6 100644 --- a/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json +++ b/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json @@ -99,8 +99,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -126,7 +126,7 @@ "resultBased": false, "base": false } - }, + ], "includeBase": false }, "description": "", @@ -309,8 +309,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false, @@ -338,7 +338,7 @@ } } } - }, + ], "includeBase": false, "direct": true }, diff --git a/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json b/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json index c36502de..33afaa3a 100644 --- a/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json +++ b/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json @@ -94,8 +94,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -122,7 +122,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/adversaries/adversary_Tiny_Green_Ooze_aLkLFuVoKz2NLoBK.json b/src/packs/adversaries/adversary_Tiny_Green_Ooze_aLkLFuVoKz2NLoBK.json index 9470502c..6a984b3c 100644 --- a/src/packs/adversaries/adversary_Tiny_Green_Ooze_aLkLFuVoKz2NLoBK.json +++ b/src/packs/adversaries/adversary_Tiny_Green_Ooze_aLkLFuVoKz2NLoBK.json @@ -57,8 +57,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -84,7 +84,7 @@ }, "base": false } - } + ] }, "img": "icons/creatures/slimes/slime-movement-dripping-pseudopods-green.webp", "type": "attack", @@ -128,9 +128,12 @@ "src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg", "anchorX": 0.5, "anchorY": 0.5, + "offsetX": 0, + "offsetY": 0, "fit": "contain", "scaleX": 1, "scaleY": 1, + "rotation": 0, "tint": "#ffffff", "alphaThreshold": 0.75 }, @@ -181,7 +184,7 @@ "saturation": 0, "contrast": 0 }, - "detectionModes": {}, + "detectionModes": [], "occludable": { "radius": 0 }, @@ -207,8 +210,7 @@ "flags": {}, "randomImg": false, "appendNumber": false, - "prependAdjective": false, - "depth": 1 + "prependAdjective": false }, "items": [ { @@ -217,7 +219,7 @@ "_id": "WpOh5kHHx7lcTvEY", "img": "icons/magic/acid/dissolve-drip-droplet-smoke.webp", "system": { - "description": "

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

", + "description": "

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

", "resource": null, "actions": { "HfK0u0c7NRppuF1Q": { @@ -234,8 +236,8 @@ "recovery": null }, "damage": { - "parts": { - "armor": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -260,7 +262,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json b/src/packs/adversaries/adversary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json index 28d6490e..116fffba 100644 --- a/src/packs/adversaries/adversary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json +++ b/src/packs/adversaries/adversary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json @@ -58,8 +58,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -85,7 +85,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", @@ -236,8 +236,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -263,7 +263,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json b/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json index c6c11d36..ad9d8107 100644 --- a/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json +++ b/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json @@ -66,8 +66,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -94,7 +94,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", diff --git a/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json b/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json index 6ba4935a..4f51cd79 100644 --- a/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json +++ b/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json @@ -80,8 +80,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", @@ -244,8 +244,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -269,7 +269,7 @@ } } }, - "hope": { + { "value": { "custom": { "enabled": true, @@ -294,7 +294,7 @@ } } }, - "stress": { + { "value": { "custom": { "enabled": true, @@ -319,7 +319,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json b/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json index 97c493a8..d1cca592 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json @@ -75,8 +75,8 @@ }, "range": "veryClose", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -102,7 +102,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -270,7 +270,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -328,21 +328,20 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until freed with a successful Strength Roll (18).

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

You are Restrained within the Gaoler until freed with a successful Strength Roll (18). While Restrained, you can only attack the Gaoler.

", + "description": "

You are Restrained within the Gaoler until freed with a successful Strength Roll (18). While Restrained, you can only attack the Gaoler.

", "tint": "#ffffff", "statuses": [ "restrained" @@ -352,16 +351,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!JqYraOqNmmhHk4Yy.VlHp8RjHy7MK8rqC.6TZlstmWJPbeoL7i" } ], diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json b/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json index d4fa0340..67139669 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json @@ -75,8 +75,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -102,7 +102,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -132,9 +132,12 @@ "src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg", "anchorX": 0.5, "anchorY": 0.5, + "offsetX": 0, + "offsetY": 0, "fit": "contain", "scaleX": 1, "scaleY": 1, + "rotation": 0, "tint": "#ffffff", "alphaThreshold": 0.75 }, @@ -185,7 +188,7 @@ "saturation": 0, "contrast": 0 }, - "detectionModes": {}, + "detectionModes": [], "occludable": { "radius": 0 }, @@ -211,8 +214,7 @@ "flags": {}, "randomImg": false, "appendNumber": false, - "prependAdjective": false, - "depth": 1 + "prependAdjective": false }, "items": [ { @@ -244,7 +246,7 @@ "name": "Box In", "type": "feature", "system": { - "description": "

Mark a Stress to choose a target within Very Close range to focus on. That target has disadvantage on attack rolls when they’re within Very Close range of the @Lookup[@name]. The @Lookup[@name] can only focus on one target at a time.

", + "description": "

Mark a Stress to choose a target within Very Close range to focus on. That target has disadvantage on attack rolls when they’re within Very Close range of the @Lookup[@name]. The @Lookup[@name]Sentinel can only focus on one target at a time.

", "resource": null, "actions": { "4RQnBu4kcUs3PcPH": { @@ -373,8 +375,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -400,7 +402,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -474,8 +476,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -501,7 +503,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json b/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json index d723df80..ab683607 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json @@ -74,8 +74,8 @@ }, "range": "far", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -101,7 +101,7 @@ }, "base": false } - } + ] }, "img": "icons/commodities/tech/metal-joint.webp", "type": "attack", @@ -429,8 +429,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -456,7 +456,7 @@ } } } - }, + ], "includeBase": false }, "target": { 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 f6a8bc84..82bdd810 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json @@ -67,8 +67,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -94,7 +94,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", @@ -451,8 +451,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -477,7 +477,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -529,8 +529,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -556,7 +556,7 @@ } } }, - "stress": { + { "value": { "custom": { "enabled": true, @@ -581,7 +581,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -710,8 +710,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -737,7 +737,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -841,19 +841,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until you break free with a successful Strength Roll.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Restrained by the rubble until you break free with a successful Strength Roll.

", "tint": "#ffffff", @@ -865,16 +864,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!pMuXGCSOQaxpi5tb.uWiyaJPXcoW06pOM.YUjdwrEZ4zn7WR9X" } ], 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 25c8b637..7f9deb6c 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json @@ -67,8 +67,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -94,7 +94,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", @@ -359,8 +359,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -386,7 +386,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -459,8 +459,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -486,7 +486,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -566,7 +566,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -612,8 +612,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -639,7 +639,7 @@ } } }, - "stress": { + { "value": { "custom": { "enabled": false @@ -663,7 +663,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -721,19 +721,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until you clear a Stress.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Vulnerable until you clear a Stress.

", "tint": "#ffffff", @@ -745,16 +744,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!eArAPuB38CNR0ZIM.2mK8kxfp2WBUeBri.xmzA6NC9zrulhzQs" } ], @@ -791,8 +780,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -818,7 +807,7 @@ } } } - }, + ], "includeBase": false, "direct": true }, diff --git a/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json b/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json index 227efccc..5f32aae5 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json @@ -67,8 +67,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -94,7 +94,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", @@ -465,8 +465,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -490,7 +490,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -607,8 +607,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -634,7 +634,7 @@ } } }, - "stress": { + { "value": { "custom": { "enabled": true, @@ -659,7 +659,7 @@ }, "type": [] }, - "hope": { + { "value": { "custom": { "enabled": true, @@ -684,7 +684,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json b/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json index 55be8e1a..f087c63d 100644 --- a/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json +++ b/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json @@ -86,8 +86,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -113,7 +113,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -367,8 +367,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -394,7 +394,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -474,8 +474,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -501,7 +501,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -574,8 +574,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -601,7 +601,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json b/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json index 8eaf56f9..2989468b 100644 --- a/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json +++ b/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json @@ -75,8 +75,8 @@ "img": "icons/weapons/swords/greatsword-guard-gold-worn.webp", "range": "veryClose", "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -102,7 +102,7 @@ }, "base": false } - } + ] }, "type": "attack", "chatDisplay": false @@ -240,8 +240,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -267,7 +267,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -324,19 +324,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until your next successful attack

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

The next time the Taunted target attacks, they have disadvantage against targets other than the Weaponmaster.

", "tint": "#ffffff", @@ -346,16 +345,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!ZNbQ2jg35LG4t9eH.tyGgOqQzDSIypoMz.j2jYmYbtWXvq32yX" } ], @@ -416,8 +405,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -442,7 +431,7 @@ }, "type": [] }, - "stress": { + { "value": { "custom": { "enabled": true, @@ -467,7 +456,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -537,8 +526,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -564,7 +553,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json b/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json index 9d7f66d0..446a4af3 100644 --- a/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json +++ b/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json @@ -80,8 +80,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ }, "base": false } - } + ] }, "type": "attack", "range": "melee", @@ -253,7 +253,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -367,21 +367,20 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until they’re freed with a successful Strength Roll.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

You are Restrained until you're freed with a successful Strength Roll. When a creature makes an action roll against the cage, they must mark a Stress.

", + "description": "

You are Restrained until you're freed with a successful Strength Roll. When a creature makes an action roll against the cage, they must mark a Stress.

", "tint": "#ffffff", "statuses": [ "restrained" @@ -391,16 +390,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!8yUj2Mzvnifhxegm.i8NoUGUTNY2C5NhC.k8LzBWRZo6VPqvpH" } ], @@ -440,8 +429,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -467,7 +456,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json b/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json index 09e76fa8..c55262e4 100644 --- a/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json +++ b/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json @@ -79,8 +79,8 @@ "type": "attack" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -106,7 +106,7 @@ }, "base": false } - } + ] }, "img": "icons/creatures/claws/claw-scaled-red.webp", "type": "attack", @@ -302,8 +302,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -328,7 +328,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -412,8 +412,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -439,7 +439,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -563,7 +563,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -621,19 +621,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until they dig themselves out from the debris.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Vulnerable until you dig yourself out from the debris.

", "tint": "#ffffff", @@ -645,16 +644,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!UGPiPLJsPvMTSKEF.CcRTxCDCJskiu3fI.40cFHuNdEvbUZ9rs" } ], @@ -691,8 +680,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -717,7 +706,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -755,26 +744,25 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.disadvantageSources", - "value": "On attack rolls.", - "priority": null, - "type": "add" - } - ], - "duration": { - "type": "temporary", - "description": "

Until your next rest or you clear a Stress.

" } }, + "changes": [ + { + "key": "system.disadvantageSources", + "mode": 2, + "value": "On attack rolls.", + "priority": null + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Chilled until your next rest or you clear a Stress. While you are Chilled, you have disadvantage on attack rolls.

", "tint": "#ffffff", @@ -784,16 +772,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!UGPiPLJsPvMTSKEF.nXZHOfcYvjg3YMNU.1JlRxa07i8T1a9x6" } ], @@ -831,8 +809,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -858,7 +836,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json b/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json index 2c3495ff..91bdab81 100644 --- a/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json +++ b/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json @@ -68,8 +68,8 @@ "motivesAndTactics": "Consume brain, shred fl esh, surround", "attack": { "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -95,7 +95,7 @@ "resultBased": false, "base": false } - } + ] }, "name": "Undead Hands", "roll": { diff --git a/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json b/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json index f418758a..017537ad 100644 --- a/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json +++ b/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json @@ -68,8 +68,8 @@ "description": "

A group of shambling corpses instinctively moving together.

", "attack": { "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -95,7 +95,7 @@ "resultBased": false, "base": false } - } + ] }, "name": "Bite", "roll": { diff --git a/src/packs/ancestries/feature_Charge_AA2CZlJSWW8GPhrR.json b/src/packs/ancestries/feature_Charge_AA2CZlJSWW8GPhrR.json index 0af2610a..f1f7ae35 100644 --- a/src/packs/ancestries/feature_Charge_AA2CZlJSWW8GPhrR.json +++ b/src/packs/ancestries/feature_Charge_AA2CZlJSWW8GPhrR.json @@ -29,8 +29,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -56,7 +56,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/ancestries/feature_Elemental_Breath_sRaE3CgkgjBF1UpV.json b/src/packs/ancestries/feature_Elemental_Breath_sRaE3CgkgjBF1UpV.json index a660daf5..71ac4438 100644 --- a/src/packs/ancestries/feature_Elemental_Breath_sRaE3CgkgjBF1UpV.json +++ b/src/packs/ancestries/feature_Elemental_Breath_sRaE3CgkgjBF1UpV.json @@ -22,8 +22,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -47,7 +47,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/ancestries/feature_Fungril_Network_9tmeXm623hl4Qnws.json b/src/packs/ancestries/feature_Fungril_Network_9tmeXm623hl4Qnws.json index 87638f37..9d970a67 100644 --- a/src/packs/ancestries/feature_Fungril_Network_9tmeXm623hl4Qnws.json +++ b/src/packs/ancestries/feature_Fungril_Network_9tmeXm623hl4Qnws.json @@ -22,7 +22,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/ancestries/feature_Kick_gpW19TfJk0WWFh1S.json b/src/packs/ancestries/feature_Kick_gpW19TfJk0WWFh1S.json index b363b6c2..89546ded 100644 --- a/src/packs/ancestries/feature_Kick_gpW19TfJk0WWFh1S.json +++ b/src/packs/ancestries/feature_Kick_gpW19TfJk0WWFh1S.json @@ -31,8 +31,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false, @@ -58,7 +58,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/ancestries/feature_Long_Tongue_oWbdlh51ajn1Q5kL.json b/src/packs/ancestries/feature_Long_Tongue_oWbdlh51ajn1Q5kL.json index 1f1156d7..aee64a9a 100644 --- a/src/packs/ancestries/feature_Long_Tongue_oWbdlh51ajn1Q5kL.json +++ b/src/packs/ancestries/feature_Long_Tongue_oWbdlh51ajn1Q5kL.json @@ -29,8 +29,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -54,7 +54,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/ancestries/feature_Luckbringer_8O6SQQMxKWr430QA.json b/src/packs/ancestries/feature_Luckbringer_8O6SQQMxKWr430QA.json index 36fd73fb..3c31d62d 100644 --- a/src/packs/ancestries/feature_Luckbringer_8O6SQQMxKWr430QA.json +++ b/src/packs/ancestries/feature_Luckbringer_8O6SQQMxKWr430QA.json @@ -22,8 +22,8 @@ "recovery": "session" }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -48,7 +48,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/ancestries/feature_Retracting_Claws_Zj69cAeb3NjIa8Hn.json b/src/packs/ancestries/feature_Retracting_Claws_Zj69cAeb3NjIa8Hn.json index b9b000f4..8e408ec6 100644 --- a/src/packs/ancestries/feature_Retracting_Claws_Zj69cAeb3NjIa8Hn.json +++ b/src/packs/ancestries/feature_Retracting_Claws_Zj69cAeb3NjIa8Hn.json @@ -22,7 +22,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -83,18 +83,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -106,16 +106,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!Zj69cAeb3NjIa8Hn.pO76svFkmWmZ6LjC" } ], diff --git a/src/packs/ancestries/feature_Tusks_YhxD1ujZpftPu19w.json b/src/packs/ancestries/feature_Tusks_YhxD1ujZpftPu19w.json index 6038f2c6..5bd72773 100644 --- a/src/packs/ancestries/feature_Tusks_YhxD1ujZpftPu19w.json +++ b/src/packs/ancestries/feature_Tusks_YhxD1ujZpftPu19w.json @@ -31,8 +31,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false, @@ -58,7 +58,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/ancestries/feature_Unshakeable_G5pE8FW94V1W9jJx.json b/src/packs/ancestries/feature_Unshakeable_G5pE8FW94V1W9jJx.json index bf0a241b..195b10e8 100644 --- a/src/packs/ancestries/feature_Unshakeable_G5pE8FW94V1W9jJx.json +++ b/src/packs/ancestries/feature_Unshakeable_G5pE8FW94V1W9jJx.json @@ -22,7 +22,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/beastforms/beastform_Agile_Scout_a9UoCwtrbgKk02mK.json b/src/packs/beastforms/beastform_Agile_Scout_a9UoCwtrbgKk02mK.json index bd9bfffb..71018bc9 100644 --- a/src/packs/beastforms/beastform_Agile_Scout_a9UoCwtrbgKk02mK.json +++ b/src/packs/beastforms/beastform_Agile_Scout_a9UoCwtrbgKk02mK.json @@ -29,7 +29,8 @@ "Compendium.daggerheart.beastforms.Item.QFg1hNCEoKVDd9Zo" ], "evolved": { - "mainTraitBonus": 0 + "mainTraitBonus": 0, + "maximumTier": 1 }, "hybrid": { "beastformOptions": 2, diff --git a/src/packs/beastforms/feature_Demolish_DfBXO8jTchwFG8dZ.json b/src/packs/beastforms/feature_Demolish_DfBXO8jTchwFG8dZ.json index 43ba16a8..b7d85ef1 100644 --- a/src/packs/beastforms/feature_Demolish_DfBXO8jTchwFG8dZ.json +++ b/src/packs/beastforms/feature_Demolish_DfBXO8jTchwFG8dZ.json @@ -27,8 +27,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -52,7 +52,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -107,18 +107,17 @@ "transfer": false, "_id": "FXdFgEgqVl5gIWJS", "type": "base", - "system": { - "changes": [], - "duration": { - "type": "temporary" - } - }, + "system": {}, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -130,16 +129,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!DfBXO8jTchwFG8dZ.FXdFgEgqVl5gIWJS" } ], diff --git a/src/packs/beastforms/feature_Elusive_Prey_a7Qvmm14nx9BCysA.json b/src/packs/beastforms/feature_Elusive_Prey_a7Qvmm14nx9BCysA.json index a81eb8af..d99a6ab7 100644 --- a/src/packs/beastforms/feature_Elusive_Prey_a7Qvmm14nx9BCysA.json +++ b/src/packs/beastforms/feature_Elusive_Prey_a7Qvmm14nx9BCysA.json @@ -27,7 +27,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/beastforms/feature_Hobbling_Strike_8u0HkK3WgtU9lWYs.json b/src/packs/beastforms/feature_Hobbling_Strike_8u0HkK3WgtU9lWYs.json index a1d80e5d..6a16f864 100644 --- a/src/packs/beastforms/feature_Hobbling_Strike_8u0HkK3WgtU9lWYs.json +++ b/src/packs/beastforms/feature_Hobbling_Strike_8u0HkK3WgtU9lWYs.json @@ -58,18 +58,17 @@ "transfer": false, "_id": "2kKkV9zhfvqA2vlt", "type": "base", - "system": { - "changes": [], - "duration": { - "type": "temporary" - } - }, + "system": {}, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -81,16 +80,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!8u0HkK3WgtU9lWYs.2kKkV9zhfvqA2vlt" } ], diff --git a/src/packs/beastforms/feature_Ocean_Master_tGDdEH40wyOCsFmH.json b/src/packs/beastforms/feature_Ocean_Master_tGDdEH40wyOCsFmH.json index aa0baa31..a4431417 100644 --- a/src/packs/beastforms/feature_Ocean_Master_tGDdEH40wyOCsFmH.json +++ b/src/packs/beastforms/feature_Ocean_Master_tGDdEH40wyOCsFmH.json @@ -51,18 +51,17 @@ "transfer": false, "_id": "6GBczj8REkDmgX2Q", "type": "base", - "system": { - "changes": [], - "duration": { - "type": "temporary" - } - }, + "system": {}, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -74,16 +73,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!tGDdEH40wyOCsFmH.6GBczj8REkDmgX2Q" } ], diff --git a/src/packs/beastforms/feature_Snapping_Strike_Ky3rZD3sJMXYZOBC.json b/src/packs/beastforms/feature_Snapping_Strike_Ky3rZD3sJMXYZOBC.json index 581bdcf5..d79c9018 100644 --- a/src/packs/beastforms/feature_Snapping_Strike_Ky3rZD3sJMXYZOBC.json +++ b/src/packs/beastforms/feature_Snapping_Strike_Ky3rZD3sJMXYZOBC.json @@ -58,18 +58,17 @@ "transfer": false, "_id": "y3EsJuInxE7juNXT", "type": "base", - "system": { - "changes": [], - "duration": { - "type": "temporary" - } - }, + "system": {}, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -82,16 +81,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!Ky3rZD3sJMXYZOBC.y3EsJuInxE7juNXT" } ], diff --git a/src/packs/beastforms/feature_Takedown_0ey4kM9ssj2otHvb.json b/src/packs/beastforms/feature_Takedown_0ey4kM9ssj2otHvb.json index 531b30ea..4dc2c0f7 100644 --- a/src/packs/beastforms/feature_Takedown_0ey4kM9ssj2otHvb.json +++ b/src/packs/beastforms/feature_Takedown_0ey4kM9ssj2otHvb.json @@ -27,8 +27,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -54,7 +54,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/beastforms/feature_Trample_A0lgd6eVEfX6oqSB.json b/src/packs/beastforms/feature_Trample_A0lgd6eVEfX6oqSB.json index 4f0ea6c3..e9878f02 100644 --- a/src/packs/beastforms/feature_Trample_A0lgd6eVEfX6oqSB.json +++ b/src/packs/beastforms/feature_Trample_A0lgd6eVEfX6oqSB.json @@ -27,8 +27,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -52,7 +52,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -107,18 +107,17 @@ "transfer": false, "_id": "LkekG4IngVW9rFjI", "type": "base", - "system": { - "changes": [], - "duration": { - "type": "temporary" - } - }, + "system": {}, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -130,16 +129,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!A0lgd6eVEfX6oqSB.LkekG4IngVW9rFjI" } ], diff --git a/src/packs/beastforms/feature_Unyielding_vEAQ4cfsoPmOv2Gg.json b/src/packs/beastforms/feature_Unyielding_vEAQ4cfsoPmOv2Gg.json index 429b5a1a..6bfafa79 100644 --- a/src/packs/beastforms/feature_Unyielding_vEAQ4cfsoPmOv2Gg.json +++ b/src/packs/beastforms/feature_Unyielding_vEAQ4cfsoPmOv2Gg.json @@ -20,7 +20,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/beastforms/feature_Venomous_Bite_2KlTnfzO03vneVS8.json b/src/packs/beastforms/feature_Venomous_Bite_2KlTnfzO03vneVS8.json index 30ace68f..00870086 100644 --- a/src/packs/beastforms/feature_Venomous_Bite_2KlTnfzO03vneVS8.json +++ b/src/packs/beastforms/feature_Venomous_Bite_2KlTnfzO03vneVS8.json @@ -51,18 +51,17 @@ "transfer": false, "_id": "TTyAKKoUCoYXSMs4", "type": "base", - "system": { - "changes": [], - "duration": { - "type": "temporary" - } - }, + "system": {}, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

A Poisoned creature takes 1d10 direct physical damage each time they act.

", "tint": "#ffffff", @@ -72,16 +71,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!2KlTnfzO03vneVS8.TTyAKKoUCoYXSMs4" } ], diff --git a/src/packs/beastforms/feature_Venomous_Strike_uW3853pViM9VAfHb.json b/src/packs/beastforms/feature_Venomous_Strike_uW3853pViM9VAfHb.json index 923e43bd..57d5bb56 100644 --- a/src/packs/beastforms/feature_Venomous_Strike_uW3853pViM9VAfHb.json +++ b/src/packs/beastforms/feature_Venomous_Strike_uW3853pViM9VAfHb.json @@ -20,7 +20,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -75,18 +75,17 @@ "transfer": false, "_id": "1iQPj96LqUNkRaxE", "type": "base", - "system": { - "changes": [], - "duration": { - "type": "temporary" - } - }, + "system": {}, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

A Poisoned creature takes 1d10 physical direct damage each time they act.

", "tint": "#ffffff", @@ -96,16 +95,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!uW3853pViM9VAfHb.1iQPj96LqUNkRaxE" } ], diff --git a/src/packs/beastforms/feature_Vicious_Maul_jYUBi7yLHap5ljpa.json b/src/packs/beastforms/feature_Vicious_Maul_jYUBi7yLHap5ljpa.json index a3494ed0..2bdad760 100644 --- a/src/packs/beastforms/feature_Vicious_Maul_jYUBi7yLHap5ljpa.json +++ b/src/packs/beastforms/feature_Vicious_Maul_jYUBi7yLHap5ljpa.json @@ -27,8 +27,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -53,7 +53,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -88,18 +88,17 @@ "transfer": false, "_id": "MIAh9XNwDXGDktCm", "type": "base", - "system": { - "changes": [], - "duration": { - "type": "temporary" - } - }, + "system": {}, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -111,16 +110,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!jYUBi7yLHap5ljpa.MIAh9XNwDXGDktCm" } ], diff --git a/src/packs/beastforms/feature_Webslinger_D73fS1iM4SZPFimu.json b/src/packs/beastforms/feature_Webslinger_D73fS1iM4SZPFimu.json index 7cd48d25..40adb28b 100644 --- a/src/packs/beastforms/feature_Webslinger_D73fS1iM4SZPFimu.json +++ b/src/packs/beastforms/feature_Webslinger_D73fS1iM4SZPFimu.json @@ -20,7 +20,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -75,18 +75,17 @@ "transfer": false, "_id": "cBJueH89gNvvDKfQ", "type": "base", - "system": { - "changes": [], - "duration": { - "type": "temporary" - } - }, + "system": {}, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -98,16 +97,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!D73fS1iM4SZPFimu.cBJueH89gNvvDKfQ" } ], diff --git a/src/packs/classes/feature_Frontline_Tank_YS1g7YdWwOaS629x.json b/src/packs/classes/feature_Frontline_Tank_YS1g7YdWwOaS629x.json index 81fd08cc..7b7be61a 100644 --- a/src/packs/classes/feature_Frontline_Tank_YS1g7YdWwOaS629x.json +++ b/src/packs/classes/feature_Frontline_Tank_YS1g7YdWwOaS629x.json @@ -29,8 +29,8 @@ "recovery": null }, "damage": { - "parts": { - "armor": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -55,7 +55,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/classes/feature_Life_Support_lSlvSUHbOoX36q2j.json b/src/packs/classes/feature_Life_Support_lSlvSUHbOoX36q2j.json index b788f1f4..9c4fc450 100644 --- a/src/packs/classes/feature_Life_Support_lSlvSUHbOoX36q2j.json +++ b/src/packs/classes/feature_Life_Support_lSlvSUHbOoX36q2j.json @@ -31,8 +31,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -57,7 +57,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/classes/feature_Make_a_Scene_N9E5skDDK2VgvohR.json b/src/packs/classes/feature_Make_a_Scene_N9E5skDDK2VgvohR.json index 5f28c048..1a444728 100644 --- a/src/packs/classes/feature_Make_a_Scene_N9E5skDDK2VgvohR.json +++ b/src/packs/classes/feature_Make_a_Scene_N9E5skDDK2VgvohR.json @@ -53,7 +53,7 @@ "effects": [ { "name": "Make a Scene", - "img": "icons/magic/sonic/scream-wail-shout-teal.webp", + "img": "icons/svg/daze.svg", "origin": "Compendium.daggerheart.classes.Item.OxmucTHHfuBSv2dn", "transfer": false, "_id": "8G9zDv1gac6dEHmS", @@ -64,27 +64,27 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.difficulty", - "value": -2, - "priority": null, - "type": "add" - } - ], - "duration": { - "type": "temporary" } }, + "changes": [ + { + "key": "system.difficulty", + "mode": 2, + "value": "-2", + "priority": null + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

Giving them a -2 penalty to their Difficulty.

", + "description": "", "tint": "#ffffff", "statuses": [], "sort": 0, @@ -92,16 +92,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!N9E5skDDK2VgvohR.8G9zDv1gac6dEHmS" } ], diff --git a/src/packs/classes/feature_Minor_Illusion_cshTYdtz9yoXYYB3.json b/src/packs/classes/feature_Minor_Illusion_cshTYdtz9yoXYYB3.json index 5f4d5fe7..fe18f68b 100644 --- a/src/packs/classes/feature_Minor_Illusion_cshTYdtz9yoXYYB3.json +++ b/src/packs/classes/feature_Minor_Illusion_cshTYdtz9yoXYYB3.json @@ -23,7 +23,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/classes/feature_No_Mercy_njj2C3tMDeCHHOoh.json b/src/packs/classes/feature_No_Mercy_njj2C3tMDeCHHOoh.json index 5b770e5d..4d10c3b9 100644 --- a/src/packs/classes/feature_No_Mercy_njj2C3tMDeCHHOoh.json +++ b/src/packs/classes/feature_No_Mercy_njj2C3tMDeCHHOoh.json @@ -67,29 +67,25 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.bonuses.roll.attack.bonus", - "type": "add", - "value": "@stacks", - "priority": null, - "phase": "initial" - } - ], - "duration": { - "type": "shortRest" - }, - "stacking": { - "max": null } }, + "changes": [ + { + "key": "system.bonuses.roll.attack.bonus", + "mode": 2, + "value": "1", + "priority": null + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Gain a +1 bonus to your attack rolls until your next rest.

", "tint": "#ffffff", @@ -99,16 +95,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!njj2C3tMDeCHHOoh.XK4cCcz9sRGDJr0q" } ], diff --git a/src/packs/classes/feature_Rogue_s_Dodge_hVaaPIjxoextIgSL.json b/src/packs/classes/feature_Rogue_s_Dodge_hVaaPIjxoextIgSL.json index b886b079..231295fc 100644 --- a/src/packs/classes/feature_Rogue_s_Dodge_hVaaPIjxoextIgSL.json +++ b/src/packs/classes/feature_Rogue_s_Dodge_hVaaPIjxoextIgSL.json @@ -65,30 +65,25 @@ "type": "withinRange", "target": "any", "range": "self" - }, - "changes": [ - { - "key": "system.evasion", - "type": "add", - "value": "2 * @stacks", - "priority": null, - "phase": "initial" - } - ], - "duration": { - "type": "temporary", - "description": "

Until the next time an attack succeeds against you.

" - }, - "stacking": { - "max": null } }, + "changes": [ + { + "key": "system.evasion", + "mode": 2, + "value": "2", + "priority": null + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Spend 3 Hope to gain a +2 bonus to your Evasion until the next time an attack succeeds against you. Otherwise, this bonus lasts until your next rest.

", "tint": "#ffffff", @@ -98,16 +93,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!hVaaPIjxoextIgSL.hhVjBro2osGDTT5g" } ], diff --git a/src/packs/classes/feature_Strange_Patterns_6YsfFjmCGuFYVhT4.json b/src/packs/classes/feature_Strange_Patterns_6YsfFjmCGuFYVhT4.json index 6939ff7f..953b3a2c 100644 --- a/src/packs/classes/feature_Strange_Patterns_6YsfFjmCGuFYVhT4.json +++ b/src/packs/classes/feature_Strange_Patterns_6YsfFjmCGuFYVhT4.json @@ -29,8 +29,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -55,7 +55,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -85,7 +85,7 @@ { "trigger": "dualityRoll", "triggeringActorType": "self", - "command": "/* Check if there's a Strange Pattern match */\nconst dice = [roll.dFear.total, roll.dHope.total];\nconst resource = this.parent.resource?.diceStates ? Object.values(this.parent.resource.diceStates).map(x => x.value)[0] : null;\nconst nrMatches = dice.filter(x => x === resource).length;\n\nif (!nrMatches) return;\n\n/* Create a dialog to choose Hope or Stress - or to cancel*/\nconst content = `\n
${game.i18n.format('DAGGERHEART.CONFIG.Triggers.triggerTexts.strangePatternsContentTitle', { nr: nrMatches })}
\n
${game.i18n.format('DAGGERHEART.CONFIG.Triggers.triggerTexts.strangePatternsContentSubTitle', { nr: nrMatches })}
\n
${game.i18n.localize('DAGGERHEART.CONFIG.Triggers.triggerTexts.strangePatternsActionExplanation')}
\n
\n \n \n
\n
`;\n\nconst result = await foundry.applications.api.DialogV2.input({\n classes: ['dh-style', 'two-big-buttons'],\n window: { title: this.item.name },\n content: content,\n render: (_, dialog) => {\n const hopeButton = dialog.element.querySelector('#hopeButton');\n const stressButton = dialog.element.querySelector('#stressButton');\ndialog.element.querySelector('button[type=\"submit\"]').disabled = true;\n \n const updateFunc = (event, selector, adding, clamp) => {\n const button = event.target.closest(`#${selector}Button`);\n const parent = event.target.closest('.flexrow');\n const hope = Number.parseInt(parent.querySelector('#hopeButton label').innerHTML);\n const stress = Number.parseInt(parent.querySelector('#stressButton label').innerHTML);\n const currentTotal = (Number.isNumeric(hope) ? hope : 0) + (Number.isNumeric(stress) ? stress : 0);\n if (adding && currentTotal === nrMatches) return;\n \n const current = Number.parseInt(button.querySelector('label').innerHTML);\n if (!adding && current === 0) return;\n \n const value = Number.isNumeric(current) ? adding ? current+1 : current-1 : 1;\n if (!dialog.data) dialog.data = {};\n dialog.data[selector] = clamp(value);\n button.querySelector('label').innerHTML = dialog.data[selector];\n\n event.target.closest('.dialog-form').querySelector('button[type=\"submit\"]').disabled = !adding || currentTotal < (nrMatches-1);\n \n };\n hopeButton.addEventListener('click', event => updateFunc(event, 'hope', true, x => Math.min(x, nrMatches)));\n hopeButton.addEventListener('contextmenu', event => updateFunc(event, 'hope', false, x => Math.max(x, 0)));\n stressButton.addEventListener('click', event => updateFunc(event, 'stress', true, x => Math.min(x, nrMatches)));\n stressButton.addEventListener('contextmenu', event => updateFunc(event, 'stress', false, x => Math.max(x, 0)));\n },\n ok: { callback: (_event, _result, dialog) => {\n const hope = dialog.data.hope ?? 0;\n const stress = dialog.data.stress ?? 0;\n if (!hope && !stress) return;\n\n /* Return resource update according to choices */\n const hopeUpdate = hope ? { key: 'hope', value: hope, total: -hope, enabled: true } : null;\n const stressUpdate = stress ? { key: 'stress', value: -stress, total: stress, enabled: true } : null;\n return { updates: [hopeUpdate, stressUpdate].filter(x => x) };\n }}\n});\n\nreturn result;" + "command": "/* Ignore if it's a TagTeam roll */\nconst tagTeam = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll);\nif (tagTeam.members[actor.id]) return;\n\n/* Check if there's a Strange Pattern match */\nconst dice = [roll.dFear.total, roll.dHope.total];\nconst resource = this.parent.resource?.diceStates ? Object.values(this.parent.resource.diceStates).map(x => x.value)[0] : null;\nconst nrMatches = dice.filter(x => x === resource).length;\n\nif (!nrMatches) return;\n\n/* Create a dialog to choose Hope or Stress - or to cancel*/\nconst content = `\n
${game.i18n.format('DAGGERHEART.CONFIG.Triggers.triggerTexts.strangePatternsContentTitle', { nr: nrMatches })}
\n
${game.i18n.format('DAGGERHEART.CONFIG.Triggers.triggerTexts.strangePatternsContentSubTitle', { nr: nrMatches })}
\n
${game.i18n.localize('DAGGERHEART.CONFIG.Triggers.triggerTexts.strangePatternsActionExplanation')}
\n
\n \n \n
\n
`;\n\nconst result = await foundry.applications.api.DialogV2.input({\n classes: ['dh-style', 'two-big-buttons'],\n window: { title: this.item.name },\n content: content,\n render: (_, dialog) => {\n const hopeButton = dialog.element.querySelector('#hopeButton');\n const stressButton = dialog.element.querySelector('#stressButton');\ndialog.element.querySelector('button[type=\"submit\"]').disabled = true;\n \n const updateFunc = (event, selector, adding, clamp) => {\n const button = event.target.closest(`#${selector}Button`);\n const parent = event.target.closest('.flexrow');\n const hope = Number.parseInt(parent.querySelector('#hopeButton label').innerHTML);\n const stress = Number.parseInt(parent.querySelector('#stressButton label').innerHTML);\n const currentTotal = (Number.isNumeric(hope) ? hope : 0) + (Number.isNumeric(stress) ? stress : 0);\n if (adding && currentTotal === nrMatches) return;\n \n const current = Number.parseInt(button.querySelector('label').innerHTML);\n if (!adding && current === 0) return;\n \n const value = Number.isNumeric(current) ? adding ? current+1 : current-1 : 1;\n if (!dialog.data) dialog.data = {};\n dialog.data[selector] = clamp(value);\n button.querySelector('label').innerHTML = dialog.data[selector];\n\n event.target.closest('.dialog-form').querySelector('button[type=\"submit\"]').disabled = !adding || currentTotal < (nrMatches-1);\n \n };\n hopeButton.addEventListener('click', event => updateFunc(event, 'hope', true, x => Math.min(x, nrMatches)));\n hopeButton.addEventListener('contextmenu', event => updateFunc(event, 'hope', false, x => Math.max(x, 0)));\n stressButton.addEventListener('click', event => updateFunc(event, 'stress', true, x => Math.min(x, nrMatches)));\n stressButton.addEventListener('contextmenu', event => updateFunc(event, 'stress', false, x => Math.max(x, 0)));\n },\n ok: { callback: (_event, _result, dialog) => {\n const hope = dialog.data.hope ?? 0;\n const stress = dialog.data.stress ?? 0;\n if (!hope && !stress) return;\n\n /* Return resource update according to choices */\n const hopeUpdate = hope ? { key: 'hope', value: hope, total: -hope, enabled: true } : null;\n const stressUpdate = stress ? { key: 'stress', value: -stress, total: stress, enabled: true } : null;\n return { updates: [hopeUpdate, stressUpdate].filter(x => x) };\n }}\n});\n\nreturn result;" } ] } diff --git a/src/packs/domains/domainCard_A_Soldier_s_Bond_Y08dLFuPXsgeRrHi.json b/src/packs/domains/domainCard_A_Soldier_s_Bond_Y08dLFuPXsgeRrHi.json index 09255a76..d3da85b6 100644 --- a/src/packs/domains/domainCard_A_Soldier_s_Bond_Y08dLFuPXsgeRrHi.json +++ b/src/packs/domains/domainCard_A_Soldier_s_Bond_Y08dLFuPXsgeRrHi.json @@ -25,8 +25,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -51,7 +51,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Arcane_Reflection_JzSvxy9Mu3RJp1jV.json b/src/packs/domains/domainCard_Arcane_Reflection_JzSvxy9Mu3RJp1jV.json index e557b8cd..e6d38e3f 100644 --- a/src/packs/domains/domainCard_Arcane_Reflection_JzSvxy9Mu3RJp1jV.json +++ b/src/packs/domains/domainCard_Arcane_Reflection_JzSvxy9Mu3RJp1jV.json @@ -33,7 +33,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Armorer_cy8GjBPGc9w9RaGO.json b/src/packs/domains/domainCard_Armorer_cy8GjBPGc9w9RaGO.json index cad6012e..aa9910dc 100644 --- a/src/packs/domains/domainCard_Armorer_cy8GjBPGc9w9RaGO.json +++ b/src/packs/domains/domainCard_Armorer_cy8GjBPGc9w9RaGO.json @@ -24,8 +24,8 @@ "recovery": null }, "damage": { - "parts": { - "armor": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -50,7 +50,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -92,28 +92,34 @@ "name": "Armorer", "type": "base", "system": { - "changes": [ - { - "type": "armor", - "phase": "initial", - "priority": 20, - "value": { - "max": "1", - "interaction": "active" - } - } - ] + "rangeDependence": { + "enabled": false, + "type": "withinRange", + "target": "hostile", + "range": "melee" + } }, - "_id": "tJw2JIPcT9hEMRXg", + "_id": "cED730OjuMW5haJR", "img": "icons/tools/hand/hammer-and-nail.webp", + "changes": [ + { + "key": "system.armorScore", + "mode": 2, + "value": "1", + "priority": null + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

While you’re wearing armor, gain a +1 bonus to your Armor Score.

", + "description": "

While you’re wearing armor, gain a +1 bonus to your Armor Score.

", "origin": null, "tint": "#ffffff", "transfer": true, @@ -123,10 +129,7 @@ "_stats": { "compendiumSource": null }, - "start": null, - "showIcon": 1, - "folder": null, - "_key": "!items.effects!cy8GjBPGc9w9RaGO.tJw2JIPcT9hEMRXg" + "_key": "!items.effects!cy8GjBPGc9w9RaGO.cED730OjuMW5haJR" } ], "ownership": { diff --git a/src/packs/domains/domainCard_Banish_AIbHfryMA2Rvs1ut.json b/src/packs/domains/domainCard_Banish_AIbHfryMA2Rvs1ut.json index e3c23dbf..b637a622 100644 --- a/src/packs/domains/domainCard_Banish_AIbHfryMA2Rvs1ut.json +++ b/src/packs/domains/domainCard_Banish_AIbHfryMA2Rvs1ut.json @@ -24,7 +24,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Bare_Bones_l5D9kq901JDESaXw.json b/src/packs/domains/domainCard_Bare_Bones_l5D9kq901JDESaXw.json index 098f5f4c..3b1ea76a 100644 --- a/src/packs/domains/domainCard_Bare_Bones_l5D9kq901JDESaXw.json +++ b/src/packs/domains/domainCard_Bare_Bones_l5D9kq901JDESaXw.json @@ -19,52 +19,7 @@ } }, "flags": {}, - "effects": [ - { - "name": "Bare Bones", - "type": "base", - "system": { - "changes": [ - { - "type": "armor", - "phase": "initial", - "priority": 20, - "value": { - "max": "3 + @system.traits.strength.value", - "interaction": "inactive", - "damageThresholds": { - "major": "9 + (@tier - 1) * 5 + max(0, (@tier -2) * 2 )", - "severe": "19 + (@tier - 1) * 5 + max(0, (@tier -2) * 2 )" - } - } - } - ] - }, - "_id": "FCsgz7Tdsw6QUzBs", - "img": "icons/magic/control/buff-strength-muscle-damage-orange.webp", - "disabled": false, - "start": null, - "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false - }, - "description": "

You have a base Armor Score of 3 + your Strength.

", - "origin": null, - "tint": "#ffffff", - "transfer": true, - "statuses": [], - "showIcon": 1, - "folder": null, - "sort": 0, - "flags": {}, - "_stats": { - "compendiumSource": null - }, - "_key": "!items.effects!l5D9kq901JDESaXw.FCsgz7Tdsw6QUzBs" - } - ], + "effects": [], "ownership": { "default": 0, "MQSznptE5yLT7kj8": 3 diff --git a/src/packs/domains/domainCard_Battle_Cry_Ef1JsUG50LIoKx2F.json b/src/packs/domains/domainCard_Battle_Cry_Ef1JsUG50LIoKx2F.json index c9ae6071..432f9992 100644 --- a/src/packs/domains/domainCard_Battle_Cry_Ef1JsUG50LIoKx2F.json +++ b/src/packs/domains/domainCard_Battle_Cry_Ef1JsUG50LIoKx2F.json @@ -25,8 +25,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -51,7 +51,7 @@ }, "type": [] }, - "hope": { + { "value": { "custom": { "enabled": true, @@ -76,7 +76,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Battle_Hardened_NeEOghgfyDUBTwBG.json b/src/packs/domains/domainCard_Battle_Hardened_NeEOghgfyDUBTwBG.json index 852cd329..dfd0c68d 100644 --- a/src/packs/domains/domainCard_Battle_Hardened_NeEOghgfyDUBTwBG.json +++ b/src/packs/domains/domainCard_Battle_Hardened_NeEOghgfyDUBTwBG.json @@ -25,8 +25,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -51,7 +51,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Blink_Out_Qu0iA4s3Xov10Erd.json b/src/packs/domains/domainCard_Blink_Out_Qu0iA4s3Xov10Erd.json index 617bd27b..0b96d99c 100644 --- a/src/packs/domains/domainCard_Blink_Out_Qu0iA4s3Xov10Erd.json +++ b/src/packs/domains/domainCard_Blink_Out_Qu0iA4s3Xov10Erd.json @@ -33,7 +33,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Bolt_Beacon_BNevJyGk7hmN7XOY.json b/src/packs/domains/domainCard_Bolt_Beacon_BNevJyGk7hmN7XOY.json index df7d36a4..eb053b27 100644 --- a/src/packs/domains/domainCard_Bolt_Beacon_BNevJyGk7hmN7XOY.json +++ b/src/packs/domains/domainCard_Bolt_Beacon_BNevJyGk7hmN7XOY.json @@ -33,8 +33,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -58,7 +58,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -119,20 +119,20 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

Temporarily Vulnerable and glows brightly until this condition is cleared.

", + "description": "

Temporarily Vulnerable and glows brightly until this condition is cleared.

", "tint": "#ffffff", "statuses": [ "vulnerable" @@ -142,16 +142,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!BNevJyGk7hmN7XOY.veZpnhnF8NRRhKG4" } ], diff --git a/src/packs/domains/domainCard_Book_of_Ava_YtZzYBtR0yLPPA93.json b/src/packs/domains/domainCard_Book_of_Ava_YtZzYBtR0yLPPA93.json index fa247c89..4ed5bd63 100644 --- a/src/packs/domains/domainCard_Book_of_Ava_YtZzYBtR0yLPPA93.json +++ b/src/packs/domains/domainCard_Book_of_Ava_YtZzYBtR0yLPPA93.json @@ -24,8 +24,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -51,7 +51,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -105,7 +105,7 @@ }, "effects": [ { - "_id": "ptYT10JZ2WJHvFMd", + "_id": "LdcT1nrkd5ORCU4n", "onSave": false } ], @@ -131,7 +131,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -177,8 +177,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -204,7 +204,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -252,7 +252,7 @@ "img": "icons/magic/defensive/shield-barrier-glowing-triangle-blue.webp", "origin": "Compendium.daggerheart.domains.Item.YtZzYBtR0yLPPA93", "transfer": false, - "_id": "ptYT10JZ2WJHvFMd", + "_id": "LdcT1nrkd5ORCU4n", "type": "base", "system": { "rangeDependence": { @@ -260,27 +260,25 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "type": "armor", - "phase": "initial", - "priority": 20, - "value": { - "max": "1" - } - } - ], - "duration": { - "type": "shortRest" } }, + "changes": [ + { + "key": "system.armorScore", + "mode": 2, + "value": "1", + "priority": null + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

+1 bonus to your Armor Score until your next rest, or the caster cast's Tava’s Armor again.

", "tint": "#ffffff", @@ -290,17 +288,7 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, - "_key": "!items.effects!YtZzYBtR0yLPPA93.ptYT10JZ2WJHvFMd" + "_key": "!items.effects!YtZzYBtR0yLPPA93.LdcT1nrkd5ORCU4n" } ], "ownership": { diff --git a/src/packs/domains/domainCard_Book_of_Exota_oVs2MSC6Uf5GbgEG.json b/src/packs/domains/domainCard_Book_of_Exota_oVs2MSC6Uf5GbgEG.json index d228d04b..032a2de2 100644 --- a/src/packs/domains/domainCard_Book_of_Exota_oVs2MSC6Uf5GbgEG.json +++ b/src/packs/domains/domainCard_Book_of_Exota_oVs2MSC6Uf5GbgEG.json @@ -25,7 +25,7 @@ "consumeOnSuccess": true }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -100,8 +100,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -127,7 +127,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Book_of_Grynn_R0LNheiZycZlZzV3.json b/src/packs/domains/domainCard_Book_of_Grynn_R0LNheiZycZlZzV3.json index d84a8e18..05276707 100644 --- a/src/packs/domains/domainCard_Book_of_Grynn_R0LNheiZycZlZzV3.json +++ b/src/packs/domains/domainCard_Book_of_Grynn_R0LNheiZycZlZzV3.json @@ -76,8 +76,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -103,7 +103,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Book_of_Homet_gFMx08ogQ8hS2Obi.json b/src/packs/domains/domainCard_Book_of_Homet_gFMx08ogQ8hS2Obi.json index f6f048d1..a0102739 100644 --- a/src/packs/domains/domainCard_Book_of_Homet_gFMx08ogQ8hS2Obi.json +++ b/src/packs/domains/domainCard_Book_of_Homet_gFMx08ogQ8hS2Obi.json @@ -25,7 +25,7 @@ "consumeOnSuccess": true }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -72,7 +72,7 @@ "consumeOnSuccess": true }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Book_of_Illiat_df4iRqQzRntrF6Qw.json b/src/packs/domains/domainCard_Book_of_Illiat_df4iRqQzRntrF6Qw.json index b34fa000..5acec2fd 100644 --- a/src/packs/domains/domainCard_Book_of_Illiat_df4iRqQzRntrF6Qw.json +++ b/src/packs/domains/domainCard_Book_of_Illiat_df4iRqQzRntrF6Qw.json @@ -24,7 +24,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -82,8 +82,8 @@ "recovery": "shortRest" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -107,7 +107,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -177,18 +177,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "shortRest" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Lasts until your next rest or the caster casts Telepathy again.

", "tint": "#ffffff", @@ -198,16 +198,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!df4iRqQzRntrF6Qw.zAEaETYSOE2fmcyB" }, { @@ -223,19 +213,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until they take damage or the GM spends a Fear on their turn to clear this condition.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Asleep until they take damage or the GM spends a Fear on their turn to clear this condition.

", "tint": "#ffffff", @@ -245,16 +234,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!df4iRqQzRntrF6Qw.gfZTHSgwYSDKsePW" } ], diff --git a/src/packs/domains/domainCard_Book_of_Korvax_cWRFHJdxEZ0M1dAg.json b/src/packs/domains/domainCard_Book_of_Korvax_cWRFHJdxEZ0M1dAg.json index d97c514b..5bef4922 100644 --- a/src/packs/domains/domainCard_Book_of_Korvax_cWRFHJdxEZ0M1dAg.json +++ b/src/packs/domains/domainCard_Book_of_Korvax_cWRFHJdxEZ0M1dAg.json @@ -24,7 +24,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -77,7 +77,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -130,8 +130,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -157,7 +157,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Book_of_Norai_WtwSWXTRZa7QVvmo.json b/src/packs/domains/domainCard_Book_of_Norai_WtwSWXTRZa7QVvmo.json index f32f380a..6581cd52 100644 --- a/src/packs/domains/domainCard_Book_of_Norai_WtwSWXTRZa7QVvmo.json +++ b/src/packs/domains/domainCard_Book_of_Norai_WtwSWXTRZa7QVvmo.json @@ -24,8 +24,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -50,7 +50,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -101,8 +101,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -128,7 +128,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -184,18 +184,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -207,16 +207,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!WtwSWXTRZa7QVvmo.iPnT02apql16Zhjf" } ], diff --git a/src/packs/domains/domainCard_Book_of_Ronin_SZMNR3uGNinJcN4N.json b/src/packs/domains/domainCard_Book_of_Ronin_SZMNR3uGNinJcN4N.json index 88bb759d..c809a8e0 100644 --- a/src/packs/domains/domainCard_Book_of_Ronin_SZMNR3uGNinJcN4N.json +++ b/src/packs/domains/domainCard_Book_of_Ronin_SZMNR3uGNinJcN4N.json @@ -24,7 +24,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -75,7 +75,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Book_of_Sitil_eq8VNqYMRHhF9xw9.json b/src/packs/domains/domainCard_Book_of_Sitil_eq8VNqYMRHhF9xw9.json index 16b7a63b..e88ccea9 100644 --- a/src/packs/domains/domainCard_Book_of_Sitil_eq8VNqYMRHhF9xw9.json +++ b/src/packs/domains/domainCard_Book_of_Sitil_eq8VNqYMRHhF9xw9.json @@ -85,7 +85,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Book_of_Tyfar_1VXzwRbvbBj5bd5V.json b/src/packs/domains/domainCard_Book_of_Tyfar_1VXzwRbvbBj5bd5V.json index 37b71b9c..4eabb038 100644 --- a/src/packs/domains/domainCard_Book_of_Tyfar_1VXzwRbvbBj5bd5V.json +++ b/src/packs/domains/domainCard_Book_of_Tyfar_1VXzwRbvbBj5bd5V.json @@ -24,8 +24,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -51,7 +51,7 @@ } } }, - "stress": { + { "value": { "custom": { "enabled": true, @@ -76,7 +76,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -144,7 +144,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Book_of_Vagras_aknDDYtN7EObv94t.json b/src/packs/domains/domainCard_Book_of_Vagras_aknDDYtN7EObv94t.json index a5764f48..eadd1550 100644 --- a/src/packs/domains/domainCard_Book_of_Vagras_aknDDYtN7EObv94t.json +++ b/src/packs/domains/domainCard_Book_of_Vagras_aknDDYtN7EObv94t.json @@ -25,7 +25,7 @@ "consumeOnSuccess": true }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -79,7 +79,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -125,7 +125,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Book_of_Vyola_VOIgm2j2Ijszwc5m.json b/src/packs/domains/domainCard_Book_of_Vyola_VOIgm2j2Ijszwc5m.json index 522a8f7c..b94cd702 100644 --- a/src/packs/domains/domainCard_Book_of_Vyola_VOIgm2j2Ijszwc5m.json +++ b/src/packs/domains/domainCard_Book_of_Vyola_VOIgm2j2Ijszwc5m.json @@ -24,7 +24,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Book_of_Yarrow_J1ovx2FpNDvPq1o6.json b/src/packs/domains/domainCard_Book_of_Yarrow_J1ovx2FpNDvPq1o6.json index 17eb4223..2a48b31e 100644 --- a/src/packs/domains/domainCard_Book_of_Yarrow_J1ovx2FpNDvPq1o6.json +++ b/src/packs/domains/domainCard_Book_of_Yarrow_J1ovx2FpNDvPq1o6.json @@ -24,7 +24,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -114,25 +114,25 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.resistance.magical.immunity", - "value": 1, - "priority": null, - "type": "override" - } - ], - "duration": { - "type": "shortRest" } }, + "changes": [ + { + "key": "system.resistance.magical.immunity", + "mode": 5, + "value": "1", + "priority": null + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Immune to magic damage until your next rest.

", "tint": "#ffffff", @@ -142,16 +142,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!J1ovx2FpNDvPq1o6.HWJYhSegVLeAa3dE" } ], diff --git a/src/packs/domains/domainCard_Chain_Lightning_0kAVO6rordCfZqYP.json b/src/packs/domains/domainCard_Chain_Lightning_0kAVO6rordCfZqYP.json index c2bf721f..682357cc 100644 --- a/src/packs/domains/domainCard_Chain_Lightning_0kAVO6rordCfZqYP.json +++ b/src/packs/domains/domainCard_Chain_Lightning_0kAVO6rordCfZqYP.json @@ -33,8 +33,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -60,7 +60,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -107,8 +107,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -134,7 +134,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Champion_s_Edge_rnejRbUQsNGX1GMC.json b/src/packs/domains/domainCard_Champion_s_Edge_rnejRbUQsNGX1GMC.json index 304541e4..be639515 100644 --- a/src/packs/domains/domainCard_Champion_s_Edge_rnejRbUQsNGX1GMC.json +++ b/src/packs/domains/domainCard_Champion_s_Edge_rnejRbUQsNGX1GMC.json @@ -33,8 +33,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -59,7 +59,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -109,8 +109,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "armor": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -135,7 +135,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -185,8 +185,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -213,7 +213,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Chokehold_R5GYUalYXLLFRlNl.json b/src/packs/domains/domainCard_Chokehold_R5GYUalYXLLFRlNl.json index 73424902..587e7855 100644 --- a/src/packs/domains/domainCard_Chokehold_R5GYUalYXLLFRlNl.json +++ b/src/packs/domains/domainCard_Chokehold_R5GYUalYXLLFRlNl.json @@ -65,7 +65,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Cinder_Grasp_5EP2Lgf7ojfrc0Is.json b/src/packs/domains/domainCard_Cinder_Grasp_5EP2Lgf7ojfrc0Is.json index e3df986e..8ea51d7f 100644 --- a/src/packs/domains/domainCard_Cinder_Grasp_5EP2Lgf7ojfrc0Is.json +++ b/src/packs/domains/domainCard_Cinder_Grasp_5EP2Lgf7ojfrc0Is.json @@ -25,8 +25,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -52,7 +52,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -104,8 +104,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -131,7 +131,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -167,18 +167,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

When a creature acts while On Fire, they must take an extra 2d6 magic damage if they are still On Fire at the end of their action.

", "tint": "#ffffff", @@ -190,16 +190,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!5EP2Lgf7ojfrc0Is.HNKkaWi507whJuYN" } ], diff --git a/src/packs/domains/domainCard_Cloaking_Blast_Zhw7PtK8nMPlsOqD.json b/src/packs/domains/domainCard_Cloaking_Blast_Zhw7PtK8nMPlsOqD.json index a2a06889..67817fc1 100644 --- a/src/packs/domains/domainCard_Cloaking_Blast_Zhw7PtK8nMPlsOqD.json +++ b/src/packs/domains/domainCard_Cloaking_Blast_Zhw7PtK8nMPlsOqD.json @@ -70,19 +70,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

When you move into or within an adversary’s line of sight or make an attack, you are no longer Cloaked.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

While Cloaked, you remain unseen if you are stationary when an adversary moves to where they would normally see you. When you move into or within an adversary’s line of sight or make an attack, you are no longer Cloaked.

", "tint": "#ffffff", @@ -92,16 +91,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!Zhw7PtK8nMPlsOqD.twCBqXytmRkMz0kV" } ], diff --git a/src/packs/domains/domainCard_Confusing_Aura_R8NDiJXJWmC48WSr.json b/src/packs/domains/domainCard_Confusing_Aura_R8NDiJXJWmC48WSr.json index a261da89..859635f3 100644 --- a/src/packs/domains/domainCard_Confusing_Aura_R8NDiJXJWmC48WSr.json +++ b/src/packs/domains/domainCard_Confusing_Aura_R8NDiJXJWmC48WSr.json @@ -25,7 +25,7 @@ "consumeOnSuccess": true }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -80,7 +80,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json b/src/packs/domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json index d1d1789d..ededde93 100644 --- a/src/packs/domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json +++ b/src/packs/domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json @@ -31,7 +31,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -119,8 +119,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -148,7 +148,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Corrosive_Projectile_qJaSNTuDfbPVr8Lb.json b/src/packs/domains/domainCard_Corrosive_Projectile_qJaSNTuDfbPVr8Lb.json index 6a039bbf..09dff08a 100644 --- a/src/packs/domains/domainCard_Corrosive_Projectile_qJaSNTuDfbPVr8Lb.json +++ b/src/packs/domains/domainCard_Corrosive_Projectile_qJaSNTuDfbPVr8Lb.json @@ -24,8 +24,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -49,7 +49,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -127,7 +127,7 @@ "sort": 3400000, "effects": [ { - "name": "Corroded", + "name": "Corroded (1 stack)", "img": "icons/magic/acid/dissolve-bone-white.webp", "origin": "Compendium.daggerheart.domains.Item.qJaSNTuDfbPVr8Lb", "transfer": false, @@ -139,31 +139,27 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.difficulty", - "type": "add", - "value": "-@stack", - "priority": null, - "phase": "initial" - } - ], - "stacking": { - "max": null - }, - "duration": { - "type": "" } }, + "changes": [ + { + "key": "system.difficulty", + "mode": 2, + "value": "-1", + "priority": null + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

While a target is Corroded, they gain a −1 penalty to their Difficulty for every 2 Stress you spent. This condition can stack.

", + "description": "

While a target is Corroded, they gain a −1 penalty to their Difficulty for every 2 Stress you spent. This condition can stack.

", "tint": "#ffffff", "statuses": [ "corrode" @@ -173,16 +169,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!qJaSNTuDfbPVr8Lb.zB95bjSSdVlApQnR" } ], diff --git a/src/packs/domains/domainCard_Counterspell_6dhqo1kzGxejCjHa.json b/src/packs/domains/domainCard_Counterspell_6dhqo1kzGxejCjHa.json index a8d403d8..7d3a74c9 100644 --- a/src/packs/domains/domainCard_Counterspell_6dhqo1kzGxejCjHa.json +++ b/src/packs/domains/domainCard_Counterspell_6dhqo1kzGxejCjHa.json @@ -25,7 +25,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Critical_Inspiration_ABp9pUfBS69NomTD.json b/src/packs/domains/domainCard_Critical_Inspiration_ABp9pUfBS69NomTD.json index 252878ea..c8013a14 100644 --- a/src/packs/domains/domainCard_Critical_Inspiration_ABp9pUfBS69NomTD.json +++ b/src/packs/domains/domainCard_Critical_Inspiration_ABp9pUfBS69NomTD.json @@ -24,7 +24,7 @@ "recovery": "longRest" }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Dark_Whispers_yL2qrSWmTwXVOySH.json b/src/packs/domains/domainCard_Dark_Whispers_yL2qrSWmTwXVOySH.json index 7d8ecf40..390a2526 100644 --- a/src/packs/domains/domainCard_Dark_Whispers_yL2qrSWmTwXVOySH.json +++ b/src/packs/domains/domainCard_Dark_Whispers_yL2qrSWmTwXVOySH.json @@ -31,7 +31,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Death_Grip_x0FVGE1YbfXalJiw.json b/src/packs/domains/domainCard_Death_Grip_x0FVGE1YbfXalJiw.json index 214dae17..6e7c6b64 100644 --- a/src/packs/domains/domainCard_Death_Grip_x0FVGE1YbfXalJiw.json +++ b/src/packs/domains/domainCard_Death_Grip_x0FVGE1YbfXalJiw.json @@ -24,7 +24,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -75,8 +75,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -101,7 +101,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -152,8 +152,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -179,7 +179,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Disintegration_Wave_kja5qvh4rdeDBB96.json b/src/packs/domains/domainCard_Disintegration_Wave_kja5qvh4rdeDBB96.json index 7d7ed27d..4e3c3083 100644 --- a/src/packs/domains/domainCard_Disintegration_Wave_kja5qvh4rdeDBB96.json +++ b/src/packs/domains/domainCard_Disintegration_Wave_kja5qvh4rdeDBB96.json @@ -25,7 +25,7 @@ "consumeOnSuccess": true }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Earthquake_C0qLOwSSvZ6PG3Ws.json b/src/packs/domains/domainCard_Earthquake_C0qLOwSSvZ6PG3Ws.json index 0a35c95f..57fc72db 100644 --- a/src/packs/domains/domainCard_Earthquake_C0qLOwSSvZ6PG3Ws.json +++ b/src/packs/domains/domainCard_Earthquake_C0qLOwSSvZ6PG3Ws.json @@ -34,8 +34,8 @@ "consumeOnSuccess": true }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -61,7 +61,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -123,20 +123,20 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

Temporarily Vulnerable.

", + "description": "

Temporarily Vulnerable.

", "tint": "#ffffff", "statuses": [], "sort": 0, @@ -144,16 +144,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!C0qLOwSSvZ6PG3Ws.Z31XqmGUKWYcZdMY" } ], diff --git a/src/packs/domains/domainCard_Eclipse_62Sj67PdPFzwWVe3.json b/src/packs/domains/domainCard_Eclipse_62Sj67PdPFzwWVe3.json index c797a148..bd080f0d 100644 --- a/src/packs/domains/domainCard_Eclipse_62Sj67PdPFzwWVe3.json +++ b/src/packs/domains/domainCard_Eclipse_62Sj67PdPFzwWVe3.json @@ -25,7 +25,7 @@ "consumeOnSuccess": true }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -76,8 +76,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -102,7 +102,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Encore_klahWDFwihqqEhXP.json b/src/packs/domains/domainCard_Encore_klahWDFwihqqEhXP.json index fabc00e1..23358d47 100644 --- a/src/packs/domains/domainCard_Encore_klahWDFwihqqEhXP.json +++ b/src/packs/domains/domainCard_Encore_klahWDFwihqqEhXP.json @@ -24,7 +24,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Enrapture_a8lFiKX1o8T924ze.json b/src/packs/domains/domainCard_Enrapture_a8lFiKX1o8T924ze.json index 284682fa..fd27c8ce 100644 --- a/src/packs/domains/domainCard_Enrapture_a8lFiKX1o8T924ze.json +++ b/src/packs/domains/domainCard_Enrapture_a8lFiKX1o8T924ze.json @@ -24,7 +24,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -82,8 +82,8 @@ "recovery": "shortRest" }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -108,7 +108,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -144,18 +144,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

While Enraptured, a target’s attention is fixed on you, narrowing their field of view and drowning out any sound but your voice.

", "tint": "#ffffff", @@ -165,16 +165,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!a8lFiKX1o8T924ze.EYG5dLImk6GkmfRd" } ], diff --git a/src/packs/domains/domainCard_Falling_Sky_hZJp9mdkMnqKDROe.json b/src/packs/domains/domainCard_Falling_Sky_hZJp9mdkMnqKDROe.json index 05496132..ee36e25d 100644 --- a/src/packs/domains/domainCard_Falling_Sky_hZJp9mdkMnqKDROe.json +++ b/src/packs/domains/domainCard_Falling_Sky_hZJp9mdkMnqKDROe.json @@ -33,8 +33,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -59,7 +59,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Final_Words_Nbw6Jnh1vRZzwHQI.json b/src/packs/domains/domainCard_Final_Words_Nbw6Jnh1vRZzwHQI.json index 65d7dd83..757a705a 100644 --- a/src/packs/domains/domainCard_Final_Words_Nbw6Jnh1vRZzwHQI.json +++ b/src/packs/domains/domainCard_Final_Words_Nbw6Jnh1vRZzwHQI.json @@ -25,7 +25,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Flight_54GUjNuBEy7xdzMz.json b/src/packs/domains/domainCard_Flight_54GUjNuBEy7xdzMz.json index 4d1355ee..bd8744f7 100644 --- a/src/packs/domains/domainCard_Flight_54GUjNuBEy7xdzMz.json +++ b/src/packs/domains/domainCard_Flight_54GUjNuBEy7xdzMz.json @@ -25,7 +25,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Forager_06UapZuaA5S6fAKl.json b/src/packs/domains/domainCard_Forager_06UapZuaA5S6fAKl.json index e8919d6b..292961b8 100644 --- a/src/packs/domains/domainCard_Forager_06UapZuaA5S6fAKl.json +++ b/src/packs/domains/domainCard_Forager_06UapZuaA5S6fAKl.json @@ -24,8 +24,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -50,7 +50,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -91,8 +91,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -117,7 +117,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -185,8 +185,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -211,7 +211,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Forceful_Push_z8FFPhDh2SdFkFfS.json b/src/packs/domains/domainCard_Forceful_Push_z8FFPhDh2SdFkFfS.json index 3d17ab5d..d77c8777 100644 --- a/src/packs/domains/domainCard_Forceful_Push_z8FFPhDh2SdFkFfS.json +++ b/src/packs/domains/domainCard_Forceful_Push_z8FFPhDh2SdFkFfS.json @@ -69,18 +69,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -92,16 +92,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!z8FFPhDh2SdFkFfS.95oX6QYPySdyyh2v" } ], diff --git a/src/packs/domains/domainCard_Forest_Sprites_JrkUMTzaFmQNBHVm.json b/src/packs/domains/domainCard_Forest_Sprites_JrkUMTzaFmQNBHVm.json index 4fa469a6..feb095a2 100644 --- a/src/packs/domains/domainCard_Forest_Sprites_JrkUMTzaFmQNBHVm.json +++ b/src/packs/domains/domainCard_Forest_Sprites_JrkUMTzaFmQNBHVm.json @@ -32,7 +32,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Frenzy_MMl7abdGRLl7TJLO.json b/src/packs/domains/domainCard_Frenzy_MMl7abdGRLl7TJLO.json index 6666bc28..2de4be7e 100644 --- a/src/packs/domains/domainCard_Frenzy_MMl7abdGRLl7TJLO.json +++ b/src/packs/domains/domainCard_Frenzy_MMl7abdGRLl7TJLO.json @@ -62,44 +62,43 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.bonuses.damage.physical.bonus", - "value": 10, - "priority": null, - "type": "add" - }, - { - "key": "system.bonuses.damage.magical.bonus", - "value": 10, - "priority": null, - "type": "add" - }, - { - "key": "system.damageThresholds.severe", - "value": 8, - "priority": null, - "type": "add" - }, - { - "key": "system.rules.damageReduction.disabledArmor", - "value": 1, - "priority": null, - "type": "override" - } - ], - "duration": { - "type": "temporary", - "description": "

Until there are no more adversaries within sight.

" } }, + "changes": [ + { + "key": "system.bonuses.damage.physical.bonus", + "mode": 2, + "value": "10", + "priority": null + }, + { + "key": "system.bonuses.damage.magical.bonus", + "mode": 2, + "value": "10", + "priority": null + }, + { + "key": "system.damageThresholds.severe", + "mode": 2, + "value": "8", + "priority": null + }, + { + "key": "system.rules.damageReduction.disabledArmor", + "mode": 5, + "value": "1", + "priority": null + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Once per long rest, you can go into a Frenzy until there are no more adversaries within sight.

While Frenzied, you can’t use Armor Slots, and you gain a +10 bonus to your damage rolls and a +8 bonus to your Severe damage threshold.

", "tint": "#ffffff", @@ -109,16 +108,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!MMl7abdGRLl7TJLO.1POoAgObPOWDpUco" } ], diff --git a/src/packs/domains/domainCard_Full_Surge_SgvjJfMyubZowPxS.json b/src/packs/domains/domainCard_Full_Surge_SgvjJfMyubZowPxS.json index fb0bd16d..43b4baf4 100644 --- a/src/packs/domains/domainCard_Full_Surge_SgvjJfMyubZowPxS.json +++ b/src/packs/domains/domainCard_Full_Surge_SgvjJfMyubZowPxS.json @@ -68,57 +68,57 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.traits.strength.value", - "value": 2, - "priority": null, - "type": "add" - }, - { - "key": "system.traits.agility.value", - "value": 2, - "priority": null, - "type": "add" - }, - { - "key": "system.traits.finesse.value", - "value": 2, - "priority": null, - "type": "add" - }, - { - "key": "system.traits.instinct.value", - "value": 2, - "priority": null, - "type": "add" - }, - { - "key": "system.traits.presence.value", - "value": 2, - "priority": null, - "type": "add" - }, - { - "key": "system.traits.knowledge.value", - "value": 2, - "priority": null, - "type": "add" - } - ], - "duration": { - "type": "shortRest" } }, + "changes": [ + { + "key": "system.traits.strength.value", + "mode": 2, + "value": "2", + "priority": null + }, + { + "key": "system.traits.agility.value", + "mode": 2, + "value": "2", + "priority": null + }, + { + "key": "system.traits.finesse.value", + "mode": 2, + "value": "2", + "priority": null + }, + { + "key": "system.traits.instinct.value", + "mode": 2, + "value": "2", + "priority": null + }, + { + "key": "system.traits.presence.value", + "mode": 2, + "value": "2", + "priority": null + }, + { + "key": "system.traits.knowledge.value", + "mode": 2, + "value": "2", + "priority": null + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

Gain a +2 bonus to all of your character traits until your next rest.

", + "description": "

Gain a +2 bonus to all of your character traits until your next rest.

", "tint": "#ffffff", "statuses": [], "sort": 0, @@ -126,16 +126,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!SgvjJfMyubZowPxS.H5q5iYImr69TfZcp" } ], diff --git a/src/packs/domains/domainCard_Glancing_Blow_nCNCqSH7UgW4O3To.json b/src/packs/domains/domainCard_Glancing_Blow_nCNCqSH7UgW4O3To.json index a0766c1c..70338c03 100644 --- a/src/packs/domains/domainCard_Glancing_Blow_nCNCqSH7UgW4O3To.json +++ b/src/packs/domains/domainCard_Glancing_Blow_nCNCqSH7UgW4O3To.json @@ -33,7 +33,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Glyph_of_Nightfall_B5HXqYRJiL3xMNKT.json b/src/packs/domains/domainCard_Glyph_of_Nightfall_B5HXqYRJiL3xMNKT.json index 35100187..ef2b6df9 100644 --- a/src/packs/domains/domainCard_Glyph_of_Nightfall_B5HXqYRJiL3xMNKT.json +++ b/src/packs/domains/domainCard_Glyph_of_Nightfall_B5HXqYRJiL3xMNKT.json @@ -32,7 +32,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -41,7 +41,7 @@ }, "effects": [ { - "_id": "9avDhppIdTqAR56f", + "_id": "X2w3kRHaETs8YWLO", "onSave": false } ], @@ -82,25 +82,12 @@ "effects": [ { "name": "Glyph of Nightfall", - "img": "systems/daggerheart/assets/icons/domains/domain-card/midnight.png", + "img": "icons/magic/symbols/runes-triangle-magenta.webp", "origin": "Compendium.daggerheart.domains.Item.B5HXqYRJiL3xMNKT", "transfer": false, - "_id": "9avDhppIdTqAR56f", + "_id": "st8Ji9ZNexvw64xM", "type": "base", "system": { - "changes": [ - { - "key": "system.difficulty", - "type": "add", - "value": "-max(ORIGIN.@system.traits.knowledge.value,1)", - "priority": null, - "phase": "initial" - } - ], - "duration": { - "description": "", - "type": "temporary" - }, "rangeDependence": { "enabled": false, "type": "withinRange", @@ -108,32 +95,76 @@ "range": "melee" } }, + "changes": [ + { + "key": "system.difficulty", + "mode": 2, + "value": "-max(ORIGIN.@system.traits.knowledge.value,1)", + "priority": null + } + ], "disabled": false, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

Conjure a dark glyph upon their body that exposes their weak points, temporarily reducing the target’s Difficulty by a value equal to your Knowledge (minimum 1).

", + "description": "

Conjure a dark glyph upon their body that exposes their weak points, temporarily reducing the target’s Difficulty by a value equal to your Knowledge (minimum 1).

", "tint": "#ffffff", "statuses": [], - "showIcon": 1, - "folder": null, "sort": 0, "flags": {}, "_stats": { "compendiumSource": null }, - "_key": "!items.effects!B5HXqYRJiL3xMNKT.9avDhppIdTqAR56f" + "_key": "!items.effects!B5HXqYRJiL3xMNKT.st8Ji9ZNexvw64xM" + }, + { + "name": "Glyph of Nightfall", + "img": "icons/magic/symbols/runes-triangle-magenta.webp", + "origin": "Compendium.daggerheart.domains.Item.B5HXqYRJiL3xMNKT", + "transfer": false, + "_id": "X2w3kRHaETs8YWLO", + "type": "base", + "system": { + "rangeDependence": { + "enabled": false, + "type": "withinRange", + "target": "hostile", + "range": "melee" + } + }, + "changes": [ + { + "key": "system.difficulty", + "mode": 2, + "value": "-max(ORIGIN.@system.traits.knowledge.value,1)", + "priority": null + } + ], + "disabled": false, + "duration": { + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "

Conjure a dark glyph upon their body that exposes their weak points, temporarily reducing the target’s Difficulty by a value equal to your Knowledge (minimum 1).

", + "tint": "#ffffff", + "statuses": [], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null + }, + "_key": "!items.effects!B5HXqYRJiL3xMNKT.X2w3kRHaETs8YWLO" } ], "ownership": { diff --git a/src/packs/domains/domainCard_Goad_Them_On_HufF5KzuNfEb9RTi.json b/src/packs/domains/domainCard_Goad_Them_On_HufF5KzuNfEb9RTi.json index db28b8b5..190028ed 100644 --- a/src/packs/domains/domainCard_Goad_Them_On_HufF5KzuNfEb9RTi.json +++ b/src/packs/domains/domainCard_Goad_Them_On_HufF5KzuNfEb9RTi.json @@ -24,8 +24,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -50,7 +50,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Gore_and_Glory_3zvjgZ5Od343wHzx.json b/src/packs/domains/domainCard_Gore_and_Glory_3zvjgZ5Od343wHzx.json index ff648409..8151beaa 100644 --- a/src/packs/domains/domainCard_Gore_and_Glory_3zvjgZ5Od343wHzx.json +++ b/src/packs/domains/domainCard_Gore_and_Glory_3zvjgZ5Od343wHzx.json @@ -25,8 +25,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -51,7 +51,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -93,8 +93,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -119,7 +119,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Grace_Touched_KAuNb51AwhD8KEXk.json b/src/packs/domains/domainCard_Grace_Touched_KAuNb51AwhD8KEXk.json index 2e48f07b..346a81f2 100644 --- a/src/packs/domains/domainCard_Grace_Touched_KAuNb51AwhD8KEXk.json +++ b/src/packs/domains/domainCard_Grace_Touched_KAuNb51AwhD8KEXk.json @@ -53,8 +53,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -79,7 +79,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Ground_Pound_WnGldYhJPDhx8v9X.json b/src/packs/domains/domainCard_Ground_Pound_WnGldYhJPDhx8v9X.json index 5663c6b3..56387c50 100644 --- a/src/packs/domains/domainCard_Ground_Pound_WnGldYhJPDhx8v9X.json +++ b/src/packs/domains/domainCard_Ground_Pound_WnGldYhJPDhx8v9X.json @@ -31,8 +31,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -58,7 +58,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Healing_Field_GlRm1Dxlc0Z1b04o.json b/src/packs/domains/domainCard_Healing_Field_GlRm1Dxlc0Z1b04o.json index d918d49f..0f60cc32 100644 --- a/src/packs/domains/domainCard_Healing_Field_GlRm1Dxlc0Z1b04o.json +++ b/src/packs/domains/domainCard_Healing_Field_GlRm1Dxlc0Z1b04o.json @@ -33,8 +33,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -59,7 +59,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -117,8 +117,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -143,7 +143,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Healing_Hands_WTlhnQMajc1r8i50.json b/src/packs/domains/domainCard_Healing_Hands_WTlhnQMajc1r8i50.json index c771562c..1245fc4b 100644 --- a/src/packs/domains/domainCard_Healing_Hands_WTlhnQMajc1r8i50.json +++ b/src/packs/domains/domainCard_Healing_Hands_WTlhnQMajc1r8i50.json @@ -25,7 +25,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -85,8 +85,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -111,7 +111,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -161,8 +161,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -187,7 +187,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -237,8 +237,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -263,7 +263,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -313,8 +313,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -339,7 +339,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Healing_Strike_XtSc0jIJLOoMTMYS.json b/src/packs/domains/domainCard_Healing_Strike_XtSc0jIJLOoMTMYS.json index 22f7f2c9..26fab1a9 100644 --- a/src/packs/domains/domainCard_Healing_Strike_XtSc0jIJLOoMTMYS.json +++ b/src/packs/domains/domainCard_Healing_Strike_XtSc0jIJLOoMTMYS.json @@ -33,8 +33,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -59,7 +59,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Hold_the_Line_kdFoLo3KXwn4LqTG.json b/src/packs/domains/domainCard_Hold_the_Line_kdFoLo3KXwn4LqTG.json index 263220e4..5b3c95d3 100644 --- a/src/packs/domains/domainCard_Hold_the_Line_kdFoLo3KXwn4LqTG.json +++ b/src/packs/domains/domainCard_Hold_the_Line_kdFoLo3KXwn4LqTG.json @@ -132,18 +132,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

If an adversary moves within Very Close range, they’re pulled into Melee range and Restrained.

", "tint": "#ffffff", @@ -155,16 +155,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!kdFoLo3KXwn4LqTG.WTYg0b8nE1XbnMiA" } ], diff --git a/src/packs/domains/domainCard_Hush_gwmYasmfgXZ7tFS6.json b/src/packs/domains/domainCard_Hush_gwmYasmfgXZ7tFS6.json index 28c41c7e..f49c4a83 100644 --- a/src/packs/domains/domainCard_Hush_gwmYasmfgXZ7tFS6.json +++ b/src/packs/domains/domainCard_Hush_gwmYasmfgXZ7tFS6.json @@ -32,7 +32,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -82,7 +82,45 @@ "effects": [ { "name": "Silenced", - "img": "systems/daggerheart/assets/icons/domains/domain-card/midnight.png", + "img": "icons/svg/sound-off.svg", + "origin": "Compendium.daggerheart.domains.Item.gwmYasmfgXZ7tFS6", + "transfer": false, + "_id": "5hzzPTFccUSSNHgp", + "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": "

Auppressive magic around the target that encompasses everything within Very Close range of them and follows them as they move. The target and anything within the area is Silenced until the GM spends a Fear on their turn to clear this condition, you cast Hush again, or you take Major damage. While Silenced, they can’t make noise and can’t cast spells.

", + "tint": "#ffffff", + "statuses": [ + "silence" + ], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null + }, + "_key": "!items.effects!gwmYasmfgXZ7tFS6.5hzzPTFccUSSNHgp" + }, + { + "name": "Silenced", + "img": "icons/svg/sound-off.svg", "origin": "Compendium.daggerheart.domains.Item.gwmYasmfgXZ7tFS6", "transfer": false, "_id": "pZ5YpjKidaj48IYF", @@ -93,21 +131,20 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until the GM spends a Fear on their turn to clear this condition, you cast Hush again, or you take Major damage.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

Suppressive magic around the target that encompasses everything within Very Close range of them and follows them as they move. The target and anything within the area is Silenced until the GM spends a Fear on their turn to clear this condition, you cast Hush again, or you take Major damage. While Silenced, they can’t make noise and can’t cast spells.

", + "description": "

Suppressive magic around the target that encompasses everything within Very Close range of them and follows them as they move. The target and anything within the area is Silenced until the GM spends a Fear on their turn to clear this condition, you cast Hush again, or you take Major damage. While Silenced, they can’t make noise and can’t cast spells.

", "tint": "#ffffff", "statuses": [], "sort": 0, @@ -115,16 +152,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!gwmYasmfgXZ7tFS6.pZ5YpjKidaj48IYF" } ], diff --git a/src/packs/domains/domainCard_Hypnotic_Shimmer_2ZeuCGVatQdPOVC6.json b/src/packs/domains/domainCard_Hypnotic_Shimmer_2ZeuCGVatQdPOVC6.json index 15a59635..67310781 100644 --- a/src/packs/domains/domainCard_Hypnotic_Shimmer_2ZeuCGVatQdPOVC6.json +++ b/src/packs/domains/domainCard_Hypnotic_Shimmer_2ZeuCGVatQdPOVC6.json @@ -25,8 +25,8 @@ "consumeOnSuccess": true }, "damage": { - "parts": { - "stress": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -51,7 +51,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -112,20 +112,20 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

An illusion of flashing colors and lights that temporarily Stuns targets. While Stunned, they can’t use reactions and can’t take any other actions until they clear this condition.

", + "description": "

An illusion of flashing colors and lights that temporarily Stuns targets. While Stunned, they can’t use reactions and can’t take any other actions until they clear this condition.

", "tint": "#ffffff", "statuses": [ "stun" @@ -135,16 +135,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!2ZeuCGVatQdPOVC6.xAG75UWUz3aDZH3m" } ], 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 5fa005b6..8d5f6536 100644 --- a/src/packs/domains/domainCard_I_See_It_Coming_Kp6RejHGimnuoBom.json +++ b/src/packs/domains/domainCard_I_See_It_Coming_Kp6RejHGimnuoBom.json @@ -33,7 +33,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Inspirational_Words_cWu1o82ZF7GvnbXc.json b/src/packs/domains/domainCard_Inspirational_Words_cWu1o82ZF7GvnbXc.json index b1f15298..0c28d499 100644 --- a/src/packs/domains/domainCard_Inspirational_Words_cWu1o82ZF7GvnbXc.json +++ b/src/packs/domains/domainCard_Inspirational_Words_cWu1o82ZF7GvnbXc.json @@ -41,8 +41,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -67,7 +67,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -117,8 +117,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -143,7 +143,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -193,8 +193,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -219,7 +219,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Invigoration_X8OfkEoI5gLTRf1B.json b/src/packs/domains/domainCard_Invigoration_X8OfkEoI5gLTRf1B.json index e3c5436c..658e12fd 100644 --- a/src/packs/domains/domainCard_Invigoration_X8OfkEoI5gLTRf1B.json +++ b/src/packs/domains/domainCard_Invigoration_X8OfkEoI5gLTRf1B.json @@ -33,7 +33,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Invisibility_KHkzA4Zrw8EWN1CH.json b/src/packs/domains/domainCard_Invisibility_KHkzA4Zrw8EWN1CH.json index 5f67ff74..be46b1c3 100644 --- a/src/packs/domains/domainCard_Invisibility_KHkzA4Zrw8EWN1CH.json +++ b/src/packs/domains/domainCard_Invisibility_KHkzA4Zrw8EWN1CH.json @@ -32,7 +32,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Know_Thy_Enemy_O38MQMhJWdZnXi6b.json b/src/packs/domains/domainCard_Know_Thy_Enemy_O38MQMhJWdZnXi6b.json index 44885c23..12308e6b 100644 --- a/src/packs/domains/domainCard_Know_Thy_Enemy_O38MQMhJWdZnXi6b.json +++ b/src/packs/domains/domainCard_Know_Thy_Enemy_O38MQMhJWdZnXi6b.json @@ -33,7 +33,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Lean_on_Me_BdePs1ZWpZTZvY1Z.json b/src/packs/domains/domainCard_Lean_on_Me_BdePs1ZWpZTZvY1Z.json index ae8c5b82..883e2522 100644 --- a/src/packs/domains/domainCard_Lean_on_Me_BdePs1ZWpZTZvY1Z.json +++ b/src/packs/domains/domainCard_Lean_on_Me_BdePs1ZWpZTZvY1Z.json @@ -24,8 +24,8 @@ "recovery": "longRest" }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -50,7 +50,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Life_Ward_OszbCj0jTqq2ADx9.json b/src/packs/domains/domainCard_Life_Ward_OszbCj0jTqq2ADx9.json index de841ffe..19a6fda6 100644 --- a/src/packs/domains/domainCard_Life_Ward_OszbCj0jTqq2ADx9.json +++ b/src/packs/domains/domainCard_Life_Ward_OszbCj0jTqq2ADx9.json @@ -70,18 +70,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "longRest" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Marked with a glowing sigil of protection. When this ally would make a death move, they clear a Hit Point instead.

This effect ends when it saves the target from a death move, you cast Life Ward on another target, or you take a long rest.

", "tint": "#ffffff", @@ -91,16 +91,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!OszbCj0jTqq2ADx9.E7Ou4OMEy3TeK1Gf" } ], diff --git a/src/packs/domains/domainCard_Manifest_Wall_TtGOtWkbr23VhHfH.json b/src/packs/domains/domainCard_Manifest_Wall_TtGOtWkbr23VhHfH.json index 02f20956..6e4b4654 100644 --- a/src/packs/domains/domainCard_Manifest_Wall_TtGOtWkbr23VhHfH.json +++ b/src/packs/domains/domainCard_Manifest_Wall_TtGOtWkbr23VhHfH.json @@ -33,7 +33,7 @@ "consumeOnSuccess": true }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Mass_Enrapture_ubpixIgZrJXKyM3b.json b/src/packs/domains/domainCard_Mass_Enrapture_ubpixIgZrJXKyM3b.json index 7e925700..da64f16e 100644 --- a/src/packs/domains/domainCard_Mass_Enrapture_ubpixIgZrJXKyM3b.json +++ b/src/packs/domains/domainCard_Mass_Enrapture_ubpixIgZrJXKyM3b.json @@ -24,7 +24,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -82,8 +82,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -108,7 +108,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -144,20 +144,20 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

While Enraptured, a target’s attention is fixed on you, narrowing their field of view and drowning out any sound but your voice.

", + "description": "

While Enraptured, a target’s attention is fixed on you, narrowing their field of view and drowning out any sound but your voice.

", "tint": "#ffffff", "statuses": [], "sort": 0, @@ -165,16 +165,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!ubpixIgZrJXKyM3b.QNbnelRylVB0yCm0" } ], diff --git a/src/packs/domains/domainCard_Mending_Touch_TGjR4vJVNbQRV8zr.json b/src/packs/domains/domainCard_Mending_Touch_TGjR4vJVNbQRV8zr.json index 60367dcc..4cb8c2a2 100644 --- a/src/packs/domains/domainCard_Mending_Touch_TGjR4vJVNbQRV8zr.json +++ b/src/packs/domains/domainCard_Mending_Touch_TGjR4vJVNbQRV8zr.json @@ -33,8 +33,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -59,7 +59,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -109,8 +109,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -135,7 +135,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -194,8 +194,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -220,7 +220,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -279,8 +279,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -305,7 +305,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Midnight_Spirit_FXLsB3QbQvTtqX5B.json b/src/packs/domains/domainCard_Midnight_Spirit_FXLsB3QbQvTtqX5B.json index f951054e..f97fe53d 100644 --- a/src/packs/domains/domainCard_Midnight_Spirit_FXLsB3QbQvTtqX5B.json +++ b/src/packs/domains/domainCard_Midnight_Spirit_FXLsB3QbQvTtqX5B.json @@ -60,8 +60,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -87,7 +87,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Midnight_Touched_uSyGKVxOJcnp28po.json b/src/packs/domains/domainCard_Midnight_Touched_uSyGKVxOJcnp28po.json index b859aafb..10c42418 100644 --- a/src/packs/domains/domainCard_Midnight_Touched_uSyGKVxOJcnp28po.json +++ b/src/packs/domains/domainCard_Midnight_Touched_uSyGKVxOJcnp28po.json @@ -24,8 +24,8 @@ "recovery": "shortRest" }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -50,7 +50,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Natural_Familiar_Tag303LoRNC5zGgl.json b/src/packs/domains/domainCard_Natural_Familiar_Tag303LoRNC5zGgl.json index c14116d4..7aa85b0f 100644 --- a/src/packs/domains/domainCard_Natural_Familiar_Tag303LoRNC5zGgl.json +++ b/src/packs/domains/domainCard_Natural_Familiar_Tag303LoRNC5zGgl.json @@ -59,7 +59,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Nature_s_Tongue_atWLorlCOxcrq8WB.json b/src/packs/domains/domainCard_Nature_s_Tongue_atWLorlCOxcrq8WB.json index b6c9464a..c722954b 100644 --- a/src/packs/domains/domainCard_Nature_s_Tongue_atWLorlCOxcrq8WB.json +++ b/src/packs/domains/domainCard_Nature_s_Tongue_atWLorlCOxcrq8WB.json @@ -24,7 +24,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Night_Terror_zcldCuqOg3dphUVI.json b/src/packs/domains/domainCard_Night_Terror_zcldCuqOg3dphUVI.json index d40b1c43..6ffddbe7 100644 --- a/src/packs/domains/domainCard_Night_Terror_zcldCuqOg3dphUVI.json +++ b/src/packs/domains/domainCard_Night_Terror_zcldCuqOg3dphUVI.json @@ -24,7 +24,7 @@ "recovery": "longRest" }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -84,8 +84,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -109,7 +109,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -146,20 +146,20 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

While Horrified, they’re Vulnerable.

", + "description": "

While Horrified, they’re Vulnerable.

", "tint": "#ffffff", "statuses": [ "vulnerable" @@ -169,16 +169,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!zcldCuqOg3dphUVI.32j3ZeNMMCk1QLlM" } ], diff --git a/src/packs/domains/domainCard_Onslaught_I7pNsQ9Yx6mRJX4V.json b/src/packs/domains/domainCard_Onslaught_I7pNsQ9Yx6mRJX4V.json index 5122ec4b..d2d7361d 100644 --- a/src/packs/domains/domainCard_Onslaught_I7pNsQ9Yx6mRJX4V.json +++ b/src/packs/domains/domainCard_Onslaught_I7pNsQ9Yx6mRJX4V.json @@ -33,7 +33,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Overwhelming_Aura_iEBLySZD9z8CLdz7.json b/src/packs/domains/domainCard_Overwhelming_Aura_iEBLySZD9z8CLdz7.json index 9aa2f5b4..cc04c9c9 100644 --- a/src/packs/domains/domainCard_Overwhelming_Aura_iEBLySZD9z8CLdz7.json +++ b/src/packs/domains/domainCard_Overwhelming_Aura_iEBLySZD9z8CLdz7.json @@ -33,7 +33,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -94,25 +94,25 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.traits.presence.value", - "value": "@cast", - "priority": 51, - "type": "override" - } - ], - "duration": { - "type": "longRest" } }, + "changes": [ + { + "key": "system.traits.presence.value", + "mode": 5, + "value": "@cast", + "priority": 51 + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Your Presence is equal to your Spellcast trait until your next long rest.
While this spell is active, an adversary must mark a Stress when they target you with an attack.

", "tint": "#ffffff", @@ -122,16 +122,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!iEBLySZD9z8CLdz7.ba9GO4NtQHYkaRR9" } ], diff --git a/src/packs/domains/domainCard_Plant_Dominion_9a6xP5pxhVvdugk9.json b/src/packs/domains/domainCard_Plant_Dominion_9a6xP5pxhVvdugk9.json index 4b4767fa..64b1e1c2 100644 --- a/src/packs/domains/domainCard_Plant_Dominion_9a6xP5pxhVvdugk9.json +++ b/src/packs/domains/domainCard_Plant_Dominion_9a6xP5pxhVvdugk9.json @@ -25,7 +25,7 @@ "consumeOnSuccess": true }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Preservation_Blast_1p1cOmbnRd5CoKBp.json b/src/packs/domains/domainCard_Preservation_Blast_1p1cOmbnRd5CoKBp.json index 5470c340..46dc2bdb 100644 --- a/src/packs/domains/domainCard_Preservation_Blast_1p1cOmbnRd5CoKBp.json +++ b/src/packs/domains/domainCard_Preservation_Blast_1p1cOmbnRd5CoKBp.json @@ -25,8 +25,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -52,7 +52,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Rage_Up_GRL0cvs96vrTDckZ.json b/src/packs/domains/domainCard_Rage_Up_GRL0cvs96vrTDckZ.json index c3493aea..6f8b481d 100644 --- a/src/packs/domains/domainCard_Rage_Up_GRL0cvs96vrTDckZ.json +++ b/src/packs/domains/domainCard_Rage_Up_GRL0cvs96vrTDckZ.json @@ -42,8 +42,44 @@ "type": "self", "amount": null }, - "name": "Mark Stress", - "img": "icons/skills/wounds/injury-face-impact-orange.webp", + "name": "Mark 1 Stress", + "img": "icons/magic/control/silhouette-aura-energy.webp", + "range": "self" + }, + "fKY9NcYBwCFwMsgV": { + "type": "effect", + "_id": "fKY9NcYBwCFwMsgV", + "systemPath": "actions", + "description": "

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

", + "chatDisplay": true, + "actionType": "action", + "cost": [ + { + "scalable": false, + "key": "stress", + "value": 2, + "step": null, + "consumeOnSuccess": false + } + ], + "uses": { + "value": null, + "max": "", + "recovery": null, + "consumeOnSuccess": false + }, + "effects": [ + { + "_id": "t6SIjQxB6UBUJ98f", + "onSave": false + } + ], + "target": { + "type": "self", + "amount": null + }, + "name": "Mark 2 Stress", + "img": "icons/magic/control/silhouette-aura-energy.webp", "range": "self" } }, @@ -58,8 +94,8 @@ "sort": 3400000, "effects": [ { - "name": "Rage Up", - "img": "icons/skills/wounds/injury-face-impact-orange.webp", + "name": "Rage Up (1)", + "img": "systems/daggerheart/assets/icons/domains/domain-card/blade.png", "origin": "Compendium.daggerheart.domains.Item.GRL0cvs96vrTDckZ", "transfer": false, "_id": "bq1MhcmoP6Wo5CXF", @@ -70,38 +106,33 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.bonuses.damage.magical.bonus", - "type": "add", - "value": "2*@system.traits.strength.value*@stacks", - "priority": 21, - "phase": "initial" - }, - { - "key": "system.bonuses.damage.physical.bonus", - "type": "add", - "value": "2*@system.traits.strength.value*@stacks", - "priority": 21, - "phase": "initial" - } - ], - "stacking": { - "max": 2 - }, - "duration": { - "type": "" } }, + "changes": [ + { + "key": "system.bonuses.damage.magical.bonus", + "mode": 2, + "value": "2*@system.traits.strength.value", + "priority": 21 + }, + { + "key": "system.bonuses.damage.physical.bonus", + "mode": 2, + "value": "2*@system.traits.strength.value", + "priority": 21 + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

For your next attack you have a bonus to your damage roll equal to twice your Strength.

", + "description": "", "tint": "#ffffff", "statuses": [], "sort": 0, @@ -109,16 +140,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!GRL0cvs96vrTDckZ.bq1MhcmoP6Wo5CXF" }, { @@ -134,28 +155,31 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.bonuses.damage.magical.bonus", - "value": "4*@system.traits.strength.value", - "priority": 21, - "type": "add" - }, - { - "key": "system.bonuses.damage.physical.bonus", - "value": "4*@system.traits.strength.value", - "priority": 21, - "type": "add" - } - ] + } }, + "changes": [ + { + "key": "system.bonuses.damage.magical.bonus", + "mode": 2, + "value": "4*@system.traits.strength.value", + "priority": 21 + }, + { + "key": "system.bonuses.damage.physical.bonus", + "mode": 2, + "value": "4*@system.traits.strength.value", + "priority": 21 + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -165,9 +189,6 @@ "_stats": { "compendiumSource": null }, - "start": null, - "showIcon": 1, - "folder": null, "_key": "!items.effects!GRL0cvs96vrTDckZ.t6SIjQxB6UBUJ98f" } ], diff --git a/src/packs/domains/domainCard_Rain_of_Blades_Ucenef6JpjQxwXni.json b/src/packs/domains/domainCard_Rain_of_Blades_Ucenef6JpjQxwXni.json index 080dd67f..839dc2c2 100644 --- a/src/packs/domains/domainCard_Rain_of_Blades_Ucenef6JpjQxwXni.json +++ b/src/packs/domains/domainCard_Rain_of_Blades_Ucenef6JpjQxwXni.json @@ -31,8 +31,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -56,7 +56,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -102,8 +102,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -127,7 +127,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Reaper_s_Strike_MCgNRlh0s5XUPCfl.json b/src/packs/domains/domainCard_Reaper_s_Strike_MCgNRlh0s5XUPCfl.json index 3bb8accd..f4feebbb 100644 --- a/src/packs/domains/domainCard_Reaper_s_Strike_MCgNRlh0s5XUPCfl.json +++ b/src/packs/domains/domainCard_Reaper_s_Strike_MCgNRlh0s5XUPCfl.json @@ -33,7 +33,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Redirect_faU0XkJCbar69PiN.json b/src/packs/domains/domainCard_Redirect_faU0XkJCbar69PiN.json index aeb20f1d..4adb8240 100644 --- a/src/packs/domains/domainCard_Redirect_faU0XkJCbar69PiN.json +++ b/src/packs/domains/domainCard_Redirect_faU0XkJCbar69PiN.json @@ -50,7 +50,7 @@ }, "flags": {}, "_id": "faU0XkJCbar69PiN", - "sort": 3500000, + "sort": 3400000, "effects": [], "ownership": { "default": 0 diff --git a/src/packs/domains/domainCard_Rejuvenation_Barrier_HtWx5IIemCoorMj2.json b/src/packs/domains/domainCard_Rejuvenation_Barrier_HtWx5IIemCoorMj2.json index 11e15a0b..25c991c2 100644 --- a/src/packs/domains/domainCard_Rejuvenation_Barrier_HtWx5IIemCoorMj2.json +++ b/src/packs/domains/domainCard_Rejuvenation_Barrier_HtWx5IIemCoorMj2.json @@ -25,8 +25,8 @@ "consumeOnSuccess": true }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -50,7 +50,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Restoration_wUQFsRtww18naYaq.json b/src/packs/domains/domainCard_Restoration_wUQFsRtww18naYaq.json index a83044a0..8d4d7695 100644 --- a/src/packs/domains/domainCard_Restoration_wUQFsRtww18naYaq.json +++ b/src/packs/domains/domainCard_Restoration_wUQFsRtww18naYaq.json @@ -42,8 +42,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -68,7 +68,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -119,8 +119,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -145,7 +145,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Resurrection_z30ciOwQI7g3tHla.json b/src/packs/domains/domainCard_Resurrection_z30ciOwQI7g3tHla.json index b7faa7ae..82b1b4fa 100644 --- a/src/packs/domains/domainCard_Resurrection_z30ciOwQI7g3tHla.json +++ b/src/packs/domains/domainCard_Resurrection_z30ciOwQI7g3tHla.json @@ -25,7 +25,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -72,7 +72,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Rift_Walker_vd5STqX29RpYbGxa.json b/src/packs/domains/domainCard_Rift_Walker_vd5STqX29RpYbGxa.json index 163cd293..c112e373 100644 --- a/src/packs/domains/domainCard_Rift_Walker_vd5STqX29RpYbGxa.json +++ b/src/packs/domains/domainCard_Rift_Walker_vd5STqX29RpYbGxa.json @@ -25,7 +25,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Rise_Up_oDIZoC4l19Nli0Fj.json b/src/packs/domains/domainCard_Rise_Up_oDIZoC4l19Nli0Fj.json index 5d46562d..38c900b2 100644 --- a/src/packs/domains/domainCard_Rise_Up_oDIZoC4l19Nli0Fj.json +++ b/src/packs/domains/domainCard_Rise_Up_oDIZoC4l19Nli0Fj.json @@ -24,8 +24,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -50,7 +50,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Rune_Ward_GEhBUmv9Bj7oJfHk.json b/src/packs/domains/domainCard_Rune_Ward_GEhBUmv9Bj7oJfHk.json index 01515230..54b0edbb 100644 --- a/src/packs/domains/domainCard_Rune_Ward_GEhBUmv9Bj7oJfHk.json +++ b/src/packs/domains/domainCard_Rune_Ward_GEhBUmv9Bj7oJfHk.json @@ -31,7 +31,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Salvation_Beam_4uAFGp3LxiC07woC.json b/src/packs/domains/domainCard_Salvation_Beam_4uAFGp3LxiC07woC.json index 3f81c8ac..c7aeb02f 100644 --- a/src/packs/domains/domainCard_Salvation_Beam_4uAFGp3LxiC07woC.json +++ b/src/packs/domains/domainCard_Salvation_Beam_4uAFGp3LxiC07woC.json @@ -33,8 +33,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -59,7 +59,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Second_Wind_ffPbSEvLuFrFsMxl.json b/src/packs/domains/domainCard_Second_Wind_ffPbSEvLuFrFsMxl.json index 764a3c87..8dc535cc 100644 --- a/src/packs/domains/domainCard_Second_Wind_ffPbSEvLuFrFsMxl.json +++ b/src/packs/domains/domainCard_Second_Wind_ffPbSEvLuFrFsMxl.json @@ -34,8 +34,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -60,7 +60,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -111,8 +111,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -137,7 +137,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Sensory_Projection_gZOMzskSOfeiXn54.json b/src/packs/domains/domainCard_Sensory_Projection_gZOMzskSOfeiXn54.json index c0aea3df..2701b0ce 100644 --- a/src/packs/domains/domainCard_Sensory_Projection_gZOMzskSOfeiXn54.json +++ b/src/packs/domains/domainCard_Sensory_Projection_gZOMzskSOfeiXn54.json @@ -25,7 +25,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Shadowbind_kguhWlidhxe2GbT0.json b/src/packs/domains/domainCard_Shadowbind_kguhWlidhxe2GbT0.json index 0fc6ce4b..cd906eaa 100644 --- a/src/packs/domains/domainCard_Shadowbind_kguhWlidhxe2GbT0.json +++ b/src/packs/domains/domainCard_Shadowbind_kguhWlidhxe2GbT0.json @@ -24,7 +24,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -85,18 +85,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -108,16 +108,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!kguhWlidhxe2GbT0.RFB4V0V4bDJ6vCL2" } ], diff --git a/src/packs/domains/domainCard_Shrug_It_Off_JwfhtgmmuRxg4zhI.json b/src/packs/domains/domainCard_Shrug_It_Off_JwfhtgmmuRxg4zhI.json index 3e757308..7cabf19d 100644 --- a/src/packs/domains/domainCard_Shrug_It_Off_JwfhtgmmuRxg4zhI.json +++ b/src/packs/domains/domainCard_Shrug_It_Off_JwfhtgmmuRxg4zhI.json @@ -32,7 +32,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Soothing_Speech_QED2PDYePOSTbLtC.json b/src/packs/domains/domainCard_Soothing_Speech_QED2PDYePOSTbLtC.json index b7ef626d..daecba3b 100644 --- a/src/packs/domains/domainCard_Soothing_Speech_QED2PDYePOSTbLtC.json +++ b/src/packs/domains/domainCard_Soothing_Speech_QED2PDYePOSTbLtC.json @@ -24,8 +24,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -50,7 +50,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -91,8 +91,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -117,7 +117,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Splintering_Strike_TYKfM3H9vBXyWiH4.json b/src/packs/domains/domainCard_Splintering_Strike_TYKfM3H9vBXyWiH4.json index a63fd477..e36c744c 100644 --- a/src/packs/domains/domainCard_Splintering_Strike_TYKfM3H9vBXyWiH4.json +++ b/src/packs/domains/domainCard_Splintering_Strike_TYKfM3H9vBXyWiH4.json @@ -33,7 +33,7 @@ "consumeOnSuccess": true }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Stunning_Sunlight_lRHo6ZkK1zybeEoG.json b/src/packs/domains/domainCard_Stunning_Sunlight_lRHo6ZkK1zybeEoG.json index 2f66c1f0..6fde5d18 100644 --- a/src/packs/domains/domainCard_Stunning_Sunlight_lRHo6ZkK1zybeEoG.json +++ b/src/packs/domains/domainCard_Stunning_Sunlight_lRHo6ZkK1zybeEoG.json @@ -33,8 +33,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -60,7 +60,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -112,8 +112,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -139,7 +139,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -175,20 +175,20 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

Temporarily Stunned. While Stunned, they can’t use reactions and can’t take any other actions until they clear this condition.

", + "description": "

Temporarily Stunned. While Stunned, they can’t use reactions and can’t take any other actions until they clear this condition.

", "tint": "#ffffff", "statuses": [ "stun" @@ -198,16 +198,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!lRHo6ZkK1zybeEoG.kSLuGSI6FLhOJaGp" } ], diff --git a/src/packs/domains/domainCard_Swift_Step_H6TqCJBaa1eWEQ1z.json b/src/packs/domains/domainCard_Swift_Step_H6TqCJBaa1eWEQ1z.json index 76e9e6e9..bd153045 100644 --- a/src/packs/domains/domainCard_Swift_Step_H6TqCJBaa1eWEQ1z.json +++ b/src/packs/domains/domainCard_Swift_Step_H6TqCJBaa1eWEQ1z.json @@ -25,8 +25,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -51,7 +51,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -93,8 +93,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -119,7 +119,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Telekinesis_FgzBppvLjXr0UbUI.json b/src/packs/domains/domainCard_Telekinesis_FgzBppvLjXr0UbUI.json index 0436b1aa..f80954e7 100644 --- a/src/packs/domains/domainCard_Telekinesis_FgzBppvLjXr0UbUI.json +++ b/src/packs/domains/domainCard_Telekinesis_FgzBppvLjXr0UbUI.json @@ -25,7 +25,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -72,8 +72,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -99,7 +99,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Teleport_HnPwVrWblYa9hwSt.json b/src/packs/domains/domainCard_Teleport_HnPwVrWblYa9hwSt.json index ff262d6f..b4563eac 100644 --- a/src/packs/domains/domainCard_Teleport_HnPwVrWblYa9hwSt.json +++ b/src/packs/domains/domainCard_Teleport_HnPwVrWblYa9hwSt.json @@ -24,7 +24,7 @@ "recovery": "longRest" }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Tell_No_Lies_HTv9QEPS466WsstP.json b/src/packs/domains/domainCard_Tell_No_Lies_HTv9QEPS466WsstP.json index 1efb1374..f1056dfc 100644 --- a/src/packs/domains/domainCard_Tell_No_Lies_HTv9QEPS466WsstP.json +++ b/src/packs/domains/domainCard_Tell_No_Lies_HTv9QEPS466WsstP.json @@ -24,8 +24,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -50,7 +50,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Tempest_X7YaZgFieBlqaPdZ.json b/src/packs/domains/domainCard_Tempest_X7YaZgFieBlqaPdZ.json index 3599017c..d82dd9fa 100644 --- a/src/packs/domains/domainCard_Tempest_X7YaZgFieBlqaPdZ.json +++ b/src/packs/domains/domainCard_Tempest_X7YaZgFieBlqaPdZ.json @@ -24,8 +24,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -51,7 +51,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -102,8 +102,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -129,7 +129,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -180,8 +180,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -207,7 +207,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -268,18 +268,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -291,16 +291,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!X7YaZgFieBlqaPdZ.oqPY3I9oO9J6l5Aj" }, { diff --git a/src/packs/domains/domainCard_Thought_Delver_B4choj481tqajWb9.json b/src/packs/domains/domainCard_Thought_Delver_B4choj481tqajWb9.json index 7c8d6235..0dbc078d 100644 --- a/src/packs/domains/domainCard_Thought_Delver_B4choj481tqajWb9.json +++ b/src/packs/domains/domainCard_Thought_Delver_B4choj481tqajWb9.json @@ -58,7 +58,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Through_Your_Eyes_7b0mzV5QMPjVPT4o.json b/src/packs/domains/domainCard_Through_Your_Eyes_7b0mzV5QMPjVPT4o.json index 529950b5..ed01392d 100644 --- a/src/packs/domains/domainCard_Through_Your_Eyes_7b0mzV5QMPjVPT4o.json +++ b/src/packs/domains/domainCard_Through_Your_Eyes_7b0mzV5QMPjVPT4o.json @@ -61,20 +61,20 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "shortRest" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

Can see through their eyes and hear through their ears.

", + "description": "

Can see through their eyes and hear through their ears.

", "tint": "#ffffff", "statuses": [], "sort": 0, @@ -82,16 +82,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!7b0mzV5QMPjVPT4o.TCOHV7tWpunCZDxn" } ], diff --git a/src/packs/domains/domainCard_Towering_Stalk_n0P3VS1WfxvmXbB6.json b/src/packs/domains/domainCard_Towering_Stalk_n0P3VS1WfxvmXbB6.json index 4696c144..d7d984d1 100644 --- a/src/packs/domains/domainCard_Towering_Stalk_n0P3VS1WfxvmXbB6.json +++ b/src/packs/domains/domainCard_Towering_Stalk_n0P3VS1WfxvmXbB6.json @@ -41,8 +41,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -68,7 +68,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Transcendent_Union_kVkoCLBXLAIifqpz.json b/src/packs/domains/domainCard_Transcendent_Union_kVkoCLBXLAIifqpz.json index 4460a5db..7d8d9bbe 100644 --- a/src/packs/domains/domainCard_Transcendent_Union_kVkoCLBXLAIifqpz.json +++ b/src/packs/domains/domainCard_Transcendent_Union_kVkoCLBXLAIifqpz.json @@ -70,18 +70,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "shortRest" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Until your next rest, when a creature connected by this union would mark Stress or Hit Points, the connected creatures can choose who marks it.

", "tint": "#ffffff", @@ -91,16 +91,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!kVkoCLBXLAIifqpz.kMcvp2QKmBP4uinB" } ], diff --git a/src/packs/domains/domainCard_Troublemaker_JrdZedm1BFKeV7Yb.json b/src/packs/domains/domainCard_Troublemaker_JrdZedm1BFKeV7Yb.json index 161c499f..9d740283 100644 --- a/src/packs/domains/domainCard_Troublemaker_JrdZedm1BFKeV7Yb.json +++ b/src/packs/domains/domainCard_Troublemaker_JrdZedm1BFKeV7Yb.json @@ -25,8 +25,8 @@ "consumeOnSuccess": true }, "damage": { - "parts": { - "stress": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -51,7 +51,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Twilight_Toll_SDjjV61TC1NceV1m.json b/src/packs/domains/domainCard_Twilight_Toll_SDjjV61TC1NceV1m.json index cc7f45c7..a6a987dd 100644 --- a/src/packs/domains/domainCard_Twilight_Toll_SDjjV61TC1NceV1m.json +++ b/src/packs/domains/domainCard_Twilight_Toll_SDjjV61TC1NceV1m.json @@ -40,8 +40,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -65,7 +65,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Unbreakable_CUIQmrPjf9VCHmwJ.json b/src/packs/domains/domainCard_Unbreakable_CUIQmrPjf9VCHmwJ.json index b822b632..e4847ee4 100644 --- a/src/packs/domains/domainCard_Unbreakable_CUIQmrPjf9VCHmwJ.json +++ b/src/packs/domains/domainCard_Unbreakable_CUIQmrPjf9VCHmwJ.json @@ -24,7 +24,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Uncanny_Disguise_TV56wSysbU5xAlOa.json b/src/packs/domains/domainCard_Uncanny_Disguise_TV56wSysbU5xAlOa.json index 62953005..46d9c472 100644 --- a/src/packs/domains/domainCard_Uncanny_Disguise_TV56wSysbU5xAlOa.json +++ b/src/packs/domains/domainCard_Uncanny_Disguise_TV56wSysbU5xAlOa.json @@ -24,7 +24,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Unleash_Chaos_o62i0QdbUDIiAhSq.json b/src/packs/domains/domainCard_Unleash_Chaos_o62i0QdbUDIiAhSq.json index 69049d01..62bd00a0 100644 --- a/src/packs/domains/domainCard_Unleash_Chaos_o62i0QdbUDIiAhSq.json +++ b/src/packs/domains/domainCard_Unleash_Chaos_o62i0QdbUDIiAhSq.json @@ -42,8 +42,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -69,7 +69,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Valor_Touched_k1AtYd3lSchIymBr.json b/src/packs/domains/domainCard_Valor_Touched_k1AtYd3lSchIymBr.json index 61c7ace8..20fe18ea 100644 --- a/src/packs/domains/domainCard_Valor_Touched_k1AtYd3lSchIymBr.json +++ b/src/packs/domains/domainCard_Valor_Touched_k1AtYd3lSchIymBr.json @@ -24,8 +24,8 @@ "recovery": null }, "damage": { - "parts": { - "armor": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -50,7 +50,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -93,25 +93,32 @@ "name": "Valor-Touched", "type": "base", "system": { - "changes": [ - { - "type": "armor", - "phase": "initial", - "priority": 20, - "value": { - "max": "1" - } - } - ] + "rangeDependence": { + "enabled": false, + "type": "withinRange", + "target": "hostile", + "range": "melee" + } }, - "_id": "Ma8Zp005QYKPWIEN", + "_id": "H9lgIqqp1imSNOv9", "img": "icons/magic/control/control-influence-rally-purple.webp", + "changes": [ + { + "key": "system.armorScore", + "mode": 2, + "value": "1", + "priority": null + } + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "origin": null, @@ -123,10 +130,7 @@ "_stats": { "compendiumSource": null }, - "start": null, - "showIcon": 1, - "folder": null, - "_key": "!items.effects!k1AtYd3lSchIymBr.Ma8Zp005QYKPWIEN" + "_key": "!items.effects!k1AtYd3lSchIymBr.H9lgIqqp1imSNOv9" } ], "ownership": { diff --git a/src/packs/domains/domainCard_Veil_of_Night_gV4L5ZZmfPrEbIDh.json b/src/packs/domains/domainCard_Veil_of_Night_gV4L5ZZmfPrEbIDh.json index abac35be..a6263afe 100644 --- a/src/packs/domains/domainCard_Veil_of_Night_gV4L5ZZmfPrEbIDh.json +++ b/src/packs/domains/domainCard_Veil_of_Night_gV4L5ZZmfPrEbIDh.json @@ -24,7 +24,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Vicious_Entangle_qvpvTnkAoRn9vYO4.json b/src/packs/domains/domainCard_Vicious_Entangle_qvpvTnkAoRn9vYO4.json index 3b7358bc..dae448e9 100644 --- a/src/packs/domains/domainCard_Vicious_Entangle_qvpvTnkAoRn9vYO4.json +++ b/src/packs/domains/domainCard_Vicious_Entangle_qvpvTnkAoRn9vYO4.json @@ -24,8 +24,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -51,7 +51,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -146,18 +146,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -169,16 +169,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!qvpvTnkAoRn9vYO4.Xh0wrgRUuYpwChBU" }, { @@ -194,18 +184,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -217,16 +207,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!qvpvTnkAoRn9vYO4.2xzOqTaPJQzGqFJv" } ], diff --git a/src/packs/domains/domainCard_Wild_Fortress_9dFvcM1i3bxG3BSA.json b/src/packs/domains/domainCard_Wild_Fortress_9dFvcM1i3bxG3BSA.json index d61f914b..655f0c2b 100644 --- a/src/packs/domains/domainCard_Wild_Fortress_9dFvcM1i3bxG3BSA.json +++ b/src/packs/domains/domainCard_Wild_Fortress_9dFvcM1i3bxG3BSA.json @@ -32,7 +32,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Words_of_Discord_ZjAdi1FSNCDDHI3X.json b/src/packs/domains/domainCard_Words_of_Discord_ZjAdi1FSNCDDHI3X.json index d743f5e1..fb3c6611 100644 --- a/src/packs/domains/domainCard_Words_of_Discord_ZjAdi1FSNCDDHI3X.json +++ b/src/packs/domains/domainCard_Words_of_Discord_ZjAdi1FSNCDDHI3X.json @@ -24,8 +24,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -50,7 +50,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Wrangle_9DwSxHoUwl8Kxj3n.json b/src/packs/domains/domainCard_Wrangle_9DwSxHoUwl8Kxj3n.json index 22042f7d..16753e1e 100644 --- a/src/packs/domains/domainCard_Wrangle_9DwSxHoUwl8Kxj3n.json +++ b/src/packs/domains/domainCard_Wrangle_9DwSxHoUwl8Kxj3n.json @@ -25,7 +25,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/domains/domainCard_Zone_of_Protection_lOZaRb4fCVgQsWB5.json b/src/packs/domains/domainCard_Zone_of_Protection_lOZaRb4fCVgQsWB5.json index 19bff136..5669173d 100644 --- a/src/packs/domains/domainCard_Zone_of_Protection_lOZaRb4fCVgQsWB5.json +++ b/src/packs/domains/domainCard_Zone_of_Protection_lOZaRb4fCVgQsWB5.json @@ -25,7 +25,7 @@ "consumeOnSuccess": true }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/environments/environment_Abandoned_Grove_pGEdzdLkqYtBhxnG.json b/src/packs/environments/environment_Abandoned_Grove_pGEdzdLkqYtBhxnG.json index 75fc932f..c1006da4 100644 --- a/src/packs/environments/environment_Abandoned_Grove_pGEdzdLkqYtBhxnG.json +++ b/src/packs/environments/environment_Abandoned_Grove_pGEdzdLkqYtBhxnG.json @@ -183,8 +183,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -210,7 +210,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -268,19 +268,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until you’re freed with a successful Finesse or Strength roll or by dealing at least 6 damage to the vines.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Restrained lasts until you’re freed with a successful Finesse or Strength roll or by dealing at least 6 damage to the vines.

", "tint": "#ffffff", @@ -292,16 +291,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!pGEdzdLkqYtBhxnG.maK5OyfrOxcjCoPt.LSeftEwgBbXXkLw3" } ], diff --git a/src/packs/environments/environment_Ambushed_uGEdNYERCTJBEjc5.json b/src/packs/environments/environment_Ambushed_uGEdNYERCTJBEjc5.json index ea1a158c..b0ccd435 100644 --- a/src/packs/environments/environment_Ambushed_uGEdNYERCTJBEjc5.json +++ b/src/packs/environments/environment_Ambushed_uGEdNYERCTJBEjc5.json @@ -166,8 +166,8 @@ "recovery": null }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -192,7 +192,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/environments/environment_Burning_Heart_of_the_Woods_oY69NN4rYxoRE4hl.json b/src/packs/environments/environment_Burning_Heart_of_the_Woods_oY69NN4rYxoRE4hl.json index c380a4e2..ea4f1951 100644 --- a/src/packs/environments/environment_Burning_Heart_of_the_Woods_oY69NN4rYxoRE4hl.json +++ b/src/packs/environments/environment_Burning_Heart_of_the_Woods_oY69NN4rYxoRE4hl.json @@ -213,7 +213,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -271,41 +271,30 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until you break free with a successful Finesse or Strength Roll or by dealing 10 damage to the vines.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

Restrained and Vulnerable until you break free, clearing both conditions, with a successful Finesse or Strength Roll or by dealing 10 damage to the vines. When the target makes a roll to escape, they take 1d8+4 physical damage and lose a Hope.

What painful memories do the vines bring to the surface as they pierce flesh?

", + "description": "

Restrained and Vulnerable until you break free, clearing both conditions, with a successful Finesse or Strength Roll or by dealing 10 damage to the vines. When the target makes a roll to escape, they take 1d8+4 physical damage and lose a Hope.

What painful memories do the vines bring to the surface as they pierce flesh?

", "tint": "#ffffff", "statuses": [ - "vulnerable", - "restrained" + "restrained", + "vulnerable" ], "sort": 0, "flags": {}, "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!oY69NN4rYxoRE4hl.1aOeMMX0XuDtZbbB.gCkqvBUljsOsYacB" } ], @@ -342,8 +331,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -369,7 +358,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -442,8 +431,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -469,7 +458,7 @@ } } } - }, + ], "includeBase": false, "direct": true }, diff --git a/src/packs/environments/environment_Bustling_Marketplace_HZKA7hkej7JJY503.json b/src/packs/environments/environment_Bustling_Marketplace_HZKA7hkej7JJY503.json index e10fad1a..ad96108b 100644 --- a/src/packs/environments/environment_Bustling_Marketplace_HZKA7hkej7JJY503.json +++ b/src/packs/environments/environment_Bustling_Marketplace_HZKA7hkej7JJY503.json @@ -50,9 +50,12 @@ "src": "systems/daggerheart/assets/icons/documents/actors/forest.svg", "anchorX": 0.5, "anchorY": 0.5, + "offsetX": 0, + "offsetY": 0, "fit": "contain", "scaleX": 1, "scaleY": 1, + "rotation": 0, "tint": "#ffffff", "alphaThreshold": 0.75 }, @@ -103,7 +106,7 @@ "saturation": 0, "contrast": 0 }, - "detectionModes": {}, + "detectionModes": [], "occludable": { "radius": 0 }, @@ -129,15 +132,14 @@ "flags": {}, "randomImg": false, "appendNumber": false, - "prependAdjective": false, - "depth": 1 + "prependAdjective": false }, "items": [ { "name": "Tip the Scales", "type": "feature", "system": { - "description": "

PCs can gain advantage on a Presence Roll by offering a handful of gold as part of the interaction.

Will any coin be accepted or only local currency? How overt are the PCs in offering this bribe?

", + "description": "

PCs can gain advantage on a Presence Roll by off ering a handful of gold as part of the interaction.

Will any coin be accepted or only local currency? How overt are the PCs in offering this bribe?

", "resource": null, "actions": {}, "originItemType": null, @@ -205,7 +207,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/environments/environment_Castle_Siege_1eZ32Esq7rfZOjlu.json b/src/packs/environments/environment_Castle_Siege_1eZ32Esq7rfZOjlu.json index fdfc9a5d..411a10c7 100644 --- a/src/packs/environments/environment_Castle_Siege_1eZ32Esq7rfZOjlu.json +++ b/src/packs/environments/environment_Castle_Siege_1eZ32Esq7rfZOjlu.json @@ -185,8 +185,8 @@ "recovery": null }, "damage": { - "parts": { - "fear": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -211,7 +211,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -342,8 +342,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -369,7 +369,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/environments/environment_Chaos_Realm_2Z1mKc65LxNk2PqR.json b/src/packs/environments/environment_Chaos_Realm_2Z1mKc65LxNk2PqR.json index e7c2c4e0..361b15bc 100644 --- a/src/packs/environments/environment_Chaos_Realm_2Z1mKc65LxNk2PqR.json +++ b/src/packs/environments/environment_Chaos_Realm_2Z1mKc65LxNk2PqR.json @@ -150,8 +150,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -176,7 +176,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -265,7 +265,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -381,8 +381,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -408,7 +408,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -552,8 +552,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -578,7 +578,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json b/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json index ef367d67..548cf7c4 100644 --- a/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json +++ b/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json @@ -214,8 +214,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -240,7 +240,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -292,8 +292,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -317,7 +317,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -343,8 +343,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -368,7 +368,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -394,8 +394,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -419,7 +419,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json b/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json index 637cdd41..d8e9cded 100644 --- a/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json +++ b/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json @@ -323,8 +323,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -349,7 +349,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -600,8 +600,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -625,7 +625,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/environments/environment_Hallowed_Temple_dsA6j69AnaJhUyqH.json b/src/packs/environments/environment_Hallowed_Temple_dsA6j69AnaJhUyqH.json index c510a87f..f005fa59 100644 --- a/src/packs/environments/environment_Hallowed_Temple_dsA6j69AnaJhUyqH.json +++ b/src/packs/environments/environment_Hallowed_Temple_dsA6j69AnaJhUyqH.json @@ -150,8 +150,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -176,7 +176,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -268,8 +268,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -294,7 +294,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/environments/environment_Imperial_Court_jr1xAoXzVwVblzxI.json b/src/packs/environments/environment_Imperial_Court_jr1xAoXzVwVblzxI.json index 5807d43c..4b49c341 100644 --- a/src/packs/environments/environment_Imperial_Court_jr1xAoXzVwVblzxI.json +++ b/src/packs/environments/environment_Imperial_Court_jr1xAoXzVwVblzxI.json @@ -209,8 +209,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -234,7 +234,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -307,7 +307,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { @@ -387,7 +387,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/environments/environment_Local_Tavern_cM4X81DOyvxNIi52.json b/src/packs/environments/environment_Local_Tavern_cM4X81DOyvxNIi52.json index da2d2830..105f230f 100644 --- a/src/packs/environments/environment_Local_Tavern_cM4X81DOyvxNIi52.json +++ b/src/packs/environments/environment_Local_Tavern_cM4X81DOyvxNIi52.json @@ -266,8 +266,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -291,7 +291,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/environments/environment_Mountain_Pass_acMu9wJrMZZzLSTJ.json b/src/packs/environments/environment_Mountain_Pass_acMu9wJrMZZzLSTJ.json index eaad99f7..9ba6a918 100644 --- a/src/packs/environments/environment_Mountain_Pass_acMu9wJrMZZzLSTJ.json +++ b/src/packs/environments/environment_Mountain_Pass_acMu9wJrMZZzLSTJ.json @@ -183,8 +183,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -208,7 +208,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -315,8 +315,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -341,7 +341,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/environments/environment_Necromancer_s_Ossuary_h3KyRL7AshhLAmcH.json b/src/packs/environments/environment_Necromancer_s_Ossuary_h3KyRL7AshhLAmcH.json index 949e3dc1..e96b9177 100644 --- a/src/packs/environments/environment_Necromancer_s_Ossuary_h3KyRL7AshhLAmcH.json +++ b/src/packs/environments/environment_Necromancer_s_Ossuary_h3KyRL7AshhLAmcH.json @@ -149,8 +149,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -175,7 +175,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -252,8 +252,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -277,7 +277,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -350,7 +350,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/environments/environment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json b/src/packs/environments/environment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json index 14c724e3..7be27924 100644 --- a/src/packs/environments/environment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json +++ b/src/packs/environments/environment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json @@ -218,8 +218,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -245,7 +245,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json b/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json index 6c87c446..6c34c296 100644 --- a/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json +++ b/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json @@ -230,8 +230,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -257,7 +257,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -315,19 +315,18 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until you get out of the river.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Vulnerable until you get out of the river.

", "tint": "#ffffff", @@ -339,16 +338,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!actors.items.effects!t4cdqTfzcqP3H1vJ.WsNoSwwtv0r80BMj.T0ouSQyR8cVpAn79" } ], diff --git a/src/packs/items/armors/armor_Advanced_Chainmail_Armor_LzLOJ9EVaHWAjoq9.json b/src/packs/items/armors/armor_Advanced_Chainmail_Armor_LzLOJ9EVaHWAjoq9.json index 4566396a..174f20c8 100644 --- a/src/packs/items/armors/armor_Advanced_Chainmail_Armor_LzLOJ9EVaHWAjoq9.json +++ b/src/packs/items/armors/armor_Advanced_Chainmail_Armor_LzLOJ9EVaHWAjoq9.json @@ -5,10 +5,6 @@ "_id": "LzLOJ9EVaHWAjoq9", "img": "icons/equipment/chest/breastplate-banded-steel-gold.webp", "system": { - "armor": { - "current": 0, - "max": 6 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Advanced_Full_Plate_Armor_crIbCb9NZ4K0VpoU.json b/src/packs/items/armors/armor_Advanced_Full_Plate_Armor_crIbCb9NZ4K0VpoU.json index 52adc7aa..dbc9d29f 100644 --- a/src/packs/items/armors/armor_Advanced_Full_Plate_Armor_crIbCb9NZ4K0VpoU.json +++ b/src/packs/items/armors/armor_Advanced_Full_Plate_Armor_crIbCb9NZ4K0VpoU.json @@ -5,10 +5,6 @@ "_id": "crIbCb9NZ4K0VpoU", "img": "icons/equipment/chest/breastplate-layered-steel-grey.webp", "system": { - "armor": { - "current": 0, - "max": 6 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Advanced_Gambeson_Armor_epkAmlZVk7HOfUUT.json b/src/packs/items/armors/armor_Advanced_Gambeson_Armor_epkAmlZVk7HOfUUT.json index 36edec39..c9ffc8a3 100644 --- a/src/packs/items/armors/armor_Advanced_Gambeson_Armor_epkAmlZVk7HOfUUT.json +++ b/src/packs/items/armors/armor_Advanced_Gambeson_Armor_epkAmlZVk7HOfUUT.json @@ -5,10 +5,6 @@ "_id": "epkAmlZVk7HOfUUT", "img": "icons/equipment/chest/breastplate-purple.webp", "system": { - "armor": { - "current": 0, - "max": 5 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Advanced_Leather_Armor_itSOp2GCyem0f7oM.json b/src/packs/items/armors/armor_Advanced_Leather_Armor_itSOp2GCyem0f7oM.json index 3e5dbd3b..4e1927e3 100644 --- a/src/packs/items/armors/armor_Advanced_Leather_Armor_itSOp2GCyem0f7oM.json +++ b/src/packs/items/armors/armor_Advanced_Leather_Armor_itSOp2GCyem0f7oM.json @@ -5,10 +5,6 @@ "_id": "itSOp2GCyem0f7oM", "img": "icons/equipment/chest/breastplate-layered-leather-blue.webp", "system": { - "armor": { - "current": 0, - "max": 5 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Bare_Bones_ITAjcigTcUw5pMCN.json b/src/packs/items/armors/armor_Bare_Bones_ITAjcigTcUw5pMCN.json new file mode 100644 index 00000000..5158b100 --- /dev/null +++ b/src/packs/items/armors/armor_Bare_Bones_ITAjcigTcUw5pMCN.json @@ -0,0 +1,75 @@ +{ + "folder": "tI3bfr6Sgi16Z7zm", + "name": "Bare Bones", + "type": "armor", + "_id": "ITAjcigTcUw5pMCN", + "img": "icons/magic/control/buff-strength-muscle-damage.webp", + "system": { + "description": "

When you choose not to equip armor, you have a base Armor Score of 3 + your Strength and use the following as your base damage thresholds:

", + "actions": {}, + "attached": [], + "tier": 1, + "equipped": false, + "baseScore": 3, + "armorFeatures": [], + "marks": { + "value": 0 + }, + "baseThresholds": { + "major": 9, + "severe": 19 + } + }, + "effects": [ + { + "name": "Bare Bones", + "type": "base", + "system": { + "rangeDependence": { + "enabled": false, + "type": "withinRange", + "target": "hostile", + "range": "melee" + } + }, + "_id": "8ze88zUwdkQSKKJq", + "img": "icons/magic/control/buff-strength-muscle-damage.webp", + "changes": [ + { + "key": "system.armorScore", + "mode": 2, + "value": "@system.traits.strength.value", + "priority": 21 + } + ], + "disabled": false, + "duration": { + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null + }, + "description": "

When you choose not to equip armor, you have a base Armor Score of 3 + your Strength and use the following as your base damage thresholds:

", + "origin": null, + "tint": "#ffffff", + "transfer": true, + "statuses": [], + "sort": 0, + "flags": {}, + "_stats": { + "compendiumSource": null + }, + "_key": "!items.effects!ITAjcigTcUw5pMCN.8ze88zUwdkQSKKJq" + } + ], + "sort": 0, + "ownership": { + "default": 0, + "MQSznptE5yLT7kj8": 3 + }, + "flags": {}, + "_key": "!items!ITAjcigTcUw5pMCN" +} diff --git a/src/packs/items/armors/armor_Bellamoi_Fine_Armor_WuoVwZA53XRAIt6d.json b/src/packs/items/armors/armor_Bellamoi_Fine_Armor_WuoVwZA53XRAIt6d.json index c470de87..ce4e35fd 100644 --- a/src/packs/items/armors/armor_Bellamoi_Fine_Armor_WuoVwZA53XRAIt6d.json +++ b/src/packs/items/armors/armor_Bellamoi_Fine_Armor_WuoVwZA53XRAIt6d.json @@ -5,10 +5,6 @@ "_id": "WuoVwZA53XRAIt6d", "img": "icons/equipment/chest/breastplate-layered-gold.webp", "system": { - "armor": { - "current": 0, - "max": 5 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Bladefare_Armor_mNN6pvcsS10ChrWF.json b/src/packs/items/armors/armor_Bladefare_Armor_mNN6pvcsS10ChrWF.json index 4ee73939..8b276d5f 100644 --- a/src/packs/items/armors/armor_Bladefare_Armor_mNN6pvcsS10ChrWF.json +++ b/src/packs/items/armors/armor_Bladefare_Armor_mNN6pvcsS10ChrWF.json @@ -5,10 +5,6 @@ "_id": "mNN6pvcsS10ChrWF", "img": "icons/equipment/chest/breastplate-collared-steel-grey.webp", "system": { - "armor": { - "current": 0, - "max": 6 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Chainmail_Armor_haULhuEg37zUUvhb.json b/src/packs/items/armors/armor_Chainmail_Armor_haULhuEg37zUUvhb.json index 4f0719a7..f7526e96 100644 --- a/src/packs/items/armors/armor_Chainmail_Armor_haULhuEg37zUUvhb.json +++ b/src/packs/items/armors/armor_Chainmail_Armor_haULhuEg37zUUvhb.json @@ -5,10 +5,6 @@ "_id": "haULhuEg37zUUvhb", "img": "icons/equipment/chest/breastplate-scale-grey.webp", "system": { - "armor": { - "current": 0, - "max": 4 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Channeling_Armor_vMJxEWz1srfwMsoj.json b/src/packs/items/armors/armor_Channeling_Armor_vMJxEWz1srfwMsoj.json index e805d5d1..a4bd0fea 100644 --- a/src/packs/items/armors/armor_Channeling_Armor_vMJxEWz1srfwMsoj.json +++ b/src/packs/items/armors/armor_Channeling_Armor_vMJxEWz1srfwMsoj.json @@ -5,10 +5,6 @@ "_id": "vMJxEWz1srfwMsoj", "img": "icons/equipment/chest/robe-collared-blue.webp", "system": { - "armor": { - "current": 0, - "max": 5 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Dragonscale_Armor_mdQ69eFHyAQUDmE7.json b/src/packs/items/armors/armor_Dragonscale_Armor_mdQ69eFHyAQUDmE7.json index 4b270234..5b39e41d 100644 --- a/src/packs/items/armors/armor_Dragonscale_Armor_mdQ69eFHyAQUDmE7.json +++ b/src/packs/items/armors/armor_Dragonscale_Armor_mdQ69eFHyAQUDmE7.json @@ -5,10 +5,6 @@ "_id": "mdQ69eFHyAQUDmE7", "img": "icons/equipment/chest/breastplate-rivited-red.webp", "system": { - "armor": { - "current": 0, - "max": 5 - }, "description": "", "actions": { "J1MCpcfXByKaSSgx": { diff --git a/src/packs/items/armors/armor_Dunamis_Silkchain_hAY6UgdGT7dj22Pr.json b/src/packs/items/armors/armor_Dunamis_Silkchain_hAY6UgdGT7dj22Pr.json index 6d223ada..df692143 100644 --- a/src/packs/items/armors/armor_Dunamis_Silkchain_hAY6UgdGT7dj22Pr.json +++ b/src/packs/items/armors/armor_Dunamis_Silkchain_hAY6UgdGT7dj22Pr.json @@ -5,10 +5,6 @@ "_id": "hAY6UgdGT7dj22Pr", "img": "icons/equipment/chest/robe-layered-red.webp", "system": { - "armor": { - "current": 0, - "max": 7 - }, "description": "", "actions": { "8PD5JQuS05IA6HJT": { @@ -52,7 +48,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/items/armors/armor_Elundrian_Chain_Armor_Q6LxmtFetDDkoZVZ.json b/src/packs/items/armors/armor_Elundrian_Chain_Armor_Q6LxmtFetDDkoZVZ.json index 1cf74e2e..d63ce4df 100644 --- a/src/packs/items/armors/armor_Elundrian_Chain_Armor_Q6LxmtFetDDkoZVZ.json +++ b/src/packs/items/armors/armor_Elundrian_Chain_Armor_Q6LxmtFetDDkoZVZ.json @@ -5,10 +5,6 @@ "_id": "Q6LxmtFetDDkoZVZ", "img": "icons/equipment/chest/breastplate-sculpted-green.webp", "system": { - "armor": { - "current": 0, - "max": 4 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Emberwoven_Armor_bcQUh4QG3qFX0Vx6.json b/src/packs/items/armors/armor_Emberwoven_Armor_bcQUh4QG3qFX0Vx6.json index 616bbadf..8ccc27e3 100644 --- a/src/packs/items/armors/armor_Emberwoven_Armor_bcQUh4QG3qFX0Vx6.json +++ b/src/packs/items/armors/armor_Emberwoven_Armor_bcQUh4QG3qFX0Vx6.json @@ -5,10 +5,6 @@ "_id": "bcQUh4QG3qFX0Vx6", "img": "icons/equipment/chest/breastplate-layered-gilded-orange.webp", "system": { - "armor": { - "current": 0, - "max": 6 - }, "description": "", "actions": { "L8mHf4A8SylyxsMH": { @@ -24,8 +20,8 @@ "amount": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "applyTo": "stress", "value": { "custom": { @@ -50,7 +46,7 @@ "base": false, "type": [] } - }, + ], "includeBase": false }, "_id": "L8mHf4A8SylyxsMH", diff --git a/src/packs/items/armors/armor_Full_Fortified_Armor_7emTSt6nhZuTlvt5.json b/src/packs/items/armors/armor_Full_Fortified_Armor_7emTSt6nhZuTlvt5.json index 9f2d7ece..8eb964cc 100644 --- a/src/packs/items/armors/armor_Full_Fortified_Armor_7emTSt6nhZuTlvt5.json +++ b/src/packs/items/armors/armor_Full_Fortified_Armor_7emTSt6nhZuTlvt5.json @@ -5,10 +5,6 @@ "_id": "7emTSt6nhZuTlvt5", "img": "icons/equipment/chest/breastplate-layered-steel.webp", "system": { - "armor": { - "current": 0, - "max": 4 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Full_Plate_Armor_UdUJNa31WxFW2noa.json b/src/packs/items/armors/armor_Full_Plate_Armor_UdUJNa31WxFW2noa.json index 7701d063..1ea120ed 100644 --- a/src/packs/items/armors/armor_Full_Plate_Armor_UdUJNa31WxFW2noa.json +++ b/src/packs/items/armors/armor_Full_Plate_Armor_UdUJNa31WxFW2noa.json @@ -5,10 +5,6 @@ "_id": "UdUJNa31WxFW2noa", "img": "icons/equipment/chest/breastplate-collared-steel.webp", "system": { - "armor": { - "current": 0, - "max": 4 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Gambeson_Armor_yJFp1bfpecDcStVK.json b/src/packs/items/armors/armor_Gambeson_Armor_yJFp1bfpecDcStVK.json index 0ede5b60..1c775402 100644 --- a/src/packs/items/armors/armor_Gambeson_Armor_yJFp1bfpecDcStVK.json +++ b/src/packs/items/armors/armor_Gambeson_Armor_yJFp1bfpecDcStVK.json @@ -5,10 +5,6 @@ "_id": "yJFp1bfpecDcStVK", "img": "icons/equipment/chest/vest-leather-tattered-white.webp", "system": { - "armor": { - "current": 0, - "max": 3 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Harrowbone_Armor_dvyQeUVRLc9y6rnt.json b/src/packs/items/armors/armor_Harrowbone_Armor_dvyQeUVRLc9y6rnt.json index 85ad1d6a..61d1fed7 100644 --- a/src/packs/items/armors/armor_Harrowbone_Armor_dvyQeUVRLc9y6rnt.json +++ b/src/packs/items/armors/armor_Harrowbone_Armor_dvyQeUVRLc9y6rnt.json @@ -5,10 +5,6 @@ "_id": "dvyQeUVRLc9y6rnt", "img": "icons/equipment/chest/breastplate-gorget-steel.webp", "system": { - "armor": { - "current": 0, - "max": 4 - }, "description": "", "actions": { "IzM88FIxQ35P5VB2": { @@ -43,7 +39,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/items/armors/armor_Improved_Chainmail_Armor_K5WkjS0NGqHYmhU3.json b/src/packs/items/armors/armor_Improved_Chainmail_Armor_K5WkjS0NGqHYmhU3.json index ef93ecdd..96e320d1 100644 --- a/src/packs/items/armors/armor_Improved_Chainmail_Armor_K5WkjS0NGqHYmhU3.json +++ b/src/packs/items/armors/armor_Improved_Chainmail_Armor_K5WkjS0NGqHYmhU3.json @@ -5,10 +5,6 @@ "_id": "K5WkjS0NGqHYmhU3", "img": "icons/equipment/chest/breastplate-metal-scaled-grey.webp", "system": { - "armor": { - "current": 0, - "max": 5 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Improved_Full_Plate_Armor_9f7RozpPTqrzJS1m.json b/src/packs/items/armors/armor_Improved_Full_Plate_Armor_9f7RozpPTqrzJS1m.json index 1723c53a..ee63a774 100644 --- a/src/packs/items/armors/armor_Improved_Full_Plate_Armor_9f7RozpPTqrzJS1m.json +++ b/src/packs/items/armors/armor_Improved_Full_Plate_Armor_9f7RozpPTqrzJS1m.json @@ -5,10 +5,6 @@ "_id": "9f7RozpPTqrzJS1m", "img": "icons/equipment/chest/breastplate-cuirass-steel-grey.webp", "system": { - "armor": { - "current": 0, - "max": 5 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Improved_Gambeson_Armor_jphnMZjnS2FkOH3s.json b/src/packs/items/armors/armor_Improved_Gambeson_Armor_jphnMZjnS2FkOH3s.json index a2ff6554..6f4ea1c3 100644 --- a/src/packs/items/armors/armor_Improved_Gambeson_Armor_jphnMZjnS2FkOH3s.json +++ b/src/packs/items/armors/armor_Improved_Gambeson_Armor_jphnMZjnS2FkOH3s.json @@ -5,10 +5,6 @@ "_id": "jphnMZjnS2FkOH3s", "img": "icons/equipment/chest/breastplate-quilted-brown.webp", "system": { - "armor": { - "current": 0, - "max": 4 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Improved_Leather_Armor_t91M61pSCMKStTNt.json b/src/packs/items/armors/armor_Improved_Leather_Armor_t91M61pSCMKStTNt.json index efa3643d..a4f38cc6 100644 --- a/src/packs/items/armors/armor_Improved_Leather_Armor_t91M61pSCMKStTNt.json +++ b/src/packs/items/armors/armor_Improved_Leather_Armor_t91M61pSCMKStTNt.json @@ -5,10 +5,6 @@ "_id": "t91M61pSCMKStTNt", "img": "icons/equipment/chest/breastplate-banded-simple-leather-brown.webp", "system": { - "armor": { - "current": 0, - "max": 4 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Irontree_Breastplate_Armor_tzZntboNtHL5C6VM.json b/src/packs/items/armors/armor_Irontree_Breastplate_Armor_tzZntboNtHL5C6VM.json index a664ad9c..a9e9eaca 100644 --- a/src/packs/items/armors/armor_Irontree_Breastplate_Armor_tzZntboNtHL5C6VM.json +++ b/src/packs/items/armors/armor_Irontree_Breastplate_Armor_tzZntboNtHL5C6VM.json @@ -5,10 +5,6 @@ "_id": "tzZntboNtHL5C6VM", "img": "icons/equipment/chest/breastplate-layered-leather-brown-silver.webp", "system": { - "armor": { - "current": 0, - "max": 4 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Leather_Armor_nibfdNtp2PtxvbVz.json b/src/packs/items/armors/armor_Leather_Armor_nibfdNtp2PtxvbVz.json index 93d8f0cc..37a13f2b 100644 --- a/src/packs/items/armors/armor_Leather_Armor_nibfdNtp2PtxvbVz.json +++ b/src/packs/items/armors/armor_Leather_Armor_nibfdNtp2PtxvbVz.json @@ -5,10 +5,6 @@ "_id": "nibfdNtp2PtxvbVz", "img": "icons/equipment/chest/breastplate-layered-leather-brown.webp", "system": { - "armor": { - "current": 0, - "max": 3 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Legendary_Chainmail_Armor_EsIN5OLKe9ZYFNXZ.json b/src/packs/items/armors/armor_Legendary_Chainmail_Armor_EsIN5OLKe9ZYFNXZ.json index 6c93cbe4..4bee5e4f 100644 --- a/src/packs/items/armors/armor_Legendary_Chainmail_Armor_EsIN5OLKe9ZYFNXZ.json +++ b/src/packs/items/armors/armor_Legendary_Chainmail_Armor_EsIN5OLKe9ZYFNXZ.json @@ -5,10 +5,6 @@ "_id": "EsIN5OLKe9ZYFNXZ", "img": "icons/equipment/chest/breastplate-banded-blue.webp", "system": { - "armor": { - "current": 0, - "max": 7 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Legendary_Full_Plate_Armor_SXWjUR2aUR6bYvdl.json b/src/packs/items/armors/armor_Legendary_Full_Plate_Armor_SXWjUR2aUR6bYvdl.json index f66e4c38..baf544c2 100644 --- a/src/packs/items/armors/armor_Legendary_Full_Plate_Armor_SXWjUR2aUR6bYvdl.json +++ b/src/packs/items/armors/armor_Legendary_Full_Plate_Armor_SXWjUR2aUR6bYvdl.json @@ -5,10 +5,6 @@ "_id": "SXWjUR2aUR6bYvdl", "img": "icons/equipment/chest/breastplate-layered-steel-blue-gold.webp", "system": { - "armor": { - "current": 0, - "max": 7 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Legendary_Gambeson_Armor_c6tMXz4rPf9ioQrf.json b/src/packs/items/armors/armor_Legendary_Gambeson_Armor_c6tMXz4rPf9ioQrf.json index 4cf1c856..338c85e8 100644 --- a/src/packs/items/armors/armor_Legendary_Gambeson_Armor_c6tMXz4rPf9ioQrf.json +++ b/src/packs/items/armors/armor_Legendary_Gambeson_Armor_c6tMXz4rPf9ioQrf.json @@ -5,10 +5,6 @@ "_id": "c6tMXz4rPf9ioQrf", "img": "icons/equipment/chest/breastplate-layered-leather-blue-gold.webp", "system": { - "armor": { - "current": 0, - "max": 6 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Legendary_Leather_Armor_Tptgl5WOj76TyFn7.json b/src/packs/items/armors/armor_Legendary_Leather_Armor_Tptgl5WOj76TyFn7.json index 3ddc5ed7..42334dc4 100644 --- a/src/packs/items/armors/armor_Legendary_Leather_Armor_Tptgl5WOj76TyFn7.json +++ b/src/packs/items/armors/armor_Legendary_Leather_Armor_Tptgl5WOj76TyFn7.json @@ -5,10 +5,6 @@ "_id": "Tptgl5WOj76TyFn7", "img": "icons/equipment/chest/breastplate-layered-gilded-black.webp", "system": { - "armor": { - "current": 0, - "max": 6 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Monett_s_Cloak_AQzU2RsqS5V5bd1v.json b/src/packs/items/armors/armor_Monett_s_Cloak_AQzU2RsqS5V5bd1v.json index 6bb479a4..9a8e1f22 100644 --- a/src/packs/items/armors/armor_Monett_s_Cloak_AQzU2RsqS5V5bd1v.json +++ b/src/packs/items/armors/armor_Monett_s_Cloak_AQzU2RsqS5V5bd1v.json @@ -5,10 +5,6 @@ "_id": "AQzU2RsqS5V5bd1v", "img": "icons/equipment/chest/coat-collared-red.webp", "system": { - "armor": { - "current": 0, - "max": 6 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Rosewild_Armor_tN8kAeBvNKM3EBFo.json b/src/packs/items/armors/armor_Rosewild_Armor_tN8kAeBvNKM3EBFo.json index e3cde9fb..0f0f6430 100644 --- a/src/packs/items/armors/armor_Rosewild_Armor_tN8kAeBvNKM3EBFo.json +++ b/src/packs/items/armors/armor_Rosewild_Armor_tN8kAeBvNKM3EBFo.json @@ -5,10 +5,6 @@ "_id": "tN8kAeBvNKM3EBFo", "img": "icons/equipment/chest/breastplate-banded-leather-purple.webp", "system": { - "armor": { - "current": 0, - "max": 5 - }, "description": "", "actions": { "QRTnCYxJfuJHdnyV": { 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 2ccc80da..240a4f3e 100644 --- a/src/packs/items/armors/armor_Runes_of_Fortification_P4qAEDJUoNLgVRsA.json +++ b/src/packs/items/armors/armor_Runes_of_Fortification_P4qAEDJUoNLgVRsA.json @@ -5,10 +5,6 @@ "_id": "P4qAEDJUoNLgVRsA", "img": "icons/magic/symbols/rune-sigil-red-orange.webp", "system": { - "armor": { - "current": 0, - "max": 6 - }, "description": "", "actions": { "37KLF2bim9nRdPTU": { 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 593bc8e0..8d4af425 100644 --- a/src/packs/items/armors/armor_Runetan_Floating_Armor_tHlBUDQC24YMZqd6.json +++ b/src/packs/items/armors/armor_Runetan_Floating_Armor_tHlBUDQC24YMZqd6.json @@ -5,10 +5,6 @@ "_id": "tHlBUDQC24YMZqd6", "img": "icons/equipment/chest/breastplate-layered-leather-black.webp", "system": { - "armor": { - "current": 0, - "max": 4 - }, "description": "", "actions": { "Nn33zCIcWe6LQMDH": { diff --git a/src/packs/items/armors/armor_Savior_Chainmail_8X16lJQ3xltTwynm.json b/src/packs/items/armors/armor_Savior_Chainmail_8X16lJQ3xltTwynm.json index 6826254a..714e8592 100644 --- a/src/packs/items/armors/armor_Savior_Chainmail_8X16lJQ3xltTwynm.json +++ b/src/packs/items/armors/armor_Savior_Chainmail_8X16lJQ3xltTwynm.json @@ -5,10 +5,6 @@ "_id": "8X16lJQ3xltTwynm", "img": "icons/equipment/chest/breastplate-layered-leather-green.webp", "system": { - "armor": { - "current": 0, - "max": 8 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Spiked_Plate_Armor_QjwsIhXKqnlvRBMv.json b/src/packs/items/armors/armor_Spiked_Plate_Armor_QjwsIhXKqnlvRBMv.json index ac9115a2..cb5fc720 100644 --- a/src/packs/items/armors/armor_Spiked_Plate_Armor_QjwsIhXKqnlvRBMv.json +++ b/src/packs/items/armors/armor_Spiked_Plate_Armor_QjwsIhXKqnlvRBMv.json @@ -5,10 +5,6 @@ "_id": "QjwsIhXKqnlvRBMv", "img": "icons/equipment/chest/breastplate-banded-steel-studded.webp", "system": { - "armor": { - "current": 0, - "max": 5 - }, "description": "", "actions": {}, "attached": [], diff --git a/src/packs/items/armors/armor_Tyris_Soft_Armor_PSW3BxCGmtLeWOxM.json b/src/packs/items/armors/armor_Tyris_Soft_Armor_PSW3BxCGmtLeWOxM.json index c6766018..da640830 100644 --- a/src/packs/items/armors/armor_Tyris_Soft_Armor_PSW3BxCGmtLeWOxM.json +++ b/src/packs/items/armors/armor_Tyris_Soft_Armor_PSW3BxCGmtLeWOxM.json @@ -5,10 +5,6 @@ "_id": "PSW3BxCGmtLeWOxM", "img": "icons/equipment/chest/robe-layered-purple.webp", "system": { - "armor": { - "current": 0, - "max": 5 - }, "description": "", "actions": { "Ch6IhuPewBeseGez": { diff --git a/src/packs/items/armors/armor_Veritas_Opal_Armor_OvzgUTYy2RCN85vV.json b/src/packs/items/armors/armor_Veritas_Opal_Armor_OvzgUTYy2RCN85vV.json index 403b79e8..08a1b573 100644 --- a/src/packs/items/armors/armor_Veritas_Opal_Armor_OvzgUTYy2RCN85vV.json +++ b/src/packs/items/armors/armor_Veritas_Opal_Armor_OvzgUTYy2RCN85vV.json @@ -5,10 +5,6 @@ "_id": "OvzgUTYy2RCN85vV", "img": "icons/equipment/chest/breastplate-collared-steel-green.webp", "system": { - "armor": { - "current": 0, - "max": 6 - }, "description": "", "actions": { "sY3W5JYspN5Du5ag": { diff --git a/src/packs/items/armors/folders_Special_tI3bfr6Sgi16Z7zm.json b/src/packs/items/armors/folders_Special_tI3bfr6Sgi16Z7zm.json new file mode 100644 index 00000000..65c4eca8 --- /dev/null +++ b/src/packs/items/armors/folders_Special_tI3bfr6Sgi16Z7zm.json @@ -0,0 +1,12 @@ +{ + "type": "Item", + "folder": null, + "name": "Special", + "color": null, + "sorting": "a", + "_id": "tI3bfr6Sgi16Z7zm", + "description": "", + "sort": 0, + "flags": {}, + "_key": "!folders!tI3bfr6Sgi16Z7zm" +} diff --git a/src/packs/items/consumables/consumable_Blinding_Orb_eAXHdzA5qNPldOpn.json b/src/packs/items/consumables/consumable_Blinding_Orb_eAXHdzA5qNPldOpn.json index 1282ceeb..3e237b65 100644 --- a/src/packs/items/consumables/consumable_Blinding_Orb_eAXHdzA5qNPldOpn.json +++ b/src/packs/items/consumables/consumable_Blinding_Orb_eAXHdzA5qNPldOpn.json @@ -59,21 +59,19 @@ "transfer": false, "_id": "nryJhrF26hyFQUxH", "type": "base", - "system": { - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until they mark HP.

" - } - }, + "system": {}, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

You are Vulnerable until you mark a Hit Point.

", + "description": "

You are Vulnerable until you mark a Hit Point.

", "tint": "#ffffff", "statuses": [ "vulnerable" @@ -83,16 +81,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!eAXHdzA5qNPldOpn.nryJhrF26hyFQUxH" } ], diff --git a/src/packs/items/consumables/consumable_Dragonbloom_Tea_wM18PWWW2Ami4fBG.json b/src/packs/items/consumables/consumable_Dragonbloom_Tea_wM18PWWW2Ami4fBG.json index 5e877f6d..0dc8764d 100644 --- a/src/packs/items/consumables/consumable_Dragonbloom_Tea_wM18PWWW2Ami4fBG.json +++ b/src/packs/items/consumables/consumable_Dragonbloom_Tea_wM18PWWW2Ami4fBG.json @@ -30,8 +30,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -55,7 +55,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/items/consumables/consumable_Dripfang_Poison_eU8VpbWB2NHIL47n.json b/src/packs/items/consumables/consumable_Dripfang_Poison_eU8VpbWB2NHIL47n.json index cb2c7997..3b0eb9e7 100644 --- a/src/packs/items/consumables/consumable_Dripfang_Poison_eU8VpbWB2NHIL47n.json +++ b/src/packs/items/consumables/consumable_Dripfang_Poison_eU8VpbWB2NHIL47n.json @@ -30,8 +30,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -57,7 +57,7 @@ } } } - }, + ], "includeBase": false }, "target": { 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 159e0442..67f4b227 100644 --- a/src/packs/items/consumables/consumable_Feast_of_Xuria_aX6NyxkNzu0LcJpt.json +++ b/src/packs/items/consumables/consumable_Feast_of_Xuria_aX6NyxkNzu0LcJpt.json @@ -30,8 +30,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -56,7 +56,7 @@ }, "type": [] }, - "stress": { + { "value": { "custom": { "enabled": true, @@ -81,7 +81,7 @@ }, "type": [] }, - "hope": { + { "value": { "custom": { "enabled": false @@ -105,7 +105,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/items/consumables/consumable_Growing_Potion_fl2f3ees8RFMze9t.json b/src/packs/items/consumables/consumable_Growing_Potion_fl2f3ees8RFMze9t.json index 833e7055..933d70fa 100644 --- a/src/packs/items/consumables/consumable_Growing_Potion_fl2f3ees8RFMze9t.json +++ b/src/packs/items/consumables/consumable_Growing_Potion_fl2f3ees8RFMze9t.json @@ -59,31 +59,30 @@ "transfer": false, "_id": "YEGd74Lssj7rCmpF", "type": "base", - "system": { - "changes": [ - { - "key": "system.traits.strength.value", - "value": 2, - "priority": null, - "type": "add" - }, - { - "key": "system.proficiency", - "value": 1, - "priority": null, - "type": "add" - } - ], - "duration": { - "type": "shortRest" + "system": {}, + "changes": [ + { + "key": "system.traits.strength.value", + "mode": 2, + "value": "2", + "priority": null + }, + { + "key": "system.proficiency", + "mode": 2, + "value": "1", + "priority": null } - }, + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -93,16 +92,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!fl2f3ees8RFMze9t.YEGd74Lssj7rCmpF" } ], diff --git a/src/packs/items/consumables/consumable_Health_Potion_Aruc2NLutWuVIjP1.json b/src/packs/items/consumables/consumable_Health_Potion_Aruc2NLutWuVIjP1.json index 7365b375..eb9c4824 100644 --- a/src/packs/items/consumables/consumable_Health_Potion_Aruc2NLutWuVIjP1.json +++ b/src/packs/items/consumables/consumable_Health_Potion_Aruc2NLutWuVIjP1.json @@ -30,8 +30,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -55,7 +55,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { 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 707a395f..f1e88b96 100644 --- a/src/packs/items/consumables/consumable_Improved_Arcane_Shard_nQTo6mNoPTEVBtkm.json +++ b/src/packs/items/consumables/consumable_Improved_Arcane_Shard_nQTo6mNoPTEVBtkm.json @@ -30,8 +30,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -57,7 +57,7 @@ } } } - }, + ], "includeBase": false }, "target": { 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 c8e6e75b..38555821 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 @@ -30,8 +30,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -57,7 +57,7 @@ } } } - }, + ], "includeBase": false }, "target": { 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 5e95fe66..76e67cf9 100644 --- a/src/packs/items/consumables/consumable_Major_Arcane_Shard_AA7bmiwv00lshPrC.json +++ b/src/packs/items/consumables/consumable_Major_Arcane_Shard_AA7bmiwv00lshPrC.json @@ -30,8 +30,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -55,7 +55,7 @@ } } } - }, + ], "includeBase": false }, "target": { 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 67be0b08..a300aaf6 100644 --- a/src/packs/items/consumables/consumable_Major_Health_Potion_cM7pHe8bBAxSZ2xR.json +++ b/src/packs/items/consumables/consumable_Major_Health_Potion_cM7pHe8bBAxSZ2xR.json @@ -30,8 +30,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -55,7 +55,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { 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 703c2cbe..94e53a0c 100644 --- a/src/packs/items/consumables/consumable_Major_Stamina_Potion_I4cQ03xbxnc81EGa.json +++ b/src/packs/items/consumables/consumable_Major_Stamina_Potion_I4cQ03xbxnc81EGa.json @@ -30,8 +30,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -55,7 +55,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { 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 dbfe2dcc..cf754770 100644 --- a/src/packs/items/consumables/consumable_Major_Stride_Potion_yK6eEDUrsPbZA8G0.json +++ b/src/packs/items/consumables/consumable_Major_Stride_Potion_yK6eEDUrsPbZA8G0.json @@ -59,25 +59,24 @@ "transfer": false, "_id": "L9dAw8pws1o02XkE", "type": "base", - "system": { - "changes": [ - { - "key": "system.traits.agility.value", - "value": 1, - "priority": null, - "type": "add" - } - ], - "duration": { - "type": "shortRest" + "system": {}, + "changes": [ + { + "key": "system.traits.agility.value", + "mode": 2, + "value": "1", + "priority": null } - }, + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -87,16 +86,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!yK6eEDUrsPbZA8G0.L9dAw8pws1o02XkE" } ], 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 fe86bf95..d0f90919 100644 --- a/src/packs/items/consumables/consumable_Minor_Health_Potion_tPfKtKRRjv8qdSqy.json +++ b/src/packs/items/consumables/consumable_Minor_Health_Potion_tPfKtKRRjv8qdSqy.json @@ -30,8 +30,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -55,7 +55,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { 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 625167e1..1ef4efbf 100644 --- a/src/packs/items/consumables/consumable_Minor_Stamina_Potion_b6vGSPFWOlzZZDLO.json +++ b/src/packs/items/consumables/consumable_Minor_Stamina_Potion_b6vGSPFWOlzZZDLO.json @@ -30,8 +30,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -55,7 +55,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/items/consumables/consumable_Morphing_Clay_f1NHVSIHJJCIOaBl.json b/src/packs/items/consumables/consumable_Morphing_Clay_f1NHVSIHJJCIOaBl.json index 90dd4fdc..54aa6ccc 100644 --- a/src/packs/items/consumables/consumable_Morphing_Clay_f1NHVSIHJJCIOaBl.json +++ b/src/packs/items/consumables/consumable_Morphing_Clay_f1NHVSIHJJCIOaBl.json @@ -65,20 +65,20 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "shortRest" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

Your face is unrecognizable until your next rest.

", + "description": "

Your face is unrecognizable until your next rest.

", "tint": "#ffffff", "statuses": [], "sort": 0, @@ -86,16 +86,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!f1NHVSIHJJCIOaBl.rMno0zO5Cbwlu4zn" } ], diff --git a/src/packs/items/consumables/consumable_Ogre_Musk_qr1bosjFcUfuwq4B.json b/src/packs/items/consumables/consumable_Ogre_Musk_qr1bosjFcUfuwq4B.json index 59e51e80..39c8800b 100644 --- a/src/packs/items/consumables/consumable_Ogre_Musk_qr1bosjFcUfuwq4B.json +++ b/src/packs/items/consumables/consumable_Ogre_Musk_qr1bosjFcUfuwq4B.json @@ -65,20 +65,20 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "shortRest" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

You cannot be tracked by mundane or magical means until your next rest.

", + "description": "

You cannot be tracked by mundane or magical means until your next rest.

", "tint": "#ffffff", "statuses": [], "sort": 0, @@ -86,16 +86,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!qr1bosjFcUfuwq4B.n73d0J4oMCBIPWHN" } ], diff --git a/src/packs/items/consumables/consumable_Shrinking_Potion_HGixKenQwhyRAYNk.json b/src/packs/items/consumables/consumable_Shrinking_Potion_HGixKenQwhyRAYNk.json index a31a13f1..74e82995 100644 --- a/src/packs/items/consumables/consumable_Shrinking_Potion_HGixKenQwhyRAYNk.json +++ b/src/packs/items/consumables/consumable_Shrinking_Potion_HGixKenQwhyRAYNk.json @@ -59,31 +59,30 @@ "transfer": false, "_id": "yaRLd7eHWYm2MHRM", "type": "base", - "system": { - "changes": [ - { - "key": "system.traits.agility.value", - "value": 2, - "priority": null, - "type": "add" - }, - { - "key": "system.proficiency", - "value": -1, - "priority": null, - "type": "add" - } - ], - "duration": { - "type": "shortRest" + "system": {}, + "changes": [ + { + "key": "system.traits.agility.value", + "mode": 2, + "value": "2", + "priority": null + }, + { + "key": "system.proficiency", + "mode": 2, + "value": "-1", + "priority": null } - }, + ], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "", "tint": "#ffffff", @@ -93,16 +92,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!HGixKenQwhyRAYNk.yaRLd7eHWYm2MHRM" } ], diff --git a/src/packs/items/consumables/consumable_Sleeping_Sap_XZavUVlHEvE2srEt.json b/src/packs/items/consumables/consumable_Sleeping_Sap_XZavUVlHEvE2srEt.json index d66ff42b..a6f70305 100644 --- a/src/packs/items/consumables/consumable_Sleeping_Sap_XZavUVlHEvE2srEt.json +++ b/src/packs/items/consumables/consumable_Sleeping_Sap_XZavUVlHEvE2srEt.json @@ -30,8 +30,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -56,7 +56,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/items/consumables/consumable_Snap_Powder_cg6VtQ0eVZjDdcK0.json b/src/packs/items/consumables/consumable_Snap_Powder_cg6VtQ0eVZjDdcK0.json index 506cb1cf..dd129914 100644 --- a/src/packs/items/consumables/consumable_Snap_Powder_cg6VtQ0eVZjDdcK0.json +++ b/src/packs/items/consumables/consumable_Snap_Powder_cg6VtQ0eVZjDdcK0.json @@ -30,8 +30,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -56,7 +56,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/items/consumables/consumable_Stamina_Potion_hf3k1POoVSooJyN2.json b/src/packs/items/consumables/consumable_Stamina_Potion_hf3k1POoVSooJyN2.json index f464ee61..6a4a3335 100644 --- a/src/packs/items/consumables/consumable_Stamina_Potion_hf3k1POoVSooJyN2.json +++ b/src/packs/items/consumables/consumable_Stamina_Potion_hf3k1POoVSooJyN2.json @@ -30,8 +30,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -55,7 +55,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/items/consumables/consumable_Stardrop_y4c1jrlHrf0wBWOq.json b/src/packs/items/consumables/consumable_Stardrop_y4c1jrlHrf0wBWOq.json index 3351c24f..7b244715 100644 --- a/src/packs/items/consumables/consumable_Stardrop_y4c1jrlHrf0wBWOq.json +++ b/src/packs/items/consumables/consumable_Stardrop_y4c1jrlHrf0wBWOq.json @@ -30,8 +30,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -57,7 +57,7 @@ } } } - }, + ], "includeBase": false }, "target": { 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 cfe0a63c..82f02518 100644 --- a/src/packs/items/consumables/consumable_Sun_Tree_Sap_kwexUzdM9wm1Qums.json +++ b/src/packs/items/consumables/consumable_Sun_Tree_Sap_kwexUzdM9wm1Qums.json @@ -30,7 +30,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/items/consumables/consumable_Sweet_Moss_GrDrRqWgv7gvl9vn.json b/src/packs/items/consumables/consumable_Sweet_Moss_GrDrRqWgv7gvl9vn.json index 84663fb4..5034e482 100644 --- a/src/packs/items/consumables/consumable_Sweet_Moss_GrDrRqWgv7gvl9vn.json +++ b/src/packs/items/consumables/consumable_Sweet_Moss_GrDrRqWgv7gvl9vn.json @@ -30,8 +30,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -55,7 +55,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -105,8 +105,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -130,7 +130,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { 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 b6f18539..2fa73e49 100644 --- a/src/packs/items/consumables/consumable_Unstable_Arcane_Shard_mUepnLbkvFk0ha4Z.json +++ b/src/packs/items/consumables/consumable_Unstable_Arcane_Shard_mUepnLbkvFk0ha4Z.json @@ -30,8 +30,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -57,7 +57,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/items/consumables/consumable_Varik_Leaves_hvy5BkG3F6iOIXTx.json b/src/packs/items/consumables/consumable_Varik_Leaves_hvy5BkG3F6iOIXTx.json index 7e2f0c08..8588d8e6 100644 --- a/src/packs/items/consumables/consumable_Varik_Leaves_hvy5BkG3F6iOIXTx.json +++ b/src/packs/items/consumables/consumable_Varik_Leaves_hvy5BkG3F6iOIXTx.json @@ -30,8 +30,8 @@ "recovery": null }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -56,7 +56,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { 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 3fc572fd..31586ef8 100644 --- a/src/packs/items/consumables/consumable_Vial_of_Moondrip_VqEX5YwK5oL3r1t6.json +++ b/src/packs/items/consumables/consumable_Vial_of_Moondrip_VqEX5YwK5oL3r1t6.json @@ -65,20 +65,20 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "shortRest" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

You can see in total darkness until your next rest.

", + "description": "

You can see in total darkness until your next rest.

", "tint": "#ffffff", "statuses": [], "sort": 0, @@ -86,16 +86,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!VqEX5YwK5oL3r1t6.548KAUPcSbQLsivh" } ], diff --git a/src/packs/items/loot/loot_Bag_of_Ficklesand_v758j4FwNVAurhYK.json b/src/packs/items/loot/loot_Bag_of_Ficklesand_v758j4FwNVAurhYK.json index 2cb80d86..c083e7ca 100644 --- a/src/packs/items/loot/loot_Bag_of_Ficklesand_v758j4FwNVAurhYK.json +++ b/src/packs/items/loot/loot_Bag_of_Ficklesand_v758j4FwNVAurhYK.json @@ -21,7 +21,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/items/loot/loot_Box_of_Many_Goods_bZyT7Qw7iafswlTY.json b/src/packs/items/loot/loot_Box_of_Many_Goods_bZyT7Qw7iafswlTY.json index cb603dc7..1090323f 100644 --- a/src/packs/items/loot/loot_Box_of_Many_Goods_bZyT7Qw7iafswlTY.json +++ b/src/packs/items/loot/loot_Box_of_Many_Goods_bZyT7Qw7iafswlTY.json @@ -21,7 +21,7 @@ "recovery": "longRest" }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/items/loot/loot_Calming_Pendant_tgFFMxpuRSiRrrEB.json b/src/packs/items/loot/loot_Calming_Pendant_tgFFMxpuRSiRrrEB.json index ea5b50eb..3d5b9651 100644 --- a/src/packs/items/loot/loot_Calming_Pendant_tgFFMxpuRSiRrrEB.json +++ b/src/packs/items/loot/loot_Calming_Pendant_tgFFMxpuRSiRrrEB.json @@ -21,7 +21,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/items/loot/loot_Skeleton_Key_edkNgwy4xghZreBa.json b/src/packs/items/loot/loot_Skeleton_Key_edkNgwy4xghZreBa.json index b5769661..72a8d3e0 100644 --- a/src/packs/items/loot/loot_Skeleton_Key_edkNgwy4xghZreBa.json +++ b/src/packs/items/loot/loot_Skeleton_Key_edkNgwy4xghZreBa.json @@ -21,7 +21,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/items/loot/loot_Woven_Net_ARuv48PWUGJGBC4n.json b/src/packs/items/loot/loot_Woven_Net_ARuv48PWUGJGBC4n.json index 2732b61f..99d52ea9 100644 --- a/src/packs/items/loot/loot_Woven_Net_ARuv48PWUGJGBC4n.json +++ b/src/packs/items/loot/loot_Woven_Net_ARuv48PWUGJGBC4n.json @@ -21,7 +21,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/items/weapons/weapon_Aantari_Bow_ijodu5yNBoMxpkHV.json b/src/packs/items/weapons/weapon_Aantari_Bow_ijodu5yNBoMxpkHV.json index 7b51d436..93e6404c 100644 --- a/src/packs/items/weapons/weapon_Aantari_Bow_ijodu5yNBoMxpkHV.json +++ b/src/packs/items/weapons/weapon_Aantari_Bow_ijodu5yNBoMxpkHV.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 11, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Arcane_Frame_Wheelchair_la3sAWgnvadc4NvP.json b/src/packs/items/weapons/weapon_Advanced_Arcane_Frame_Wheelchair_la3sAWgnvadc4NvP.json index a727bcd5..36f1be3a 100644 --- a/src/packs/items/weapons/weapon_Advanced_Arcane_Frame_Wheelchair_la3sAWgnvadc4NvP.json +++ b/src/packs/items/weapons/weapon_Advanced_Arcane_Frame_Wheelchair_la3sAWgnvadc4NvP.json @@ -48,8 +48,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 6, @@ -75,7 +75,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Arcane_Gauntlets_hXR56fTKwZ6s1obs.json b/src/packs/items/weapons/weapon_Advanced_Arcane_Gauntlets_hXR56fTKwZ6s1obs.json index 67400768..183ac117 100644 --- a/src/packs/items/weapons/weapon_Advanced_Arcane_Gauntlets_hXR56fTKwZ6s1obs.json +++ b/src/packs/items/weapons/weapon_Advanced_Arcane_Gauntlets_hXR56fTKwZ6s1obs.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 9, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Battleaxe_FcbvY1ydbNVMjKvk.json b/src/packs/items/weapons/weapon_Advanced_Battleaxe_FcbvY1ydbNVMjKvk.json index e780eeed..6d2879d7 100644 --- a/src/packs/items/weapons/weapon_Advanced_Battleaxe_FcbvY1ydbNVMjKvk.json +++ b/src/packs/items/weapons/weapon_Advanced_Battleaxe_FcbvY1ydbNVMjKvk.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 9, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Broadsword_WtQAGz0TUgz8Xg70.json b/src/packs/items/weapons/weapon_Advanced_Broadsword_WtQAGz0TUgz8Xg70.json index 4581c52f..9e4a67b0 100644 --- a/src/packs/items/weapons/weapon_Advanced_Broadsword_WtQAGz0TUgz8Xg70.json +++ b/src/packs/items/weapons/weapon_Advanced_Broadsword_WtQAGz0TUgz8Xg70.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 6, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Crossbow_3HGs0AgVrdIBTaKG.json b/src/packs/items/weapons/weapon_Advanced_Crossbow_3HGs0AgVrdIBTaKG.json index 437423f5..44e47499 100644 --- a/src/packs/items/weapons/weapon_Advanced_Crossbow_3HGs0AgVrdIBTaKG.json +++ b/src/packs/items/weapons/weapon_Advanced_Crossbow_3HGs0AgVrdIBTaKG.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 7, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Cutlass_bw9WO9lxkM9bWZxQ.json b/src/packs/items/weapons/weapon_Advanced_Cutlass_bw9WO9lxkM9bWZxQ.json index 45d9a597..a20acb5b 100644 --- a/src/packs/items/weapons/weapon_Advanced_Cutlass_bw9WO9lxkM9bWZxQ.json +++ b/src/packs/items/weapons/weapon_Advanced_Cutlass_bw9WO9lxkM9bWZxQ.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 7, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Dagger_mrioysDjNQEIE8hN.json b/src/packs/items/weapons/weapon_Advanced_Dagger_mrioysDjNQEIE8hN.json index 03f27c99..a7004807 100644 --- a/src/packs/items/weapons/weapon_Advanced_Dagger_mrioysDjNQEIE8hN.json +++ b/src/packs/items/weapons/weapon_Advanced_Dagger_mrioysDjNQEIE8hN.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 7, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Dualstaff_X5x3sC7v2f3L9sjL.json b/src/packs/items/weapons/weapon_Advanced_Dualstaff_X5x3sC7v2f3L9sjL.json index 033b873c..3baed3d4 100644 --- a/src/packs/items/weapons/weapon_Advanced_Dualstaff_X5x3sC7v2f3L9sjL.json +++ b/src/packs/items/weapons/weapon_Advanced_Dualstaff_X5x3sC7v2f3L9sjL.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 9, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Glowing_Rings_InQoh8mZPnwarQkX.json b/src/packs/items/weapons/weapon_Advanced_Glowing_Rings_InQoh8mZPnwarQkX.json index 2ea7b20d..2bdfed49 100644 --- a/src/packs/items/weapons/weapon_Advanced_Glowing_Rings_InQoh8mZPnwarQkX.json +++ b/src/packs/items/weapons/weapon_Advanced_Glowing_Rings_InQoh8mZPnwarQkX.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 8, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Grappler_7vvhVl4TDJHtjpFK.json b/src/packs/items/weapons/weapon_Advanced_Grappler_7vvhVl4TDJHtjpFK.json index 390a0b9a..01bef9b2 100644 --- a/src/packs/items/weapons/weapon_Advanced_Grappler_7vvhVl4TDJHtjpFK.json +++ b/src/packs/items/weapons/weapon_Advanced_Grappler_7vvhVl4TDJHtjpFK.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 4, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Greatstaff_4UzxqfkwF8gDSdu7.json b/src/packs/items/weapons/weapon_Advanced_Greatstaff_4UzxqfkwF8gDSdu7.json index 3cc7b986..c66354c2 100644 --- a/src/packs/items/weapons/weapon_Advanced_Greatstaff_4UzxqfkwF8gDSdu7.json +++ b/src/packs/items/weapons/weapon_Advanced_Greatstaff_4UzxqfkwF8gDSdu7.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 6, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Greatsword_MAC6YWTo4lzSotQc.json b/src/packs/items/weapons/weapon_Advanced_Greatsword_MAC6YWTo4lzSotQc.json index 9e04bf7a..71226630 100644 --- a/src/packs/items/weapons/weapon_Advanced_Greatsword_MAC6YWTo4lzSotQc.json +++ b/src/packs/items/weapons/weapon_Advanced_Greatsword_MAC6YWTo4lzSotQc.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 9, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Halberd_C8gQn7onAc9wsrCs.json b/src/packs/items/weapons/weapon_Advanced_Halberd_C8gQn7onAc9wsrCs.json index 6c11724c..59d7437d 100644 --- a/src/packs/items/weapons/weapon_Advanced_Halberd_C8gQn7onAc9wsrCs.json +++ b/src/packs/items/weapons/weapon_Advanced_Halberd_C8gQn7onAc9wsrCs.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 8, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Hallowed_Axe_BiyXKX2Mo1TQbKgk.json b/src/packs/items/weapons/weapon_Advanced_Hallowed_Axe_BiyXKX2Mo1TQbKgk.json index ce89ccc2..e6403810 100644 --- a/src/packs/items/weapons/weapon_Advanced_Hallowed_Axe_BiyXKX2Mo1TQbKgk.json +++ b/src/packs/items/weapons/weapon_Advanced_Hallowed_Axe_BiyXKX2Mo1TQbKgk.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 7, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Hand_Crossbow_Lsvocst8aGqkBj7g.json b/src/packs/items/weapons/weapon_Advanced_Hand_Crossbow_Lsvocst8aGqkBj7g.json index 88ba7077..521ee38d 100644 --- a/src/packs/items/weapons/weapon_Advanced_Hand_Crossbow_Lsvocst8aGqkBj7g.json +++ b/src/packs/items/weapons/weapon_Advanced_Hand_Crossbow_Lsvocst8aGqkBj7g.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 5, @@ -70,7 +70,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Hand_Runes_PQACczSghZIVTdgZ.json b/src/packs/items/weapons/weapon_Advanced_Hand_Runes_PQACczSghZIVTdgZ.json index 60ffb789..23f33ba1 100644 --- a/src/packs/items/weapons/weapon_Advanced_Hand_Runes_PQACczSghZIVTdgZ.json +++ b/src/packs/items/weapons/weapon_Advanced_Hand_Runes_PQACczSghZIVTdgZ.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 6, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Heavy_Frame_Wheelchair_eT2Qwb0RdrLX2hH1.json b/src/packs/items/weapons/weapon_Advanced_Heavy_Frame_Wheelchair_eT2Qwb0RdrLX2hH1.json index 7f5bb9c7..39afe3e6 100644 --- a/src/packs/items/weapons/weapon_Advanced_Heavy_Frame_Wheelchair_eT2Qwb0RdrLX2hH1.json +++ b/src/packs/items/weapons/weapon_Advanced_Heavy_Frame_Wheelchair_eT2Qwb0RdrLX2hH1.json @@ -48,8 +48,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d12", "bonus": 9, @@ -75,7 +75,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", 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 fca77911..4600088d 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 @@ -77,8 +77,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 6, @@ -104,7 +104,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Longbow_M5CywMAyPKGgebsJ.json b/src/packs/items/weapons/weapon_Advanced_Longbow_M5CywMAyPKGgebsJ.json index 14327a8c..ad8a5bc9 100644 --- a/src/packs/items/weapons/weapon_Advanced_Longbow_M5CywMAyPKGgebsJ.json +++ b/src/packs/items/weapons/weapon_Advanced_Longbow_M5CywMAyPKGgebsJ.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 9, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Longsword_9xkB3MWXahrsVP4N.json b/src/packs/items/weapons/weapon_Advanced_Longsword_9xkB3MWXahrsVP4N.json index 0b51f2ae..2cf2c43c 100644 --- a/src/packs/items/weapons/weapon_Advanced_Longsword_9xkB3MWXahrsVP4N.json +++ b/src/packs/items/weapons/weapon_Advanced_Longsword_9xkB3MWXahrsVP4N.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 9, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Mace_WreMYiH5uhVDaoVw.json b/src/packs/items/weapons/weapon_Advanced_Mace_WreMYiH5uhVDaoVw.json index e255da65..db8cde18 100644 --- a/src/packs/items/weapons/weapon_Advanced_Mace_WreMYiH5uhVDaoVw.json +++ b/src/packs/items/weapons/weapon_Advanced_Mace_WreMYiH5uhVDaoVw.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 7, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Quarterstaff_zJtm2f9ZFKZRtCRg.json b/src/packs/items/weapons/weapon_Advanced_Quarterstaff_zJtm2f9ZFKZRtCRg.json index 00f0b694..d6beafb2 100644 --- a/src/packs/items/weapons/weapon_Advanced_Quarterstaff_zJtm2f9ZFKZRtCRg.json +++ b/src/packs/items/weapons/weapon_Advanced_Quarterstaff_zJtm2f9ZFKZRtCRg.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 9, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Rapier_KxFne76d7cak15dO.json b/src/packs/items/weapons/weapon_Advanced_Rapier_KxFne76d7cak15dO.json index 28c508b8..315d8401 100644 --- a/src/packs/items/weapons/weapon_Advanced_Rapier_KxFne76d7cak15dO.json +++ b/src/packs/items/weapons/weapon_Advanced_Rapier_KxFne76d7cak15dO.json @@ -78,8 +78,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 6, @@ -105,7 +105,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Returning_Blade_sIGXA4KMeYBUjcEO.json b/src/packs/items/weapons/weapon_Advanced_Returning_Blade_sIGXA4KMeYBUjcEO.json index 0694a020..bbdce2d4 100644 --- a/src/packs/items/weapons/weapon_Advanced_Returning_Blade_sIGXA4KMeYBUjcEO.json +++ b/src/packs/items/weapons/weapon_Advanced_Returning_Blade_sIGXA4KMeYBUjcEO.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 6, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Round_Shield_hiEOGF2reabGLUoi.json b/src/packs/items/weapons/weapon_Advanced_Round_Shield_hiEOGF2reabGLUoi.json index 54800642..c1c4fba5 100644 --- a/src/packs/items/weapons/weapon_Advanced_Round_Shield_hiEOGF2reabGLUoi.json +++ b/src/packs/items/weapons/weapon_Advanced_Round_Shield_hiEOGF2reabGLUoi.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d4", "bonus": 4, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", @@ -113,26 +113,26 @@ "name": "Protective", "description": "

Add the item's Tier to your Armor Score

", "img": "icons/skills/melee/shield-block-gray-orange.webp", - "_id": "7285CRGdZfHCEtT2", + "changes": [ + { + "key": "system.armorScore", + "mode": 2, + "value": "ITEM.@system.tier", + "priority": null + } + ], + "_id": "i5HfkF5aKQuUCTEG", "type": "base", - "system": { - "changes": [ - { - "type": "armor", - "phase": "initial", - "priority": 20, - "value": { - "max": "ITEM.@system.tier" - } - } - ] - }, + "system": {}, "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "origin": null, "tint": "#ffffff", @@ -143,10 +143,7 @@ "_stats": { "compendiumSource": null }, - "start": null, - "showIcon": 1, - "folder": null, - "_key": "!items.effects!hiEOGF2reabGLUoi.7285CRGdZfHCEtT2" + "_key": "!items.effects!hiEOGF2reabGLUoi.i5HfkF5aKQuUCTEG" } ], "sort": 0, diff --git a/src/packs/items/weapons/weapon_Advanced_Scepter_2Khzuj768yoWN9QK.json b/src/packs/items/weapons/weapon_Advanced_Scepter_2Khzuj768yoWN9QK.json index 6dff775a..cf619a89 100644 --- a/src/packs/items/weapons/weapon_Advanced_Scepter_2Khzuj768yoWN9QK.json +++ b/src/packs/items/weapons/weapon_Advanced_Scepter_2Khzuj768yoWN9QK.json @@ -11,8 +11,8 @@ "type": "attack", "damage": { "includeBase": false, - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -38,7 +38,7 @@ } } } - } + ] }, "range": "melee", "roll": { @@ -115,8 +115,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 6, @@ -142,7 +142,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Shortbow_JpSlJvDR0X8VFDns.json b/src/packs/items/weapons/weapon_Advanced_Shortbow_JpSlJvDR0X8VFDns.json index f5efc9a9..5693e814 100644 --- a/src/packs/items/weapons/weapon_Advanced_Shortbow_JpSlJvDR0X8VFDns.json +++ b/src/packs/items/weapons/weapon_Advanced_Shortbow_JpSlJvDR0X8VFDns.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 9, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Shortstaff_T5exRCqOXhrjSYnI.json b/src/packs/items/weapons/weapon_Advanced_Shortstaff_T5exRCqOXhrjSYnI.json index 0e3b3161..71d66d82 100644 --- a/src/packs/items/weapons/weapon_Advanced_Shortstaff_T5exRCqOXhrjSYnI.json +++ b/src/packs/items/weapons/weapon_Advanced_Shortstaff_T5exRCqOXhrjSYnI.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 7, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Shortsword_p3nz5CaGUoyuGVg0.json b/src/packs/items/weapons/weapon_Advanced_Shortsword_p3nz5CaGUoyuGVg0.json index dd48db21..397fa061 100644 --- a/src/packs/items/weapons/weapon_Advanced_Shortsword_p3nz5CaGUoyuGVg0.json +++ b/src/packs/items/weapons/weapon_Advanced_Shortsword_p3nz5CaGUoyuGVg0.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 4, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Small_Dagger_0thN0BpN05KT8Avx.json b/src/packs/items/weapons/weapon_Advanced_Small_Dagger_0thN0BpN05KT8Avx.json index a63789f3..7af59440 100644 --- a/src/packs/items/weapons/weapon_Advanced_Small_Dagger_0thN0BpN05KT8Avx.json +++ b/src/packs/items/weapons/weapon_Advanced_Small_Dagger_0thN0BpN05KT8Avx.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 4, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Spear_pK6dsNABKKp1CIGN.json b/src/packs/items/weapons/weapon_Advanced_Spear_pK6dsNABKKp1CIGN.json index 099761b4..e5f3f8ec 100644 --- a/src/packs/items/weapons/weapon_Advanced_Spear_pK6dsNABKKp1CIGN.json +++ b/src/packs/items/weapons/weapon_Advanced_Spear_pK6dsNABKKp1CIGN.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 9, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Tower_Shield_OfOzQbs4hg6QbfTG.json b/src/packs/items/weapons/weapon_Advanced_Tower_Shield_OfOzQbs4hg6QbfTG.json index a88749a8..b2fb16d8 100644 --- a/src/packs/items/weapons/weapon_Advanced_Tower_Shield_OfOzQbs4hg6QbfTG.json +++ b/src/packs/items/weapons/weapon_Advanced_Tower_Shield_OfOzQbs4hg6QbfTG.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 4, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", @@ -113,25 +113,25 @@ "name": "Barrier", "description": "Gain Weapon Tier + 1 to Armor Score; -1 to Evasion", "img": "icons/skills/melee/shield-block-bash-blue.webp", + "changes": [ + { + "key": "system.armorScore", + "mode": 2, + "value": "ITEM.@system.tier + 1" + }, + { + "key": "system.evasion", + "mode": 2, + "value": "-1" + } + ], "_id": "87gedjJZGdFY81Mt", "type": "base", - "system": { - "changes": [ - { - "key": "system.evasion", - "type": "add", - "value": -1, - "phase": "initial", - "priority": 0 - } - ] - }, + "system": {}, "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null }, "origin": null, "tint": "#ffffff", @@ -142,49 +142,7 @@ "_stats": { "compendiumSource": null }, - "start": null, - "showIcon": 1, - "folder": null, "_key": "!items.effects!OfOzQbs4hg6QbfTG.87gedjJZGdFY81Mt" - }, - { - "name": "Barrier", - "description": "Gain Weapon Tier + 1 to Armor Score; -1 to Evasion", - "img": "icons/skills/melee/shield-block-bash-blue.webp", - "_id": "J0f7zqqOr61ADpdy", - "type": "base", - "system": { - "changes": [ - { - "type": "armor", - "phase": "initial", - "priority": 20, - "value": { - "max": "ITEM.@system.tier + 1" - } - } - ] - }, - "disabled": false, - "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false - }, - "origin": null, - "tint": "#ffffff", - "transfer": true, - "statuses": [], - "sort": 0, - "flags": {}, - "_stats": { - "compendiumSource": null - }, - "start": null, - "showIcon": 1, - "folder": null, - "_key": "!items.effects!OfOzQbs4hg6QbfTG.J0f7zqqOr61ADpdy" } ], "sort": 0, diff --git a/src/packs/items/weapons/weapon_Advanced_Wand_jU9jWIardjtdAQcs.json b/src/packs/items/weapons/weapon_Advanced_Wand_jU9jWIardjtdAQcs.json index 8043e360..4cb4e2b2 100644 --- a/src/packs/items/weapons/weapon_Advanced_Wand_jU9jWIardjtdAQcs.json +++ b/src/packs/items/weapons/weapon_Advanced_Wand_jU9jWIardjtdAQcs.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 7, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Warhammer_8Lipw3RRKDgBVP0p.json b/src/packs/items/weapons/weapon_Advanced_Warhammer_8Lipw3RRKDgBVP0p.json index bb142281..72983f6b 100644 --- a/src/packs/items/weapons/weapon_Advanced_Warhammer_8Lipw3RRKDgBVP0p.json +++ b/src/packs/items/weapons/weapon_Advanced_Warhammer_8Lipw3RRKDgBVP0p.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d12", "bonus": 9, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Advanced_Whip_01izMUSJcAUo79IX.json b/src/packs/items/weapons/weapon_Advanced_Whip_01izMUSJcAUo79IX.json index 142eb542..6e1753c8 100644 --- a/src/packs/items/weapons/weapon_Advanced_Whip_01izMUSJcAUo79IX.json +++ b/src/packs/items/weapons/weapon_Advanced_Whip_01izMUSJcAUo79IX.json @@ -78,8 +78,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 4, @@ -105,7 +105,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Arcane_Frame_Wheelchair_XRChepscgr75Uug7.json b/src/packs/items/weapons/weapon_Arcane_Frame_Wheelchair_XRChepscgr75Uug7.json index 6959fb30..58ef5f4b 100644 --- a/src/packs/items/weapons/weapon_Arcane_Frame_Wheelchair_XRChepscgr75Uug7.json +++ b/src/packs/items/weapons/weapon_Arcane_Frame_Wheelchair_XRChepscgr75Uug7.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": null, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Arcane_Gauntlets_PC5EyEIq7NWBV0n5.json b/src/packs/items/weapons/weapon_Arcane_Gauntlets_PC5EyEIq7NWBV0n5.json index 29afcc13..8d9e3c31 100644 --- a/src/packs/items/weapons/weapon_Arcane_Gauntlets_PC5EyEIq7NWBV0n5.json +++ b/src/packs/items/weapons/weapon_Arcane_Gauntlets_PC5EyEIq7NWBV0n5.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 3, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", 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 8e4b00c5..6ce0ce68 100644 --- a/src/packs/items/weapons/weapon_Axe_of_Fortunis_YcS1rHgfnSlla8Xf.json +++ b/src/packs/items/weapons/weapon_Axe_of_Fortunis_YcS1rHgfnSlla8Xf.json @@ -78,8 +78,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 8, @@ -105,7 +105,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Battleaxe_fbDYUja3ll9vCtrB.json b/src/packs/items/weapons/weapon_Battleaxe_fbDYUja3ll9vCtrB.json index 9ab3321e..9b43f8dc 100644 --- a/src/packs/items/weapons/weapon_Battleaxe_fbDYUja3ll9vCtrB.json +++ b/src/packs/items/weapons/weapon_Battleaxe_fbDYUja3ll9vCtrB.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 3, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Black_Powder_Revolver_AokqTusPzn0hghkE.json b/src/packs/items/weapons/weapon_Black_Powder_Revolver_AokqTusPzn0hghkE.json index 34371c2b..845fee44 100644 --- a/src/packs/items/weapons/weapon_Black_Powder_Revolver_AokqTusPzn0hghkE.json +++ b/src/packs/items/weapons/weapon_Black_Powder_Revolver_AokqTusPzn0hghkE.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 8, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Bladed_Whip_5faflfNz20cFW1EM.json b/src/packs/items/weapons/weapon_Bladed_Whip_5faflfNz20cFW1EM.json index 2b2a5b9c..5238578f 100644 --- a/src/packs/items/weapons/weapon_Bladed_Whip_5faflfNz20cFW1EM.json +++ b/src/packs/items/weapons/weapon_Bladed_Whip_5faflfNz20cFW1EM.json @@ -78,8 +78,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 3, @@ -105,7 +105,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Blessed_Anlace_n1oPTk5czTIGTkVj.json b/src/packs/items/weapons/weapon_Blessed_Anlace_n1oPTk5czTIGTkVj.json index 14448edc..82140411 100644 --- a/src/packs/items/weapons/weapon_Blessed_Anlace_n1oPTk5czTIGTkVj.json +++ b/src/packs/items/weapons/weapon_Blessed_Anlace_n1oPTk5czTIGTkVj.json @@ -19,8 +19,8 @@ "amount": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "applyTo": "hitPoints", "value": { "custom": { @@ -45,7 +45,7 @@ "base": false, "type": [] } - }, + ], "includeBase": false }, "_id": "o18UvqLPWLe1A8XJ", @@ -117,8 +117,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 6, @@ -144,7 +144,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Bloodstaff_IoMVDz92WVvfGGdc.json b/src/packs/items/weapons/weapon_Bloodstaff_IoMVDz92WVvfGGdc.json index ab6bb15d..2450d69c 100644 --- a/src/packs/items/weapons/weapon_Bloodstaff_IoMVDz92WVvfGGdc.json +++ b/src/packs/items/weapons/weapon_Bloodstaff_IoMVDz92WVvfGGdc.json @@ -78,8 +78,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d20", "bonus": 7, @@ -105,7 +105,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Blunderbuss_SLFrK0WmldPo0shz.json b/src/packs/items/weapons/weapon_Blunderbuss_SLFrK0WmldPo0shz.json index 9b2f455a..1fba6130 100644 --- a/src/packs/items/weapons/weapon_Blunderbuss_SLFrK0WmldPo0shz.json +++ b/src/packs/items/weapons/weapon_Blunderbuss_SLFrK0WmldPo0shz.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 6, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Braveshield_QEvgVoz9xKBSKsGi.json b/src/packs/items/weapons/weapon_Braveshield_QEvgVoz9xKBSKsGi.json index 2f5ec85d..aef812a6 100644 --- a/src/packs/items/weapons/weapon_Braveshield_QEvgVoz9xKBSKsGi.json +++ b/src/packs/items/weapons/weapon_Braveshield_QEvgVoz9xKBSKsGi.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d4", "bonus": 6, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Bravesword_QZrWAkprA2tL2MOI.json b/src/packs/items/weapons/weapon_Bravesword_QZrWAkprA2tL2MOI.json index 412a7083..7c3e65f5 100644 --- a/src/packs/items/weapons/weapon_Bravesword_QZrWAkprA2tL2MOI.json +++ b/src/packs/items/weapons/weapon_Bravesword_QZrWAkprA2tL2MOI.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 7, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Broadsword_1cwWNt4sqlgA8gCT.json b/src/packs/items/weapons/weapon_Broadsword_1cwWNt4sqlgA8gCT.json index 87c6f7e8..0e9a557e 100644 --- a/src/packs/items/weapons/weapon_Broadsword_1cwWNt4sqlgA8gCT.json +++ b/src/packs/items/weapons/weapon_Broadsword_1cwWNt4sqlgA8gCT.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "type": [ "physical" ], @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Buckler_EmFTp9wzT6MHSaNz.json b/src/packs/items/weapons/weapon_Buckler_EmFTp9wzT6MHSaNz.json index be147888..4d815a6c 100644 --- a/src/packs/items/weapons/weapon_Buckler_EmFTp9wzT6MHSaNz.json +++ b/src/packs/items/weapons/weapon_Buckler_EmFTp9wzT6MHSaNz.json @@ -87,8 +87,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d4", "bonus": 4, @@ -114,7 +114,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Casting_Sword_2Fbf2cxLfbdGkU4I.json b/src/packs/items/weapons/weapon_Casting_Sword_2Fbf2cxLfbdGkU4I.json index c861e735..9af34d45 100644 --- a/src/packs/items/weapons/weapon_Casting_Sword_2Fbf2cxLfbdGkU4I.json +++ b/src/packs/items/weapons/weapon_Casting_Sword_2Fbf2cxLfbdGkU4I.json @@ -11,8 +11,8 @@ "type": "attack", "damage": { "includeBase": false, - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -36,7 +36,7 @@ } } } - } + ] }, "range": "far", "roll": { @@ -113,8 +113,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 4, @@ -140,7 +140,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Crossbow_cw7HG1Z7hp7OOLD0.json b/src/packs/items/weapons/weapon_Crossbow_cw7HG1Z7hp7OOLD0.json index 62ad7f3d..749ef4aa 100644 --- a/src/packs/items/weapons/weapon_Crossbow_cw7HG1Z7hp7OOLD0.json +++ b/src/packs/items/weapons/weapon_Crossbow_cw7HG1Z7hp7OOLD0.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 1, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Curved_Dagger_Fk69R40svV0kanZD.json b/src/packs/items/weapons/weapon_Curved_Dagger_Fk69R40svV0kanZD.json index 1af2c372..a98a56b1 100644 --- a/src/packs/items/weapons/weapon_Curved_Dagger_Fk69R40svV0kanZD.json +++ b/src/packs/items/weapons/weapon_Curved_Dagger_Fk69R40svV0kanZD.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 9, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Cutlass_CWrbnethuILXrEpA.json b/src/packs/items/weapons/weapon_Cutlass_CWrbnethuILXrEpA.json index 4750891f..7343b92c 100644 --- a/src/packs/items/weapons/weapon_Cutlass_CWrbnethuILXrEpA.json +++ b/src/packs/items/weapons/weapon_Cutlass_CWrbnethuILXrEpA.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 1, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Dagger_iStO0BbeMTTR0rQi.json b/src/packs/items/weapons/weapon_Dagger_iStO0BbeMTTR0rQi.json index 4818c79f..5ef12e05 100644 --- a/src/packs/items/weapons/weapon_Dagger_iStO0BbeMTTR0rQi.json +++ b/src/packs/items/weapons/weapon_Dagger_iStO0BbeMTTR0rQi.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 1, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Devouring_Dagger_C5wSGglR8e0euQnY.json b/src/packs/items/weapons/weapon_Devouring_Dagger_C5wSGglR8e0euQnY.json index 7775501d..e00d665c 100644 --- a/src/packs/items/weapons/weapon_Devouring_Dagger_C5wSGglR8e0euQnY.json +++ b/src/packs/items/weapons/weapon_Devouring_Dagger_C5wSGglR8e0euQnY.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 4, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Double_Flail_xm1yU7k58fMgXxRR.json b/src/packs/items/weapons/weapon_Double_Flail_xm1yU7k58fMgXxRR.json index e5b603c6..a118b399 100644 --- a/src/packs/items/weapons/weapon_Double_Flail_xm1yU7k58fMgXxRR.json +++ b/src/packs/items/weapons/weapon_Double_Flail_xm1yU7k58fMgXxRR.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 8, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", 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 df1c3e54..da15604c 100644 --- a/src/packs/items/weapons/weapon_Dual_Ended_Sword_nXjuBa215H1sTUK3.json +++ b/src/packs/items/weapons/weapon_Dual_Ended_Sword_nXjuBa215H1sTUK3.json @@ -78,8 +78,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 9, @@ -105,7 +105,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Dualstaff_j8cdNeIUYxxzFVji.json b/src/packs/items/weapons/weapon_Dualstaff_j8cdNeIUYxxzFVji.json index a3b44d76..e7c458c3 100644 --- a/src/packs/items/weapons/weapon_Dualstaff_j8cdNeIUYxxzFVji.json +++ b/src/packs/items/weapons/weapon_Dualstaff_j8cdNeIUYxxzFVji.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 3, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Ego_Blade_G7rH31KQ5eEZXcv0.json b/src/packs/items/weapons/weapon_Ego_Blade_G7rH31KQ5eEZXcv0.json index 17e24aea..36d3b0ba 100644 --- a/src/packs/items/weapons/weapon_Ego_Blade_G7rH31KQ5eEZXcv0.json +++ b/src/packs/items/weapons/weapon_Ego_Blade_G7rH31KQ5eEZXcv0.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d12", "bonus": 4, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Elder_Bow_JdWcn9W1edhAEInL.json b/src/packs/items/weapons/weapon_Elder_Bow_JdWcn9W1edhAEInL.json index 73bb5a46..35659402 100644 --- a/src/packs/items/weapons/weapon_Elder_Bow_JdWcn9W1edhAEInL.json +++ b/src/packs/items/weapons/weapon_Elder_Bow_JdWcn9W1edhAEInL.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 4, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Extended_Polearm_fJHKMxZokVP34MCi.json b/src/packs/items/weapons/weapon_Extended_Polearm_fJHKMxZokVP34MCi.json index 35829bd5..62bcb3e0 100644 --- a/src/packs/items/weapons/weapon_Extended_Polearm_fJHKMxZokVP34MCi.json +++ b/src/packs/items/weapons/weapon_Extended_Polearm_fJHKMxZokVP34MCi.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 10, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Finehair_Bow_ykF3jouxHZ6YR8Bg.json b/src/packs/items/weapons/weapon_Finehair_Bow_ykF3jouxHZ6YR8Bg.json index d1bd58b5..6dc27659 100644 --- a/src/packs/items/weapons/weapon_Finehair_Bow_ykF3jouxHZ6YR8Bg.json +++ b/src/packs/items/weapons/weapon_Finehair_Bow_ykF3jouxHZ6YR8Bg.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 5, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Firestaff_BtCm2RhWEfs00g38.json b/src/packs/items/weapons/weapon_Firestaff_BtCm2RhWEfs00g38.json index ba7350f4..983f98d1 100644 --- a/src/packs/items/weapons/weapon_Firestaff_BtCm2RhWEfs00g38.json +++ b/src/packs/items/weapons/weapon_Firestaff_BtCm2RhWEfs00g38.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 7, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Flickerfly_Blade_xLJ5RRpUoTRmAC3G.json b/src/packs/items/weapons/weapon_Flickerfly_Blade_xLJ5RRpUoTRmAC3G.json index acf0cfd6..5dd5f04e 100644 --- a/src/packs/items/weapons/weapon_Flickerfly_Blade_xLJ5RRpUoTRmAC3G.json +++ b/src/packs/items/weapons/weapon_Flickerfly_Blade_xLJ5RRpUoTRmAC3G.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 5, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Floating_Bladeshards_3vti3xfo0wJND7ew.json b/src/packs/items/weapons/weapon_Floating_Bladeshards_3vti3xfo0wJND7ew.json index 0460e12d..232f26e9 100644 --- a/src/packs/items/weapons/weapon_Floating_Bladeshards_3vti3xfo0wJND7ew.json +++ b/src/packs/items/weapons/weapon_Floating_Bladeshards_3vti3xfo0wJND7ew.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 9, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Fusion_Gloves_uK1RhtYAsDeoPNGx.json b/src/packs/items/weapons/weapon_Fusion_Gloves_uK1RhtYAsDeoPNGx.json index 034ad5cf..747bc046 100644 --- a/src/packs/items/weapons/weapon_Fusion_Gloves_uK1RhtYAsDeoPNGx.json +++ b/src/packs/items/weapons/weapon_Fusion_Gloves_uK1RhtYAsDeoPNGx.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 9, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Ghostblade_6gFvOFTE97QZ74Zr.json b/src/packs/items/weapons/weapon_Ghostblade_6gFvOFTE97QZ74Zr.json index 0e17e0c2..7784b43d 100644 --- a/src/packs/items/weapons/weapon_Ghostblade_6gFvOFTE97QZ74Zr.json +++ b/src/packs/items/weapons/weapon_Ghostblade_6gFvOFTE97QZ74Zr.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 7, @@ -69,7 +69,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Gilded_Bow_ctTgFfMbM3YtmsYU.json b/src/packs/items/weapons/weapon_Gilded_Bow_ctTgFfMbM3YtmsYU.json index 0147cfdb..88f5a163 100644 --- a/src/packs/items/weapons/weapon_Gilded_Bow_ctTgFfMbM3YtmsYU.json +++ b/src/packs/items/weapons/weapon_Gilded_Bow_ctTgFfMbM3YtmsYU.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 7, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Gilded_Falchion_VwcOgqnzjf9LBj2S.json b/src/packs/items/weapons/weapon_Gilded_Falchion_VwcOgqnzjf9LBj2S.json index fdf5835e..ee8afebc 100644 --- a/src/packs/items/weapons/weapon_Gilded_Falchion_VwcOgqnzjf9LBj2S.json +++ b/src/packs/items/weapons/weapon_Gilded_Falchion_VwcOgqnzjf9LBj2S.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 4, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Glowing_Rings_wG9f5NpCwSbaLy8t.json b/src/packs/items/weapons/weapon_Glowing_Rings_wG9f5NpCwSbaLy8t.json index 8996dbc8..214d08a9 100644 --- a/src/packs/items/weapons/weapon_Glowing_Rings_wG9f5NpCwSbaLy8t.json +++ b/src/packs/items/weapons/weapon_Glowing_Rings_wG9f5NpCwSbaLy8t.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 1, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Grappler_iEzPscUc18GuFoB6.json b/src/packs/items/weapons/weapon_Grappler_iEzPscUc18GuFoB6.json index 9a9158c7..7f42998b 100644 --- a/src/packs/items/weapons/weapon_Grappler_iEzPscUc18GuFoB6.json +++ b/src/packs/items/weapons/weapon_Grappler_iEzPscUc18GuFoB6.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": null, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Greatbow_MXBpbqQsZFln4rZk.json b/src/packs/items/weapons/weapon_Greatbow_MXBpbqQsZFln4rZk.json index 87118bb8..f56e77c7 100644 --- a/src/packs/items/weapons/weapon_Greatbow_MXBpbqQsZFln4rZk.json +++ b/src/packs/items/weapons/weapon_Greatbow_MXBpbqQsZFln4rZk.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 6, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Greatstaff_Yk8pTEmyLLi4095S.json b/src/packs/items/weapons/weapon_Greatstaff_Yk8pTEmyLLi4095S.json index 798541d1..66c12e5e 100644 --- a/src/packs/items/weapons/weapon_Greatstaff_Yk8pTEmyLLi4095S.json +++ b/src/packs/items/weapons/weapon_Greatstaff_Yk8pTEmyLLi4095S.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": null, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Greatsword_70ysaFJDREwTgvZa.json b/src/packs/items/weapons/weapon_Greatsword_70ysaFJDREwTgvZa.json index f0e450a4..f60e438d 100644 --- a/src/packs/items/weapons/weapon_Greatsword_70ysaFJDREwTgvZa.json +++ b/src/packs/items/weapons/weapon_Greatsword_70ysaFJDREwTgvZa.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 3, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Halberd_qT7FfmauAumOjJoq.json b/src/packs/items/weapons/weapon_Halberd_qT7FfmauAumOjJoq.json index 5a990da3..6259e63e 100644 --- a/src/packs/items/weapons/weapon_Halberd_qT7FfmauAumOjJoq.json +++ b/src/packs/items/weapons/weapon_Halberd_qT7FfmauAumOjJoq.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 2, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Hallowed_Axe_Vayg7CnRTFBrunjM.json b/src/packs/items/weapons/weapon_Hallowed_Axe_Vayg7CnRTFBrunjM.json index 1fe37eba..9d8885b9 100644 --- a/src/packs/items/weapons/weapon_Hallowed_Axe_Vayg7CnRTFBrunjM.json +++ b/src/packs/items/weapons/weapon_Hallowed_Axe_Vayg7CnRTFBrunjM.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 1, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Hammer_of_Exota_0lAkBEUvbM9Osmqb.json b/src/packs/items/weapons/weapon_Hammer_of_Exota_0lAkBEUvbM9Osmqb.json index 15e00303..ba955850 100644 --- a/src/packs/items/weapons/weapon_Hammer_of_Exota_0lAkBEUvbM9Osmqb.json +++ b/src/packs/items/weapons/weapon_Hammer_of_Exota_0lAkBEUvbM9Osmqb.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 6, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", 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 fdab6f80..122c0769 100644 --- a/src/packs/items/weapons/weapon_Hammer_of_Wrath_1R4uzOpWD8bkYRUm.json +++ b/src/packs/items/weapons/weapon_Hammer_of_Wrath_1R4uzOpWD8bkYRUm.json @@ -78,8 +78,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 7, @@ -105,7 +105,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Hand_Cannon_MyGz8nd5sieRQ7zl.json b/src/packs/items/weapons/weapon_Hand_Cannon_MyGz8nd5sieRQ7zl.json index 4967c6e4..1396fb1d 100644 --- a/src/packs/items/weapons/weapon_Hand_Cannon_MyGz8nd5sieRQ7zl.json +++ b/src/packs/items/weapons/weapon_Hand_Cannon_MyGz8nd5sieRQ7zl.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 12, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Hand_Crossbow_zxKt6qXe7uZB6ljm.json b/src/packs/items/weapons/weapon_Hand_Crossbow_zxKt6qXe7uZB6ljm.json index 6501f5d4..9f69ffc9 100644 --- a/src/packs/items/weapons/weapon_Hand_Crossbow_zxKt6qXe7uZB6ljm.json +++ b/src/packs/items/weapons/weapon_Hand_Crossbow_zxKt6qXe7uZB6ljm.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 1, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Hand_Runes_3whiedn0jBMNRdIb.json b/src/packs/items/weapons/weapon_Hand_Runes_3whiedn0jBMNRdIb.json index 00cb6e9b..32761768 100644 --- a/src/packs/items/weapons/weapon_Hand_Runes_3whiedn0jBMNRdIb.json +++ b/src/packs/items/weapons/weapon_Hand_Runes_3whiedn0jBMNRdIb.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": null, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Hand_Sling_RAIaoMi6iO1PKIlK.json b/src/packs/items/weapons/weapon_Hand_Sling_RAIaoMi6iO1PKIlK.json index 5c110b70..82641ca1 100644 --- a/src/packs/items/weapons/weapon_Hand_Sling_RAIaoMi6iO1PKIlK.json +++ b/src/packs/items/weapons/weapon_Hand_Sling_RAIaoMi6iO1PKIlK.json @@ -11,8 +11,8 @@ "type": "attack", "damage": { "includeBase": false, - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -36,7 +36,7 @@ } } } - } + ] }, "range": "close", "roll": { @@ -113,8 +113,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 4, @@ -140,7 +140,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Heavy_Frame_Wheelchair_XjPQjhRCH08VUIbr.json b/src/packs/items/weapons/weapon_Heavy_Frame_Wheelchair_XjPQjhRCH08VUIbr.json index e74ff4aa..db20063d 100644 --- a/src/packs/items/weapons/weapon_Heavy_Frame_Wheelchair_XjPQjhRCH08VUIbr.json +++ b/src/packs/items/weapons/weapon_Heavy_Frame_Wheelchair_XjPQjhRCH08VUIbr.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d12", "bonus": 3, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Ilmari_s_Rifle_TMrUzVC3KvcHmdt8.json b/src/packs/items/weapons/weapon_Ilmari_s_Rifle_TMrUzVC3KvcHmdt8.json index cddd762a..8234ab3a 100644 --- a/src/packs/items/weapons/weapon_Ilmari_s_Rifle_TMrUzVC3KvcHmdt8.json +++ b/src/packs/items/weapons/weapon_Ilmari_s_Rifle_TMrUzVC3KvcHmdt8.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 6, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Impact_Gauntlet_Zg6IutksQVOqAg8K.json b/src/packs/items/weapons/weapon_Impact_Gauntlet_Zg6IutksQVOqAg8K.json index 5e9891f9..8c8cc81d 100644 --- a/src/packs/items/weapons/weapon_Impact_Gauntlet_Zg6IutksQVOqAg8K.json +++ b/src/packs/items/weapons/weapon_Impact_Gauntlet_Zg6IutksQVOqAg8K.json @@ -78,8 +78,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 11, @@ -105,7 +105,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Arcane_Frame_Wheelchair_N9P695V5KKlJbAY5.json b/src/packs/items/weapons/weapon_Improved_Arcane_Frame_Wheelchair_N9P695V5KKlJbAY5.json index 33f96030..fad45a2b 100644 --- a/src/packs/items/weapons/weapon_Improved_Arcane_Frame_Wheelchair_N9P695V5KKlJbAY5.json +++ b/src/packs/items/weapons/weapon_Improved_Arcane_Frame_Wheelchair_N9P695V5KKlJbAY5.json @@ -48,8 +48,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 3, @@ -75,7 +75,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Arcane_Gauntlets_kENTDpa1hr5LDhIT.json b/src/packs/items/weapons/weapon_Improved_Arcane_Gauntlets_kENTDpa1hr5LDhIT.json index 1880d45b..40b85dde 100644 --- a/src/packs/items/weapons/weapon_Improved_Arcane_Gauntlets_kENTDpa1hr5LDhIT.json +++ b/src/packs/items/weapons/weapon_Improved_Arcane_Gauntlets_kENTDpa1hr5LDhIT.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 6, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Battleaxe_nxGUpuHLmuKdKsDC.json b/src/packs/items/weapons/weapon_Improved_Battleaxe_nxGUpuHLmuKdKsDC.json index 4652d62d..23068751 100644 --- a/src/packs/items/weapons/weapon_Improved_Battleaxe_nxGUpuHLmuKdKsDC.json +++ b/src/packs/items/weapons/weapon_Improved_Battleaxe_nxGUpuHLmuKdKsDC.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 6, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Broadsword_OcKeLJxvmdT81VBc.json b/src/packs/items/weapons/weapon_Improved_Broadsword_OcKeLJxvmdT81VBc.json index 6d6f1921..a17caadf 100644 --- a/src/packs/items/weapons/weapon_Improved_Broadsword_OcKeLJxvmdT81VBc.json +++ b/src/packs/items/weapons/weapon_Improved_Broadsword_OcKeLJxvmdT81VBc.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 3, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Crossbow_55NwHIIZHUeKSE3M.json b/src/packs/items/weapons/weapon_Improved_Crossbow_55NwHIIZHUeKSE3M.json index 5bc082ef..185f8f11 100644 --- a/src/packs/items/weapons/weapon_Improved_Crossbow_55NwHIIZHUeKSE3M.json +++ b/src/packs/items/weapons/weapon_Improved_Crossbow_55NwHIIZHUeKSE3M.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 4, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Cutlass_ddRjXnp2vbohu7rJ.json b/src/packs/items/weapons/weapon_Improved_Cutlass_ddRjXnp2vbohu7rJ.json index 87dfbfae..520e5679 100644 --- a/src/packs/items/weapons/weapon_Improved_Cutlass_ddRjXnp2vbohu7rJ.json +++ b/src/packs/items/weapons/weapon_Improved_Cutlass_ddRjXnp2vbohu7rJ.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 4, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Dagger_ScjTkb9qrndhlk9S.json b/src/packs/items/weapons/weapon_Improved_Dagger_ScjTkb9qrndhlk9S.json index 194ec879..1db4504e 100644 --- a/src/packs/items/weapons/weapon_Improved_Dagger_ScjTkb9qrndhlk9S.json +++ b/src/packs/items/weapons/weapon_Improved_Dagger_ScjTkb9qrndhlk9S.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 4, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Dualstaff_f7hhHlZ5nL3AhYEM.json b/src/packs/items/weapons/weapon_Improved_Dualstaff_f7hhHlZ5nL3AhYEM.json index d614130e..84cc75ba 100644 --- a/src/packs/items/weapons/weapon_Improved_Dualstaff_f7hhHlZ5nL3AhYEM.json +++ b/src/packs/items/weapons/weapon_Improved_Dualstaff_f7hhHlZ5nL3AhYEM.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 6, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Glowing_Rings_N5amhkxR1xn3B7r2.json b/src/packs/items/weapons/weapon_Improved_Glowing_Rings_N5amhkxR1xn3B7r2.json index f8b29720..01439f5b 100644 --- a/src/packs/items/weapons/weapon_Improved_Glowing_Rings_N5amhkxR1xn3B7r2.json +++ b/src/packs/items/weapons/weapon_Improved_Glowing_Rings_N5amhkxR1xn3B7r2.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 5, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Grappler_3T3o9zfe61t22L1H.json b/src/packs/items/weapons/weapon_Improved_Grappler_3T3o9zfe61t22L1H.json index 31dfff22..74ee510a 100644 --- a/src/packs/items/weapons/weapon_Improved_Grappler_3T3o9zfe61t22L1H.json +++ b/src/packs/items/weapons/weapon_Improved_Grappler_3T3o9zfe61t22L1H.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 2, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Greatstaff_LCuTrYXi4lhg6LqW.json b/src/packs/items/weapons/weapon_Improved_Greatstaff_LCuTrYXi4lhg6LqW.json index 25be3393..cf1bdf63 100644 --- a/src/packs/items/weapons/weapon_Improved_Greatstaff_LCuTrYXi4lhg6LqW.json +++ b/src/packs/items/weapons/weapon_Improved_Greatstaff_LCuTrYXi4lhg6LqW.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 3, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Greatsword_FPX4ouDrxXiQ5MDf.json b/src/packs/items/weapons/weapon_Improved_Greatsword_FPX4ouDrxXiQ5MDf.json index 60e5dd53..f71e5ea6 100644 --- a/src/packs/items/weapons/weapon_Improved_Greatsword_FPX4ouDrxXiQ5MDf.json +++ b/src/packs/items/weapons/weapon_Improved_Greatsword_FPX4ouDrxXiQ5MDf.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 6, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Halberd_F9PETfCQGwczBPif.json b/src/packs/items/weapons/weapon_Improved_Halberd_F9PETfCQGwczBPif.json index fb5a1dcc..168d8953 100644 --- a/src/packs/items/weapons/weapon_Improved_Halberd_F9PETfCQGwczBPif.json +++ b/src/packs/items/weapons/weapon_Improved_Halberd_F9PETfCQGwczBPif.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 5, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Hallowed_Axe_wFOXMN2uiX4j6Gd9.json b/src/packs/items/weapons/weapon_Improved_Hallowed_Axe_wFOXMN2uiX4j6Gd9.json index 71b28bea..a79ad56d 100644 --- a/src/packs/items/weapons/weapon_Improved_Hallowed_Axe_wFOXMN2uiX4j6Gd9.json +++ b/src/packs/items/weapons/weapon_Improved_Hallowed_Axe_wFOXMN2uiX4j6Gd9.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 4, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Hand_Crossbow_XEDRkuw3BhMoVBn9.json b/src/packs/items/weapons/weapon_Improved_Hand_Crossbow_XEDRkuw3BhMoVBn9.json index 91641856..74e74f2c 100644 --- a/src/packs/items/weapons/weapon_Improved_Hand_Crossbow_XEDRkuw3BhMoVBn9.json +++ b/src/packs/items/weapons/weapon_Improved_Hand_Crossbow_XEDRkuw3BhMoVBn9.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 3, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Hand_Runes_jMEukC3VpNDz5AOD.json b/src/packs/items/weapons/weapon_Improved_Hand_Runes_jMEukC3VpNDz5AOD.json index dc7f2005..546e9762 100644 --- a/src/packs/items/weapons/weapon_Improved_Hand_Runes_jMEukC3VpNDz5AOD.json +++ b/src/packs/items/weapons/weapon_Improved_Hand_Runes_jMEukC3VpNDz5AOD.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 3, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Heavy_Frame_Wheelchair_L5KeCtrs768PmYWW.json b/src/packs/items/weapons/weapon_Improved_Heavy_Frame_Wheelchair_L5KeCtrs768PmYWW.json index e65cc221..3a386fa8 100644 --- a/src/packs/items/weapons/weapon_Improved_Heavy_Frame_Wheelchair_L5KeCtrs768PmYWW.json +++ b/src/packs/items/weapons/weapon_Improved_Heavy_Frame_Wheelchair_L5KeCtrs768PmYWW.json @@ -48,8 +48,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d12", "bonus": 6, @@ -75,7 +75,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", 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 315ceaf3..6fbe3c9d 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 @@ -77,8 +77,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 3, @@ -104,7 +104,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Longbow_NacNonjbzyoVMNhI.json b/src/packs/items/weapons/weapon_Improved_Longbow_NacNonjbzyoVMNhI.json index c197f726..787d5a28 100644 --- a/src/packs/items/weapons/weapon_Improved_Longbow_NacNonjbzyoVMNhI.json +++ b/src/packs/items/weapons/weapon_Improved_Longbow_NacNonjbzyoVMNhI.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 6, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Longsword_QyBZ5NxM8F9nCL9s.json b/src/packs/items/weapons/weapon_Improved_Longsword_QyBZ5NxM8F9nCL9s.json index aaa38270..982ca3ac 100644 --- a/src/packs/items/weapons/weapon_Improved_Longsword_QyBZ5NxM8F9nCL9s.json +++ b/src/packs/items/weapons/weapon_Improved_Longsword_QyBZ5NxM8F9nCL9s.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 6, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Mace_zSLx52U4Yltqx8F1.json b/src/packs/items/weapons/weapon_Improved_Mace_zSLx52U4Yltqx8F1.json index 1ce84304..c1b626d5 100644 --- a/src/packs/items/weapons/weapon_Improved_Mace_zSLx52U4Yltqx8F1.json +++ b/src/packs/items/weapons/weapon_Improved_Mace_zSLx52U4Yltqx8F1.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 4, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Quarterstaff_BEmAR60PM3ZaiNXa.json b/src/packs/items/weapons/weapon_Improved_Quarterstaff_BEmAR60PM3ZaiNXa.json index 9dc81b98..888022ed 100644 --- a/src/packs/items/weapons/weapon_Improved_Quarterstaff_BEmAR60PM3ZaiNXa.json +++ b/src/packs/items/weapons/weapon_Improved_Quarterstaff_BEmAR60PM3ZaiNXa.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 6, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Rapier_LFPH8nD2f4Blv3AM.json b/src/packs/items/weapons/weapon_Improved_Rapier_LFPH8nD2f4Blv3AM.json index e9db95d1..cc6099da 100644 --- a/src/packs/items/weapons/weapon_Improved_Rapier_LFPH8nD2f4Blv3AM.json +++ b/src/packs/items/weapons/weapon_Improved_Rapier_LFPH8nD2f4Blv3AM.json @@ -78,8 +78,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 3, @@ -105,7 +105,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Returning_Blade_SKNwkW23eVQjN4Zy.json b/src/packs/items/weapons/weapon_Improved_Returning_Blade_SKNwkW23eVQjN4Zy.json index 1dff30a1..31688a23 100644 --- a/src/packs/items/weapons/weapon_Improved_Returning_Blade_SKNwkW23eVQjN4Zy.json +++ b/src/packs/items/weapons/weapon_Improved_Returning_Blade_SKNwkW23eVQjN4Zy.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 3, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Round_Shield_DlinEBGZfIlvreO3.json b/src/packs/items/weapons/weapon_Improved_Round_Shield_DlinEBGZfIlvreO3.json index 65868950..53a8e9b6 100644 --- a/src/packs/items/weapons/weapon_Improved_Round_Shield_DlinEBGZfIlvreO3.json +++ b/src/packs/items/weapons/weapon_Improved_Round_Shield_DlinEBGZfIlvreO3.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d4", "bonus": 2, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", @@ -113,26 +113,26 @@ "name": "Protective", "description": "

Add the item's Tier to your Armor Score

", "img": "icons/skills/melee/shield-block-gray-orange.webp", - "_id": "pZCrWd7zLTarvEQK", + "changes": [ + { + "key": "system.armorScore", + "mode": 2, + "value": "ITEM.@system.tier", + "priority": null + } + ], + "_id": "cXWSV50apzaNQkdA", "type": "base", - "system": { - "changes": [ - { - "type": "armor", - "phase": "initial", - "priority": 20, - "value": { - "max": "ITEM.@system.tier" - } - } - ] - }, + "system": {}, "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "origin": null, "tint": "#ffffff", @@ -143,10 +143,7 @@ "_stats": { "compendiumSource": null }, - "start": null, - "showIcon": 1, - "folder": null, - "_key": "!items.effects!DlinEBGZfIlvreO3.pZCrWd7zLTarvEQK" + "_key": "!items.effects!DlinEBGZfIlvreO3.cXWSV50apzaNQkdA" } ], "sort": 0, diff --git a/src/packs/items/weapons/weapon_Improved_Scepter_tj26lbNkwy8bORF4.json b/src/packs/items/weapons/weapon_Improved_Scepter_tj26lbNkwy8bORF4.json index ac226b84..dc41692f 100644 --- a/src/packs/items/weapons/weapon_Improved_Scepter_tj26lbNkwy8bORF4.json +++ b/src/packs/items/weapons/weapon_Improved_Scepter_tj26lbNkwy8bORF4.json @@ -11,8 +11,8 @@ "type": "attack", "damage": { "includeBase": false, - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -38,7 +38,7 @@ } } } - } + ] }, "range": "melee", "roll": { @@ -115,8 +115,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 3, @@ -142,7 +142,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Shortbow_6ZWl6ARfvYBaAMwY.json b/src/packs/items/weapons/weapon_Improved_Shortbow_6ZWl6ARfvYBaAMwY.json index b0e101fb..421b8f8e 100644 --- a/src/packs/items/weapons/weapon_Improved_Shortbow_6ZWl6ARfvYBaAMwY.json +++ b/src/packs/items/weapons/weapon_Improved_Shortbow_6ZWl6ARfvYBaAMwY.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 6, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Shortstaff_Mn8ja5Oi1sXvvPSk.json b/src/packs/items/weapons/weapon_Improved_Shortstaff_Mn8ja5Oi1sXvvPSk.json index 7d90cf94..08bf9251 100644 --- a/src/packs/items/weapons/weapon_Improved_Shortstaff_Mn8ja5Oi1sXvvPSk.json +++ b/src/packs/items/weapons/weapon_Improved_Shortstaff_Mn8ja5Oi1sXvvPSk.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 4, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Shortsword_rSyBNRwemBVuTo3H.json b/src/packs/items/weapons/weapon_Improved_Shortsword_rSyBNRwemBVuTo3H.json index 96ecd37f..df2f324c 100644 --- a/src/packs/items/weapons/weapon_Improved_Shortsword_rSyBNRwemBVuTo3H.json +++ b/src/packs/items/weapons/weapon_Improved_Shortsword_rSyBNRwemBVuTo3H.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 2, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Small_Dagger_nMuF8ZDZ2aXZVTg6.json b/src/packs/items/weapons/weapon_Improved_Small_Dagger_nMuF8ZDZ2aXZVTg6.json index 1553d75d..b69332a5 100644 --- a/src/packs/items/weapons/weapon_Improved_Small_Dagger_nMuF8ZDZ2aXZVTg6.json +++ b/src/packs/items/weapons/weapon_Improved_Small_Dagger_nMuF8ZDZ2aXZVTg6.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 2, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Spear_j5Pt1thLfcvopBij.json b/src/packs/items/weapons/weapon_Improved_Spear_j5Pt1thLfcvopBij.json index 790f9e51..ae6b0987 100644 --- a/src/packs/items/weapons/weapon_Improved_Spear_j5Pt1thLfcvopBij.json +++ b/src/packs/items/weapons/weapon_Improved_Spear_j5Pt1thLfcvopBij.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 6, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Tower_Shield_bxt3NsbMqTSdI5ab.json b/src/packs/items/weapons/weapon_Improved_Tower_Shield_bxt3NsbMqTSdI5ab.json index 64555dfa..839d4352 100644 --- a/src/packs/items/weapons/weapon_Improved_Tower_Shield_bxt3NsbMqTSdI5ab.json +++ b/src/packs/items/weapons/weapon_Improved_Tower_Shield_bxt3NsbMqTSdI5ab.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 2, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", @@ -113,25 +113,25 @@ "name": "Barrier", "description": "Gain Weapon Tier + 1 to Armor Score; -1 to Evasion", "img": "icons/skills/melee/shield-block-bash-blue.webp", + "changes": [ + { + "key": "system.armorScore", + "mode": 2, + "value": "ITEM.@system.tier + 1" + }, + { + "key": "system.evasion", + "mode": 2, + "value": "-1" + } + ], "_id": "tkNEA1PO3jEFhKCa", "type": "base", - "system": { - "changes": [ - { - "key": "system.evasion", - "type": "add", - "value": -1, - "phase": "initial", - "priority": 0 - } - ] - }, + "system": {}, "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null }, "origin": null, "tint": "#ffffff", @@ -142,49 +142,7 @@ "_stats": { "compendiumSource": null }, - "start": null, - "showIcon": 1, - "folder": null, "_key": "!items.effects!bxt3NsbMqTSdI5ab.tkNEA1PO3jEFhKCa" - }, - { - "name": "Barrier", - "description": "Gain Weapon Tier + 1 to Armor Score; -1 to Evasion", - "img": "icons/skills/melee/shield-block-bash-blue.webp", - "_id": "XugJeHJdnC6IymSa", - "type": "base", - "system": { - "changes": [ - { - "type": "armor", - "phase": "initial", - "priority": 20, - "value": { - "max": "ITEM.@system.tier + 1" - } - } - ] - }, - "disabled": false, - "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false - }, - "origin": null, - "tint": "#ffffff", - "transfer": true, - "statuses": [], - "sort": 0, - "flags": {}, - "_stats": { - "compendiumSource": null - }, - "start": null, - "showIcon": 1, - "folder": null, - "_key": "!items.effects!bxt3NsbMqTSdI5ab.XugJeHJdnC6IymSa" } ], "sort": 0, diff --git a/src/packs/items/weapons/weapon_Improved_Wand_6d9B2b5X2d2U56jt.json b/src/packs/items/weapons/weapon_Improved_Wand_6d9B2b5X2d2U56jt.json index 53ee6746..cecb818d 100644 --- a/src/packs/items/weapons/weapon_Improved_Wand_6d9B2b5X2d2U56jt.json +++ b/src/packs/items/weapons/weapon_Improved_Wand_6d9B2b5X2d2U56jt.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 4, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Warhammer_pxaN4ZK4eqKrjtWj.json b/src/packs/items/weapons/weapon_Improved_Warhammer_pxaN4ZK4eqKrjtWj.json index aa24c4ad..40a5faba 100644 --- a/src/packs/items/weapons/weapon_Improved_Warhammer_pxaN4ZK4eqKrjtWj.json +++ b/src/packs/items/weapons/weapon_Improved_Warhammer_pxaN4ZK4eqKrjtWj.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d12", "bonus": 6, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Improved_Whip_ftTp8VlsBQ1r4LFD.json b/src/packs/items/weapons/weapon_Improved_Whip_ftTp8VlsBQ1r4LFD.json index 4dd1dcb1..dff7fb25 100644 --- a/src/packs/items/weapons/weapon_Improved_Whip_ftTp8VlsBQ1r4LFD.json +++ b/src/packs/items/weapons/weapon_Improved_Whip_ftTp8VlsBQ1r4LFD.json @@ -78,8 +78,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 2, @@ -105,7 +105,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Keeper_s_Staff_q382JqMkqLaaFLIr.json b/src/packs/items/weapons/weapon_Keeper_s_Staff_q382JqMkqLaaFLIr.json index 21fe863b..27b8044b 100644 --- a/src/packs/items/weapons/weapon_Keeper_s_Staff_q382JqMkqLaaFLIr.json +++ b/src/packs/items/weapons/weapon_Keeper_s_Staff_q382JqMkqLaaFLIr.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 4, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Knuckle_Blades_U8gfyvxoHm024inM.json b/src/packs/items/weapons/weapon_Knuckle_Blades_U8gfyvxoHm024inM.json index ffe92071..a5d00ff4 100644 --- a/src/packs/items/weapons/weapon_Knuckle_Blades_U8gfyvxoHm024inM.json +++ b/src/packs/items/weapons/weapon_Knuckle_Blades_U8gfyvxoHm024inM.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 6, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Knuckle_Claws_SFqganS8Du4aEKjQ.json b/src/packs/items/weapons/weapon_Knuckle_Claws_SFqganS8Du4aEKjQ.json index a7629e7d..df995a3f 100644 --- a/src/packs/items/weapons/weapon_Knuckle_Claws_SFqganS8Du4aEKjQ.json +++ b/src/packs/items/weapons/weapon_Knuckle_Claws_SFqganS8Du4aEKjQ.json @@ -72,8 +72,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 8, @@ -99,7 +99,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Labrys_Axe_ijWppQzSOqVCb3rE.json b/src/packs/items/weapons/weapon_Labrys_Axe_ijWppQzSOqVCb3rE.json index 11994d3e..4958bbe5 100644 --- a/src/packs/items/weapons/weapon_Labrys_Axe_ijWppQzSOqVCb3rE.json +++ b/src/packs/items/weapons/weapon_Labrys_Axe_ijWppQzSOqVCb3rE.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 7, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", @@ -113,26 +113,20 @@ "name": "Protective", "description": "Add your character's Tier to your Armor Score", "img": "icons/skills/melee/shield-block-gray-orange.webp", - "_id": "vnR4Zhnb0rOqwrFw", + "changes": [ + { + "key": "system.armorScore", + "mode": 2, + "value": "ITEM.@system.tier" + } + ], + "_id": "qTxADRsQnKiYfOiQ", "type": "base", - "system": { - "changes": [ - { - "type": "armor", - "phase": "initial", - "priority": 20, - "value": { - "max": "ITEM.@system.tier" - } - } - ] - }, + "system": {}, "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null }, "origin": null, "tint": "#ffffff", @@ -143,10 +137,7 @@ "_stats": { "compendiumSource": null }, - "start": null, - "showIcon": 1, - "folder": null, - "_key": "!items.effects!ijWppQzSOqVCb3rE.vnR4Zhnb0rOqwrFw" + "_key": "!items.effects!ijWppQzSOqVCb3rE.qTxADRsQnKiYfOiQ" } ], "sort": 0, diff --git a/src/packs/items/weapons/weapon_Legendary_Arcane_Frame_Wheelchair_gA2tiET9VHGhwMoO.json b/src/packs/items/weapons/weapon_Legendary_Arcane_Frame_Wheelchair_gA2tiET9VHGhwMoO.json index f947acac..d8068f41 100644 --- a/src/packs/items/weapons/weapon_Legendary_Arcane_Frame_Wheelchair_gA2tiET9VHGhwMoO.json +++ b/src/packs/items/weapons/weapon_Legendary_Arcane_Frame_Wheelchair_gA2tiET9VHGhwMoO.json @@ -48,8 +48,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 9, @@ -75,7 +75,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Arcane_Gauntlets_umADDPYCaykXDc1v.json b/src/packs/items/weapons/weapon_Legendary_Arcane_Gauntlets_umADDPYCaykXDc1v.json index c7adc0f2..94da915c 100644 --- a/src/packs/items/weapons/weapon_Legendary_Arcane_Gauntlets_umADDPYCaykXDc1v.json +++ b/src/packs/items/weapons/weapon_Legendary_Arcane_Gauntlets_umADDPYCaykXDc1v.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 12, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Battleaxe_1nztpLzoHGfbKf5x.json b/src/packs/items/weapons/weapon_Legendary_Battleaxe_1nztpLzoHGfbKf5x.json index 3c22e3f2..06a8a85f 100644 --- a/src/packs/items/weapons/weapon_Legendary_Battleaxe_1nztpLzoHGfbKf5x.json +++ b/src/packs/items/weapons/weapon_Legendary_Battleaxe_1nztpLzoHGfbKf5x.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 12, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Broadsword_y3hfTPfZhMognyaJ.json b/src/packs/items/weapons/weapon_Legendary_Broadsword_y3hfTPfZhMognyaJ.json index 361d0353..786ba8b6 100644 --- a/src/packs/items/weapons/weapon_Legendary_Broadsword_y3hfTPfZhMognyaJ.json +++ b/src/packs/items/weapons/weapon_Legendary_Broadsword_y3hfTPfZhMognyaJ.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 9, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Crossbow_1G6xX2QL9O0Rsgz7.json b/src/packs/items/weapons/weapon_Legendary_Crossbow_1G6xX2QL9O0Rsgz7.json index 358cdd56..e263bcbe 100644 --- a/src/packs/items/weapons/weapon_Legendary_Crossbow_1G6xX2QL9O0Rsgz7.json +++ b/src/packs/items/weapons/weapon_Legendary_Crossbow_1G6xX2QL9O0Rsgz7.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 10, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Cutlass_Rpyz0jbFJ1SwqfyD.json b/src/packs/items/weapons/weapon_Legendary_Cutlass_Rpyz0jbFJ1SwqfyD.json index 9ce1b48a..2c284332 100644 --- a/src/packs/items/weapons/weapon_Legendary_Cutlass_Rpyz0jbFJ1SwqfyD.json +++ b/src/packs/items/weapons/weapon_Legendary_Cutlass_Rpyz0jbFJ1SwqfyD.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 10, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Dagger_GmTg3Fdne1UPNs8t.json b/src/packs/items/weapons/weapon_Legendary_Dagger_GmTg3Fdne1UPNs8t.json index a7bb2fc9..0e9e988d 100644 --- a/src/packs/items/weapons/weapon_Legendary_Dagger_GmTg3Fdne1UPNs8t.json +++ b/src/packs/items/weapons/weapon_Legendary_Dagger_GmTg3Fdne1UPNs8t.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 10, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Dualstaff_o3rsLvImcLAx5TvD.json b/src/packs/items/weapons/weapon_Legendary_Dualstaff_o3rsLvImcLAx5TvD.json index b06909e4..9c618ba5 100644 --- a/src/packs/items/weapons/weapon_Legendary_Dualstaff_o3rsLvImcLAx5TvD.json +++ b/src/packs/items/weapons/weapon_Legendary_Dualstaff_o3rsLvImcLAx5TvD.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 12, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Glowing_Rings_PReWrfuPjoNQuieo.json b/src/packs/items/weapons/weapon_Legendary_Glowing_Rings_PReWrfuPjoNQuieo.json index ca9937ee..1710084f 100644 --- a/src/packs/items/weapons/weapon_Legendary_Glowing_Rings_PReWrfuPjoNQuieo.json +++ b/src/packs/items/weapons/weapon_Legendary_Glowing_Rings_PReWrfuPjoNQuieo.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 11, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Grappler_IrtUj0UntBMNn49G.json b/src/packs/items/weapons/weapon_Legendary_Grappler_IrtUj0UntBMNn49G.json index f20425b2..83334710 100644 --- a/src/packs/items/weapons/weapon_Legendary_Grappler_IrtUj0UntBMNn49G.json +++ b/src/packs/items/weapons/weapon_Legendary_Grappler_IrtUj0UntBMNn49G.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 6, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Greatstaff_jDtvEabkHY1GFgfc.json b/src/packs/items/weapons/weapon_Legendary_Greatstaff_jDtvEabkHY1GFgfc.json index 09fd1f7a..a5ea82f9 100644 --- a/src/packs/items/weapons/weapon_Legendary_Greatstaff_jDtvEabkHY1GFgfc.json +++ b/src/packs/items/weapons/weapon_Legendary_Greatstaff_jDtvEabkHY1GFgfc.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 9, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Greatsword_zMZ46F9VR7zdTxb9.json b/src/packs/items/weapons/weapon_Legendary_Greatsword_zMZ46F9VR7zdTxb9.json index aa9d2ef0..840e7ec7 100644 --- a/src/packs/items/weapons/weapon_Legendary_Greatsword_zMZ46F9VR7zdTxb9.json +++ b/src/packs/items/weapons/weapon_Legendary_Greatsword_zMZ46F9VR7zdTxb9.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 12, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Halberd_1AuMNiJz96Ez9fur.json b/src/packs/items/weapons/weapon_Legendary_Halberd_1AuMNiJz96Ez9fur.json index af6b2a07..22e6af1b 100644 --- a/src/packs/items/weapons/weapon_Legendary_Halberd_1AuMNiJz96Ez9fur.json +++ b/src/packs/items/weapons/weapon_Legendary_Halberd_1AuMNiJz96Ez9fur.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 11, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Hallowed_Axe_0HmhnZnv1I6uX69c.json b/src/packs/items/weapons/weapon_Legendary_Hallowed_Axe_0HmhnZnv1I6uX69c.json index 70379d45..2bf11f05 100644 --- a/src/packs/items/weapons/weapon_Legendary_Hallowed_Axe_0HmhnZnv1I6uX69c.json +++ b/src/packs/items/weapons/weapon_Legendary_Hallowed_Axe_0HmhnZnv1I6uX69c.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 10, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Hand_Crossbow_32nYyMaeDWaakSxz.json b/src/packs/items/weapons/weapon_Legendary_Hand_Crossbow_32nYyMaeDWaakSxz.json index 930310a8..ff43c21b 100644 --- a/src/packs/items/weapons/weapon_Legendary_Hand_Crossbow_32nYyMaeDWaakSxz.json +++ b/src/packs/items/weapons/weapon_Legendary_Hand_Crossbow_32nYyMaeDWaakSxz.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 7, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Hand_Runes_DWLkswhluXuMy3bB.json b/src/packs/items/weapons/weapon_Legendary_Hand_Runes_DWLkswhluXuMy3bB.json index e909f460..2dcad490 100644 --- a/src/packs/items/weapons/weapon_Legendary_Hand_Runes_DWLkswhluXuMy3bB.json +++ b/src/packs/items/weapons/weapon_Legendary_Hand_Runes_DWLkswhluXuMy3bB.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 9, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Heavy_Frame_Wheelchair_S6nB0CNlzdU05o5U.json b/src/packs/items/weapons/weapon_Legendary_Heavy_Frame_Wheelchair_S6nB0CNlzdU05o5U.json index d8816fc9..7e561c26 100644 --- a/src/packs/items/weapons/weapon_Legendary_Heavy_Frame_Wheelchair_S6nB0CNlzdU05o5U.json +++ b/src/packs/items/weapons/weapon_Legendary_Heavy_Frame_Wheelchair_S6nB0CNlzdU05o5U.json @@ -48,8 +48,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d12", "bonus": 12, @@ -75,7 +75,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", 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 7afbd979..9f96601c 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 @@ -77,8 +77,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 9, @@ -104,7 +104,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Longbow_Utt1GpoH1fhaTOtN.json b/src/packs/items/weapons/weapon_Legendary_Longbow_Utt1GpoH1fhaTOtN.json index bd5ab13b..bb0b8ab3 100644 --- a/src/packs/items/weapons/weapon_Legendary_Longbow_Utt1GpoH1fhaTOtN.json +++ b/src/packs/items/weapons/weapon_Legendary_Longbow_Utt1GpoH1fhaTOtN.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 12, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Longsword_14abPqQcROJfDChR.json b/src/packs/items/weapons/weapon_Legendary_Longsword_14abPqQcROJfDChR.json index e6555b02..9399edd4 100644 --- a/src/packs/items/weapons/weapon_Legendary_Longsword_14abPqQcROJfDChR.json +++ b/src/packs/items/weapons/weapon_Legendary_Longsword_14abPqQcROJfDChR.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 12, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Mace_RsDsy7tIhrhaAQQc.json b/src/packs/items/weapons/weapon_Legendary_Mace_RsDsy7tIhrhaAQQc.json index 7f4a9dab..95de32f0 100644 --- a/src/packs/items/weapons/weapon_Legendary_Mace_RsDsy7tIhrhaAQQc.json +++ b/src/packs/items/weapons/weapon_Legendary_Mace_RsDsy7tIhrhaAQQc.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 10, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Quarterstaff_1ZciqG7vIKLYpKsP.json b/src/packs/items/weapons/weapon_Legendary_Quarterstaff_1ZciqG7vIKLYpKsP.json index 91bc8ac8..cf25daa7 100644 --- a/src/packs/items/weapons/weapon_Legendary_Quarterstaff_1ZciqG7vIKLYpKsP.json +++ b/src/packs/items/weapons/weapon_Legendary_Quarterstaff_1ZciqG7vIKLYpKsP.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 12, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Rapier_BakN97v4jTePcXiZ.json b/src/packs/items/weapons/weapon_Legendary_Rapier_BakN97v4jTePcXiZ.json index d5bac6d1..59a49063 100644 --- a/src/packs/items/weapons/weapon_Legendary_Rapier_BakN97v4jTePcXiZ.json +++ b/src/packs/items/weapons/weapon_Legendary_Rapier_BakN97v4jTePcXiZ.json @@ -78,8 +78,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 9, @@ -105,7 +105,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Returning_Blade_mcj3CPkcSSDdAcBB.json b/src/packs/items/weapons/weapon_Legendary_Returning_Blade_mcj3CPkcSSDdAcBB.json index b3f3fc3d..211c88c2 100644 --- a/src/packs/items/weapons/weapon_Legendary_Returning_Blade_mcj3CPkcSSDdAcBB.json +++ b/src/packs/items/weapons/weapon_Legendary_Returning_Blade_mcj3CPkcSSDdAcBB.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 9, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Round_Shield_A28WL9E2lJ3iLZHW.json b/src/packs/items/weapons/weapon_Legendary_Round_Shield_A28WL9E2lJ3iLZHW.json index 85134d21..c7b18355 100644 --- a/src/packs/items/weapons/weapon_Legendary_Round_Shield_A28WL9E2lJ3iLZHW.json +++ b/src/packs/items/weapons/weapon_Legendary_Round_Shield_A28WL9E2lJ3iLZHW.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d4", "bonus": 6, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", @@ -113,26 +113,26 @@ "name": "Protective", "description": "

Add the item's Tier to your Armor Score

", "img": "icons/skills/melee/shield-block-gray-orange.webp", - "_id": "EixxJrRHyc6kj3Wg", + "changes": [ + { + "key": "system.armorScore", + "mode": 2, + "value": "ITEM.@system.tier", + "priority": null + } + ], + "_id": "Z2p00q5h6x6seXys", "type": "base", - "system": { - "changes": [ - { - "type": "armor", - "phase": "initial", - "priority": 20, - "value": { - "max": "ITEM.@system.tier" - } - } - ] - }, + "system": {}, "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "origin": null, "tint": "#ffffff", @@ -143,10 +143,7 @@ "_stats": { "compendiumSource": null }, - "start": null, - "showIcon": 1, - "folder": null, - "_key": "!items.effects!A28WL9E2lJ3iLZHW.EixxJrRHyc6kj3Wg" + "_key": "!items.effects!A28WL9E2lJ3iLZHW.Z2p00q5h6x6seXys" } ], "sort": 0, diff --git a/src/packs/items/weapons/weapon_Legendary_Scepter_IZ4CWNxfuM46JeCN.json b/src/packs/items/weapons/weapon_Legendary_Scepter_IZ4CWNxfuM46JeCN.json index 882ecfdf..9630fd69 100644 --- a/src/packs/items/weapons/weapon_Legendary_Scepter_IZ4CWNxfuM46JeCN.json +++ b/src/packs/items/weapons/weapon_Legendary_Scepter_IZ4CWNxfuM46JeCN.json @@ -11,8 +11,8 @@ "type": "attack", "damage": { "includeBase": false, - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -38,7 +38,7 @@ } } } - } + ] }, "range": "melee", "roll": { @@ -115,8 +115,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 9, @@ -142,7 +142,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Shortbow_j7kp36jaetfn5jb3.json b/src/packs/items/weapons/weapon_Legendary_Shortbow_j7kp36jaetfn5jb3.json index b3dbd210..7fad3f95 100644 --- a/src/packs/items/weapons/weapon_Legendary_Shortbow_j7kp36jaetfn5jb3.json +++ b/src/packs/items/weapons/weapon_Legendary_Shortbow_j7kp36jaetfn5jb3.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 12, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Shortstaff_D3SbNvNJZAFuzfhg.json b/src/packs/items/weapons/weapon_Legendary_Shortstaff_D3SbNvNJZAFuzfhg.json index 3d29bc25..59d53e44 100644 --- a/src/packs/items/weapons/weapon_Legendary_Shortstaff_D3SbNvNJZAFuzfhg.json +++ b/src/packs/items/weapons/weapon_Legendary_Shortstaff_D3SbNvNJZAFuzfhg.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 10, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Shortsword_dEumq3BIZBk5xYTk.json b/src/packs/items/weapons/weapon_Legendary_Shortsword_dEumq3BIZBk5xYTk.json index a2203a1d..d7f9632a 100644 --- a/src/packs/items/weapons/weapon_Legendary_Shortsword_dEumq3BIZBk5xYTk.json +++ b/src/packs/items/weapons/weapon_Legendary_Shortsword_dEumq3BIZBk5xYTk.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 6, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Small_Dagger_Px3Rh3kIvAqyISxJ.json b/src/packs/items/weapons/weapon_Legendary_Small_Dagger_Px3Rh3kIvAqyISxJ.json index cf63bde2..c6bf5437 100644 --- a/src/packs/items/weapons/weapon_Legendary_Small_Dagger_Px3Rh3kIvAqyISxJ.json +++ b/src/packs/items/weapons/weapon_Legendary_Small_Dagger_Px3Rh3kIvAqyISxJ.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 6, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Spear_4e5pWxi2qohuGsWh.json b/src/packs/items/weapons/weapon_Legendary_Spear_4e5pWxi2qohuGsWh.json index e0248f4b..114ea79e 100644 --- a/src/packs/items/weapons/weapon_Legendary_Spear_4e5pWxi2qohuGsWh.json +++ b/src/packs/items/weapons/weapon_Legendary_Spear_4e5pWxi2qohuGsWh.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 12, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Tower_Shield_MaJIROht7A9LxIZx.json b/src/packs/items/weapons/weapon_Legendary_Tower_Shield_MaJIROht7A9LxIZx.json index 772e9ca9..47e707d3 100644 --- a/src/packs/items/weapons/weapon_Legendary_Tower_Shield_MaJIROht7A9LxIZx.json +++ b/src/packs/items/weapons/weapon_Legendary_Tower_Shield_MaJIROht7A9LxIZx.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 6, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", @@ -113,25 +113,25 @@ "name": "Barrier", "description": "Gain Weapon Tier + 1 to Armor Score; -1 to Evasion", "img": "icons/skills/melee/shield-block-bash-blue.webp", + "changes": [ + { + "key": "system.armorScore", + "mode": 2, + "value": "ITEM.@system.tier + 1" + }, + { + "key": "system.evasion", + "mode": 2, + "value": "-1" + } + ], "_id": "lBJMzxdGO2nJdTQS", "type": "base", - "system": { - "changes": [ - { - "key": "system.evasion", - "type": "add", - "value": -1, - "phase": "initial", - "priority": 0 - } - ] - }, + "system": {}, "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null }, "origin": null, "tint": "#ffffff", @@ -142,49 +142,7 @@ "_stats": { "compendiumSource": null }, - "start": null, - "showIcon": 1, - "folder": null, "_key": "!items.effects!MaJIROht7A9LxIZx.lBJMzxdGO2nJdTQS" - }, - { - "name": "Barrier", - "description": "Gain Weapon Tier + 1 to Armor Score; -1 to Evasion", - "img": "icons/skills/melee/shield-block-bash-blue.webp", - "_id": "1fgUIaXl6VQrhP7j", - "type": "base", - "system": { - "changes": [ - { - "type": "armor", - "phase": "initial", - "priority": 20, - "value": { - "max": "ITEM.@system.tier + 1" - } - } - ] - }, - "disabled": false, - "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false - }, - "origin": null, - "tint": "#ffffff", - "transfer": true, - "statuses": [], - "sort": 0, - "flags": {}, - "_stats": { - "compendiumSource": null - }, - "start": null, - "showIcon": 1, - "folder": null, - "_key": "!items.effects!MaJIROht7A9LxIZx.1fgUIaXl6VQrhP7j" } ], "sort": 0, diff --git a/src/packs/items/weapons/weapon_Legendary_Wand_wPjg0LufJH9vUfVM.json b/src/packs/items/weapons/weapon_Legendary_Wand_wPjg0LufJH9vUfVM.json index 65925525..4bb0acd9 100644 --- a/src/packs/items/weapons/weapon_Legendary_Wand_wPjg0LufJH9vUfVM.json +++ b/src/packs/items/weapons/weapon_Legendary_Wand_wPjg0LufJH9vUfVM.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 10, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Warhammer_W9ymfEDck2icfvla.json b/src/packs/items/weapons/weapon_Legendary_Warhammer_W9ymfEDck2icfvla.json index 562122d2..0918f8b1 100644 --- a/src/packs/items/weapons/weapon_Legendary_Warhammer_W9ymfEDck2icfvla.json +++ b/src/packs/items/weapons/weapon_Legendary_Warhammer_W9ymfEDck2icfvla.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d12", "bonus": 12, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Legendary_Whip_Wcdbf6yS3LEt7nsg.json b/src/packs/items/weapons/weapon_Legendary_Whip_Wcdbf6yS3LEt7nsg.json index baf6d369..83ac59c7 100644 --- a/src/packs/items/weapons/weapon_Legendary_Whip_Wcdbf6yS3LEt7nsg.json +++ b/src/packs/items/weapons/weapon_Legendary_Whip_Wcdbf6yS3LEt7nsg.json @@ -78,8 +78,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 6, @@ -105,7 +105,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", 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 7fadde01..fdda2b56 100644 --- a/src/packs/items/weapons/weapon_Light_Frame_Wheelchair_iaGnlUkShBgdeMo0.json +++ b/src/packs/items/weapons/weapon_Light_Frame_Wheelchair_iaGnlUkShBgdeMo0.json @@ -78,8 +78,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "type": [ "physical" ], @@ -105,7 +105,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Longbow_YfVs6Se903az4Yet.json b/src/packs/items/weapons/weapon_Longbow_YfVs6Se903az4Yet.json index 43af46ab..c6e98bc4 100644 --- a/src/packs/items/weapons/weapon_Longbow_YfVs6Se903az4Yet.json +++ b/src/packs/items/weapons/weapon_Longbow_YfVs6Se903az4Yet.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 3, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Longsword_Iv8BZM1R24QMT72M.json b/src/packs/items/weapons/weapon_Longsword_Iv8BZM1R24QMT72M.json index 3961d7c3..cba1bac8 100644 --- a/src/packs/items/weapons/weapon_Longsword_Iv8BZM1R24QMT72M.json +++ b/src/packs/items/weapons/weapon_Longsword_Iv8BZM1R24QMT72M.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 3, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Mace_cKQCDyM2UopDL9zF.json b/src/packs/items/weapons/weapon_Mace_cKQCDyM2UopDL9zF.json index 7a7582cb..0e6670f4 100644 --- a/src/packs/items/weapons/weapon_Mace_cKQCDyM2UopDL9zF.json +++ b/src/packs/items/weapons/weapon_Mace_cKQCDyM2UopDL9zF.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 1, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Mage_Orb_XKBmBUEoGLdLcuqQ.json b/src/packs/items/weapons/weapon_Mage_Orb_XKBmBUEoGLdLcuqQ.json index dbd218f1..3b5983f5 100644 --- a/src/packs/items/weapons/weapon_Mage_Orb_XKBmBUEoGLdLcuqQ.json +++ b/src/packs/items/weapons/weapon_Mage_Orb_XKBmBUEoGLdLcuqQ.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 7, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Magus_Revolver_jGykNGQiKm63tCiE.json b/src/packs/items/weapons/weapon_Magus_Revolver_jGykNGQiKm63tCiE.json index 9dbbb1c1..42a65010 100644 --- a/src/packs/items/weapons/weapon_Magus_Revolver_jGykNGQiKm63tCiE.json +++ b/src/packs/items/weapons/weapon_Magus_Revolver_jGykNGQiKm63tCiE.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 13, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Meridian_Cutlass_Gi26Zk9VqlAAgx3E.json b/src/packs/items/weapons/weapon_Meridian_Cutlass_Gi26Zk9VqlAAgx3E.json index b83a18be..dcc236a0 100644 --- a/src/packs/items/weapons/weapon_Meridian_Cutlass_Gi26Zk9VqlAAgx3E.json +++ b/src/packs/items/weapons/weapon_Meridian_Cutlass_Gi26Zk9VqlAAgx3E.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 5, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Midas_Scythe_BdLfy5i488VZgkjP.json b/src/packs/items/weapons/weapon_Midas_Scythe_BdLfy5i488VZgkjP.json index 57fe2367..799413be 100644 --- a/src/packs/items/weapons/weapon_Midas_Scythe_BdLfy5i488VZgkjP.json +++ b/src/packs/items/weapons/weapon_Midas_Scythe_BdLfy5i488VZgkjP.json @@ -78,8 +78,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 9, @@ -105,7 +105,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Parrying_Dagger_taAZDkDCpeNgxhnn.json b/src/packs/items/weapons/weapon_Parrying_Dagger_taAZDkDCpeNgxhnn.json index b5844e89..482d813b 100644 --- a/src/packs/items/weapons/weapon_Parrying_Dagger_taAZDkDCpeNgxhnn.json +++ b/src/packs/items/weapons/weapon_Parrying_Dagger_taAZDkDCpeNgxhnn.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 2, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Powered_Gauntlet_bW3xw5S9DbaLCN3E.json b/src/packs/items/weapons/weapon_Powered_Gauntlet_bW3xw5S9DbaLCN3E.json index 3c4ebd1c..67922f8b 100644 --- a/src/packs/items/weapons/weapon_Powered_Gauntlet_bW3xw5S9DbaLCN3E.json +++ b/src/packs/items/weapons/weapon_Powered_Gauntlet_bW3xw5S9DbaLCN3E.json @@ -85,8 +85,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 4, @@ -112,7 +112,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Primer_Shard_SxcblanBvqaest3A.json b/src/packs/items/weapons/weapon_Primer_Shard_SxcblanBvqaest3A.json index 0cf59179..fb42af74 100644 --- a/src/packs/items/weapons/weapon_Primer_Shard_SxcblanBvqaest3A.json +++ b/src/packs/items/weapons/weapon_Primer_Shard_SxcblanBvqaest3A.json @@ -72,8 +72,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d4", "bonus": null, @@ -99,7 +99,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Quarterstaff_mlIj88p1wcQNjEDG.json b/src/packs/items/weapons/weapon_Quarterstaff_mlIj88p1wcQNjEDG.json index 00940b6c..37c56a21 100644 --- a/src/packs/items/weapons/weapon_Quarterstaff_mlIj88p1wcQNjEDG.json +++ b/src/packs/items/weapons/weapon_Quarterstaff_mlIj88p1wcQNjEDG.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 3, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Rapier_zkAgEW6zMkRZalEm.json b/src/packs/items/weapons/weapon_Rapier_zkAgEW6zMkRZalEm.json index 45642f14..b4de1c00 100644 --- a/src/packs/items/weapons/weapon_Rapier_zkAgEW6zMkRZalEm.json +++ b/src/packs/items/weapons/weapon_Rapier_zkAgEW6zMkRZalEm.json @@ -78,8 +78,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "type": [ "physical" ], @@ -105,7 +105,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Retractable_Saber_i8CqVTzqoRoCewNe.json b/src/packs/items/weapons/weapon_Retractable_Saber_i8CqVTzqoRoCewNe.json index 548de60f..c1b350a3 100644 --- a/src/packs/items/weapons/weapon_Retractable_Saber_i8CqVTzqoRoCewNe.json +++ b/src/packs/items/weapons/weapon_Retractable_Saber_i8CqVTzqoRoCewNe.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 7, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Returning_Axe_FtsQGwOg3r8uUCST.json b/src/packs/items/weapons/weapon_Returning_Axe_FtsQGwOg3r8uUCST.json index 9f3cca62..76a887ae 100644 --- a/src/packs/items/weapons/weapon_Returning_Axe_FtsQGwOg3r8uUCST.json +++ b/src/packs/items/weapons/weapon_Returning_Axe_FtsQGwOg3r8uUCST.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 4, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Returning_Blade_4fQpVfQ3NVwTHStA.json b/src/packs/items/weapons/weapon_Returning_Blade_4fQpVfQ3NVwTHStA.json index efd81e48..74be4227 100644 --- a/src/packs/items/weapons/weapon_Returning_Blade_4fQpVfQ3NVwTHStA.json +++ b/src/packs/items/weapons/weapon_Returning_Blade_4fQpVfQ3NVwTHStA.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": null, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Ricochet_Axes_E9QDh5o9eQ1Qx0kH.json b/src/packs/items/weapons/weapon_Ricochet_Axes_E9QDh5o9eQ1Qx0kH.json index 34f3b200..1067bb02 100644 --- a/src/packs/items/weapons/weapon_Ricochet_Axes_E9QDh5o9eQ1Qx0kH.json +++ b/src/packs/items/weapons/weapon_Ricochet_Axes_E9QDh5o9eQ1Qx0kH.json @@ -78,8 +78,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 11, @@ -105,7 +105,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Round_Shield_mxwWKDujgsRcZWPT.json b/src/packs/items/weapons/weapon_Round_Shield_mxwWKDujgsRcZWPT.json index 55e92f01..47b096af 100644 --- a/src/packs/items/weapons/weapon_Round_Shield_mxwWKDujgsRcZWPT.json +++ b/src/packs/items/weapons/weapon_Round_Shield_mxwWKDujgsRcZWPT.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d4", "bonus": null, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", @@ -113,26 +113,26 @@ "name": "Protective", "description": "

Add the item's Tier to your Armor Score

", "img": "icons/skills/melee/shield-block-gray-orange.webp", - "_id": "eV4lFIpQMiKERj4U", + "changes": [ + { + "key": "system.armorScore", + "mode": 2, + "value": "ITEM.@system.tier", + "priority": null + } + ], + "_id": "M70a81e0Mg66jHRL", "type": "base", - "system": { - "changes": [ - { - "type": "armor", - "phase": "initial", - "priority": 20, - "value": { - "max": "ITEM.@system.tier" - } - } - ] - }, + "system": {}, "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "origin": null, "tint": "#ffffff", @@ -143,10 +143,7 @@ "_stats": { "compendiumSource": null }, - "start": null, - "showIcon": 1, - "folder": null, - "_key": "!items.effects!mxwWKDujgsRcZWPT.eV4lFIpQMiKERj4U" + "_key": "!items.effects!mxwWKDujgsRcZWPT.M70a81e0Mg66jHRL" } ], "sort": 0, 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 3a966fe0..e0676ed2 100644 --- a/src/packs/items/weapons/weapon_Runes_of_Ruination_EG6mZhr3ib56r974.json +++ b/src/packs/items/weapons/weapon_Runes_of_Ruination_EG6mZhr3ib56r974.json @@ -78,8 +78,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d20", "bonus": 4, @@ -105,7 +105,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Scepter_GZh345N8fmuS4Jeh.json b/src/packs/items/weapons/weapon_Scepter_GZh345N8fmuS4Jeh.json index f1e85577..04ce4c4b 100644 --- a/src/packs/items/weapons/weapon_Scepter_GZh345N8fmuS4Jeh.json +++ b/src/packs/items/weapons/weapon_Scepter_GZh345N8fmuS4Jeh.json @@ -11,8 +11,8 @@ "type": "attack", "damage": { "includeBase": false, - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -38,7 +38,7 @@ } } } - } + ] }, "range": "melee", "roll": { @@ -115,8 +115,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": null, @@ -142,7 +142,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Scepter_of_Elias_acPGwIaUhx3R0mTq.json b/src/packs/items/weapons/weapon_Scepter_of_Elias_acPGwIaUhx3R0mTq.json index f2c13441..8c8e50af 100644 --- a/src/packs/items/weapons/weapon_Scepter_of_Elias_acPGwIaUhx3R0mTq.json +++ b/src/packs/items/weapons/weapon_Scepter_of_Elias_acPGwIaUhx3R0mTq.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 3, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Shortbow_p9tdjQr2AZP19RYm.json b/src/packs/items/weapons/weapon_Shortbow_p9tdjQr2AZP19RYm.json index 56a791ba..82216a2d 100644 --- a/src/packs/items/weapons/weapon_Shortbow_p9tdjQr2AZP19RYm.json +++ b/src/packs/items/weapons/weapon_Shortbow_p9tdjQr2AZP19RYm.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 3, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Shortstaff_vHDHG3STcxTEfYAM.json b/src/packs/items/weapons/weapon_Shortstaff_vHDHG3STcxTEfYAM.json index 3dc3a137..0d468da8 100644 --- a/src/packs/items/weapons/weapon_Shortstaff_vHDHG3STcxTEfYAM.json +++ b/src/packs/items/weapons/weapon_Shortstaff_vHDHG3STcxTEfYAM.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 1, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Shortsword_cjGZpXCoshEqi1FI.json b/src/packs/items/weapons/weapon_Shortsword_cjGZpXCoshEqi1FI.json index 0ea874f8..84ae1a2a 100644 --- a/src/packs/items/weapons/weapon_Shortsword_cjGZpXCoshEqi1FI.json +++ b/src/packs/items/weapons/weapon_Shortsword_cjGZpXCoshEqi1FI.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": null, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Siphoning_Gauntlets_1N1jggda5DfdzdMj.json b/src/packs/items/weapons/weapon_Siphoning_Gauntlets_1N1jggda5DfdzdMj.json index 205aa4e0..0eb65689 100644 --- a/src/packs/items/weapons/weapon_Siphoning_Gauntlets_1N1jggda5DfdzdMj.json +++ b/src/packs/items/weapons/weapon_Siphoning_Gauntlets_1N1jggda5DfdzdMj.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 9, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Sledge_Axe_OxsEmffWriiQmqJK.json b/src/packs/items/weapons/weapon_Sledge_Axe_OxsEmffWriiQmqJK.json index d0230362..b5ffe457 100644 --- a/src/packs/items/weapons/weapon_Sledge_Axe_OxsEmffWriiQmqJK.json +++ b/src/packs/items/weapons/weapon_Sledge_Axe_OxsEmffWriiQmqJK.json @@ -20,8 +20,8 @@ "amount": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "applyTo": "stress", "value": { "custom": { @@ -46,7 +46,7 @@ "base": false, "type": [] } - }, + ], "includeBase": false }, "_id": "0qVTvNMfapVST3sQ", @@ -104,8 +104,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d12", "bonus": 13, @@ -131,7 +131,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Small_Dagger_wKklDxs5nkzILNp4.json b/src/packs/items/weapons/weapon_Small_Dagger_wKklDxs5nkzILNp4.json index 058d138e..5b63acd7 100644 --- a/src/packs/items/weapons/weapon_Small_Dagger_wKklDxs5nkzILNp4.json +++ b/src/packs/items/weapons/weapon_Small_Dagger_wKklDxs5nkzILNp4.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "type": [ "physical" ], @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Spear_TF85tKJetUjLwh54.json b/src/packs/items/weapons/weapon_Spear_TF85tKJetUjLwh54.json index a0ebc4ec..ea217ad9 100644 --- a/src/packs/items/weapons/weapon_Spear_TF85tKJetUjLwh54.json +++ b/src/packs/items/weapons/weapon_Spear_TF85tKJetUjLwh54.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 3, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Spiked_Bow_O1w8KPYH85ZS8X64.json b/src/packs/items/weapons/weapon_Spiked_Bow_O1w8KPYH85ZS8X64.json index 5421fc10..99faed64 100644 --- a/src/packs/items/weapons/weapon_Spiked_Bow_O1w8KPYH85ZS8X64.json +++ b/src/packs/items/weapons/weapon_Spiked_Bow_O1w8KPYH85ZS8X64.json @@ -11,8 +11,8 @@ "type": "attack", "damage": { "includeBase": false, - "parts": { - "hitPoints": { + "parts": [ + { "resultBased": false, "value": { "custom": { @@ -36,7 +36,7 @@ } } } - } + ] }, "range": "melee", "roll": { @@ -113,8 +113,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 7, @@ -140,7 +140,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Spiked_Shield_vzyzFwLUniWZV1rt.json b/src/packs/items/weapons/weapon_Spiked_Shield_vzyzFwLUniWZV1rt.json index 39c18b08..edadecf9 100644 --- a/src/packs/items/weapons/weapon_Spiked_Shield_vzyzFwLUniWZV1rt.json +++ b/src/packs/items/weapons/weapon_Spiked_Shield_vzyzFwLUniWZV1rt.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 2, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", @@ -113,31 +113,32 @@ "name": "Double Duty", "description": "+1 to Armor Score; +1 to primary weapon damage within Melee range", "img": "icons/skills/melee/sword-shield-stylized-white.webp", + "changes": [ + { + "key": "system.armorScore", + "mode": 2, + "value": "1" + }, + { + "key": "system.bonuses.damage.primaryWeapon.bonus", + "mode": 2, + "value": "1" + } + ], "system": { "rangeDependence": { "enabled": true, "range": "melee", "target": "hostile", "type": "withinRange" - }, - "changes": [ - { - "key": "system.bonuses.damage.primaryWeapon.bonus", - "type": "add", - "value": 1, - "phase": "initial", - "priority": 0 - } - ] + } }, "_id": "d3TJtlpoHBCztbom", "type": "base", "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null }, "origin": null, "tint": "#ffffff", @@ -148,49 +149,7 @@ "_stats": { "compendiumSource": null }, - "start": null, - "showIcon": 1, - "folder": null, "_key": "!items.effects!vzyzFwLUniWZV1rt.d3TJtlpoHBCztbom" - }, - { - "name": "Double Duty", - "description": "+1 to Armor Score; +1 to primary weapon damage within Melee range", - "img": "icons/skills/melee/sword-shield-stylized-white.webp", - "system": { - "changes": [ - { - "type": "armor", - "phase": "initial", - "priority": 20, - "value": { - "max": "1" - } - } - ] - }, - "_id": "mvUY9LGfwICak7cE", - "type": "base", - "disabled": false, - "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false - }, - "origin": null, - "tint": "#ffffff", - "transfer": true, - "statuses": [], - "sort": 0, - "flags": {}, - "_stats": { - "compendiumSource": null - }, - "start": null, - "showIcon": 1, - "folder": null, - "_key": "!items.effects!vzyzFwLUniWZV1rt.mvUY9LGfwICak7cE" } ], "sort": 0, diff --git a/src/packs/items/weapons/weapon_Steelforged_Halberd_6bkbw4Ap644KZGvJ.json b/src/packs/items/weapons/weapon_Steelforged_Halberd_6bkbw4Ap644KZGvJ.json index 1fccc471..c4730e94 100644 --- a/src/packs/items/weapons/weapon_Steelforged_Halberd_6bkbw4Ap644KZGvJ.json +++ b/src/packs/items/weapons/weapon_Steelforged_Halberd_6bkbw4Ap644KZGvJ.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 4, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Swinging_Ropeblade_1jOJHHKdtk3s2jaY.json b/src/packs/items/weapons/weapon_Swinging_Ropeblade_1jOJHHKdtk3s2jaY.json index cd9490f2..b8fe04b6 100644 --- a/src/packs/items/weapons/weapon_Swinging_Ropeblade_1jOJHHKdtk3s2jaY.json +++ b/src/packs/items/weapons/weapon_Swinging_Ropeblade_1jOJHHKdtk3s2jaY.json @@ -78,8 +78,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 9, @@ -105,7 +105,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Sword_of_Light___Flame_TVPCWnSELOVBv6G1.json b/src/packs/items/weapons/weapon_Sword_of_Light___Flame_TVPCWnSELOVBv6G1.json index 63112b3e..7a74cf3d 100644 --- a/src/packs/items/weapons/weapon_Sword_of_Light___Flame_TVPCWnSELOVBv6G1.json +++ b/src/packs/items/weapons/weapon_Sword_of_Light___Flame_TVPCWnSELOVBv6G1.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 11, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Talon_Blades_jlLtgK468rO5IssR.json b/src/packs/items/weapons/weapon_Talon_Blades_jlLtgK468rO5IssR.json index a7c96705..13542a63 100644 --- a/src/packs/items/weapons/weapon_Talon_Blades_jlLtgK468rO5IssR.json +++ b/src/packs/items/weapons/weapon_Talon_Blades_jlLtgK468rO5IssR.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 7, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Thistlebow_I1nDGpulg29GpWOW.json b/src/packs/items/weapons/weapon_Thistlebow_I1nDGpulg29GpWOW.json index 18f635eb..65fef12a 100644 --- a/src/packs/items/weapons/weapon_Thistlebow_I1nDGpulg29GpWOW.json +++ b/src/packs/items/weapons/weapon_Thistlebow_I1nDGpulg29GpWOW.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 13, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Tower_Shield_C9aWpK1shVMWP4m5.json b/src/packs/items/weapons/weapon_Tower_Shield_C9aWpK1shVMWP4m5.json index e584b63c..d49b7de7 100644 --- a/src/packs/items/weapons/weapon_Tower_Shield_C9aWpK1shVMWP4m5.json +++ b/src/packs/items/weapons/weapon_Tower_Shield_C9aWpK1shVMWP4m5.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": null, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", @@ -113,25 +113,25 @@ "name": "Barrier", "description": "Gain Weapon Tier + 1 to Armor Score; -1 to Evasion", "img": "icons/skills/melee/shield-block-bash-blue.webp", + "changes": [ + { + "key": "system.armorScore", + "mode": 2, + "value": "ITEM.@system.tier + 1" + }, + { + "key": "system.evasion", + "mode": 2, + "value": "-1" + } + ], "_id": "8r0TcKWXboFV0eqS", "type": "base", - "system": { - "changes": [ - { - "key": "system.evasion", - "type": "add", - "value": -1, - "phase": "initial", - "priority": 0 - } - ] - }, + "system": {}, "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null }, "origin": null, "tint": "#ffffff", @@ -142,49 +142,7 @@ "_stats": { "compendiumSource": null }, - "start": null, - "showIcon": 1, - "folder": null, "_key": "!items.effects!C9aWpK1shVMWP4m5.8r0TcKWXboFV0eqS" - }, - { - "name": "Barrier", - "description": "Gain Weapon Tier + 1 to Armor Score; -1 to Evasion", - "img": "icons/skills/melee/shield-block-bash-blue.webp", - "_id": "tLRc4UAnGuIq7er3", - "type": "base", - "system": { - "changes": [ - { - "type": "armor", - "phase": "initial", - "priority": 20, - "value": { - "max": "ITEM.@system.tier + 1" - } - } - ] - }, - "disabled": false, - "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false - }, - "origin": null, - "tint": "#ffffff", - "transfer": true, - "statuses": [], - "sort": 0, - "flags": {}, - "_stats": { - "compendiumSource": null - }, - "start": null, - "showIcon": 1, - "folder": null, - "_key": "!items.effects!C9aWpK1shVMWP4m5.tLRc4UAnGuIq7er3" } ], "sort": 0, diff --git a/src/packs/items/weapons/weapon_Urok_Broadsword_zGm6Wa1fGF6cECY5.json b/src/packs/items/weapons/weapon_Urok_Broadsword_zGm6Wa1fGF6cECY5.json index 6727c333..708e920f 100644 --- a/src/packs/items/weapons/weapon_Urok_Broadsword_zGm6Wa1fGF6cECY5.json +++ b/src/packs/items/weapons/weapon_Urok_Broadsword_zGm6Wa1fGF6cECY5.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 3, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Wand_ItWisJFNGMNWeaCV.json b/src/packs/items/weapons/weapon_Wand_ItWisJFNGMNWeaCV.json index 8084f261..35fc7866 100644 --- a/src/packs/items/weapons/weapon_Wand_ItWisJFNGMNWeaCV.json +++ b/src/packs/items/weapons/weapon_Wand_ItWisJFNGMNWeaCV.json @@ -41,8 +41,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 1, @@ -68,7 +68,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", 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 84c7b3f2..f2b2f308 100644 --- a/src/packs/items/weapons/weapon_Wand_of_Enthrallment_tP6vmnrmTq2h5sj7.json +++ b/src/packs/items/weapons/weapon_Wand_of_Enthrallment_tP6vmnrmTq2h5sj7.json @@ -85,8 +85,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 4, @@ -112,7 +112,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Wand_of_Essek_ZrRGNjGCgZTTfgDG.json b/src/packs/items/weapons/weapon_Wand_of_Essek_ZrRGNjGCgZTTfgDG.json index d788d008..23fb1003 100644 --- a/src/packs/items/weapons/weapon_Wand_of_Essek_ZrRGNjGCgZTTfgDG.json +++ b/src/packs/items/weapons/weapon_Wand_of_Essek_ZrRGNjGCgZTTfgDG.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 13, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_War_Scythe_z6yEdFYQJ5IzgTX3.json b/src/packs/items/weapons/weapon_War_Scythe_z6yEdFYQJ5IzgTX3.json index 0c57dd50..e80ddfad 100644 --- a/src/packs/items/weapons/weapon_War_Scythe_z6yEdFYQJ5IzgTX3.json +++ b/src/packs/items/weapons/weapon_War_Scythe_z6yEdFYQJ5IzgTX3.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d8", "bonus": 5, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Warhammer_ZXh1GQahBiODfSTC.json b/src/packs/items/weapons/weapon_Warhammer_ZXh1GQahBiODfSTC.json index a94950c7..50b1a829 100644 --- a/src/packs/items/weapons/weapon_Warhammer_ZXh1GQahBiODfSTC.json +++ b/src/packs/items/weapons/weapon_Warhammer_ZXh1GQahBiODfSTC.json @@ -49,8 +49,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d12", "bonus": 3, @@ -76,7 +76,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Whip_CmtWqw6DwoePnX7W.json b/src/packs/items/weapons/weapon_Whip_CmtWqw6DwoePnX7W.json index 287d8afe..2e548ab6 100644 --- a/src/packs/items/weapons/weapon_Whip_CmtWqw6DwoePnX7W.json +++ b/src/packs/items/weapons/weapon_Whip_CmtWqw6DwoePnX7W.json @@ -78,8 +78,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": null, @@ -105,7 +105,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Widogast_Pendant_8Z5QrThfwkYPXNco.json b/src/packs/items/weapons/weapon_Widogast_Pendant_8Z5QrThfwkYPXNco.json index 44e4dfd6..a03efe6b 100644 --- a/src/packs/items/weapons/weapon_Widogast_Pendant_8Z5QrThfwkYPXNco.json +++ b/src/packs/items/weapons/weapon_Widogast_Pendant_8Z5QrThfwkYPXNco.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d10", "bonus": 5, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/items/weapons/weapon_Yutari_Bloodbow_0XpSBYXxtywvBFQi.json b/src/packs/items/weapons/weapon_Yutari_Bloodbow_0XpSBYXxtywvBFQi.json index 17e02976..d07a986e 100644 --- a/src/packs/items/weapons/weapon_Yutari_Bloodbow_0XpSBYXxtywvBFQi.json +++ b/src/packs/items/weapons/weapon_Yutari_Bloodbow_0XpSBYXxtywvBFQi.json @@ -71,8 +71,8 @@ "useDefault": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "dice": "d6", "bonus": 4, @@ -98,7 +98,7 @@ }, "base": false } - }, + ], "includeBase": false }, "description": "", diff --git a/src/packs/subclasses/feature_Act_of_Reprisal_k7vvMJtEcxMWUUrW.json b/src/packs/subclasses/feature_Act_of_Reprisal_k7vvMJtEcxMWUUrW.json index 5dee0c1c..304bd29c 100644 --- a/src/packs/subclasses/feature_Act_of_Reprisal_k7vvMJtEcxMWUUrW.json +++ b/src/packs/subclasses/feature_Act_of_Reprisal_k7vvMJtEcxMWUUrW.json @@ -59,19 +59,13 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [], - "duration": { - "type": "temporary", - "description": "

Until the next successful attack you make against that adversary.

" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null }, "description": "", "tint": "#ffffff", @@ -81,16 +75,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!k7vvMJtEcxMWUUrW.9Uo0yOYGn3vandPp" } ], diff --git a/src/packs/subclasses/feature_Battle_Bonded_hWsKyed1vfILg0I8.json b/src/packs/subclasses/feature_Battle_Bonded_hWsKyed1vfILg0I8.json index 578be0a3..106b0057 100644 --- a/src/packs/subclasses/feature_Battle_Bonded_hWsKyed1vfILg0I8.json +++ b/src/packs/subclasses/feature_Battle_Bonded_hWsKyed1vfILg0I8.json @@ -26,28 +26,27 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.evasion", - "value": 2, - "priority": null, - "type": "add" - } - ], - "duration": { - "type": "", - "description": "

Against the attack.

" } }, "_id": "IZhakv6EuG8DO4a3", "img": "icons/creatures/mammals/humanoid-wolf-dog-blue.webp", + "changes": [ + { + "key": "system.evasion", + "mode": 2, + "value": "2", + "priority": null + } + ], "disabled": true, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "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, @@ -59,16 +58,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!hWsKyed1vfILg0I8.IZhakv6EuG8DO4a3" } ], diff --git a/src/packs/subclasses/feature_Battle_Ritual_qqb5acyUSl1sCpWW.json b/src/packs/subclasses/feature_Battle_Ritual_qqb5acyUSl1sCpWW.json index 2b012aee..6dee9f9d 100644 --- a/src/packs/subclasses/feature_Battle_Ritual_qqb5acyUSl1sCpWW.json +++ b/src/packs/subclasses/feature_Battle_Ritual_qqb5acyUSl1sCpWW.json @@ -23,8 +23,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -49,7 +49,7 @@ }, "type": [] }, - "hope": { + { "value": { "custom": { "enabled": true, @@ -74,7 +74,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/subclasses/feature_Clarity_of_Nature_etaQ01yGJhBLDUqZ.json b/src/packs/subclasses/feature_Clarity_of_Nature_etaQ01yGJhBLDUqZ.json index 886f0b61..09d6f953 100644 --- a/src/packs/subclasses/feature_Clarity_of_Nature_etaQ01yGJhBLDUqZ.json +++ b/src/packs/subclasses/feature_Clarity_of_Nature_etaQ01yGJhBLDUqZ.json @@ -22,8 +22,8 @@ "recovery": "longRest" }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -48,7 +48,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/subclasses/feature_Dark_Cloud_frBTtNMX9Y2gkuPz.json b/src/packs/subclasses/feature_Dark_Cloud_frBTtNMX9Y2gkuPz.json index d0bd5c22..95534b9f 100644 --- a/src/packs/subclasses/feature_Dark_Cloud_frBTtNMX9Y2gkuPz.json +++ b/src/packs/subclasses/feature_Dark_Cloud_frBTtNMX9Y2gkuPz.json @@ -22,7 +22,7 @@ "recovery": null }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/subclasses/feature_Elemental_Aura_2JH9NaOh69yN80Gw.json b/src/packs/subclasses/feature_Elemental_Aura_2JH9NaOh69yN80Gw.json index 7a3ebd91..7dbae2f6 100644 --- a/src/packs/subclasses/feature_Elemental_Aura_2JH9NaOh69yN80Gw.json +++ b/src/packs/subclasses/feature_Elemental_Aura_2JH9NaOh69yN80Gw.json @@ -22,8 +22,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -48,7 +48,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -134,7 +134,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/subclasses/feature_Elemental_Dominion_EFUJHrkTuyv8uA9l.json b/src/packs/subclasses/feature_Elemental_Dominion_EFUJHrkTuyv8uA9l.json index 2476046c..4297173f 100644 --- a/src/packs/subclasses/feature_Elemental_Dominion_EFUJHrkTuyv8uA9l.json +++ b/src/packs/subclasses/feature_Elemental_Dominion_EFUJHrkTuyv8uA9l.json @@ -189,18 +189,18 @@ "type": "withinRange", "target": "hostile", "range": "veryFar" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

When an attack against you succeeds, you can mark a Stress to make the attacker temporarily Vulnerable.

", "tint": "#ffffff", @@ -212,16 +212,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!EFUJHrkTuyv8uA9l.bGwFZZT4juuaIRmZ" }, { diff --git a/src/packs/subclasses/feature_Elemental_Incarnation_f37TTgCc0Q3Ih1A1.json b/src/packs/subclasses/feature_Elemental_Incarnation_f37TTgCc0Q3Ih1A1.json index 45ffde60..30ffb50b 100644 --- a/src/packs/subclasses/feature_Elemental_Incarnation_f37TTgCc0Q3Ih1A1.json +++ b/src/packs/subclasses/feature_Elemental_Incarnation_f37TTgCc0Q3Ih1A1.json @@ -29,8 +29,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -56,7 +56,7 @@ } } } - }, + ], "includeBase": false }, "target": { @@ -148,8 +148,8 @@ "recovery": null }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -174,7 +174,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/subclasses/feature_Elusive_Predator_Cjtc43V3IzAmfIFG.json b/src/packs/subclasses/feature_Elusive_Predator_Cjtc43V3IzAmfIFG.json index 82cd55a0..18f80cdb 100644 --- a/src/packs/subclasses/feature_Elusive_Predator_Cjtc43V3IzAmfIFG.json +++ b/src/packs/subclasses/feature_Elusive_Predator_Cjtc43V3IzAmfIFG.json @@ -26,28 +26,27 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.evasion", - "value": 2, - "priority": null, - "type": "add" - } - ], - "duration": { - "type": "", - "description": "

Against the attack.

" } }, "_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": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "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, @@ -59,16 +58,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!Cjtc43V3IzAmfIFG.X4llFOcAcdJLbear" } ], diff --git a/src/packs/subclasses/feature_Gifted_Performer_99U7YWNCxFZHCiT0.json b/src/packs/subclasses/feature_Gifted_Performer_99U7YWNCxFZHCiT0.json index f65cd041..f53f7c31 100644 --- a/src/packs/subclasses/feature_Gifted_Performer_99U7YWNCxFZHCiT0.json +++ b/src/packs/subclasses/feature_Gifted_Performer_99U7YWNCxFZHCiT0.json @@ -21,8 +21,8 @@ "recovery": "longRest" }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -47,7 +47,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -115,8 +115,8 @@ "recovery": "longRest" }, "damage": { - "parts": { - "hope": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -141,7 +141,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -180,7 +180,7 @@ "effects": [ { "name": "Epic Song", - "img": "icons/tools/instruments/harp-yellow-teal.webp", + "img": "icons/svg/ice-aura.svg", "origin": "Compendium.daggerheart.subclasses.Item.6j1RP4fz3BwSfoli", "transfer": false, "_id": "FK4IdbxluRErfYor", @@ -191,18 +191,18 @@ "type": "withinRange", "target": "hostile", "range": "close" - }, - "changes": [], - "duration": { - "type": "temporary" } }, + "changes": [], "disabled": false, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, "description": "

Make a target within Close range temporarily Vulnerable.

", "tint": "#ffffff", @@ -214,16 +214,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!99U7YWNCxFZHCiT0.FK4IdbxluRErfYor" } ], diff --git a/src/packs/subclasses/feature_Honed_Expertise_w1BwNKxbQOSizLmZ.json b/src/packs/subclasses/feature_Honed_Expertise_w1BwNKxbQOSizLmZ.json index 48973ad9..1fad2396 100644 --- a/src/packs/subclasses/feature_Honed_Expertise_w1BwNKxbQOSizLmZ.json +++ b/src/packs/subclasses/feature_Honed_Expertise_w1BwNKxbQOSizLmZ.json @@ -23,7 +23,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/subclasses/feature_Natural_Evasion_TnuLBtHQGbqyzn82.json b/src/packs/subclasses/feature_Natural_Evasion_TnuLBtHQGbqyzn82.json index 517e1fe1..628fabed 100644 --- a/src/packs/subclasses/feature_Natural_Evasion_TnuLBtHQGbqyzn82.json +++ b/src/packs/subclasses/feature_Natural_Evasion_TnuLBtHQGbqyzn82.json @@ -31,7 +31,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/subclasses/feature_Regeneration_KRyrbSLVGreIOTZe.json b/src/packs/subclasses/feature_Regeneration_KRyrbSLVGreIOTZe.json index ab748169..b7c39f2a 100644 --- a/src/packs/subclasses/feature_Regeneration_KRyrbSLVGreIOTZe.json +++ b/src/packs/subclasses/feature_Regeneration_KRyrbSLVGreIOTZe.json @@ -29,8 +29,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": false @@ -54,7 +54,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/subclasses/feature_Revenge_oNfA5F9cKwNR7joq.json b/src/packs/subclasses/feature_Revenge_oNfA5F9cKwNR7joq.json index b7e2e8b9..f663201d 100644 --- a/src/packs/subclasses/feature_Revenge_oNfA5F9cKwNR7joq.json +++ b/src/packs/subclasses/feature_Revenge_oNfA5F9cKwNR7joq.json @@ -29,8 +29,8 @@ "recovery": null }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -55,7 +55,7 @@ } } } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/subclasses/feature_Rousing_Speech_PCmYTX02JLzBpgml.json b/src/packs/subclasses/feature_Rousing_Speech_PCmYTX02JLzBpgml.json index ab7b4972..f1596519 100644 --- a/src/packs/subclasses/feature_Rousing_Speech_PCmYTX02JLzBpgml.json +++ b/src/packs/subclasses/feature_Rousing_Speech_PCmYTX02JLzBpgml.json @@ -21,8 +21,8 @@ "recovery": "longRest" }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -47,7 +47,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/subclasses/feature_Sparing_Touch_GfOSgVJW8bS1OjNq.json b/src/packs/subclasses/feature_Sparing_Touch_GfOSgVJW8bS1OjNq.json index 86de0fe8..deb4af6b 100644 --- a/src/packs/subclasses/feature_Sparing_Touch_GfOSgVJW8bS1OjNq.json +++ b/src/packs/subclasses/feature_Sparing_Touch_GfOSgVJW8bS1OjNq.json @@ -39,8 +39,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -65,7 +65,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { @@ -116,8 +116,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "stress": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -142,7 +142,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/src/packs/subclasses/feature_Thrive_in_Chaos_1nmFmkNXY6OYyyju.json b/src/packs/subclasses/feature_Thrive_in_Chaos_1nmFmkNXY6OYyyju.json index b65184e9..bbdd8707 100644 --- a/src/packs/subclasses/feature_Thrive_in_Chaos_1nmFmkNXY6OYyyju.json +++ b/src/packs/subclasses/feature_Thrive_in_Chaos_1nmFmkNXY6OYyyju.json @@ -31,7 +31,7 @@ "consumeOnSuccess": false }, "damage": { - "parts": {}, + "parts": [], "includeBase": false }, "target": { diff --git a/src/packs/subclasses/feature_Transcendence_th6HZwEFnVBjUtqm.json b/src/packs/subclasses/feature_Transcendence_th6HZwEFnVBjUtqm.json index c03c10b5..5f2df7cb 100644 --- a/src/packs/subclasses/feature_Transcendence_th6HZwEFnVBjUtqm.json +++ b/src/packs/subclasses/feature_Transcendence_th6HZwEFnVBjUtqm.json @@ -58,29 +58,29 @@ "type": "withinRange", "target": "hostile", "range": "melee" - }, - "changes": [ - { - "key": "system.damageThresholds.severe", - "value": "+4", - "priority": null, - "type": "add" - } - ], - "duration": { - "type": "" } }, "_id": "zFOpzO3tBJPcZcRc", "img": "icons/magic/fire/elemental-fire-flying.webp", + "changes": [ + { + "key": "system.damageThresholds.severe", + "mode": 2, + "value": "+4", + "priority": null + } + ], "disabled": true, "duration": { - "value": null, - "units": "seconds", - "expiry": null, - "expired": false + "startTime": null, + "combat": null, + "seconds": null, + "rounds": null, + "turns": null, + "startRound": null, + "startTurn": null }, - "description": "

+4 bonus to your Severe threshold

", + "description": "

+4 bonus to your Severe threshold

", "origin": null, "tint": "#ffffff", "transfer": true, @@ -90,16 +90,6 @@ "_stats": { "compendiumSource": null }, - "start": { - "time": 0, - "combat": null, - "combatant": null, - "initiative": null, - "round": null, - "turn": null - }, - "showIcon": 1, - "folder": null, "_key": "!items.effects!th6HZwEFnVBjUtqm.zFOpzO3tBJPcZcRc" }, { diff --git a/src/packs/subclasses/feature_Warden_s_Protection_2F1bUFY80oce97C9.json b/src/packs/subclasses/feature_Warden_s_Protection_2F1bUFY80oce97C9.json index 0c6ad3e3..e80a770a 100644 --- a/src/packs/subclasses/feature_Warden_s_Protection_2F1bUFY80oce97C9.json +++ b/src/packs/subclasses/feature_Warden_s_Protection_2F1bUFY80oce97C9.json @@ -23,8 +23,8 @@ "consumeOnSuccess": false }, "damage": { - "parts": { - "hitPoints": { + "parts": [ + { "value": { "custom": { "enabled": true, @@ -49,7 +49,7 @@ }, "type": [] } - }, + ], "includeBase": false }, "target": { diff --git a/styles/less/dialog/damage-reduction/damage-reduction-container.less b/styles/less/dialog/damage-reduction/damage-reduction-container.less index e8242bdd..2f343fb3 100644 --- a/styles/less/dialog/damage-reduction/damage-reduction-container.less +++ b/styles/less/dialog/damage-reduction/damage-reduction-container.less @@ -35,10 +35,7 @@ display: flex; flex-direction: column; align-items: center; - - &.full-width { - width: 100%; - } + width: 100%; } .padded { @@ -48,7 +45,6 @@ .armor-title { margin: 0; white-space: nowrap; - width: 100%; } .resources-container { @@ -66,17 +62,12 @@ .mark-selection { display: flex; - flex-direction: column; + align-items: center; width: 100%; margin: 0; - h4 { - margin: 0; - } - .mark-selection-inner { display: flex; - justify-content: center; gap: 8px; .mark-container { @@ -100,19 +91,6 @@ opacity: 0.2; } - &.spent { - ::after { - position: absolute; - content: '/'; - color: red; - font-weight: 700; - font-size: 1.8em; - left: -1px; - top: -7px; - rotate: 13deg; - } - } - .fa-shield { position: relative; right: 0.5px; diff --git a/styles/less/dialog/dice-roll/roll-selection.less b/styles/less/dialog/dice-roll/roll-selection.less index a1a01e6b..7fdae77a 100644 --- a/styles/less/dialog/dice-roll/roll-selection.less +++ b/styles/less/dialog/dice-roll/roll-selection.less @@ -69,6 +69,29 @@ background: light-dark(@dark-blue-40, @golden-40); } } + + .tag-team-controller { + display: flex; + align-items: center; + border-radius: 5px; + width: fit-content; + gap: 5px; + cursor: pointer; + padding: 5px; + background: light-dark(@dark-blue-10, @golden-10); + color: light-dark(@dark-blue, @golden); + + .label { + font-style: normal; + font-weight: 400; + font-size: var(--font-size-14); + line-height: 17px; + } + + &.selected { + background: light-dark(@dark-blue-40, @golden-40); + } + } } .roll-dialog-container { diff --git a/styles/less/dialog/index.less b/styles/less/dialog/index.less index 73738eaa..0c70df9f 100644 --- a/styles/less/dialog/index.less +++ b/styles/less/dialog/index.less @@ -32,8 +32,6 @@ @import './reroll-dialog/sheet.less'; @import './group-roll/group-roll.less'; - -@import './tag-team-dialog/initialization.less'; @import './tag-team-dialog/sheet.less'; @import './image-select/sheet.less'; diff --git a/styles/less/dialog/tag-team-dialog/initialization.less b/styles/less/dialog/tag-team-dialog/initialization.less deleted file mode 100644 index 30676f82..00000000 --- a/styles/less/dialog/tag-team-dialog/initialization.less +++ /dev/null @@ -1,59 +0,0 @@ -.daggerheart.dialog.dh-style.views.tag-team-dialog { - .initialization-container { - h2 { - text-align: center; - } - - .members-container { - display: grid; - grid-template-columns: 1fr 1fr 1fr 1fr; - gap: 8px; - - .member-container { - position: relative; - display: flex; - justify-content: center; - - &.inactive { - opacity: 0.4; - } - - .member-name { - position: absolute; - } - } - } - - .initiator-container { - margin-top: 8px; - display: grid; - grid-template-columns: 1fr 1fr; - gap: 8px; - - &.inactive { - opacity: 0.4; - } - } - - footer { - margin-top: 8px; - display: flex; - gap: 8px; - - button { - flex: 1; - } - - .finish-tools { - flex: none; - display: flex; - align-items: center; - gap: 4px; - - &.inactive { - opacity: 0.4; - } - } - } - } -} diff --git a/styles/less/dialog/tag-team-dialog/sheet.less b/styles/less/dialog/tag-team-dialog/sheet.less index dc8f16dc..767c66ca 100644 --- a/styles/less/dialog/tag-team-dialog/sheet.less +++ b/styles/less/dialog/tag-team-dialog/sheet.less @@ -1,272 +1,178 @@ .daggerheart.dialog.dh-style.views.tag-team-dialog { - .team-container { - display: flex; - gap: 16px; - margin-bottom: 16px; - - .team-member-container { - display: flex; - flex-direction: column; - justify-content: space-between; - gap: 8px; - flex: 1; - - &.select-padding { - padding-bottom: 64px; - } - - &.inactive { - opacity: 0.4; - pointer-events: none; - } - - .data-container { - display: flex; - flex-direction: column; - gap: 8px; - width: 100%; - } - - .member-info { - display: flex; - align-items: center; - justify-content: space-between; - width: 100%; - - img { - height: 64px; - border-radius: 6px; - border: 1px solid light-dark(@dark-blue, @golden); - } - - .member-name { - flex: 1; - text-align: center; - font-size: var(--font-size-18); - } - } - - .roll-setup { - width: 100%; - } - - .roll-container { - display: flex; - flex-direction: column; - } - - .roll-title { - font-size: var(--font-size-20); - font-weight: bold; - color: light-dark(@dark-blue, @golden); - text-align: center; - display: flex; - align-items: center; - gap: 8px; - - &::before, - &::after { - color: light-dark(@dark-blue, @golden); - content: ''; - flex: 1; - height: 2px; - } - - &::before { - background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, light-dark(@dark-blue, @golden) 100%); - } - - &::after { - background: linear-gradient(90deg, light-dark(@dark-blue, @golden) 0%, rgba(0, 0, 0, 0) 100%); - } - } - - .roll-tools { - display: flex; - gap: 4px; - align-items: center; - - img { - height: 16px; - } - - a { - display: flex; - font-size: 16px; - - &:hover { - text-shadow: none; - filter: drop-shadow(0 0 8px var(--golden)); - } - } - } - - .roll-data { - display: flex; - flex-direction: column; - align-items: center; - gap: 4px; - - &.hope { - --text-color: @golden; - --bg-color: @golden-40; - } - - &.fear { - --text-color: @chat-blue; - --bg-color: @chat-blue-40; - } - - &.critical { - --text-color: @chat-purple; - --bg-color: @chat-purple-40; - } - - .duality-label { - color: var(--text-color); - font-size: var(--font-size-20); - font-weight: bold; - text-align: center; - - .unused-damage { - text-decoration: line-through; - } - } - - .roll-dice-container { - display: flex; - align-items: center; - justify-content: center; - flex-wrap: wrap; - gap: 8px; - - .roll-dice { - position: relative; - display: flex; - align-items: center; - justify-content: center; - - .dice-label { - position: absolute; - color: white; - font-size: 1rem; - paint-order: stroke fill; - -webkit-text-stroke: 2px black; - } - - img { - height: 32px; - } - } - - .roll-operator { - font-size: var(--font-size-24); - } - - .roll-value { - font-size: 18px; - } - } - - .roll-total { - background: var(--bg-color); - color: var(--text-color); - border-radius: 4px; - padding: 3px; - } - } - } - } - - .roll-selection { - position: relative; - top: -80px; - - &.rendered { - margin-bottom: -56px; - } - - .roll-selection-container { - display: flex; - - .select-roll-button { - margin-top: 8px; - flex: 1; - display: flex; - justify-content: center; - - i { - color: light-dark(@dark-blue, @golden); - font-size: 48px; - - &.inactive { - opacity: 0.4; - } - } - } - } - } - - .tag-team-roll-container { + .tag-team-container { display: flex; flex-direction: column; gap: 16px; - &.inactive { - opacity: 0.4; - pointer-events: none; - } - - .results-container { + .tag-team-data-container { display: flex; - flex-direction: column; align-items: center; - gap: 4px; - border: 2px solid light-dark(@dark-blue, @golden); - border-radius: 6px; - padding: 8px 10px; + gap: 8px; - .result-container-label { - font-size: var(--font-size-24); - font-weight: bold; - } + .form-group { + flex: 0; - .results-inner-container { - display: flex; - justify-content: space-between; - gap: 8px; - width: 100%; - - .result-section-label { - font-size: var(--font-size-20); + label { + white-space: nowrap; } - .result-container { - width: 100%; - text-align: center; + &.flex-group { + flex: 1; + } + } + } - .result-info { + .title-row { + display: flex; + align-items: center; + gap: 8px; + + h2 { + text-align: start; + } + + select { + flex: 1; + } + } + + .participants-container { + margin-top: 8px; + display: flex; + flex-direction: column; + gap: 4px; + + .participant-outer-container { + padding: 8px; + display: flex; + flex-direction: column; + gap: 4px; + cursor: pointer; + border-radius: 6px; + + &.selected, + &:hover { + background-color: light-dark(@golden-40, @golden-40); + } + + .participant-container { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + + .participant-inner-container { + flex: 1; display: flex; + align-items: center; gap: 4px; + + img { + height: 48px; + width: 48px; + border-radius: 50%; + } + + .participant-labels { + display: flex; + flex-direction: column; + gap: 2px; + + .participant-label-title { + font-size: 18px; + } + + .participant-label-info { + display: flex; + gap: 4px; + + .participant-label-info-part { + border: 1px solid light-dark(white, white); + border-radius: 4px; + padding: 2px 4px; + background-color: light-dark(@beige-80, @soft-white-shadow); + color: white; + } + } + } + } + } + + .participant-empty-roll-container { + border: 1px dashed white; + padding: 8px 2px; + text-align: center; + font-style: italic; + } + + .participant-roll-outer-container { + display: flex; + flex-direction: column; + gap: 2px; + color: light-dark(@dark-blue, @golden); + + h4 { + text-align: center; + color: light-dark(@dark-blue, @golden); + } + + .participant-roll-container { + display: flex; align-items: center; justify-content: center; + white-space: nowrap; + + .participant-roll-text-container { + padding: 0 8px; + white-space: nowrap; + display: flex; + } + } + + .damage-values-container { + display: flex; + justify-content: space-around; + gap: 8px; + + .damage-container { + border: 1px solid light-dark(white, white); + border-radius: 6px; + padding: 0 4px; + display: flex; + gap: 4px; + } } } } } - .finish-container { - gap: 16px; - display: grid; - grid-template-columns: 1fr 1fr 1fr; + h2 { + text-align: center; + } - .finish-button { - grid-column: span 2; + .result-container { + display: grid; + grid-template-columns: 1fr 1fr; + align-items: center; + gap: 8px; + + .result-damages-container { + display: flex; + flex-wrap: wrap; + gap: 4px; + + .result-damage-container { + border: 1px solid light-dark(white, white); + border-radius: 6px; + padding: 0 4px; + } } } - } - .hint { - text-align: center; + .roll-leader-container { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 8px; + } } } diff --git a/styles/less/global/elements.less b/styles/less/global/elements.less index 793c8164..beffefbb 100755 --- a/styles/less/global/elements.less +++ b/styles/less/global/elements.less @@ -293,20 +293,6 @@ } } - &.optional, - &.one-column.optional { - padding-top: 0; - padding-bottom: 4px; - min-height: auto; - row-gap: 0; - - legend { - display: flex; - align-items: center; - padding-left: 3px; - } - } - .list-w-img { padding: 5px; label { @@ -347,15 +333,6 @@ legend { font-weight: bold; color: light-dark(@dark-blue, @golden); - - &.with-icon { - display: flex; - align-items: center; - - i { - padding: 0 4px; - } - } } input[type='text'], @@ -483,10 +460,6 @@ &.even { grid-template-columns: 1fr 1fr; } - - &.full-width { - width: 100%; - } } .three-columns { diff --git a/styles/less/global/sheet.less b/styles/less/global/sheet.less index 6f77a481..1e7bad0a 100755 --- a/styles/less/global/sheet.less +++ b/styles/less/global/sheet.less @@ -14,7 +14,11 @@ body.game:is(.performance-low, .noblur) { .themed.theme-dark .application.daggerheart.sheet.dh-style, .themed.theme-dark.application.daggerheart.sheet.dh-style, &.theme-dark .application.daggerheart { - background: @dark-blue; + &.adversary, + &.character, + &.item { + background: @dark-blue; + } } } diff --git a/styles/less/sheets/activeEffects/activeEffects.less b/styles/less/sheets/activeEffects/activeEffects.less deleted file mode 100644 index e4f5c541..00000000 --- a/styles/less/sheets/activeEffects/activeEffects.less +++ /dev/null @@ -1,90 +0,0 @@ -.application.sheet.daggerheart.dh-style.active-effect-config { - .custom-duration-section { - width: 100%; - display: flex; - flex-direction: column; - gap: 10px; - overflow: hidden; - height: 0; - transition: height ease-in-out 0.3s; - - &.visible { - height: auto; - } - } - - .duration-description { - height: 0; - overflow: hidden; - transition: height ease-in-out 0.3s; - - &.visible { - height: 100px; - } - } - - .tab.changes { - gap: 0; - - header { - div { - text-align: center; - } - } - - .armor-change-container { - header { - padding: 0; - left: -0.25rem; // TODO: Find why this header is offset 0.25rem to the right so this can be removed. - } - - header, - ol { - grid-template-columns: 5rem 7rem 12rem 4rem; - } - - .damage-thresholds-container { - width: 100%; - display: flex; - flex-direction: column; - gap: 4px; - - .damage-threshold-title { - display: flex; - align-items: center; - justify-content: center; - gap: 8px; - - &::before, - &::after { - content: ''; - flex: 1; - height: 2px; - } - - &::before { - background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, light-dark(@dark-blue, @golden) 100%); - } - - &::after { - background: linear-gradient(90deg, light-dark(@dark-blue, @golden) 0%, rgba(0, 0, 0, 0) 100%); - } - - span { - font-size: var(--font-size-18); - } - } - - .form-group { - flex-direction: column; - gap: 0; - - label { - color: inherit; - line-height: 16px; - } - } - } - } - } -} diff --git a/styles/less/sheets/actors/character/sidebar.less b/styles/less/sheets/actors/character/sidebar.less index 8bbede76..04baf2b9 100644 --- a/styles/less/sheets/actors/character/sidebar.less +++ b/styles/less/sheets/actors/character/sidebar.less @@ -276,23 +276,6 @@ } } - .slot-label { - .slot-value-container { - position: relative; - display: flex; - align-items: center; - justify-content: center; - width: 100%; - - i { - position: absolute; - right: 0; - font-size: 12px; - color: light-dark(@beige, @dark-blue); - } - } - } - .status-value { padding: 0 5px; } @@ -315,12 +298,6 @@ border-radius: 3px; background: light-dark(@dark-blue, @golden); clip-path: none; - cursor: pointer; - display: flex; - align-items: center; - gap: 4px; - border: 1px solid transparent; - transition: all 0.3s ease; h4 { font-weight: bold; @@ -329,21 +306,6 @@ color: light-dark(@beige, @dark-blue); font-size: var(--font-size-12); } - - i { - font-size: 12px; - color: light-dark(@beige, @dark-blue); - } - - &:hover { - background: light-dark(@light-black, @dark-blue); - border: 1px solid light-dark(@dark-blue, @golden); - - h4, - i { - color: light-dark(@dark-blue, @golden); - } - } } .slot-value { position: absolute; @@ -393,19 +355,6 @@ font-size: var(--font-size-12); flex-wrap: wrap; justify-content: center; - border: 1px solid transparent; - transition: all 0.3s ease; - - &:hover { - background: light-dark(@light-black, @dark-blue); - border: 1px solid light-dark(@dark-blue, @golden); - - .label, - .value, - i { - color: light-dark(@dark-blue, @golden); - } - } .label { padding-right: 1px; diff --git a/styles/less/sheets/actors/party/sheet.less b/styles/less/sheets/actors/party/sheet.less index 6b51de53..2d1344e8 100644 --- a/styles/less/sheets/actors/party/sheet.less +++ b/styles/less/sheets/actors/party/sheet.less @@ -7,12 +7,8 @@ background-image: url('../assets/parchments/dh-parchment-dark.png'); } }, { - &.sheet.actor.dh-style.party { + &.party { background: url('../assets/parchments/dh-parchment-light.png'); - - .tab .actions-section .active-action { - animation: glow-dark 0.75s infinite alternate; - } } }); @@ -44,10 +40,6 @@ font-size: 12px; } } - - .active-action { - animation: glow 0.75s infinite alternate; - } } } } diff --git a/styles/less/sheets/index.less b/styles/less/sheets/index.less index e5ffbf3e..1bdb451a 100644 --- a/styles/less/sheets/index.less +++ b/styles/less/sheets/index.less @@ -42,5 +42,3 @@ @import './rollTables/sheet.less'; @import './actions/actions.less'; - -@import './activeEffects/activeEffects.less'; diff --git a/styles/less/ui/effects-display/sheet.less b/styles/less/ui/effects-display/sheet.less index 17d9889f..1331b094 100644 --- a/styles/less/ui/effects-display/sheet.less +++ b/styles/less/ui/effects-display/sheet.less @@ -35,21 +35,6 @@ color: @golden; filter: drop-shadow(0 0 3px black); } - - .stacking-value { - position: absolute; - top: 4px; - right: 4px; - font-size: 16px; - font-weight: bold; - font-variant-numeric: tabular-nums; - color: @golden; - background: black; - padding: 1px; - border-radius: 6px; - border: 1px solid @golden; - pointer-events: none; - } } } } diff --git a/styles/less/ui/scene-config/scene-config.less b/styles/less/ui/scene-config/scene-config.less index ba1afb0b..664e7526 100644 --- a/styles/less/ui/scene-config/scene-config.less +++ b/styles/less/ui/scene-config/scene-config.less @@ -13,8 +13,6 @@ .application.sheet.scene-config { .sheet-tabs.tabs { - font-size: 12px; - a[data-tab='dh'] { display: flex; align-items: center; diff --git a/styles/less/ux/index.less b/styles/less/ux/index.less index a73f2d1c..a14b3e8b 100644 --- a/styles/less/ux/index.less +++ b/styles/less/ux/index.less @@ -1,6 +1,5 @@ @import './tooltip/sheet.less'; @import './tooltip/tooltip.less'; -@import './tooltip/armorManagement.less'; @import './tooltip/battlepoints.less'; @import './tooltip/bordered-tooltip.less'; @import './tooltip/domain-cards.less'; diff --git a/styles/less/ux/tooltip/armorManagement.less b/styles/less/ux/tooltip/armorManagement.less deleted file mode 100644 index e1ac6bb9..00000000 --- a/styles/less/ux/tooltip/armorManagement.less +++ /dev/null @@ -1,141 +0,0 @@ -@import '../../utils/fonts.less'; -@import '../../utils/colors.less'; - -.bordered-tooltip.locked-tooltip .daggerheart.armor-management-container { - display: flex; - flex-direction: column; - gap: 10px; - padding-bottom: 10px; - - h3 { - font-family: @font-subtitle; - margin: 0; - border: none; - font-weight: normal; - font-size: var(--font-size-20); - } - - .armor-source-container { - display: flex; - flex-direction: column; - align-items: center; - gap: 4px; - - .armor-source-label { - font-family: @font-body; - margin: 0; - } - - .status-bar { - display: flex; - justify-content: center; - position: relative; - width: 100%; - height: 30px; - - .status-value { - position: absolute; - display: flex; - padding: 0 5px; - font-size: 1rem; - align-items: center; - width: 100%; - height: 30px; - justify-content: center; - text-align: center; - z-index: 2; - color: @beige; - - input[type='number'] { - background: transparent; - font-size: 1.2rem; - width: 30px; - text-align: center; - border: none; - outline: 2px solid transparent; - color: @beige; - font-family: @font-body; - - &.bar-input { - padding: 0; - color: @beige; - backdrop-filter: none; - background: transparent; - transition: all 0.3s ease; - height: 25px; - - &:hover, - &:focus { - background: @semi-transparent-dark-blue; - backdrop-filter: blur(9.5px); - } - } - } - - .bar-label { - font-family: @font-body; - width: 40px; - font-size: 1.2rem; - } - } - .progress-bar { - position: absolute; - appearance: none; - width: 100%; - height: 30px; - border: 1px solid light-dark(@dark-blue, @golden); - border-radius: 6px; - z-index: 1; - background: @dark-blue; - - &::-webkit-progress-bar { - border: none; - background: @dark-blue; - border-radius: 6px; - } - &::-webkit-progress-value { - background: @gradient-hp; - border-radius: 6px; - } - &.stress-color::-webkit-progress-value { - background: @gradient-stress; - border-radius: 6px; - } - &::-moz-progress-bar { - background: @gradient-hp; - border-radius: 6px; - } - &.stress-color::-moz-progress-bar { - background: @gradient-stress; - border-radius: 6px; - } - } - } - } - - .slot-bar { - display: flex; - flex-wrap: wrap; - gap: 4px; - padding: 5px; - border: 1px solid light-dark(@dark-blue, @golden); - border-radius: 6px; - z-index: 1; - background: @dark-blue; - align-items: center; - justify-content: center; - color: light-dark(@dark-blue, @golden); - min-height: 30px; - width: 100%; - - .armor-slot { - cursor: pointer; - transition: all 0.3s ease; - font-size: var(--font-size-12); - - .fa-shield-halved { - color: light-dark(@dark-blue-40, @golden-40); - } - } - } -} diff --git a/styles/less/ux/tooltip/bordered-tooltip.less b/styles/less/ux/tooltip/bordered-tooltip.less index d72f635e..dafaec8a 100644 --- a/styles/less/ux/tooltip/bordered-tooltip.less +++ b/styles/less/ux/tooltip/bordered-tooltip.less @@ -6,7 +6,6 @@ .daggerheart.dh-style.tooltip { display: flex; flex-direction: column; - align-items: start; text-align: start; width: 100%; gap: 5px; @@ -14,7 +13,6 @@ border-radius: 3px; .tooltip-header { - width: 100%; display: flex; flex-direction: column; align-items: center; @@ -37,34 +35,6 @@ } } - .effect-stacks-outer-container { - display: flex; - flex-direction: column; - gap: 4px; - width: 100%; - - .effect-stacks-title { - font-size: var(--font-size-20); - font-weight: bold; - text-align: center; - } - - .effect-stacks-container { - display: flex; - justify-content: space-between; - - .effect-stacks-inner-container { - display: flex; - flex-direction: column; - gap: 2px; - - .effect-stack-title { - font-weight: bold; - } - } - } - } - .close-hints { margin-top: 0.5rem; display: flex; @@ -80,37 +50,5 @@ margin: 0; } } - - .duration-container { - display: flex; - flex-direction: column; - text-align: center; - margin-top: 0.5rem; - width: 100%; - - &::before, - &::after { - content: ''; - background: var(--golden, #f3c267); - mask-image: linear-gradient(270deg, transparent 0%, black 50%, transparent 100%); - height: 2px; - width: calc(100% - 10px); - } - - &::before { - margin-bottom: 8px; - } - - &::after { - margin-top: 8px; - } - - .duration-inner-container { - display: flex; - justify-content: center; - gap: 2px; - width: 100%; - } - } } } diff --git a/styles/less/ux/tooltip/tooltip.less b/styles/less/ux/tooltip/tooltip.less index 1566059f..a6f72c72 100644 --- a/styles/less/ux/tooltip/tooltip.less +++ b/styles/less/ux/tooltip/tooltip.less @@ -46,33 +46,6 @@ aside[role='tooltip']:has(div.daggerheart.dh-style.tooltip.card-style) { } } - .tooltip-duration { - font-style: italic; - text-align: start; - position: relative; - width: 100%; - padding: 5px 10px; - margin: 5px 0px; - - &::before { - content: ''; - background: @golden; - mask-image: linear-gradient(270deg, transparent 0%, black 50%, transparent 100%); - height: 2px; - width: calc(100% - 10px); - position: absolute; - top: -5px; - font-size: 14px; - } - - .duration-inner-container { - display: flex; - justify-content: center; - gap: 2px; - width: 100%; - } - } - .item-icons-list { position: absolute; display: flex; diff --git a/system.json b/system.json index 9a78bf50..44c26886 100644 --- a/system.json +++ b/system.json @@ -2,11 +2,11 @@ "id": "daggerheart", "title": "Daggerheart", "description": "An unofficial implementation of the Daggerheart system", - "version": "2.0.0", + "version": "1.9.5", "compatibility": { - "minimum": "14.355", - "verified": "14.357", - "maximum": "14" + "minimum": "13.346", + "verified": "13.351", + "maximum": "13" }, "authors": [ { diff --git a/templates/actionTypes/damage.hbs b/templates/actionTypes/damage.hbs index 9e7c2884..96bb361c 100644 --- a/templates/actionTypes/damage.hbs +++ b/templates/actionTypes/damage.hbs @@ -1,12 +1,12 @@
- + {{#if (eq @root.source.type 'healing')}} {{localize "DAGGERHEART.GENERAL.healing"}} {{else}} {{localize "DAGGERHEART.GENERAL.damage"}} {{/if}} - {{#unless (eq path 'system.attack.')}}{{/unless}} + {{#unless (eq path 'system.attack.')}}{{/unless}}
{{#if @root.hasBaseDamage}} @@ -16,74 +16,75 @@ {{formField directField value=source.direct name=(concat path "damage.direct") localize=true classes="checkbox"}} {{/unless}}
- - {{!-- Handlebars uses Symbol.Iterator to produce index|key. This isn't compatible with our parts object, so we instead use applyTo, which is the same value --}} - {{#each source.parts as |dmg|}} + {{#each source.parts as |dmg index|}} + {{#if (and @root.hasBaseDamage @root.source.damage.includeBase)}} + {{setVar 'realIndex' (add index -1)}} + {{else}} + {{setVar 'realIndex' index}} + {{/if}}
- - {{localize (concat "DAGGERHEART.CONFIG.HealingType." dmg.applyTo ".name")}} - {{#unless (or dmg.base ../path)}} - - {{/unless}} - - {{#if (and (not @root.isNPC) @root.hasRoll (not dmg.base))}} - {{formField ../fields.resultBased value=dmg.resultBased name=(concat "damage.parts." dmg.applyTo ".resultBased") localize=true classes="checkbox"}} + {{formField ../fields.resultBased value=dmg.resultBased name=(concat "damage.parts." realIndex ".resultBased") localize=true classes="checkbox"}} {{/if}} {{#if (and (not @root.isNPC) @root.hasRoll (not dmg.base) dmg.resultBased)}}
{{localize "DAGGERHEART.GENERAL.withThing" thing=(localize "DAGGERHEART.GENERAL.hope")}} - {{> formula fields=../fields.value.fields type=../fields.type dmg=dmg source=dmg.value target="value" key=dmg.applyTo path=../path}} + {{> formula fields=../fields.value.fields type=../fields.type dmg=dmg source=dmg.value target="value" realIndex=realIndex path=../path}}
{{localize "DAGGERHEART.GENERAL.withThing" thing=(localize "DAGGERHEART.GENERAL.fear")}} - {{> formula fields=../fields.valueAlt.fields type=../fields.type dmg=dmg source=dmg.valueAlt target="valueAlt" key=dmg.applyTo path=../path}} + {{> formula fields=../fields.valueAlt.fields type=../fields.type dmg=dmg source=dmg.valueAlt target="valueAlt" realIndex=realIndex path=../path}}
{{else}} - {{> formula fields=../fields.value.fields type=../fields.type dmg=dmg source=dmg.value target="value" key=dmg.applyTo path=../path}} + + {{localize "DAGGERHEART.GENERAL.formula"}} + {{> formula fields=../fields.value.fields type=../fields.type dmg=dmg source=dmg.value target="value" realIndex=realIndex path=../path}} +
{{/if}} - - {{#if (and (eq dmg.applyTo 'hitPoints') (ne @root.source.type 'healing'))}} - {{formField ../fields.type value=dmg.type name=(concat ../path "damage.parts." dmg.applyTo ".type") localize=true}} - {{/if}} - +
+ {{formField ../fields.applyTo value=dmg.applyTo name=(concat ../path "damage.parts." realIndex ".applyTo") localize=true}} + {{#if (and (eq dmg.applyTo 'hitPoints') (ne @root.source.type 'healing'))}} + {{formField ../fields.type value=dmg.type name=(concat ../path "damage.parts." realIndex ".type") localize=true}} + {{/if}} +
{{#if ../horde}}
{{localize "DAGGERHEART.ACTORS.Adversary.hordeDamage"}}
- - {{formField ../fields.valueAlt.fields.flatMultiplier value=dmg.valueAlt.flatMultiplier name=(concat ../path "damage.parts." dmg.applyTo ".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." dmg.applyTo ".valueAlt.dice") classes="inline-child" localize=true}} - {{formField ../fields.valueAlt.fields.bonus value=dmg.valueAlt.bonus name=(concat ../path "damage.parts." dmg.applyTo ".valueAlt.bonus") localize=true classes="inline-child"}} + + {{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" localize=true}} + {{formField ../fields.valueAlt.fields.bonus value=dmg.valueAlt.bonus name=(concat ../path "damage.parts." realIndex ".valueAlt.bonus") localize=true classes="inline-child"}}
{{/if}} - + + {{#unless (or dmg.base ../path)}}
{{/unless}} {{/each}} {{#*inline "formula"}} {{#unless dmg.base}} - {{formField fields.custom.fields.enabled value=source.custom.enabled name=(concat path "damage.parts." key "." target ".custom.enabled") classes="checkbox" localize=true}} + {{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." key "." target ".custom.formula") localize=true}} + {{formField fields.custom.fields.formula value=source.custom.formula name=(concat path "damage.parts." realIndex "." target ".custom.formula") localize=true}} {{else}}
{{#unless @root.isNPC}} - {{formField fields.multiplier value=source.multiplier name=(concat path "damage.parts." key "." target ".multiplier") localize=true}} + {{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." key "." target ".flatMultiplier") localize=true }}{{/if}} - {{formField fields.dice value=source.dice name=(concat path "damage.parts." key "." target ".dice") localize=true}} - {{formField fields.bonus value=source.bonus name=(concat path "damage.parts." key "." target ".bonus") localize=true}} + {{#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}} {{#if @root.isNPC}} - + {{/if}} {{/inline}} \ No newline at end of file diff --git a/templates/dialogs/damageReduction.hbs b/templates/dialogs/damageReduction.hbs index 50fe3422..57d7ee61 100644 --- a/templates/dialogs/damageReduction.hbs +++ b/templates/dialogs/damageReduction.hbs @@ -7,57 +7,53 @@
-

{{localize "DAGGERHEART.APPLICATIONS.DamageReduction.maxUseableArmor"}}

-
{{availableArmor}}
+

{{localize "DAGGERHEART.APPLICATIONS.DamageReduction.armorMarks"}}

+
{{armorMarks}}/{{armorScore}}
+ {{#if this.stress}} +
+

{{localize "DAGGERHEART.APPLICATIONS.DamageReduction.stress"}}

+
{{this.stress.value}}/{{this.stress.max}}
+
+ {{/if}}
-
- {{#each marks.armor as |source|}} -
-

{{source.label}}

-
- {{#each source.marks}} - - - - {{/each}} -
-
- {{/each}} - {{#if usesStressArmor}} -
-

{{localize "Stress"}}

-
+
+

+
+ {{#each marks.armor}} +
+ +
+ {{/each}} {{#each marks.stress}}
{{/each}} -

- {{/if}} + +
{{localize "DAGGERHEART.APPLICATIONS.DamageReduction.usedMarks"}}
{{#if availableStressReductions}}
-

{{localize "DAGGERHEART.APPLICATIONS.DamageReduction.stressReduction"}}

+

{{localize "DAGGERHEART.APPLICATIONS.DamageReduction.stressReduction"}}

{{/if}} {{#each availableStressReductions}}
-

+

{{#if this.any}} {{localize "DAGGERHEART.GENERAL.any"}} @@ -78,7 +74,7 @@ {{#if reduceSeverity}}
-

{{localize "DAGGERHEART.APPLICATIONS.DamageReduction.reduceSeverity" nr=reduceSeverity}}

+

{{localize "DAGGERHEART.APPLICATIONS.DamageReduction.reduceSeverity" nr=reduceSeverity}}

{{/if}} @@ -86,7 +82,7 @@ {{#if thresholdImmunities}}
-

{{localize "DAGGERHEART.APPLICATIONS.DamageReduction.thresholdImmunities"}}

+

{{localize "DAGGERHEART.APPLICATIONS.DamageReduction.thresholdImmunities"}}

{{/if}} diff --git a/templates/dialogs/dice-roll/damageSelection.hbs b/templates/dialogs/dice-roll/damageSelection.hbs index a5add3a4..c0dbae62 100644 --- a/templates/dialogs/dice-roll/damageSelection.hbs +++ b/templates/dialogs/dice-roll/damageSelection.hbs @@ -56,8 +56,8 @@ {{/unless}}
{{#if directDamage}} - + {{selectOptions rollModes selected=selectedRollMode valueAttr="action" labelAttr="label" localize=true}} {{/if}}
{{/if}}
+ {{#if (and @root.hasRoll @root.activeTagTeamRoll)}} +
+ + {{localize "DAGGERHEART.APPLICATIONS.TagTeamSelect.title"}} +
+ {{/if}} \ No newline at end of file diff --git a/templates/dialogs/dice-roll/rollSelection.hbs b/templates/dialogs/dice-roll/rollSelection.hbs index 4451160b..5139c58a 100644 --- a/templates/dialogs/dice-roll/rollSelection.hbs +++ b/templates/dialogs/dice-roll/rollSelection.hbs @@ -189,8 +189,8 @@ {{/if}}
- + {{selectOptions rollModes selected=selectedRollMode valueAttr="action" labelAttr="label" localize=true}} +
+

\ No newline at end of file diff --git a/templates/dialogs/tagTeamDialog/initialization.hbs b/templates/dialogs/tagTeamDialog/initialization.hbs deleted file mode 100644 index 604d06c0..00000000 --- a/templates/dialogs/tagTeamDialog/initialization.hbs +++ /dev/null @@ -1,35 +0,0 @@ -
- {{partId}} -

{{localize "DAGGERHEART.APPLICATIONS.TagTeamSelect.selectParticipants"}}

-
- {{#each memberSelection as |member|}} - - {{member.name}} - - - {{/each}} -
- -
-
- -
- -
-
- {{formGroup tagTeamFields.initiator.fields.cost name="initiator.cost" value=initiator.cost disabled=initiatorDisabled localize=true }} -
- -
- -
- {{localize "DAGGERHEART.APPLICATIONS.TagTeamSelect.openDialogForAll"}} - -
-
-
\ No newline at end of file diff --git a/templates/dialogs/tagTeamDialog/parts/tagTeamDamageParts.hbs b/templates/dialogs/tagTeamDialog/parts/tagTeamDamageParts.hbs deleted file mode 100644 index 058777a5..00000000 --- a/templates/dialogs/tagTeamDialog/parts/tagTeamDamageParts.hbs +++ /dev/null @@ -1,25 +0,0 @@ -{{#each damage as |damage key|}} -
-
- {{localize (concat "DAGGERHEART.CONFIG.HealingType." key ".name")}}: - {{damage.total}} -
- {{#each damage.parts as |part|}} -
- {{#each part.dice as |dice index|}} - - {{dice.total}} - - - {{#unless @last}} - + - {{/unless}} - {{/each}} - {{#if part.modifierTotal}} - {{#if (gte part.modifierTotal 0)}}+{{else}}-{{/if}} - {{positive part.modifierTotal}} - {{/if}} -
- {{/each}} -
-{{/each}} \ No newline at end of file diff --git a/templates/dialogs/tagTeamDialog/rollSelection.hbs b/templates/dialogs/tagTeamDialog/rollSelection.hbs deleted file mode 100644 index a40d3d39..00000000 --- a/templates/dialogs/tagTeamDialog/rollSelection.hbs +++ /dev/null @@ -1,11 +0,0 @@ -
- {{#if allHaveRolled}} -
- {{#each members as |member key|}} - - - - {{/each}} -
- {{/if}} -
\ No newline at end of file diff --git a/templates/dialogs/tagTeamDialog/tagTeamMember.hbs b/templates/dialogs/tagTeamDialog/tagTeamMember.hbs deleted file mode 100644 index 5c100d02..00000000 --- a/templates/dialogs/tagTeamDialog/tagTeamMember.hbs +++ /dev/null @@ -1,126 +0,0 @@ - - {{#with (lookup members partId)}} -
-
-
- - {{name}} -
-
-
-
- - -
-
- {{#if (or (not rollType) (eq rollType 'trait'))}} -
-
- - -
-
- {{else if (eq rollType 'damageAbility')}} -
-
- - -
-
- {{else}} -
-
- - -
-
- {{/if}} -
- - {{#if readyToRoll}} -
- - {{localize "DAGGERHEART.GENERAL.roll"}} -
- - - - - {{#if hasRolled}} - - - - {{/if}} -
-
- - {{#if rollData}} - {{#with rollData.options.roll}} -
-
{{this.total}} {{localize "DAGGERHEART.GENERAL.withThing" thing=this.result.label}}
-
- - {{this.hope.value}} - - - + - - {{this.fear.value}} - - - {{#if this.advantage.type}} - {{#if (eq this.advantage.type 1)}}+{{else}}-{{/if}} - - {{this.advantage.value}} - - - {{/if}} - {{#if (gte this.modifierTotal 0)}}+{{else}}-{{/if}} - {{positive this.modifierTotal}} -
-
- {{/with}} - {{else}} - {{localize "DAGGERHEART.APPLICATIONS.TagTeamSelect.makeYourRoll"}} - {{/if}} -
- {{/if}} - - {{#if rollData.options.hasDamage}} -
- - {{localize "DAGGERHEART.GENERAL.damage"}} -
- - - - - {{#if damage}} - - - - {{/if}} -
-
- {{#if damage}} - {{#if useCritDamage}} - {{> "systems/daggerheart/templates/dialogs/tagTeamDialog/parts/tagTeamDamageParts.hbs" damage=critDamage isCritical=true }} - {{else}} - {{> "systems/daggerheart/templates/dialogs/tagTeamDialog/parts/tagTeamDamageParts.hbs" damage=damage }} - {{/if}} - {{else}} - {{localize "DAGGERHEART.APPLICATIONS.TagTeamSelect.makeYourRoll"}} - {{/if}} -
- {{/if}} -
-
- {{/with}} \ No newline at end of file diff --git a/templates/dialogs/tagTeamDialog/tagTeamRoll.hbs b/templates/dialogs/tagTeamDialog/tagTeamRoll.hbs deleted file mode 100644 index 478255ce..00000000 --- a/templates/dialogs/tagTeamDialog/tagTeamRoll.hbs +++ /dev/null @@ -1,38 +0,0 @@ -
-
-
- {{localize "DAGGERHEART.GENERAL.result.plural"}} -
- {{#if hintText}} -
{{localize hintText}}
- {{else}} - {{#if joinedRoll.rollData}} -
- -
-
{{joinedRoll.rollData.options.roll.total}}
-
{{localize "DAGGERHEART.GENERAL.withThing" thing=joinedRoll.rollData.options.roll.result.label}}
-
-
- {{/if}} - {{#if hasDamage}} -
- - {{#each joinedRoll.rollData.options.damage as |damage key|}} -
-
{{localize (concat "DAGGERHEART.CONFIG.HealingType." key ".name")}}
-
{{damage.total}}
-
- {{/each}} -
- {{/if}} - {{/if}} -
-
- -
- - -
-
-
\ No newline at end of file diff --git a/templates/hud/tokenHUD.hbs b/templates/hud/tokenHUD.hbs index ab0872bf..1ba29621 100644 --- a/templates/hud/tokenHUD.hbs +++ b/templates/hud/tokenHUD.hbs @@ -4,22 +4,13 @@
- - {{#if canChangeLevel}} - -
- {{#each levels as |level|}} - {{level.name}} - {{/each}} -
- {{/if}} - {{#if hasCompanion}}
{{formGroup settingFields.schema.fields.vulnerableAutomation value=settingFields._source.vulnerableAutomation localize=true}} - {{formGroup settingFields.schema.fields.autoExpireActiveEffects value=settingFields._source.autoExpireActiveEffects localize=true}} {{formGroup settingFields.schema.fields.countdownAutomation value=settingFields._source.countdownAutomation localize=true}} {{formGroup settingFields.schema.fields.actionPoints value=settingFields._source.actionPoints localize=true}} {{formGroup settingFields.schema.fields.hordeDamage value=settingFields._source.hordeDamage localize=true}} diff --git a/templates/sheets/activeEffect/change.hbs b/templates/sheets/activeEffect/change.hbs deleted file mode 100644 index d7d396e4..00000000 --- a/templates/sheets/activeEffect/change.hbs +++ /dev/null @@ -1,19 +0,0 @@ -
  • -
    - -
    -
    - -
    -
    - {{formInput fields.value name=change.valuePath value=change.value elementType="input"}} -
    -
    - {{formInput fields.priority name=change.priorityPath value=change.priority placeholder=defaultPriority}} -
    -
    - -
    -
  • diff --git a/templates/sheets/activeEffect/changes.hbs b/templates/sheets/activeEffect/changes.hbs index 37feb845..75f49e4a 100644 --- a/templates/sheets/activeEffect/changes.hbs +++ b/templates/sheets/activeEffect/changes.hbs @@ -1,27 +1,31 @@
    -
    {{localize "EFFECT.FIELDS.changes.element.key.label"}}
    -
    {{localize "EFFECT.FIELDS.changes.element.type.label"}}
    -
    {{localize "EFFECT.FIELDS.changes.element.value.label"}}
    -
    {{localize "EFFECT.FIELDS.changes.element.priority.label"}}
    -
    - -
    +
    {{localize "EFFECT.ChangeKey"}}
    +
    {{localize "EFFECT.ChangeMode"}}
    +
    {{localize "EFFECT.ChangeValue"}}
    +
    {{localize "EFFECT.ChangePriority"}}
    +
      - {{#each changes as |change|}} - {{{change}}} + {{#each source.changes as |change i|}} + {{#with ../fields.changes.element.fields as |changeFields|}} +
    1. +
      + +
      +
      + {{formInput changeFields.mode name=(concat "changes." i ".mode") value=change.mode choices=@root.modes}} +
      +
      + {{formInput changeFields.value name=(concat "changes." i ".value") value=change.value}} +
      +
      + {{formInput changeFields.priority name=(concat "changes." i ".priority") value=change.priority + placeholder=(lookup ../../priorities change.mode)}} +
      +
      +
    2. + {{/with}} {{/each}}
    - -
    - - {{localize "DAGGERHEART.GENERAL.armor"}} - - - - {{#if typedChanges.armor}} - {{> "systems/daggerheart/templates/sheets/activeEffect/typeChanges/armorChange.hbs" typedChanges.armor fields=@root.systemFields.changes.element.types.armor.fields}} - {{/if}} -
    -
    + \ No newline at end of file diff --git a/templates/sheets/activeEffect/details.hbs b/templates/sheets/activeEffect/details.hbs index f7e465bd..22c95a1e 100644 --- a/templates/sheets/activeEffect/details.hbs +++ b/templates/sheets/activeEffect/details.hbs @@ -4,12 +4,7 @@ {{formGroup fields.disabled value=source.disabled rootId=rootId}} {{#if isActorEffect}} -
    - -
    - -
    -
    + {{formGroup fields.origin value=source.origin rootId=rootId disabled=true}} {{/if}} {{#if isItemEffect}} @@ -17,5 +12,4 @@ {{/if}} {{formGroup fields.statuses value=source.statuses options=statuses rootId=rootId classes="statuses"}} - {{formGroup fields.showIcon value=source.showIcon options=showIconOptions rootId=rootId}} - \ No newline at end of file + diff --git a/templates/sheets/activeEffect/settings.hbs b/templates/sheets/activeEffect/settings.hbs index 9307ff65..cf98c786 100644 --- a/templates/sheets/activeEffect/settings.hbs +++ b/templates/sheets/activeEffect/settings.hbs @@ -1,18 +1,4 @@
    -
    - - {{localize "DAGGERHEART.ACTIVEEFFECT.Config.stacking.title"}} - - - - {{#if source.system.stacking}} -
    - {{formGroup systemFields.stacking.fields.value value=source.system.stacking.value localize=true }} - {{formGroup systemFields.stacking.fields.max value=source.system.stacking.max localize=true }} -
    - {{/if}} -
    -
    {{localize "DAGGERHEART.ACTIVEEFFECT.Config.rangeDependence.title"}} @@ -21,31 +7,34 @@ {{formGroup systemFields.rangeDependence.fields.target value=source.system.rangeDependence.target localize=true }} {{formGroup systemFields.rangeDependence.fields.range value=source.system.rangeDependence.range localize=true }}
    +
    - {{localize "EFFECT.DURATION.Label"}} + {{formGroup fields.duration.fields.seconds value=source.duration.seconds rootId=rootId}} + {{formGroup fields.duration.fields.startTime value=source.duration.startTime rootId=rootId}} +
    - {{formGroup systemFields.duration.fields.type value=source.system.duration.type localize=true }} - -
    -
    - {{formInput systemFields.duration.fields.description value=source.system.duration.description localize=true }} -
    +
    +
    + +
    + + {{formInput fields.duration.fields.rounds value=source.duration.rounds + id=(concat rootId "-duration.rounds")}} + + {{formInput fields.duration.fields.turns value=source.duration.turns + id=(concat rootId "-duration.turns")}}
    - -
    - {{formGroup fields.start.fields.time value=source.start.time localize=true }} -
    - -
    - {{formInput fields.duration.fields.value value=source.duration.value id=(concat rootId "-duration.value") - aria=(object label=(localize "EFFECT.FIELDS.duration.value.label"))}} - {{formInput fields.duration.fields.units value=source.duration.units id=(concat rootId "-duration.units") - options=durationUnits aria=(object label=(localize "EFFECT.FIELDS.duration.units.label")) localize=true }} -
    +
    +
    + +
    + + {{formInput fields.duration.fields.startRound value=source.duration.startRound + id=(concat rootId "-duration.startRound")}} + + {{formInput fields.duration.fields.startTurn value=source.duration.startTurn + id=(concat rootId "-duration.startTurn")}}
    -
    \ No newline at end of file + diff --git a/templates/sheets/activeEffect/typeChanges/armorChange.hbs b/templates/sheets/activeEffect/typeChanges/armorChange.hbs deleted file mode 100644 index 662a1294..00000000 --- a/templates/sheets/activeEffect/typeChanges/armorChange.hbs +++ /dev/null @@ -1,28 +0,0 @@ -
    -
    {{localize "EFFECT.FIELDS.changes.element.value.label"}}
    -
    {{localize "DAGGERHEART.GENERAL.max"}}
    -
    {{localize "DAGGERHEART.EFFECTS.ChangeTypes.armor.FIELDS.interaction.label"}}
    -
    {{localize "EFFECT.FIELDS.changes.element.priority.label"}}
    -
    -
      -
    1. - - - {{formInput fields.value.fields.current name=(concat "system.changes." index ".value.current") value=value.current data-dtype="Number"}} - {{formInput fields.value.fields.max name=(concat "system.changes." index ".value.max") value=value.max data-dtype="Number"}} - {{formInput fields.value.fields.interaction name=(concat "system.changes." index ".value.interaction") value=value.interaction localize=true}} - {{formInput fields.priority name=(concat "system.changes." index ".priority") value=priority}} -
    2. -
    -
    -
    - {{localize "DAGGERHEART.GENERAL.DamageThresholds.title"}} - -
    - {{#if value.damageThresholds}} -
    - {{formGroup fields.value.fields.damageThresholds.fields.major name=(concat "system.changes." index ".value.damageThresholds.major") value=value.damageThresholds.major localize=true }} - {{formGroup fields.value.fields.damageThresholds.fields.severe name=(concat "system.changes." index ".value.damageThresholds.severe") value=value.damageThresholds.severe localize=true }} -
    - {{/if}} -
    \ No newline at end of file diff --git a/templates/sheets/actors/character/effects.hbs b/templates/sheets/actors/character/effects.hbs index 3355d575..30fb31f4 100644 --- a/templates/sheets/actors/character/effects.hbs +++ b/templates/sheets/actors/character/effects.hbs @@ -18,7 +18,6 @@ collection=effects.inactives canCreate=true hideResources=true - disabled=true }} \ No newline at end of file diff --git a/templates/sheets/actors/character/sidebar.hbs b/templates/sheets/actors/character/sidebar.hbs index d3be4983..b2757b55 100644 --- a/templates/sheets/actors/character/sidebar.hbs +++ b/templates/sheets/actors/character/sidebar.hbs @@ -30,14 +30,14 @@ - {{#if document.system.armorScore.max}} + {{#if document.system.armor.system.marks}} {{else}} diff --git a/templates/sheets/actors/party/party-members.hbs b/templates/sheets/actors/party/party-members.hbs index b3dd53e6..b5903cfc 100644 --- a/templates/sheets/actors/party/party-members.hbs +++ b/templates/sheets/actors/party/party-members.hbs @@ -5,7 +5,7 @@ >
    - diff --git a/templates/sheets/actors/party/resources.hbs b/templates/sheets/actors/party/resources.hbs index bfbfb578..74f94806 100644 --- a/templates/sheets/actors/party/resources.hbs +++ b/templates/sheets/actors/party/resources.hbs @@ -52,12 +52,13 @@
    - {{#if actor.system.armorScore.max}} + {{#if actor.system.armor.system.marks}} {{/if}} diff --git a/templates/sheets/items/armor/header.hbs b/templates/sheets/items/armor/header.hbs index d8044332..d4306131 100644 --- a/templates/sheets/items/armor/header.hbs +++ b/templates/sheets/items/armor/header.hbs @@ -9,7 +9,7 @@

    {{localize "DAGGERHEART.ITEMS.Armor.baseScore"}}: - {{source.system.armor.max}} + {{source.system.baseScore}} - {{localize "DAGGERHEART.ITEMS.Armor.baseThresholds.base"}}: {{source.system.baseThresholds.major}} diff --git a/templates/sheets/items/armor/settings.hbs b/templates/sheets/items/armor/settings.hbs index 51bf1746..e7bde6fe 100644 --- a/templates/sheets/items/armor/settings.hbs +++ b/templates/sheets/items/armor/settings.hbs @@ -6,9 +6,9 @@
    {{localize tabs.settings.label}} {{localize "DAGGERHEART.GENERAL.Tiers.singular"}} - {{ formField systemFields.tier value=source.system.tier }} + {{formField systemFields.tier value=source.system.tier}} {{localize "DAGGERHEART.ITEMS.Armor.baseScore"}} - {{ formField systemFields.armor.fields.max value=source.system.armor.max }} + {{formField systemFields.baseScore value=source.system.baseScore}} {{localize "TYPES.Item.feature"}} diff --git a/templates/sheets/items/weapon/header.hbs b/templates/sheets/items/weapon/header.hbs index 9bbd9511..349a9516 100644 --- a/templates/sheets/items/weapon/header.hbs +++ b/templates/sheets/items/weapon/header.hbs @@ -14,13 +14,13 @@ - {{localize (concat 'DAGGERHEART.CONFIG.Range.' source.system.attack.range '.name')}} - - {{#if source.system.attack.damage.parts.hitPoints.value.custom.enabled}} + {{#if source.system.attack.damage.parts.0.value.custom.enabled}} {{localize "DAGGERHEART.GENERAL.custom"}} {{else}} - {{source.system.attack.damage.parts.hitPoints.value.dice}}{{#if source.system.attack.damage.parts.hitPoints.value.bonus}} + {{source.system.attack.damage.parts.hitPoints.value.bonus}}{{/if}} + {{source.system.attack.damage.parts.0.value.dice}}{{#if source.system.attack.damage.parts.0.value.bonus}} + {{source.system.attack.damage.parts.0.value.bonus}}{{/if}} {{/if}} ( - {{#each source.system.attack.damage.parts.hitPoints.type}} + {{#each source.system.attack.damage.parts.0.type}} {{localize (concat 'DAGGERHEART.CONFIG.DamageType.' this '.abbreviation')}} {{/each}} ) diff --git a/templates/sheets/items/weapon/settings.hbs b/templates/sheets/items/weapon/settings.hbs index e67e8dd7..f9499221 100644 --- a/templates/sheets/items/weapon/settings.hbs +++ b/templates/sheets/items/weapon/settings.hbs @@ -19,24 +19,24 @@
    {{#with systemFields.attack.fields.damage.fields.parts.element.fields as | fields | }} - {{#with ../document.system.attack.damage.parts.hitPoints as | source | }} + {{#with (lookup ../document.system.attack.damage.parts 0) as | source | }} {{localize "DAGGERHEART.GENERAL.damage"}} {{localize "DAGGERHEART.ACTIONS.Config.general.customFormula"}} - {{formInput fields.value.fields.custom.fields.enabled value=source.value.custom.enabled name="system.attack.damage.parts.hitPoints.value.custom.enabled"}} + {{formInput fields.value.fields.custom.fields.enabled value=source.value.custom.enabled name="system.attack.damage.parts.0.value.custom.enabled"}} {{#if source.value.custom.enabled}} {{localize "DAGGERHEART.ACTIONS.Config.general.formula"}} - {{formInput fields.value.fields.custom.fields.formula value=source.value.custom.formula name="system.attack.damage.parts.hitPoints.value.custom.formula"}} + {{formInput fields.value.fields.custom.fields.formula value=source.value.custom.formula name="system.attack.damage.parts.0.value.custom.formula"}} {{else}} {{localize "DAGGERHEART.GENERAL.Dice.single"}} - {{formInput fields.value.fields.dice value=source.value.dice name="system.attack.damage.parts.hitPoints.value.dice"}} + {{formInput fields.value.fields.dice value=source.value.dice name="system.attack.damage.parts.0.value.dice"}} {{localize "DAGGERHEART.GENERAL.bonus"}} - {{formInput fields.value.fields.bonus value=source.value.bonus name="system.attack.damage.parts.hitPoints.value.bonus" localize=true}} + {{formInput fields.value.fields.bonus value=source.value.bonus name="system.attack.damage.parts.0.value.bonus" localize=true}} {{/if}} {{localize "DAGGERHEART.GENERAL.type"}} - {{formInput fields.type value=source.type name="system.attack.damage.parts.hitPoints.type" localize=true}} + {{formInput fields.type value=source.type name="system.attack.damage.parts.0.type" localize=true}} {{localize "DAGGERHEART.CONFIG.DamageType.direct.name"}} {{formInput @root.systemFields.attack.fields.damage.fields.direct value=@root.document.system.attack.damage.direct name="system.attack.damage.direct" localize=true}} - + {{/with}} {{/with}}
    diff --git a/templates/ui/effects-display.hbs b/templates/ui/effects-display.hbs index 67c783a6..95c6023c 100644 --- a/templates/ui/effects-display.hbs +++ b/templates/ui/effects-display.hbs @@ -8,9 +8,6 @@
    - {{#if (gt effect.system.stacking.value 1)}} - {{effect.system.stacking.value}} - {{/if}} {{#if effect.condition}}{{/if}} {{/each}} diff --git a/templates/ui/sceneNavigation/scene-navigation.hbs b/templates/ui/sceneNavigation/scene-navigation.hbs index 68df761e..0bd59465 100644 --- a/templates/ui/sceneNavigation/scene-navigation.hbs +++ b/templates/ui/sceneNavigation/scene-navigation.hbs @@ -1,40 +1,10 @@ - - - -{{#*inline ".scene"}} -
  • -
    - {{ name }} - {{#if users}} -
      - {{#each users}} -
    • {{ letter }}
    • - {{/each}} -
    - {{/if}} -
    - {{#if hasEnvironments}} - - {{/if}} -
  • -{{/inline}} - diff --git a/templates/ui/tooltip/armorManagement.hbs b/templates/ui/tooltip/armorManagement.hbs deleted file mode 100644 index 963959c5..00000000 --- a/templates/ui/tooltip/armorManagement.hbs +++ /dev/null @@ -1,19 +0,0 @@ -
    -

    {{localize "DAGGERHEART.GENERAL.armorSlots"}}

    - {{#each sources as |source|}} -
    -

    {{source.name}}

    - -
    - {{/each}} -
    \ No newline at end of file diff --git a/templates/ui/tooltip/effect-display.hbs b/templates/ui/tooltip/effect-display.hbs index f1db03c5..4e447b82 100644 --- a/templates/ui/tooltip/effect-display.hbs +++ b/templates/ui/tooltip/effect-display.hbs @@ -16,57 +16,16 @@ {{/if}} - {{#if effect.system.duration.type}} -
    -
    - {{localize "EFFECT.DURATION.Label"}}: - {{localize (concat "DAGGERHEART.CONFIG.ActiveEffectDuration." effect.system.duration.type )}} -
    -
    - {{/if}} - - {{#if effect.system.stacking}} -
    -
    {{localize "Stacks"}}
    -
    -
    - {{localize "Current"}} - {{effect.system.stacking.value}} -
    -
    - {{localize "Max"}} - {{effect.system.stacking.max}} -
    -
    -
    - {{/if}} - - -
    - {{#if (eq effect.type 'beastform')}} -

    - {{localize "DAGGERHEART.UI.Tooltip.middleClick"}} -

    - {{/if}} - {{#unless effect.isLockedCondition}} - {{#if effect.system.stacking}} -

    - {{localize "DAGGERHEART.UI.EffectsDisplay.increaseStacks"}} -

    - {{#if (gt effect.system.stacking.value 1)}} -

    - {{localize "DAGGERHEART.UI.EffectsDisplay.decreaseStacks"}} -

    - {{else}} -

    - {{localize "DAGGERHEART.UI.EffectsDisplay.removeThing" thing=(localize "DAGGERHEART.GENERAL.Effect.single")}} -

    - {{/if}} - {{else}} -

    - {{localize "DAGGERHEART.UI.EffectsDisplay.removeThing" thing=(localize "DAGGERHEART.GENERAL.Effect.single")}} -

    - {{/if}} - {{/unless}} -
    +
    + {{#if (eq effect.type 'beastform')}} +

    + {{localize "DAGGERHEART.UI.Tooltip.middleClick"}} +

    + {{/if}} + {{#unless effect.isLockedCondition}} +

    + {{localize "DAGGERHEART.UI.EffectsDisplay.removeThing" thing=(localize "DAGGERHEART.GENERAL.Effect.single")}} +

    + {{/unless}} +
    \ No newline at end of file diff --git a/templates/ui/tooltip/effect.hbs b/templates/ui/tooltip/effect.hbs index c5004a86..4430b91d 100644 --- a/templates/ui/tooltip/effect.hbs +++ b/templates/ui/tooltip/effect.hbs @@ -4,12 +4,4 @@ {{#if description}}
    {{{description}}}
    {{/if}} - {{#if item.system.duration.type}} -
    -
    - {{localize "EFFECT.DURATION.Label"}}: - {{localize (concat "DAGGERHEART.CONFIG.ActiveEffectDuration." item.system.duration.type )}} -
    -
    - {{/if}} \ No newline at end of file diff --git a/tools/analyze-damage.mjs b/tools/analyze-damage.mjs index 7b3fb9e5..6d5da3de 100644 --- a/tools/analyze-damage.mjs +++ b/tools/analyze-damage.mjs @@ -5,41 +5,38 @@ * Maybe if future book monsters can be part of what we release, we can analyze those too. */ -import fs from 'fs/promises'; -import path from 'path'; +import fs from "fs/promises"; +import path from "path"; const allData = []; // Read adversary pack data for average damage for attacks -const adversariesDirectory = path.join('src/packs/adversaries'); +const adversariesDirectory = path.join("src/packs/adversaries"); for (const basefile of await fs.readdir(adversariesDirectory)) { - if (!basefile.endsWith('.json')) continue; + if (!basefile.endsWith(".json")) continue; const filepath = path.join(adversariesDirectory, basefile); - const data = JSON.parse(await fs.readFile(filepath, 'utf8')); - if (data?.type !== 'adversary' || data.system.type === 'social') continue; + const data = JSON.parse(await fs.readFile(filepath, "utf8")); + if (data?.type !== "adversary" || data.system.type === "social") continue; allData.push({ name: data.name, tier: data.system.tier, adversaryType: data.system.type, - damage: parseDamage(data.system.attack.damage) + damage: parseDamage(data.system.attack.damage), }); } const adversaryTypes = new Set(allData.map(a => a.adversaryType)); for (const type of [...adversaryTypes].toSorted()) { - const perTier = Object.groupBy( - allData.filter(a => a.adversaryType === type), - a => a.tier - ); - console.log(`${type} per Tier: ${[1, 2, 3, 4].map(t => perTier[t]?.length ?? 0).join(' ')}`); + const perTier = Object.groupBy(allData.filter(a => a.adversaryType === type), a => a.tier); + console.log(`${type} per Tier: ${[1, 2, 3, 4].map(t => perTier[t]?.length ?? 0).join(" ")}`) } const result = { - basic: compileData(allData.filter(d => d.adversaryType !== 'minion')), - solos_and_bruisers: compileData(allData.filter(d => ['solo', 'bruiser'].includes(d.adversaryType))), - leader_and_ranged: compileData(allData.filter(d => ['leader', 'ranged'].includes(d.adversaryType))), - minion: compileData(allData.filter(d => d.adversaryType === 'minion')) + basic: compileData(allData.filter(d => d.adversaryType !== "minion")), + solos_and_bruisers: compileData(allData.filter(d => ["solo", "bruiser"].includes(d.adversaryType))), + leader_and_ranged: compileData(allData.filter(d => ["leader", "ranged"].includes(d.adversaryType))), + minion: compileData(allData.filter(d => d.adversaryType === "minion")), }; console.log(result); @@ -55,7 +52,7 @@ function compileData(entries) { if (tier === 4) console.log(allDamage); results[tier] = { mean, - deviation: getStandardDeviation(allDamage, { mean }) + deviation: getStandardDeviation(allDamage, { mean }), }; } @@ -67,7 +64,7 @@ function removeOutliers(data) { const startIdx = Math.floor(data.length * 0.25); const endIdx = Math.ceil(data.length * 0.75); const iqrBound = (data[endIdx] - data[startIdx]) * 1.25; - return data.filter(d => d >= data[startIdx] - iqrBound && d <= data[endIdx] + iqrBound); + return data.filter((d) => d >= data[startIdx] - iqrBound && d <= data[endIdx] + iqrBound); } function getMedian(numbers) { @@ -87,7 +84,7 @@ function getMedianAverageDeviation(numbers, { median }) { } function getStandardDeviation(numbers, { mean }) { - const deviations = numbers.map(r => r - mean); + const deviations = numbers.map((r) => r - mean); return Math.sqrt(deviations.reduce((r, d) => r + d * d, 0) / (numbers.length - 1)); } @@ -98,8 +95,8 @@ function parseDamage(damage) { p.value.custom.enabled ? p.value.custom.formula : [p.value.flatMultiplier ? `${p.value.flatMultiplier}${p.value.dice}` : 0, p.value.bonus ?? 0] - .filter(p => !!p) - .join('+') + .filter(p => !!p) + .join('+') ) .join('+'); return getExpectedDamage(formula); @@ -110,23 +107,19 @@ function parseDamage(damage) { * All subtracted terms become negative terms. */ function getExpectedDamage(formula) { - const terms = formula - .replace('+', ' + ') - .replace('-', ' - ') - .split(' ') - .map(t => t.trim()); + const terms = formula.replace("+", " + ").replace("-", " - ").split(" ").map(t => t.trim()); let multiplier = 1; return terms.reduce((total, term) => { - if (term === '-') { + if (term === "-") { multiplier = -1; return total; - } else if (term === '+') { + } else if (term === "+") { return total; } const currentMultiplier = multiplier; multiplier = 1; - + const number = Number(term); if (!Number.isNaN(number)) { return total + currentMultiplier * number;