diff --git a/daggerheart.mjs b/daggerheart.mjs index b92be2a2..2c51c1f6 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -6,6 +6,7 @@ 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 die from './module/dice/die/_module.mjs'; import * as fields from './module/data/fields/_module.mjs'; import RegisterHandlebarsHelpers from './module/helpers/handlebarsHelper.mjs'; import { enricherConfig, enricherRenderSetup } from './module/enrichers/_module.mjs'; @@ -23,7 +24,7 @@ import TokenManager from './module/documents/tokenManager.mjs'; CONFIG.DH = SYSTEM; CONFIG.TextEditor.enrichers.push(...enricherConfig); -CONFIG.Dice.rolls = [BaseRoll, DHRoll, DualityRoll, D20Roll, DamageRoll, FateRoll]; +CONFIG.Dice.rolls = [Roll = BaseRoll, DHRoll, DualityRoll, D20Roll, DamageRoll, FateRoll]; CONFIG.Dice.daggerheart = { DHRoll: DHRoll, DualityRoll: DualityRoll, @@ -38,6 +39,8 @@ CONFIG.RegionBehavior.dataModels = { }; Object.assign(CONFIG.Dice.termTypes, dice.diceTypes); +CONFIG.Dice.terms.d = die.BaseDie; +CONFIG.Dice.types = [die.BaseDie, CONFIG.Dice.terms.f]; CONFIG.Actor.documentClass = documents.DhpActor; CONFIG.Actor.dataModels = models.actors.config; @@ -267,6 +270,10 @@ Hooks.on('i18nInit', () => { }); Hooks.on('setup', () => { + if (game.user.isGM) { + document.body.dataset.gm = true; + } + CONFIG.statusEffects = [ ...CONFIG.statusEffects.filter(x => !['dead', 'unconscious'].includes(x.id)), ...Object.values(SYSTEM.GENERAL.conditions()).map(x => ({ @@ -390,7 +397,7 @@ const updateActorsRangeDependentEffects = async token => { ).rangeMeasurement; for (let effect of token.actor?.allApplicableEffects() ?? []) { - if (!effect.system.rangeDependence?.enabled) continue; + if (!effect.system.rangeDependence) continue; const { target, range, type } = effect.system.rangeDependence; // If there are no targets, assume false. Otherwise, start with the effect enabled. diff --git a/lang/en.json b/lang/en.json index 91f41f12..c3b9284f 100755 --- a/lang/en.json +++ b/lang/en.json @@ -104,8 +104,10 @@ "startCountdown": "Start Countdown" }, "damage": { + "addResource": "Add Resource", "multiplier": "Multiplier", - "flatMultiplier": "Flat Multiplier" + "flatMultiplier": "Flat Multiplier", + "markResources": "Mark Resources" }, "general": { "customFormula": "Custom Formula", @@ -171,9 +173,7 @@ }, "ACTIVEEFFECT": { "Config": { - "rangeDependence": { - "title": "Range Dependence" - }, + "rangeDependence": { "title": "Range Dependence" }, "stacking": { "title": "Stacking" }, "targetDispositions": "Affected Dispositions" }, @@ -778,7 +778,7 @@ "removeRoll": "Remove Roll", "resultsHint": "Results will appear when characters roll", "selectLeaderHint": "Select one Character to be the leader", - "selectParticipantsHint": "Select one Character to be the leader", + "selectParticipantsHint": "Select all Characters who will participate in the roll", "startGroupRoll": "Start Group Roll", "title": "Group Roll" }, @@ -2253,7 +2253,7 @@ "hint": "A used armor slot normally reduces damage by one step. This value increases the number of steps damage is reduced by." }, "magical": { - "label": "Daamge Reduction: Only Magical", + "label": "Damage Reduction: Only Magical", "hint": "Armor can only be used to reduce magical damage" }, "maxArmorMarkedBonus": "Max Armor Used", @@ -2491,7 +2491,6 @@ "reroll": "Reroll", "rerolled": "Rerolled", "rerollThing": "Reroll {thing}", - "resource": "Resource", "result": { "single": "Result", "plural": "Results" @@ -2558,6 +2557,9 @@ }, "identifier": { "label": "Identifier" + }, + "gmNotes": { + "label": "GM Notes" } }, "Ancestry": { @@ -2573,6 +2575,9 @@ "severe": "Severe Threshold" } }, + "Base": { + "addGMNote": "Add GM Note" + }, "Beastform": { "FIELDS": { "beastformType": { "label": "Beastform Type" }, @@ -3245,7 +3250,7 @@ "beastformToManyAdvantages": "You cannot select any more advantages.", "beastformToManyFeatures": "You cannot select any more features.", "beastformEquipWeapon": "You cannot use weapons while in a Beastform.", - "loadoutMaxReached": "You've reached maximum loadout. Move atleast one domain card to the vault, or increase the limit in homebrew settings if desired.", + "loadoutMaxReached": "You've reached the maximum loadout size. To add more, move at least one domain card to the vault.", "domainMaxReached": "You've reached the maximum domains for the class. Increase the limit in homebrew settings if desired.", "insufficientResources": "You don't have enough resources to use that action.", "actionNoUsesRemaining": "That action doesn't have remaining uses.", diff --git a/module/applications/dialogs/beastformDialog.mjs b/module/applications/dialogs/beastformDialog.mjs index 8ae6d5fe..8aca1844 100644 --- a/module/applications/dialogs/beastformDialog.mjs +++ b/module/applications/dialogs/beastformDialog.mjs @@ -315,15 +315,15 @@ export default class BeastformDialog extends HandlebarsApplicationMixin(Applicat const beastformEffect = selected.effects.find(x => x.type === 'beastform'); for (const traitBonus of app.modifications.traitBonuses) { - const existingChange = beastformEffect.changes.find( + const existingChange = beastformEffect.system.changes.find( x => x.key === `system.traits.${traitBonus.trait}.value` ); if (existingChange) { existingChange.value = Number.parseInt(existingChange.value) + traitBonus.bonus; } else { - beastformEffect.changes.push({ + beastformEffect.system.changes.push({ key: `system.traits.${traitBonus.trait}.value`, - mode: 2, + type: 'add', priority: null, value: traitBonus.bonus }); diff --git a/module/applications/dialogs/damageDialog.mjs b/module/applications/dialogs/damageDialog.mjs index 46d3d41f..ce613ade 100644 --- a/module/applications/dialogs/damageDialog.mjs +++ b/module/applications/dialogs/damageDialog.mjs @@ -51,7 +51,11 @@ export default class DamageDialog extends HandlebarsApplicationMixin(Application const context = await super._prepareContext(_options); context.config = CONFIG.DH; context.title = this.config.title ?? this.title; - context.formula = this.roll.constructFormula(this.config); + + const { damageFormula, resourceFormulas } = this.roll.constructFormulas(this.config); + context.damageFormula = damageFormula; + context.resourceFormulas = resourceFormulas; + context.hasHealing = this.config.hasHealing; context.directDamage = this.config.directDamage; context.selectedMessageMode = this.config.selectedMessageMode; @@ -73,7 +77,11 @@ export default class DamageDialog extends HandlebarsApplicationMixin(Application static updateRollConfiguration(_event, _, formData) { const data = foundry.utils.expandObject(formData.object); - foundry.utils.mergeObject(this.config.roll, data.roll); + + if (this.config.damageFormula) + foundry.utils.mergeObject(this.config.damageFormula, data.damageFormula); + + foundry.utils.mergeObject(this.config.resourceFormulas, data.resourceFormulas); foundry.utils.mergeObject(this.config.modifiers, data.modifiers); this.config.selectedMessageMode = data.selectedMessageMode; diff --git a/module/applications/dialogs/deathMove.mjs b/module/applications/dialogs/deathMove.mjs index 4a949b99..cfd7687b 100644 --- a/module/applications/dialogs/deathMove.mjs +++ b/module/applications/dialogs/deathMove.mjs @@ -139,13 +139,15 @@ export default class DhDeathMove extends HandlebarsApplicationMixin(ApplicationV name: game.i18n.localize('DAGGERHEART.CONFIG.DeathMoves.blazeOfGlory.name'), description: game.i18n.localize('DAGGERHEART.CONFIG.DeathMoves.blazeOfGlory.description'), img: CONFIG.DH.GENERAL.deathMoves.blazeOfGlory.img, - changes: [ - { - key: 'system.rules.roll.guaranteedCritical', - mode: 2, - value: 'true' - } - ] + system: { + changes: [ + { + key: 'system.rules.roll.guaranteedCritical', + type: 'add', + value: 'true' + } + ] + } } ]); @@ -183,8 +185,6 @@ export default class DhDeathMove extends HandlebarsApplicationMixin(ApplicationV if (result === undefined) return; - const autoExpandDescription = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance) - .expandRollMessage?.desc; const cls = getDocumentClass('ChatMessage'); const msg = { @@ -200,7 +200,6 @@ export default class DhDeathMove extends HandlebarsApplicationMixin(ApplicationV img: this.selectedMove.img, description: game.i18n.localize(this.selectedMove.description), result: result, - open: autoExpandDescription ? 'open' : '', showRiskItAllButton: this.showRiskItAllButton, riskItAllButtonLabel: this.riskItAllButtonLabel, riskItAllHope: this.riskItAllHope diff --git a/module/applications/dialogs/downtime.mjs b/module/applications/dialogs/downtime.mjs index e209cc3b..5ba8e48e 100644 --- a/module/applications/dialogs/downtime.mjs +++ b/module/applications/dialogs/downtime.mjs @@ -196,9 +196,6 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV .filter(x => x.testUserPermission(game.user, 'LIMITED')) .filter(x => x.uuid !== this.actor.uuid); - const autoExpandDescription = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance) - .expandRollMessage?.desc; - const cls = getDocumentClass('ChatMessage'); const msg = { user: game.user.id, @@ -219,8 +216,7 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV actor: { name: this.actor.name, img: this.actor.img }, moves: moves, characters: characters, - selfId: this.actor.uuid, - open: autoExpandDescription ? 'open' : '' + selfId: this.actor.uuid } ), flags: { diff --git a/module/applications/dialogs/groupRollDialog.mjs b/module/applications/dialogs/groupRollDialog.mjs index ebc80d39..779562cb 100644 --- a/module/applications/dialogs/groupRollDialog.mjs +++ b/module/applications/dialogs/groupRollDialog.mjs @@ -1,7 +1,7 @@ import { ResourceUpdateMap } from '../../data/action/baseAction.mjs'; import { shouldUseHopeFearAutomation } from '../../helpers/utils.mjs'; import { emitGMUpdate, GMUpdateEvent, RefreshType, socketEvent } from '../../systemRegistration/socket.mjs'; -import Party from '../sheets/actors/party.mjs'; +import PartySheet from '../sheets/actors/party.mjs'; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; @@ -11,7 +11,7 @@ export default class GroupRollDialog extends HandlebarsApplicationMixin(Applicat this.party = party; this.partyMembers = party.system.partyMembers - .filter(x => Party.DICE_ROLL_ACTOR_TYPES.includes(x.type)) + .filter(x => PartySheet.DICE_ROLL_ACTOR_TYPES.includes(x.type)) .map(member => ({ ...member.toObject(), uuid: member.uuid, diff --git a/module/applications/dialogs/tagTeamDialog.mjs b/module/applications/dialogs/tagTeamDialog.mjs index 19869a00..4c6c5339 100644 --- a/module/applications/dialogs/tagTeamDialog.mjs +++ b/module/applications/dialogs/tagTeamDialog.mjs @@ -1,8 +1,9 @@ import { ResourceUpdateMap } from '../../data/action/baseAction.mjs'; +import { ChatDamageData } from '../../data/chat-message/chatDamageData.mjs'; import { MemberData } from '../../data/tagTeamData.mjs'; import { getCritDamageBonus, shouldUseHopeFearAutomation } from '../../helpers/utils.mjs'; import { emitGMUpdate, GMUpdateEvent, RefreshType, socketEvent } from '../../systemRegistration/socket.mjs'; -import Party from '../sheets/actors/party.mjs'; +import PartySheet from '../sheets/actors/party.mjs'; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; @@ -13,7 +14,7 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio this.usesTagTeamHopeCost = true; this.party = party; this.partyMembers = party.system.partyMembers - .filter(x => Party.DICE_ROLL_ACTOR_TYPES.includes(x.type)) + .filter(x => PartySheet.DICE_ROLL_ACTOR_TYPES.includes(x.type)) .map(member => ({ ...member.toObject(), uuid: member.uuid, @@ -140,7 +141,7 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio const hasRolled = Boolean(data.rollData); if (!hasRolled) return false; - return !data.rollData.options.hasDamage || Boolean(data.rollData.options.damage); + return !data.rollData.options.hasDamage || data.damageRollData.active; }); return context; @@ -181,7 +182,7 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio const selectedRoll = Object.values(this.party.system.tagTeam.members).find(member => member.selected); const critSelected = !selectedRoll ? undefined - : (selectedRoll?.rollData?.options?.roll?.isCritical ?? false); + : (selectedRoll?.roll?.isCritical ?? false); partContext.hintText = await this.getInfoTexts(this.party.system.tagTeam.members); partContext.joinedRoll = await this.getJoinedRoll({ @@ -208,6 +209,16 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio const rollOptions = []; const damageRollOptions = []; + + if (actor?.system.usedUnarmed) { + damageRollOptions.push({ + value: actor.system.attack.uuid, + label: actor.system.usedUnarmed.name, + group: actor.name, + baseAction: actor.system.attack + }); + } + for (const item of actor?.items ?? []) { if (!item.system.metadata.hasActions) continue; const actions = [...item.system.actions, ...(item.system.attack ? [item.system.attack] : [])]; @@ -225,8 +236,7 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio } 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; + const critSelected = !selectedRoll ? undefined : (selectedRoll?.roll?.isCritical ?? false); return { ...data, @@ -237,9 +247,9 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio hasRolled: Boolean(data.rollData), rollOptions, damageRollOptions, - damage: damage, - critDamage: await this.getCriticalDamage(damage), - useCritDamage: critSelected || (critSelected === undefined && data.rollData?.options?.roll?.isCritical) + damage: data.damageRollData, + critDamage: await this.getCriticalDamage(data.damageRollData), + useCritDamage: critSelected || (critSelected === undefined && data.roll?.isCritical) }; } @@ -369,7 +379,7 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio let rollIsSelected = false; for (const member of Object.values(members)) { const rollFinished = Boolean(member.rollData); - const damageFinished = member.rollData?.options?.hasDamage ? Boolean(member.rollData.options.damage) : true; + const damageFinished = member.rollData?.options?.hasDamage ? member.damageRollData.active : true; rollsAreFinished = rollsAreFinished && rollFinished && damageFinished; rollIsSelected = rollIsSelected || member.selected; @@ -530,17 +540,10 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio 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 - } - } + [`system.tagTeam.members.${memberKey}.damageRollData`]: config.damage }, this.getUpdatingParts(button) ); @@ -548,15 +551,11 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio 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 - } + [`system.tagTeam.members.${memberKey}.damageRollData`]: { + main: null, + resources: _replace({}) } }, this.getUpdatingParts(button) @@ -564,89 +563,44 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio } static async #rerollDamageDice(_, button) { - const { memberKey, damageKey, part, dice } = button.dataset; + const { isResource, memberKey, damageKey, diceIndex, resultIndex } = 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); + await memberData.damageRollData.rerollDamageDie(isResource, damageKey, diceIndex, resultIndex); + const basePath = `system.tagTeam.members.${memberKey}.damageRollData`; + const updatePath = isResource ? `${basePath}.resources.${damageKey}` : `${basePath}.main`; + const updateValue = isResource ? + memberData.damageRollData.resources[damageKey] : memberData.damageRollData.main; this.updatePartyData( { - [`system.tagTeam.members.${memberKey}.rollData`]: rollData + [updatePath]: updateValue.toJSON() }, 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; + async getCriticalDamage(origDamage) { + const newDamage = origDamage ? ChatDamageData.fromJSON(JSON.stringify(origDamage)) : null; + if (newDamage?.main) { + const criticalDamage = await getCritDamageBonus(newDamage.main.formula); + if (criticalDamage) { + const criticalTerm = new foundry.dice.terms.NumericTerm({ number: criticalDamage, evaluated: true }); + criticalTerm.evaluate(); + newDamage.main = await Roll.fromTerms([ + ...origDamage.main.terms, + new foundry.dice.terms.OperatorTerm({ operator: '+' }), + criticalTerm + ]); + newDamage.main.options = foundry.utils.deepClone(origDamage.main.options); } - } - - 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( @@ -657,7 +611,12 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio {} ) }, - this.getUpdatingParts(button) + /* Selecting a roll must update all member sections hbs to display the correct damage information incase of a critical */ + [ + ...Object.keys(this.party.system.tagTeam.members), + this.constructor.PARTS.rollSelection.id, + this.constructor.PARTS.result.id + ] ); } @@ -675,29 +634,65 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio 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); + mainRoll.damageRollData = baseMainRoll.damageRollData ? + ChatDamageData.fromJSON(JSON.stringify(baseMainRoll.damageRollData)) : null; + const secondaryRoll = new MemberData(baseSecondaryRoll.toObject()); + secondaryRoll.damageRollData = baseSecondaryRoll.damageRollData ? + ChatDamageData.fromJSON(JSON.stringify(baseSecondaryRoll.damageRollData)) : null; - if (secondaryRollData?.options.hasDamage) { + const isCritical = overrideIsCritical ?? mainRoll.roll.isCritical; + if (isCritical) mainRoll.damageRollData = await this.getCriticalDamage(mainRoll.damageRollData); + + if (secondaryRoll.damageRollData) { const secondaryDamage = (displayVersion ? overrideIsCritical : isCritical) - ? await this.getCriticalDamage(secondaryRollData.options.damage) - : secondaryRollData.options.damage; - if (systemData.damage) { - for (const [key, damage] of Object.entries(secondaryDamage ?? {})) { - if (key in systemData.damage) { - 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); + ? await this.getCriticalDamage(secondaryRoll.damageRollData) + : secondaryRoll.damageRollData; + if (mainRoll.damageRollData) { + if (secondaryDamage.main) { + if (mainRoll.damageRollData.main) { + mainRoll.damageRollData.main = Roll.fromTerms([ + ...baseMainRoll.damageRollData.main.terms, + new foundry.dice.terms.OperatorTerm({ operator: '+' }), + ...baseSecondaryRoll.damageRollData.main.terms + ]); + + /* Joining the roll.options of both rolls */ + const joinedDamageTypes = new Set([ + ...baseMainRoll.damageRollData.main.options.damageTypes, + ...baseSecondaryRoll.damageRollData.main.options.damageTypes + ]); + mainRoll.damageRollData.main.options = { + ...baseMainRoll.damageRollData.main.options, + damageTypes: [...joinedDamageTypes] + }; } else { - systemData.damage[key] = damage; + mainRoll.damageRollData.main = secondaryDamage.main; + } + } + + for (const [key, damage] of Object.entries(secondaryDamage.resources ?? {})) { + if (key in mainRoll.damageRollData.resources) { + mainRoll.damageRollData.resources[key] = Roll.fromTerms([ + ...baseMainRoll.damageRollData.resources[key].terms, + new foundry.dice.terms.OperatorTerm({ operator: '+' }), + ...baseSecondaryRoll.damageRollData.resources[key].terms + ]); + + /* Joining the roll.options of both rolls */ + const joinedDamageTypes = new Set([ + ...baseMainRoll.damageRollData.resources[key].options.damageTypes, + ...baseSecondaryRoll.damageRollData.resources[key].options.damageTypes + ]); + mainRoll.damageRollData.resources[key].options = { + ...baseMainRoll.damageRollData.resources[key].options, + damageTypes: [...joinedDamageTypes] + }; + } else { + mainRoll.damageRollData.resources[key] = damage; } } } else { - systemData.damage = secondaryDamage; + mainRoll.damageRollData = secondaryDamage; } } @@ -752,13 +747,27 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio const mainActor = this.party.system.partyMembers.find(x => x.uuid === mainRoll.options.source.actor); mainRoll.options.title = game.i18n.localize('DAGGERHEART.APPLICATIONS.TagTeamSelect.chatMessageRollTitle'); + + /* This could assumably be done better. For some reason rolls don't get correctly done through rollData.toJSON */ + const systemData = { + ...mainRoll.options, + damage: joinedRoll.damageRollData?.toJSON() + }; + + if (joinedRoll.damageRollData.main) { + systemData.damage.main = joinedRoll.damageRollData.toJSON(); + } + for (const type of Object.keys(joinedRoll.damageRollData?.resources ?? {})) { + systemData.damage.resources[type] = joinedRoll.damageRollData.resources[type].toJSON(); + } + 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, + system: systemData, rolls: [JSON.stringify(joinedRoll.roll)], sound: null, flags: { core: { RollTable: true } } diff --git a/module/applications/sheets-configs/action-base-config.mjs b/module/applications/sheets-configs/action-base-config.mjs index b65e1cdf..e675fb3f 100644 --- a/module/applications/sheets-configs/action-base-config.mjs +++ b/module/applications/sheets-configs/action-base-config.mjs @@ -1,4 +1,4 @@ -import { getUnusedDamageTypes } from '../../helpers/utils.mjs'; +import { DHDamageData } from '../../data/fields/action/damageField.mjs'; import DaggerheartSheet from '../sheets/daggerheart-sheet.mjs'; const { ApplicationV2 } = foundry.applications.api; @@ -31,8 +31,10 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2) removeElement: this.removeElement, removeTransformActor: this.removeTransformActor, editEffect: this.editEffect, - addDamage: this.addDamage, - removeDamage: this.removeDamage, + addDamage: this.#onAddDamage, + removeDamage: this.#onRemoveDamage, + addDamageResource: this.#onAddDamageResource, + removeDamageResource: this.#onRemoveDamageResource, editDoc: this.editDoc, addTrigger: this.addTrigger, removeTrigger: this.removeTrigger, @@ -157,9 +159,9 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2) context.tabs = this._getTabs(this.constructor.TABS); context.config = CONFIG.DH; if (this.action.damage) { - context.allDamageTypesUsed = !getUnusedDamageTypes(this.action.damage.parts).length; - - if (this.action.damage.hasOwnProperty('includeBase') && this.action.type === 'attack') + const allKeys = Object.keys(CONFIG.DH.GENERAL.healingTypes); + context.allDamageTypesUsed = allKeys.every(k => k in this.action._source.damage.resources); + if (this.action.damage?.main?.hasOwnProperty('includeBase') && this.action.type === 'attack') context.hasBaseDamage = !!this.action.parent.attack; } @@ -253,7 +255,7 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2) const submitData = this._prepareSubmitData(event, formData); const data = foundry.utils.mergeObject(this.action.toObject(), submitData); - this.action = await this.action.update(data); + this.action = (await this.action.update(data)) ?? this.action; this.sheetUpdate?.(this.action); this.render(); @@ -299,53 +301,70 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2) this.constructor.updateForm.bind(this)(null, null, { object: foundry.utils.flattenObject(data) }); } - static addDamage(_event) { - if (!this.action.damage.parts) return; + /** @this DHActionBaseConfig */ + static #onAddDamage() { + if (!this.action.damage || this.action.damage?.main) return; - const choices = getUnusedDamageTypes(this.action._source.damage.parts); + const data = this.action.toObject(); + data.damage.main = { + ...DHDamageData.schema.getInitialValue(), + applyTo: 'hitPoints', + type: 'physical' + }; + this.constructor.updateForm.bind(this)(null, null, { object: foundry.utils.flattenObject(data) }); + } + + /** @this DHActionBaseConfig */ + static #onRemoveDamage() { + if (!this.action.damage?.main) return; + const data = this.action.toObject(); + data.damage.main = null; + this.constructor.updateForm.bind(this)(null, null, { object: foundry.utils.flattenObject(data) }); + } + + /** @this DHActionBaseConfig */ + static #onAddDamageResource(_event) { + if (!this.action.damage) return; + + const allKeys = Object.keys(CONFIG.DH.GENERAL.healingTypes); + const unused = allKeys.filter(k => !(k in this.action._source.damage.resources)); + const choices = unused.map(k => ({ value: k, label: _loc(CONFIG.DH.GENERAL.healingTypes[k].label) })); const content = new foundry.data.fields.StringField({ - label: game.i18n.localize('Damage Type'), + label: _loc('DAGGERHEART.GENERAL.Resource.single'), choices, required: true - }).toFormGroup( - {}, - { - name: 'type', - localize: true, - nameAttr: 'value', - labelAttr: 'label' - } - ).outerHTML; + }).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; + data.damage.resources[type] = { + ...this.action.schema.fields.damage.fields.resources.element.getInitialValue(), + applyTo: type + }; 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 } - ) + { + action: 'ok', + label: 'Confirm', + icon: 'fas fa-check', + default: true, + callback + } ], content: content, rejectClose: false, modal: false, window: { - title: game.i18n.localize('Add Damage') + title: _loc('DAGGERHEART.ACTIONS.Config.damage.addResource') }, position: { width: 300 } }); @@ -353,12 +372,12 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2) typeDialog.render(true); } - static removeDamage(_event, button) { - if (!this.action.damage.parts) return; + /** @this DHActionBaseConfig */ + static #onRemoveDamageResource(_event, button) { + if (!this.action.damage?.resources) return; const data = this.action.toObject(); const key = button.dataset.key; - delete data.damage.parts[key]; - data.damage.parts[`${key}`] = _del; + data.damage.resources[key] = _del; this.constructor.updateForm.bind(this)(null, null, { object: foundry.utils.flattenObject(data) }); } diff --git a/module/applications/sheets-configs/activeEffectConfig.mjs b/module/applications/sheets-configs/activeEffectConfig.mjs index 2d9eafc3..2967c5f1 100644 --- a/module/applications/sheets-configs/activeEffectConfig.mjs +++ b/module/applications/sheets-configs/activeEffectConfig.mjs @@ -155,6 +155,10 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac .querySelector('.stacking-change-checkbox') ?.addEventListener('change', this.stackingChangeToggle.bind(this)); + htmlElement + .querySelector('.range-dependence-change-checkbox') + ?.addEventListener('change', this.rangeDependenceChangeToggle.bind(this)); + htmlElement .querySelector('.armor-change-checkbox') ?.addEventListener('change', this.armorChangeToggle.bind(this)); @@ -224,6 +228,20 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac return this.submit({ updateData: { system: systemData } }); } + rangeDependenceChangeToggle(event) { + const rangeFields = this.document.system.schema.fields.rangeDependence.fields; + const systemData = { + rangeDependence: event.target.checked + ? _replace({ + type: rangeFields.type.initial, + target: rangeFields.target.initial, + range: rangeFields.range.initial + }) + : null + }; + return this.submit({ updateData: { system: systemData } }); + } + armorChangeToggle(event) { if (event.target.checked) { this.addArmorChange(); diff --git a/module/applications/sheets-configs/adversary-settings.mjs b/module/applications/sheets-configs/adversary-settings.mjs index ff3f3039..0bf18ee6 100644 --- a/module/applications/sheets-configs/adversary-settings.mjs +++ b/module/applications/sheets-configs/adversary-settings.mjs @@ -1,3 +1,4 @@ +import { DHDamageData } from '../../data/fields/action/damageField.mjs'; import DHBaseActorSettings from '../sheets/api/actor-setting.mjs'; /**@typedef {import('@client/applications/_types.mjs').ApplicationClickAction} ApplicationClickAction */ @@ -8,8 +9,10 @@ export default class DHAdversarySettings extends DHBaseActorSettings { classes: ['adversary-settings'], position: { width: 455, height: 'auto' }, actions: { - addExperience: DHAdversarySettings.#addExperience, - removeExperience: DHAdversarySettings.#removeExperience + addExperience: this.#onAddExperience, + removeExperience: this.#onRemoveExperience, + addDamage: this.#onAddDamage, + removeDamage: this.#onRemoveDamage } }; @@ -71,7 +74,7 @@ export default class DHAdversarySettings extends DHBaseActorSettings { * Adds a new experience entry to the actor. * @type {ApplicationClickAction} */ - static async #addExperience() { + static async #onAddExperience() { const newExperience = { name: 'Experience', modifier: 0 @@ -83,7 +86,7 @@ export default class DHAdversarySettings extends DHBaseActorSettings { * Removes an experience entry from the actor. * @type {ApplicationClickAction} */ - static async #removeExperience(_, target) { + static async #onRemoveExperience(_, target) { const experience = this.actor.system.experiences[target.dataset.experience]; const confirmed = await foundry.applications.api.DialogV2.confirm({ window: { @@ -98,4 +101,28 @@ export default class DHAdversarySettings extends DHBaseActorSettings { await this.actor.update({ [`system.experiences.${target.dataset.experience}`]: _del }); } + + /** + * @this DHAdversarySettings + * @type {ApplicationClickAction} + */ + static #onAddDamage() { + this.actor.update({ + 'system.attack.damage.main': { + ...DHDamageData.schema.getInitialValue(), + applyTo: 'hitPoints', + type: 'physical' + } + }); + } + + /** + * @this DHAdversarySettings + * @type {ApplicationClickAction} + */ + static #onRemoveDamage() { + this.actor.update({ + 'system.attack.damage.main': null + }); + } } diff --git a/module/applications/sheets/actors/_types.d.ts b/module/applications/sheets/actors/_types.d.ts index 89adc57b..368801b9 100644 --- a/module/applications/sheets/actors/_types.d.ts +++ b/module/applications/sheets/actors/_types.d.ts @@ -1,8 +1,18 @@ import DhCompanion from '../../../data/actor/companion.mjs'; +import DhParty from '../../../data/actor/party.mjs'; import DhpActor from '../../../documents/actor.mjs'; declare module './companion.mjs' { export default interface DhCompanionSheet { actor: DhpActor; + document: DhpActor; } } + +declare module './party.mjs' { + export default interface PartySheet { + actor: DhpActor; + document: DhpActor; + } +} + diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index ea69f27d..5107df12 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -915,7 +915,7 @@ export default class CharacterSheet extends DHBaseActorSheet { const doc = await getDocFromElement(button); const { available } = this.document.system.loadoutSlot; if (doc.system.inVault && !available && !doc.system.loadoutIgnore) { - return ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.loadoutMaxReached')); + return ui.notifications.warn('DAGGERHEART.UI.Notifications.loadoutMaxReached', { localize: true }); } await doc?.update({ 'system.inVault': !doc.system.inVault }); @@ -1216,10 +1216,22 @@ export default class CharacterSheet extends DHBaseActorSheet { if (!confirmed) return; } - if (this.document.uuid === item.parent?.uuid) { + // Check for same actor drag/drop attempts + const isSameActor = this.document.uuid === item.parent?.uuid; + const loadoutFieldset = event.target.closest('[data-in-vault]'); + const vaulting = loadoutFieldset?.dataset.inVault === 'true'; + if (isSameActor && loadoutFieldset && item.type === 'domainCard' && vaulting !== item.system.inVault) { + // This is likely an attempt to vault or unvault an item + const { available } = this.document.system.loadoutSlot; + if (!vaulting && !available && !item.system.loadoutIgnore) { + return ui.notifications.warn('DAGGERHEART.UI.Notifications.loadoutMaxReached', { localize: true }); + } + return item.update({ 'system.inVault': vaulting }); + } else if (isSameActor) { return super._onDropItem(event, item); } + // Handle beastforms if (item.type === 'beastform') { if (this.document.effects.find(x => x.type === 'beastform')) { return ui.notifications.warn( diff --git a/module/applications/sheets/actors/party.mjs b/module/applications/sheets/actors/party.mjs index 3af8ea5f..a911669e 100644 --- a/module/applications/sheets/actors/party.mjs +++ b/module/applications/sheets/actors/party.mjs @@ -6,7 +6,9 @@ import DaggerheartMenu from '../../sidebar/tabs/daggerheartMenu.mjs'; import { socketEvent } from '../../../systemRegistration/socket.mjs'; import DhpActor from '../../../documents/actor.mjs'; -export default class Party extends DHBaseActorSheet { +/**@typedef {import('@client/applications/_types.mjs').ApplicationClickAction} ApplicationClickAction */ + +export default class PartySheet extends DHBaseActorSheet { constructor(options) { super(options); @@ -24,17 +26,17 @@ export default class Party extends DHBaseActorSheet { resizable: true }, actions: { - openDocument: Party.#openDocument, - deletePartyMember: Party.#deletePartyMember, - toggleHope: Party.#toggleHope, - toggleHitPoints: Party.#toggleHitPoints, - toggleStress: Party.#toggleStress, - toggleArmorSlot: Party.#toggleArmorSlot, - tempBrowser: Party.#tempBrowser, - refeshActions: Party.#refeshActions, - triggerRest: Party.#triggerRest, - tagTeamRoll: Party.#tagTeamRoll, - groupRoll: Party.#groupRoll + openDocument: PartySheet.#onOpenDocument, + deletePartyMember: PartySheet.#onDeletePartyMember, + toggleHope: PartySheet.#onToggleHope, + toggleHitPoints: PartySheet.#onToggleHitPoints, + toggleStress: PartySheet.#onToggleStress, + toggleArmorSlot: PartySheet.#onToggleArmorSlot, + tempBrowser: PartySheet.#onTempBrowser, + refreshActions: PartySheet.#onRefreshActions, + triggerRest: PartySheet.#onTriggerRest, + tagTeamRoll: PartySheet.#onTagTeamRoll, + groupRoll: PartySheet.#onGroupRoll }, dragDrop: [{ dragSelector: '[data-item-id]', dropSelector: null }] }; @@ -72,6 +74,23 @@ export default class Party extends DHBaseActorSheet { this._createSearchFilter(); } + /** @inheritdoc */ + _toggleDisabled(disabled) { + // Overriden to only disable text inputs by default if the user is a member + const isMember = this.actor.system.partyMembers.some( + m => m.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER) + ); + if (!isMember) return super._toggleDisabled(disabled); + + const form = this.form; + for (const input of form.querySelectorAll('input:not([type=search]), .editor.prosemirror')) { + input.disabled = disabled; + } + for (const element of form.querySelectorAll('.input[contenteditable]')) { + element.classList.toggle('disabled', disabled); + } + } + /* -------------------------------------------- */ /* Prepare Context */ /* -------------------------------------------- */ @@ -198,8 +217,16 @@ export default class Party extends DHBaseActorSheet { }; } } + + /* -------------------------------------------- */ + /* Event handlers */ + /* -------------------------------------------- */ - static async #openDocument(_, target) { + /** + * @this PartySheet + * @type {ApplicationClickAction} + */ + static async #onOpenDocument(_, target) { const uuid = target.dataset.uuid; const document = await foundry.utils.fromUuid(uuid); document?.sheet?.render(true); @@ -207,9 +234,10 @@ export default class Party extends DHBaseActorSheet { /** * Toggles a hope resource value. + * @this PartySheet * @type {ApplicationClickAction} */ - static async #toggleHope(_, target) { + static async #onToggleHope(_, target) { const hopeValue = Number.parseInt(target.dataset.value); const actor = await foundry.utils.fromUuid(target.dataset.actorId); const newValue = actor.system.resources.hope.value >= hopeValue ? hopeValue - 1 : hopeValue; @@ -219,9 +247,10 @@ export default class Party extends DHBaseActorSheet { /** * Toggles a hp resource value. + * @this PartySheet * @type {ApplicationClickAction} */ - static async #toggleHitPoints(_, target) { + static async #onToggleHitPoints(_, target) { const hitPointsValue = Number.parseInt(target.dataset.value); const actor = await foundry.utils.fromUuid(target.dataset.actorId); const newValue = actor.system.resources.hitPoints.value >= hitPointsValue ? hitPointsValue - 1 : hitPointsValue; @@ -231,9 +260,10 @@ export default class Party extends DHBaseActorSheet { /** * Toggles a stress resource value. + * @this PartySheet * @type {ApplicationClickAction} */ - static async #toggleStress(_, target) { + static async #onToggleStress(_, target) { const stressValue = Number.parseInt(target.dataset.value); const actor = await foundry.utils.fromUuid(target.dataset.actorId); const newValue = actor.system.resources.stress.value >= stressValue ? stressValue - 1 : stressValue; @@ -243,9 +273,10 @@ export default class Party extends DHBaseActorSheet { /** * Toggles a armor slot resource value. + * @this PartySheet * @type {ApplicationClickAction} */ - static async #toggleArmorSlot(_, target) { + static async #onToggleArmorSlot(_, target) { const actor = await foundry.utils.fromUuid(target.dataset.actorId); const { value, max } = actor.system.armorScore; const inputValue = Number.parseInt(target.dataset.value); @@ -258,12 +289,19 @@ export default class Party extends DHBaseActorSheet { /** * Opens Compedium Browser + * @this PartySheet + * @type {ApplicationClickAction} */ - static async #tempBrowser(_, target) { + static async #onTempBrowser(_, target) { new ItemBrowser().render({ force: true }); } - static async #refeshActions() { + /** + * @todo Is this unused? + * @this PartySheet + * @type {ApplicationClickAction} + */ + static async #onRefreshActions() { const confirmed = await foundry.applications.api.DialogV2.confirm({ window: { title: 'New Section', @@ -281,7 +319,11 @@ export default class Party extends DHBaseActorSheet { if (!confirmed) return; } - static async #triggerRest(_, button) { + /** + * @this PartySheet + * @type {ApplicationClickAction} + */ + static async #onTriggerRest(_, button) { const confirmed = await foundry.applications.api.DialogV2.confirm({ window: { title: game.i18n.localize(`DAGGERHEART.APPLICATIONS.Downtime.${button.dataset.type}.title`), @@ -304,6 +346,30 @@ export default class Party extends DHBaseActorSheet { }); } + /** + * @this PartySheet + * @type {ApplicationClickAction} + */ + static async #onDeletePartyMember(event, target) { + const doc = await foundry.utils.fromUuid(target.closest('[data-uuid]')?.dataset.uuid); + if (!event.shiftKey) { + const confirmed = await foundry.applications.api.DialogV2.confirm({ + window: { + title: game.i18n.format('DAGGERHEART.ACTORS.Party.RemoveConfirmation.title', { + name: doc.name + }) + }, + content: game.i18n.format('DAGGERHEART.ACTORS.Party.RemoveConfirmation.text', { name: doc.name }) + }); + + if (!confirmed) return; + } + + const currentMembers = this.document.system.partyMembers.map(x => x.uuid); + const newMembersList = currentMembers.filter(uuid => uuid !== doc.uuid); + await this.document.update({ 'system.partyMembers': newMembersList }); + } + static async downtimeMoveQuery({ actorId, downtimeType }) { const actor = await foundry.utils.fromUuid(actorId); if (!actor || !actor?.isOwner) return; @@ -312,11 +378,19 @@ export default class Party extends DHBaseActorSheet { }); } - static async #tagTeamRoll() { + /** + * @this PartySheet + * @type {ApplicationClickAction} + */ + static async #onTagTeamRoll() { new game.system.api.applications.dialogs.TagTeamDialog(this.document).render({ force: true }); } - static async #groupRoll(_params) { + /** + * @this PartySheet + * @type {ApplicationClickAction} + */ + static async #onGroupRoll(_params) { new game.system.api.applications.dialogs.GroupRollDialog(this.document).render({ force: true }); } @@ -460,11 +534,10 @@ export default class Party extends DHBaseActorSheet { } } - /* -------------------------------------------- */ - + /** @inheritdoc */ async _onDropActor(event, document) { const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event); - if (document instanceof DhpActor && Party.ALLOWED_ACTOR_TYPES.includes(document.type)) { + if (document instanceof DhpActor && PartySheet.ALLOWED_ACTOR_TYPES.includes(document.type)) { const currentMembers = this.document.system.partyMembers.map(x => x.uuid); if (currentMembers.includes(data.uuid)) { return ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.duplicateCharacter')); @@ -477,24 +550,4 @@ export default class Party extends DHBaseActorSheet { return null; } - - static async #deletePartyMember(event, target) { - const doc = await foundry.utils.fromUuid(target.closest('[data-uuid]')?.dataset.uuid); - if (!event.shiftKey) { - const confirmed = await foundry.applications.api.DialogV2.confirm({ - window: { - title: game.i18n.format('DAGGERHEART.ACTORS.Party.RemoveConfirmation.title', { - name: doc.name - }) - }, - content: game.i18n.format('DAGGERHEART.ACTORS.Party.RemoveConfirmation.text', { name: doc.name }) - }); - - if (!confirmed) return; - } - - const currentMembers = this.document.system.partyMembers.map(x => x.uuid); - const newMembersList = currentMembers.filter(uuid => uuid !== doc.uuid); - await this.document.update({ 'system.partyMembers': newMembersList }); - } } diff --git a/module/applications/sheets/api/base-item.mjs b/module/applications/sheets/api/base-item.mjs index 1e08fc05..70a6bcc6 100644 --- a/module/applications/sheets/api/base-item.mjs +++ b/module/applications/sheets/api/base-item.mjs @@ -30,7 +30,8 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) { addFeature: DHBaseItemSheet.#addFeature, deleteFeature: DHBaseItemSheet.#deleteFeature, addResource: DHBaseItemSheet.#addResource, - removeResource: DHBaseItemSheet.#removeResource + removeResource: DHBaseItemSheet.#removeResource, + editGMNote: DHBaseItemSheet.#onEditGMNote }, dragDrop: [ { dragSelector: null, dropSelector: '.drop-section' }, @@ -76,10 +77,16 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) { /**@inheritdoc */ async _preparePartContext(partId, context, options) { await super._preparePartContext(partId, context, options); + const TextEditor = foundry.applications.ux.TextEditor.implementation; switch (partId) { case 'description': - context.enrichedDescription = await this.document.system.getEnrichedDescription(); + context.enrichedDescription = await this.document.system.getEnrichedDescription({ gmNotes: false }); + context.enrichedGMNotes = await TextEditor.implementation.enrichHTML(this.item.system.gmNotes, { + relativeTo: this.item, + rollData: this.item.getRollData(), + secrets: this.item.isOwner + }) break; case 'effects': await this._prepareEffectsContext(context, options); @@ -331,4 +338,45 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) { } } } + + /** + * Handles the Add GM Note button being pressed. This is only used when an item has no GM notes. + * Later edits to a GM note instead go through the normal editor toggle workflow. + * @this DHBaseItemSheet + */ + static #onEditGMNote() { + // Open the editor, which might be hidden. We remove the css class to hide temporarily + // so that menu auto resizing functions properly. + const editor = this.element.querySelector('prose-mirror[name="system.gmNotes"]'); + const wasHidden = editor.classList.contains('hide-if-inactive'); + editor.classList.remove('hide-if-inactive'); + editor.open = true; + window.setTimeout(() => { + if (wasHidden) editor.classList.add('hide-if-inactive'); + }, 0); + } + + /** @inheritdoc */ + async _onRender(context, options) { + await super._onRender(context, options); + + // Render an add gmnotes button if there are no set GM notes. + // We need to re-render on close since its possible to prosemirror to close *without* triggering a full re-render + if (game.user.isGM && !this.item.system.gmNotes) { + const description = this.element.querySelector('[name="system.description"]'); + const addButton = () => { + if (description.querySelector('[data-action=editGMNote]')) return; + + const button = document.createElement('button'); + button.type = 'button'; + button.classList.add('icon', 'toggle', 'fa-regular', 'fa-note-medical'); + button.dataset.action = 'editGMNote'; + button.dataset.tooltip = 'DAGGERHEART.ITEMS.Base.addGMNote'; + description.appendChild(button); + } + + addButton(); + description.addEventListener('close', () => addButton()); + } + } } diff --git a/module/applications/ui/chatLog.mjs b/module/applications/ui/chatLog.mjs index d528541c..35a4a966 100644 --- a/module/applications/ui/chatLog.mjs +++ b/module/applications/ui/chatLog.mjs @@ -110,7 +110,7 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo const message = game.messages.get(li.dataset.messageId); return message.system.hasRoll && (game.user.isGM || message.isAuthor); }, - callback: async li => { + onClick: async (_event, li) => { const message = game.messages.get(li.dataset.messageId); const reroll = await message.rolls[0].reroll({ liveRoll: true }); message.update({ rolls: [reroll] }); @@ -126,7 +126,7 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo : false; return (game.user.isGM || message.isAuthor) && hasRolledDamage; }, - callback: async li => { + onClick: async (_event, li) => { const message = game.messages.get(li.dataset.messageId); const update = await message.system.getRerolledDamage(); message.update(update); @@ -182,28 +182,15 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo } async onRollSimple(event, message) { - const buttonType = event.target.dataset.type ?? 'damage', - total = message.rolls.reduce((a, c) => a + Roll.fromJSON(c).total, 0), - damages = { - hitPoints: { - parts: [ - { - applyTo: 'hitPoints', - damageTypes: [], - total - } - ] - } - }, - targets = Array.from(game.user.targets); - + const buttonType = event.target.dataset.type ?? 'damage'; + const total = message.rolls.reduce((a, c) => a + Roll.fromJSON(c).total, 0); + const targets = Array.from(game.user.targets); if (targets.length === 0) return ui.notifications.info(game.i18n.localize('DAGGERHEART.UI.Notifications.noTargetsSelected')); - - targets.forEach(target => { - if (buttonType === 'healing') target.actor.takeHealing(damages); - else target.actor.takeDamage(damages); - }); + for (const target of targets) { + if (buttonType === 'healing') target.actor.takeHealing({ hitPoints: total }); + else target.actor.takeDamage({ total }); + } } async abilityUseButton(event, message) { @@ -259,26 +246,17 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo } const message = game.messages.get(messageData._id); - const target = event.target.closest('[data-die-index]'); + const target = event.target.closest('[data-result]'); 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 - } + const { isResource, damageType, dice, result } = target.dataset; + await message.system.damage.rerollDamageDie(isResource, damageType, dice, result); + + const updatePath = isResource ? `system.damage.resources.${damageType}` : 'system.damage.main'; + const updateValue = isResource ? + message.system.damage.resources[damageType] : message.system.damage.main; + await message.update({ + [updatePath]: updateValue.toJSON() }); } else { const rerollDice = message.system.roll.dice[target.dataset.dieIndex]; diff --git a/module/config/encounterConfig.mjs b/module/config/encounterConfig.mjs index 4e0f8a6e..6ea03fcf 100644 --- a/module/config/encounterConfig.mjs +++ b/module/config/encounterConfig.mjs @@ -90,18 +90,20 @@ export const BPModifiers = { name: 'DAGGERHEART.CONFIG.BPModifiers.increaseDamage.effect.name', description: 'DAGGERHEART.CONFIG.BPModifiers.increaseDamage.effect.description', img: 'icons/magic/control/buff-flight-wings-red.webp', - changes: [ - { - key: 'system.bonuses.damage.physical.dice', - mode: 2, - value: '1d4' - }, - { - key: 'system.bonuses.damage.magical.dice', - mode: 2, - value: '1d4' - } - ] + system: { + changes: [ + { + key: 'system.bonuses.damage.physical.dice', + type: 'add', + value: '1d4' + }, + { + key: 'system.bonuses.damage.magical.dice', + type: 'add', + value: '1d4' + } + ] + } } ] } diff --git a/module/config/generalConfig.mjs b/module/config/generalConfig.mjs index 188efafb..802f5907 100644 --- a/module/config/generalConfig.mjs +++ b/module/config/generalConfig.mjs @@ -825,7 +825,7 @@ export const refreshTypes = { export const itemAbilityCosts = { resource: { id: 'resource', - label: 'DAGGERHEART.GENERAL.resource', + label: 'DAGGERHEART.GENERAL.Resource.single', group: 'Global' }, quantity: { diff --git a/module/config/itemConfig.mjs b/module/config/itemConfig.mjs index 43054ec5..61ed3703 100644 --- a/module/config/itemConfig.mjs +++ b/module/config/itemConfig.mjs @@ -37,13 +37,15 @@ export const armorFeatures = { name: 'DAGGERHEART.CONFIG.ArmorFeature.channeling.effects.channeling.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.channeling.effects.channeling.description', img: 'icons/magic/symbols/rune-sigil-horned-blue.webp', - changes: [ - { - key: 'system.bonuses.roll.spellcast', - mode: 2, - value: '1' - } - ] + system: { + changes: [ + { + key: 'system.bonuses.roll.spellcast', + type: 'add', + value: '1' + } + ] + } } ] }, @@ -55,43 +57,45 @@ export const armorFeatures = { name: 'DAGGERHEART.CONFIG.ArmorFeature.difficult.effects.difficult.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.difficult.effects.difficult.description', img: 'icons/magic/control/buff-flight-wings-red.webp', - changes: [ - { - key: 'system.traits.agility.value', - mode: 2, - value: '-1' - }, - { - key: 'system.traits.strength.value', - mode: 2, - value: '-1' - }, - { - key: 'system.traits.finesse.value', - mode: 2, - value: '-1' - }, - { - key: 'system.traits.instinct.value', - mode: 2, - value: '-1' - }, - { - key: 'system.traits.presence.value', - mode: 2, - value: '-1' - }, - { - key: 'system.traits.knowledge.value', - mode: 2, - value: '-1' - }, - { - key: 'system.evasion', - mode: 2, - value: '-1' - } - ] + system: { + changes: [ + { + key: 'system.traits.agility.value', + type: 'add', + value: '-1' + }, + { + key: 'system.traits.strength.value', + type: 'add', + value: '-1' + }, + { + key: 'system.traits.finesse.value', + type: 'add', + value: '-1' + }, + { + key: 'system.traits.instinct.value', + type: 'add', + value: '-1' + }, + { + key: 'system.traits.presence.value', + type: 'add', + value: '-1' + }, + { + key: 'system.traits.knowledge.value', + type: 'add', + value: '-1' + }, + { + key: 'system.evasion', + type: 'add', + value: '-1' + } + ] + } } ] }, @@ -103,13 +107,15 @@ export const armorFeatures = { name: 'DAGGERHEART.CONFIG.ArmorFeature.flexible.effects.flexible.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.flexible.effects.flexible.description', img: 'icons/magic/movement/abstract-ribbons-red-orange.webp', - changes: [ - { - key: 'system.evasion', - mode: 2, - value: '1' - } - ] + system: { + changes: [ + { + key: 'system.evasion', + type: 'add', + value: '1' + } + ] + } } ] }, @@ -121,13 +127,15 @@ export const armorFeatures = { name: 'DAGGERHEART.CONFIG.ArmorFeature.fortified.effects.fortified.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.fortified.effects.fortified.description', img: 'icons/magic/defensive/shield-barrier-glowing-blue.webp', - changes: [ - { - key: 'system.rules.damageReduction.increasePerArmorMark', - mode: 5, - value: '2' - } - ] + system: { + changes: [ + { + key: 'system.rules.damageReduction.increasePerArmorMark', + type: 'override', + value: '2' + } + ] + } } ] }, @@ -139,13 +147,15 @@ export const armorFeatures = { name: 'DAGGERHEART.CONFIG.ArmorFeature.gilded.effects.gilded.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.gilded.effects.gilded.description', img: 'icons/magic/control/control-influence-crown-gold.webp', - changes: [ - { - key: 'system.traits.presence.value', - mode: 2, - value: '1' - } - ] + system: { + changes: [ + { + key: 'system.traits.presence.value', + type: 'add', + value: '1' + } + ] + } } ] }, @@ -157,13 +167,15 @@ export const armorFeatures = { name: 'DAGGERHEART.CONFIG.ArmorFeature.heavy.effects.heavy.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.heavy.effects.heavy.description', img: 'icons/commodities/metal/ingot-worn-iron.webp', - changes: [ - { - key: 'system.evasion', - mode: 2, - value: '-1' - } - ] + system: { + changes: [ + { + key: 'system.evasion', + type: 'add', + value: '-1' + } + ] + } } ] }, @@ -212,13 +224,15 @@ export const armorFeatures = { name: 'DAGGERHEART.CONFIG.ArmorFeature.magical.effects.magical.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.magical.effects.magical.description', img: 'icons/magic/defensive/barrier-shield-dome-blue-purple.webp', - changes: [ - { - key: 'system.rules.damageReduction.magical', - mode: 5, - value: 1 - } - ] + system: { + changes: [ + { + key: 'system.rules.damageReduction.magical', + type: 'override', + value: 1 + } + ] + } } ] }, @@ -249,13 +263,15 @@ export const armorFeatures = { name: 'DAGGERHEART.CONFIG.ArmorFeature.physical.effects.physical.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.physical.effects.physical.description', img: 'icons/commodities/stone/ore-pile-tan.webp', - changes: [ - { - key: 'system.rules.damageReduction.physical', - mode: 5, - value: 1 - } - ] + system: { + changes: [ + { + key: 'system.rules.damageReduction.physical', + type: 'override', + value: 1 + } + ] + } } ] }, @@ -280,18 +296,20 @@ export const armorFeatures = { name: 'DAGGERHEART.CONFIG.ArmorFeature.reinforced.effects.reinforced.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.reinforced.effects.reinforced.description', img: 'icons/magic/defensive/shield-barrier-glowing-triangle-green.webp', - changes: [ - { - key: 'system.bunuses.damageThresholds.major', - mode: 2, - value: '2' - }, - { - key: 'system.bunuses.damageThresholds.severe', - mode: 2, - value: '2' - } - ] + system: { + changes: [ + { + key: 'system.bunuses.damageThresholds.major', + type: 'add', + value: '2' + }, + { + key: 'system.bunuses.damageThresholds.severe', + type: 'add', + value: '2' + } + ] + } } ] }, @@ -326,18 +344,20 @@ export const armorFeatures = { name: 'DAGGERHEART.CONFIG.ArmorFeature.sharp.effects.sharp.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.sharp.effects.sharp.description', img: 'icons/magic/defensive/shield-barrier-glowing-triangle-green.webp', - changes: [ - { - key: 'system.bonuses.damage.primaryWeapon.dice', - mode: 2, - value: '1d4' - }, - { - key: 'system.bonuses.damage.secondaryWeapon.dice', - mode: 2, - value: '1d4' - } - ] + system: { + changes: [ + { + key: 'system.bonuses.damage.primaryWeapon.dice', + type: 'add', + value: '1d4' + }, + { + key: 'system.bonuses.damage.secondaryWeapon.dice', + type: 'add', + value: '1d4' + } + ] + } } ] }, @@ -408,18 +428,20 @@ export const armorFeatures = { name: 'DAGGERHEART.CONFIG.ArmorFeature.veryHeavy.effects.veryHeavy.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.veryHeavy.effects.veryHeavy.description', img: 'icons/commodities/metal/ingot-stamped-steel.webp', - changes: [ - { - key: 'system.evasion', - mode: 2, - value: '-2' - }, - { - key: 'system.traits.agility.value', - mode: 2, - value: '-1' - } - ] + system: { + changes: [ + { + key: 'system.evasion', + type: 'add', + value: '-2' + }, + { + key: 'system.traits.agility.value', + type: 'add', + value: '-1' + } + ] + } } ] }, @@ -431,14 +453,16 @@ export const armorFeatures = { name: 'DAGGERHEART.CONFIG.ArmorFeature.warded.effects.warded.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.warded.effects.warded.description', img: 'icons/magic/defensive/barrier-shield-dome-pink.webp', - changes: [ - { - key: 'system.resistance.magical.reduction', - mode: 2, - value: '@system.armorScore', - priority: 21 - } - ] + system: { + changes: [ + { + key: 'system.resistance.magical.reduction', + type: 'add', + value: '@system.armorScore', + priority: 21 + } + ] + } } ] } @@ -488,21 +512,23 @@ export const weaponFeatures = { name: 'DAGGERHEART.CONFIG.WeaponFeature.barrier.effects.barrier.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.barrier.effects.barrier.description', img: 'icons/skills/melee/shield-block-bash-blue.webp', - changes: [ - { - key: 'system.evasion', - mode: 2, - value: '-1' - }, - { - key: 'Armor', - type: 'armor', - typeData: { + system: { + changes: [ + { + key: 'system.evasion', + type: 'add', + value: '-1' + }, + { + key: 'Armor', type: 'armor', - max: 'ITEM.@system.tier + 1' + typeData: { + type: 'armor', + max: 'ITEM.@system.tier + 1' + } } - } - ] + ] + } } ] }, @@ -514,13 +540,15 @@ export const weaponFeatures = { name: 'DAGGERHEART.CONFIG.WeaponFeature.bonded.effects.damage.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.bonded.effects.damage.description', img: 'icons/magic/symbols/chevron-elipse-circle-blue.webp', - changes: [ - { - key: 'system.bonuses.damage.primaryWeapon.bonus', - mode: 2, - value: '@system.levelData.level.current' - } - ] + system: { + changes: [ + { + key: 'system.bonuses.damage.primaryWeapon.bonus', + type: 'add', + value: '@system.levelData.level.current' + } + ] + } } ] }, @@ -553,18 +581,20 @@ export const weaponFeatures = { name: 'DAGGERHEART.CONFIG.WeaponFeature.brave.effects.brave.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.brave.effects.brave.description', img: 'icons/magic/life/heart-cross-strong-flame-purple-orange.webp', - changes: [ - { - key: 'system.evasion', - mode: 2, - value: '-1' - }, - { - key: 'system.damageThresholds.severe', - mode: 2, - value: 'ITEM.@system.tier' - } - ] + system: { + changes: [ + { + key: 'system.evasion', + type: 'add', + value: '-1' + }, + { + key: 'system.damageThresholds.severe', + type: 'add', + value: 'ITEM.@system.tier' + } + ] + } } ] }, @@ -618,13 +648,15 @@ export const weaponFeatures = { name: 'DAGGERHEART.CONFIG.WeaponFeature.charged.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.charged.description', img: 'icons/magic/lightning/claws-unarmed-strike-teal.webp', - changes: [ - { - key: 'system.proficiency', - mode: 2, - value: '1' - } - ] + system: { + changes: [ + { + key: 'system.proficiency', + type: 'add', + value: '1' + } + ] + } } ] } @@ -660,13 +692,15 @@ export const weaponFeatures = { name: 'DAGGERHEART.CONFIG.WeaponFeature.cumbersome.effects.cumbersome.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.cumbersome.effects.cumbersome.description', img: 'icons/commodities/metal/mail-plate-steel.webp', - changes: [ - { - key: 'system.traits.finesse.value', - mode: 2, - value: '-1' - } - ] + system: { + changes: [ + { + key: 'system.traits.finesse.value', + type: 'add', + value: '-1' + } + ] + } } ] }, @@ -707,14 +741,16 @@ export const weaponFeatures = { name: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.effects.deflecting.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.effects.deflecting.description', img: 'icons/skills/melee/hand-grip-sword-strike-orange.webp', - changes: [ - { - key: 'system.evasion', - mode: 2, - value: '@system.armorScore', - priority: 21 - } - ] + system: { + changes: [ + { + key: 'system.evasion', + type: 'add', + value: '@system.armorScore', + priority: 21 + } + ] + } } ] } @@ -754,13 +790,15 @@ export const weaponFeatures = { name: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.effects.agility', img: 'icons/skills/melee/strike-flail-spiked-pink.webp', - changes: [ - { - key: 'system.traits.agility.value', - mode: 2, - value: '-1' - } - ] + system: { + changes: [ + { + key: 'system.traits.agility.value', + type: 'add', + value: '-1' + } + ] + } } ] }, @@ -791,14 +829,14 @@ export const weaponFeatures = { 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: 'system.bonuses.damage.primaryWeapon.bonus', - mode: 2, - value: '1' - } - ], system: { + changes: [ + { + key: 'system.bonuses.damage.primaryWeapon.bonus', + type: 'add', + value: '1' + } + ], rangeDependence: { enabled: true, range: 'melee', @@ -902,13 +940,15 @@ export const weaponFeatures = { name: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.actions.greed.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.actions.greed.description', img: 'icons/commodities/currency/coins-crown-stack-gold.webp', - changes: [ - { - key: 'system.proficiency', - mode: 2, - value: '1' - } - ] + system: { + changes: [ + { + key: 'system.proficiency', + type: 'add', + value: '1' + } + ] + } } ] } @@ -951,13 +991,15 @@ export const weaponFeatures = { name: 'DAGGERHEART.CONFIG.WeaponFeature.heavy.effects.heavy.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.heavy.effects.heavy.description', img: 'icons/commodities/metal/ingot-worn-iron.webp', - changes: [ - { - key: 'system.evasion', - mode: 2, - value: '-1' - } - ] + system: { + changes: [ + { + key: 'system.evasion', + type: 'add', + value: '-1' + } + ] + } } ] }, @@ -1066,13 +1108,15 @@ export const weaponFeatures = { name: 'DAGGERHEART.CONFIG.WeaponFeature.massive.effects.massive.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.massive.effects.massive.description', img: 'icons/skills/melee/strike-flail-destructive-yellow.webp', - changes: [ - { - key: 'system.evasion', - mode: 2, - value: '-1' - } - ] + system: { + changes: [ + { + key: 'system.evasion', + type: 'add', + value: '-1' + } + ] + } } ] }, @@ -1103,14 +1147,14 @@ export const weaponFeatures = { name: 'DAGGERHEART.CONFIG.WeaponFeature.paired.effects.paired.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.paired.effects.paired.description', img: 'icons/skills/melee/weapons-crossed-swords-yellow-teal.webp', - changes: [ - { - key: 'system.bonuses.damage.primaryWeapon.bonus', - mode: 2, - value: 'ITEM.@system.tier + 1' - } - ], system: { + changes: [ + { + key: 'system.bonuses.damage.primaryWeapon.bonus', + type: 'add', + value: 'ITEM.@system.tier + 1' + } + ], rangeDependence: { enabled: true, range: 'melee', @@ -1158,13 +1202,15 @@ export const weaponFeatures = { name: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.effects.persuasive.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.effects.persuasive.description', img: 'icons/magic/control/hypnosis-mesmerism-eye.webp', - changes: [ - { - key: 'system.traits.presence.value', - mode: 2, - value: '2' - } - ] + system: { + changes: [ + { + key: 'system.traits.presence.value', + type: 'add', + value: '2' + } + ] + } } ] } @@ -1203,17 +1249,20 @@ export const weaponFeatures = { name: 'DAGGERHEART.CONFIG.WeaponFeature.protective.effects.protective.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.protective.effects.protective.description', img: 'icons/skills/melee/shield-block-gray-orange.webp', - changes: [ - { - key: 'Armor', - type: 'armor', - value: 0, - typeData: { + system: { + changes: [ + { + key: 'Armor', type: 'armor', - max: 'ITEM.@system.tier' + value: 0, + typeData: { + type: 'armor', + max: 'ITEM.@system.tier' + } } - } - ] + ] + } + } ] }, @@ -1244,13 +1293,15 @@ export const weaponFeatures = { name: 'DAGGERHEART.CONFIG.WeaponFeature.reliable.effects.reliable.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.reliable.effects.reliable.description', img: 'icons/skills/melee/strike-sword-slashing-red.webp', - changes: [ - { - key: 'system.bonuses.roll.primaryWeapon.bonus', - mode: 2, - value: 1 - } - ] + system: { + changes: [ + { + key: 'system.bonuses.roll.primaryWeapon.bonus', + type: 'add', + value: 1 + } + ] + } } ] }, @@ -1341,7 +1392,7 @@ export const weaponFeatures = { changes: [ { key: 'system.bonuses.damage.primaryWeapon.bonus', - mode: 2, + type: 'add', value: '@system.traits.agility.value', priority: 21 } diff --git a/module/data/action/attackAction.mjs b/module/data/action/attackAction.mjs index 7024c96e..934cbbae 100644 --- a/module/data/action/attackAction.mjs +++ b/module/data/action/attackAction.mjs @@ -13,18 +13,19 @@ export default class DHAttackAction extends DHDamageAction { if (this.damage.includeBase) { const baseDamage = this.getParentHitPointDamage(); if (baseDamage) { - if (!this.damage.parts.hitPoints) { - this.damage.parts.hitPoints = baseDamage; + if (!this.damage.main) { + this.damage.main = baseDamage; } else { - for (const type of baseDamage.type) this.damage.parts.hitPoints.type.add(type); + for (const type of baseDamage.type) this.damage.main.type.add(type); - this.damage.parts.hitPoints.value.custom = { + this.damage.main.value.custom = { enabled: true, - formula: `${baseDamage.value.getFormula()} + ${this.damage.parts.hitPoints.value.getFormula()}` + formula: `${baseDamage.value.getFormula()} + ${this.damage.main.value.getFormula()}` }; } } } + if (this.roll.useDefault) { this.roll.trait = this.item.system.attack.roll.trait; this.roll.type = 'attack'; @@ -33,18 +34,18 @@ export default class DHAttackAction extends DHDamageAction { } getParentHitPointDamage() { - return this.item?.system?.attack.damage.parts.hitPoints; + return this.item?.system?.attack.damage.main; } get damageFormula() { - const hitPointsPart = this.damage.parts.hitPoints; + const hitPointsPart = this.damage.main; if (!hitPointsPart) return '0'; return hitPointsPart.value.getFormula(); } get altDamageFormula() { - const hitPointsPart = this.damage.parts.hitPoints; + const hitPointsPart = this.damage.main; if (!hitPointsPart) return '0'; return hitPointsPart.valueAlt.getFormula(); @@ -95,7 +96,7 @@ export default class DHAttackAction extends DHDamageAction { if (range) labels.push(game.i18n.localize(`DAGGERHEART.CONFIG.Range.${range}.short`)); const useAltDamage = this.actor?.effects?.find(x => x.type === 'horde')?.active; - for (const { value, valueAlt, type } of damage.parts) { + for (const { value, valueAlt, type } of [damage.main, ...damage.resources].filter(d => !!d)) { const usedValue = useAltDamage ? valueAlt : value; const damageString = Roll.replaceFormulaData(usedValue.getFormula(), this.actor?.getRollData() ?? {}); const str = damageString @@ -104,7 +105,7 @@ export default class DHAttackAction extends DHDamageAction { x: game.i18n.localize('DAGGERHEART.GENERAL.damage') }); - const icons = Array.from(type) + const icons = Array.from(type ?? []) .map(t => CONFIG.DH.GENERAL.damageTypes[t]?.icon) .filter(Boolean); diff --git a/module/data/action/baseAction.mjs b/module/data/action/baseAction.mjs index be7224cd..05890335 100644 --- a/module/data/action/baseAction.mjs +++ b/module/data/action/baseAction.mjs @@ -256,7 +256,8 @@ 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.skips.createMessage && !config.actionChatMessageHandled) + await this.toChat(null, config); return config; } @@ -288,7 +289,6 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel hasEffect: this.hasEffect, hasSave: this.hasSave, onSave: this.save?.damageMod, - isDirect: !!this.damage?.direct, selectedMessageMode: game.settings.get('core', 'messageMode'), data: this.getRollData(), evaluate: this.hasRoll, @@ -306,20 +306,20 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel }; if (this.damage) { - config.isDirect = this.damage.direct; + config.isDirect = !!this.damage.main?.direct; - const groupAttackTokens = this.damage.groupAttack + const groupAttackTokens = this.damage.main?.groupAttack ? game.system.api.fields.ActionFields.DamageField.getGroupAttackTokens( this.actor.id, - this.damage.groupAttack + this.damage.main.groupAttack ) : null; config.damageOptions = { - groupAttack: this.damage.groupAttack + groupAttack: this.damage.main?.groupAttack ? { numAttackers: Math.max(groupAttackTokens.length, 1), - range: this.damage.groupAttack + range: this.damage.main.groupAttack } : null }; @@ -429,11 +429,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.type !== 'healing' && (Boolean(this.damage.main) || !foundry.utils.isEmpty(this.damage.resources)); } get hasHealing() { - return Boolean(Object.keys(this.damage?.parts ?? {}).length) && this.type === 'healing'; + return this.type === 'healing' && !foundry.utils.isEmpty(this.damage.resources); } get hasSave() { @@ -469,6 +469,25 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel return acc; }, {}); } + + if (source.damage?.parts && !source.damage.resources && !source.damage.main) { + source.damage.main = null; + source.damage.resources = {}; + for (const [partKey, part] of Object.entries(source.damage.parts)) { + if (partKey === 'hitPoints' && source.type !== 'healing') { + source.damage.main = { + ...part, + includeBase: source.damage.includeBase, + direct: source.damage.direct, + groupAttack: source.damage.groupAttack + }; + } else { + source.damage.resources[partKey] = part; + } + } + + delete source.damage.parts; + } } } diff --git a/module/data/action/damageAction.mjs b/module/data/action/damageAction.mjs index 51735543..15135e0d 100644 --- a/module/data/action/damageAction.mjs +++ b/module/data/action/damageAction.mjs @@ -8,11 +8,8 @@ export default class DHDamageAction extends DHBaseAction { * @returns Formula string */ getDamageFormula() { - const strings = []; - for (const { value } of this.damage.parts) { - strings.push(Roll.replaceFormulaData(value.getFormula(), this.actor?.getRollData() ?? {})); - } + if (!this.damage.main) return ''; - return strings.join(' + '); + return Roll.replaceFormulaData(this.damage.main.value.getFormula(), this.actor?.getRollData() ?? {}); } } diff --git a/module/data/activeEffect/baseEffect.mjs b/module/data/activeEffect/baseEffect.mjs index 9b17164d..547bdcf7 100644 --- a/module/data/activeEffect/baseEffect.mjs +++ b/module/data/activeEffect/baseEffect.mjs @@ -57,11 +57,6 @@ export default class BaseEffect extends foundry.data.ActiveEffectTypeDataModel { description: new fields.HTMLField({ label: 'DAGGERHEART.GENERAL.description' }) }), rangeDependence: new fields.SchemaField({ - enabled: new fields.BooleanField({ - required: true, - initial: false, - label: 'DAGGERHEART.GENERAL.enabled' - }), type: new fields.StringField({ required: true, choices: CONFIG.DH.GENERAL.rangeInclusion, @@ -80,7 +75,7 @@ export default class BaseEffect extends foundry.data.ActiveEffectTypeDataModel { initial: CONFIG.DH.GENERAL.range.melee.id, label: 'DAGGERHEART.GENERAL.range' }) - }), + }, { nullable: true, initial: null }), stacking: new fields.SchemaField( { value: new fields.NumberField({ @@ -146,14 +141,8 @@ export default class BaseEffect extends foundry.data.ActiveEffectTypeDataModel { description: '', transfer: options.transfer, statuses: [], - changes: [], system: { - rangeDependence: { - enabled: false, - type: CONFIG.DH.GENERAL.rangeInclusion.withinRange.id, - target: CONFIG.DH.GENERAL.otherTargetTypes.hostile.id, - range: CONFIG.DH.GENERAL.range.melee.id - } + changes: [] } }; } @@ -185,4 +174,12 @@ export default class BaseEffect extends foundry.data.ActiveEffectTypeDataModel { if (this.parent.actor && options.scrollingTextData) this.parent.actor.queueScrollText(options.scrollingTextData); } + + static migrateData(source) { + if (source.rangeDependence?.enabled === false) { + source.rangeDependence = null; + } + + return super.migrateData(source); + } } diff --git a/module/data/actor/adversary.mjs b/module/data/actor/adversary.mjs index ae17c128..2640211f 100644 --- a/module/data/actor/adversary.mjs +++ b/module/data/actor/adversary.mjs @@ -84,13 +84,11 @@ export default class DhpAdversary extends DhCreature { type: 'attack' }, damage: { - parts: { - hitPoints: { - type: ['physical'], - applyTo: 'hitPoints', - value: { - multiplier: 'flat' - } + main: { + type: ['physical'], + applyTo: 'hitPoints', + value: { + multiplier: 'flat' } } } diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs index b39c64aa..8ff50a5d 100644 --- a/module/data/actor/character.mjs +++ b/module/data/actor/character.mjs @@ -104,15 +104,13 @@ export default class DhCharacter extends DhCreature { trait: 'strength' }, damage: { - parts: { - hitPoints: { - type: ['physical'], - applyTo: 'hitPoints', - value: { - custom: { - enabled: true, - formula: '@profd4' - } + main: { + type: ['physical'], + applyTo: 'hitPoints', + value: { + custom: { + enabled: true, + formula: '@profd4' } } } @@ -838,7 +836,7 @@ export default class DhCharacter extends DhCreature { 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.main.value.custom.formula = `@prof${this.basicAttackDamageDice}${this.rules.attack.damage.bonus ? ` + ${this.rules.attack.damage.bonus}` : ''}`; // Clamp resources (must be done last to ensure all updates occur) this.resources.clamp(); diff --git a/module/data/actor/tierAdjustment.mjs b/module/data/actor/tierAdjustment.mjs index 8b9e5bdc..4bf74a45 100644 --- a/module/data/actor/tierAdjustment.mjs +++ b/module/data/actor/tierAdjustment.mjs @@ -40,17 +40,17 @@ export function getTierAdjustedAdversary(source, tier) { // Store initial attack damage for abilities that have you deal a "standard attack" const initialAttack = { - type: source.system.attack.damage?.parts.hitPoints?.type?.toSorted(), - value: getFormula(source.system.attack.damage?.parts.hitPoints?.value) + type: source.system.attack.damage?.main?.type?.toSorted(), + value: getFormula(source.system.attack.damage?.main?.value) }; // Update damage of base attack. try { const damage = source.system.attack.damage; - if (!damage?.parts.hitPoints) throw new Error('Unexpected missing attack in adversary'); + if (!damage?.main) throw new Error('Unexpected missing damage in adversary'); for (const property of ['value', 'valueAlt']) { - const data = damage.parts.hitPoints[property]; + const data = damage.main[property]; const previousFormula = getFormula(data); const value = calculateAdjustedDamage(previousFormula, 'attack', damageMeta); applyAdjustedDamage(data, value); @@ -82,12 +82,12 @@ export function getTierAdjustedAdversary(source, tier) { // Update damage in item actions and convert all formula matches in the descriptions to the new damage for (const action of Object.values(item.system.actions)) { - if (!action.damage?.parts.hitPoints) continue; + if (!action.damage?.main) continue; try { // Apply conversions and save a record. If it matches attack damage *and* Its not in the description, use attack conversion instead const result = []; for (const property of ['value', 'valueAlt']) { - const { [property]: data, type: damageType } = action.damage.parts.hitPoints; + const { [property]: data, type: damageType } = action.damage.main; const previousFormula = getFormula(data); const isActuallyAttack = previousFormula === initialAttack.value && @@ -199,7 +199,7 @@ function calculateAdjustedDamage(formula, type, { currentDamageRange, newDamageR } /** - * Get formula from either damage parts *or* a simple formula object. + * Get formula from either damage data *or* a simple formula object. * @returns {string} the new formula data */ function getFormula(data) { diff --git a/module/data/chat-message/actorRoll.mjs b/module/data/chat-message/actorRoll.mjs index 77b57dc5..f32a0736 100644 --- a/module/data/chat-message/actorRoll.mjs +++ b/module/data/chat-message/actorRoll.mjs @@ -1,4 +1,5 @@ import { triggerChatRollFx } from '../../helpers/utils.mjs'; +import { ChatDamageData } from './chatDamageData.mjs'; const fields = foundry.data.fields; @@ -50,7 +51,7 @@ export default class DHActorRoll extends foundry.abstract.TypeDataModel { originItem: originItemField(), action: new fields.StringField() }), - damage: new fields.ObjectField(), + damage: new fields.EmbeddedDataField(ChatDamageData), damageOptions: new fields.ObjectField(), costs: new fields.ArrayField(new fields.ObjectField()), successConsumed: new fields.BooleanField({ initial: false }) @@ -133,28 +134,21 @@ export default class DHActorRoll extends foundry.abstract.TypeDataModel { }); } - /* TODO: Change how damage data is stored somehow to enable better rerolling */ async getRerolledDamage() { - if (!this.damage) return; + if (!this.damage.active) return; const rerolls = []; - const update = { system: { damage: {} } }; - for (const partKey in this.damage) { - const part = this.damage[partKey]; - const testRoll = Roll.fromData(part.parts[0].roll); - const rerolled = await testRoll.reroll(); - rerolls.push(rerolled); + const update = { system: { damage: { main: null, resources: _replace({}) } } }; + if (this.damage.main) { + const reroll = await this.damage.main.reroll(); + rerolls.push(reroll); + update.system.damage.main = reroll.toJSON(); + } - if (!update.system.damage[partKey]) update.system.damage[partKey] = { parts: [part.parts[0]] }; - const partData = update.system.damage[partKey].parts[0]; - update.system.damage[partKey].total = rerolled.total; - partData.modifierTotal = rerolled.terms.reduce((acc, x) => { - if (x.isDeterministic && !x.operator) acc += x.total; - return acc; - }, 0); - partData.dice = rerolled.dice.map(d => ({ ...d.toJSON(), dice: d.denomination })); - partData.total = rerolled.total; - partData.roll = rerolled.toJSON(); + for (const key of Object.keys(this.damage.resources)) { + const reroll = await this.damage.resources[key].reroll(); + rerolls.push(reroll); + update.system.damage.resources[key] = reroll.toJSON(); } await triggerChatRollFx(rerolls); @@ -199,6 +193,43 @@ export default class DHActorRoll extends foundry.abstract.TypeDataModel { this.isGM = game.user.isGM; //temp } + static migrateData(source) { + const { main, resources, ...flatDamageKeys } = source.damage ?? {}; + if (source.damage && !main && !resources) { + source.damage.main = null; + source.damage.resources = {}; + + const getRoll = key => { + const damageData = source.damage[key]; + const oldRoll = damageData.parts[0]?.roll; + return oldRoll ? JSON.stringify({ + ...oldRoll, + class: 'BaseRoll', + options: { + ...oldRoll.options, + damageTypes: damageData.parts[0].damageTypes ?? [] + } + }) : null; + }; + + for (const key of Object.keys(flatDamageKeys)) { + if (key === 'hitPoints' && source.hasDamage && !source.hasHealing) { + source.damage.main = getRoll('hitPoints'); + } + else { + source.damage.resources[key] = getRoll(key); + } + } + } + + for (const key of Object.keys(flatDamageKeys)) { + delete source.damage[key]; + } + + return source; + } + + getTargetList() { const targets = this.targetMode && this.parent.isAuthor diff --git a/module/data/chat-message/chatDamageData.mjs b/module/data/chat-message/chatDamageData.mjs new file mode 100644 index 00000000..404cda43 --- /dev/null +++ b/module/data/chat-message/chatDamageData.mjs @@ -0,0 +1,58 @@ +import { triggerChatRollFx } from '../../helpers/utils.mjs'; + +export class ChatDamageData extends foundry.abstract.DataModel { + constructor(data = {}, options = {}) { + super(data, options); + + this._prepareRolls(); + } + + static defineSchema() { + const fields = foundry.data.fields; + + return { + main: new fields.JSONField({ nullable: true, validate: ChatDamageData.#validateRoll}), + resources: new fields.TypedObjectField(new fields.JSONField({validate: ChatDamageData.#validateRoll})) + }; + } + + get active() { + return !!this.main || Boolean(Object.keys(this.resources).length); + } + + static #validateRoll(rollJSON) { + if (rollJSON) { + const roll = JSON.parse(rollJSON); + if (!roll.evaluated) throw new Error('Roll objects added to ChatMessage documents must be evaluated'); + } + } + + _prepareRolls() { + this.main &&= Roll.fromData(this.main); + for (const key of Object.keys(this.resources)) { + this.resources[key] = Roll.fromData(this.resources[key]); + } + } + + async rerollDamageDie(isResource, damageType, dice, resultIndex) { + const reroll = isResource ? this.resources[damageType] : this.main; + const rerollDice = reroll.dice[dice]; + await rerollDice.rerollResult(resultIndex); + await reroll._evaluate(); + + const rerolledResult = rerollDice.results[rerollDice.results.length - 1]; + if (rerolledResult) { + const fakeRoll = { + _evaluated: true, + dice: [new foundry.dice.terms.Die({ + ...rerollDice, + results: [rerolledResult], + total: rerolledResult.value, + faces: rerollDice.faces + })], + options: { appearance: {} } + }; + await triggerChatRollFx([fakeRoll]); + } + } +} \ No newline at end of file diff --git a/module/data/fields/action/damageField.mjs b/module/data/fields/action/damageField.mjs index 9b21d3ba..25b3ba97 100644 --- a/module/data/fields/action/damageField.mjs +++ b/module/data/fields/action/damageField.mjs @@ -12,20 +12,10 @@ export default class DamageField extends fields.SchemaField { /** @inheritDoc */ constructor(options, context = {}) { - const damageFields = { - parts: new IterableTypedObjectField(DHDamageData), - includeBase: new fields.BooleanField({ - initial: false, - label: 'DAGGERHEART.ACTIONS.Settings.includeBase.label' - }), - direct: new fields.BooleanField({ initial: false, label: 'DAGGERHEART.CONFIG.DamageType.direct.name' }), - groupAttack: new fields.StringField({ - choices: CONFIG.DH.GENERAL.groupAttackRange, - blank: true, - label: 'DAGGERHEART.ACTIONS.Settings.groupAttack.label' - }) - }; - super(damageFields, options, context); + super({ + main: new fields.EmbeddedDataField(DHDamageData, { nullable: true }), + resources: new IterableTypedObjectField(DHResourceData) + }, options, context); } /** @@ -41,25 +31,23 @@ export default class DamageField extends fields.SchemaField { this.hasRoll && DamageField.getAutomation() === CONFIG.DH.SETTINGS.actionAutomationChoices.never.id && !force - ) + ) { return; + } - let formulas = this.damage.parts.map(p => ({ - formula: DamageField.getFormulaValue.call(this, p, config).getFormula(this.actor), - damageTypes: p.applyTo === 'hitPoints' && !p.type.size ? new Set(['physical']) : p.type, - applyTo: p.applyTo - })); + const damageFormula = this.damage.main ? + DamageField.formatFormulas.call(this, [this.damage.main], config)[0] : null; + const resourceFormulas = DamageField.formatFormulas.call(this, this.damage.resources, config); - if (!formulas.length) return false; - - formulas = DamageField.formatFormulas.call(this, formulas, config); + if (!damageFormula && !resourceFormulas.length) return false; messageId = config.message?._id ?? messageId; const message = game.messages.get(messageId); const damageConfig = { dialog: {}, ...config, - roll: formulas, + damageFormula, + resourceFormulas, data: this.getRollData(), isCritical: Boolean(message?.system.roll?.isCritical) }; @@ -92,7 +80,7 @@ export default class DamageField extends fields.SchemaField { const targetDamage = []; const damagePromises = []; - for (let target of targets) { + for (const target of targets) { const actor = foundry.utils.fromUuidSync(target.actorId); if (!actor) continue; if (!config.hasHealing && config.onSave && target.saved?.success === true) { @@ -114,13 +102,12 @@ export default class DamageField extends fields.SchemaField { actor.takeHealing(config.damage).then(updates => targetDamage.push({ token, updates })) ); else { - const configDamage = foundry.utils.deepClone(config.damage); - const hpDamageMultiplier = config.actionActor?.system.rules?.attack?.damage?.hpDamageMultiplier ?? 1; - const hpDamageTakenMultiplier = actor.system.rules?.attack?.damage?.hpDamageTakenMultiplier; - if (configDamage.hitPoints) { - for (const part of configDamage.hitPoints.parts) { - part.total = Math.ceil(part.total * hpDamageMultiplier * hpDamageTakenMultiplier); - } + const configDamage = config.damage.clone(); + configDamage.main &&= configDamage.main.toJSON(); + if (configDamage.main) { + const multiplier = config.actionActor?.system.rules?.attack?.damage?.hpDamageMultiplier ?? 1; + const takenMultiplier = actor.system.rules?.attack?.damage?.hpDamageTakenMultiplier; + configDamage.main.total = Math.ceil(configDamage.main.total * multiplier * takenMultiplier); } damagePromises.push( @@ -183,13 +170,19 @@ export default class DamageField extends fields.SchemaField { /** * Prepare formulas for Damage Roll * Must be called within Action context or similar. - * @param {object[]} formulas Array of formatted formulas object + * @param {DHResourceData[]} damageData Array of DHResourceData * @param {object} data Action getRollData * @returns */ - static formatFormulas(formulas, data) { + static formatFormulas(damageData, data) { + const formulas = damageData.map(x => ({ + formula: DamageField.getFormulaValue.call(this, x, data).getFormula(this.actor), + damageTypes: x.type ?? new Set(), + applyTo: x.applyTo + })); + const formattedFormulas = []; - formulas.forEach(formula => { + for (const formula of formulas) { if (isNaN(formula.formula)) formula.formula = Roll.replaceFormulaData(formula.formula, this.getRollData(data)); const same = formattedFormulas.find( @@ -197,7 +190,8 @@ export default class DamageField extends fields.SchemaField { ); if (same) same.formula += ` + ${formula.formula}`; else formattedFormulas.push(formula); - }); + } + return formattedFormulas; } @@ -275,10 +269,18 @@ export class DHActionDiceData extends foundry.abstract.DataModel { }; } + /** + * @returns {string} the formula associated with this damage field + */ getFormula() { - const multiplier = this.multiplier === 'flat' ? this.flatMultiplier : `@${this.multiplier}`, - bonus = this.bonus ? (this.bonus < 0 ? ` - ${Math.abs(this.bonus)}` : ` + ${this.bonus}`) : ''; - return this.custom.enabled ? this.custom.formula : `${multiplier ?? 1}${this.dice}${bonus}`; + if (this.custom.enabled) return this.custom.formula; + + const multiplier = this.multiplier === 'flat' ? this.flatMultiplier : `@${this.multiplier}`; + if (!multiplier) return String(this.bonus || 0); + + const dice = `${multiplier ?? 1}${this.dice}`; + const sign = this.bonus < 0 ? ' - ' : ' + '; + return this.bonus ? `${dice} ${sign} ${Math.abs(this.bonus)}` : dice; } } @@ -286,6 +288,7 @@ export class DHResourceData extends foundry.abstract.DataModel { /** @override */ static defineSchema() { return { + base: new fields.BooleanField({ initial: false, readonly: true, label: 'Base' }), applyTo: new fields.StringField({ choices: CONFIG.DH.GENERAL.healingTypes, required: true, @@ -308,7 +311,16 @@ export class DHDamageData extends DHResourceData { static defineSchema() { return { ...super.defineSchema(), - base: new fields.BooleanField({ initial: false, readonly: true, label: 'Base' }), + includeBase: new fields.BooleanField({ + initial: false, + label: 'DAGGERHEART.ACTIONS.Settings.includeBase.label' + }), + direct: new fields.BooleanField({ initial: false, label: 'DAGGERHEART.CONFIG.DamageType.direct.name' }), + groupAttack: new fields.StringField({ + choices: CONFIG.DH.GENERAL.groupAttackRange, + blank: true, + label: 'DAGGERHEART.ACTIONS.Settings.groupAttack.label' + }), type: new fields.SetField( new fields.StringField({ choices: CONFIG.DH.GENERAL.damageTypes, diff --git a/module/data/fields/action/summonField.mjs b/module/data/fields/action/summonField.mjs index 6845d2ba..fef6625a 100644 --- a/module/data/fields/action/summonField.mjs +++ b/module/data/fields/action/summonField.mjs @@ -23,7 +23,7 @@ export default class DHSummonField extends fields.ArrayField { super(summonFields, options, context); } - static async execute() { + static async execute(config) { if (!canvas.scene) { ui.notifications.warn(game.i18n.localize('DAGGERHEART.ACTIONS.TYPES.summon.error')); return; @@ -36,6 +36,7 @@ export default class DHSummonField extends fields.ArrayField { const rolls = []; const summonData = []; + const chatMessageData = []; for (const summon of this.summon) { const roll = new Roll(itemAbleRollParse(summon.count, this.actor, this.item)); await roll.evaluate(); @@ -54,17 +55,18 @@ export default class DHSummonField extends fields.ArrayField { tokenPreviewName: `${actor.prototypeToken.name}${remaining > 1 ? ` (${remaining}x)` : ''}` }); } + + chatMessageData.push({ + data: actor, + quantity: countNumber + }); } if (rolls.length) await triggerChatRollFx(rolls); this.actor.sheet?.minimize(); - DHSummonField.handleSummon(summonData, this.actor); - } - - static async handleSummon(summonData, actionActor) { - await CONFIG.ux.TokenManager.createTokensWithPreview(summonData, { elevation: actionActor.token?.elevation }); - - return actionActor.sheet?.maximize(); + await CONFIG.ux.TokenManager.createTokensWithPreview(summonData, { elevation: this.actor.token?.elevation }); + this.actor.sheet?.maximize(); + config.summonData = chatMessageData; } } diff --git a/module/data/fields/actionField.mjs b/module/data/fields/actionField.mjs index 83672c8e..f3bdce8a 100644 --- a/module/data/fields/actionField.mjs +++ b/module/data/fields/actionField.mjs @@ -238,6 +238,7 @@ export function ActionMixin(Base) { result = this.parent; } else { result = await this.item.update({ [path]: updates }, options); + if (!result) return result; } return this.inCollection @@ -269,10 +270,7 @@ export function ActionMixin(Base) { return this.delete(); } - async toChat(origin) { - const autoExpandDescription = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance) - .expandRollMessage?.desc; - + async toChat(origin, config) { const cls = getDocumentClass('ChatMessage'); const systemData = { title: game.i18n.localize('DAGGERHEART.CONFIG.FeatureForm.action'), @@ -282,7 +280,7 @@ export function ActionMixin(Base) { img: this.baseAction ? this.parent.parent.img : this.img, tags: this.tags ? this.tags : ['Spell', 'Arcana', 'Lv 10'], areas: this.areas, - summon: this.summon + summon: config?.summonData }, source: { actor: this.actor.uuid, @@ -307,7 +305,7 @@ export function ActionMixin(Base) { system: systemData, content: await foundry.applications.handlebars.renderTemplate( 'systems/daggerheart/templates/ui/chat/action.hbs', - { ...systemData, open: autoExpandDescription ? 'open' : '' } + systemData ), flags: { daggerheart: { diff --git a/module/data/item/armor.mjs b/module/data/item/armor.mjs index 15bb620d..70fbbb47 100644 --- a/module/data/item/armor.mjs +++ b/module/data/item/armor.mjs @@ -8,7 +8,8 @@ export default class DHArmor extends AttachableItem { type: 'armor', hasDescription: true, isInventoryItem: true, - hasActions: true + hasActions: true, + hasResource: true }); } diff --git a/module/data/item/base.mjs b/module/data/item/base.mjs index ba114fda..095ba8f2 100644 --- a/module/data/item/base.mjs +++ b/module/data/item/base.mjs @@ -49,7 +49,10 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel { }) }; - if (this.metadata.hasDescription) schema.description = new fields.HTMLField({ required: true, nullable: true }); + if (this.metadata.hasDescription) { + schema.description = new fields.HTMLField({ required: true, nullable: true }); + schema.gmNotes = new fields.HTMLField({ required: true, nullable: true }); + } if (this.metadata.hasResource) { schema.resource = new fields.SchemaField( @@ -134,7 +137,7 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel { /** * Augments the description for the item with type specific info to display. Implemented in applicable item subtypes. * @param {object} [options] - Options that modify the styling of the rendered template. { headerStyle: undefined|'none'|'large' } - * @returns {string} + * @returns {Promise<{ prefix: string | null; value: string | null; suffix: string | null }>} */ async getDescriptionData(_options) { return { prefix: null, value: this.description, suffix: null }; @@ -143,16 +146,26 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel { /** * Gets the enriched and augmented description for the item. * @param {object} [options] - Options that modify the styling of the rendered template. { headerStyle: undefined|'none'|'large' } - * @returns {string} + * @returns {Promise} */ - async getEnrichedDescription() { + async getEnrichedDescription({ gmNotes = true } = {}) { if (!this.metadata.hasDescription) return ''; const { prefix, value, suffix } = await this.getDescriptionData(); - const fullDescription = [prefix, value, suffix].filter(p => !!p).join('\n
\n'); + let fullDescription = [prefix, value, suffix].filter(p => !!p).join('\n
\n'); + if (this.gmNotes && gmNotes) { + const gmNotesElement = document.createElement('section'); + gmNotesElement.classList.add('gm-notes-section'); + gmNotesElement.dataset.visibility = 'gm'; + const header = document.createElement('header'); + header.classList.add('gm-notes'); + header.textContent = _loc('DAGGERHEART.ITEMS.FIELDS.gmNotes.label'); + gmNotesElement.innerHTML = header.outerHTML + this.gmNotes; + fullDescription += gmNotesElement.outerHTML; + } return await foundry.applications.ux.TextEditor.implementation.enrichHTML(fullDescription, { - relativeTo: this, + relativeTo: this.parent, rollData: this.getRollData(), secrets: this.parent.isOwner }); diff --git a/module/data/item/weapon.mjs b/module/data/item/weapon.mjs index 96550bc3..3d50e68a 100644 --- a/module/data/item/weapon.mjs +++ b/module/data/item/weapon.mjs @@ -67,13 +67,11 @@ export default class DHWeapon extends AttachableItem { type: 'attack' }, damage: { - parts: { - hitPoints: { - type: ['physical'], - value: { - multiplier: 'prof', - dice: 'd8' - } + main: { + type: ['physical'], + value: { + multiplier: 'prof', + dice: 'd8' } } } @@ -238,11 +236,12 @@ export default class DHWeapon extends AttachableItem { game.i18n.localize(`DAGGERHEART.CONFIG.Burden.${burden}`) ]; - for (const { value, type } of attack.damage.parts) { + if (attack.damage.main) { + const { value, type } = attack.damage.main; const parts = value.custom.enabled ? [game.i18n.localize('DAGGERHEART.GENERAL.custom')] : [value.dice]; if (!value.custom.enabled && value.bonus) parts.push(value.bonus.signedString()); - if (type.size > 0) { + if (type?.size) { const typeTags = Array.from(type) .map(t => game.i18n.localize(`DAGGERHEART.CONFIG.DamageType.${t}.abbreviation`)) .join(' | '); @@ -251,7 +250,7 @@ export default class DHWeapon extends AttachableItem { tags.push(parts.join('')); } - + return tags; } @@ -266,10 +265,10 @@ export default class DHWeapon extends AttachableItem { if (roll.trait) labels.push(game.i18n.localize(`DAGGERHEART.CONFIG.Traits.${roll.trait}.short`)); if (range) labels.push(game.i18n.localize(`DAGGERHEART.CONFIG.Range.${range}.short`)); - for (const { value, type } of damage.parts) { + for (const { value, type } of [damage.main, ...damage.resources].filter(d => !!d)) { const str = Roll.replaceFormulaData(value.getFormula(), this.actor?.getRollData() ?? {}); - const icons = Array.from(type) + const icons = Array.from(type ?? []) .map(t => CONFIG.DH.GENERAL.damageTypes[t]?.icon) .filter(Boolean); diff --git a/module/data/tagTeamData.mjs b/module/data/tagTeamData.mjs index 640c2f6c..ef6536f1 100644 --- a/module/data/tagTeamData.mjs +++ b/module/data/tagTeamData.mjs @@ -1,3 +1,5 @@ +import { ChatDamageData } from './chat-message/chatDamageData.mjs'; + export default class TagTeamData extends foundry.abstract.DataModel { static defineSchema() { const fields = foundry.data.fields; @@ -37,6 +39,7 @@ export class MemberData extends foundry.abstract.DataModel { }), rollChoice: new fields.StringField({ nullable: true, initial: null }), rollData: new fields.JSONField({ nullable: true, initial: null }), + damageRollData: new fields.EmbeddedDataField(ChatDamageData), selected: new fields.BooleanField({ initial: false }) }; } diff --git a/module/dice/baseRoll.mjs b/module/dice/baseRoll.mjs index 4d065fff..2c42d38a 100644 --- a/module/dice/baseRoll.mjs +++ b/module/dice/baseRoll.mjs @@ -4,4 +4,8 @@ export default class BaseRoll extends Roll { /** @inheritdoc */ static TOOLTIP_TEMPLATE = 'systems/daggerheart/templates/ui/chat/foundryRollTooltip.hbs'; + + get modifierTotal() { + return this.total - this.dice.reduce((acc, dice) => acc + dice.total, 0); + } } diff --git a/module/dice/d20Roll.mjs b/module/dice/d20Roll.mjs index e9c447e4..7dc06741 100644 --- a/module/dice/d20Roll.mjs +++ b/module/dice/d20Roll.mjs @@ -185,8 +185,10 @@ export default class D20Roll extends DHRoll { return changeKeys; } - static postEvaluate(roll, config = {}) { - const data = super.postEvaluate(roll, config); + static async buildEvaluate(roll, config = {}, message = {}) { + await super.buildEvaluate(roll, config, message); + + const data = config.roll; data.type = config.actionType; data.difficulty = config.roll.difficulty; if (config.targets?.length) { @@ -222,7 +224,6 @@ export default class D20Roll extends DHRoll { }; }); data.modifierTotal = roll.modifierTotal; - return data; } resetFormula() { diff --git a/module/dice/damageRoll.mjs b/module/dice/damageRoll.mjs index ef810ed7..683d14d8 100644 --- a/module/dice/damageRoll.mjs +++ b/module/dice/damageRoll.mjs @@ -13,30 +13,34 @@ export default class DamageRoll extends DHRoll { static DefaultDialog = DamageDialog; - static async buildEvaluate(roll, config = {}, message = {}) { - if (config.dialog.configure === false) roll.constructFormula(config); - if (config.evaluate !== false) for (const roll of config.roll) await roll.roll.evaluate(); - - roll._evaluated = true; - - const parts = []; - for (const roll of config.roll) { - parts.push(this.postEvaluate(roll)); - roll.roll = JSON.stringify(roll.roll.toJSON()); - } - - config.damage = this.unifyDamageRoll(parts); + static createRollInstance(config) { + return new this(undefined, config.data, config); } - static postEvaluate(roll, config = {}) { - return { - ...roll, - ...super.postEvaluate(roll.roll, config), - damageTypes: [...(roll.damageTypes ?? [])], - roll: roll.roll, - type: config.type, - modifierTotal: this.calculateTotalModifiers(roll.roll) - }; + /** @inheritdoc */ + static async buildEvaluate(roll, config = {}) { + if (config.dialog.configure === false) roll.constructFormulas(config); + + const evaluateRoll = async roll => { + await roll.roll.evaluate(); + roll.roll.options = { damageTypes: roll.damageTypes ? [...roll.damageTypes] : [] }; + return roll.roll; + } + + if (!config.damage) config.damage = { main: null, resources: {} }; + + if (config.damageFormula) { + config.damage.main = await evaluateRoll(config.damageFormula); + config.damage.main.options = { damageTypes: + config.damageFormula.damageTypes ? [...config.damageFormula.damageTypes] : [] + }; + } + + for (const roll of config.resourceFormulas) { + config.damage.resources[roll.applyTo] = await evaluateRoll(roll); + } + + roll._evaluated = true; } static async buildPost(roll, config, message) { @@ -47,9 +51,10 @@ export default class DamageRoll extends DHRoll { const diceRolls = []; if (game.modules.get('dice-so-nice')?.active) { config.mute = true; - const pool = foundry.dice.terms.PoolTerm.fromRolls( - Object.values(config.damage).flatMap(r => r.parts.map(p => p.roll)) - ); + const pool = foundry.dice.terms.PoolTerm.fromRolls([ + ...(config.damage.main ? [config.damage.main] : []), + ...Object.values(config.damage.resources) + ]); diceRolls.push(Roll.fromTerms([pool])); } @@ -60,22 +65,14 @@ export default class DamageRoll extends DHRoll { await super.buildPost(roll, config, message); if (config.source?.message) { - chatMessage.update({ 'system.damage': config.damage }); + chatMessage.update({ 'system.damage': { + ...config.damage.toObject(), + main: config.damage.main, + resources: config.damage.resources + }}); } } - static unifyDamageRoll(rolls) { - const unified = {}; - rolls.forEach(r => { - const resource = unified[r.applyTo] ?? { formula: '', total: 0, parts: [] }; - resource.formula += `${resource.formula !== '' ? ' + ' : ''}${r.formula}`; - resource.total += r.total; - resource.parts.push(r); - unified[r.applyTo] = resource; - }); - return unified; - } - static formatGlobal(rolls) { let formula, total; const applyTo = new Set(rolls.flatMap(r => r.applyTo)); @@ -124,12 +121,10 @@ export default class DamageRoll extends DHRoll { const type = this.options.messageType ?? (this.options.hasHealing ? 'healing' : 'damage'); const changeKeys = []; - for (const roll of this.options.roll) { - for (const damageType of roll.damageTypes?.values?.() ?? []) { - changeKeys.push(`system.bonuses.${type}.${damageType}`); - } + for (const damageType of this.options.damageFormula?.damageTypes?.values?.() ?? []) { + changeKeys.push(`system.bonuses.${type}.${damageType}`); } - + const item = this.data.parent?.items?.get(this.options.source.item); if (item) { switch (item.type) { @@ -145,62 +140,69 @@ export default class DamageRoll extends DHRoll { return changeKeys; } - constructFormula(config) { + constructFormulas(config) { + return { + damageFormula: this.constructFormula(this.options.damageFormula, config, true), + resourceFormulas: this.options.resourceFormulas.map(x => this.constructFormula(x, config)) + }; + } + + constructFormula(formulaData, config, isDamage) { + if (!formulaData) return null; this.options.isCritical = config.isCritical; - for (const [index, part] of this.options.roll.entries()) { - const isHitpointPart = part.applyTo === CONFIG.DH.GENERAL.healingTypes.hitPoints.id; - part.roll = new Roll(Roll.replaceFormulaData(part.formula, config.data)); - part.roll.terms = Roll.parse(part.roll.formula, config.data); - if (part.applyTo === CONFIG.DH.GENERAL.healingTypes.hitPoints.id) { - part.modifiers = this.applyBaseBonus(part); - this.addModifiers(part); - part.modifiers?.forEach(m => { - part.roll.terms.push(...this.formatModifier(m.value)); - }); + + formulaData.roll = new Roll(Roll.replaceFormulaData(formulaData.formula, config.data)); + formulaData.roll.terms = Roll.parse(formulaData.roll.formula, config.data); + + if (formulaData.extraFormula) { + formulaData.roll.terms.push( + new foundry.dice.terms.OperatorTerm({ operator: '+' }), + ...this.constructor.parse(formulaData.extraFormula, this.options.data) + ); + } + + if (isDamage && formulaData.applyTo === CONFIG.DH.GENERAL.healingTypes.hitPoints.id) { + formulaData.modifiers = this.applyBaseBonus(formulaData); + this.addModifiers(formulaData); + formulaData.modifiers?.forEach(m => { + formulaData.roll.terms.push(...this.formatModifier(m.value)); + }); + + /* To Remove When Reaction System */ + for (const mod in config.modifiers) { + const modifier = config.modifiers[mod]; + if ( + modifier.beforeCrit === true && + (modifier.enabled || modifier.value) + ) modifier.callback(formulaData); } /* To Remove When Reaction System */ - if (index === 0 && part.applyTo === CONFIG.DH.GENERAL.healingTypes.hitPoints.id) { - for (const mod in config.modifiers) { - const modifier = config.modifiers[mod]; - if (modifier.beforeCrit === true && (modifier.enabled || modifier.value)) modifier.callback(part); - } + for (const mod in config.modifiers) { + const modifier = config.modifiers[mod]; + if (!modifier.beforeCrit && (modifier.enabled || modifier.value)) modifier.callback(formulaData); } - if (part.extraFormula) { - part.roll.terms.push( - new foundry.dice.terms.OperatorTerm({ operator: '+' }), - ...this.constructor.parse(part.extraFormula, this.options.data) - ); - } - - if (config.damageOptions.groupAttack?.numAttackers > 1 && isHitpointPart) { + if (config.damageOptions.groupAttack?.numAttackers > 1) { const damageTypes = [foundry.dice.terms.Die, foundry.dice.terms.NumericTerm]; - for (const term of part.roll.terms) { + for (const term of formulaData.roll.terms) { if (damageTypes.some(type => term instanceof type)) { term.number *= config.damageOptions.groupAttack.numAttackers; } } } - if (config.isCritical && isHitpointPart) { - const total = part.roll.dice.reduce((acc, term) => acc + term._faces * term._number, 0); + if (config.isCritical) { + const total = formulaData.roll.dice.reduce((acc, term) => acc + term._faces * term._number, 0); if (total > 0) { - part.roll.terms.push(...this.formatModifier(total)); + formulaData.roll.terms.push(...this.formatModifier(total)); } } - - /* To Remove When Reaction System */ - if (index === 0 && part.applyTo === CONFIG.DH.GENERAL.healingTypes.hitPoints.id) { - for (const mod in config.modifiers) { - const modifier = config.modifiers[mod]; - if (!modifier.beforeCrit && (modifier.enabled || modifier.value)) modifier.callback(part); - } - } - - part.roll._formula = this.constructor.getFormula(part.roll.terms); } - return this.options.roll; + + formulaData.roll._formula = this.constructor.getFormula(formulaData.roll.terms); + + return formulaData; } /* To Remove When Reaction System */ @@ -293,76 +295,4 @@ export default class DamageRoll extends DHRoll { config.modifiers = mods; return mods; } - - static async reroll(rollPart, dice, result) { - let diceIndex = 0; - let parsedRoll = game.system.api.dice.DamageRoll.fromData({ - ...rollPart.roll, - terms: rollPart.roll.terms.map(term => { - const isDie = term.class === 'Die'; - const fixedTerm = { - ...term, - ...(isDie ? { results: rollPart.dice[diceIndex].results } : {}) - }; - - if (isDie) diceIndex++; - return fixedTerm; - }), - class: 'DamageRoll', - evaluated: false - }); - - const parsedDiceTerms = Object.keys(parsedRoll.terms).reduce((acc, key) => { - const term = parsedRoll.terms[key]; - if (term instanceof CONFIG.Dice.termTypes.DiceTerm) acc[Object.keys(acc).length] = term; - return acc; - }, {}); - const term = parsedDiceTerms[dice]; - const termResult = parsedDiceTerms[dice].results[result]; - - const newIndex = parsedDiceTerms[dice].results.length; - await term.reroll(`/r1=${termResult.result}`); - - const diceRolls = []; - if (game.modules.get('dice-so-nice')?.active) { - const newResult = parsedDiceTerms[dice].results[newIndex]; - diceRolls.push({ - _evaluated: true, - dice: [ - new foundry.dice.terms.Die({ - ...term, - total: newResult.result, - faces: term._faces, - results: [newResult] - }) - ], - options: { appearance: {} } - }); - } - - await triggerChatRollFx(diceRolls); - await parsedRoll.evaluate(); - - const results = parsedRoll.dice[dice].results.map(result => ({ - ...result, - discarded: !result.active - })); - const newResult = results.splice(results.length - 1, 1); - results.splice(Number(result) + 1, 0, newResult[0]); - - const rerolledDice = parsedRoll.dice.map((x, index) => { - const isRerollDice = index === Number(dice); - if (!isRerollDice) return { ...x, dice: x.denomination }; - return { - dice: parsedRoll.dice[dice].denomination, - total: parsedRoll.dice[dice].total, - results: results.map(result => ({ - ...result, - hasRerolls: result.hasRerolls || isRerollDice - })) - }; - }); - - return { parsedRoll, rerolledDice }; - } } diff --git a/module/dice/dhRoll.mjs b/module/dice/dhRoll.mjs index 6a8566dd..43ace90c 100644 --- a/module/dice/dhRoll.mjs +++ b/module/dice/dhRoll.mjs @@ -1,7 +1,8 @@ import D20RollDialog from '../applications/dialogs/d20RollDialog.mjs'; import { triggerChatRollFx } from '../helpers/utils.mjs'; +import BaseRoll from './baseRoll.mjs'; -export default class DHRoll extends Roll { +export default class DHRoll extends BaseRoll { baseTerms = []; constructor(formula, data = {}, options = {}) { super(formula, data, foundry.utils.mergeObject(options, { roll: [] }, { overwrite: false })); @@ -33,11 +34,17 @@ export default class DHRoll extends Roll { if (config.skips?.createMessage) config.messageRoll = roll; - await this.buildEvaluate(roll, config, (message = {})); + if (config.evaluate !== false) { + await this.buildEvaluate(roll, config, (message = {})); + } await this.buildPost(roll, config, (message = {})); return config; } + static createRollInstance(config) { + return new this(config.roll.formula, config.data, config); + } + /** * @param {Partial} config * @returns {Promise} @@ -55,7 +62,7 @@ export default class DHRoll extends Roll { this.temporaryModifierBuilder(config); - let roll = new this(config.roll.formula, config.data, config); + let roll = this.createRollInstance(config); if (config.dialog.configure !== false) { // Open Roll Dialog const DialogClass = config.dialog?.class ?? this.DefaultDialog; @@ -72,27 +79,14 @@ export default class DHRoll extends Roll { return roll; } + /** + * Evaluates the roll and assigns roll data into the config. + * This is only called if config.evaluate is not set to false + * @protected + */ static async buildEvaluate(roll, config = {}, message = {}) { - if (config.evaluate !== false) { - await roll.evaluate(); - config.roll = this.postEvaluate(roll, config); - } - } - - static async buildPost(roll, config, message) { - for (const hook of config.hooks) { - if (Hooks.call(`${CONFIG.DH.id}.postRoll${hook.capitalize()}`, config, message) === false) return null; - } - - if (config.skips?.createMessage) { - await triggerChatRollFx([roll]); - } else if (!config.source?.message) { - config.message = await this.toMessage(roll, config); - } - } - - static postEvaluate(roll, config = {}) { - return { + await roll.evaluate(); + config.roll = { ...roll.options.roll, total: roll.total, formula: roll.formula, @@ -105,6 +99,22 @@ export default class DHRoll extends Roll { }; } + /** + * Runs any post configuration events that need to happen towards the end, such as hooks and dice so nice + * @protected + */ + static async buildPost(roll, config, message) { + for (const hook of config.hooks) { + if (Hooks.call(`${CONFIG.DH.id}.postRoll${hook.capitalize()}`, config, message) === false) return null; + } + + if (config.skips?.createMessage) { + await triggerChatRollFx([roll]); + } else if (!config.source?.message) { + config.message = await this.toMessage(roll, config); + } + } + static async toMessage(roll, config) { const item = config.data.parent?.items?.get?.(config.source.item) ?? null; const actions = item ? [ diff --git a/module/dice/die/_module.mjs b/module/dice/die/_module.mjs index 19ca951a..b84cef86 100644 --- a/module/dice/die/_module.mjs +++ b/module/dice/die/_module.mjs @@ -3,6 +3,7 @@ import HopeDie from './hopeDie.mjs'; import FearDie from './fearDie.mjs'; import AdvantageDie from './advantageDie.mjs'; import DisadvantageDie from './disadvantageDie.mjs'; +export { default as BaseDie } from './baseDie.mjs'; export const diceTypes = { DualityDie, diff --git a/module/dice/die/advantageDie.mjs b/module/dice/die/advantageDie.mjs index 9c2f0b03..66b6f124 100644 --- a/module/dice/die/advantageDie.mjs +++ b/module/dice/die/advantageDie.mjs @@ -1,4 +1,6 @@ -export default class AdvantageDie extends foundry.dice.terms.Die { +import BaseDie from './baseDie.mjs'; + +export default class AdvantageDie extends BaseDie { constructor(options) { super(options); diff --git a/module/dice/die/baseDie.mjs b/module/dice/die/baseDie.mjs new file mode 100644 index 00000000..cc88f753 --- /dev/null +++ b/module/dice/die/baseDie.mjs @@ -0,0 +1,12 @@ +export default class BaseDie extends foundry.dice.terms.Die { + async rerollResult(resultIndex) { + const result = this.results[resultIndex]; + result.rerolled = true; + result.active = false; + await this.roll({ reroll: true }); + + const rerolledResult = this.results[this.results.length - 1]; + this.results.splice(this.results.length - 1, 1); + this.results.splice(resultIndex, 0, rerolledResult); + } +} \ No newline at end of file diff --git a/module/dice/die/disadvantageDie.mjs b/module/dice/die/disadvantageDie.mjs index f56ebe96..e79845f3 100644 --- a/module/dice/die/disadvantageDie.mjs +++ b/module/dice/die/disadvantageDie.mjs @@ -1,4 +1,6 @@ -export default class DisadvantageDie extends foundry.dice.terms.Die { +import BaseDie from './baseDie.mjs'; + +export default class DisadvantageDie extends BaseDie { constructor(options) { super(options); diff --git a/module/dice/die/dualityDie.mjs b/module/dice/die/dualityDie.mjs index cc7ee75e..2f4dae77 100644 --- a/module/dice/die/dualityDie.mjs +++ b/module/dice/die/dualityDie.mjs @@ -1,6 +1,7 @@ +import BaseDie from './baseDie.mjs'; import { updateResourcesForDualityReroll } from '../helpers.mjs'; -export default class DualityDie extends foundry.dice.terms.Die { +export default class DualityDie extends BaseDie { constructor(options) { super(options); diff --git a/module/dice/dualityRoll.mjs b/module/dice/dualityRoll.mjs index e2d967a3..6503efb1 100644 --- a/module/dice/dualityRoll.mjs +++ b/module/dice/dualityRoll.mjs @@ -232,22 +232,10 @@ export default class DualityRoll extends D20Roll { return changeKeys; } + /** @inheritdoc */ static async buildEvaluate(roll, config = {}, message = {}) { await super.buildEvaluate(roll, config, message); - - await setDiceSoNiceForDualityRoll( - roll, - config.roll.advantage.type, - config.roll.hope.dice, - config.roll.fear.dice, - config.roll.advantage.dice - ); - } - - static postEvaluate(roll, config = {}) { - const data = super.postEvaluate(roll, config); - - data.hope = { + config.roll.hope = { dice: roll.dHope.denomination, value: this.guaranteedCritical ? 0 : roll.dHope.total, rerolled: { @@ -255,7 +243,7 @@ export default class DualityRoll extends D20Roll { rerolls: roll.dHope.results.filter(x => x.rerolled) } }; - data.fear = { + config.roll.fear = { dice: roll.dFear.denomination, value: this.guaranteedCritical ? 0 : roll.dFear.total, rerolled: { @@ -263,11 +251,11 @@ export default class DualityRoll extends D20Roll { rerolls: roll.dFear.results.filter(x => x.rerolled) } }; - data.rally = { + config.roll.rally = { dice: roll.dRally?.denomination, value: roll.dRally?.total }; - data.result = { + config.roll.result = { duality: roll.withHope ? 1 : roll.withFear ? -1 : 0, total: this.guaranteedCritical ? 0 : roll.dHope.total + roll.dFear.total, label: roll.totalLabel @@ -275,11 +263,18 @@ export default class DualityRoll extends D20Roll { if (roll._rallyIndex && roll.data?.parent) roll.data.parent.deleteEmbeddedDocuments('ActiveEffect', [roll._rallyIndex]); - - return data; } - + + /** @inheritdoc */ static async buildPost(roll, config, message) { + await setDiceSoNiceForDualityRoll( + roll, + config.roll.advantage.type, + config.roll.hope.dice, + config.roll.fear.dice, + config.roll.advantage.dice + ); + await super.buildPost(roll, config, message); await DualityRoll.dualityUpdate(config); @@ -414,8 +409,4 @@ export default class DualityRoll extends D20Roll { return rerolled; } - - fromJSON(json) { - return super.fromJSON(json); - } } diff --git a/module/dice/fateRoll.mjs b/module/dice/fateRoll.mjs index 114fad59..f8276ce1 100644 --- a/module/dice/fateRoll.mjs +++ b/module/dice/fateRoll.mjs @@ -75,25 +75,23 @@ export default class FateRoll extends D20Roll { this.terms[0] = new foundry.dice.terms.Die({ faces: 12 }); } + /** @inheritdoc */ static async buildEvaluate(roll, config = {}, message = {}) { await super.buildEvaluate(roll, config, message); + config.roll.fate = { + dice: roll.fateDie === 'Hope' ? roll.dHope.denomination : roll.dFear.denomination, + value: roll.fateDie === 'Hope' ? roll.dHope.total : roll.dFear.total, + fateDie: roll.fateDie + }; + } + /** @inheritdoc */ + static async buildPost(roll, config, message) { if (roll.fateDie === 'Hope') { await setDiceSoNiceForHopeFateRoll(roll, config.roll.fate.dice); } else { await setDiceSoNiceForFearFateRoll(roll, config.roll.fate.dice); } - } - - static postEvaluate(roll, config = {}) { - const data = super.postEvaluate(roll, config); - - data.fate = { - dice: roll.fateDie === 'Hope' ? roll.dHope.denomination : roll.dFear.denomination, - value: roll.fateDie === 'Hope' ? roll.dHope.total : roll.dFear.total, - fateDie: roll.fateDie - }; - - return data; + return super.buildPost(roll, config, message); } } diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index 30901374..666d9ac1 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -622,53 +622,63 @@ export default class DhpActor extends Actor { return rollData; } - #canReduceDamage(hpDamage, type) { - const { stressDamageReduction, disabledArmor } = this.system.rules.damageReduction; + /** + * Checks to see if damage can be reduced in one way or another. + * @param {number} hpDamage the amount of marked hp that will be marked + * @param {Set} types a list of damage types + */ + #canReduceDamage(hpDamage, types) { + const { stressDamageReduction, disabledArmor, reduceSeverity, thresholdImmunities } = + this.system.rules.damageReduction; if (disabledArmor) return false; const availableStress = this.system.resources.stress.max - this.system.resources.stress.value; const canUseArmor = this.system.armorScore.value < this.system.armorScore.max && - type.every(t => this.system.armorApplicableDamageTypes[t] === true); + types.every(t => this.system.armorApplicableDamageTypes[t] === true); + const canUseStress = Object.keys(stressDamageReduction).reduce((acc, x) => { const rule = stressDamageReduction[x]; if (damageKeyToNumber(x) <= hpDamage) return acc || (rule.enabled && availableStress >= rule.cost); return acc; }, false); - return canUseArmor || canUseStress; + const hasReduceSeverity = types.some(t => reduceSeverity[t]); + + const hasThresholdImmunity = Object.entries(thresholdImmunities) + .filter(([key, value]) => Boolean(value) && damageKeyToNumber(key) === hpDamage) + .length; + + return canUseArmor || canUseStress || hasReduceSeverity || hasThresholdImmunity; } - async takeDamage(damages, isDirect = false) { - if (Hooks.call(`${CONFIG.DH.id}.preTakeDamage`, this, damages) === false) return null; + async takeDamage(args, isDirect = false) { + args = this.#parseDamageArgs(args); + if (Hooks.call(`${CONFIG.DH.id}.preTakeDamage`, this, args) === false) return null; if (this.type === 'companion') { await this.modifyResource([{ value: 1, key: 'stress' }]); return; } - const updates = []; + const updates = args.resourceUpdates; + if (args.main) { + // todo: avoid side effects, but hook currently requires it + args.main.value = this.calculateDamage(args.main.value, args.main.damageTypes); + } - Object.entries(damages).forEach(([key, damage]) => { - damage.parts.forEach(part => { - if (part.applyTo === CONFIG.DH.GENERAL.healingTypes.hitPoints.id) - part.total = this.calculateDamage(part.total, part.damageTypes); - const update = updates.find(u => u.key === key); - if (update) { - update.value += part.total; - update.damageTypes.add(...new Set(part.damageTypes)); - } else updates.push({ value: part.total, key, damageTypes: new Set(part.damageTypes) }); - }); - }); + if (Hooks.call(`${CONFIG.DH.id}.postCalculateDamage`, this, args) === false) return null; - if (Hooks.call(`${CONFIG.DH.id}.postCalculateDamage`, this, damages) === false) return null; + // Convert deducted resources to a record of updates. Return if nothing to do. + if (!updates.some(u => u.value) && !args.main) return; - if (!updates.length) return; - - const hpDamage = updates.find(u => u.key === CONFIG.DH.GENERAL.healingTypes.hitPoints.id); - if (hpDamage?.value) { - hpDamage.value = this.convertDamageToThreshold(hpDamage.value); + if (args.main) { + const hpDamage = { + value: this.convertDamageToThreshold(args.main.value), + damageTypes: new Set(args.main.damageTypes), + key: CONFIG.DH.GENERAL.healingTypes.hitPoints.id + }; if (this.type === 'character' && !isDirect && this.#canReduceDamage(hpDamage.value, hpDamage.damageTypes)) { const armorSlotResult = await this.owner.query( 'armorSlot', @@ -683,7 +693,7 @@ export default class DhpActor extends Actor { ); if (armorSlotResult) { const { modifiedDamage, armorChanges, stressSpent } = armorSlotResult; - updates.find(u => u.key === 'hitPoints').value = modifiedDamage; + hpDamage.value = modifiedDamage; for (const armorChange of armorChanges) { updates.push({ value: armorChange.amount, key: 'armor', uuid: armorChange.uuid }); } @@ -693,20 +703,24 @@ export default class DhpActor extends Actor { else updates.push({ value: stressSpent, key: 'stress' }); } } - } - if (this.type === 'adversary') { + } else if (this.type === 'adversary') { const reducedSeverity = hpDamage.damageTypes.reduce((value, curr) => { return Math.max(this.system.rules.damageReduction.reduceSeverity[curr], value); }, 0); hpDamage.value = Math.max(hpDamage.value - reducedSeverity, 0); - - if ( - hpDamage.value && - this.system.rules.damageReduction.thresholdImmunities[getDamageKey(hpDamage.value)] - ) { - hpDamage.value -= 1; + if (this.system.rules.damageReduction.thresholdImmunities[getDamageKey(hpDamage.value)]) { + hpDamage.value = Math.max(0, hpDamage.value - 1); } } + + // Merge existing hitPoint deduction with finalised damage deduction + const existing = updates.find(u => u.key === CONFIG.DH.GENERAL.healingTypes.hitPoints.id); + if (existing) { + existing.value += hpDamage.value; + existing.damageTypes = hpDamage.damageTypes; + } else { + updates.push(hpDamage); + } } const results = await game.system.registeredTriggers.runTrigger( @@ -721,12 +735,10 @@ export default class DhpActor extends Actor { for (var result of results) resourceMap.addResources(result.updates); resourceMap.updateResources(); } - - updates.forEach( - u => - (u.value = - u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false ? u.value * -1 : u.value) - ); + + for (const u of updates) { + u.value = u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false ? u.value * -1 : u.value; + } await this.modifyResource(updates); @@ -735,6 +747,36 @@ export default class DhpActor extends Actor { return updates; } + async takeHealing(args) { + args = this.#parseDamageArgs({ resources: 'resources' in args ? args.resources : args }); + if (Hooks.call(`${CONFIG.DH.id}.preTakeHealing`, this, args) === false) return null; + + const updates = args.resourceUpdates; + for (const u of updates) { + const shouldFlip = !(u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false); + u.value = shouldFlip ? u.value * -1 : u.value; + } + await this.modifyResource(updates); + + if (Hooks.call(`${CONFIG.DH.id}.postTakeHealing`, this, updates) === false) return null; + + return updates; + } + + /** Parse damage args that may be coming from takeHealing or takeDamage. Used to simplify macro usage and roll vs non-roll usage */ + #parseDamageArgs(args = {}) { + const damageRoll = 'total' in args ? args : (args.main ?? args.damage); + const damageValue = typeof damageRoll === 'number' ? damageRoll : damageRoll?.total; + const damageTypes = Array.from(damageRoll?.options?.damageTypes ?? damageRoll?.damageTypes ?? []); + const main = typeof damageValue === 'number' ? { key: 'damage', value: damageValue, damageTypes } : null; + const resourceUpdates = Object.entries(args.resources ?? {}).map(([key, damage]) => ({ + key, + value: typeof damage === 'number' ? damage : damage?.total ?? 0 + })); + + return { main, resourceUpdates }; + } + calculateDamage(baseDamage, type) { if (this.canResist(type, 'immunity')) return 0; if (this.canResist(type, 'resistance')) baseDamage = Math.ceil(baseDamage / 2); @@ -759,32 +801,6 @@ export default class DhpActor extends Actor { return reduction === Infinity ? 0 : reduction; } - async takeHealing(healings) { - if (Hooks.call(`${CONFIG.DH.id}.preTakeHealing`, this, healings) === false) return null; - - const updates = []; - Object.entries(healings).forEach(([key, healing]) => { - healing.parts.forEach(part => { - const update = updates.find(u => u.key === key); - if (update) update.value += part.total; - else updates.push({ value: part.total, key }); - }); - }); - - updates.forEach( - u => - (u.value = !(u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false) - ? u.value * -1 - : u.value) - ); - - await this.modifyResource(updates); - - if (Hooks.call(`${CONFIG.DH.id}.postTakeHealing`, this, updates) === false) return null; - - return updates; - } - /** * Resources are modified asynchronously, so be careful not to update the same resource in * quick succession. diff --git a/module/documents/chatMessage.mjs b/module/documents/chatMessage.mjs index fd68997c..d53a76bd 100644 --- a/module/documents/chatMessage.mjs +++ b/module/documents/chatMessage.mjs @@ -3,6 +3,13 @@ import { emitGMUpdate, emitGMCreate, GMUpdateEvent } from '../systemRegistration export default class DhpChatMessage extends foundry.documents.ChatMessage { targetHook = null; + static #EXPAND_SECTIONS = [ + { selector: 'roll-section [data-action="expandRoll"]', key: 'roll' }, + { selector: 'damage-section', key: 'damage' }, + { selector: 'target-section', key: 'target' }, + { selector: 'description-section', key: 'desc' } + ]; + async renderHTML() { const actor = game.actors.get(this.speaker.actor); const actorData = @@ -89,23 +96,26 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage { } } + // Check registered selectors and the main item section for expanding + // Preserving during re-render is handled by core foundry on anything with [data-action=expandRoll] const autoExpandRoll = game.settings.get( - CONFIG.DH.id, - CONFIG.DH.SETTINGS.gameSettings.appearance - ).expandRollMessage, - rollSections = html.querySelectorAll('.roll-part'), - itemDesc = html.querySelector('.domain-card-move'); - rollSections.forEach(s => { - if (s.classList.contains('roll-section')) { - const toExpand = s.querySelector('[data-action="expandRoll"]'); - toExpand.classList.toggle('expanded', autoExpandRoll.roll); - } else if (s.classList.contains('damage-section')) - s.classList.toggle('expanded', autoExpandRoll.damage); - else if (s.classList.contains('target-section')) s.classList.toggle('expanded', autoExpandRoll.target); - else if (s.classList.contains('description-section')) - s.classList.toggle('expanded', autoExpandRoll.desc); - }); - if (itemDesc && autoExpandRoll.desc) itemDesc.setAttribute('open', ''); + CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance + ).expandRollMessage; + for (const { selector, key } of DhpChatMessage.#EXPAND_SECTIONS) { + const elements = html.querySelectorAll(selector); + for (const element of elements) { + element.classList.toggle('expanded', autoExpandRoll[key]); + } + } + + // Auto expand the item description. These are not preserved by foundry during re-renders + const itemDesc = html.querySelector('details'); + if (itemDesc) { + const existing = document.querySelector(`.chat-message[data-message-id="${this.id}"] details`); + if (existing?.hasAttribute('open') ?? autoExpandRoll.desc) { + itemDesc.setAttribute('open', ''); + } + } } if (!this.isAuthor && !this.speakerActor?.isOwner) { diff --git a/module/documents/item.mjs b/module/documents/item.mjs index 14717538..8112e99f 100644 --- a/module/documents/item.mjs +++ b/module/documents/item.mjs @@ -208,10 +208,7 @@ export default class DHItem extends foundry.documents.Item { tags: this._getTags() }, actions: item.system.actionsList, - description: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.system.description, { - relativeTo: this.parent, - rollData: this.parent?.getRollData() ?? {} - }) + description: await this.system.getEnrichedDescription() }; const msg = { diff --git a/module/documents/tokenManager.mjs b/module/documents/tokenManager.mjs index 7678d2c7..b21b56a0 100644 --- a/module/documents/tokenManager.mjs +++ b/module/documents/tokenManager.mjs @@ -19,10 +19,10 @@ export default class DhTokenManager { } } - return await canvas.tokens.placeTokens( + const placedData = await canvas.tokens.placeTokens( [ { - ...actor.prototypeToken.toObject(), + ...(await actor.getTokenDocument()).toObject(), actorId: actor.id, displayName: 50, ...tokenData @@ -30,6 +30,8 @@ export default class DhTokenManager { ], { create: false } ); + + return placedData?.[0] ?? null; } /** @@ -46,22 +48,24 @@ export default class DhTokenManager { const createElevation = elevation ?? level.elevation.bottom; for (const tokenData of tokensData) { - const previewTokens = await this.createPreview(tokenData.actor, { + const previewToken = await this.createPreview(tokenData.actor, { name: tokenData.tokenPreviewName, level: game.user.viewedLevel, elevation: createElevation, flags: { daggerheart: { createPlacement: true } } }); - if (!previewTokens?.length) return null; + if (!previewToken) return null; + + const finalTokenData = { + ...previewToken.toObject(), + name: tokenData.actor.prototypeToken.name, + displayName: tokenData.actor.prototypeToken.displayName, + flags: tokenData.actor.prototypeToken.flags + }; await canvas.scene.createEmbeddedDocuments( 'Token', - previewTokens.map(x => ({ - ...x.toObject(), - name: tokenData.actor.prototypeToken.name, - displayName: tokenData.actor.prototypeToken.displayName, - flags: tokenData.actor.prototypeToken.flags - })), + [finalTokenData], { controlObject: true, parent: canvas.scene } ); } diff --git a/module/documents/tooltipManager.mjs b/module/documents/tooltipManager.mjs index 3e3f4a16..6e794b6a 100644 --- a/module/documents/tooltipManager.mjs +++ b/module/documents/tooltipManager.mjs @@ -4,199 +4,234 @@ export default class DhTooltipManager extends foundry.helpers.interaction.Toolti #wide = false; #bordered = false; + /** @inheritdoc */ async activate(element, options = {}) { - const { TextEditor } = foundry.applications.ux; + this.#wide = false; + this.#bordered = false; - let html = options.html; - if (element.dataset.tooltip?.startsWith('#battlepoints#')) { - this.#wide = true; - this.#bordered = true; - - html = await this.getBattlepointHTML(element.dataset.combatId); - options.direction = this._determineItemTooltipDirection(element); - super.activate(element, { ...options, html: html }); - - const lockedTooltip = this.lockTooltip(); - lockedTooltip.querySelectorAll('.battlepoint-toggle-container input').forEach(element => { - element.addEventListener('input', this.toggleModifier.bind(this)); - }); - return; - } else { - this.#wide = false; - this.#bordered = false; + const isMacro = document.getElementById('action-bar').contains(element); + const macro = isMacro ? game.macros.get(game.user.hotbar[Number(element.dataset.slot)] ?? null) : null; + const macroItemUuid = macro?.type === 'script' ? macro.command.match(/await game\.system\.api\.applications\.ui\.DhHotbar\.useItem\("([^"]+)"\);/)?.[1] : null; + if (macroItemUuid && await fromUuid(macroItemUuid, { strict: false })) { + element.dataset.tooltip = `#item#${macroItemUuid}`; + options.direction = this.constructor.TOOLTIP_DIRECTIONS.UP; } - if (element.dataset.tooltip === '#effect-display#') { - this.#bordered = true; - let effect = {}; - if (element.dataset.uuid) { - const effectItem = await foundry.utils.fromUuid(element.dataset.uuid); - const effectData = effectItem.toObject(); + let html = options.html; + const key = element.dataset.tooltip?.match(/^#([\w-]+)#/)?.[1]; + switch (key) { + case 'battlepoints': + return this.#activateBattlepoints(element, options); + case 'effect-display': + html = await this.#activateEffectDisplay(element, options); + break; + case 'item': + html = await this.#activateItem(element, options); + break; + case 'attack': + html = await this.#activateAttack(element, options); + break; + case 'shortRest': + case 'longRest': + html = await this.#activateRest(element, options); + break; + case 'advantage': + case 'disadvantage': + html = await this.#activateAdvantageDisadvantage(element, options); + break; + case 'deathMove': + html = await this.#activateDeathMove(element, options); + break; + } - effect = { - ...effectData, - name: game.i18n.localize(effectData.name) + this.noOffset = options.noOffset; + super.activate(element, { ...options, html }); + } + + async #activateBattlepoints(element, options) { + this.#wide = true; + this.#bordered = true; + + const html = await this.getBattlepointHTML(element.dataset.combatId); + options.direction = this._determineItemTooltipDirection(element); + super.activate(element, { ...options, html: html }); + + const lockedTooltip = this.lockTooltip(); + lockedTooltip.querySelectorAll('.battlepoint-toggle-container input').forEach(element => { + element.addEventListener('input', this.toggleModifier.bind(this)); + }); + } + + async #activateEffectDisplay(element, options) { + this.#bordered = true; + let effect = {}; + if (element.dataset.uuid) { + const effectItem = await foundry.utils.fromUuid(element.dataset.uuid); + const effectData = effectItem.toObject(); + + effect = { + ...effectData, + name: game.i18n.localize(effectData.name) + }; + + if (effectData.type === 'beastform') { + const beastformData = { + features: [], + advantageOn: effectData.system.advantageOn, + beastformAttackData: game.system.api.data.items.DHBeastform.getBeastformAttackData(effectItem) }; - if (effectData.type === 'beastform') { - const beastformData = { - features: [], - advantageOn: effectData.system.advantageOn, - beastformAttackData: game.system.api.data.items.DHBeastform.getBeastformAttackData(effectItem) - }; - - const features = effectItem.parent.items.filter(x => effectItem.system.featureIds.includes(x.id)); - for (const feature of features) { - const featureData = feature.toObject(); - featureData.enrichedDescription = await feature.system.getEnrichedDescription(); - beastformData.features.push(featureData); - } - - effect.description = await foundry.applications.handlebars.renderTemplate( - 'systems/daggerheart/templates/ui/tooltip/parts/beastformData.hbs', - { - item: { system: beastformData } - } - ); - } else { - effect.description = game.i18n.localize( - effectData.description ?? effectData.parent.system.description - ); + const features = effectItem.parent.items.filter(x => effectItem.system.featureIds.includes(x.id)); + for (const feature of features) { + const featureData = feature.toObject(); + featureData.enrichedDescription = await feature.system.getEnrichedDescription(); + beastformData.features.push(featureData); } - } else { - const conditions = CONFIG.DH.GENERAL.conditions(); - const condition = conditions[element.dataset.condition]; - effect = { - ...condition, - name: game.i18n.localize(condition.name), - description: game.i18n.localize(condition.description), - appliedBy: element.dataset.appliedBy, - isLockedCondition: true - }; - } - html = await foundry.applications.handlebars.renderTemplate( - `systems/daggerheart/templates/ui/tooltip/effect-display.hbs`, + effect.description = await foundry.applications.handlebars.renderTemplate( + 'systems/daggerheart/templates/ui/tooltip/parts/beastformData.hbs', + { + item: { system: beastformData } + } + ); + } else { + effect.description = game.i18n.localize( + effectData.description ?? effectData.parent.system.description + ); + } + } else { + const conditions = CONFIG.DH.GENERAL.conditions(); + const condition = conditions[element.dataset.condition]; + effect = { + ...condition, + name: game.i18n.localize(condition.name), + description: game.i18n.localize(condition.description), + appliedBy: element.dataset.appliedBy, + isLockedCondition: true + }; + } + + const html = await foundry.applications.handlebars.renderTemplate( + `systems/daggerheart/templates/ui/tooltip/effect-display.hbs`, + { + effect + } + ); + + this.tooltip.innerHTML = html; + options.direction = this._determineItemTooltipDirection(element); + + return html; + } + + async #activateItem(element, options) { + const itemUuid = element.dataset.tooltip.slice(6); + const item = await foundry.utils.fromUuid(itemUuid); + if (item) { + const isAction = item instanceof game.system.api.models.actions.actionsTypes.base; + const isEffect = item instanceof ActiveEffect; + await this.enrichText(item); + + const type = isAction ? 'action' : isEffect ? 'effect' : item.type; + const html = await foundry.applications.handlebars.renderTemplate( + `systems/daggerheart/templates/ui/tooltip/${type}.hbs`, { - effect + item: item, + description: item.system?.enrichedDescription ?? item.enrichedDescription, + config: CONFIG.DH, + allDomains: CONFIG.DH.DOMAIN.allDomains() } ); this.tooltip.innerHTML = html; - options.direction = this._determineItemTooltipDirection(element); - } else { - this.#bordered = false; + options.direction ??= this._determineItemTooltipDirection(element); + return html; } - if (element.dataset.tooltip?.startsWith('#item#')) { - const itemUuid = element.dataset.tooltip.slice(6); - const item = await foundry.utils.fromUuid(itemUuid); - if (item) { - const isAction = item instanceof game.system.api.models.actions.actionsTypes.base; - const isEffect = item instanceof ActiveEffect; - await this.enrichText(item); + return null; + } - const type = isAction ? 'action' : isEffect ? 'effect' : item.type; - html = await foundry.applications.handlebars.renderTemplate( - `systems/daggerheart/templates/ui/tooltip/${type}.hbs`, - { - item: item, - description: item.system?.enrichedDescription ?? item.enrichedDescription, - config: CONFIG.DH, - allDomains: CONFIG.DH.DOMAIN.allDomains() - } - ); + async #activateAttack(element, options) { + const actorUuid = element.dataset.tooltip.slice(8); + const actor = await foundry.utils.fromUuid(actorUuid); + const attack = actor.system.attack; - this.tooltip.innerHTML = html; - options.direction = this._determineItemTooltipDirection(element); + const description = await foundry.applications.ux.TextEditor.enrichHTML(attack.description); + const html = await foundry.applications.handlebars.renderTemplate( + `systems/daggerheart/templates/ui/tooltip/attack.hbs`, + { + attack: attack, + description: description, + parent: actor, + config: CONFIG.DH } - } else { - const attack = element.dataset.tooltip?.startsWith('#attack#'); - if (attack) { - const actorUuid = element.dataset.tooltip.slice(8); - const actor = await foundry.utils.fromUuid(actorUuid); - const attack = actor.system.attack; + ); - const description = await TextEditor.enrichHTML(attack.description); - html = await foundry.applications.handlebars.renderTemplate( - `systems/daggerheart/templates/ui/tooltip/attack.hbs`, - { - attack: attack, - description: description, - parent: actor, - config: CONFIG.DH - } - ); + this.tooltip.innerHTML = html; + return html; + } - this.tooltip.innerHTML = html; - } + async #activateAdvantageDisadvantage(element, options) { + const isAdvantage = element.dataset.tooltip?.startsWith('#advantage#'); + const actorUuid = element.dataset.tooltip.slice(isAdvantage ? 11 : 14); + const actor = await foundry.utils.fromUuid(actorUuid); - const shortRest = element.dataset.tooltip?.startsWith('#shortRest#'); - const longRest = element.dataset.tooltip?.startsWith('#longRest#'); - if (shortRest || longRest) { - const key = element.dataset.tooltip.slice(shortRest ? 11 : 10); - - const moves = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).restMoves[ - element.dataset.restType - ].moves; - const move = moves[key]; - const description = await TextEditor.enrichHTML(move.description); - html = await foundry.applications.handlebars.renderTemplate( - `systems/daggerheart/templates/ui/tooltip/downtime.hbs`, - { - move: move, - description: description - } - ); - - this.tooltip.innerHTML = html; - options.direction = this._determineItemTooltipDirection( - element, - this.constructor.TOOLTIP_DIRECTIONS.RIGHT - ); - } - - const isAdvantage = element.dataset.tooltip?.startsWith('#advantage#'); - const isDisadvantage = element.dataset.tooltip?.startsWith('#disadvantage#'); - if (isAdvantage || isDisadvantage) { - const actorUuid = element.dataset.tooltip.slice(isAdvantage ? 11 : 14); - const actor = await foundry.utils.fromUuid(actorUuid); - - if (actor) { - html = await foundry.applications.handlebars.renderTemplate( - `systems/daggerheart/templates/ui/tooltip/advantage.hbs`, - { - sources: isAdvantage ? actor.system.advantageSources : actor.system.disadvantageSources - } - ); - - this.tooltip.innerHTML = html; + if (actor) { + const html = await foundry.applications.handlebars.renderTemplate( + `systems/daggerheart/templates/ui/tooltip/advantage.hbs`, + { + sources: isAdvantage ? actor.system.advantageSources : actor.system.disadvantageSources } - } + ); - const deathMove = element.dataset.tooltip?.startsWith('#deathMove#'); - if (deathMove) { - const name = element.dataset.deathName; - const img = element.dataset.deathImg; - const description = element.dataset.deathDescription; - - html = await foundry.applications.handlebars.renderTemplate( - `systems/daggerheart/templates/ui/tooltip/death-move.hbs`, - { - move: { name: name, img: img, description: description } - } - ); - - this.tooltip.innerHTML = html; - options.direction = this._determineItemTooltipDirection( - element, - this.constructor.TOOLTIP_DIRECTIONS.RIGHT - ); - } + this.tooltip.innerHTML = html; + return html; } + return null; + } - this.noOffset = options.noOffset; - super.activate(element, { ...options, html: html }); + async #activateDeathMove(element, options) { + const name = element.dataset.deathName; + const img = element.dataset.deathImg; + const description = element.dataset.deathDescription; + + const html = await foundry.applications.handlebars.renderTemplate( + `systems/daggerheart/templates/ui/tooltip/death-move.hbs`, + { + move: { name: name, img: img, description: description } + } + ); + + this.tooltip.innerHTML = html; + options.direction = this._determineItemTooltipDirection( + element, + this.constructor.TOOLTIP_DIRECTIONS.RIGHT + ); + return html; + } + + async #activateRest(element, options) { + const isShortRest = element.dataset.tooltip?.startsWith('#shortRest#'); + const key = element.dataset.tooltip.slice(isShortRest ? 11 : 10); + const moves = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).restMoves[ + element.dataset.restType + ].moves; + const move = moves[key]; + const description = await foundry.applications.ux.TextEditor.enrichHTML(move.description); + const html = await foundry.applications.handlebars.renderTemplate( + `systems/daggerheart/templates/ui/tooltip/downtime.hbs`, + { + move: move, + description: description + } + ); + + this.tooltip.innerHTML = html; + options.direction = this._determineItemTooltipDirection( + element, + this.constructor.TOOLTIP_DIRECTIONS.RIGHT + ); + return html; } _setAnchor(direction) { diff --git a/module/enrichers/TemplateEnricher.mjs b/module/enrichers/TemplateEnricher.mjs index 4478ea14..b951f41e 100644 --- a/module/enrichers/TemplateEnricher.mjs +++ b/module/enrichers/TemplateEnricher.mjs @@ -58,7 +58,7 @@ export const renderMeasuredTemplate = async event => { if (!type || !range || !game.canvas.scene) return; const shapeData = CONFIG.Canvas.layers.regions.layerClass.getTemplateShape({ - shapetype: type, + shapeType: type, angle, range, direction, diff --git a/module/enrichers/_module.mjs b/module/enrichers/_module.mjs index b80f166c..02002884 100644 --- a/module/enrichers/_module.mjs +++ b/module/enrichers/_module.mjs @@ -35,23 +35,24 @@ export const enricherConfig = [ ]; export const enricherRenderSetup = element => { + const clickWrapper = func => event => { + event.stopPropagation(); + func(event); + }; + element .querySelectorAll('.enriched-damage-button') - .forEach(element => element.addEventListener('click', renderDamageButton)); + .forEach(element => element.addEventListener('click', clickWrapper(renderDamageButton))); element .querySelectorAll('.duality-roll-button') - .forEach(element => element.addEventListener('click', renderDualityButton)); + .forEach(element => element.addEventListener('click', clickWrapper(renderDualityButton))); element .querySelectorAll('.fate-roll-button') - .forEach(element => element.addEventListener('click', renderFateButton)); + .forEach(element => element.addEventListener('click', clickWrapper(renderFateButton))); element .querySelectorAll('.measured-template-button') - .forEach(element => element.addEventListener('click', renderMeasuredTemplate)); - - // element - // .querySelectorAll('.enriched-effect') - // .forEach(element => element.addEventListener('dragstart', dragEnrichedEffect)); + .forEach(element => element.addEventListener('click', clickWrapper(renderMeasuredTemplate))); }; diff --git a/module/helpers/handlebarsHelper.mjs b/module/helpers/handlebarsHelper.mjs index 7f30d970..dbcc50dc 100644 --- a/module/helpers/handlebarsHelper.mjs +++ b/module/helpers/handlebarsHelper.mjs @@ -48,9 +48,8 @@ export default class RegisterHandlebarsHelpers { return formula; } - 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); + static damageSymbols(damageData) { + const symbols = damageData.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 84bcacf2..f600eae6 100644 --- a/module/helpers/utils.mjs +++ b/module/helpers/utils.mjs @@ -700,19 +700,6 @@ 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); diff --git a/module/systemRegistration/migration-handlers/2_5_2.mjs b/module/systemRegistration/migration-handlers/2_5_2.mjs new file mode 100644 index 00000000..096f4bb7 --- /dev/null +++ b/module/systemRegistration/migration-handlers/2_5_2.mjs @@ -0,0 +1,39 @@ +import { MigrationHandlerBase } from './base.mjs'; + +export class Migration_2_5_2 extends MigrationHandlerBase { + version = '2.5.2'; + + /** @inheritdoc */ + async updateActiveEffectSource(effectSource, item) { + let shouldUpdate = false; + const newChanges = []; + + const srdItem = item?._stats?.compendiumSource ? + await foundry.utils.fromUuid(item?._stats.compendiumSource) : + null; + for (let i = 0; i < effectSource.system.changes.length; i++) { + const change = effectSource.system.changes[i]; + const srdEffect = srdItem?.effects.find(x => x.name === effectSource.name); + if (change.type === 'custom') { + const srdChange = srdEffect ? srdEffect.system.changes[i] : null; + if (srdChange && + change.key === srdChange.key && + change.value === srdChange.value && + change.type !== srdChange.type + ) { + shouldUpdate = true; + newChanges.push(srdChange); + } + } else { + newChanges.push(change); + } + } + + if (shouldUpdate) { + return { + _id: effectSource._id, + system: { changes: newChanges } + } + } + } +} \ No newline at end of file diff --git a/module/systemRegistration/migration-handlers/2_6_0.mjs b/module/systemRegistration/migration-handlers/2_6_0.mjs new file mode 100644 index 00000000..9edda9a2 --- /dev/null +++ b/module/systemRegistration/migration-handlers/2_6_0.mjs @@ -0,0 +1,20 @@ +import { MigrationHandlerBase } from './base.mjs'; + +export class Migration_2_6_0 extends MigrationHandlerBase { + version = '2.6.0'; + + /** @inheritdoc */ + async updateActorSource(actor) { + if (actor.type === 'party' && Object.keys(actor.system.tagTeam.members).length) { + return { + _id: actor._id, + system: { + tagTeam: { + initiator: null, + members: _replace({}) + } + } + }; + } + } +} \ No newline at end of file diff --git a/module/systemRegistration/migration-handlers/base.mjs b/module/systemRegistration/migration-handlers/base.mjs new file mode 100644 index 00000000..29c181ce --- /dev/null +++ b/module/systemRegistration/migration-handlers/base.mjs @@ -0,0 +1,117 @@ +/** + * @import DHItem from "../../documents/item.mjs"; +* @import DhActor from "../../documents/actor.mjs"; + */ +/** + + * The base class of an async migration. + * These are generally run between versions for things that require compendiums or must be done in post. + * The migrate() functions calls the various updateXSource() functions. + * Generally a subclass will override the version and the updateXSource() functions. + */ +export class MigrationHandlerBase { + version = null; + + /** + * Gets change data for an active effect's source, or null if no changes + * @param {object} effectSource + * @param {DHItem} item + * @returns {Promise} + * @protected + */ + async updateActiveEffectSource(effectSource, item) { + return null; + } + + /** + * Update a world actor + * @param {DhActor} actor + * @returns {Promise} + * @protected + */ + async updateActorSource(actor) { + return null; + } + + async migrate() { + // todo: handle more than just migrating effects. Right now this can only migrate effects + // NOTE: the preload is hardcoded, we should not hardcode it + + const numActors = game.actors.size; + const numItems = game.items.size; + const finalUpdateProgress = 5; + const DhProgress = game.system.api.applications.ui.DhProgress; + const preRunProgress = game.packs.size; + + const progress = DhProgress.createMigrationProgress( + preRunProgress + numActors + numItems + finalUpdateProgress + ); + + // Preload. Avoid hardcoding in the future + for (const pack of game.packs) { + await pack.getDocuments(); + progress.advance(); + } + + const batch = []; + + const updateItem = async item => { + const itemUpdates = []; + for (const effect of item.effects) { + const changes = await this.updateActiveEffectSource(effect.toObject(), item); + if (changes) itemUpdates.push(changes); + } + if (itemUpdates.length) { + batch.push({ + action: 'update', + documentName: 'ActiveEffect', + updates: itemUpdates, + parent: item + }); + } + }; + + const updateActor = async actor => { + const actorUpdate = await this.updateActorSource(actor); + if (actorUpdate) { + batch.push({ + action: 'update', + documentName: 'Actor', + updates: [actorUpdate] + }); + } + + const aeUpdates = []; + for (const item of actor.items) { + await updateItem(item); + } + + for (const effect of actor.effects) { + const changes = await this.updateActiveEffectSource(effect.toObject(), { parent: actor }); + if (changes) aeUpdates.push(changes); + } + if (aeUpdates.length) { + batch.push({ + action: 'update', + documentName: 'ActiveEffect', + updates: aeUpdates, + parent: actor + }); + } + } + + + for (const actor of game.actors) { + await updateActor(actor); + + progress.advance(); + } + for (const item of game.items) { + await updateItem(item); + progress.advance(); + } + + await foundry.documents.modifyBatch(batch); + progress.advance({ by: finalUpdateProgress }); + } +} \ No newline at end of file diff --git a/module/systemRegistration/migrations.mjs b/module/systemRegistration/migrations.mjs index 6971c34c..af11cd2c 100644 --- a/module/systemRegistration/migrations.mjs +++ b/module/systemRegistration/migrations.mjs @@ -1,4 +1,6 @@ import { defaultRestOptions } from '../config/generalConfig.mjs'; +import { Migration_2_5_2 } from './migration-handlers/2_5_2.mjs'; +import { Migration_2_6_0 } from './migration-handlers/2_6_0.mjs'; export async function runMigrations() { let lastMigrationVersion = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.LastMigrationVersion); @@ -320,7 +322,20 @@ export async function runMigrations() { lastMigrationVersion = '2.1.0'; } - //#endregion await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.LastMigrationVersion, lastMigrationVersion); + + /* -------------------------------------------- */ + /* New Style migrations below this point */ + /* -------------------------------------------- */ + + const migrations = [ + new Migration_2_5_2(), + new Migration_2_6_0() + ].filter(m => m.version && foundry.utils.isNewerVersion(m.version, lastMigrationVersion)); + + for (const handler of migrations) { + await handler.migrate(); + await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.LastMigrationVersion, handler.version); + } } diff --git a/module/systemRegistration/socket.mjs b/module/systemRegistration/socket.mjs index de9bf00c..10206ab5 100644 --- a/module/systemRegistration/socket.mjs +++ b/module/systemRegistration/socket.mjs @@ -1,5 +1,5 @@ import DamageReductionDialog from '../applications/dialogs/damageReductionDialog.mjs'; -import Party from '../applications/sheets/actors/party.mjs'; +import PartySheet from '../applications/sheets/actors/party.mjs'; export function handleSocketEvent({ action = null, data = {} } = {}) { switch (action) { @@ -16,7 +16,7 @@ export function handleSocketEvent({ action = null, data = {} } = {}) { Hooks.call(socketEvent.Refresh, data); break; case socketEvent.DowntimeTrigger: - Party.downtimeMoveQuery(data); + PartySheet.downtimeMoveQuery(data); break; case socketEvent.TagTeamStart: Hooks.callAll(CONFIG.DH.HOOKS.hooksConfig.tagTeamStart, data); diff --git a/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json b/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json index d3c8c955..4261a261 100644 --- a/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json +++ b/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json @@ -403,12 +403,6 @@ "_id": "9PsnogEPsp1OOK64", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "act" diff --git a/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json b/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json index ecb93d1b..ad558d43 100644 --- a/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json +++ b/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json @@ -322,32 +322,23 @@ "_id": "ia0NUIOxE3RHb45P", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.evasion", + "type": "override", + "value": "@system.evasion / 2", + "priority": 10 + } + ] }, - "changes": [ - { - "key": "system.evasion", - "mode": 5, - "value": "@system.evasion / 2", - "priority": 10 - } - ], - "disabled": false, "duration": { - "startTime": null, - "combat": null, - "seconds": null, - "rounds": null, - "turns": null, - "startRound": null, - "startTurn": null + "value": null, + "units": "seconds", + "expiry": null, + "expired": false }, - "description": "

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

", + "disabled": false, + "description": "

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

", "tint": "#ffffff", "statuses": [], "sort": 0, diff --git a/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json b/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json index 5da74eb3..6cb0c95d 100644 --- a/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json +++ b/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json @@ -491,12 +491,6 @@ "_id": "KGdf2eqcXkdigg0u", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json b/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json index 965c5168..d9399007 100644 --- a/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json +++ b/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json @@ -325,21 +325,15 @@ "_id": "wGuxOLokMqdxVSOo", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.disadvantageSources", + "type": "add", + "value": "Agility Rolls", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.disadvantageSources", - "mode": 2, - "value": "Agility Rolls", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json b/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json index 1e45b90a..24b7c6eb 100644 --- a/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json +++ b/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json @@ -472,14 +472,8 @@ "disabled": true, "_id": "bq8hTzQoCXmA3xad", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "duration": { "startTime": 0, "combat": null diff --git a/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json b/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json index c1bce57b..51eb7273 100644 --- a/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json +++ b/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json @@ -270,12 +270,6 @@ "_id": "2iBVUGHtGW3I9VIj", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", @@ -341,23 +335,17 @@ "name": "Out of Nowhere", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.advantageSources", + "type": "add", + "value": "On attacks if they are Hidden.", + "priority": null + } + ] }, "_id": "qT5nh7OcQ6aGdiWS", "img": "icons/magic/perception/shadow-stealth-eyes-purple.webp", - "changes": [ - { - "key": "system.advantageSources", - "mode": 2, - "value": "On attacks if they are Hidden.", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -452,12 +440,6 @@ "_id": "yP4ot8VqS56RnxnE", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [] }, "disabled": false, diff --git a/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json b/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json index be47829b..5625ff0f 100644 --- a/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json +++ b/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json @@ -680,12 +680,6 @@ "_id": "9NQcCXMhjyBReJRd", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", @@ -927,12 +921,6 @@ "_id": "S7kJlhnV8Nexzi8l", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json b/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json index cfc71120..8dd7fb95 100644 --- a/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json +++ b/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json @@ -363,12 +363,6 @@ "_id": "U50Ccm9emMqAxma6", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json b/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json index a315f91a..2083208f 100644 --- a/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json +++ b/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json @@ -371,12 +371,6 @@ "_id": "LmzztuktRkwOCy1a", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json b/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json index 8863641d..94862545 100644 --- a/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json +++ b/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json @@ -447,12 +447,6 @@ "_id": "CjMrSdL6kgD8mKRQ", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary" diff --git a/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json b/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json index 876519cf..3db27edd 100644 --- a/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json +++ b/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json @@ -232,23 +232,17 @@ "name": "Levitation", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.rules.conditionImmunities.restrained", + "type": "override", + "value": "1", + "priority": null + } + ] }, "_id": "k6iaQVfMZhrpwYQj", "img": "icons/magic/air/fog-gas-smoke-blue-gray.webp", - "changes": [ - { - "key": "system.rules.conditionImmunities.restrained", - "mode": 5, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -301,23 +295,17 @@ "name": "Wards", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.resistance.magical.resistance", + "type": "override", + "value": "1", + "priority": null + } + ] }, "_id": "4rj6PM0AGrrlbxSc", "img": "icons/magic/defensive/barrier-shield-dome-blue-purple.webp", - "changes": [ - { - "key": "system.resistance.magical.resistance", - "mode": 5, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json b/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json index 3bd154ef..02f6d587 100644 --- a/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json +++ b/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json @@ -459,21 +459,15 @@ "_id": "xkDIZk9u2ipDHvOL", "img": "icons/creatures/magical/construct-golem-stone-blue.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.physical.bonus", + "type": "add", + "value": "10", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.damage.physical.bonus", - "mode": 2, - "value": "10", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json b/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json index aba9ea46..14de1b12 100644 --- a/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json +++ b/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json @@ -315,12 +315,6 @@ "_id": "blcRqns0PHqiuPac", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json b/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json index 8777ee06..1e4f4140 100644 --- a/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json +++ b/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json @@ -331,12 +331,6 @@ "_id": "YNMhgBZW8ndrCjIp", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "scene" diff --git a/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json b/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json index 27553d32..e191c11e 100644 --- a/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json +++ b/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json @@ -415,12 +415,6 @@ "_id": "U9lWz1LgeAiK5L85", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.resistance.magical.resistance", @@ -546,12 +540,6 @@ "_id": "lNH6srSPyEprXZ4o", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json b/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json index e65f3202..0bb00b6b 100644 --- a/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json +++ b/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json @@ -379,12 +379,6 @@ "_id": "LwWxRz7FTMA80VdA", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary" diff --git a/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json b/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json index 9ff0a161..a4aca10d 100644 --- a/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json +++ b/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json @@ -410,12 +410,6 @@ "_id": "F3E7fiz01AbF2kr5", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json b/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json index 1a3538da..ebd41544 100644 --- a/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json +++ b/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json @@ -270,23 +270,17 @@ "name": "Numbers Must Go Up", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.attack.bonus", + "type": "add", + "value": "ITEM.@system.resource.value", + "priority": 21 + } + ] }, "_id": "iLeiOlUtWvYsgbDQ", "img": "icons/magic/control/fear-fright-monster-grin-red-orange.webp", - "changes": [ - { - "key": "system.bonuses.roll.attack.bonus", - "mode": 2, - "value": "ITEM.@system.resource.value", - "priority": 21 - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json b/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json index 6468c1aa..219136ff 100644 --- a/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json +++ b/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json @@ -238,23 +238,17 @@ "name": "Depths Of Despair", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.rules.attack.damage.hpDamageMultiplier", + "type": "override", + "value": "2", + "priority": null + } + ] }, "_id": "nofxm1vGZ2TmceA2", "img": "icons/magic/death/skull-horned-worn-fire-blue.webp", - "changes": [ - { - "key": "system.rules.attack.damage.hpDamageMultiplier", - "mode": 5, - "value": "2", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, @@ -356,12 +350,6 @@ "_id": "6WSx03mFbpbPWnOI", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.rules.dualityRoll.defaultHopeDice", diff --git a/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json b/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json index 0bc6bf2d..a158b2b7 100644 --- a/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json +++ b/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json @@ -319,12 +319,6 @@ "_id": "gFeHLGgeRoDdd3VG", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.rules.dualityRoll.defaultFearDice", diff --git a/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json b/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json index b534562b..09bca946 100644 --- a/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json +++ b/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json @@ -440,14 +440,8 @@ "disabled": true, "_id": "dPZ7PwvTERjtG92P", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "duration": { "startTime": 0, "combat": null diff --git a/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json b/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json index a1107f7c..bc1ab981 100644 --- a/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json +++ b/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json @@ -238,12 +238,6 @@ "name": "Flying", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.difficulty", diff --git a/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json b/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json index 939a5307..41ca7129 100644 --- a/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json +++ b/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json @@ -430,12 +430,6 @@ "_id": "YNKHEFQ4ucGr4Rmc", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json b/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json index 1909a74a..88a0dddb 100644 --- a/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json +++ b/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json @@ -358,14 +358,8 @@ "disabled": true, "_id": "xoal60Ed3Ih7saBJ", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "duration": { "startTime": 0, "combat": null diff --git a/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json b/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json index 70e56980..fa963fce 100644 --- a/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json +++ b/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json @@ -240,23 +240,17 @@ "name": "Warped Fortitude", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.resistance.physical.resistance", + "type": "override", + "value": "1", + "priority": null + } + ] }, "_id": "3QLH2EEtcUEZolFz", "img": "icons/creatures/magical/humanoid-silhouette-glowing-pink.webp", - "changes": [ - { - "key": "system.resistance.physical.resistance", - "mode": 5, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -309,23 +303,17 @@ "name": "Overwhelm", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.rules.attack.damage.hpDamageMultiplier", + "type": "override", + "value": "2", + "priority": null + } + ] }, "_id": "eGB9G0ljYCcdGbOx", "img": "icons/skills/melee/strike-slashes-orange.webp", - "changes": [ - { - "key": "system.rules.attack.damage.hpDamageMultiplier", - "mode": 5, - "value": "2", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json b/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json index 975cf6aa..0f335dcb 100644 --- a/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json +++ b/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json @@ -388,12 +388,6 @@ "_id": "Q99saHj6NOY2PSXf", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", @@ -596,12 +590,6 @@ "_id": "pWDg0MADoohKu40O", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", 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 6cb1c0ce..fb616c4c 100644 --- a/src/packs/adversaries/adversary_Fallen_Warlord__Undefeated_Champion_RXkZTwBRi4dJ3JE5.json +++ b/src/packs/adversaries/adversary_Fallen_Warlord__Undefeated_Champion_RXkZTwBRi4dJ3JE5.json @@ -656,12 +656,6 @@ "vulnerable" ], "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "description": "", diff --git a/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json b/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json index c6a482dd..9563c287 100644 --- a/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json +++ b/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json @@ -347,12 +347,6 @@ "_id": "vb1sZCOLwDNLsr3j", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json b/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json index a8a33586..044d51a0 100644 --- a/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json +++ b/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json @@ -265,23 +265,17 @@ "name": "Flying", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.difficulty", + "type": "add", + "value": "3", + "priority": null + } + ] }, "_id": "odAyKY0BSAkcO3Dd", "img": "icons/creatures/birds/raptor-hawk-flying.webp", - "changes": [ - { - "key": "system.difficulty", - "mode": 2, - "value": "3", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -425,12 +419,6 @@ "_id": "m6qqQZxukDPVcGdQ", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "act" @@ -579,14 +567,8 @@ "_id": "Sd34xywRqiF5w9sX", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json b/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json index a74cb88d..fef1d858 100644 --- a/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json +++ b/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json @@ -269,21 +269,15 @@ "_id": "aATxfjeOzUYtKuU6", "img": "icons/commodities/biological/wing-insect-green.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.difficulty", + "type": "add", + "value": "2", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.difficulty", - "mode": 2, - "value": "2", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, @@ -385,14 +379,8 @@ "disabled": true, "_id": "dQgcYTz5vmV25Y6G", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "duration": { "startTime": 0, "combat": null diff --git a/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json b/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json index 03a0272d..cb815547 100644 --- a/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json +++ b/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json @@ -433,12 +433,6 @@ "_id": "oILkLJlGNZl7KI1R", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "shortRest" diff --git a/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json b/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json index f290875d..fd832332 100644 --- a/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json +++ b/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json @@ -597,12 +597,6 @@ "_id": "Mchd23xNQ4nSWw9X", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [] }, "disabled": false, diff --git a/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json b/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json index 1fcfcce4..1a971a21 100644 --- a/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json +++ b/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json @@ -330,12 +330,6 @@ "_id": "bYBrgiSwHwYfQyjn", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.rules.conditionImmunities.hidden", diff --git a/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json b/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json index 72ad8ae2..2fe67f24 100644 --- a/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json +++ b/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json @@ -340,23 +340,17 @@ "name": "Immovable Object", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.resistance.physical.reduction", + "type": "add", + "value": "7", + "priority": null + } + ] }, "_id": "7V7qMq9in3AArwiM", "img": "icons/magic/defensive/shield-barrier-glowing-triangle-green.webp", - "changes": [ - { - "key": "system.resistance.physical.reduction", - "mode": 2, - "value": "7", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -510,12 +504,6 @@ "_id": "38MUzfbH64EMLVse", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json b/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json index db73a536..ef2cf6d5 100644 --- a/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json +++ b/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json @@ -323,21 +323,15 @@ "_id": "WYqjt1tVqPEdVV5l", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.disadvantageSources", + "type": "add", + "value": "Your next action", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.disadvantageSources", - "mode": 2, - "value": "Your next action", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -462,12 +456,6 @@ "_id": "X8NF2OB23mSpDvlx", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json b/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json index a3a76d7a..9714a3a2 100644 --- a/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json +++ b/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json @@ -460,12 +460,6 @@ "_id": "yk5kR5OVLCgDWfgY", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json b/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json index eb7eafc1..64a4dfb6 100644 --- a/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json +++ b/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json @@ -234,23 +234,17 @@ "name": "Punish the Guilty", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.rules.attack.damage.hpDamageMultiplier", + "type": "override", + "value": "2", + "priority": null + } + ] }, "_id": "ID85zoIa5GfhNMti", "img": "icons/magic/control/buff-flight-wings-runes-red-yellow.webp", - "changes": [ - { - "key": "system.rules.attack.damage.hpDamageMultiplier", - "mode": 5, - "value": "2", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json b/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json index 3dc96fd5..874330d4 100644 --- a/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json +++ b/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json @@ -386,12 +386,6 @@ "_id": "O8G0oOf9f3qzNOAT", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json b/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json index 183719f2..986f3146 100644 --- a/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json +++ b/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json @@ -429,12 +429,6 @@ "_id": "EwZ8owroJxFpg81e", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json b/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json index 9c53487a..4ebd5735 100644 --- a/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json +++ b/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json @@ -510,12 +510,6 @@ "_id": "iBJ3YhEkVsGKEIVk", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.resistance.magical.immunity", diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json b/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json index c6b2554e..f42433f0 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json @@ -273,12 +273,6 @@ "_id": "ihy3kvEGSOEKdNfT", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary" diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json b/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json index 3ce6a165..262d2954 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json @@ -329,12 +329,6 @@ "_id": "d7sB1Qa1kJMnglqu", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.rules.attack.damage.hpDamageTakenMultiplier", diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json b/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json index 81b95d8b..6b005769 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json @@ -375,21 +375,15 @@ "_id": "w5VTwlHmUjl8XCQ4", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.advantageSources", + "type": "add", + "value": "Attacks made while Hidden", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.advantageSources", - "mode": 2, - "value": "Attacks made while Hidden", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json b/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json index 24683a37..72f4626d 100644 --- a/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json +++ b/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json @@ -346,21 +346,15 @@ "_id": "pZUEkMkCus4U7h8W", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.evasion", + "type": "override", + "value": "@system.evasion / 2", + "priority": 10 + } + ] }, - "changes": [ - { - "key": "system.evasion", - "mode": 5, - "value": "@system.evasion / 2", - "priority": 10 - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json b/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json index 01435922..f86717fc 100644 --- a/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json +++ b/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json @@ -250,23 +250,17 @@ "name": "Chevalier", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.difficulty", + "type": "add", + "value": "2", + "priority": null + } + ] }, "_id": "w8wLcSsTiTU3mS7e", "img": "icons/environment/people/cavalry-heavy.webp", - "changes": [ - { - "key": "system.difficulty", - "mode": 2, - "value": "2", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -319,23 +313,17 @@ "name": "Heavily Armored", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.resistance.physical.reduction", + "type": "add", + "value": "3", + "priority": null + } + ] }, "_id": "xZjvrNRRjskY3n3j", "img": "icons/equipment/chest/breastplate-cuirass-steel-grey.webp", - "changes": [ - { - "key": "system.resistance.physical.reduction", - "mode": 2, - "value": "3", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json b/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json index 4bcdc15d..f03b6408 100644 --- a/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json +++ b/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json @@ -378,12 +378,6 @@ "_id": "Xes6ZIE01CCN67KF", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json b/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json index 77d48be3..1d9b30b2 100644 --- a/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json +++ b/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json @@ -402,12 +402,6 @@ "_id": "zMut1PRphlwE0xOa", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json b/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json index 9ddfb4f3..7c4bbdba 100644 --- a/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json +++ b/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json @@ -235,21 +235,15 @@ "_id": "vwc93gtzFoFZj4XT", "img": "icons/magic/defensive/shield-barrier-flaming-diamond-blue.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.resistance.magical.resistance", + "type": "add", + "value": "1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.resistance.magical.resistance", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -383,12 +377,6 @@ "_id": "KIyV2eXDmmymXY5y", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "shortRest" diff --git a/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json b/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json index 33677263..8bc19d39 100644 --- a/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json +++ b/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json @@ -447,12 +447,6 @@ "_id": "YznseQP43jNrk07h", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "scene" diff --git a/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json b/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json index c5feed37..edc0ea82 100644 --- a/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json +++ b/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json @@ -394,12 +394,6 @@ "_id": "3PY5KIG6d3dr3dty", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "any", - "range": "self" - }, "changes": [ { "key": "system.resistance.physical.resistance", diff --git a/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json b/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json index 3e5bacf3..e9a0b5f7 100644 --- a/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json +++ b/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json @@ -313,21 +313,15 @@ "_id": "rpkjVdlJYI5dB99B", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.disadvantageSources", + "type": "add", + "value": "On your next action roll.", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.disadvantageSources", - "mode": 2, - "value": "On your next action roll.", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -445,12 +439,6 @@ "_id": "edEZER9ImWicMwRb", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "scene" diff --git a/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json b/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json index 06a18345..5753337e 100644 --- a/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json +++ b/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json @@ -446,12 +446,6 @@ "_id": "Q5eeh0B6qaXFS1Ck", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "shortRest", diff --git a/src/packs/adversaries/adversary_Pirate_Raiders_5YgEajn0wa4i85kC.json b/src/packs/adversaries/adversary_Pirate_Raiders_5YgEajn0wa4i85kC.json index 94137c2f..ccd07cf1 100644 --- a/src/packs/adversaries/adversary_Pirate_Raiders_5YgEajn0wa4i85kC.json +++ b/src/packs/adversaries/adversary_Pirate_Raiders_5YgEajn0wa4i85kC.json @@ -337,14 +337,8 @@ "disabled": true, "_id": "OU05YZwFQffawtna", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "duration": { "startTime": 0, "combat": null diff --git a/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json b/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json index f74da475..3b54337a 100644 --- a/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json +++ b/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json @@ -404,12 +404,6 @@ "_id": "9UBLk9M87VIUziAQ", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json b/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json index 39f6a5b9..43af1f43 100644 --- a/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json +++ b/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json @@ -411,12 +411,6 @@ "_id": "xrm5786ckKbMYHjn", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json b/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json index f0dde9f0..5e2e8200 100644 --- a/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json +++ b/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json @@ -235,23 +235,17 @@ "name": "Opportunist", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.rules.attack.damage.hpDamageMultiplier", + "type": "override", + "value": "2", + "priority": null + } + ] }, "_id": "O03vYbyNLO3YPZGo", "img": "icons/skills/targeting/crosshair-triple-strike-orange.webp", - "changes": [ - { - "key": "system.rules.attack.damage.hpDamageMultiplier", - "mode": 5, - "value": "2", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json b/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json index 726b06e1..4cf72b0b 100644 --- a/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json +++ b/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json @@ -237,21 +237,15 @@ "_id": "zTepuF1Z5OObQdSi", "img": "icons/magic/death/bones-crossed-orange.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.resistance.physical.resistance", + "type": "override", + "value": "1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.resistance.physical.resistance", - "mode": 5, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json b/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json index 5b9cbb65..bda82248 100644 --- a/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json +++ b/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json @@ -270,23 +270,17 @@ "name": "Ghost", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.resistance.physical.resistance", + "type": "override", + "value": "1", + "priority": null + } + ] }, "_id": "xNkkl7nwKFkiB9Rv", "img": "icons/magic/death/undead-ghost-scream-teal.webp", - "changes": [ - { - "key": "system.resistance.physical.resistance", - "mode": 5, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json b/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json index 0572e018..20668427 100644 --- a/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json +++ b/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json @@ -270,23 +270,17 @@ "name": "Ghost", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.resistance.physical.resistance", + "type": "override", + "value": "1", + "priority": null + } + ] }, "_id": "kZhvwDvfcYQ10reO", "img": "icons/magic/death/undead-ghost-scream-teal.webp", - "changes": [ - { - "key": "system.resistance.physical.resistance", - "mode": 5, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json b/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json index 85893254..e9792485 100644 --- a/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json +++ b/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json @@ -270,23 +270,17 @@ "name": "Ghost", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.resistance.physical.resistance", + "type": "override", + "value": "1", + "priority": null + } + ] }, "_id": "QDXyAMk33kJGe6hU", "img": "icons/magic/death/undead-ghost-scream-teal.webp", - "changes": [ - { - "key": "system.resistance.physical.resistance", - "mode": 5, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json b/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json index 52869085..45093ea7 100644 --- a/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json +++ b/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json @@ -352,12 +352,6 @@ "_id": "6UgMuuJ8ZygbCsDh", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary" diff --git a/src/packs/adversaries/adversary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json b/src/packs/adversaries/adversary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json index 28d5dabe..49b75790 100644 --- a/src/packs/adversaries/adversary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json +++ b/src/packs/adversaries/adversary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json @@ -278,14 +278,8 @@ "disabled": true, "_id": "FOV6AzngiR0PZyuN", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "duration": { "startTime": 0, "combat": null diff --git a/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json b/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json index f3ce03c3..dfb6fd42 100644 --- a/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json +++ b/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json @@ -489,14 +489,8 @@ "_id": "xyXPmPIOtqXYF1TJ", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json b/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json index f8f93cf2..6ad802aa 100644 --- a/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json +++ b/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json @@ -421,14 +421,8 @@ "_id": "PdkhaTw2j15KJwBf", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, @@ -473,14 +467,8 @@ "disabled": true, "_id": "ki4vrzrFcEYtGeJu", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "duration": { "startTime": 0, "combat": null diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json b/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json index 97c493a8..23a6048a 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json @@ -323,12 +323,6 @@ "_id": "6TZlstmWJPbeoL7i", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json b/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json index ba3f5c33..8afe5f9e 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json @@ -297,21 +297,15 @@ "_id": "Fo5bLYlmYGtQFAGg", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.disadvantageSources", + "type": "add", + "value": "On attack rolls while you're within Very Close range of the Sentinel", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.disadvantageSources", - "mode": 2, - "value": "On attack rolls while you're within Very Close range of the Sentinel", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json b/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json index 018d5b58..906e05ff 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json @@ -302,21 +302,15 @@ "_id": "yQ85C0JHRG1pwu8a", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.evasion", + "type": "override", + "value": "@system.evasion / 2", + "priority": 10 + } + ] }, - "changes": [ - { - "key": "system.evasion", - "mode": 5, - "value": "@system.evasion / 2", - "priority": 10 - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json b/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json index e360f0c8..04663981 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json @@ -376,23 +376,17 @@ "name": "Injured Wings", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.difficulty", + "type": "add", + "value": "1", + "priority": null + } + ] }, "_id": "zCi90lgFAaA7yrJG", "img": "icons/commodities/biological/wing-green.webp", - "changes": [ - { - "key": "system.difficulty", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -873,12 +867,6 @@ "_id": "YUjdwrEZ4zn7WR9X", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", 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 d4babd71..cce2c07e 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json @@ -734,12 +734,6 @@ "_id": "xmzA6NC9zrulhzQs", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", 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 82daed6a..29117035 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json @@ -321,23 +321,17 @@ "name": "Flying", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.difficulty", + "type": "add", + "value": "3", + "priority": null + } + ] }, "_id": "8o8yG73ZfrZ3hb5i", "img": "icons/commodities/biological/wing-green.webp", - "changes": [ - { - "key": "system.difficulty", - "mode": 2, - "value": "3", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -390,23 +384,17 @@ "name": "Obsidian Scales", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.resistance.physical.resistance", + "type": "override", + "value": "1", + "priority": null + } + ] }, "_id": "Jr9SlkRnkroulYhy", "img": "icons/commodities/leather/scale-chitin-grey.webp", - "changes": [ - { - "key": "system.resistance.physical.resistance", - "mode": 5, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -551,12 +539,6 @@ "_id": "qtIaAZDW8QsjILgb", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [] }, "disabled": false, diff --git a/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json b/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json index 8eaf56f9..f06a2c72 100644 --- a/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json +++ b/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json @@ -319,12 +319,6 @@ "_id": "j2jYmYbtWXvq32yX", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json b/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json index 9d7f66d0..30db7ff7 100644 --- a/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json +++ b/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json @@ -362,12 +362,6 @@ "_id": "k8LzBWRZo6VPqvpH", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json b/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json index 6c55ba15..f5324abd 100644 --- a/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json +++ b/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json @@ -500,12 +500,6 @@ "_id": "g9bUvmw3jet6T99e", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [] }, "disabled": false, @@ -634,12 +628,6 @@ "_id": "40cFHuNdEvbUZ9rs", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", @@ -768,12 +756,6 @@ "_id": "1JlRxa07i8T1a9x6", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.disadvantageSources", diff --git a/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json b/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json index 2c3495ff..ee324e16 100644 --- a/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json +++ b/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json @@ -259,23 +259,17 @@ "name": "Unyielding", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.resistance.physical.resistance", + "type": "override", + "value": "1", + "priority": null + } + ] }, "_id": "D1lCoe9WVr6vYuD9", "img": "icons/magic/defensive/shield-barrier-blue.webp", - "changes": [ - { - "key": "system.resistance.physical.resistance", - "mode": 5, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -434,14 +428,8 @@ "disabled": true, "_id": "9D6SteWlhbfMPhvt", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "duration": { "startTime": 0, "combat": null diff --git a/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json b/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json index f418758a..0b6d0177 100644 --- a/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json +++ b/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json @@ -309,14 +309,8 @@ "disabled": true, "_id": "aWWZTlNS9zYoUay7", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "duration": { "startTime": 0, "combat": null diff --git a/src/packs/ancestries/feature_Celestial_Trance_TfolXWFG2W2hx6sK.json b/src/packs/ancestries/feature_Celestial_Trance_TfolXWFG2W2hx6sK.json index 7cbe132e..0321223a 100644 --- a/src/packs/ancestries/feature_Celestial_Trance_TfolXWFG2W2hx6sK.json +++ b/src/packs/ancestries/feature_Celestial_Trance_TfolXWFG2W2hx6sK.json @@ -24,27 +24,21 @@ "_id": "LqQvZJJLNMnFkt1D", "img": "icons/magic/perception/orb-crystal-ball-scrying-blue.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.rest.shortRest.shortMoves", + "type": "add", + "value": "1", + "priority": null + }, + { + "key": "system.bonuses.rest.longRest.longMoves", + "type": "add", + "value": "1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.rest.shortRest.shortMoves", - "mode": 2, - "value": "1", - "priority": null - }, - { - "key": "system.bonuses.rest.longRest.longMoves", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/ancestries/feature_Dread_Visage_i92lYjDhVB0LyPid.json b/src/packs/ancestries/feature_Dread_Visage_i92lYjDhVB0LyPid.json index bbe35d19..5d72e579 100644 --- a/src/packs/ancestries/feature_Dread_Visage_i92lYjDhVB0LyPid.json +++ b/src/packs/ancestries/feature_Dread_Visage_i92lYjDhVB0LyPid.json @@ -24,21 +24,15 @@ "_id": "2Gd6iHQX521aAZqC", "img": "icons/magic/control/fear-fright-monster-red.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.advantageSources", + "type": "add", + "value": "Dread Visage: Rolls to intimidate hostile creatures", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.advantageSources", - "mode": 2, - "value": "Dread Visage: Rolls to intimidate hostile creatures", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/ancestries/feature_Efficient_2xlqKOkDxWHbuj4t.json b/src/packs/ancestries/feature_Efficient_2xlqKOkDxWHbuj4t.json index 81f19a2f..5a567695 100644 --- a/src/packs/ancestries/feature_Efficient_2xlqKOkDxWHbuj4t.json +++ b/src/packs/ancestries/feature_Efficient_2xlqKOkDxWHbuj4t.json @@ -24,27 +24,21 @@ "_id": "EEryWN2nE33ppGHi", "img": "icons/magic/time/clock-stopwatch-white-blue.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.rest.shortRest.longMoves", + "type": "add", + "value": "1", + "priority": null + }, + { + "key": "system.bonuses.rest.shortRest.shortMoves", + "type": "add", + "value": "-1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.rest.shortRest.longMoves", - "mode": 2, - "value": "1", - "priority": null - }, - { - "key": "system.bonuses.rest.shortRest.shortMoves", - "mode": 2, - "value": "-1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/ancestries/feature_Endurance_tXWEMdLXafUSZTbK.json b/src/packs/ancestries/feature_Endurance_tXWEMdLXafUSZTbK.json index 3e64fece..ecf3d148 100644 --- a/src/packs/ancestries/feature_Endurance_tXWEMdLXafUSZTbK.json +++ b/src/packs/ancestries/feature_Endurance_tXWEMdLXafUSZTbK.json @@ -24,21 +24,15 @@ "_id": "db8W2Q0Qty84XV0x", "img": "icons/magic/control/buff-strength-muscle-damage.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.resources.hitPoints.max", + "type": "add", + "value": "1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.resources.hitPoints.max", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/ancestries/feature_High_Stamina_HMXNJZ7ynzajR2KT.json b/src/packs/ancestries/feature_High_Stamina_HMXNJZ7ynzajR2KT.json index 769bec96..c653d13b 100644 --- a/src/packs/ancestries/feature_High_Stamina_HMXNJZ7ynzajR2KT.json +++ b/src/packs/ancestries/feature_High_Stamina_HMXNJZ7ynzajR2KT.json @@ -24,21 +24,15 @@ "_id": "Xl3TsKUJcl6vi1ly", "img": "icons/magic/control/buff-flight-wings-runes-purple-orange.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.resources.stress.max", + "type": "add", + "value": "1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.resources.stress.max", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/ancestries/feature_Natural_Climber_soQvPL0MrTLLcc31.json b/src/packs/ancestries/feature_Natural_Climber_soQvPL0MrTLLcc31.json index fd02b72f..3817b5bd 100644 --- a/src/packs/ancestries/feature_Natural_Climber_soQvPL0MrTLLcc31.json +++ b/src/packs/ancestries/feature_Natural_Climber_soQvPL0MrTLLcc31.json @@ -24,21 +24,15 @@ "_id": "HQeQH9gUfrjlWWcg", "img": "icons/magic/nature/root-vine-barrier-wall-brown.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.advantageSources", + "type": "add", + "value": "Agility Rolls that involve balancing and climbing", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.advantageSources", - "mode": 2, - "value": "Agility Rolls that involve balancing and climbing", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/ancestries/feature_Nimble_3lNqft3LmOlEIEkw.json b/src/packs/ancestries/feature_Nimble_3lNqft3LmOlEIEkw.json index d56ab3ac..d7bf9dd4 100644 --- a/src/packs/ancestries/feature_Nimble_3lNqft3LmOlEIEkw.json +++ b/src/packs/ancestries/feature_Nimble_3lNqft3LmOlEIEkw.json @@ -24,21 +24,15 @@ "_id": "zaxVYqKzUYDJ3SDq", "img": "icons/skills/movement/arrows-up-trio-red.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.evasion", + "type": "add", + "value": "1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.evasion", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/ancestries/feature_Retract_UFR67BUOhNGLFyg9.json b/src/packs/ancestries/feature_Retract_UFR67BUOhNGLFyg9.json index eb9696b2..89cf8b9e 100644 --- a/src/packs/ancestries/feature_Retract_UFR67BUOhNGLFyg9.json +++ b/src/packs/ancestries/feature_Retract_UFR67BUOhNGLFyg9.json @@ -63,12 +63,6 @@ "_id": "3V4FPoyjJUnFP9WS", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.resistance.physical.resistance", diff --git a/src/packs/ancestries/feature_Retracting_Claws_Zj69cAeb3NjIa8Hn.json b/src/packs/ancestries/feature_Retracting_Claws_Zj69cAeb3NjIa8Hn.json index b9b000f4..4f8a7158 100644 --- a/src/packs/ancestries/feature_Retracting_Claws_Zj69cAeb3NjIa8Hn.json +++ b/src/packs/ancestries/feature_Retracting_Claws_Zj69cAeb3NjIa8Hn.json @@ -78,12 +78,6 @@ "_id": "pO76svFkmWmZ6LjC", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary" diff --git a/src/packs/ancestries/feature_Scales_u8ZhV962rNmUlzkp.json b/src/packs/ancestries/feature_Scales_u8ZhV962rNmUlzkp.json index fbf63533..956d4aa3 100644 --- a/src/packs/ancestries/feature_Scales_u8ZhV962rNmUlzkp.json +++ b/src/packs/ancestries/feature_Scales_u8ZhV962rNmUlzkp.json @@ -24,21 +24,15 @@ "_id": "b6Pkwwk7pgBeeUTe", "img": "icons/commodities/leather/scales-brown.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.rules.damageReduction.stressDamageReduction.severe.cost", + "type": "override", + "value": "1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.rules.damageReduction.stressDamageReduction.severe.cost", - "mode": 5, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/ancestries/feature_Shell_A6a87OWA3tx16g9V.json b/src/packs/ancestries/feature_Shell_A6a87OWA3tx16g9V.json index f07fff69..3063966e 100644 --- a/src/packs/ancestries/feature_Shell_A6a87OWA3tx16g9V.json +++ b/src/packs/ancestries/feature_Shell_A6a87OWA3tx16g9V.json @@ -24,27 +24,21 @@ "_id": "41uiZKXzSSomf9YD", "img": "icons/creatures/reptiles/turtle-shell-glowing-green.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.damageThresholds.major", + "type": "add", + "value": "@prof", + "priority": 21 + }, + { + "key": "system.damageThresholds.severe", + "type": "add", + "value": "@prof", + "priority": 21 + } + ] }, - "changes": [ - { - "key": "system.damageThresholds.major", - "mode": 2, - "value": "@prof", - "priority": 21 - }, - { - "key": "system.damageThresholds.severe", - "mode": 2, - "value": "@prof", - "priority": 21 - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/ancestries/feature_Thick_Skin_S0Ww7pYOSREt8qKg.json b/src/packs/ancestries/feature_Thick_Skin_S0Ww7pYOSREt8qKg.json index 7bc10752..e3712cd5 100644 --- a/src/packs/ancestries/feature_Thick_Skin_S0Ww7pYOSREt8qKg.json +++ b/src/packs/ancestries/feature_Thick_Skin_S0Ww7pYOSREt8qKg.json @@ -24,21 +24,15 @@ "_id": "4Lc40mNnRInTKMC5", "img": "icons/magic/defensive/shield-barrier-glowing-triangle-orange.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.rules.damageReduction.stressDamageReduction.minor.cost", + "type": "override", + "value": "2", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.rules.damageReduction.stressDamageReduction.minor.cost", - "mode": 5, - "value": "2", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/ancestries/feature_Tusks_YhxD1ujZpftPu19w.json b/src/packs/ancestries/feature_Tusks_YhxD1ujZpftPu19w.json index 6038f2c6..53c3de82 100644 --- a/src/packs/ancestries/feature_Tusks_YhxD1ujZpftPu19w.json +++ b/src/packs/ancestries/feature_Tusks_YhxD1ujZpftPu19w.json @@ -87,27 +87,21 @@ "_id": "klEyAxQa5YHXVnrl", "img": "icons/creatures/abilities/fang-tooth-blood-red.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.physical.dice", + "type": "add", + "value": "1d6", + "priority": null + }, + { + "key": "system.bonuses.damage.magical.dice", + "type": "add", + "value": "1d6", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.damage.physical.dice", - "mode": 2, - "value": "1d6", - "priority": null - }, - { - "key": "system.bonuses.damage.magical.dice", - "mode": 2, - "value": "1d6", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/ancestries/feature_Wings_WquAjoOcso8lwySW.json b/src/packs/ancestries/feature_Wings_WquAjoOcso8lwySW.json index 9941432e..b90b6076 100644 --- a/src/packs/ancestries/feature_Wings_WquAjoOcso8lwySW.json +++ b/src/packs/ancestries/feature_Wings_WquAjoOcso8lwySW.json @@ -54,21 +54,15 @@ "_id": "zD3xVdwkEQi2ivOn", "img": "icons/creatures/abilities/wing-batlike-white-blue.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.evasion", + "type": "add", + "value": "2", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.evasion", - "mode": 2, - "value": "2", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/beastforms/beastform_Agile_Scout_a9UoCwtrbgKk02mK.json b/src/packs/beastforms/beastform_Agile_Scout_a9UoCwtrbgKk02mK.json index bd9bfffb..0fc7a23d 100644 --- a/src/packs/beastforms/beastform_Agile_Scout_a9UoCwtrbgKk02mK.json +++ b/src/packs/beastforms/beastform_Agile_Scout_a9UoCwtrbgKk02mK.json @@ -62,25 +62,25 @@ "changes": [ { "key": "system.traits.agility.value", - "mode": 2, + "type": "add", "value": "1", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "2", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "0", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "agility", "priority": null } diff --git a/src/packs/beastforms/beastform_Aquatic_Predator_ItBVeCl2u5uetgy7.json b/src/packs/beastforms/beastform_Aquatic_Predator_ItBVeCl2u5uetgy7.json index 5287de84..9cf209e2 100644 --- a/src/packs/beastforms/beastform_Aquatic_Predator_ItBVeCl2u5uetgy7.json +++ b/src/packs/beastforms/beastform_Aquatic_Predator_ItBVeCl2u5uetgy7.json @@ -62,31 +62,31 @@ "changes": [ { "key": "system.traits.agility.value", - "mode": 2, + "type": "add", "value": "2", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "4", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "3", "priority": null }, { "key": "system.rules.attack.damage.bonus", - "mode": 5, + "type": "override", "value": "6", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "agility", "priority": null } diff --git a/src/packs/beastforms/beastform_Aquatic_Scout_qqzdFCxyYupWZK23.json b/src/packs/beastforms/beastform_Aquatic_Scout_qqzdFCxyYupWZK23.json index 95bea914..7816fd93 100644 --- a/src/packs/beastforms/beastform_Aquatic_Scout_qqzdFCxyYupWZK23.json +++ b/src/packs/beastforms/beastform_Aquatic_Scout_qqzdFCxyYupWZK23.json @@ -62,25 +62,25 @@ "changes": [ { "key": "system.traits.agility.value", - "mode": 2, + "type": "add", "value": "1", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "2", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "0", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "agility", "priority": null } diff --git a/src/packs/beastforms/beastform_Armored_Sentry_8pUHJv3BYdjA4Qdf.json b/src/packs/beastforms/beastform_Armored_Sentry_8pUHJv3BYdjA4Qdf.json index ba18c05f..bc9187f5 100644 --- a/src/packs/beastforms/beastform_Armored_Sentry_8pUHJv3BYdjA4Qdf.json +++ b/src/packs/beastforms/beastform_Armored_Sentry_8pUHJv3BYdjA4Qdf.json @@ -62,31 +62,31 @@ "changes": [ { "key": "system.traits.strength.value", - "mode": 2, + "type": "add", "value": "1", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "1", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "2", "priority": null }, { "key": "system.rules.attack.damage.bonus", - "mode": 5, + "type": "override", "value": "2", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "strength", "priority": null } diff --git a/src/packs/beastforms/beastform_Epic_Aquatic_Beast_wT4xbF99I55yjKZV.json b/src/packs/beastforms/beastform_Epic_Aquatic_Beast_wT4xbF99I55yjKZV.json index 0dfe9c20..5131fd69 100644 --- a/src/packs/beastforms/beastform_Epic_Aquatic_Beast_wT4xbF99I55yjKZV.json +++ b/src/packs/beastforms/beastform_Epic_Aquatic_Beast_wT4xbF99I55yjKZV.json @@ -65,31 +65,31 @@ "changes": [ { "key": "system.traits.agility.value", - "mode": 2, + "type": "add", "value": "3", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "3", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "3", "priority": null }, { "key": "system.rules.attack.damage.bonus", - "mode": 5, + "type": "override", "value": "10", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "agility", "priority": null } diff --git a/src/packs/beastforms/beastform_Great_Predator_afbMt4Ld6nY3mw0N.json b/src/packs/beastforms/beastform_Great_Predator_afbMt4Ld6nY3mw0N.json index 450a1312..d8d41890 100644 --- a/src/packs/beastforms/beastform_Great_Predator_afbMt4Ld6nY3mw0N.json +++ b/src/packs/beastforms/beastform_Great_Predator_afbMt4Ld6nY3mw0N.json @@ -62,31 +62,31 @@ "changes": [ { "key": "system.traits.strength.value", - "mode": 2, + "type": "add", "value": "2", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "2", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "4", "priority": null }, { "key": "system.rules.attack.damage.bonus", - "mode": 5, + "type": "override", "value": "8", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "strength", "priority": null } diff --git a/src/packs/beastforms/beastform_Great_Winged_Beast_b4BMnTbJ3iPPidSb.json b/src/packs/beastforms/beastform_Great_Winged_Beast_b4BMnTbJ3iPPidSb.json index c04b2182..e3842c7e 100644 --- a/src/packs/beastforms/beastform_Great_Winged_Beast_b4BMnTbJ3iPPidSb.json +++ b/src/packs/beastforms/beastform_Great_Winged_Beast_b4BMnTbJ3iPPidSb.json @@ -62,31 +62,31 @@ "changes": [ { "key": "system.traits.finesse.value", - "mode": 2, + "type": "add", "value": "2", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "3", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "2", "priority": null }, { "key": "system.rules.attack.damage.bonus", - "mode": 5, + "type": "override", "value": "6", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "finesse", "priority": null } diff --git a/src/packs/beastforms/beastform_Household_Friend_iDmOtiHJJ80AIAVT.json b/src/packs/beastforms/beastform_Household_Friend_iDmOtiHJJ80AIAVT.json index cfb6aea7..ff7daa91 100644 --- a/src/packs/beastforms/beastform_Household_Friend_iDmOtiHJJ80AIAVT.json +++ b/src/packs/beastforms/beastform_Household_Friend_iDmOtiHJJ80AIAVT.json @@ -62,25 +62,25 @@ "changes": [ { "key": "system.traits.instinct.value", - "mode": 2, + "type": "add", "value": "1", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "2", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "1", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "instinct", "priority": null } diff --git a/src/packs/beastforms/beastform_Legendary_Beast_mqP6z4Wg4K3oDAom.json b/src/packs/beastforms/beastform_Legendary_Beast_mqP6z4Wg4K3oDAom.json index 60ba7cd0..dd35735b 100644 --- a/src/packs/beastforms/beastform_Legendary_Beast_mqP6z4Wg4K3oDAom.json +++ b/src/packs/beastforms/beastform_Legendary_Beast_mqP6z4Wg4K3oDAom.json @@ -49,13 +49,13 @@ "changes": [ { "key": "system.bonuses.damage.physical.bonus", - "mode": 2, + "type": "add", "value": "6", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "2", "priority": null } diff --git a/src/packs/beastforms/beastform_Legendary_Hybrid_rRUtgcUjimlpPhnn.json b/src/packs/beastforms/beastform_Legendary_Hybrid_rRUtgcUjimlpPhnn.json index 4575820e..58edfabc 100644 --- a/src/packs/beastforms/beastform_Legendary_Hybrid_rRUtgcUjimlpPhnn.json +++ b/src/packs/beastforms/beastform_Legendary_Hybrid_rRUtgcUjimlpPhnn.json @@ -49,31 +49,31 @@ "changes": [ { "key": "system.traits.strength.value", - "mode": 2, + "type": "add", "value": "2", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "3", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "3", "priority": null }, { "key": "system.rules.attack.damage.bonus", - "mode": 5, + "type": "override", "value": "8", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "strength", "priority": null } diff --git a/src/packs/beastforms/beastform_Massive_Behemoth_qjwMzPn33aKZACkv.json b/src/packs/beastforms/beastform_Massive_Behemoth_qjwMzPn33aKZACkv.json index 35715056..1b34daf9 100644 --- a/src/packs/beastforms/beastform_Massive_Behemoth_qjwMzPn33aKZACkv.json +++ b/src/packs/beastforms/beastform_Massive_Behemoth_qjwMzPn33aKZACkv.json @@ -66,31 +66,31 @@ "changes": [ { "key": "system.traits.strength.value", - "mode": 2, + "type": "add", "value": "3", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "1", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "4", "priority": null }, { "key": "system.rules.attack.damage.bonus", - "mode": 5, + "type": "override", "value": "12", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "strength", "priority": null } diff --git a/src/packs/beastforms/beastform_Mighty_Lizard_94tvcC3D5Kp4lzuN.json b/src/packs/beastforms/beastform_Mighty_Lizard_94tvcC3D5Kp4lzuN.json index 390bf054..8f76f675 100644 --- a/src/packs/beastforms/beastform_Mighty_Lizard_94tvcC3D5Kp4lzuN.json +++ b/src/packs/beastforms/beastform_Mighty_Lizard_94tvcC3D5Kp4lzuN.json @@ -62,31 +62,31 @@ "changes": [ { "key": "system.traits.instinct.value", - "mode": 2, + "type": "add", "value": "2", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "1", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "3", "priority": null }, { "key": "system.rules.attack.damage.bonus", - "mode": 5, + "type": "override", "value": "7", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "instinct", "priority": null } diff --git a/src/packs/beastforms/beastform_Mighty_Strider_zRLjqKx4Rn2TjivL.json b/src/packs/beastforms/beastform_Mighty_Strider_zRLjqKx4Rn2TjivL.json index adb9627b..5393c188 100644 --- a/src/packs/beastforms/beastform_Mighty_Strider_zRLjqKx4Rn2TjivL.json +++ b/src/packs/beastforms/beastform_Mighty_Strider_zRLjqKx4Rn2TjivL.json @@ -62,31 +62,31 @@ "changes": [ { "key": "system.traits.agility.value", - "mode": 2, + "type": "add", "value": "1", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "2", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "2", "priority": null }, { "key": "system.rules.attack.damage.bonus", - "mode": 5, + "type": "override", "value": "1", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "agility", "priority": null } diff --git a/src/packs/beastforms/beastform_Mythic_Aerial_Hunter_jV6EuEacyQlHW4SN.json b/src/packs/beastforms/beastform_Mythic_Aerial_Hunter_jV6EuEacyQlHW4SN.json index dc373c27..80571c43 100644 --- a/src/packs/beastforms/beastform_Mythic_Aerial_Hunter_jV6EuEacyQlHW4SN.json +++ b/src/packs/beastforms/beastform_Mythic_Aerial_Hunter_jV6EuEacyQlHW4SN.json @@ -65,31 +65,31 @@ "changes": [ { "key": "system.traits.finesse.value", - "mode": 2, + "type": "add", "value": "3", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "4", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "3", "priority": null }, { "key": "system.rules.attack.damage.bonus", - "mode": 5, + "type": "override", "value": "11", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "finesse", "priority": null } diff --git a/src/packs/beastforms/beastform_Mythic_Beast_kObobka52JdpWBSu.json b/src/packs/beastforms/beastform_Mythic_Beast_kObobka52JdpWBSu.json index cd879ac0..84dfb32b 100644 --- a/src/packs/beastforms/beastform_Mythic_Beast_kObobka52JdpWBSu.json +++ b/src/packs/beastforms/beastform_Mythic_Beast_kObobka52JdpWBSu.json @@ -49,19 +49,19 @@ "changes": [ { "key": "system.bonuses.damage.physical.bonus", - "mode": 2, + "type": "add", "value": "9", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "3", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 2, + "type": "add", "value": "1", "priority": 60 } diff --git a/src/packs/beastforms/beastform_Mythic_Hybrid_WAbxCf2An8qmxyJ1.json b/src/packs/beastforms/beastform_Mythic_Hybrid_WAbxCf2An8qmxyJ1.json index fa35eaac..691d9972 100644 --- a/src/packs/beastforms/beastform_Mythic_Hybrid_WAbxCf2An8qmxyJ1.json +++ b/src/packs/beastforms/beastform_Mythic_Hybrid_WAbxCf2An8qmxyJ1.json @@ -49,31 +49,31 @@ "changes": [ { "key": "system.traits.strength.value", - "mode": 2, + "type": "add", "value": "3", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "2", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "4", "priority": null }, { "key": "system.rules.attack.damage.bonus", - "mode": 5, + "type": "override", "value": "10", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "strength", "priority": null } diff --git a/src/packs/beastforms/beastform_Nimble_Grazer_CItO8yX6amQaqyk7.json b/src/packs/beastforms/beastform_Nimble_Grazer_CItO8yX6amQaqyk7.json index 183ad150..30523e41 100644 --- a/src/packs/beastforms/beastform_Nimble_Grazer_CItO8yX6amQaqyk7.json +++ b/src/packs/beastforms/beastform_Nimble_Grazer_CItO8yX6amQaqyk7.json @@ -62,25 +62,25 @@ "changes": [ { "key": "system.traits.agility.value", - "mode": 2, + "type": "add", "value": "1", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "3", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "1", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "agility", "priority": null } diff --git a/src/packs/beastforms/beastform_Pack_Predator_YLisKYYhAGca50WM.json b/src/packs/beastforms/beastform_Pack_Predator_YLisKYYhAGca50WM.json index 834493bb..82a0dded 100644 --- a/src/packs/beastforms/beastform_Pack_Predator_YLisKYYhAGca50WM.json +++ b/src/packs/beastforms/beastform_Pack_Predator_YLisKYYhAGca50WM.json @@ -62,31 +62,31 @@ "changes": [ { "key": "system.traits.strength.value", - "mode": 2, + "type": "add", "value": "2", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "1", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "2", "priority": null }, { "key": "system.rules.attack.damage.bonus", - "mode": 5, + "type": "override", "value": "2", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "strength", "priority": null } diff --git a/src/packs/beastforms/beastform_Pouncing_Predator_33oFSZ1PwFqInHPe.json b/src/packs/beastforms/beastform_Pouncing_Predator_33oFSZ1PwFqInHPe.json index d172d8f3..f058d649 100644 --- a/src/packs/beastforms/beastform_Pouncing_Predator_33oFSZ1PwFqInHPe.json +++ b/src/packs/beastforms/beastform_Pouncing_Predator_33oFSZ1PwFqInHPe.json @@ -62,31 +62,31 @@ "changes": [ { "key": "system.traits.instinct.value", - "mode": 2, + "type": "add", "value": "1", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "3", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "2", "priority": null }, { "key": "system.rules.attack.damage.bonus", - "mode": 5, + "type": "override", "value": "6", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "instinct", "priority": null } diff --git a/src/packs/beastforms/beastform_Powerful_Beast_m8BVTuJI1wCvzTcf.json b/src/packs/beastforms/beastform_Powerful_Beast_m8BVTuJI1wCvzTcf.json index 7fa832e6..6ad91eed 100644 --- a/src/packs/beastforms/beastform_Powerful_Beast_m8BVTuJI1wCvzTcf.json +++ b/src/packs/beastforms/beastform_Powerful_Beast_m8BVTuJI1wCvzTcf.json @@ -62,31 +62,31 @@ "changes": [ { "key": "system.traits.strength.value", - "mode": 2, + "type": "add", "value": "3", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "1", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "3", "priority": null }, { "key": "system.rules.attack.damage.bonus", - "mode": 5, + "type": "override", "value": "4", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "strength", "priority": null } diff --git a/src/packs/beastforms/beastform_Stalking_Arachnid_A4TVRY0D5r9EiVwA.json b/src/packs/beastforms/beastform_Stalking_Arachnid_A4TVRY0D5r9EiVwA.json index 16520a9c..cf6f49f2 100644 --- a/src/packs/beastforms/beastform_Stalking_Arachnid_A4TVRY0D5r9EiVwA.json +++ b/src/packs/beastforms/beastform_Stalking_Arachnid_A4TVRY0D5r9EiVwA.json @@ -62,31 +62,31 @@ "changes": [ { "key": "system.traits.finesse.value", - "mode": 2, + "type": "add", "value": "1", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "2", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "1", "priority": null }, { "key": "system.rules.attack.damage.bonus", - "mode": 5, + "type": "override", "value": "1", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "finesse", "priority": null } diff --git a/src/packs/beastforms/beastform_Striking_Serpent_1XrZWGDttBAAUxR1.json b/src/packs/beastforms/beastform_Striking_Serpent_1XrZWGDttBAAUxR1.json index f78500c9..16111887 100644 --- a/src/packs/beastforms/beastform_Striking_Serpent_1XrZWGDttBAAUxR1.json +++ b/src/packs/beastforms/beastform_Striking_Serpent_1XrZWGDttBAAUxR1.json @@ -62,31 +62,31 @@ "changes": [ { "key": "system.traits.finesse.value", - "mode": 2, + "type": "add", "value": "1", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "2", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "2", "priority": null }, { "key": "system.rules.attack.damage.bonus", - "mode": 5, + "type": "override", "value": "4", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "finesse", "priority": null } diff --git a/src/packs/beastforms/beastform_Terrible_Lizard_5BABxRe2XVrYTj8N.json b/src/packs/beastforms/beastform_Terrible_Lizard_5BABxRe2XVrYTj8N.json index 49818b74..e9993526 100644 --- a/src/packs/beastforms/beastform_Terrible_Lizard_5BABxRe2XVrYTj8N.json +++ b/src/packs/beastforms/beastform_Terrible_Lizard_5BABxRe2XVrYTj8N.json @@ -65,31 +65,31 @@ "changes": [ { "key": "system.traits.strength.value", - "mode": 2, + "type": "add", "value": "3", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "2", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "4", "priority": null }, { "key": "system.rules.attack.damage.bonus", - "mode": 5, + "type": "override", "value": "10", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "strength", "priority": null } diff --git a/src/packs/beastforms/beastform_Winged_Beast_mZ4Wlqtss2FlNNvL.json b/src/packs/beastforms/beastform_Winged_Beast_mZ4Wlqtss2FlNNvL.json index 4ca44471..ccb67283 100644 --- a/src/packs/beastforms/beastform_Winged_Beast_mZ4Wlqtss2FlNNvL.json +++ b/src/packs/beastforms/beastform_Winged_Beast_mZ4Wlqtss2FlNNvL.json @@ -62,31 +62,31 @@ "changes": [ { "key": "system.traits.finesse.value", - "mode": 2, + "type": "add", "value": "1", "priority": null }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "3", "priority": null }, { "key": "system.rules.attack.damage.diceIndex", - "mode": 5, + "type": "override", "value": "0", "priority": null }, { "key": "system.rules.attack.damage.bonus", - "mode": 5, + "type": "override", "value": "2", "priority": null }, { "key": "system.rules.attack.roll.trait", - "mode": 5, + "type": "override", "value": "finesse", "priority": null } diff --git a/src/packs/beastforms/feature_Armored_Shell_nDQZdIF2epKlhauX.json b/src/packs/beastforms/feature_Armored_Shell_nDQZdIF2epKlhauX.json index 7aaefef8..395a1d7d 100644 --- a/src/packs/beastforms/feature_Armored_Shell_nDQZdIF2epKlhauX.json +++ b/src/packs/beastforms/feature_Armored_Shell_nDQZdIF2epKlhauX.json @@ -60,7 +60,7 @@ "changes": [ { "key": "system.resistance.physical.resistance", - "mode": 5, + "type": "override", "value": "1", "priority": null } @@ -98,7 +98,7 @@ "changes": [ { "key": "system.resistance.physical.reduction", - "mode": 2, + "type": "add", "value": "@system.armorScore", "priority": 21 } diff --git a/src/packs/beastforms/feature_Hollow_Bones_xVgmXhj2YgeqS1KK.json b/src/packs/beastforms/feature_Hollow_Bones_xVgmXhj2YgeqS1KK.json index d047a501..23b2317f 100644 --- a/src/packs/beastforms/feature_Hollow_Bones_xVgmXhj2YgeqS1KK.json +++ b/src/packs/beastforms/feature_Hollow_Bones_xVgmXhj2YgeqS1KK.json @@ -25,13 +25,13 @@ "changes": [ { "key": "system.damageThresholds.major", - "mode": 2, + "type": "add", "value": "-2", "priority": null }, { "key": "system.damageThresholds.severe", - "mode": 2, + "type": "add", "value": "-2", "priority": null } diff --git a/src/packs/beastforms/feature_Physical_Defense_StabkQ3BzWRZa8Tz.json b/src/packs/beastforms/feature_Physical_Defense_StabkQ3BzWRZa8Tz.json index f4c86b8c..6edc64da 100644 --- a/src/packs/beastforms/feature_Physical_Defense_StabkQ3BzWRZa8Tz.json +++ b/src/packs/beastforms/feature_Physical_Defense_StabkQ3BzWRZa8Tz.json @@ -25,13 +25,13 @@ "changes": [ { "key": "system.damageThresholds.major", - "mode": 2, + "type": "add", "value": "3", "priority": null }, { "key": "system.damageThresholds.severe", - "mode": 2, + "type": "add", "value": "3", "priority": null } diff --git a/src/packs/beastforms/feature_Rampage_8upqfcZvi7b5hRLE.json b/src/packs/beastforms/feature_Rampage_8upqfcZvi7b5hRLE.json index ecc46058..8c86458b 100644 --- a/src/packs/beastforms/feature_Rampage_8upqfcZvi7b5hRLE.json +++ b/src/packs/beastforms/feature_Rampage_8upqfcZvi7b5hRLE.json @@ -59,21 +59,15 @@ "_id": "A7l4JEBC1FFQajsN", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.proficiency", + "type": "add", + "value": "1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.proficiency", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/beastforms/feature_Takedown_0ey4kM9ssj2otHvb.json b/src/packs/beastforms/feature_Takedown_0ey4kM9ssj2otHvb.json index 531b30ea..591f4857 100644 --- a/src/packs/beastforms/feature_Takedown_0ey4kM9ssj2otHvb.json +++ b/src/packs/beastforms/feature_Takedown_0ey4kM9ssj2otHvb.json @@ -108,7 +108,7 @@ "changes": [ { "key": "system.proficiency", - "mode": 2, + "type": "add", "value": "2", "priority": null } diff --git a/src/packs/beastforms/feature_Thick_Hide_ZYbdXaWVj2zdcmaK.json b/src/packs/beastforms/feature_Thick_Hide_ZYbdXaWVj2zdcmaK.json index 6eba9342..932749bf 100644 --- a/src/packs/beastforms/feature_Thick_Hide_ZYbdXaWVj2zdcmaK.json +++ b/src/packs/beastforms/feature_Thick_Hide_ZYbdXaWVj2zdcmaK.json @@ -25,13 +25,13 @@ "changes": [ { "key": "system.damageThresholds.major", - "mode": 2, + "type": "add", "value": "2", "priority": null }, { "key": "system.damageThresholds.severe", - "mode": 2, + "type": "add", "value": "2", "priority": null } diff --git a/src/packs/beastforms/feature_Undaunted_ODudjX88Te4vDP57.json b/src/packs/beastforms/feature_Undaunted_ODudjX88Te4vDP57.json index 092efe51..d13c8a1c 100644 --- a/src/packs/beastforms/feature_Undaunted_ODudjX88Te4vDP57.json +++ b/src/packs/beastforms/feature_Undaunted_ODudjX88Te4vDP57.json @@ -25,13 +25,13 @@ "changes": [ { "key": "system.damageThresholds.major", - "mode": 2, + "type": "add", "value": "2", "priority": null }, { "key": "system.damageThresholds.severe", - "mode": 2, + "type": "add", "value": "2", "priority": null } diff --git a/src/packs/beastforms/feature_Vicious_Maul_jYUBi7yLHap5ljpa.json b/src/packs/beastforms/feature_Vicious_Maul_jYUBi7yLHap5ljpa.json index a3494ed0..f9ec4933 100644 --- a/src/packs/beastforms/feature_Vicious_Maul_jYUBi7yLHap5ljpa.json +++ b/src/packs/beastforms/feature_Vicious_Maul_jYUBi7yLHap5ljpa.json @@ -10,7 +10,7 @@ "type": "damage", "_id": "Cc53vyYz5ggKdIbx", "systemPath": "actions", - "description": "

When you succeed on an attack against a target within Melee range, you can spend a Hope to clamp that opponent in your jaws, making them temporarily Restrained and Vulnerable.

", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -23,7 +23,7 @@ ], "uses": { "value": null, - "max": null, + "max": "", "recovery": null }, "damage": { diff --git a/src/packs/classes/feature_Combat_Training_eoSmuAJmgHUyULtp.json b/src/packs/classes/feature_Combat_Training_eoSmuAJmgHUyULtp.json index d28f360c..34f242ed 100644 --- a/src/packs/classes/feature_Combat_Training_eoSmuAJmgHUyULtp.json +++ b/src/packs/classes/feature_Combat_Training_eoSmuAJmgHUyULtp.json @@ -21,29 +21,23 @@ "name": "Combat Training", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.physical.bonus", + "type": "add", + "value": "@system.levelData.level.current", + "priority": null + }, + { + "key": "system.rules.burden.ignore", + "type": "override", + "value": "1", + "priority": null + } + ] }, "_id": "Y7sTM0tw0VpgU6pC", "img": "icons/skills/melee/spear-tips-quintuple-orange.webp", - "changes": [ - { - "key": "system.bonuses.damage.physical.bonus", - "mode": 2, - "value": "@system.levelData.level.current", - "priority": null - }, - { - "key": "system.rules.burden.ignore", - "mode": 5, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/classes/feature_Make_a_Scene_N9E5skDDK2VgvohR.json b/src/packs/classes/feature_Make_a_Scene_N9E5skDDK2VgvohR.json index 5f28c048..3ae763da 100644 --- a/src/packs/classes/feature_Make_a_Scene_N9E5skDDK2VgvohR.json +++ b/src/packs/classes/feature_Make_a_Scene_N9E5skDDK2VgvohR.json @@ -59,12 +59,6 @@ "_id": "8G9zDv1gac6dEHmS", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.difficulty", diff --git a/src/packs/classes/feature_No_Mercy_njj2C3tMDeCHHOoh.json b/src/packs/classes/feature_No_Mercy_njj2C3tMDeCHHOoh.json index 5b770e5d..184085bf 100644 --- a/src/packs/classes/feature_No_Mercy_njj2C3tMDeCHHOoh.json +++ b/src/packs/classes/feature_No_Mercy_njj2C3tMDeCHHOoh.json @@ -62,12 +62,6 @@ "_id": "XK4cCcz9sRGDJr0q", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.bonuses.roll.attack.bonus", diff --git a/src/packs/classes/feature_Rally_PydiMnNCKpd44SGS.json b/src/packs/classes/feature_Rally_PydiMnNCKpd44SGS.json index e2a0b5bb..9ecb926b 100644 --- a/src/packs/classes/feature_Rally_PydiMnNCKpd44SGS.json +++ b/src/packs/classes/feature_Rally_PydiMnNCKpd44SGS.json @@ -52,21 +52,15 @@ "_id": "FrSJH9vzDHkFGYQL", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.rally", + "type": "add", + "value": "6 + min((floor(@system.levelData.level.current / 5)*2), 2)", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.rally", - "mode": 2, - "value": "6 + min((floor(@system.levelData.level.current / 5)*2), 2)", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/classes/feature_Ranger_s_Focus_ncLx2P8BOUtrAD38.json b/src/packs/classes/feature_Ranger_s_Focus_ncLx2P8BOUtrAD38.json index b744c4c5..b82954a5 100644 --- a/src/packs/classes/feature_Ranger_s_Focus_ncLx2P8BOUtrAD38.json +++ b/src/packs/classes/feature_Ranger_s_Focus_ncLx2P8BOUtrAD38.json @@ -60,14 +60,8 @@ "_id": "SXi2dQWqpwY9fap4", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/classes/feature_Rogue_s_Dodge_hVaaPIjxoextIgSL.json b/src/packs/classes/feature_Rogue_s_Dodge_hVaaPIjxoextIgSL.json index b886b079..4a7e0cac 100644 --- a/src/packs/classes/feature_Rogue_s_Dodge_hVaaPIjxoextIgSL.json +++ b/src/packs/classes/feature_Rogue_s_Dodge_hVaaPIjxoextIgSL.json @@ -60,12 +60,6 @@ "_id": "hhVjBro2osGDTT5g", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "any", - "range": "self" - }, "changes": [ { "key": "system.evasion", diff --git a/src/packs/classes/feature_Sneak_Attack_5QqpEwmwkPfZHpMW.json b/src/packs/classes/feature_Sneak_Attack_5QqpEwmwkPfZHpMW.json index 505a96cb..83db7d06 100644 --- a/src/packs/classes/feature_Sneak_Attack_5QqpEwmwkPfZHpMW.json +++ b/src/packs/classes/feature_Sneak_Attack_5QqpEwmwkPfZHpMW.json @@ -25,27 +25,21 @@ "_id": "380jFzw756qSy5ae", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.physical.dice", + "type": "add", + "value": "@tierd6", + "priority": null + }, + { + "key": "system.bonuses.damage.magical.dice", + "type": "add", + "value": "@tierd6", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.damage.physical.dice", - "mode": 2, - "value": "@tierd6", - "priority": null - }, - { - "key": "system.bonuses.damage.magical.dice", - "mode": 2, - "value": "@tierd6", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/classes/feature_Unstoppable_PnD2UCgzIlwX6cY3.json b/src/packs/classes/feature_Unstoppable_PnD2UCgzIlwX6cY3.json index 9c9ecf61..5477f2c4 100644 --- a/src/packs/classes/feature_Unstoppable_PnD2UCgzIlwX6cY3.json +++ b/src/packs/classes/feature_Unstoppable_PnD2UCgzIlwX6cY3.json @@ -62,45 +62,39 @@ "_id": "xzQtFSuDS48kUdAZ", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.physical.bonus", + "type": "add", + "value": "ORIGIN.@item.resource.value", + "priority": null + }, + { + "key": "system.bonuses.damage.magical.bonus", + "type": "add", + "value": "ORIGIN.@item.resource.value", + "priority": null + }, + { + "key": "system.rules.damageReduction.reduceSeverity.physical", + "type": "add", + "value": "1", + "priority": null + }, + { + "key": "system.rules.conditionImmunities.vulnerable", + "type": "override", + "value": "1", + "priority": null + }, + { + "key": "system.rules.conditionImmunities.restrained", + "type": "override", + "value": "1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.damage.physical.bonus", - "mode": 2, - "value": "ORIGIN.@item.resource.value", - "priority": null - }, - { - "key": "system.bonuses.damage.magical.bonus", - "mode": 2, - "value": "ORIGIN.@item.resource.value", - "priority": null - }, - { - "key": "system.rules.damageReduction.reduceSeverity.physical", - "mode": 2, - "value": "1", - "priority": null - }, - { - "key": "system.rules.conditionImmunities.vulnerable", - "mode": 5, - "value": "1", - "priority": null - }, - { - "key": "system.rules.conditionImmunities.restrained", - "mode": 5, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/communities/feature_Lightfoot_TQ1AIQjndC4mYmmU.json b/src/packs/communities/feature_Lightfoot_TQ1AIQjndC4mYmmU.json index a18b4689..84134bbb 100644 --- a/src/packs/communities/feature_Lightfoot_TQ1AIQjndC4mYmmU.json +++ b/src/packs/communities/feature_Lightfoot_TQ1AIQjndC4mYmmU.json @@ -24,21 +24,15 @@ "_id": "4my9X5XC3uwDSx7B", "img": "icons/magic/control/debuff-energy-snare-blue.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.advantageSources", + "type": "add", + "value": "Move without being heard.", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.advantageSources", - "mode": 2, - "value": "Move without being heard.", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/communities/feature_Low_Light_Living_aMla3xQuCHEwORGD.json b/src/packs/communities/feature_Low_Light_Living_aMla3xQuCHEwORGD.json index c95d9132..b02ef4d6 100644 --- a/src/packs/communities/feature_Low_Light_Living_aMla3xQuCHEwORGD.json +++ b/src/packs/communities/feature_Low_Light_Living_aMla3xQuCHEwORGD.json @@ -24,12 +24,6 @@ "_id": "pCp32u7UwqxCI4WW", "img": "icons/environment/settlement/temple-night.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.advantageSources", diff --git a/src/packs/communities/feature_Privilege_C7NR6qRatawZusmg.json b/src/packs/communities/feature_Privilege_C7NR6qRatawZusmg.json index 171f4d50..85ef1ec3 100644 --- a/src/packs/communities/feature_Privilege_C7NR6qRatawZusmg.json +++ b/src/packs/communities/feature_Privilege_C7NR6qRatawZusmg.json @@ -24,33 +24,27 @@ "_id": "xgtjykfgvg142urA", "img": "icons/commodities/currency/coins-plain-stack-gold.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.advantageSources", + "type": "add", + "value": "Consort with nobles", + "priority": null + }, + { + "key": "system.advantageSources", + "type": "add", + "value": "Negotiate prices", + "priority": null + }, + { + "key": "system.advantageSources", + "type": "add", + "value": "Leverage your reputation to get what you want", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.advantageSources", - "mode": 2, - "value": "Consort with nobles", - "priority": null - }, - { - "key": "system.advantageSources", - "mode": 2, - "value": "Negotiate prices", - "priority": null - }, - { - "key": "system.advantageSources", - "mode": 2, - "value": "Leverage your reputation to get what you want", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/communities/feature_Scoundrel_ZmEuBdL0JrvuA8le.json b/src/packs/communities/feature_Scoundrel_ZmEuBdL0JrvuA8le.json index d91a7638..7f7a34ae 100644 --- a/src/packs/communities/feature_Scoundrel_ZmEuBdL0JrvuA8le.json +++ b/src/packs/communities/feature_Scoundrel_ZmEuBdL0JrvuA8le.json @@ -24,33 +24,27 @@ "_id": "snkYmZ22Q8HHLY9M", "img": "icons/equipment/head/hood-cloth-teal-gold.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.advantageSources", + "type": "add", + "value": "Negotiate with criminals", + "priority": null + }, + { + "key": "system.advantageSources", + "type": "add", + "value": "Detect lies", + "priority": null + }, + { + "key": "system.advantageSources", + "type": "add", + "value": "Find a safe place to hide", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.advantageSources", - "mode": 2, - "value": "Negotiate with criminals", - "priority": null - }, - { - "key": "system.advantageSources", - "mode": 2, - "value": "Detect lies", - "priority": null - }, - { - "key": "system.advantageSources", - "mode": 2, - "value": "Find a safe place to hide", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/communities/feature_Steady_DYmmr5CknLtHnwuj.json b/src/packs/communities/feature_Steady_DYmmr5CknLtHnwuj.json index 497854ac..292fd773 100644 --- a/src/packs/communities/feature_Steady_DYmmr5CknLtHnwuj.json +++ b/src/packs/communities/feature_Steady_DYmmr5CknLtHnwuj.json @@ -24,33 +24,27 @@ "_id": "QDf9LD8Mhd0Cw0CB", "img": "icons/equipment/feet/boots-collared-simple-leather.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.advantageSources", + "type": "add", + "value": "Traverse dangerous cliffs and ledges", + "priority": null + }, + { + "key": "system.advantageSources", + "type": "add", + "value": "Navigate harsh environment", + "priority": null + }, + { + "key": "system.advantageSources", + "type": "add", + "value": "Use your survival knowledge", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.advantageSources", - "mode": 2, - "value": "Traverse dangerous cliffs and ledges", - "priority": null - }, - { - "key": "system.advantageSources", - "mode": 2, - "value": "Navigate harsh environment", - "priority": null - }, - { - "key": "system.advantageSources", - "mode": 2, - "value": "Use your survival knowledge", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/communities/feature_Well_Read_JBZJmywisJg5X3tH.json b/src/packs/communities/feature_Well_Read_JBZJmywisJg5X3tH.json index dd40b33b..28d4c962 100644 --- a/src/packs/communities/feature_Well_Read_JBZJmywisJg5X3tH.json +++ b/src/packs/communities/feature_Well_Read_JBZJmywisJg5X3tH.json @@ -24,21 +24,15 @@ "_id": "RwhxYOAAKKlYZiz0", "img": "icons/sundries/books/book-open-brown.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.advantageSources", + "type": "add", + "value": "History, culture, or politics of a prominent person or place", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.advantageSources", - "mode": 2, - "value": "History, culture, or politics of a prominent person or place", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Arcana_Touched_5PvMQKCjrgSxzstn.json b/src/packs/domains/domainCard_Arcana_Touched_5PvMQKCjrgSxzstn.json index 556d5074..361558d3 100644 --- a/src/packs/domains/domainCard_Arcana_Touched_5PvMQKCjrgSxzstn.json +++ b/src/packs/domains/domainCard_Arcana_Touched_5PvMQKCjrgSxzstn.json @@ -65,23 +65,17 @@ "name": "Arcana-Touched", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.spellcast.bonus", + "type": "add", + "value": "+1", + "priority": null + } + ] }, "_id": "vTW98Xha0HP8ITrs", "img": "systems/daggerheart/assets/icons/domains/domain-card/arcana.png", - "changes": [ - { - "key": "system.bonuses.roll.spellcast.bonus", - "mode": 2, - "value": "+1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Battle_Cry_Ef1JsUG50LIoKx2F.json b/src/packs/domains/domainCard_Battle_Cry_Ef1JsUG50LIoKx2F.json index 1fde286d..000437b7 100644 --- a/src/packs/domains/domainCard_Battle_Cry_Ef1JsUG50LIoKx2F.json +++ b/src/packs/domains/domainCard_Battle_Cry_Ef1JsUG50LIoKx2F.json @@ -127,12 +127,6 @@ "_id": "s7ma4TNgAvt0ZgEW", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.advantageSources", diff --git a/src/packs/domains/domainCard_Blade_Touched_Gb5bqpFSBiuBxUix.json b/src/packs/domains/domainCard_Blade_Touched_Gb5bqpFSBiuBxUix.json index ebb95570..ba8c56a9 100644 --- a/src/packs/domains/domainCard_Blade_Touched_Gb5bqpFSBiuBxUix.json +++ b/src/packs/domains/domainCard_Blade_Touched_Gb5bqpFSBiuBxUix.json @@ -24,29 +24,23 @@ "name": "Blade-Touched", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.attack.bonus", + "type": "add", + "value": "2", + "priority": null + }, + { + "key": "system.damageThresholds.severe", + "type": "add", + "value": "4", + "priority": null + } + ] }, "_id": "fBpLkCWGsB8MbymR", "img": "icons/skills/melee/strike-sword-slashing-red.webp", - "changes": [ - { - "key": "system.bonuses.roll.attack.bonus", - "mode": 2, - "value": "2", - "priority": null - }, - { - "key": "system.damageThresholds.severe", - "mode": 2, - "value": "4", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Body_Basher_aQz8jKkCd8M9aKMA.json b/src/packs/domains/domainCard_Body_Basher_aQz8jKkCd8M9aKMA.json index f0d4c988..fc49b640 100644 --- a/src/packs/domains/domainCard_Body_Basher_aQz8jKkCd8M9aKMA.json +++ b/src/packs/domains/domainCard_Body_Basher_aQz8jKkCd8M9aKMA.json @@ -31,22 +31,22 @@ "type": "withinRange", "target": "hostile", "range": "melee" - } - }, - "changes": [ - { - "key": "system.bonuses.damage.primaryWeapon.bonus", - "mode": 2, - "value": "@system.traits.strength.value", - "priority": 21 }, - { - "key": "system.bonuses.damage.secondaryWeapon.bonus", - "mode": 2, - "value": "@system.traits.strength.value", - "priority": 21 - } - ], + "changes": [ + { + "key": "system.bonuses.damage.primaryWeapon.bonus", + "type": "add", + "value": "@system.traits.strength.value", + "priority": 21 + }, + { + "key": "system.bonuses.damage.secondaryWeapon.bonus", + "type": "add", + "value": "@system.traits.strength.value", + "priority": 21 + } + ] + }, "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Bold_Presence_tdsL00yTSLNgZWs6.json b/src/packs/domains/domainCard_Bold_Presence_tdsL00yTSLNgZWs6.json index aaf070fc..3d7a26e2 100644 --- a/src/packs/domains/domainCard_Bold_Presence_tdsL00yTSLNgZWs6.json +++ b/src/packs/domains/domainCard_Bold_Presence_tdsL00yTSLNgZWs6.json @@ -85,21 +85,15 @@ "_id": "2XEYhuAcRGTtqvED", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.traits.presence.value", + "type": "add", + "value": "@system.traits.strength.value", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.traits.presence.value", - "mode": 2, - "value": "@system.traits.strength.value", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Bolt_Beacon_BNevJyGk7hmN7XOY.json b/src/packs/domains/domainCard_Bolt_Beacon_BNevJyGk7hmN7XOY.json index df7d36a4..ce01f6b0 100644 --- a/src/packs/domains/domainCard_Bolt_Beacon_BNevJyGk7hmN7XOY.json +++ b/src/packs/domains/domainCard_Bolt_Beacon_BNevJyGk7hmN7XOY.json @@ -114,12 +114,6 @@ "_id": "veZpnhnF8NRRhKG4", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary" diff --git a/src/packs/domains/domainCard_Bone_Touched_ON5bvnoQBy0SYc9Y.json b/src/packs/domains/domainCard_Bone_Touched_ON5bvnoQBy0SYc9Y.json index 8880bb07..3fc45037 100644 --- a/src/packs/domains/domainCard_Bone_Touched_ON5bvnoQBy0SYc9Y.json +++ b/src/packs/domains/domainCard_Bone_Touched_ON5bvnoQBy0SYc9Y.json @@ -57,23 +57,17 @@ "name": "Bone Touched", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.traits.agility.value", + "type": "add", + "value": "1", + "priority": null + } + ] }, "_id": "P6hYkkI64FqIcMoP", "img": "icons/magic/death/bones-crossed-orange.webp", - "changes": [ - { - "key": "system.traits.agility.value", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Book_of_Ava_YtZzYBtR0yLPPA93.json b/src/packs/domains/domainCard_Book_of_Ava_YtZzYBtR0yLPPA93.json index fa247c89..e218e771 100644 --- a/src/packs/domains/domainCard_Book_of_Ava_YtZzYBtR0yLPPA93.json +++ b/src/packs/domains/domainCard_Book_of_Ava_YtZzYBtR0yLPPA93.json @@ -255,12 +255,6 @@ "_id": "ptYT10JZ2WJHvFMd", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "type": "armor", diff --git a/src/packs/domains/domainCard_Book_of_Illiat_df4iRqQzRntrF6Qw.json b/src/packs/domains/domainCard_Book_of_Illiat_df4iRqQzRntrF6Qw.json index b34fa000..e7b4dd8b 100644 --- a/src/packs/domains/domainCard_Book_of_Illiat_df4iRqQzRntrF6Qw.json +++ b/src/packs/domains/domainCard_Book_of_Illiat_df4iRqQzRntrF6Qw.json @@ -172,12 +172,6 @@ "_id": "zAEaETYSOE2fmcyB", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "shortRest" @@ -218,12 +212,6 @@ "_id": "gfZTHSgwYSDKsePW", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/domains/domainCard_Book_of_Norai_WtwSWXTRZa7QVvmo.json b/src/packs/domains/domainCard_Book_of_Norai_WtwSWXTRZa7QVvmo.json index 78028bab..31d869be 100644 --- a/src/packs/domains/domainCard_Book_of_Norai_WtwSWXTRZa7QVvmo.json +++ b/src/packs/domains/domainCard_Book_of_Norai_WtwSWXTRZa7QVvmo.json @@ -243,12 +243,6 @@ "_id": "iPnT02apql16Zhjf", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary" diff --git a/src/packs/domains/domainCard_Book_of_Ronin_SZMNR3uGNinJcN4N.json b/src/packs/domains/domainCard_Book_of_Ronin_SZMNR3uGNinJcN4N.json index 88bb759d..ad01a99a 100644 --- a/src/packs/domains/domainCard_Book_of_Ronin_SZMNR3uGNinJcN4N.json +++ b/src/packs/domains/domainCard_Book_of_Ronin_SZMNR3uGNinJcN4N.json @@ -131,14 +131,8 @@ "_id": "ntQfpTcXyEL76vCK", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, @@ -167,14 +161,8 @@ "_id": "y44r3c91m06WKSiq", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Book_of_Sitil_eq8VNqYMRHhF9xw9.json b/src/packs/domains/domainCard_Book_of_Sitil_eq8VNqYMRHhF9xw9.json index 16b7a63b..d3fe6b1a 100644 --- a/src/packs/domains/domainCard_Book_of_Sitil_eq8VNqYMRHhF9xw9.json +++ b/src/packs/domains/domainCard_Book_of_Sitil_eq8VNqYMRHhF9xw9.json @@ -136,14 +136,8 @@ "_id": "klUaU5KeQCu7KCBI", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, @@ -172,14 +166,8 @@ "_id": "wnrHSvvB6pydTVcC", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Book_of_Vyola_VOIgm2j2Ijszwc5m.json b/src/packs/domains/domainCard_Book_of_Vyola_VOIgm2j2Ijszwc5m.json index 522a8f7c..e36936f5 100644 --- a/src/packs/domains/domainCard_Book_of_Vyola_VOIgm2j2Ijszwc5m.json +++ b/src/packs/domains/domainCard_Book_of_Vyola_VOIgm2j2Ijszwc5m.json @@ -109,14 +109,8 @@ "_id": "6PPapwuwgKy23oHg", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Book_of_Yarrow_J1ovx2FpNDvPq1o6.json b/src/packs/domains/domainCard_Book_of_Yarrow_J1ovx2FpNDvPq1o6.json index 45fbc77f..4bcdc349 100644 --- a/src/packs/domains/domainCard_Book_of_Yarrow_J1ovx2FpNDvPq1o6.json +++ b/src/packs/domains/domainCard_Book_of_Yarrow_J1ovx2FpNDvPq1o6.json @@ -118,12 +118,6 @@ "_id": "HWJYhSegVLeAa3dE", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.resistance.magical.immunity", diff --git a/src/packs/domains/domainCard_Brace_QXs4vssSqNGQu5b8.json b/src/packs/domains/domainCard_Brace_QXs4vssSqNGQu5b8.json index bc2e59e5..321de80a 100644 --- a/src/packs/domains/domainCard_Brace_QXs4vssSqNGQu5b8.json +++ b/src/packs/domains/domainCard_Brace_QXs4vssSqNGQu5b8.json @@ -23,23 +23,17 @@ "name": "Brace", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.rules.damageReduction.maxArmorMarked.stressExtra", + "type": "add", + "value": "1", + "priority": null + } + ] }, "_id": "xSjqLOHfi5lImDHS", "img": "icons/magic/defensive/shield-barrier-blue.webp", - "changes": [ - { - "key": "system.rules.damageReduction.maxArmorMarked.stressExtra", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Breaking_Blow_8UANBgSdhMZ0sqfO.json b/src/packs/domains/domainCard_Breaking_Blow_8UANBgSdhMZ0sqfO.json index 24b3d661..1e11b8a9 100644 --- a/src/packs/domains/domainCard_Breaking_Blow_8UANBgSdhMZ0sqfO.json +++ b/src/packs/domains/domainCard_Breaking_Blow_8UANBgSdhMZ0sqfO.json @@ -65,14 +65,8 @@ "_id": "ETIeXRAib3DFBHpX", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Chokehold_R5GYUalYXLLFRlNl.json b/src/packs/domains/domainCard_Chokehold_R5GYUalYXLLFRlNl.json index 73424902..b9d576e3 100644 --- a/src/packs/domains/domainCard_Chokehold_R5GYUalYXLLFRlNl.json +++ b/src/packs/domains/domainCard_Chokehold_R5GYUalYXLLFRlNl.json @@ -96,14 +96,8 @@ "_id": "yzGem7IfViJdAv1H", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Cinder_Grasp_5EP2Lgf7ojfrc0Is.json b/src/packs/domains/domainCard_Cinder_Grasp_5EP2Lgf7ojfrc0Is.json index e3df986e..384e4834 100644 --- a/src/packs/domains/domainCard_Cinder_Grasp_5EP2Lgf7ojfrc0Is.json +++ b/src/packs/domains/domainCard_Cinder_Grasp_5EP2Lgf7ojfrc0Is.json @@ -162,12 +162,6 @@ "_id": "HNKkaWi507whJuYN", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary" diff --git a/src/packs/domains/domainCard_Cloaking_Blast_Zhw7PtK8nMPlsOqD.json b/src/packs/domains/domainCard_Cloaking_Blast_Zhw7PtK8nMPlsOqD.json index a2a06889..143e7e17 100644 --- a/src/packs/domains/domainCard_Cloaking_Blast_Zhw7PtK8nMPlsOqD.json +++ b/src/packs/domains/domainCard_Cloaking_Blast_Zhw7PtK8nMPlsOqD.json @@ -65,12 +65,6 @@ "_id": "twCBqXytmRkMz0kV", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/domains/domainCard_Codex_Touched_7Pu83ABdMukTxu3e.json b/src/packs/domains/domainCard_Codex_Touched_7Pu83ABdMukTxu3e.json index 6443ed6a..3eb4da35 100644 --- a/src/packs/domains/domainCard_Codex_Touched_7Pu83ABdMukTxu3e.json +++ b/src/packs/domains/domainCard_Codex_Touched_7Pu83ABdMukTxu3e.json @@ -86,21 +86,15 @@ "_id": "oWs00mBY3onxGjF9", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.spellcast.bonus", + "type": "add", + "value": "@system.proficiency", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.roll.spellcast.bonus", - "mode": 2, - "value": "@system.proficiency", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json b/src/packs/domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json index d9e8da6d..7b0b7fb8 100644 --- a/src/packs/domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json +++ b/src/packs/domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json @@ -208,12 +208,6 @@ "_id": "dImnF8ZT2rVybiIP", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.rules.damageReduction.reduceSeverity.magical", diff --git a/src/packs/domains/domainCard_Conjured_Steeds_Jkp6cMDiHHaBZQRS.json b/src/packs/domains/domainCard_Conjured_Steeds_Jkp6cMDiHHaBZQRS.json index 31ad8612..0b581925 100644 --- a/src/packs/domains/domainCard_Conjured_Steeds_Jkp6cMDiHHaBZQRS.json +++ b/src/packs/domains/domainCard_Conjured_Steeds_Jkp6cMDiHHaBZQRS.json @@ -63,33 +63,27 @@ "_id": "cNSlGBGPKKBNnlH8", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.attack.bonus", + "type": "add", + "value": "-2", + "priority": null + }, + { + "key": "system.bonuses.damage.magical.dice", + "type": "add", + "value": "+2", + "priority": null + }, + { + "key": "system.bonuses.damage.physical.bonus", + "type": "add", + "value": "+2", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.roll.attack.bonus", - "mode": 2, - "value": "-2", - "priority": null - }, - { - "key": "system.bonuses.damage.magical.dice", - "mode": 2, - "value": "+2", - "priority": null - }, - { - "key": "system.bonuses.damage.physical.bonus", - "mode": 2, - "value": "+2", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Corrosive_Projectile_qJaSNTuDfbPVr8Lb.json b/src/packs/domains/domainCard_Corrosive_Projectile_qJaSNTuDfbPVr8Lb.json index 6a039bbf..203e4d06 100644 --- a/src/packs/domains/domainCard_Corrosive_Projectile_qJaSNTuDfbPVr8Lb.json +++ b/src/packs/domains/domainCard_Corrosive_Projectile_qJaSNTuDfbPVr8Lb.json @@ -134,12 +134,6 @@ "_id": "zB95bjSSdVlApQnR", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.difficulty", diff --git a/src/packs/domains/domainCard_Cruel_Precision_bap1eCWryPNowbyo.json b/src/packs/domains/domainCard_Cruel_Precision_bap1eCWryPNowbyo.json index 9e5c414e..fbe1d7c7 100644 --- a/src/packs/domains/domainCard_Cruel_Precision_bap1eCWryPNowbyo.json +++ b/src/packs/domains/domainCard_Cruel_Precision_bap1eCWryPNowbyo.json @@ -23,29 +23,23 @@ "name": "Cruel Precision (Agi)", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.primaryWeapon.bonus", + "type": "add", + "value": "@system.traits.agility.value", + "priority": 21 + }, + { + "key": "system.bonuses.damage.secondaryWeapon.bonus", + "type": "add", + "value": "@system.traits.agility.value", + "priority": 21 + } + ] }, "_id": "t5D10AL2W9LMGsX4", "img": "icons/skills/melee/strike-dagger-arcane-pink.webp", - "changes": [ - { - "key": "system.bonuses.damage.primaryWeapon.bonus", - "mode": 2, - "value": "@system.traits.agility.value", - "priority": 21 - }, - { - "key": "system.bonuses.damage.secondaryWeapon.bonus", - "mode": 2, - "value": "@system.traits.agility.value", - "priority": 21 - } - ], "disabled": true, "duration": { "startTime": null, @@ -72,29 +66,23 @@ "name": "Cruel Precision (Fin)", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.primaryWeapon.bonus", + "type": "add", + "value": "@system.traits.finesse.value", + "priority": null + }, + { + "key": "system.bonuses.damage.secondaryWeapon.bonus", + "type": "add", + "value": "@system.traits.finesse.value", + "priority": null + } + ] }, "_id": "Ha7c4XgmN5zGMSHG", "img": "icons/skills/melee/strike-dagger-arcane-pink.webp", - "changes": [ - { - "key": "system.bonuses.damage.primaryWeapon.bonus", - "mode": 2, - "value": "@system.traits.finesse.value", - "priority": null - }, - { - "key": "system.bonuses.damage.secondaryWeapon.bonus", - "mode": 2, - "value": "@system.traits.finesse.value", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Deadly_Focus_xxZOXC4tiZQ6kg1e.json b/src/packs/domains/domainCard_Deadly_Focus_xxZOXC4tiZQ6kg1e.json index c559dfd9..e794241f 100644 --- a/src/packs/domains/domainCard_Deadly_Focus_xxZOXC4tiZQ6kg1e.json +++ b/src/packs/domains/domainCard_Deadly_Focus_xxZOXC4tiZQ6kg1e.json @@ -57,21 +57,15 @@ "_id": "TFWiAUDCfGaax5MU", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.proficiency", + "type": "add", + "value": "1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.proficiency", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Death_Grip_x0FVGE1YbfXalJiw.json b/src/packs/domains/domainCard_Death_Grip_x0FVGE1YbfXalJiw.json index d33b6bab..a2aa67fd 100644 --- a/src/packs/domains/domainCard_Death_Grip_x0FVGE1YbfXalJiw.json +++ b/src/packs/domains/domainCard_Death_Grip_x0FVGE1YbfXalJiw.json @@ -244,12 +244,6 @@ "_id": "wMXCIQxqLS9IbsEK", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [] }, "disabled": false, @@ -282,12 +276,6 @@ "_id": "bZ0xgZ6TT2099OYp", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [] }, "disabled": false, @@ -320,12 +308,6 @@ "_id": "Oe95zWWY41nH8y5l", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [] }, "disabled": false, diff --git a/src/packs/domains/domainCard_Deft_Deceiver_38znCh6kHTkaPwYi.json b/src/packs/domains/domainCard_Deft_Deceiver_38znCh6kHTkaPwYi.json index dd9c82a2..f8696f52 100644 --- a/src/packs/domains/domainCard_Deft_Deceiver_38znCh6kHTkaPwYi.json +++ b/src/packs/domains/domainCard_Deft_Deceiver_38znCh6kHTkaPwYi.json @@ -63,21 +63,15 @@ "_id": "qtHDKXJ1pH8Cu7by", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.advantageSources", + "type": "add", + "value": "Deceive or trick someone into believing a lie you told them", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.advantageSources", - "mode": 2, - "value": "Deceive or trick someone into believing a lie you told them", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Deft_Maneuvers_dc4rAXlv95srZUct.json b/src/packs/domains/domainCard_Deft_Maneuvers_dc4rAXlv95srZUct.json index 2b63b534..671d1233 100644 --- a/src/packs/domains/domainCard_Deft_Maneuvers_dc4rAXlv95srZUct.json +++ b/src/packs/domains/domainCard_Deft_Maneuvers_dc4rAXlv95srZUct.json @@ -65,21 +65,15 @@ "_id": "gEDGcbsgWY2D2nOo", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.attack.bonus", + "type": "add", + "value": "1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.roll.attack.bonus", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Earthquake_C0qLOwSSvZ6PG3Ws.json b/src/packs/domains/domainCard_Earthquake_C0qLOwSSvZ6PG3Ws.json index 0a35c95f..801278a6 100644 --- a/src/packs/domains/domainCard_Earthquake_C0qLOwSSvZ6PG3Ws.json +++ b/src/packs/domains/domainCard_Earthquake_C0qLOwSSvZ6PG3Ws.json @@ -118,12 +118,6 @@ "_id": "Z31XqmGUKWYcZdMY", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary" diff --git a/src/packs/domains/domainCard_Eclipse_62Sj67PdPFzwWVe3.json b/src/packs/domains/domainCard_Eclipse_62Sj67PdPFzwWVe3.json index e2afaf66..8db164a7 100644 --- a/src/packs/domains/domainCard_Eclipse_62Sj67PdPFzwWVe3.json +++ b/src/packs/domains/domainCard_Eclipse_62Sj67PdPFzwWVe3.json @@ -142,12 +142,6 @@ "_id": "ARMcw2FtKfaYr902", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.disadvantageSources", diff --git a/src/packs/domains/domainCard_Enrapture_a8lFiKX1o8T924ze.json b/src/packs/domains/domainCard_Enrapture_a8lFiKX1o8T924ze.json index 284682fa..5ea36d31 100644 --- a/src/packs/domains/domainCard_Enrapture_a8lFiKX1o8T924ze.json +++ b/src/packs/domains/domainCard_Enrapture_a8lFiKX1o8T924ze.json @@ -139,12 +139,6 @@ "_id": "EYG5dLImk6GkmfRd", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary" diff --git a/src/packs/domains/domainCard_Flight_54GUjNuBEy7xdzMz.json b/src/packs/domains/domainCard_Flight_54GUjNuBEy7xdzMz.json index 4d1355ee..91b4b172 100644 --- a/src/packs/domains/domainCard_Flight_54GUjNuBEy7xdzMz.json +++ b/src/packs/domains/domainCard_Flight_54GUjNuBEy7xdzMz.json @@ -119,14 +119,8 @@ "_id": "gd8crfrvMGWXLWGP", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Floating_Eye_wOQLu7nLMQ7v6Ogw.json b/src/packs/domains/domainCard_Floating_Eye_wOQLu7nLMQ7v6Ogw.json index 97e94563..c82adcdb 100644 --- a/src/packs/domains/domainCard_Floating_Eye_wOQLu7nLMQ7v6Ogw.json +++ b/src/packs/domains/domainCard_Floating_Eye_wOQLu7nLMQ7v6Ogw.json @@ -57,14 +57,8 @@ "_id": "ahKlKAc9TuGgx9Zm", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Forager_06UapZuaA5S6fAKl.json b/src/packs/domains/domainCard_Forager_06UapZuaA5S6fAKl.json index e8919d6b..00786add 100644 --- a/src/packs/domains/domainCard_Forager_06UapZuaA5S6fAKl.json +++ b/src/packs/domains/domainCard_Forager_06UapZuaA5S6fAKl.json @@ -257,21 +257,15 @@ "_id": "cTf5gEem5Gt4fLS4", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.spellcast.bonus", + "type": "add", + "value": "2", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.roll.spellcast.bonus", - "mode": 2, - "value": "2", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Force_of_Nature_LzVpMkD5I4QeaIHf.json b/src/packs/domains/domainCard_Force_of_Nature_LzVpMkD5I4QeaIHf.json index 331d19b5..913de9e0 100644 --- a/src/packs/domains/domainCard_Force_of_Nature_LzVpMkD5I4QeaIHf.json +++ b/src/packs/domains/domainCard_Force_of_Nature_LzVpMkD5I4QeaIHf.json @@ -92,33 +92,27 @@ "_id": "ptBC882plZW39Ld9", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.physical.bonus", + "type": "add", + "value": "10", + "priority": null + }, + { + "key": "system.bonuses.damage.magical.bonus", + "type": "add", + "value": "10", + "priority": null + }, + { + "key": "system.rules.conditionImmunities.restrained", + "type": "override", + "value": "1", + "priority": null + } + ] }, - "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.rules.conditionImmunities.restrained", - "mode": 5, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Forceful_Push_z8FFPhDh2SdFkFfS.json b/src/packs/domains/domainCard_Forceful_Push_z8FFPhDh2SdFkFfS.json index 3d17ab5d..8fc09c1c 100644 --- a/src/packs/domains/domainCard_Forceful_Push_z8FFPhDh2SdFkFfS.json +++ b/src/packs/domains/domainCard_Forceful_Push_z8FFPhDh2SdFkFfS.json @@ -64,12 +64,6 @@ "_id": "95oX6QYPySdyyh2v", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary" diff --git a/src/packs/domains/domainCard_Forest_Sprites_JrkUMTzaFmQNBHVm.json b/src/packs/domains/domainCard_Forest_Sprites_JrkUMTzaFmQNBHVm.json index 4fa469a6..164b3a71 100644 --- a/src/packs/domains/domainCard_Forest_Sprites_JrkUMTzaFmQNBHVm.json +++ b/src/packs/domains/domainCard_Forest_Sprites_JrkUMTzaFmQNBHVm.json @@ -88,21 +88,15 @@ "_id": "SuiUFAPyB37Qr6sO", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.attack.bonus", + "type": "add", + "value": "+3", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.roll.attack.bonus", - "mode": 2, - "value": "+3", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Fortified_Armor_oVa49lI107eZILZr.json b/src/packs/domains/domainCard_Fortified_Armor_oVa49lI107eZILZr.json index e755bf8d..90ed8d89 100644 --- a/src/packs/domains/domainCard_Fortified_Armor_oVa49lI107eZILZr.json +++ b/src/packs/domains/domainCard_Fortified_Armor_oVa49lI107eZILZr.json @@ -23,29 +23,23 @@ "name": "Fortified Armor", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.damageThresholds.major", + "type": "add", + "value": "2", + "priority": null + }, + { + "key": "system.damageThresholds.severe", + "type": "add", + "value": "2", + "priority": null + } + ] }, "_id": "jx8KWAdyoPV2hV0s", "img": "icons/equipment/chest/breastplate-helmet-metal.webp", - "changes": [ - { - "key": "system.damageThresholds.major", - "mode": 2, - "value": "2", - "priority": null - }, - { - "key": "system.damageThresholds.severe", - "mode": 2, - "value": "2", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Frenzy_MMl7abdGRLl7TJLO.json b/src/packs/domains/domainCard_Frenzy_MMl7abdGRLl7TJLO.json index 6666bc28..022cc65f 100644 --- a/src/packs/domains/domainCard_Frenzy_MMl7abdGRLl7TJLO.json +++ b/src/packs/domains/domainCard_Frenzy_MMl7abdGRLl7TJLO.json @@ -57,12 +57,6 @@ "_id": "1POoAgObPOWDpUco", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.bonuses.damage.physical.bonus", diff --git a/src/packs/domains/domainCard_Full_Surge_SgvjJfMyubZowPxS.json b/src/packs/domains/domainCard_Full_Surge_SgvjJfMyubZowPxS.json index fb0bd16d..37087001 100644 --- a/src/packs/domains/domainCard_Full_Surge_SgvjJfMyubZowPxS.json +++ b/src/packs/domains/domainCard_Full_Surge_SgvjJfMyubZowPxS.json @@ -63,12 +63,6 @@ "_id": "H5q5iYImr69TfZcp", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.traits.strength.value", diff --git a/src/packs/domains/domainCard_Get_Back_Up_BFWN2cObMdlk9uVz.json b/src/packs/domains/domainCard_Get_Back_Up_BFWN2cObMdlk9uVz.json index 571a3fb4..fde3f546 100644 --- a/src/packs/domains/domainCard_Get_Back_Up_BFWN2cObMdlk9uVz.json +++ b/src/packs/domains/domainCard_Get_Back_Up_BFWN2cObMdlk9uVz.json @@ -24,23 +24,17 @@ "name": "Get Back Up", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.rules.damageReduction.stressDamageReduction.severe.cost", + "type": "override", + "value": "1", + "priority": null + } + ] }, "_id": "aV3KUHtXXR86PRMh", "img": "icons/magic/control/silhouette-aura-energy.webp", - "changes": [ - { - "key": "system.rules.damageReduction.stressDamageReduction.severe.cost", - "mode": 5, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Gifted_Tracker_VZ2b4zfRzV73XTuT.json b/src/packs/domains/domainCard_Gifted_Tracker_VZ2b4zfRzV73XTuT.json index 61d90f0c..ad1c1580 100644 --- a/src/packs/domains/domainCard_Gifted_Tracker_VZ2b4zfRzV73XTuT.json +++ b/src/packs/domains/domainCard_Gifted_Tracker_VZ2b4zfRzV73XTuT.json @@ -63,21 +63,15 @@ "_id": "47Oh2weCdmuvKHM9", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.evasion", + "type": "add", + "value": "+1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.evasion", - "mode": 2, - "value": "+1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Glyph_of_Nightfall_B5HXqYRJiL3xMNKT.json b/src/packs/domains/domainCard_Glyph_of_Nightfall_B5HXqYRJiL3xMNKT.json index 35100187..a4aa4d9f 100644 --- a/src/packs/domains/domainCard_Glyph_of_Nightfall_B5HXqYRJiL3xMNKT.json +++ b/src/packs/domains/domainCard_Glyph_of_Nightfall_B5HXqYRJiL3xMNKT.json @@ -100,12 +100,6 @@ "duration": { "description": "", "type": "temporary" - }, - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" } }, "disabled": false, diff --git a/src/packs/domains/domainCard_Goad_Them_On_HufF5KzuNfEb9RTi.json b/src/packs/domains/domainCard_Goad_Them_On_HufF5KzuNfEb9RTi.json index db28b8b5..884324f7 100644 --- a/src/packs/domains/domainCard_Goad_Them_On_HufF5KzuNfEb9RTi.json +++ b/src/packs/domains/domainCard_Goad_Them_On_HufF5KzuNfEb9RTi.json @@ -106,21 +106,15 @@ "_id": "Jccsuc48gmA6QAni", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.disadvantageSources", + "type": "add", + "value": "Attacking the goading creature", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.disadvantageSources", - "mode": 2, - "value": "Attacking the goading creature", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Grace_Touched_KAuNb51AwhD8KEXk.json b/src/packs/domains/domainCard_Grace_Touched_KAuNb51AwhD8KEXk.json index 2e48f07b..a788e205 100644 --- a/src/packs/domains/domainCard_Grace_Touched_KAuNb51AwhD8KEXk.json +++ b/src/packs/domains/domainCard_Grace_Touched_KAuNb51AwhD8KEXk.json @@ -107,16 +107,10 @@ "name": "Grace-Touched", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, "_id": "KK5m2slpFuXDxFaL", "img": "systems/daggerheart/assets/icons/domains/domain-card/grace.png", - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Healing_Hands_WTlhnQMajc1r8i50.json b/src/packs/domains/domainCard_Healing_Hands_WTlhnQMajc1r8i50.json index c771562c..a3657ef6 100644 --- a/src/packs/domains/domainCard_Healing_Hands_WTlhnQMajc1r8i50.json +++ b/src/packs/domains/domainCard_Healing_Hands_WTlhnQMajc1r8i50.json @@ -385,14 +385,8 @@ "_id": "sd5liP4ZcVeTMAoW", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Hold_the_Line_kdFoLo3KXwn4LqTG.json b/src/packs/domains/domainCard_Hold_the_Line_kdFoLo3KXwn4LqTG.json index 263220e4..a6edb862 100644 --- a/src/packs/domains/domainCard_Hold_the_Line_kdFoLo3KXwn4LqTG.json +++ b/src/packs/domains/domainCard_Hold_the_Line_kdFoLo3KXwn4LqTG.json @@ -91,14 +91,8 @@ "_id": "y82y3nUStyL8DIJL", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, @@ -127,12 +121,6 @@ "_id": "WTYg0b8nE1XbnMiA", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary" diff --git a/src/packs/domains/domainCard_Hush_gwmYasmfgXZ7tFS6.json b/src/packs/domains/domainCard_Hush_gwmYasmfgXZ7tFS6.json index 28c41c7e..9793c70f 100644 --- a/src/packs/domains/domainCard_Hush_gwmYasmfgXZ7tFS6.json +++ b/src/packs/domains/domainCard_Hush_gwmYasmfgXZ7tFS6.json @@ -88,12 +88,6 @@ "_id": "pZ5YpjKidaj48IYF", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/domains/domainCard_Hypnotic_Shimmer_2ZeuCGVatQdPOVC6.json b/src/packs/domains/domainCard_Hypnotic_Shimmer_2ZeuCGVatQdPOVC6.json index 08f0d3ee..f4f95d83 100644 --- a/src/packs/domains/domainCard_Hypnotic_Shimmer_2ZeuCGVatQdPOVC6.json +++ b/src/packs/domains/domainCard_Hypnotic_Shimmer_2ZeuCGVatQdPOVC6.json @@ -116,12 +116,6 @@ "_id": "xAG75UWUz3aDZH3m", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary" diff --git a/src/packs/domains/domainCard_Inevitable_XTT8c8uJ4D7fvtbL.json b/src/packs/domains/domainCard_Inevitable_XTT8c8uJ4D7fvtbL.json index fc083136..d7f1d82d 100644 --- a/src/packs/domains/domainCard_Inevitable_XTT8c8uJ4D7fvtbL.json +++ b/src/packs/domains/domainCard_Inevitable_XTT8c8uJ4D7fvtbL.json @@ -23,23 +23,17 @@ "name": "Inevitable", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.advantageSources", + "type": "add", + "value": "If you failed your previous action roll", + "priority": null + } + ] }, "_id": "wX4BFGaM0bdzHPn2", "img": "icons/magic/light/explosion-beam-impact-silhouette.webp", - "changes": [ - { - "key": "system.advantageSources", - "mode": 2, - "value": "If you failed your previous action roll", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Invisibility_KHkzA4Zrw8EWN1CH.json b/src/packs/domains/domainCard_Invisibility_KHkzA4Zrw8EWN1CH.json index 5f67ff74..9ed72705 100644 --- a/src/packs/domains/domainCard_Invisibility_KHkzA4Zrw8EWN1CH.json +++ b/src/packs/domains/domainCard_Invisibility_KHkzA4Zrw8EWN1CH.json @@ -94,14 +94,8 @@ "_id": "bRJy0MoIPQEQOMzZ", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Lead_by_Example_YWCRplmtwpCjpq5i.json b/src/packs/domains/domainCard_Lead_by_Example_YWCRplmtwpCjpq5i.json index a29b021f..e2836d8c 100644 --- a/src/packs/domains/domainCard_Lead_by_Example_YWCRplmtwpCjpq5i.json +++ b/src/packs/domains/domainCard_Lead_by_Example_YWCRplmtwpCjpq5i.json @@ -63,14 +63,8 @@ "_id": "BbBs2XYXMsLwkHKh", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Life_Ward_OszbCj0jTqq2ADx9.json b/src/packs/domains/domainCard_Life_Ward_OszbCj0jTqq2ADx9.json index de841ffe..ec2dc590 100644 --- a/src/packs/domains/domainCard_Life_Ward_OszbCj0jTqq2ADx9.json +++ b/src/packs/domains/domainCard_Life_Ward_OszbCj0jTqq2ADx9.json @@ -65,12 +65,6 @@ "_id": "E7Ou4OMEy3TeK1Gf", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "longRest" diff --git a/src/packs/domains/domainCard_Mass_Disguise_dT95m0Jam8sWbeuC.json b/src/packs/domains/domainCard_Mass_Disguise_dT95m0Jam8sWbeuC.json index b9fbaed9..4941eddd 100644 --- a/src/packs/domains/domainCard_Mass_Disguise_dT95m0Jam8sWbeuC.json +++ b/src/packs/domains/domainCard_Mass_Disguise_dT95m0Jam8sWbeuC.json @@ -93,21 +93,15 @@ "_id": "HgF4n0idPcdz8Bi7", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.advantageSources", + "type": "add", + "value": "Presence Rolls to avoid scrutiny.", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.advantageSources", - "mode": 2, - "value": "Presence Rolls to avoid scrutiny.", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Mass_Enrapture_ubpixIgZrJXKyM3b.json b/src/packs/domains/domainCard_Mass_Enrapture_ubpixIgZrJXKyM3b.json index 8ada8d80..48da2c58 100644 --- a/src/packs/domains/domainCard_Mass_Enrapture_ubpixIgZrJXKyM3b.json +++ b/src/packs/domains/domainCard_Mass_Enrapture_ubpixIgZrJXKyM3b.json @@ -148,12 +148,6 @@ "_id": "QNbnelRylVB0yCm0", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary" diff --git a/src/packs/domains/domainCard_Midnight_Touched_uSyGKVxOJcnp28po.json b/src/packs/domains/domainCard_Midnight_Touched_uSyGKVxOJcnp28po.json index b859aafb..e3b845c2 100644 --- a/src/packs/domains/domainCard_Midnight_Touched_uSyGKVxOJcnp28po.json +++ b/src/packs/domains/domainCard_Midnight_Touched_uSyGKVxOJcnp28po.json @@ -122,16 +122,10 @@ "name": "Midnight-Touched", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, "_id": "sNBuI2xIZAI4RgZy", "img": "systems/daggerheart/assets/icons/domains/domain-card/midnight.png", - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Natural_Familiar_Tag303LoRNC5zGgl.json b/src/packs/domains/domainCard_Natural_Familiar_Tag303LoRNC5zGgl.json index c14116d4..68ed1c54 100644 --- a/src/packs/domains/domainCard_Natural_Familiar_Tag303LoRNC5zGgl.json +++ b/src/packs/domains/domainCard_Natural_Familiar_Tag303LoRNC5zGgl.json @@ -139,27 +139,21 @@ "_id": "0BumAWKw2aK4A5al", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.magical.dice", + "type": "add", + "value": "d6", + "priority": null + }, + { + "key": "system.bonuses.damage.physical.dice", + "type": "add", + "value": "d6", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.damage.magical.dice", - "mode": 2, - "value": "d6", - "priority": null - }, - { - "key": "system.bonuses.damage.physical.dice", - "mode": 2, - "value": "d6", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Nature_s_Tongue_atWLorlCOxcrq8WB.json b/src/packs/domains/domainCard_Nature_s_Tongue_atWLorlCOxcrq8WB.json index b6c9464a..42734531 100644 --- a/src/packs/domains/domainCard_Nature_s_Tongue_atWLorlCOxcrq8WB.json +++ b/src/packs/domains/domainCard_Nature_s_Tongue_atWLorlCOxcrq8WB.json @@ -109,21 +109,15 @@ "_id": "0JYDk5CQ66bHGQO0", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.spellcast.bonus", + "type": "add", + "value": "+2", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.roll.spellcast.bonus", - "mode": 2, - "value": "+2", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Never_Upstaged_McdncxmO9K1YNP7Y.json b/src/packs/domains/domainCard_Never_Upstaged_McdncxmO9K1YNP7Y.json index aaa2c60e..396b7153 100644 --- a/src/packs/domains/domainCard_Never_Upstaged_McdncxmO9K1YNP7Y.json +++ b/src/packs/domains/domainCard_Never_Upstaged_McdncxmO9K1YNP7Y.json @@ -211,27 +211,21 @@ "_id": "C6e1T2oEx6PFoRUP", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.physical.bonus", + "type": "add", + "value": "+5", + "priority": null + }, + { + "key": "system.bonuses.damage.magical.bonus", + "type": "add", + "value": "+5", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.damage.physical.bonus", - "mode": 2, - "value": "+5", - "priority": null - }, - { - "key": "system.bonuses.damage.magical.bonus", - "mode": 2, - "value": "+5", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -260,27 +254,21 @@ "_id": "bMMxsBungVYB1rI8", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.magical.bonus", + "type": "add", + "value": "+10", + "priority": null + }, + { + "key": "system.bonuses.damage.physical.bonus", + "type": "add", + "value": "+10", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.damage.magical.bonus", - "mode": 2, - "value": "+10", - "priority": null - }, - { - "key": "system.bonuses.damage.physical.bonus", - "mode": 2, - "value": "+10", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -309,27 +297,21 @@ "_id": "tsQRbrurzi8iqs0o", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.magical.bonus", + "type": "add", + "value": "+15", + "priority": null + }, + { + "key": "system.bonuses.damage.physical.bonus", + "type": "add", + "value": "+15", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.damage.magical.bonus", - "mode": 2, - "value": "+15", - "priority": null - }, - { - "key": "system.bonuses.damage.physical.bonus", - "mode": 2, - "value": "+15", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -358,27 +340,21 @@ "_id": "3eTaSgHlmNDcymnW", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.magical.bonus", + "type": "add", + "value": "+20", + "priority": null + }, + { + "key": "system.bonuses.damage.physical.bonus", + "type": "add", + "value": "+20", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.damage.magical.bonus", - "mode": 2, - "value": "+20", - "priority": null - }, - { - "key": "system.bonuses.damage.physical.bonus", - "mode": 2, - "value": "+20", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Night_Terror_zcldCuqOg3dphUVI.json b/src/packs/domains/domainCard_Night_Terror_zcldCuqOg3dphUVI.json index 8eefeec4..57b8f862 100644 --- a/src/packs/domains/domainCard_Night_Terror_zcldCuqOg3dphUVI.json +++ b/src/packs/domains/domainCard_Night_Terror_zcldCuqOg3dphUVI.json @@ -150,12 +150,6 @@ "_id": "32j3ZeNMMCk1QLlM", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary" diff --git a/src/packs/domains/domainCard_On_the_Brink_zbxPl81kbWEegKQN.json b/src/packs/domains/domainCard_On_the_Brink_zbxPl81kbWEegKQN.json index e5f90fe4..2dc7b95e 100644 --- a/src/packs/domains/domainCard_On_the_Brink_zbxPl81kbWEegKQN.json +++ b/src/packs/domains/domainCard_On_the_Brink_zbxPl81kbWEegKQN.json @@ -23,23 +23,17 @@ "name": "On The Brink", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.rules.damageReduction.thresholdImmunities.minor", + "type": "override", + "value": "1", + "priority": null + } + ] }, "_id": "UJTsJlnhi5Zi0XQ2", "img": "systems/daggerheart/assets/icons/domains/domain-card/bone.png", - "changes": [ - { - "key": "system.rules.damageReduction.thresholdImmunities.minor", - "mode": 5, - "value": "1", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Overwhelming_Aura_iEBLySZD9z8CLdz7.json b/src/packs/domains/domainCard_Overwhelming_Aura_iEBLySZD9z8CLdz7.json index 9aa2f5b4..e73171a5 100644 --- a/src/packs/domains/domainCard_Overwhelming_Aura_iEBLySZD9z8CLdz7.json +++ b/src/packs/domains/domainCard_Overwhelming_Aura_iEBLySZD9z8CLdz7.json @@ -89,12 +89,6 @@ "_id": "ba9GO4NtQHYkaRR9", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.traits.presence.value", diff --git a/src/packs/domains/domainCard_Pick_and_Pull_HdgZUfWd7Hyj7nBW.json b/src/packs/domains/domainCard_Pick_and_Pull_HdgZUfWd7Hyj7nBW.json index 35ac6ce4..1a5e40df 100644 --- a/src/packs/domains/domainCard_Pick_and_Pull_HdgZUfWd7Hyj7nBW.json +++ b/src/packs/domains/domainCard_Pick_and_Pull_HdgZUfWd7Hyj7nBW.json @@ -23,35 +23,29 @@ "name": "Pick and Pull", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.advantageSources", + "type": "add", + "value": "Pick nonmagical locks", + "priority": null + }, + { + "key": "system.advantageSources", + "type": "add", + "value": "Disarm nonmagical traps", + "priority": null + }, + { + "key": "system.advantageSources", + "type": "add", + "value": "Steal items from a target (either through stealth or by force)", + "priority": null + } + ] }, "_id": "6IkjF8qNR0NVvvv8", "img": "icons/tools/hand/lockpicks-steel-grey.webp", - "changes": [ - { - "key": "system.advantageSources", - "mode": 2, - "value": "Pick nonmagical locks", - "priority": null - }, - { - "key": "system.advantageSources", - "mode": 2, - "value": "Disarm nonmagical traps", - "priority": null - }, - { - "key": "system.advantageSources", - "mode": 2, - "value": "Steal items from a target (either through stealth or by force)", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Rage_Up_GRL0cvs96vrTDckZ.json b/src/packs/domains/domainCard_Rage_Up_GRL0cvs96vrTDckZ.json index c3493aea..13d0f540 100644 --- a/src/packs/domains/domainCard_Rage_Up_GRL0cvs96vrTDckZ.json +++ b/src/packs/domains/domainCard_Rage_Up_GRL0cvs96vrTDckZ.json @@ -65,12 +65,6 @@ "_id": "bq1MhcmoP6Wo5CXF", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.bonuses.damage.magical.bonus", @@ -129,12 +123,6 @@ "_id": "t6SIjQxB6UBUJ98f", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.bonuses.damage.magical.bonus", diff --git a/src/packs/domains/domainCard_Recovery_gsiQFT6q3WOgqerJ.json b/src/packs/domains/domainCard_Recovery_gsiQFT6q3WOgqerJ.json index 4cfd0b19..bf6ffbf3 100644 --- a/src/packs/domains/domainCard_Recovery_gsiQFT6q3WOgqerJ.json +++ b/src/packs/domains/domainCard_Recovery_gsiQFT6q3WOgqerJ.json @@ -57,27 +57,21 @@ "_id": "smTjINqIldErFD3q", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.rest.shortRest.longMoves", + "type": "add", + "value": "1", + "priority": null + }, + { + "key": "system.bonuses.rest.shortRest.shortMoves", + "type": "add", + "value": "-1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.rest.shortRest.longMoves", - "mode": 2, - "value": "1", - "priority": null - }, - { - "key": "system.bonuses.rest.shortRest.shortMoves", - "mode": 2, - "value": "-1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -102,29 +96,23 @@ "name": "Recovery", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.rest.shortRest.longMoves", + "type": "add", + "value": "1", + "priority": null + }, + { + "key": "system.bonuses.rest.shortRest.shortMoves", + "type": "add", + "value": "-1", + "priority": null + } + ] }, "_id": "7GsHTQCtNB8PEVgr", "img": "icons/magic/life/cross-beam-green.webp", - "changes": [ - { - "key": "system.bonuses.rest.shortRest.longMoves", - "mode": 2, - "value": "1", - "priority": null - }, - { - "key": "system.bonuses.rest.shortRest.shortMoves", - "mode": 2, - "value": "-1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Rejuvenation_Barrier_HtWx5IIemCoorMj2.json b/src/packs/domains/domainCard_Rejuvenation_Barrier_HtWx5IIemCoorMj2.json index 6d8757f7..bfd8fb09 100644 --- a/src/packs/domains/domainCard_Rejuvenation_Barrier_HtWx5IIemCoorMj2.json +++ b/src/packs/domains/domainCard_Rejuvenation_Barrier_HtWx5IIemCoorMj2.json @@ -110,12 +110,6 @@ "_id": "obul9k0P4CjFuxJD", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.resistance.physical.resistance", diff --git a/src/packs/domains/domainCard_Rise_Up_oDIZoC4l19Nli0Fj.json b/src/packs/domains/domainCard_Rise_Up_oDIZoC4l19Nli0Fj.json index 5d46562d..09c82b6e 100644 --- a/src/packs/domains/domainCard_Rise_Up_oDIZoC4l19Nli0Fj.json +++ b/src/packs/domains/domainCard_Rise_Up_oDIZoC4l19Nli0Fj.json @@ -92,23 +92,17 @@ "name": "Rise Up", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.damageThresholds.severe", + "type": "add", + "value": "@system.proficiency", + "priority": 21 + } + ] }, "_id": "ulQpnnRFwW4BwMlE", "img": "icons/magic/defensive/shield-barrier-flaming-pentagon-teal-purple.webp", - "changes": [ - { - "key": "system.damageThresholds.severe", - "mode": 2, - "value": "@system.proficiency", - "priority": 21 - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Safe_Haven_lmBLMPuR8qLbuzNf.json b/src/packs/domains/domainCard_Safe_Haven_lmBLMPuR8qLbuzNf.json index 0d98c1f9..14c79df8 100644 --- a/src/packs/domains/domainCard_Safe_Haven_lmBLMPuR8qLbuzNf.json +++ b/src/packs/domains/domainCard_Safe_Haven_lmBLMPuR8qLbuzNf.json @@ -63,27 +63,21 @@ "_id": "UaqohKZnokIPLeYf", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.rest.shortRest.shortMoves", + "type": "add", + "value": "1", + "priority": null + }, + { + "key": "system.bonuses.rest.longRest.longMoves", + "type": "add", + "value": "1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.rest.shortRest.shortMoves", - "mode": 2, - "value": "1", - "priority": null - }, - { - "key": "system.bonuses.rest.longRest.longMoves", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Sage_Touched_VOSFaQHZbmhMyXwi.json b/src/packs/domains/domainCard_Sage_Touched_VOSFaQHZbmhMyXwi.json index 432ff638..a289fd30 100644 --- a/src/packs/domains/domainCard_Sage_Touched_VOSFaQHZbmhMyXwi.json +++ b/src/packs/domains/domainCard_Sage_Touched_VOSFaQHZbmhMyXwi.json @@ -105,23 +105,17 @@ "name": "Increase Spellcasting", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.spellcast.bonus", + "type": "add", + "value": "+2", + "priority": null + } + ] }, "_id": "7zMpgedPII5GIYUl", "img": "systems/daggerheart/assets/icons/domains/domain-card/sage.png", - "changes": [ - { - "key": "system.bonuses.roll.spellcast.bonus", - "mode": 2, - "value": "+2", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -152,21 +146,15 @@ "_id": "Mmax64mlLPYxJPB7", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.traits.agility.value", + "type": "multiply", + "value": "2", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.traits.agility.value", - "mode": 1, - "value": "2", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, @@ -195,21 +183,15 @@ "_id": "p03IjcyigL4b2WD1", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.traits.instinct.value", + "type": "multiply", + "value": "2", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.traits.instinct.value", - "mode": 1, - "value": "2", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Shadowbind_kguhWlidhxe2GbT0.json b/src/packs/domains/domainCard_Shadowbind_kguhWlidhxe2GbT0.json index a90ec0f7..1023b92c 100644 --- a/src/packs/domains/domainCard_Shadowbind_kguhWlidhxe2GbT0.json +++ b/src/packs/domains/domainCard_Shadowbind_kguhWlidhxe2GbT0.json @@ -89,12 +89,6 @@ "_id": "RFB4V0V4bDJ6vCL2", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary" diff --git a/src/packs/domains/domainCard_Shadowhunter_A0XzD6MmBXYdk7Ps.json b/src/packs/domains/domainCard_Shadowhunter_A0XzD6MmBXYdk7Ps.json index a3d98039..b942cc20 100644 --- a/src/packs/domains/domainCard_Shadowhunter_A0XzD6MmBXYdk7Ps.json +++ b/src/packs/domains/domainCard_Shadowhunter_A0XzD6MmBXYdk7Ps.json @@ -24,16 +24,10 @@ "name": "Shadowhunter Evasion", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, "_id": "A6gMv7TbMu3nV3NT", "img": "icons/skills/movement/feet-winged-boots-glowing-yellow.webp", - "changes": [], "disabled": true, "duration": { "startTime": null, @@ -60,23 +54,17 @@ "name": "Shadowhunter Advantage Hint", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.advantageSources", + "type": "add", + "value": "Attack rolls while shrouded in low light or darkness.", + "priority": null + } + ] }, "_id": "a1hDCNYDvF4dWt58", "img": "icons/skills/targeting/crosshair-bars-yellow.webp", - "changes": [ - { - "key": "system.advantageSources", - "mode": 2, - "value": "Attack rolls while shrouded in low light or darkness.", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Shield_Aura_rfIv6lln40Fh6EIl.json b/src/packs/domains/domainCard_Shield_Aura_rfIv6lln40Fh6EIl.json index 64544f76..03155bf1 100644 --- a/src/packs/domains/domainCard_Shield_Aura_rfIv6lln40Fh6EIl.json +++ b/src/packs/domains/domainCard_Shield_Aura_rfIv6lln40Fh6EIl.json @@ -65,21 +65,15 @@ "_id": "OQreUqdAfIt3V6uq", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.rules.damageReduction.increasePerArmorMark", + "type": "add", + "value": "+1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.rules.damageReduction.increasePerArmorMark", - "mode": 2, - "value": "+1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Shrug_It_Off_JwfhtgmmuRxg4zhI.json b/src/packs/domains/domainCard_Shrug_It_Off_JwfhtgmmuRxg4zhI.json index 3e757308..f73deba0 100644 --- a/src/packs/domains/domainCard_Shrug_It_Off_JwfhtgmmuRxg4zhI.json +++ b/src/packs/domains/domainCard_Shrug_It_Off_JwfhtgmmuRxg4zhI.json @@ -79,23 +79,17 @@ "name": "Shrug It Off", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.rules.damageReduction.stressDamageReduction.any.cost", + "type": "override", + "value": "1", + "priority": null + } + ] }, "_id": "5DTQDVU8Jy5Nnp5V", "img": "icons/magic/defensive/shield-barrier-deflect-teal.webp", - "changes": [ - { - "key": "system.rules.damageReduction.stressDamageReduction.any.cost", - "mode": 5, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Sigil_of_Retribution_RiuN0lMlfoTAhLJz.json b/src/packs/domains/domainCard_Sigil_of_Retribution_RiuN0lMlfoTAhLJz.json index a368edad..d0933e2f 100644 --- a/src/packs/domains/domainCard_Sigil_of_Retribution_RiuN0lMlfoTAhLJz.json +++ b/src/packs/domains/domainCard_Sigil_of_Retribution_RiuN0lMlfoTAhLJz.json @@ -63,14 +63,8 @@ "_id": "pJntjutNO7bYX6td", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Smite_U1uWJE94HZVudujz.json b/src/packs/domains/domainCard_Smite_U1uWJE94HZVudujz.json index 23786540..8a6d2281 100644 --- a/src/packs/domains/domainCard_Smite_U1uWJE94HZVudujz.json +++ b/src/packs/domains/domainCard_Smite_U1uWJE94HZVudujz.json @@ -65,14 +65,8 @@ "_id": "mqZSae8J9d7o3lon", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Specter_of_the_Dark_iQhgqmLwhcSTYnvr.json b/src/packs/domains/domainCard_Specter_of_the_Dark_iQhgqmLwhcSTYnvr.json index 18af0877..5291c31c 100644 --- a/src/packs/domains/domainCard_Specter_of_the_Dark_iQhgqmLwhcSTYnvr.json +++ b/src/packs/domains/domainCard_Specter_of_the_Dark_iQhgqmLwhcSTYnvr.json @@ -63,21 +63,15 @@ "_id": "d9bZJl0yZnvOe2f3", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.resistance.physical.immunity", + "type": "override", + "value": "true", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.resistance.physical.immunity", - "mode": 5, - "value": "true", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Splendor_Touched_JT5dM3gVL6chDBYU.json b/src/packs/domains/domainCard_Splendor_Touched_JT5dM3gVL6chDBYU.json index 6b530289..730ac290 100644 --- a/src/packs/domains/domainCard_Splendor_Touched_JT5dM3gVL6chDBYU.json +++ b/src/packs/domains/domainCard_Splendor_Touched_JT5dM3gVL6chDBYU.json @@ -24,23 +24,17 @@ "name": "Splendor-Touched", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.damageThresholds.severe", + "type": "add", + "value": "+3", + "priority": null + } + ] }, "_id": "u13fiOMD8B36PkiZ", "img": "systems/daggerheart/assets/icons/domains/domain-card/splendor.png", - "changes": [ - { - "key": "system.damageThresholds.severe", - "mode": 2, - "value": "+3", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Stunning_Sunlight_lRHo6ZkK1zybeEoG.json b/src/packs/domains/domainCard_Stunning_Sunlight_lRHo6ZkK1zybeEoG.json index e2d68a10..3ffb8821 100644 --- a/src/packs/domains/domainCard_Stunning_Sunlight_lRHo6ZkK1zybeEoG.json +++ b/src/packs/domains/domainCard_Stunning_Sunlight_lRHo6ZkK1zybeEoG.json @@ -179,12 +179,6 @@ "_id": "kSLuGSI6FLhOJaGp", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary" diff --git a/src/packs/domains/domainCard_Tell_No_Lies_HTv9QEPS466WsstP.json b/src/packs/domains/domainCard_Tell_No_Lies_HTv9QEPS466WsstP.json index 1efb1374..e17842dd 100644 --- a/src/packs/domains/domainCard_Tell_No_Lies_HTv9QEPS466WsstP.json +++ b/src/packs/domains/domainCard_Tell_No_Lies_HTv9QEPS466WsstP.json @@ -97,16 +97,10 @@ "name": "Can't Lie", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, "_id": "5L6fC80VfbPfGmcA", "img": "icons/magic/control/voodoo-doll-pain-damage-red.webp", - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Tempest_X7YaZgFieBlqaPdZ.json b/src/packs/domains/domainCard_Tempest_X7YaZgFieBlqaPdZ.json index e027ca8f..9bf8f2c0 100644 --- a/src/packs/domains/domainCard_Tempest_X7YaZgFieBlqaPdZ.json +++ b/src/packs/domains/domainCard_Tempest_X7YaZgFieBlqaPdZ.json @@ -290,12 +290,6 @@ "_id": "oqPY3I9oO9J6l5Aj", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary" @@ -338,12 +332,6 @@ "_id": "tB7AyDy0pbE9q5hM", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [] }, "disabled": false, @@ -374,12 +362,6 @@ "_id": "S4Vpgf3FMmq8MGrb", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [] }, "disabled": false, diff --git a/src/packs/domains/domainCard_Thorn_Skin_oUipGK84E2KjoKqh.json b/src/packs/domains/domainCard_Thorn_Skin_oUipGK84E2KjoKqh.json index 2f97dd84..1f1da4dc 100644 --- a/src/packs/domains/domainCard_Thorn_Skin_oUipGK84E2KjoKqh.json +++ b/src/packs/domains/domainCard_Thorn_Skin_oUipGK84E2KjoKqh.json @@ -97,14 +97,8 @@ "_id": "KPA1okccsR7AQH0x", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Thought_Delver_B4choj481tqajWb9.json b/src/packs/domains/domainCard_Thought_Delver_B4choj481tqajWb9.json index 7c8d6235..a69670d5 100644 --- a/src/packs/domains/domainCard_Thought_Delver_B4choj481tqajWb9.json +++ b/src/packs/domains/domainCard_Thought_Delver_B4choj481tqajWb9.json @@ -109,14 +109,8 @@ "_id": "obbNjDhwN60YhH1s", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Through_Your_Eyes_7b0mzV5QMPjVPT4o.json b/src/packs/domains/domainCard_Through_Your_Eyes_7b0mzV5QMPjVPT4o.json index 529950b5..85f435be 100644 --- a/src/packs/domains/domainCard_Through_Your_Eyes_7b0mzV5QMPjVPT4o.json +++ b/src/packs/domains/domainCard_Through_Your_Eyes_7b0mzV5QMPjVPT4o.json @@ -56,12 +56,6 @@ "_id": "TCOHV7tWpunCZDxn", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "shortRest" diff --git a/src/packs/domains/domainCard_Towering_Stalk_n0P3VS1WfxvmXbB6.json b/src/packs/domains/domainCard_Towering_Stalk_n0P3VS1WfxvmXbB6.json index 70a1fbda..e154df8f 100644 --- a/src/packs/domains/domainCard_Towering_Stalk_n0P3VS1WfxvmXbB6.json +++ b/src/packs/domains/domainCard_Towering_Stalk_n0P3VS1WfxvmXbB6.json @@ -19,20 +19,20 @@ "actionType": "action", "cost": [ { - "key": "stress", - "itemId": null, - "value": 1, + "consumeOnSuccess": false, "scalable": false, - "step": null, - "consumeOnSuccess": false + "key": "stress", + "value": 1, + "itemId": null, + "step": null }, { - "key": "resource", - "itemId": "n0P3VS1WfxvmXbB6", - "value": 1, + "consumeOnSuccess": false, "scalable": false, - "step": null, - "consumeOnSuccess": false + "key": "resource", + "value": 1, + "itemId": "n0P3VS1WfxvmXbB6", + "step": null } ], "uses": { @@ -119,16 +119,17 @@ "cost": [ { "scalable": false, - "key": "hitPoints", + "key": "resource", "value": 1, + "itemId": "n0P3VS1WfxvmXbB6", "step": null, "consumeOnSuccess": false } ], "uses": { "value": null, - "max": "1", - "recovery": "shortRest" + "max": "", + "recovery": null }, "effects": [], "target": { @@ -140,7 +141,15 @@ "range": "" } }, - "resource": null, + "resource": { + "type": "simple", + "value": 1, + "max": "1", + "recovery": "shortRest", + "progression": "decreasing", + "dieFaces": "d4", + "icon": "fa-solid fa-seedling" + }, "attribution": { "source": "Daggerheart SRD", "page": 130, diff --git a/src/packs/domains/domainCard_Transcendent_Union_kVkoCLBXLAIifqpz.json b/src/packs/domains/domainCard_Transcendent_Union_kVkoCLBXLAIifqpz.json index 4460a5db..14bdc45f 100644 --- a/src/packs/domains/domainCard_Transcendent_Union_kVkoCLBXLAIifqpz.json +++ b/src/packs/domains/domainCard_Transcendent_Union_kVkoCLBXLAIifqpz.json @@ -65,12 +65,6 @@ "_id": "kMcvp2QKmBP4uinB", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "shortRest" diff --git a/src/packs/domains/domainCard_Twilight_Toll_SDjjV61TC1NceV1m.json b/src/packs/domains/domainCard_Twilight_Toll_SDjjV61TC1NceV1m.json index cc7f45c7..b21f907e 100644 --- a/src/packs/domains/domainCard_Twilight_Toll_SDjjV61TC1NceV1m.json +++ b/src/packs/domains/domainCard_Twilight_Toll_SDjjV61TC1NceV1m.json @@ -96,14 +96,8 @@ "_id": "65UMKq0epBx5DbMC", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Uncanny_Disguise_TV56wSysbU5xAlOa.json b/src/packs/domains/domainCard_Uncanny_Disguise_TV56wSysbU5xAlOa.json index 62953005..e0a2d403 100644 --- a/src/packs/domains/domainCard_Uncanny_Disguise_TV56wSysbU5xAlOa.json +++ b/src/packs/domains/domainCard_Uncanny_Disguise_TV56wSysbU5xAlOa.json @@ -97,21 +97,15 @@ "_id": "ZMDyDwI5RHe427O4", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.advantageSources", + "type": "add", + "value": "Presence Rolls to avoid scrutiny", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.advantageSources", - "mode": 2, - "value": "Presence Rolls to avoid scrutiny", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Unleash_Chaos_o62i0QdbUDIiAhSq.json b/src/packs/domains/domainCard_Unleash_Chaos_o62i0QdbUDIiAhSq.json index 69049d01..20b8f00e 100644 --- a/src/packs/domains/domainCard_Unleash_Chaos_o62i0QdbUDIiAhSq.json +++ b/src/packs/domains/domainCard_Unleash_Chaos_o62i0QdbUDIiAhSq.json @@ -151,14 +151,8 @@ "_id": "F2yHIwHeZmLlrkkS", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Untouchable_9QElncQUDSakuSdR.json b/src/packs/domains/domainCard_Untouchable_9QElncQUDSakuSdR.json index 11a1a841..9693b6bf 100644 --- a/src/packs/domains/domainCard_Untouchable_9QElncQUDSakuSdR.json +++ b/src/packs/domains/domainCard_Untouchable_9QElncQUDSakuSdR.json @@ -23,23 +23,17 @@ "name": "Untouchable", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.evasion", + "type": "add", + "value": "ceil(@system.traits.agility.value / 2)", + "priority": 21 + } + ] }, "_id": "H8hazlQe4Wj4JFO6", "img": "icons/skills/movement/feet-winged-boots-glowing-yellow.webp", - "changes": [ - { - "key": "system.evasion", - "mode": 2, - "value": "ceil(@system.traits.agility.value / 2)", - "priority": 21 - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Vanishing_Dodge_GBMIElIpk4cvk1Bd.json b/src/packs/domains/domainCard_Vanishing_Dodge_GBMIElIpk4cvk1Bd.json index f95c8814..14f7f970 100644 --- a/src/packs/domains/domainCard_Vanishing_Dodge_GBMIElIpk4cvk1Bd.json +++ b/src/packs/domains/domainCard_Vanishing_Dodge_GBMIElIpk4cvk1Bd.json @@ -63,14 +63,8 @@ "_id": "kxal5WfDr3hTHYpb", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Veil_of_Night_gV4L5ZZmfPrEbIDh.json b/src/packs/domains/domainCard_Veil_of_Night_gV4L5ZZmfPrEbIDh.json index cff0c185..8eba6388 100644 --- a/src/packs/domains/domainCard_Veil_of_Night_gV4L5ZZmfPrEbIDh.json +++ b/src/packs/domains/domainCard_Veil_of_Night_gV4L5ZZmfPrEbIDh.json @@ -89,12 +89,6 @@ "_id": "eSfBBZ7IP8qirLu7", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.advantageSources", diff --git a/src/packs/domains/domainCard_Vicious_Entangle_qvpvTnkAoRn9vYO4.json b/src/packs/domains/domainCard_Vicious_Entangle_qvpvTnkAoRn9vYO4.json index 3b7358bc..cce6cef4 100644 --- a/src/packs/domains/domainCard_Vicious_Entangle_qvpvTnkAoRn9vYO4.json +++ b/src/packs/domains/domainCard_Vicious_Entangle_qvpvTnkAoRn9vYO4.json @@ -141,12 +141,6 @@ "_id": "Xh0wrgRUuYpwChBU", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary" @@ -189,12 +183,6 @@ "_id": "2xzOqTaPJQzGqFJv", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary" diff --git a/src/packs/domains/domainCard_Vitality_sWUlSPOJEaXyQLCj.json b/src/packs/domains/domainCard_Vitality_sWUlSPOJEaXyQLCj.json index ec47c9f9..6b4f1740 100644 --- a/src/packs/domains/domainCard_Vitality_sWUlSPOJEaXyQLCj.json +++ b/src/packs/domains/domainCard_Vitality_sWUlSPOJEaXyQLCj.json @@ -66,21 +66,15 @@ "_id": "1jtgIyFvDpTb0asZ", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.resources.hitPoints.max", + "type": "add", + "value": "1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.resources.hitPoints.max", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, @@ -109,21 +103,15 @@ "_id": "vj9rm1tLqqsSFOXF", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.resources.stress.max", + "type": "add", + "value": "1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.resources.stress.max", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, @@ -152,27 +140,21 @@ "_id": "BcqCG9yF6l1LRYqm", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.damageThresholds.major", + "type": "add", + "value": "2", + "priority": null + }, + { + "key": "system.damageThresholds.severe", + "type": "add", + "value": "2", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.damageThresholds.major", - "mode": 2, - "value": "2", - "priority": null - }, - { - "key": "system.damageThresholds.severe", - "mode": 2, - "value": "2", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Voice_of_Reason_t3RRGH6mMYYJJCcF.json b/src/packs/domains/domainCard_Voice_of_Reason_t3RRGH6mMYYJJCcF.json index 748adec3..86305f00 100644 --- a/src/packs/domains/domainCard_Voice_of_Reason_t3RRGH6mMYYJJCcF.json +++ b/src/packs/domains/domainCard_Voice_of_Reason_t3RRGH6mMYYJJCcF.json @@ -23,29 +23,23 @@ "name": "Advantage", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.advantageSources", + "type": "add", + "value": "De-escalate violent situations.", + "priority": null + }, + { + "key": "system.advantageSources", + "type": "add", + "value": "Convince someone to follow your lead.", + "priority": null + } + ] }, "_id": "qWDojebJXMPIP629", "img": "icons/skills/social/diplomacy-handshake.webp", - "changes": [ - { - "key": "system.advantageSources", - "mode": 2, - "value": "De-escalate violent situations.", - "priority": null - }, - { - "key": "system.advantageSources", - "mode": 2, - "value": "Convince someone to follow your lead.", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -72,23 +66,17 @@ "name": "Emboldened (activate manually)", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.proficiency", + "type": "add", + "value": "+1", + "priority": null + } + ] }, "_id": "i5dnpOxTtWV1J46k", "img": "icons/skills/melee/unarmed-punch-fist-yellow-red.webp", - "changes": [ - { - "key": "system.proficiency", - "mode": 2, - "value": "+1", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Wall_Walk_1ROT08E1UVBwHLAS.json b/src/packs/domains/domainCard_Wall_Walk_1ROT08E1UVBwHLAS.json index 066600b1..2a229101 100644 --- a/src/packs/domains/domainCard_Wall_Walk_1ROT08E1UVBwHLAS.json +++ b/src/packs/domains/domainCard_Wall_Walk_1ROT08E1UVBwHLAS.json @@ -65,14 +65,8 @@ "_id": "s1q4O65vtoEDvvUF", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/domains/domainCard_Words_of_Discord_ZjAdi1FSNCDDHI3X.json b/src/packs/domains/domainCard_Words_of_Discord_ZjAdi1FSNCDDHI3X.json index d743f5e1..eb14eead 100644 --- a/src/packs/domains/domainCard_Words_of_Discord_ZjAdi1FSNCDDHI3X.json +++ b/src/packs/domains/domainCard_Words_of_Discord_ZjAdi1FSNCDDHI3X.json @@ -106,14 +106,8 @@ "_id": "DGp7TSriFWotAvP6", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/environments/environment_Abandoned_Grove_pGEdzdLkqYtBhxnG.json b/src/packs/environments/environment_Abandoned_Grove_pGEdzdLkqYtBhxnG.json index 25340e77..039eafcf 100644 --- a/src/packs/environments/environment_Abandoned_Grove_pGEdzdLkqYtBhxnG.json +++ b/src/packs/environments/environment_Abandoned_Grove_pGEdzdLkqYtBhxnG.json @@ -271,12 +271,6 @@ "_id": "LSeftEwgBbXXkLw3", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", @@ -397,7 +391,7 @@ "type": "effect", "_id": "p6V4k4yMwJ1UPZMz", "systemPath": "actions", - "description": "

Spend a Fear to summon a @UUID[Compendium.daggerheart.adversaries.Actor.sRn4bqerfARvhgSV]{Minor Chaos Elemental} drawn to the echoes of violence and discord. They appear within Far range of a chosen PC and immediately take the spotlight.

What color does the grass turn as the elemental appears? How does the chaos warp insects and small wildlife within the grove?

", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/environments/environment_Ambushers_uXZpebPR77YQ1oXI.json b/src/packs/environments/environment_Ambushers_uXZpebPR77YQ1oXI.json index e8ba889a..582e7ec0 100644 --- a/src/packs/environments/environment_Ambushers_uXZpebPR77YQ1oXI.json +++ b/src/packs/environments/environment_Ambushers_uXZpebPR77YQ1oXI.json @@ -35,12 +35,9 @@ "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 }, @@ -91,7 +88,7 @@ "saturation": 0, "contrast": 0 }, - "detectionModes": [], + "detectionModes": {}, "occludable": { "radius": 0 }, @@ -117,7 +114,8 @@ "flags": {}, "randomImg": false, "appendNumber": false, - "prependAdjective": false + "prependAdjective": false, + "depth": 1 }, "items": [ { @@ -156,7 +154,7 @@ "type": "effect", "_id": "6DKa1Pm605HpChPd", "systemPath": "actions", - "description": "

When a PC starts the ambush on unsuspecting adversaries, you lose 2 Fear and the first attack roll a PC makes has advantage.

What are the adversaries in the middle of doing when the ambush starts? How does this impact their approach to the fight?

", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ 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 86d3eff4..95266957 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 @@ -264,12 +264,6 @@ "_id": "gCkqvBUljsOsYacB", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/environments/environment_Castle_Siege_1eZ32Esq7rfZOjlu.json b/src/packs/environments/environment_Castle_Siege_1eZ32Esq7rfZOjlu.json index 190d78b1..0df61deb 100644 --- a/src/packs/environments/environment_Castle_Siege_1eZ32Esq7rfZOjlu.json +++ b/src/packs/environments/environment_Castle_Siege_1eZ32Esq7rfZOjlu.json @@ -330,7 +330,7 @@ "type": "attack", "_id": "r5JN5oFYL5DC6Qqw", "systemPath": "actions", - "description": "

When an adversary is defeated, you can spend a Fear to have a stray attack from a siege weapon hit a point on the battlefield. All targets within Very Close range of that point must make an Agility Reaction Roll.

  • Targets who fail take 3d8+3 physical or magic damage and must mark a Stress.

  • Targets who succeed must mark a Stress.

What debris is scattered by the attack? What is broken by the strike that can’t be easily mended?

", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json b/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json index ef367d67..c65ede29 100644 --- a/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json +++ b/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json @@ -45,12 +45,9 @@ "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 }, @@ -101,7 +98,7 @@ "saturation": 0, "contrast": 0 }, - "detectionModes": [], + "detectionModes": {}, "occludable": { "radius": 0 }, @@ -127,7 +124,8 @@ "flags": {}, "randomImg": false, "appendNumber": false, - "prependAdjective": false + "prependAdjective": false, + "depth": 1 }, "items": [ { @@ -204,7 +202,7 @@ "type": "damage", "_id": "p1UiGEiGyl6r7PrA", "systemPath": "actions", - "description": "

Previous climbers left behind large metal rods that climbers can use to aid their ascent. If a PC using the pitons fails an action roll to climb, they can mark a Stress instead of ticking the countdown up.

What do the shape and material of these pitons tell you about the previous climbers? How far apart are they from one another?

", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -435,7 +433,7 @@ "type": "effect", "_id": "M8MfD2qBfYCwNKvH", "systemPath": "actions", - "description": "

Spend a Fear to have a PC’s handhold fail, plummeting them toward the ground. If they aren’t saved on the next action, they hit the ground and tick up the countdown by 2. The PC takes 1d12 physical damage if the countdown is between 8 and 12, 2d12 between 4 and 7, and 3d12 at 3 or lower.

How can you tell many others have fallen here before? What lives in these walls that might try to scare adventurers into falling for an easy meal?

", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/environments/environment_Cult_Ritual_QAXXiOKBDmCTauHD.json b/src/packs/environments/environment_Cult_Ritual_QAXXiOKBDmCTauHD.json index 1295db59..e3e90c26 100644 --- a/src/packs/environments/environment_Cult_Ritual_QAXXiOKBDmCTauHD.json +++ b/src/packs/environments/environment_Cult_Ritual_QAXXiOKBDmCTauHD.json @@ -45,12 +45,9 @@ "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 }, @@ -101,7 +98,7 @@ "saturation": 0, "contrast": 0 }, - "detectionModes": [], + "detectionModes": {}, "occludable": { "radius": 0 }, @@ -127,7 +124,8 @@ "flags": {}, "randomImg": false, "appendNumber": false, - "prependAdjective": false + "prependAdjective": false, + "depth": 1 }, "items": [ { @@ -183,21 +181,15 @@ "_id": "8yNIw8Y7rfMdOqWC", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.rules.dualityRoll.defaultHopeDice", + "type": "override", + "value": "d10", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.rules.dualityRoll.defaultHopeDice", - "mode": 5, - "value": "d10", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -242,7 +234,7 @@ "type": "effect", "_id": "EATw4ZkcuGeDfgLZ", "systemPath": "actions", - "description": "

A portion of the ritual’s power is diverted into a cult member to fight off interlopers. Choose one adversary to become Imbued with terrible magic until the scene ends or they’re defeated. An Imbued adversary immediately takes the spotlight and gains one of the following benefits, or all three if you spend a Fear:

  • They gain advantage on all attacks.

  • They deal an extra 1d10 damage on a successful attack.

  • They gain the following feature: Relentless (2) - Passive. This adversary can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

How does the enemy change in appearance? What fears do their blows bring to the surface?

", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -285,23 +277,14 @@ "_id": "dYQBQq1xIysM0qLo", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { - "startTime": null, - "combat": null, - "seconds": null, - "rounds": null, - "turns": null, - "startRound": null, - "startTurn": null + "value": null, + "units": "seconds", + "expiry": null, + "expired": false }, "description": "

An Imbued adversary immediately takes the spotlight and gains one of the following benefits, or all three if you spend a Fear:

  • They gain advantage on all attacks.

  • They deal an extra 1d10 damage on a successful attack.

  • They gain the following feature: Relentless (2) - Passive. This adversary can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

How does the enemy change in appearance? What fears do their blows bring to the surface?

", "tint": "#ffffff", @@ -311,6 +294,9 @@ "_stats": { "compendiumSource": null }, + "start": null, + "showIcon": 1, + "folder": null, "_key": "!actors.items.effects!QAXXiOKBDmCTauHD.0Rgqw1kUPeJ11ldd.dYQBQq1xIysM0qLo" }, { @@ -321,36 +307,27 @@ "_id": "Hxw5lXE77bGzuaOu", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.physical.dice", + "type": "add", + "value": "1d10", + "priority": null + }, + { + "key": "system.bonuses.damage.magical.dice", + "type": "add", + "value": "1d10", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.damage.physical.dice", - "mode": 2, - "value": "1d10", - "priority": null - }, - { - "key": "system.bonuses.damage.magical.dice", - "mode": 2, - "value": "1d10", - "priority": null - } - ], "disabled": true, "duration": { - "startTime": null, - "combat": null, - "seconds": null, - "rounds": null, - "turns": null, - "startRound": null, - "startTurn": null + "value": null, + "units": "seconds", + "expiry": null, + "expired": false }, "description": "", "tint": "#ffffff", @@ -360,6 +337,9 @@ "_stats": { "compendiumSource": null }, + "start": null, + "showIcon": 1, + "folder": null, "_key": "!actors.items.effects!QAXXiOKBDmCTauHD.0Rgqw1kUPeJ11ldd.Hxw5lXE77bGzuaOu" } ], diff --git a/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json b/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json index 637cdd41..339ac5cd 100644 --- a/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json +++ b/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json @@ -397,14 +397,8 @@ "_id": "znFFS76Nopwb8Yi7", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, @@ -428,39 +422,33 @@ "_id": "i3KYskkA9D4GHbXi", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.difficulty", + "type": "add", + "value": "0", + "priority": null + }, + { + "key": "system.bonuses.damage.physical.bonus", + "type": "add", + "value": "0", + "priority": null + }, + { + "key": "system.bonuses.damage.magical.bonus", + "type": "add", + "value": "0", + "priority": null + }, + { + "key": "system.bonuses.roll.attack.bonus", + "type": "add", + "value": "0", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.difficulty", - "mode": 2, - "value": "0", - "priority": null - }, - { - "key": "system.bonuses.damage.physical.bonus", - "mode": 2, - "value": "0", - "priority": null - }, - { - "key": "system.bonuses.damage.magical.bonus", - "mode": 2, - "value": "0", - "priority": null - }, - { - "key": "system.bonuses.roll.attack.bonus", - "mode": 2, - "value": "0", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/environments/environment_Hallowed_Temple_dsA6j69AnaJhUyqH.json b/src/packs/environments/environment_Hallowed_Temple_dsA6j69AnaJhUyqH.json index c510a87f..d8b04d22 100644 --- a/src/packs/environments/environment_Hallowed_Temple_dsA6j69AnaJhUyqH.json +++ b/src/packs/environments/environment_Hallowed_Temple_dsA6j69AnaJhUyqH.json @@ -44,12 +44,9 @@ "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 }, @@ -100,7 +97,7 @@ "saturation": 0, "contrast": 0 }, - "detectionModes": [], + "detectionModes": {}, "occludable": { "radius": 0 }, @@ -126,7 +123,8 @@ "flags": {}, "randomImg": false, "appendNumber": false, - "prependAdjective": false + "prependAdjective": false, + "depth": 1 }, "items": [ { @@ -140,7 +138,7 @@ "type": "healing", "_id": "uLCoTKa7Jn2HaRqR", "systemPath": "actions", - "description": "

A PC who takes a rest in the Hallowed Temple automatically clears all HP.

What does the incense smell like? What kinds of songs do the acolytes sing?

", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -337,7 +335,7 @@ "type": "effect", "_id": "pJVipg7CbA9CB0Um", "systemPath": "actions", - "description": "

When the PCs have trespassed, blasphemed, or offended the clergy, you can spend a Fear to summon a @UUID[Compendium.daggerheart.adversaries.Actor.r1mbfSSwKWdcFdAU]{High Seraph} and [[/r 1d4]] @UUID[Compendium.daggerheart.adversaries.Actor.B4LZcGuBAHzyVdzy]{Bladed Guard} within Close range of the senior priest to reinforce their will.

What symbols or icons do they bear that signal they are anointed agents of the divinity? Who leads the group and what led them to this calling?

", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/environments/environment_Haunted_City_OzYbizKraK92FDiI.json b/src/packs/environments/environment_Haunted_City_OzYbizKraK92FDiI.json index 1bd07a57..bbc3ef0a 100644 --- a/src/packs/environments/environment_Haunted_City_OzYbizKraK92FDiI.json +++ b/src/packs/environments/environment_Haunted_City_OzYbizKraK92FDiI.json @@ -44,12 +44,9 @@ "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 }, @@ -100,7 +97,7 @@ "saturation": 0, "contrast": 0 }, - "detectionModes": [], + "detectionModes": {}, "occludable": { "radius": 0 }, @@ -126,7 +123,8 @@ "flags": {}, "randomImg": false, "appendNumber": false, - "prependAdjective": false + "prependAdjective": false, + "depth": 1 }, "items": [ { @@ -203,21 +201,15 @@ "_id": "S9gl4jqdrziC1F0h", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.resistance.physical.resistance", + "type": "override", + "value": "1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.resistance.physical.resistance", - "mode": 5, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -288,7 +280,7 @@ "type": "countdown", "_id": "VhqZKDA4032i8zY3", "systemPath": "actions", - "description": "

Spend a Fear to manifest the echo of a past disaster that ravaged the city. Activate a Progress Countdown (5) as the disaster replays around the PCs. To complete the countdown and escape the catastrophe, the PCs must overcome threats such as rampaging fires, stampeding civilians, collapsing buildings, or crumbling streets, while recalling history and finding clues to escape the inevitable.

Is this the disaster that led the city to be abandoned? What is known about this disaster and how could that help the PCs escape?

", + "description": "", "chatDisplay": true, "originItem": { "type": "itemCollection" diff --git a/src/packs/environments/environment_Imperial_Court_jr1xAoXzVwVblzxI.json b/src/packs/environments/environment_Imperial_Court_jr1xAoXzVwVblzxI.json index 5807d43c..93851e3c 100644 --- a/src/packs/environments/environment_Imperial_Court_jr1xAoXzVwVblzxI.json +++ b/src/packs/environments/environment_Imperial_Court_jr1xAoXzVwVblzxI.json @@ -46,12 +46,9 @@ "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 }, @@ -102,7 +99,7 @@ "saturation": 0, "contrast": 0 }, - "detectionModes": [], + "detectionModes": {}, "occludable": { "radius": 0 }, @@ -128,7 +125,8 @@ "flags": {}, "randomImg": false, "appendNumber": false, - "prependAdjective": false + "prependAdjective": false, + "depth": 1 }, "items": [ { @@ -297,7 +295,7 @@ "type": "attack", "_id": "9ipckCFMz9DVw8ab", "systemPath": "actions", - "description": "

Spend a Fear to tick down a long-term countdown related to the empire’s agenda by [[/r 1d4]]. If this triggers the countdown, a proclamation related to the agenda is announced at court as the plan is executed.

What display of power or transfer of wealth was needed to expedite this plan? Whose lives were disrupted or upended to make this happen?

", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/environments/environment_Necromancer_s_Ossuary_h3KyRL7AshhLAmcH.json b/src/packs/environments/environment_Necromancer_s_Ossuary_h3KyRL7AshhLAmcH.json index 299e8729..3d87930c 100644 --- a/src/packs/environments/environment_Necromancer_s_Ossuary_h3KyRL7AshhLAmcH.json +++ b/src/packs/environments/environment_Necromancer_s_Ossuary_h3KyRL7AshhLAmcH.json @@ -137,7 +137,7 @@ "type": "damage", "_id": "jVY198vniaTSlgsX", "systemPath": "actions", - "description": "

A feature or action that clears HP requires spending a Hope to use. If it already costs Hope, a PC must spend an additional Hope.

What does it feel like to try to heal in a place so antithetical to life?

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

All targets within Close range of a point you choose in this environment must succeed on an Agility Reaction Roll or take 4d8+8 physical damage from skeletal shrapnel as part of the ossuary detonates around them.

What ancient skeletal architecture is destroyed? What bones stick in your armor?

", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -421,7 +421,7 @@ "type": "effect", "_id": "hFeTdiHWeCYkb8Hg", "systemPath": "actions", - "description": "

Spend a Fear to summon [[/r 1d6]] @UUID[Compendium.daggerheart.adversaries.Actor.gP3fWTLzSFnpA8EJ]{Rotted Zombie}, two @UUID[Compendium.daggerheart.adversaries.Actor.CP6iRfHdyFWniTHY]{Perfected Zombie}, or a @UUID[Compendium.daggerheart.adversaries.Actor.YhJrP7rTBiRdX5Fp]{Zombie Legion}, who appear at Close range of a chosen PC.

Who were these people before they became the necromancer’s pawns? What vestiges of those lives remain for the heroes to see?

", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/environments/environment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json b/src/packs/environments/environment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json index 42fbd8f9..120b92a0 100644 --- a/src/packs/environments/environment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json +++ b/src/packs/environments/environment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json @@ -199,7 +199,7 @@ "type": "attack", "_id": "1giAFbu3tGqXwi8g", "systemPath": "actions", - "description": "

Spend a Fear as a mage from one side uses large-scale destructive magic. Pick a point on the battlefield within Very Far range of the mage. All targets within Close range of that point must make an Agility Reaction Roll. Targets who fail take 3d12+8 magic damage and must mark a Stress.

What form does the attack take—fireball raining acid a storm of blades? What tactical objective is this attack meant to accomplish and what comes next?

", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json b/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json index 6c87c446..21e1bbe5 100644 --- a/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json +++ b/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json @@ -310,12 +310,6 @@ "_id": "T0ouSQyR8cVpAn79", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", 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..53f9bf79 100644 --- a/src/packs/items/armors/armor_Advanced_Chainmail_Armor_LzLOJ9EVaHWAjoq9.json +++ b/src/packs/items/armors/armor_Advanced_Chainmail_Armor_LzLOJ9EVaHWAjoq9.json @@ -45,7 +45,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-1" } ], 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..5fde7416 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 @@ -45,12 +45,12 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-2" }, { "key": "system.traits.agility.value", - "mode": 2, + "type": "add", "value": "-1" } ], 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..fe6a96fb 100644 --- a/src/packs/items/armors/armor_Advanced_Gambeson_Armor_epkAmlZVk7HOfUUT.json +++ b/src/packs/items/armors/armor_Advanced_Gambeson_Armor_epkAmlZVk7HOfUUT.json @@ -45,7 +45,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "1" } ], 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..8df5162f 100644 --- a/src/packs/items/armors/armor_Bellamoi_Fine_Armor_WuoVwZA53XRAIt6d.json +++ b/src/packs/items/armors/armor_Bellamoi_Fine_Armor_WuoVwZA53XRAIt6d.json @@ -45,7 +45,7 @@ "changes": [ { "key": "system.traits.presence.value", - "mode": 2, + "type": "add", "value": "1" } ], diff --git a/src/packs/items/armors/armor_Bladefare_Armor_mNN6pvcsS10ChrWF.json b/src/packs/items/armors/armor_Bladefare_Armor_mNN6pvcsS10ChrWF.json index 4ee73939..70a8b229 100644 --- a/src/packs/items/armors/armor_Bladefare_Armor_mNN6pvcsS10ChrWF.json +++ b/src/packs/items/armors/armor_Bladefare_Armor_mNN6pvcsS10ChrWF.json @@ -45,7 +45,7 @@ "changes": [ { "key": "system.rules.damageReduction.physical", - "mode": 5, + "type": "override", "value": "1" } ], diff --git a/src/packs/items/armors/armor_Chainmail_Armor_haULhuEg37zUUvhb.json b/src/packs/items/armors/armor_Chainmail_Armor_haULhuEg37zUUvhb.json index 4f0719a7..c41978b9 100644 --- a/src/packs/items/armors/armor_Chainmail_Armor_haULhuEg37zUUvhb.json +++ b/src/packs/items/armors/armor_Chainmail_Armor_haULhuEg37zUUvhb.json @@ -45,7 +45,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-1" } ], diff --git a/src/packs/items/armors/armor_Channeling_Armor_vMJxEWz1srfwMsoj.json b/src/packs/items/armors/armor_Channeling_Armor_vMJxEWz1srfwMsoj.json index e805d5d1..9f24ee70 100644 --- a/src/packs/items/armors/armor_Channeling_Armor_vMJxEWz1srfwMsoj.json +++ b/src/packs/items/armors/armor_Channeling_Armor_vMJxEWz1srfwMsoj.json @@ -45,7 +45,7 @@ "changes": [ { "key": "system.bonuses.roll.spellcast", - "mode": 2, + "type": "add", "value": "1" } ], 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..d8de4497 100644 --- a/src/packs/items/armors/armor_Elundrian_Chain_Armor_Q6LxmtFetDDkoZVZ.json +++ b/src/packs/items/armors/armor_Elundrian_Chain_Armor_Q6LxmtFetDDkoZVZ.json @@ -45,7 +45,7 @@ "changes": [ { "key": "system.resistance.magical.reduction", - "mode": 2, + "type": "add", "value": "@system.armorScore", "priority": 21 } 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..acc8c125 100644 --- a/src/packs/items/armors/armor_Full_Fortified_Armor_7emTSt6nhZuTlvt5.json +++ b/src/packs/items/armors/armor_Full_Fortified_Armor_7emTSt6nhZuTlvt5.json @@ -45,7 +45,7 @@ "changes": [ { "key": "system.rules.damageReduction.increasePerArmorMark", - "mode": 5, + "type": "override", "value": "2" } ], 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..7d08e57e 100644 --- a/src/packs/items/armors/armor_Full_Plate_Armor_UdUJNa31WxFW2noa.json +++ b/src/packs/items/armors/armor_Full_Plate_Armor_UdUJNa31WxFW2noa.json @@ -45,12 +45,12 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-2" }, { "key": "system.traits.agility.value", - "mode": 2, + "type": "add", "value": "-1" } ], diff --git a/src/packs/items/armors/armor_Gambeson_Armor_yJFp1bfpecDcStVK.json b/src/packs/items/armors/armor_Gambeson_Armor_yJFp1bfpecDcStVK.json index 0ede5b60..0ab7203b 100644 --- a/src/packs/items/armors/armor_Gambeson_Armor_yJFp1bfpecDcStVK.json +++ b/src/packs/items/armors/armor_Gambeson_Armor_yJFp1bfpecDcStVK.json @@ -45,7 +45,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "1" } ], 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..c87b1f51 100644 --- a/src/packs/items/armors/armor_Improved_Chainmail_Armor_K5WkjS0NGqHYmhU3.json +++ b/src/packs/items/armors/armor_Improved_Chainmail_Armor_K5WkjS0NGqHYmhU3.json @@ -45,7 +45,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-1" } ], 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..85b4ed88 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 @@ -45,12 +45,12 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-2" }, { "key": "system.traits.agility.value", - "mode": 2, + "type": "add", "value": "-1" } ], 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..4f2f3c2b 100644 --- a/src/packs/items/armors/armor_Improved_Gambeson_Armor_jphnMZjnS2FkOH3s.json +++ b/src/packs/items/armors/armor_Improved_Gambeson_Armor_jphnMZjnS2FkOH3s.json @@ -45,7 +45,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "1" } ], 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..d73d5e45 100644 --- a/src/packs/items/armors/armor_Irontree_Breastplate_Armor_tzZntboNtHL5C6VM.json +++ b/src/packs/items/armors/armor_Irontree_Breastplate_Armor_tzZntboNtHL5C6VM.json @@ -45,13 +45,13 @@ "changes": [ { "key": "system.damageThresholds.major", - "mode": 2, + "type": "add", "value": "2", "priority": null }, { "key": "system.damageThresholds.severe", - "mode": 2, + "type": "add", "value": "2", "priority": null } 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..472b243c 100644 --- a/src/packs/items/armors/armor_Legendary_Chainmail_Armor_EsIN5OLKe9ZYFNXZ.json +++ b/src/packs/items/armors/armor_Legendary_Chainmail_Armor_EsIN5OLKe9ZYFNXZ.json @@ -45,7 +45,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-1" } ], 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..52f52882 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 @@ -45,12 +45,12 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-2" }, { "key": "system.traits.agility.value", - "mode": 2, + "type": "add", "value": "-1" } ], 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..a703c7c7 100644 --- a/src/packs/items/armors/armor_Legendary_Gambeson_Armor_c6tMXz4rPf9ioQrf.json +++ b/src/packs/items/armors/armor_Legendary_Gambeson_Armor_c6tMXz4rPf9ioQrf.json @@ -45,7 +45,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "1" } ], 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..a160aeee 100644 --- a/src/packs/items/armors/armor_Monett_s_Cloak_AQzU2RsqS5V5bd1v.json +++ b/src/packs/items/armors/armor_Monett_s_Cloak_AQzU2RsqS5V5bd1v.json @@ -45,7 +45,7 @@ "changes": [ { "key": "system.rules.damageReduction.magical", - "mode": 5, + "type": "override", "value": "1" } ], diff --git a/src/packs/items/armors/armor_Savior_Chainmail_8X16lJQ3xltTwynm.json b/src/packs/items/armors/armor_Savior_Chainmail_8X16lJQ3xltTwynm.json index 6826254a..0a7f55ba 100644 --- a/src/packs/items/armors/armor_Savior_Chainmail_8X16lJQ3xltTwynm.json +++ b/src/packs/items/armors/armor_Savior_Chainmail_8X16lJQ3xltTwynm.json @@ -45,37 +45,37 @@ "changes": [ { "key": "system.traits.agility.value", - "mode": 2, + "type": "add", "value": "-1" }, { "key": "system.traits.strength.value", - "mode": 2, + "type": "add", "value": "-1" }, { "key": "system.traits.finesse.value", - "mode": 2, + "type": "add", "value": "-1" }, { "key": "system.traits.instinct.value", - "mode": 2, + "type": "add", "value": "-1" }, { "key": "system.traits.presence.value", - "mode": 2, + "type": "add", "value": "-1" }, { "key": "system.traits.knowledge.value", - "mode": 2, + "type": "add", "value": "-1" }, { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-1" } ], 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..8f91f92b 100644 --- a/src/packs/items/armors/armor_Spiked_Plate_Armor_QjwsIhXKqnlvRBMv.json +++ b/src/packs/items/armors/armor_Spiked_Plate_Armor_QjwsIhXKqnlvRBMv.json @@ -45,12 +45,12 @@ "changes": [ { "key": "system.bonuses.damage.primaryWeapon.dice", - "mode": 2, + "type": "add", "value": "1d4" }, { "key": "system.bonuses.damage.secondaryWeapon.dice", - "mode": 2, + "type": "add", "value": "1d4" } ], diff --git a/src/packs/items/consumables/consumable_Attune_Potion_JGD3M9hBHtVAA8XP.json b/src/packs/items/consumables/consumable_Attune_Potion_JGD3M9hBHtVAA8XP.json index e034976a..d17ae550 100644 --- a/src/packs/items/consumables/consumable_Attune_Potion_JGD3M9hBHtVAA8XP.json +++ b/src/packs/items/consumables/consumable_Attune_Potion_JGD3M9hBHtVAA8XP.json @@ -63,7 +63,7 @@ "changes": [ { "key": "system.traits.instinct.value", - "mode": 2, + "type": "add", "value": "1", "priority": null } diff --git a/src/packs/items/consumables/consumable_Bolster_Potion_FOPQNqXbiVO0ilYL.json b/src/packs/items/consumables/consumable_Bolster_Potion_FOPQNqXbiVO0ilYL.json index 421acdc3..d200d825 100644 --- a/src/packs/items/consumables/consumable_Bolster_Potion_FOPQNqXbiVO0ilYL.json +++ b/src/packs/items/consumables/consumable_Bolster_Potion_FOPQNqXbiVO0ilYL.json @@ -63,7 +63,7 @@ "changes": [ { "key": "system.traits.strength.value", - "mode": 2, + "type": "add", "value": "1", "priority": null } diff --git a/src/packs/items/consumables/consumable_Charm_Potion_CVBbFfOY75YwyQsp.json b/src/packs/items/consumables/consumable_Charm_Potion_CVBbFfOY75YwyQsp.json index f1d7b058..015f334e 100644 --- a/src/packs/items/consumables/consumable_Charm_Potion_CVBbFfOY75YwyQsp.json +++ b/src/packs/items/consumables/consumable_Charm_Potion_CVBbFfOY75YwyQsp.json @@ -63,7 +63,7 @@ "changes": [ { "key": "system.traits.presence.value", - "mode": 2, + "type": "add", "value": "1", "priority": null } diff --git a/src/packs/items/consumables/consumable_Control_Potion_eeBhZSGLjuNZuJuI.json b/src/packs/items/consumables/consumable_Control_Potion_eeBhZSGLjuNZuJuI.json index 2c6b9a93..dbb6b796 100644 --- a/src/packs/items/consumables/consumable_Control_Potion_eeBhZSGLjuNZuJuI.json +++ b/src/packs/items/consumables/consumable_Control_Potion_eeBhZSGLjuNZuJuI.json @@ -63,7 +63,7 @@ "changes": [ { "key": "system.traits.finesse.value", - "mode": 2, + "type": "add", "value": "1", "priority": null } diff --git a/src/packs/items/consumables/consumable_Death_Tea_xDnJeF1grkmKck8Q.json b/src/packs/items/consumables/consumable_Death_Tea_xDnJeF1grkmKck8Q.json index 5fbae976..c3140964 100644 --- a/src/packs/items/consumables/consumable_Death_Tea_xDnJeF1grkmKck8Q.json +++ b/src/packs/items/consumables/consumable_Death_Tea_xDnJeF1grkmKck8Q.json @@ -60,14 +60,8 @@ "_id": "IqlpqsgurXsUEQhs", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/items/consumables/consumable_Enlighten_Potion_aWHSO2AqDufi7nL4.json b/src/packs/items/consumables/consumable_Enlighten_Potion_aWHSO2AqDufi7nL4.json index bff70126..5d9712b1 100644 --- a/src/packs/items/consumables/consumable_Enlighten_Potion_aWHSO2AqDufi7nL4.json +++ b/src/packs/items/consumables/consumable_Enlighten_Potion_aWHSO2AqDufi7nL4.json @@ -63,7 +63,7 @@ "changes": [ { "key": "system.traits.knowledge.value", - "mode": 2, + "type": "add", "value": "1", "priority": null } diff --git a/src/packs/items/consumables/consumable_Featherbone_DpxEMpwfasEBpORU.json b/src/packs/items/consumables/consumable_Featherbone_DpxEMpwfasEBpORU.json index 9b5bd0df..60801419 100644 --- a/src/packs/items/consumables/consumable_Featherbone_DpxEMpwfasEBpORU.json +++ b/src/packs/items/consumables/consumable_Featherbone_DpxEMpwfasEBpORU.json @@ -60,14 +60,8 @@ "_id": "VfJIJBW96e45xQHY", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/items/consumables/consumable_Gill_Salve_Nvbb9mze6o5D0AEg.json b/src/packs/items/consumables/consumable_Gill_Salve_Nvbb9mze6o5D0AEg.json index 890c61e4..2e0ac7b6 100644 --- a/src/packs/items/consumables/consumable_Gill_Salve_Nvbb9mze6o5D0AEg.json +++ b/src/packs/items/consumables/consumable_Gill_Salve_Nvbb9mze6o5D0AEg.json @@ -60,14 +60,8 @@ "_id": "5rL9CY5GO9SJcEZq", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/items/consumables/consumable_Grindletooth_Venom_8WkhvSzeOmLdnoLJ.json b/src/packs/items/consumables/consumable_Grindletooth_Venom_8WkhvSzeOmLdnoLJ.json index 70291404..22cc7723 100644 --- a/src/packs/items/consumables/consumable_Grindletooth_Venom_8WkhvSzeOmLdnoLJ.json +++ b/src/packs/items/consumables/consumable_Grindletooth_Venom_8WkhvSzeOmLdnoLJ.json @@ -60,21 +60,15 @@ "_id": "yx4ZkXeuXgw2KvV4", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.physical.dice", + "type": "add", + "value": "1d6", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.damage.physical.dice", - "mode": 2, - "value": "1d6", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/items/consumables/consumable_Homet_s_Secret_Potion_VSwa1LpQ9PjZKsWF.json b/src/packs/items/consumables/consumable_Homet_s_Secret_Potion_VSwa1LpQ9PjZKsWF.json index 00eb03f1..9b88b267 100644 --- a/src/packs/items/consumables/consumable_Homet_s_Secret_Potion_VSwa1LpQ9PjZKsWF.json +++ b/src/packs/items/consumables/consumable_Homet_s_Secret_Potion_VSwa1LpQ9PjZKsWF.json @@ -60,14 +60,8 @@ "_id": "QyzXAnvho7lVQQtP", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/items/consumables/consumable_Improved_Grindletooth_Venom_BqBWXXe9T07AMV4u.json b/src/packs/items/consumables/consumable_Improved_Grindletooth_Venom_BqBWXXe9T07AMV4u.json index 560644b3..3e5907d8 100644 --- a/src/packs/items/consumables/consumable_Improved_Grindletooth_Venom_BqBWXXe9T07AMV4u.json +++ b/src/packs/items/consumables/consumable_Improved_Grindletooth_Venom_BqBWXXe9T07AMV4u.json @@ -60,21 +60,15 @@ "_id": "P7tbNjq58bQ9R1Cc", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.physical.dice", + "type": "add", + "value": "1d8", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.damage.physical.dice", - "mode": 2, - "value": "1d8", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/items/consumables/consumable_Major_Attune_Potion_CCPFm5iXXwvyYYwR.json b/src/packs/items/consumables/consumable_Major_Attune_Potion_CCPFm5iXXwvyYYwR.json index b27fee91..784ed534 100644 --- a/src/packs/items/consumables/consumable_Major_Attune_Potion_CCPFm5iXXwvyYYwR.json +++ b/src/packs/items/consumables/consumable_Major_Attune_Potion_CCPFm5iXXwvyYYwR.json @@ -63,7 +63,7 @@ "changes": [ { "key": "system.traits.instinct.value", - "mode": 2, + "type": "add", "value": "1", "priority": null } diff --git a/src/packs/items/consumables/consumable_Major_Bolster_Potion_mnyQDRtngWWQeRXF.json b/src/packs/items/consumables/consumable_Major_Bolster_Potion_mnyQDRtngWWQeRXF.json index 95cd6c92..fc35ef93 100644 --- a/src/packs/items/consumables/consumable_Major_Bolster_Potion_mnyQDRtngWWQeRXF.json +++ b/src/packs/items/consumables/consumable_Major_Bolster_Potion_mnyQDRtngWWQeRXF.json @@ -63,7 +63,7 @@ "changes": [ { "key": "system.traits.strength.value", - "mode": 2, + "type": "add", "value": "1", "priority": null } diff --git a/src/packs/items/consumables/consumable_Major_Charm_Potion_IJLAUlQymbSjzsri.json b/src/packs/items/consumables/consumable_Major_Charm_Potion_IJLAUlQymbSjzsri.json index c7e22aeb..c70ff759 100644 --- a/src/packs/items/consumables/consumable_Major_Charm_Potion_IJLAUlQymbSjzsri.json +++ b/src/packs/items/consumables/consumable_Major_Charm_Potion_IJLAUlQymbSjzsri.json @@ -63,7 +63,7 @@ "changes": [ { "key": "system.traits.presence.value", - "mode": 2, + "type": "add", "value": "1", "priority": null } diff --git a/src/packs/items/consumables/consumable_Major_Control_Potion_80s1FLmTLtohZ5GH.json b/src/packs/items/consumables/consumable_Major_Control_Potion_80s1FLmTLtohZ5GH.json index 1dabf6c6..3f8786d2 100644 --- a/src/packs/items/consumables/consumable_Major_Control_Potion_80s1FLmTLtohZ5GH.json +++ b/src/packs/items/consumables/consumable_Major_Control_Potion_80s1FLmTLtohZ5GH.json @@ -63,7 +63,7 @@ "changes": [ { "key": "system.traits.finesse.value", - "mode": 2, + "type": "add", "value": "1", "priority": null } diff --git a/src/packs/items/consumables/consumable_Major_Enlighten_Potion_SDdv1G2veMLKrxcJ.json b/src/packs/items/consumables/consumable_Major_Enlighten_Potion_SDdv1G2veMLKrxcJ.json index 5a9a2d28..ea3e4ffc 100644 --- a/src/packs/items/consumables/consumable_Major_Enlighten_Potion_SDdv1G2veMLKrxcJ.json +++ b/src/packs/items/consumables/consumable_Major_Enlighten_Potion_SDdv1G2veMLKrxcJ.json @@ -63,7 +63,7 @@ "changes": [ { "key": "system.traits.knowledge.value", - "mode": 2, + "type": "add", "value": "1", "priority": null } diff --git a/src/packs/items/consumables/consumable_Morphing_Clay_f1NHVSIHJJCIOaBl.json b/src/packs/items/consumables/consumable_Morphing_Clay_f1NHVSIHJJCIOaBl.json index 90dd4fdc..b7f44fea 100644 --- a/src/packs/items/consumables/consumable_Morphing_Clay_f1NHVSIHJJCIOaBl.json +++ b/src/packs/items/consumables/consumable_Morphing_Clay_f1NHVSIHJJCIOaBl.json @@ -60,12 +60,6 @@ "_id": "rMno0zO5Cbwlu4zn", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "shortRest" diff --git a/src/packs/items/consumables/consumable_Mythic_Dust_Zsh2AvZr8EkGtLyw.json b/src/packs/items/consumables/consumable_Mythic_Dust_Zsh2AvZr8EkGtLyw.json index 342bf60b..596b5ac8 100644 --- a/src/packs/items/consumables/consumable_Mythic_Dust_Zsh2AvZr8EkGtLyw.json +++ b/src/packs/items/consumables/consumable_Mythic_Dust_Zsh2AvZr8EkGtLyw.json @@ -60,21 +60,15 @@ "_id": "L68lFhuWdS3ppDxR", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.magical.dice", + "type": "add", + "value": "1d12", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.damage.magical.dice", - "mode": 2, - "value": "1d12", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/items/consumables/consumable_Ogre_Musk_qr1bosjFcUfuwq4B.json b/src/packs/items/consumables/consumable_Ogre_Musk_qr1bosjFcUfuwq4B.json index 59e51e80..6e384417 100644 --- a/src/packs/items/consumables/consumable_Ogre_Musk_qr1bosjFcUfuwq4B.json +++ b/src/packs/items/consumables/consumable_Ogre_Musk_qr1bosjFcUfuwq4B.json @@ -60,12 +60,6 @@ "_id": "n73d0J4oMCBIPWHN", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "shortRest" diff --git a/src/packs/items/consumables/consumable_Potion_of_Stability_dvL8oaxpEF6jKvYN.json b/src/packs/items/consumables/consumable_Potion_of_Stability_dvL8oaxpEF6jKvYN.json index ddff33f0..ecfc34ea 100644 --- a/src/packs/items/consumables/consumable_Potion_of_Stability_dvL8oaxpEF6jKvYN.json +++ b/src/packs/items/consumables/consumable_Potion_of_Stability_dvL8oaxpEF6jKvYN.json @@ -63,13 +63,13 @@ "changes": [ { "key": "system.bonuses.rest.shortRest.shortMoves", - "mode": 2, + "type": "add", "value": "1", "priority": null }, { "key": "system.bonuses.rest.longRest.longMoves", - "mode": 2, + "type": "add", "value": "1", "priority": null } diff --git a/src/packs/items/consumables/consumable_Redthorn_Saliva_s2Exl2XFuoOhtIov.json b/src/packs/items/consumables/consumable_Redthorn_Saliva_s2Exl2XFuoOhtIov.json index 69edf2df..ec8e6d5a 100644 --- a/src/packs/items/consumables/consumable_Redthorn_Saliva_s2Exl2XFuoOhtIov.json +++ b/src/packs/items/consumables/consumable_Redthorn_Saliva_s2Exl2XFuoOhtIov.json @@ -60,21 +60,15 @@ "_id": "tWf00ezdpxQQLuZ1", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.physical.dice", + "type": "add", + "value": "1d12", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.damage.physical.dice", - "mode": 2, - "value": "1d12", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/items/consumables/consumable_Stride_Potion_lNtcrkgFGOJNaroE.json b/src/packs/items/consumables/consumable_Stride_Potion_lNtcrkgFGOJNaroE.json index 76d43d33..c13af610 100644 --- a/src/packs/items/consumables/consumable_Stride_Potion_lNtcrkgFGOJNaroE.json +++ b/src/packs/items/consumables/consumable_Stride_Potion_lNtcrkgFGOJNaroE.json @@ -63,7 +63,7 @@ "changes": [ { "key": "system.traits.agility.value", - "mode": 2, + "type": "add", "value": "1", "priority": null } 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..b81a2604 100644 --- a/src/packs/items/consumables/consumable_Vial_of_Moondrip_VqEX5YwK5oL3r1t6.json +++ b/src/packs/items/consumables/consumable_Vial_of_Moondrip_VqEX5YwK5oL3r1t6.json @@ -60,12 +60,6 @@ "_id": "548KAUPcSbQLsivh", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "shortRest" diff --git a/src/packs/items/consumables/consumable_Wingsprout_n10vozlmosVR6lo4.json b/src/packs/items/consumables/consumable_Wingsprout_n10vozlmosVR6lo4.json index 1bdd4bc0..e0ea5ea5 100644 --- a/src/packs/items/consumables/consumable_Wingsprout_n10vozlmosVR6lo4.json +++ b/src/packs/items/consumables/consumable_Wingsprout_n10vozlmosVR6lo4.json @@ -60,14 +60,8 @@ "_id": "80F8gAn7ejhhNL7R", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/items/loot/loot_Arcane_Prism_Mn1eo2Mdtu1kzyxB.json b/src/packs/items/loot/loot_Arcane_Prism_Mn1eo2Mdtu1kzyxB.json index 016c7262..2a6729d2 100644 --- a/src/packs/items/loot/loot_Arcane_Prism_Mn1eo2Mdtu1kzyxB.json +++ b/src/packs/items/loot/loot_Arcane_Prism_Mn1eo2Mdtu1kzyxB.json @@ -53,7 +53,7 @@ "changes": [ { "key": "system.bonuses.roll.spellcast.bonus", - "mode": 2, + "type": "add", "value": "1", "priority": null } diff --git a/src/packs/items/loot/loot_Attune_Relic_vK6bKyQTT3m8WvMh.json b/src/packs/items/loot/loot_Attune_Relic_vK6bKyQTT3m8WvMh.json index abed8a55..60afc84c 100644 --- a/src/packs/items/loot/loot_Attune_Relic_vK6bKyQTT3m8WvMh.json +++ b/src/packs/items/loot/loot_Attune_Relic_vK6bKyQTT3m8WvMh.json @@ -23,7 +23,7 @@ "changes": [ { "key": "system.traits.instinct.value", - "mode": 2, + "type": "add", "value": "1", "priority": null } 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..44565535 100644 --- a/src/packs/items/loot/loot_Bag_of_Ficklesand_v758j4FwNVAurhYK.json +++ b/src/packs/items/loot/loot_Bag_of_Ficklesand_v758j4FwNVAurhYK.json @@ -74,14 +74,8 @@ "_id": "Ouq3xWzj5rf6olVs", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/items/loot/loot_Bolster_Relic_m3EpxlDgxn2tCDDR.json b/src/packs/items/loot/loot_Bolster_Relic_m3EpxlDgxn2tCDDR.json index d45af6dc..2d7c360e 100644 --- a/src/packs/items/loot/loot_Bolster_Relic_m3EpxlDgxn2tCDDR.json +++ b/src/packs/items/loot/loot_Bolster_Relic_m3EpxlDgxn2tCDDR.json @@ -23,7 +23,7 @@ "changes": [ { "key": "system.traits.strength.value", - "mode": 2, + "type": "add", "value": "1", "priority": null } diff --git a/src/packs/items/loot/loot_Charging_Quiver_gsUDP90d4SRtLEUn.json b/src/packs/items/loot/loot_Charging_Quiver_gsUDP90d4SRtLEUn.json index ee7d7a10..a31a4e93 100644 --- a/src/packs/items/loot/loot_Charging_Quiver_gsUDP90d4SRtLEUn.json +++ b/src/packs/items/loot/loot_Charging_Quiver_gsUDP90d4SRtLEUn.json @@ -20,27 +20,21 @@ "_id": "0zebbOsyjkm9IqE6", "img": "icons/weapons/ammunition/arrow-broadhead-glowing-orange.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.physical.bonus", + "type": "add", + "value": "@system.tier", + "priority": null + }, + { + "key": "system.bonuses.damage.magical.bonus", + "type": "add", + "value": "@system.tier", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.damage.physical.bonus", - "mode": 2, - "value": "@system.tier", - "priority": null - }, - { - "key": "system.bonuses.damage.magical.bonus", - "mode": 2, - "value": "@system.tier", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/items/loot/loot_Charm_Relic_9P9jqGSlxVCbTdLe.json b/src/packs/items/loot/loot_Charm_Relic_9P9jqGSlxVCbTdLe.json index f3313941..514df12b 100644 --- a/src/packs/items/loot/loot_Charm_Relic_9P9jqGSlxVCbTdLe.json +++ b/src/packs/items/loot/loot_Charm_Relic_9P9jqGSlxVCbTdLe.json @@ -23,7 +23,7 @@ "changes": [ { "key": "system.traits.presence.value", - "mode": 2, + "type": "add", "value": "1", "priority": null } diff --git a/src/packs/items/loot/loot_Control_Relic_QPGBDItjrRhXU6iJ.json b/src/packs/items/loot/loot_Control_Relic_QPGBDItjrRhXU6iJ.json index 254f4017..5df7b228 100644 --- a/src/packs/items/loot/loot_Control_Relic_QPGBDItjrRhXU6iJ.json +++ b/src/packs/items/loot/loot_Control_Relic_QPGBDItjrRhXU6iJ.json @@ -23,7 +23,7 @@ "changes": [ { "key": "system.traits.finesse.value", - "mode": 2, + "type": "add", "value": "1", "priority": null } diff --git a/src/packs/items/loot/loot_Enlighten_Relic_vSGx1f9SYUiA29L3.json b/src/packs/items/loot/loot_Enlighten_Relic_vSGx1f9SYUiA29L3.json index a6ca361e..a99e6b9b 100644 --- a/src/packs/items/loot/loot_Enlighten_Relic_vSGx1f9SYUiA29L3.json +++ b/src/packs/items/loot/loot_Enlighten_Relic_vSGx1f9SYUiA29L3.json @@ -23,7 +23,7 @@ "changes": [ { "key": "system.traits.knowledge.value", - "mode": 2, + "type": "add", "value": "1", "priority": null } diff --git a/src/packs/items/loot/loot_Glamour_Stone_Pj17cvdJ1XG1jv6I.json b/src/packs/items/loot/loot_Glamour_Stone_Pj17cvdJ1XG1jv6I.json index 424d7a04..0521ccd8 100644 --- a/src/packs/items/loot/loot_Glamour_Stone_Pj17cvdJ1XG1jv6I.json +++ b/src/packs/items/loot/loot_Glamour_Stone_Pj17cvdJ1XG1jv6I.json @@ -57,14 +57,8 @@ "_id": "K5SB6tfuDkdVaQYe", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/items/loot/loot_Piercing_Arrows_I63LTFD6GXHgyGpR.json b/src/packs/items/loot/loot_Piercing_Arrows_I63LTFD6GXHgyGpR.json index b87bd1b0..3d0493c4 100644 --- a/src/packs/items/loot/loot_Piercing_Arrows_I63LTFD6GXHgyGpR.json +++ b/src/packs/items/loot/loot_Piercing_Arrows_I63LTFD6GXHgyGpR.json @@ -43,27 +43,21 @@ "_id": "lRfqfbwlfxzPbE6U", "img": "icons/weapons/ammunition/arrow-broadhead-glowing-orange.webp", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.physical.bonus", + "type": "add", + "value": "@system.proficiency", + "priority": null + }, + { + "key": "system.bonuses.damage.magical.bonus", + "type": "add", + "value": "@system.proficiency", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.damage.physical.bonus", - "mode": 2, - "value": "@system.proficiency", - "priority": null - }, - { - "key": "system.bonuses.damage.magical.bonus", - "mode": 2, - "value": "@system.proficiency", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/items/loot/loot_Ring_of_Resistance_aUqRifqR5JXXa1dN.json b/src/packs/items/loot/loot_Ring_of_Resistance_aUqRifqR5JXXa1dN.json index 3668b6b7..6db909b2 100644 --- a/src/packs/items/loot/loot_Ring_of_Resistance_aUqRifqR5JXXa1dN.json +++ b/src/packs/items/loot/loot_Ring_of_Resistance_aUqRifqR5JXXa1dN.json @@ -50,27 +50,21 @@ "_id": "Sj7uGf560T7u4rlX", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.resistance.magical.resistance", + "type": "override", + "value": "1", + "priority": null + }, + { + "key": "system.resistance.physical.resistance", + "type": "override", + "value": "1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.resistance.magical.resistance", - "mode": 5, - "value": "1", - "priority": null - }, - { - "key": "system.resistance.physical.resistance", - "mode": 5, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/items/loot/loot_Ring_of_Silence_K1ysGnTpNyxPu5Au.json b/src/packs/items/loot/loot_Ring_of_Silence_K1ysGnTpNyxPu5Au.json index 3521098d..b44419e6 100644 --- a/src/packs/items/loot/loot_Ring_of_Silence_K1ysGnTpNyxPu5Au.json +++ b/src/packs/items/loot/loot_Ring_of_Silence_K1ysGnTpNyxPu5Au.json @@ -57,14 +57,8 @@ "_id": "9JSLRu7amQ4iuIO7", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/items/loot/loot_Stride_Relic_FfJISMzYATaPQPLc.json b/src/packs/items/loot/loot_Stride_Relic_FfJISMzYATaPQPLc.json index 703d8439..50917309 100644 --- a/src/packs/items/loot/loot_Stride_Relic_FfJISMzYATaPQPLc.json +++ b/src/packs/items/loot/loot_Stride_Relic_FfJISMzYATaPQPLc.json @@ -23,7 +23,7 @@ "changes": [ { "key": "system.traits.agility.value", - "mode": 2, + "type": "add", "value": "1", "priority": null } diff --git a/src/packs/items/weapons/weapon_Aantari_Bow_ijodu5yNBoMxpkHV.json b/src/packs/items/weapons/weapon_Aantari_Bow_ijodu5yNBoMxpkHV.json index 7b51d436..195d3ef9 100644 --- a/src/packs/items/weapons/weapon_Aantari_Bow_ijodu5yNBoMxpkHV.json +++ b/src/packs/items/weapons/weapon_Aantari_Bow_ijodu5yNBoMxpkHV.json @@ -113,22 +113,16 @@ "name": "Reliable", "description": "+1 to attack rolls", "img": "icons/skills/melee/strike-sword-slashing-red.webp", - "changes": [ - { - "key": "system.bonuses.roll.primaryWeapon.bonus", - "mode": 2, - "value": "1" - } - ], "_id": "nRNnU57i7RMJoklC", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.primaryWeapon.bonus", + "type": "add", + "value": "1" + } + ] }, "disabled": false, "duration": { 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..042d922a 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 @@ -112,22 +112,16 @@ "name": "Reliable", "description": "+1 to attack rolls", "img": "icons/skills/melee/strike-sword-slashing-red.webp", - "changes": [ - { - "key": "system.bonuses.roll.primaryWeapon.bonus", - "mode": 2, - "value": "1" - } - ], "_id": "VnV5X9MBMabhz47b", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.primaryWeapon.bonus", + "type": "add", + "value": "1" + } + ] }, "disabled": false, "duration": { diff --git a/src/packs/items/weapons/weapon_Advanced_Broadsword_WtQAGz0TUgz8Xg70.json b/src/packs/items/weapons/weapon_Advanced_Broadsword_WtQAGz0TUgz8Xg70.json index 4581c52f..f7e1f872 100644 --- a/src/packs/items/weapons/weapon_Advanced_Broadsword_WtQAGz0TUgz8Xg70.json +++ b/src/packs/items/weapons/weapon_Advanced_Broadsword_WtQAGz0TUgz8Xg70.json @@ -113,22 +113,16 @@ "name": "Reliable", "description": "+1 to attack rolls", "img": "icons/skills/melee/strike-sword-slashing-red.webp", - "changes": [ - { - "key": "system.bonuses.roll.primaryWeapon.bonus", - "mode": 2, - "value": "1" - } - ], "_id": "wu2AmDvgeWI3hmRQ", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.primaryWeapon.bonus", + "type": "add", + "value": "1" + } + ] }, "disabled": false, "duration": { diff --git a/src/packs/items/weapons/weapon_Advanced_Greatsword_MAC6YWTo4lzSotQc.json b/src/packs/items/weapons/weapon_Advanced_Greatsword_MAC6YWTo4lzSotQc.json index 9e04bf7a..39d1b6f2 100644 --- a/src/packs/items/weapons/weapon_Advanced_Greatsword_MAC6YWTo4lzSotQc.json +++ b/src/packs/items/weapons/weapon_Advanced_Greatsword_MAC6YWTo4lzSotQc.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-1" } ], diff --git a/src/packs/items/weapons/weapon_Advanced_Halberd_C8gQn7onAc9wsrCs.json b/src/packs/items/weapons/weapon_Advanced_Halberd_C8gQn7onAc9wsrCs.json index 6c11724c..92841972 100644 --- a/src/packs/items/weapons/weapon_Advanced_Halberd_C8gQn7onAc9wsrCs.json +++ b/src/packs/items/weapons/weapon_Advanced_Halberd_C8gQn7onAc9wsrCs.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.traits.finesse.value", - "mode": 2, + "type": "add", "value": "-1" } ], 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..1e9a6441 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 @@ -115,7 +115,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-1" } ], diff --git a/src/packs/items/weapons/weapon_Advanced_Longbow_M5CywMAyPKGgebsJ.json b/src/packs/items/weapons/weapon_Advanced_Longbow_M5CywMAyPKGgebsJ.json index 14327a8c..4bf1375d 100644 --- a/src/packs/items/weapons/weapon_Advanced_Longbow_M5CywMAyPKGgebsJ.json +++ b/src/packs/items/weapons/weapon_Advanced_Longbow_M5CywMAyPKGgebsJ.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.traits.finesse.value", - "mode": 2, + "type": "add", "value": "-1" } ], diff --git a/src/packs/items/weapons/weapon_Advanced_Shortsword_p3nz5CaGUoyuGVg0.json b/src/packs/items/weapons/weapon_Advanced_Shortsword_p3nz5CaGUoyuGVg0.json index dd48db21..2a24d0cc 100644 --- a/src/packs/items/weapons/weapon_Advanced_Shortsword_p3nz5CaGUoyuGVg0.json +++ b/src/packs/items/weapons/weapon_Advanced_Shortsword_p3nz5CaGUoyuGVg0.json @@ -113,20 +113,20 @@ "name": "Paired", "description": "Add this Secondary Weapon's tier + 1 to your primary weapon against targets within Melee range", "img": "icons/skills/melee/weapons-crossed-swords-yellow-teal.webp", - "changes": [ - { - "key": "system.bonuses.damage.primaryWeapon.bonus", - "mode": 2, - "value": "ITEM.@system.tier + 1" - } - ], "system": { "rangeDependence": { "enabled": true, "range": "melee", "target": "hostile", "type": "withinRange" - } + }, + "changes": [ + { + "key": "system.bonuses.damage.primaryWeapon.bonus", + "type": "add", + "value": "ITEM.@system.tier + 1" + } + ] }, "_id": "zQMaG3JcUWJR9k2L", "type": "base", 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..2e313ace 100644 --- a/src/packs/items/weapons/weapon_Advanced_Small_Dagger_0thN0BpN05KT8Avx.json +++ b/src/packs/items/weapons/weapon_Advanced_Small_Dagger_0thN0BpN05KT8Avx.json @@ -113,20 +113,20 @@ "name": "Paired", "description": "Add this Secondary Weapon's tier + 1 to your primary weapon against targets within Melee range", "img": "icons/skills/melee/weapons-crossed-swords-yellow-teal.webp", - "changes": [ - { - "key": "system.bonuses.damage.primaryWeapon.bonus", - "mode": 2, - "value": "ITEM.@system.tier + 1" - } - ], "system": { "rangeDependence": { "enabled": true, - "range": "melee", + "type": "withinRange", "target": "hostile", - "type": "withinRange" - } + "range": "melee" + }, + "changes": [ + { + "key": "system.bonuses.damage.primaryWeapon.bonus", + "type": "add", + "value": "ITEM.@system.tier + 1" + } + ] }, "_id": "6tJmTBsumbPmEwkY", "type": "base", diff --git a/src/packs/items/weapons/weapon_Advanced_Warhammer_8Lipw3RRKDgBVP0p.json b/src/packs/items/weapons/weapon_Advanced_Warhammer_8Lipw3RRKDgBVP0p.json index bb142281..8770ef57 100644 --- a/src/packs/items/weapons/weapon_Advanced_Warhammer_8Lipw3RRKDgBVP0p.json +++ b/src/packs/items/weapons/weapon_Advanced_Warhammer_8Lipw3RRKDgBVP0p.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-1" } ], 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..cdb26ca6 100644 --- a/src/packs/items/weapons/weapon_Arcane_Frame_Wheelchair_XRChepscgr75Uug7.json +++ b/src/packs/items/weapons/weapon_Arcane_Frame_Wheelchair_XRChepscgr75Uug7.json @@ -113,22 +113,16 @@ "name": "Reliable", "description": "+1 to attack rolls", "img": "icons/skills/melee/strike-sword-slashing-red.webp", - "changes": [ - { - "key": "system.bonuses.roll.primaryWeapon.bonus", - "mode": 2, - "value": "1" - } - ], "_id": "dXHsy9qr5FWZqsVq", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.primaryWeapon.bonus", + "type": "add", + "value": "1" + } + ] }, "disabled": false, "duration": { diff --git a/src/packs/items/weapons/weapon_Bravesword_QZrWAkprA2tL2MOI.json b/src/packs/items/weapons/weapon_Bravesword_QZrWAkprA2tL2MOI.json index 412a7083..281ec542 100644 --- a/src/packs/items/weapons/weapon_Bravesword_QZrWAkprA2tL2MOI.json +++ b/src/packs/items/weapons/weapon_Bravesword_QZrWAkprA2tL2MOI.json @@ -116,12 +116,12 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-1" }, { "key": "system.damageThresholds.severe", - "mode": 2, + "type": "add", "value": "ITEM.@system.tier" } ], diff --git a/src/packs/items/weapons/weapon_Broadsword_1cwWNt4sqlgA8gCT.json b/src/packs/items/weapons/weapon_Broadsword_1cwWNt4sqlgA8gCT.json index 87c6f7e8..1bed724d 100644 --- a/src/packs/items/weapons/weapon_Broadsword_1cwWNt4sqlgA8gCT.json +++ b/src/packs/items/weapons/weapon_Broadsword_1cwWNt4sqlgA8gCT.json @@ -113,22 +113,16 @@ "name": "Reliable", "description": "+1 to attack rolls", "img": "icons/skills/melee/strike-sword-slashing-red.webp", - "changes": [ - { - "key": "system.bonuses.roll.primaryWeapon.bonus", - "mode": 2, - "value": "1" - } - ], "_id": "mqcpj2cFAprf2AmY", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.primaryWeapon.bonus", + "type": "add", + "value": "1" + } + ] }, "disabled": false, "duration": { diff --git a/src/packs/items/weapons/weapon_Buckler_EmFTp9wzT6MHSaNz.json b/src/packs/items/weapons/weapon_Buckler_EmFTp9wzT6MHSaNz.json index be147888..911dd4c3 100644 --- a/src/packs/items/weapons/weapon_Buckler_EmFTp9wzT6MHSaNz.json +++ b/src/packs/items/weapons/weapon_Buckler_EmFTp9wzT6MHSaNz.json @@ -154,7 +154,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "@system.armorScore", "priority": 21 } diff --git a/src/packs/items/weapons/weapon_Curved_Dagger_Fk69R40svV0kanZD.json b/src/packs/items/weapons/weapon_Curved_Dagger_Fk69R40svV0kanZD.json index 1af2c372..ddaa12d0 100644 --- a/src/packs/items/weapons/weapon_Curved_Dagger_Fk69R40svV0kanZD.json +++ b/src/packs/items/weapons/weapon_Curved_Dagger_Fk69R40svV0kanZD.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.rules.damage.flipMinDiceValue", - "mode": 5, + "type": "override", "value": "1" } ], diff --git a/src/packs/items/weapons/weapon_Finehair_Bow_ykF3jouxHZ6YR8Bg.json b/src/packs/items/weapons/weapon_Finehair_Bow_ykF3jouxHZ6YR8Bg.json index d1bd58b5..4523ad41 100644 --- a/src/packs/items/weapons/weapon_Finehair_Bow_ykF3jouxHZ6YR8Bg.json +++ b/src/packs/items/weapons/weapon_Finehair_Bow_ykF3jouxHZ6YR8Bg.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.bonuses.roll.primaryWeapon.attack", - "mode": 2, + "type": "add", "value": "1" } ], diff --git a/src/packs/items/weapons/weapon_Flickerfly_Blade_xLJ5RRpUoTRmAC3G.json b/src/packs/items/weapons/weapon_Flickerfly_Blade_xLJ5RRpUoTRmAC3G.json index acf0cfd6..ffd6531f 100644 --- a/src/packs/items/weapons/weapon_Flickerfly_Blade_xLJ5RRpUoTRmAC3G.json +++ b/src/packs/items/weapons/weapon_Flickerfly_Blade_xLJ5RRpUoTRmAC3G.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.bonuses.damage.primaryWeapon.bonus", - "mode": 2, + "type": "add", "value": "@system.traits.agility.value", "priority": 21 } diff --git a/src/packs/items/weapons/weapon_Fusion_Gloves_uK1RhtYAsDeoPNGx.json b/src/packs/items/weapons/weapon_Fusion_Gloves_uK1RhtYAsDeoPNGx.json index 034ad5cf..e2e61ec7 100644 --- a/src/packs/items/weapons/weapon_Fusion_Gloves_uK1RhtYAsDeoPNGx.json +++ b/src/packs/items/weapons/weapon_Fusion_Gloves_uK1RhtYAsDeoPNGx.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.bonuses.damage.primaryWeapon.bonus", - "mode": 2, + "type": "add", "value": "@system.levelData.level.current" } ], diff --git a/src/packs/items/weapons/weapon_Gilded_Bow_ctTgFfMbM3YtmsYU.json b/src/packs/items/weapons/weapon_Gilded_Bow_ctTgFfMbM3YtmsYU.json index 0147cfdb..0f5b5c71 100644 --- a/src/packs/items/weapons/weapon_Gilded_Bow_ctTgFfMbM3YtmsYU.json +++ b/src/packs/items/weapons/weapon_Gilded_Bow_ctTgFfMbM3YtmsYU.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.rules.damage.flipMinDiceValue", - "mode": 5, + "type": "override", "value": "1" } ], diff --git a/src/packs/items/weapons/weapon_Greatsword_70ysaFJDREwTgvZa.json b/src/packs/items/weapons/weapon_Greatsword_70ysaFJDREwTgvZa.json index f0e450a4..74aa3cf3 100644 --- a/src/packs/items/weapons/weapon_Greatsword_70ysaFJDREwTgvZa.json +++ b/src/packs/items/weapons/weapon_Greatsword_70ysaFJDREwTgvZa.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-1" } ], diff --git a/src/packs/items/weapons/weapon_Halberd_qT7FfmauAumOjJoq.json b/src/packs/items/weapons/weapon_Halberd_qT7FfmauAumOjJoq.json index 5a990da3..8d58b29b 100644 --- a/src/packs/items/weapons/weapon_Halberd_qT7FfmauAumOjJoq.json +++ b/src/packs/items/weapons/weapon_Halberd_qT7FfmauAumOjJoq.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.traits.finesse.value", - "mode": 2, + "type": "add", "value": "-1" } ], 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..a8187c25 100644 --- a/src/packs/items/weapons/weapon_Heavy_Frame_Wheelchair_XjPQjhRCH08VUIbr.json +++ b/src/packs/items/weapons/weapon_Heavy_Frame_Wheelchair_XjPQjhRCH08VUIbr.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-1" } ], 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..f7d1a9d3 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 @@ -112,22 +112,16 @@ "name": "Reliable", "description": "+1 to attack rolls", "img": "icons/skills/melee/strike-sword-slashing-red.webp", - "changes": [ - { - "key": "system.bonuses.roll.primaryWeapon.bonus", - "mode": 2, - "value": "1" - } - ], "_id": "1f6fFhOLwZrmA6e5", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.primaryWeapon.bonus", + "type": "add", + "value": "1" + } + ] }, "disabled": false, "duration": { diff --git a/src/packs/items/weapons/weapon_Improved_Broadsword_OcKeLJxvmdT81VBc.json b/src/packs/items/weapons/weapon_Improved_Broadsword_OcKeLJxvmdT81VBc.json index 6d6f1921..cd7f62d4 100644 --- a/src/packs/items/weapons/weapon_Improved_Broadsword_OcKeLJxvmdT81VBc.json +++ b/src/packs/items/weapons/weapon_Improved_Broadsword_OcKeLJxvmdT81VBc.json @@ -113,22 +113,16 @@ "name": "Reliable", "description": "+1 to attack rolls", "img": "icons/skills/melee/strike-sword-slashing-red.webp", - "changes": [ - { - "key": "system.bonuses.roll.primaryWeapon.bonus", - "mode": 2, - "value": "1" - } - ], "_id": "228lcQpohdJ3Bbga", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.primaryWeapon.bonus", + "type": "add", + "value": "1" + } + ] }, "disabled": false, "duration": { diff --git a/src/packs/items/weapons/weapon_Improved_Greatsword_FPX4ouDrxXiQ5MDf.json b/src/packs/items/weapons/weapon_Improved_Greatsword_FPX4ouDrxXiQ5MDf.json index 60e5dd53..ec618f0b 100644 --- a/src/packs/items/weapons/weapon_Improved_Greatsword_FPX4ouDrxXiQ5MDf.json +++ b/src/packs/items/weapons/weapon_Improved_Greatsword_FPX4ouDrxXiQ5MDf.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-1" } ], diff --git a/src/packs/items/weapons/weapon_Improved_Halberd_F9PETfCQGwczBPif.json b/src/packs/items/weapons/weapon_Improved_Halberd_F9PETfCQGwczBPif.json index fb5a1dcc..79c3a31b 100644 --- a/src/packs/items/weapons/weapon_Improved_Halberd_F9PETfCQGwczBPif.json +++ b/src/packs/items/weapons/weapon_Improved_Halberd_F9PETfCQGwczBPif.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.traits.finesse.value", - "mode": 2, + "type": "add", "value": "-1" } ], 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..1443e76f 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 @@ -115,7 +115,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-1" } ], diff --git a/src/packs/items/weapons/weapon_Improved_Longbow_NacNonjbzyoVMNhI.json b/src/packs/items/weapons/weapon_Improved_Longbow_NacNonjbzyoVMNhI.json index c197f726..cc083a33 100644 --- a/src/packs/items/weapons/weapon_Improved_Longbow_NacNonjbzyoVMNhI.json +++ b/src/packs/items/weapons/weapon_Improved_Longbow_NacNonjbzyoVMNhI.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.traits.finesse.value", - "mode": 2, + "type": "add", "value": "-1" } ], diff --git a/src/packs/items/weapons/weapon_Improved_Shortsword_rSyBNRwemBVuTo3H.json b/src/packs/items/weapons/weapon_Improved_Shortsword_rSyBNRwemBVuTo3H.json index 96ecd37f..498b5dfb 100644 --- a/src/packs/items/weapons/weapon_Improved_Shortsword_rSyBNRwemBVuTo3H.json +++ b/src/packs/items/weapons/weapon_Improved_Shortsword_rSyBNRwemBVuTo3H.json @@ -113,20 +113,20 @@ "name": "Paired", "description": "Add this Secondary Weapon's tier + 1 to your primary weapon against targets within Melee range", "img": "icons/skills/melee/weapons-crossed-swords-yellow-teal.webp", - "changes": [ - { - "key": "system.bonuses.damage.primaryWeapon.bonus", - "mode": 2, - "value": "ITEM.@system.tier + 1" - } - ], "system": { "rangeDependence": { "enabled": true, "range": "melee", "target": "hostile", "type": "withinRange" - } + }, + "changes": [ + { + "key": "system.bonuses.damage.primaryWeapon.bonus", + "type": "add", + "value": "ITEM.@system.tier + 1" + } + ] }, "_id": "UW2fqbhBqvnK1coG", "type": "base", 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..01f3fc8e 100644 --- a/src/packs/items/weapons/weapon_Improved_Small_Dagger_nMuF8ZDZ2aXZVTg6.json +++ b/src/packs/items/weapons/weapon_Improved_Small_Dagger_nMuF8ZDZ2aXZVTg6.json @@ -113,20 +113,20 @@ "name": "Paired", "description": "Add this Secondary Weapon's tier + 1 to your primary weapon against targets within Melee range", "img": "icons/skills/melee/weapons-crossed-swords-yellow-teal.webp", - "changes": [ - { - "key": "system.bonuses.damage.primaryWeapon.bonus", - "mode": 2, - "value": "ITEM.@system.tier + 1" - } - ], "system": { "rangeDependence": { "enabled": true, - "range": "melee", + "type": "withinRange", "target": "hostile", - "type": "withinRange" - } + "range": "melee" + }, + "changes": [ + { + "key": "system.bonuses.damage.primaryWeapon.bonus", + "type": "add", + "value": "ITEM.@system.tier + 1" + } + ] }, "_id": "PMXG4l85UkXRf41E", "type": "base", diff --git a/src/packs/items/weapons/weapon_Improved_Warhammer_pxaN4ZK4eqKrjtWj.json b/src/packs/items/weapons/weapon_Improved_Warhammer_pxaN4ZK4eqKrjtWj.json index aa24c4ad..47b553a6 100644 --- a/src/packs/items/weapons/weapon_Improved_Warhammer_pxaN4ZK4eqKrjtWj.json +++ b/src/packs/items/weapons/weapon_Improved_Warhammer_pxaN4ZK4eqKrjtWj.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-1" } ], 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..e72607cb 100644 --- a/src/packs/items/weapons/weapon_Keeper_s_Staff_q382JqMkqLaaFLIr.json +++ b/src/packs/items/weapons/weapon_Keeper_s_Staff_q382JqMkqLaaFLIr.json @@ -113,22 +113,16 @@ "name": "Reliable", "description": "+1 to attack rolls", "img": "icons/skills/melee/strike-sword-slashing-red.webp", - "changes": [ - { - "key": "system.bonuses.roll.primaryWeapon.bonus", - "mode": 2, - "value": "1" - } - ], "_id": "LvxPAfrKuRfgubGV", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.primaryWeapon.bonus", + "type": "add", + "value": "1" + } + ] }, "disabled": false, "duration": { 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..935584a8 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 @@ -112,22 +112,16 @@ "name": "Reliable", "description": "+1 to attack rolls", "img": "icons/skills/melee/strike-sword-slashing-red.webp", - "changes": [ - { - "key": "system.bonuses.roll.primaryWeapon.bonus", - "mode": 2, - "value": "1" - } - ], "_id": "TvsoAiqHCwgtYat1", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.primaryWeapon.bonus", + "type": "add", + "value": "1" + } + ] }, "disabled": false, "duration": { diff --git a/src/packs/items/weapons/weapon_Legendary_Broadsword_y3hfTPfZhMognyaJ.json b/src/packs/items/weapons/weapon_Legendary_Broadsword_y3hfTPfZhMognyaJ.json index 361d0353..4570fa8b 100644 --- a/src/packs/items/weapons/weapon_Legendary_Broadsword_y3hfTPfZhMognyaJ.json +++ b/src/packs/items/weapons/weapon_Legendary_Broadsword_y3hfTPfZhMognyaJ.json @@ -113,22 +113,16 @@ "name": "Reliable", "description": "+1 to attack rolls", "img": "icons/skills/melee/strike-sword-slashing-red.webp", - "changes": [ - { - "key": "system.bonuses.roll.primaryWeapon.bonus", - "mode": 2, - "value": "1" - } - ], "_id": "ujb6VAqjyXmfnnjy", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.primaryWeapon.bonus", + "type": "add", + "value": "1" + } + ] }, "disabled": false, "duration": { diff --git a/src/packs/items/weapons/weapon_Legendary_Greatsword_zMZ46F9VR7zdTxb9.json b/src/packs/items/weapons/weapon_Legendary_Greatsword_zMZ46F9VR7zdTxb9.json index aa9d2ef0..97464c6b 100644 --- a/src/packs/items/weapons/weapon_Legendary_Greatsword_zMZ46F9VR7zdTxb9.json +++ b/src/packs/items/weapons/weapon_Legendary_Greatsword_zMZ46F9VR7zdTxb9.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-1" } ], diff --git a/src/packs/items/weapons/weapon_Legendary_Halberd_1AuMNiJz96Ez9fur.json b/src/packs/items/weapons/weapon_Legendary_Halberd_1AuMNiJz96Ez9fur.json index af6b2a07..2b411f11 100644 --- a/src/packs/items/weapons/weapon_Legendary_Halberd_1AuMNiJz96Ez9fur.json +++ b/src/packs/items/weapons/weapon_Legendary_Halberd_1AuMNiJz96Ez9fur.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.traits.finesse.value", - "mode": 2, + "type": "add", "value": "-1" } ], 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..9139a7b0 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 @@ -115,7 +115,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-1" } ], diff --git a/src/packs/items/weapons/weapon_Legendary_Longbow_Utt1GpoH1fhaTOtN.json b/src/packs/items/weapons/weapon_Legendary_Longbow_Utt1GpoH1fhaTOtN.json index bd5ab13b..e9e95967 100644 --- a/src/packs/items/weapons/weapon_Legendary_Longbow_Utt1GpoH1fhaTOtN.json +++ b/src/packs/items/weapons/weapon_Legendary_Longbow_Utt1GpoH1fhaTOtN.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.traits.finesse.value", - "mode": 2, + "type": "add", "value": "-1" } ], diff --git a/src/packs/items/weapons/weapon_Legendary_Shortsword_dEumq3BIZBk5xYTk.json b/src/packs/items/weapons/weapon_Legendary_Shortsword_dEumq3BIZBk5xYTk.json index a2203a1d..c01a6d5e 100644 --- a/src/packs/items/weapons/weapon_Legendary_Shortsword_dEumq3BIZBk5xYTk.json +++ b/src/packs/items/weapons/weapon_Legendary_Shortsword_dEumq3BIZBk5xYTk.json @@ -113,20 +113,20 @@ "name": "Paired", "description": "Add this Secondary Weapon's tier + 1 to your primary weapon against targets within Melee range", "img": "icons/skills/melee/weapons-crossed-swords-yellow-teal.webp", - "changes": [ - { - "key": "system.bonuses.damage.primaryWeapon.bonus", - "mode": 2, - "value": "ITEM.@system.tier + 1" - } - ], "system": { "rangeDependence": { "enabled": true, "range": "melee", "target": "hostile", "type": "withinRange" - } + }, + "changes": [ + { + "key": "system.bonuses.damage.primaryWeapon.bonus", + "type": "add", + "value": "ITEM.@system.tier + 1" + } + ] }, "_id": "ebloMf4gItx38xkZ", "type": "base", 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..42a977f6 100644 --- a/src/packs/items/weapons/weapon_Legendary_Small_Dagger_Px3Rh3kIvAqyISxJ.json +++ b/src/packs/items/weapons/weapon_Legendary_Small_Dagger_Px3Rh3kIvAqyISxJ.json @@ -113,20 +113,20 @@ "name": "Paired", "description": "Add this Secondary Weapon's tier + 1 to your primary weapon against targets within Melee range", "img": "icons/skills/melee/weapons-crossed-swords-yellow-teal.webp", - "changes": [ - { - "key": "system.bonuses.damage.primaryWeapon.bonus", - "mode": 2, - "value": "ITEM.@system.tier + 1" - } - ], "system": { "rangeDependence": { "enabled": true, - "range": "melee", + "type": "withinRange", "target": "hostile", - "type": "withinRange" - } + "range": "melee" + }, + "changes": [ + { + "key": "system.bonuses.damage.primaryWeapon.bonus", + "type": "add", + "value": "ITEM.@system.tier + 1" + } + ] }, "_id": "WAqE3sZFkTefglDq", "type": "base", diff --git a/src/packs/items/weapons/weapon_Legendary_Warhammer_W9ymfEDck2icfvla.json b/src/packs/items/weapons/weapon_Legendary_Warhammer_W9ymfEDck2icfvla.json index 562122d2..91d26e71 100644 --- a/src/packs/items/weapons/weapon_Legendary_Warhammer_W9ymfEDck2icfvla.json +++ b/src/packs/items/weapons/weapon_Legendary_Warhammer_W9ymfEDck2icfvla.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-1" } ], diff --git a/src/packs/items/weapons/weapon_Longbow_YfVs6Se903az4Yet.json b/src/packs/items/weapons/weapon_Longbow_YfVs6Se903az4Yet.json index 43af46ab..f2995cb5 100644 --- a/src/packs/items/weapons/weapon_Longbow_YfVs6Se903az4Yet.json +++ b/src/packs/items/weapons/weapon_Longbow_YfVs6Se903az4Yet.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.traits.finesse.value", - "mode": 2, + "type": "add", "value": "-1" } ], diff --git a/src/packs/items/weapons/weapon_Midas_Scythe_BdLfy5i488VZgkjP.json b/src/packs/items/weapons/weapon_Midas_Scythe_BdLfy5i488VZgkjP.json index 57fe2367..143d4910 100644 --- a/src/packs/items/weapons/weapon_Midas_Scythe_BdLfy5i488VZgkjP.json +++ b/src/packs/items/weapons/weapon_Midas_Scythe_BdLfy5i488VZgkjP.json @@ -145,7 +145,7 @@ "changes": [ { "key": "system.proficiency", - "mode": 2, + "type": "add", "value": "1" } ], diff --git a/src/packs/items/weapons/weapon_Powered_Gauntlet_bW3xw5S9DbaLCN3E.json b/src/packs/items/weapons/weapon_Powered_Gauntlet_bW3xw5S9DbaLCN3E.json index 3c4ebd1c..9ba6f1b1 100644 --- a/src/packs/items/weapons/weapon_Powered_Gauntlet_bW3xw5S9DbaLCN3E.json +++ b/src/packs/items/weapons/weapon_Powered_Gauntlet_bW3xw5S9DbaLCN3E.json @@ -152,7 +152,7 @@ "changes": [ { "key": "system.proficiency", - "mode": 2, + "type": "add", "value": "1" } ], diff --git a/src/packs/items/weapons/weapon_Shortsword_cjGZpXCoshEqi1FI.json b/src/packs/items/weapons/weapon_Shortsword_cjGZpXCoshEqi1FI.json index 0ea874f8..e8d49d15 100644 --- a/src/packs/items/weapons/weapon_Shortsword_cjGZpXCoshEqi1FI.json +++ b/src/packs/items/weapons/weapon_Shortsword_cjGZpXCoshEqi1FI.json @@ -113,21 +113,21 @@ "name": "Paired", "description": "

Add this Secondary Weapon's tier + 1 to your primary weapon against targets within Melee range

", "img": "icons/skills/melee/weapons-crossed-swords-yellow-teal.webp", - "changes": [ - { - "key": "system.bonuses.damage.primaryWeapon.bonus", - "mode": 2, - "value": "ITEM.@system.tier + 1", - "priority": null - } - ], "system": { "rangeDependence": { "enabled": true, "range": "melee", "target": "hostile", "type": "withinRange" - } + }, + "changes": [ + { + "key": "system.bonuses.damage.primaryWeapon.bonus", + "type": "add", + "value": "ITEM.@system.tier + 1", + "priority": null + } + ] }, "_id": "djNtNpasgNDRP8Dd", "type": "base", diff --git a/src/packs/items/weapons/weapon_Sledge_Axe_OxsEmffWriiQmqJK.json b/src/packs/items/weapons/weapon_Sledge_Axe_OxsEmffWriiQmqJK.json index d0230362..3e43c85a 100644 --- a/src/packs/items/weapons/weapon_Sledge_Axe_OxsEmffWriiQmqJK.json +++ b/src/packs/items/weapons/weapon_Sledge_Axe_OxsEmffWriiQmqJK.json @@ -171,7 +171,7 @@ "changes": [ { "key": "system.traits.agility.value", - "mode": 2, + "type": "add", "value": "-1" } ], diff --git a/src/packs/items/weapons/weapon_Small_Dagger_wKklDxs5nkzILNp4.json b/src/packs/items/weapons/weapon_Small_Dagger_wKklDxs5nkzILNp4.json index 058d138e..184b1ff0 100644 --- a/src/packs/items/weapons/weapon_Small_Dagger_wKklDxs5nkzILNp4.json +++ b/src/packs/items/weapons/weapon_Small_Dagger_wKklDxs5nkzILNp4.json @@ -113,20 +113,20 @@ "name": "Paired", "description": "Add this Secondary Weapon's tier + 1 to your primary weapon against targets within Melee range", "img": "icons/skills/melee/weapons-crossed-swords-yellow-teal.webp", - "changes": [ - { - "key": "system.bonuses.damage.primaryWeapon.bonus", - "mode": 2, - "value": "ITEM.@system.tier + 1" - } - ], "system": { "rangeDependence": { "enabled": true, - "range": "melee", + "type": "withinRange", "target": "hostile", - "type": "withinRange" - } + "range": "melee" + }, + "changes": [ + { + "key": "system.bonuses.damage.primaryWeapon.bonus", + "type": "add", + "value": "ITEM.@system.tier + 1" + } + ] }, "_id": "HKh73AHxImdgxgTg", "type": "base", diff --git a/src/packs/items/weapons/weapon_Thistlebow_I1nDGpulg29GpWOW.json b/src/packs/items/weapons/weapon_Thistlebow_I1nDGpulg29GpWOW.json index 18f635eb..4cd9ad55 100644 --- a/src/packs/items/weapons/weapon_Thistlebow_I1nDGpulg29GpWOW.json +++ b/src/packs/items/weapons/weapon_Thistlebow_I1nDGpulg29GpWOW.json @@ -113,22 +113,16 @@ "name": "Reliable", "description": "+1 to attack rolls", "img": "icons/skills/melee/strike-sword-slashing-red.webp", - "changes": [ - { - "key": "system.bonuses.roll.primaryWeapon.bonus", - "mode": 2, - "value": "1" - } - ], "_id": "G9mMGxBSexwjWTYV", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.primaryWeapon.bonus", + "type": "add", + "value": "1" + } + ] }, "disabled": false, "duration": { 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..ea13be12 100644 --- a/src/packs/items/weapons/weapon_Wand_of_Enthrallment_tP6vmnrmTq2h5sj7.json +++ b/src/packs/items/weapons/weapon_Wand_of_Enthrallment_tP6vmnrmTq2h5sj7.json @@ -152,7 +152,7 @@ "changes": [ { "key": "system.traits.presence.value", - "mode": 2, + "type": "add", "value": "2" } ], diff --git a/src/packs/items/weapons/weapon_War_Scythe_z6yEdFYQJ5IzgTX3.json b/src/packs/items/weapons/weapon_War_Scythe_z6yEdFYQJ5IzgTX3.json index 0c57dd50..fc893901 100644 --- a/src/packs/items/weapons/weapon_War_Scythe_z6yEdFYQJ5IzgTX3.json +++ b/src/packs/items/weapons/weapon_War_Scythe_z6yEdFYQJ5IzgTX3.json @@ -113,22 +113,16 @@ "name": "Reliable", "description": "+1 to attack rolls", "img": "icons/skills/melee/strike-sword-slashing-red.webp", - "changes": [ - { - "key": "system.bonuses.roll.primaryWeapon.bonus", - "mode": 2, - "value": "1" - } - ], "_id": "cOYeI9TxHXpDwszu", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.roll.primaryWeapon.bonus", + "type": "add", + "value": "1" + } + ] }, "disabled": false, "duration": { diff --git a/src/packs/items/weapons/weapon_Warhammer_ZXh1GQahBiODfSTC.json b/src/packs/items/weapons/weapon_Warhammer_ZXh1GQahBiODfSTC.json index a94950c7..17724919 100644 --- a/src/packs/items/weapons/weapon_Warhammer_ZXh1GQahBiODfSTC.json +++ b/src/packs/items/weapons/weapon_Warhammer_ZXh1GQahBiODfSTC.json @@ -116,7 +116,7 @@ "changes": [ { "key": "system.evasion", - "mode": 2, + "type": "add", "value": "-1" } ], diff --git a/src/packs/subclasses/feature_Act_of_Reprisal_k7vvMJtEcxMWUUrW.json b/src/packs/subclasses/feature_Act_of_Reprisal_k7vvMJtEcxMWUUrW.json index 5dee0c1c..4c862887 100644 --- a/src/packs/subclasses/feature_Act_of_Reprisal_k7vvMJtEcxMWUUrW.json +++ b/src/packs/subclasses/feature_Act_of_Reprisal_k7vvMJtEcxMWUUrW.json @@ -54,12 +54,6 @@ "_id": "9Uo0yOYGn3vandPp", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [], "duration": { "type": "temporary", diff --git a/src/packs/subclasses/feature_Adrenaline_uByM34yQlw38yf1V.json b/src/packs/subclasses/feature_Adrenaline_uByM34yQlw38yf1V.json index dc25498b..95cb2263 100644 --- a/src/packs/subclasses/feature_Adrenaline_uByM34yQlw38yf1V.json +++ b/src/packs/subclasses/feature_Adrenaline_uByM34yQlw38yf1V.json @@ -25,27 +25,21 @@ "_id": "HMx9uZ54mvMiH95x", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.physical.bonus", + "type": "add", + "value": "@system.levelData.level.current", + "priority": null + }, + { + "key": "system.bonuses.damage.magical.bonus", + "type": "add", + "value": "@system.levelData.level.current", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.damage.physical.bonus", - "mode": 2, - "value": "@system.levelData.level.current", - "priority": null - }, - { - "key": "system.bonuses.damage.magical.bonus", - "mode": 2, - "value": "@system.levelData.level.current", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Advanced_Training_uGcs785h94RMtueH.json b/src/packs/subclasses/feature_Advanced_Training_uGcs785h94RMtueH.json index 16a5cd79..b551ef50 100644 --- a/src/packs/subclasses/feature_Advanced_Training_uGcs785h94RMtueH.json +++ b/src/packs/subclasses/feature_Advanced_Training_uGcs785h94RMtueH.json @@ -21,23 +21,17 @@ "name": "Advanced Training", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.companionData.levelupChoices", + "type": "add", + "value": "2", + "priority": null + } + ] }, "_id": "bKOuMxhB2Jth3j2T", "img": "icons/creatures/mammals/wolf-howl-moon-gray.webp", - "changes": [ - { - "key": "system.companionData.levelupChoices", - "mode": 2, - "value": "2", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Arcane_Charge_yA4MKQ1tbKFiJoDB.json b/src/packs/subclasses/feature_Arcane_Charge_yA4MKQ1tbKFiJoDB.json index e92b71ad..e563668d 100644 --- a/src/packs/subclasses/feature_Arcane_Charge_yA4MKQ1tbKFiJoDB.json +++ b/src/packs/subclasses/feature_Arcane_Charge_yA4MKQ1tbKFiJoDB.json @@ -29,23 +29,17 @@ "name": "Charged", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.magical.bonus", + "type": "add", + "value": "+10", + "priority": null + } + ] }, "_id": "z49V45ir45HGHOBB", "img": "icons/magic/unholy/strike-hand-glow-pink.webp", - "changes": [ - { - "key": "system.bonuses.damage.magical.bonus", - "mode": 2, - "value": "+10", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Ascendant_fefLgx6kcYWusjBb.json b/src/packs/subclasses/feature_Ascendant_fefLgx6kcYWusjBb.json index 737930df..abdbe271 100644 --- a/src/packs/subclasses/feature_Ascendant_fefLgx6kcYWusjBb.json +++ b/src/packs/subclasses/feature_Ascendant_fefLgx6kcYWusjBb.json @@ -21,23 +21,17 @@ "name": "Ascendant", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.damageThresholds.severe", + "type": "add", + "value": "+4", + "priority": null + } + ] }, "_id": "7M8UsvVweRtT3E85", "img": "icons/magic/defensive/shield-barrier-deflect-gold.webp", - "changes": [ - { - "key": "system.damageThresholds.severe", - "mode": 2, - "value": "+4", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_At_Ease_xPWFvGvtUjIcqgJq.json b/src/packs/subclasses/feature_At_Ease_xPWFvGvtUjIcqgJq.json index ce628a2f..f63b0e42 100644 --- a/src/packs/subclasses/feature_At_Ease_xPWFvGvtUjIcqgJq.json +++ b/src/packs/subclasses/feature_At_Ease_xPWFvGvtUjIcqgJq.json @@ -21,23 +21,17 @@ "name": "At Ease", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.resources.stress.max", + "type": "add", + "value": "1", + "priority": null + } + ] }, "_id": "xbS4Lr3dWpXUCHEi", "img": "icons/magic/holy/meditation-chi-focus-blue.webp", - "changes": [ - { - "key": "system.resources.stress.max", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Battle_Bonded_hWsKyed1vfILg0I8.json b/src/packs/subclasses/feature_Battle_Bonded_hWsKyed1vfILg0I8.json index 578be0a3..9f68639f 100644 --- a/src/packs/subclasses/feature_Battle_Bonded_hWsKyed1vfILg0I8.json +++ b/src/packs/subclasses/feature_Battle_Bonded_hWsKyed1vfILg0I8.json @@ -21,12 +21,6 @@ "name": "Battle Bonded", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.evasion", diff --git a/src/packs/subclasses/feature_Battlemage_Y9eGMewnFZgPvX0M.json b/src/packs/subclasses/feature_Battlemage_Y9eGMewnFZgPvX0M.json index 9e389095..36706909 100644 --- a/src/packs/subclasses/feature_Battlemage_Y9eGMewnFZgPvX0M.json +++ b/src/packs/subclasses/feature_Battlemage_Y9eGMewnFZgPvX0M.json @@ -21,23 +21,17 @@ "name": "Battlemage", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.resources.hitPoints.max", + "type": "add", + "value": "1", + "priority": null + } + ] }, "_id": "6jjKzvBxAJTHHGoX", "img": "icons/equipment/chest/collar-steel.webp", - "changes": [ - { - "key": "system.resources.hitPoints.max", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Conjure_Shield_oirsCnN66GOlK3Fa.json b/src/packs/subclasses/feature_Conjure_Shield_oirsCnN66GOlK3Fa.json index 99b04487..8f542544 100644 --- a/src/packs/subclasses/feature_Conjure_Shield_oirsCnN66GOlK3Fa.json +++ b/src/packs/subclasses/feature_Conjure_Shield_oirsCnN66GOlK3Fa.json @@ -21,23 +21,17 @@ "name": "Conjure Shield", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.evasion", + "type": "add", + "value": "@system.proficiency", + "priority": 21 + } + ] }, "_id": "0i7GVOvjH6bK5AUM", "img": "icons/magic/defensive/barrier-shield-dome-blue-purple.webp", - "changes": [ - { - "key": "system.evasion", - "mode": 2, - "value": "@system.proficiency", - "priority": 21 - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Elemental_Aura_2JH9NaOh69yN80Gw.json b/src/packs/subclasses/feature_Elemental_Aura_2JH9NaOh69yN80Gw.json index e0476a56..cc6ff640 100644 --- a/src/packs/subclasses/feature_Elemental_Aura_2JH9NaOh69yN80Gw.json +++ b/src/packs/subclasses/feature_Elemental_Aura_2JH9NaOh69yN80Gw.json @@ -223,12 +223,6 @@ "_id": "H7W52ps5d3UGmaFr", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [] }, "disabled": false, @@ -259,12 +253,6 @@ "_id": "WX5AMEpmUAutB9Hm", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [] }, "disabled": false, @@ -295,12 +283,6 @@ "transfer": false, "statuses": [], "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.traits.strength.value", diff --git a/src/packs/subclasses/feature_Elemental_Dominion_EFUJHrkTuyv8uA9l.json b/src/packs/subclasses/feature_Elemental_Dominion_EFUJHrkTuyv8uA9l.json index 2476046c..0adda762 100644 --- a/src/packs/subclasses/feature_Elemental_Dominion_EFUJHrkTuyv8uA9l.json +++ b/src/packs/subclasses/feature_Elemental_Dominion_EFUJHrkTuyv8uA9l.json @@ -141,21 +141,15 @@ "_id": "FoBFRSXRfGa1zkiX", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "any", - "range": "self" - } + "changes": [ + { + "key": "system.proficiency", + "type": "add", + "value": "1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.proficiency", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -184,12 +178,6 @@ "_id": "bGwFZZT4juuaIRmZ", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "veryFar" - }, "changes": [], "duration": { "type": "temporary" @@ -232,21 +220,15 @@ "_id": "edF2zvvlcGf54r2n", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "any", - "range": "self" - } + "changes": [ + { + "key": "system.evasion", + "type": "add", + "value": "1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.evasion", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -275,14 +257,8 @@ "_id": "p5FoUb4JKQFP405d", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Elemental_Incarnation_f37TTgCc0Q3Ih1A1.json b/src/packs/subclasses/feature_Elemental_Incarnation_f37TTgCc0Q3Ih1A1.json index 45ffde60..87150aa0 100644 --- a/src/packs/subclasses/feature_Elemental_Incarnation_f37TTgCc0Q3Ih1A1.json +++ b/src/packs/subclasses/feature_Elemental_Incarnation_f37TTgCc0Q3Ih1A1.json @@ -243,27 +243,21 @@ "_id": "7xyUtUbBk5jbNnqY", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "any", - "range": "self" - } + "changes": [ + { + "key": "system.damageThresholds.major", + "type": "add", + "value": "@system.proficiency", + "priority": 21 + }, + { + "key": "system.damageThresholds.severe", + "type": "add", + "value": "@system.proficiency", + "priority": 21 + } + ] }, - "changes": [ - { - "key": "system.damageThresholds.major", - "mode": 2, - "value": "@system.proficiency", - "priority": 21 - }, - { - "key": "system.damageThresholds.severe", - "mode": 2, - "value": "@system.proficiency", - "priority": 21 - } - ], "disabled": false, "duration": { "startTime": null, @@ -292,21 +286,15 @@ "_id": "3ck6CeapLxQVjE2W", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.advantageSources", + "type": "add", + "value": "Advantage on Agility Rolls", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.advantageSources", - "mode": 2, - "value": "Advantage on Agility Rolls", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -335,14 +323,8 @@ "_id": "Jy6dpEbzkZ2eRDf5", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, @@ -371,14 +353,8 @@ "_id": "ANle8tuOEZIevTWv", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Elementalist_dPcqKN5NeDkjB1HW.json b/src/packs/subclasses/feature_Elementalist_dPcqKN5NeDkjB1HW.json index 8a6b742a..dd989364 100644 --- a/src/packs/subclasses/feature_Elementalist_dPcqKN5NeDkjB1HW.json +++ b/src/packs/subclasses/feature_Elementalist_dPcqKN5NeDkjB1HW.json @@ -98,21 +98,15 @@ "_id": "EY87mY6ULfIt3XC8", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "any", - "range": "self" - } + "changes": [ + { + "key": "system.bonuses.roll.action.bonus", + "type": "add", + "value": "+2", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.roll.action.bonus", - "mode": 2, - "value": "+2", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, @@ -141,27 +135,21 @@ "_id": "WwibpgaO6Kkks7aZ", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "any", - "range": "self" - } + "changes": [ + { + "key": "system.bonuses.damage.magical.bonus", + "type": "add", + "value": "+3", + "priority": null + }, + { + "key": "system.bonuses.damage.physical.bonus", + "type": "add", + "value": "+3", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.damage.magical.bonus", - "mode": 2, - "value": "+3", - "priority": null - }, - { - "key": "system.bonuses.damage.physical.bonus", - "mode": 2, - "value": "+3", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Elusive_Predator_Cjtc43V3IzAmfIFG.json b/src/packs/subclasses/feature_Elusive_Predator_Cjtc43V3IzAmfIFG.json index 82cd55a0..865268e9 100644 --- a/src/packs/subclasses/feature_Elusive_Predator_Cjtc43V3IzAmfIFG.json +++ b/src/packs/subclasses/feature_Elusive_Predator_Cjtc43V3IzAmfIFG.json @@ -21,12 +21,6 @@ "name": "Elusive Predator", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.evasion", diff --git a/src/packs/subclasses/feature_Epic_Poetry_eCoEWkWuZPMZ9C6a.json b/src/packs/subclasses/feature_Epic_Poetry_eCoEWkWuZPMZ9C6a.json index 0eb3240e..2367f220 100644 --- a/src/packs/subclasses/feature_Epic_Poetry_eCoEWkWuZPMZ9C6a.json +++ b/src/packs/subclasses/feature_Epic_Poetry_eCoEWkWuZPMZ9C6a.json @@ -20,23 +20,17 @@ "name": "Rally:d10", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.rally", + "type": "override", + "value": "d10", + "priority": null + } + ] }, "_id": "RSmscgGyuHJucF6C", "img": "icons/sundries/documents/document-letter-blue.webp", - "changes": [ - { - "key": "system.bonuses.rally", - "mode": 5, - "value": "d10", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Ethereal_Visage_tyGB6wRKjYdIBK1i.json b/src/packs/subclasses/feature_Ethereal_Visage_tyGB6wRKjYdIBK1i.json index 43039d73..15871e9f 100644 --- a/src/packs/subclasses/feature_Ethereal_Visage_tyGB6wRKjYdIBK1i.json +++ b/src/packs/subclasses/feature_Ethereal_Visage_tyGB6wRKjYdIBK1i.json @@ -21,23 +21,17 @@ "name": "Ethereal Visage", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.advantageSources", + "type": "add", + "value": "Presence rolls while flying", + "priority": null + } + ] }, "_id": "Ns1DcQ8wo47LhlL3", "img": "icons/magic/holy/saint-glass-portrait-halo.webp", - "changes": [ - { - "key": "system.advantageSources", - "mode": 2, - "value": "Presence rolls while flying", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Expert_Training_iCXtOWBKv1FdKdWz.json b/src/packs/subclasses/feature_Expert_Training_iCXtOWBKv1FdKdWz.json index 06819dc9..0ae1a60d 100644 --- a/src/packs/subclasses/feature_Expert_Training_iCXtOWBKv1FdKdWz.json +++ b/src/packs/subclasses/feature_Expert_Training_iCXtOWBKv1FdKdWz.json @@ -21,23 +21,17 @@ "name": "Expert Training", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.companionData.levelupChoices", + "type": "add", + "value": "1", + "priority": null + } + ] }, "_id": "rknTONvaUDZ2Yz1W", "img": "icons/creatures/mammals/dog-husky-white-blue.webp", - "changes": [ - { - "key": "system.companionData.levelupChoices", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Fleeting_Shadow_EY7Eo6hNGppVL3dR.json b/src/packs/subclasses/feature_Fleeting_Shadow_EY7Eo6hNGppVL3dR.json index cdebe9b3..fe3f252f 100644 --- a/src/packs/subclasses/feature_Fleeting_Shadow_EY7Eo6hNGppVL3dR.json +++ b/src/packs/subclasses/feature_Fleeting_Shadow_EY7Eo6hNGppVL3dR.json @@ -21,23 +21,17 @@ "name": "Fleeting Shadow", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.evasion", + "type": "add", + "value": "1", + "priority": null + } + ] }, "_id": "hsEwoHkNr2qVwm2H", "img": "icons/magic/unholy/projectile-flame-white-purple.webp", - "changes": [ - { - "key": "system.evasion", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Gifted_Performer_99U7YWNCxFZHCiT0.json b/src/packs/subclasses/feature_Gifted_Performer_99U7YWNCxFZHCiT0.json index f65cd041..47a597e7 100644 --- a/src/packs/subclasses/feature_Gifted_Performer_99U7YWNCxFZHCiT0.json +++ b/src/packs/subclasses/feature_Gifted_Performer_99U7YWNCxFZHCiT0.json @@ -186,12 +186,6 @@ "_id": "FK4IdbxluRErfYor", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "close" - }, "changes": [], "duration": { "type": "temporary" diff --git a/src/packs/subclasses/feature_Iron_Will_7AVRNyBcd1Nffjtn.json b/src/packs/subclasses/feature_Iron_Will_7AVRNyBcd1Nffjtn.json index bea62e2b..fa8516ca 100644 --- a/src/packs/subclasses/feature_Iron_Will_7AVRNyBcd1Nffjtn.json +++ b/src/packs/subclasses/feature_Iron_Will_7AVRNyBcd1Nffjtn.json @@ -21,23 +21,17 @@ "name": "Iron Will", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.rules.damageReduction.maxArmorMarked.value", + "type": "add", + "value": "1", + "priority": null + } + ] }, "_id": "htEDIjCEWYtznpRV", "img": "icons/equipment/chest/breastplate-helmet-metal.webp", - "changes": [ - { - "key": "system.rules.damageReduction.maxArmorMarked.value", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Nemesis_DPKmipNRlSAMs2Cg.json b/src/packs/subclasses/feature_Nemesis_DPKmipNRlSAMs2Cg.json index 3b2d440c..f3931f8c 100644 --- a/src/packs/subclasses/feature_Nemesis_DPKmipNRlSAMs2Cg.json +++ b/src/packs/subclasses/feature_Nemesis_DPKmipNRlSAMs2Cg.json @@ -60,14 +60,8 @@ "_id": "JoBFHkhLbm4JyuZm", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Ruthless_Predator_Qny2J3R35bvC0Cey.json b/src/packs/subclasses/feature_Ruthless_Predator_Qny2J3R35bvC0Cey.json index 135447fa..ba92472f 100644 --- a/src/packs/subclasses/feature_Ruthless_Predator_Qny2J3R35bvC0Cey.json +++ b/src/packs/subclasses/feature_Ruthless_Predator_Qny2J3R35bvC0Cey.json @@ -60,21 +60,15 @@ "_id": "8BNwCS7ueIQuvn2M", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "any", - "range": "self" - } + "changes": [ + { + "key": "system.proficiency", + "type": "add", + "value": "1", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.proficiency", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Shadow_Stepper_hAwTXjhyphiE3aeW.json b/src/packs/subclasses/feature_Shadow_Stepper_hAwTXjhyphiE3aeW.json index 7e6fa730..fcba875a 100644 --- a/src/packs/subclasses/feature_Shadow_Stepper_hAwTXjhyphiE3aeW.json +++ b/src/packs/subclasses/feature_Shadow_Stepper_hAwTXjhyphiE3aeW.json @@ -60,14 +60,8 @@ "_id": "RYri0b9z5kq74U5n", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Transcendence_th6HZwEFnVBjUtqm.json b/src/packs/subclasses/feature_Transcendence_th6HZwEFnVBjUtqm.json index c03c10b5..32d8181c 100644 --- a/src/packs/subclasses/feature_Transcendence_th6HZwEFnVBjUtqm.json +++ b/src/packs/subclasses/feature_Transcendence_th6HZwEFnVBjUtqm.json @@ -53,12 +53,6 @@ "name": "Bonus to Threshold", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - }, "changes": [ { "key": "system.damageThresholds.severe", @@ -106,16 +100,10 @@ "name": "Bonus to Trait", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, "_id": "cTgSmxkTi89y6sbc", "img": "icons/magic/fire/elemental-fire-flying.webp", - "changes": [], "disabled": true, "duration": { "startTime": null, @@ -142,23 +130,17 @@ "name": "Bonus to Proficiency", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.proficiency", + "type": "add", + "value": "+1", + "priority": null + } + ] }, "_id": "oWf3iXf4dawdbmzd", "img": "icons/magic/fire/elemental-fire-flying.webp", - "changes": [ - { - "key": "system.proficiency", - "mode": 2, - "value": "+1", - "priority": null - } - ], "disabled": true, "duration": { "startTime": null, @@ -185,16 +167,10 @@ "name": "Bonus to Evasion", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, "_id": "2LCF6lSnWFqNiPs5", "img": "icons/magic/fire/elemental-fire-flying.webp", - "changes": [], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Undaunted_866b2jjyzXP8nPRQ.json b/src/packs/subclasses/feature_Undaunted_866b2jjyzXP8nPRQ.json index dc5ae2ec..792dfd3c 100644 --- a/src/packs/subclasses/feature_Undaunted_866b2jjyzXP8nPRQ.json +++ b/src/packs/subclasses/feature_Undaunted_866b2jjyzXP8nPRQ.json @@ -21,29 +21,23 @@ "name": "Undaunted", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "any", - "range": "self" - } + "changes": [ + { + "key": "system.damageThresholds.severe", + "type": "add", + "value": "3", + "priority": null + }, + { + "key": "system.damageThresholds.major", + "type": "add", + "value": "3", + "priority": null + } + ] }, "_id": "zggFRaerHCj1e5F5", "img": "icons/skills/melee/shield-block-gray-yellow.webp", - "changes": [ - { - "key": "system.damageThresholds.severe", - "mode": 2, - "value": "3", - "priority": null - }, - { - "key": "system.damageThresholds.major", - "mode": 2, - "value": "3", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Unrelenting_4qP7bNyxVHBmr4Rb.json b/src/packs/subclasses/feature_Unrelenting_4qP7bNyxVHBmr4Rb.json index dea5e345..287a54c1 100644 --- a/src/packs/subclasses/feature_Unrelenting_4qP7bNyxVHBmr4Rb.json +++ b/src/packs/subclasses/feature_Unrelenting_4qP7bNyxVHBmr4Rb.json @@ -21,29 +21,23 @@ "name": "Unrelenting", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "any", - "range": "self" - } + "changes": [ + { + "key": "system.damageThresholds.major", + "type": "add", + "value": "2", + "priority": null + }, + { + "key": "system.damageThresholds.severe", + "type": "add", + "value": "2", + "priority": null + } + ] }, "_id": "IKb6yutns8EJZ49M", "img": "icons/equipment/shield/heater-steel-crystal-red.webp", - "changes": [ - { - "key": "system.damageThresholds.major", - "mode": 2, - "value": "2", - "priority": null - }, - { - "key": "system.damageThresholds.severe", - "mode": 2, - "value": "2", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Unwavering_WBiFZaYNoQNhysmN.json b/src/packs/subclasses/feature_Unwavering_WBiFZaYNoQNhysmN.json index aa898296..dc183879 100644 --- a/src/packs/subclasses/feature_Unwavering_WBiFZaYNoQNhysmN.json +++ b/src/packs/subclasses/feature_Unwavering_WBiFZaYNoQNhysmN.json @@ -21,29 +21,23 @@ "name": "Unwavering", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "any", - "range": "self" - } + "changes": [ + { + "key": "system.damageThresholds.major", + "type": "add", + "value": "1", + "priority": null + }, + { + "key": "system.damageThresholds.severe", + "type": "add", + "value": "1", + "priority": null + } + ] }, "_id": "3wexvo6La4V46aiX", "img": "icons/equipment/shield/heater-steel-gold.webp", - "changes": [ - { - "key": "system.damageThresholds.major", - "mode": 2, - "value": "1", - "priority": null - }, - { - "key": "system.damageThresholds.severe", - "mode": 2, - "value": "1", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Vanishing_Act_iyIg1VLwO8C6jvFZ.json b/src/packs/subclasses/feature_Vanishing_Act_iyIg1VLwO8C6jvFZ.json index 67cfa833..713578e6 100644 --- a/src/packs/subclasses/feature_Vanishing_Act_iyIg1VLwO8C6jvFZ.json +++ b/src/packs/subclasses/feature_Vanishing_Act_iyIg1VLwO8C6jvFZ.json @@ -60,14 +60,8 @@ "_id": "czrwqq44sEr0uJ8O", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [] }, - "changes": [], "disabled": true, "duration": { "startTime": null, diff --git a/src/packs/subclasses/feature_Wings_of_Light_KkQH0tYhagIqe2MT.json b/src/packs/subclasses/feature_Wings_of_Light_KkQH0tYhagIqe2MT.json index 5b86e348..b7d8af3f 100644 --- a/src/packs/subclasses/feature_Wings_of_Light_KkQH0tYhagIqe2MT.json +++ b/src/packs/subclasses/feature_Wings_of_Light_KkQH0tYhagIqe2MT.json @@ -94,27 +94,21 @@ "_id": "PfCwuVbKLxhnrm9X", "type": "base", "system": { - "rangeDependence": { - "enabled": false, - "type": "withinRange", - "target": "hostile", - "range": "melee" - } + "changes": [ + { + "key": "system.bonuses.damage.physical.dice", + "type": "add", + "value": "+1d8", + "priority": null + }, + { + "key": "system.bonuses.damage.magical.dice", + "type": "add", + "value": "+1d8", + "priority": null + } + ] }, - "changes": [ - { - "key": "system.bonuses.damage.physical.dice", - "mode": 2, - "value": "+1d8", - "priority": null - }, - { - "key": "system.bonuses.damage.magical.dice", - "mode": 2, - "value": "+1d8", - "priority": null - } - ], "disabled": false, "duration": { "startTime": null, diff --git a/styles/less/dialog/damage-selection/sheet.less b/styles/less/dialog/damage-selection/sheet.less index 9f8cfc8a..0bb0f2be 100644 --- a/styles/less/dialog/damage-selection/sheet.less +++ b/styles/less/dialog/damage-selection/sheet.less @@ -17,6 +17,13 @@ } } + .section-header { + font-size: var(--font-size-20); + color: light-dark(@dark, @beige); + text-align: center; + margin-bottom: -12px; + } + .bonuses { gap: 4px; .critical-chip { diff --git a/styles/less/dialog/group-roll-dialog/initialization.less b/styles/less/dialog/group-roll-dialog/initialization.less index b32f4756..a4b82e55 100644 --- a/styles/less/dialog/group-roll-dialog/initialization.less +++ b/styles/less/dialog/group-roll-dialog/initialization.less @@ -22,6 +22,7 @@ font-family: var(--dh-font-body); font-size: var(--font-size-12); font-weight: 300; + text-align: center; } .members-container { diff --git a/styles/less/global/chat.less b/styles/less/global/chat.less index b9478ea4..4e29cfff 100644 --- a/styles/less/global/chat.less +++ b/styles/less/global/chat.less @@ -7,12 +7,12 @@ .chat-log .chat-message { background-image: url('../assets/parchments/dh-parchment-light.png'); - .message-header .message-header-metadata .message-metadata, - .message-header .message-header-main .message-sub-header-container { + .message-header .message-header-main .message-metadata, + .message-header .message-header-main .name { color: @dark; } - .message-header .message-header-main .message-sub-header-container h4 { + .message-header .message-header-main h4 { color: @dark-blue; } @@ -42,27 +42,12 @@ .message-header { display: flex; - gap: 4px; + gap: 8px; padding: 8px; + align-items: center; - .message-header-metadata { - flex: none; - display: flex; - flex-direction: column; - - .message-metadata { - font-family: @font-body; - color: @beige; - } - } - - .message-header-main { - display: flex; - align-items: center; - gap: 8px; - flex: 1; - overflow: hidden; - + .portrait { + flex: 0 0 auto; .actor-img { border-radius: 50%; width: 40px; @@ -70,20 +55,60 @@ object-fit: cover; object-position: top center; } + } - .message-sub-header-container { + .message-header-main { + display: flex; + align-items: center; + column-gap: 4px; + row-gap: 2px; + flex: 1; + overflow: hidden; + + display: grid; + grid-template: + "title metadata" + "subtitle subtitle"; + + h4 { + font-size: var(--font-size-16); + font-weight: bold; + margin-bottom: 0; + font-family: @font-subtitle; + color: @golden; + white-space: nowrap; + text-overflow: ellipsis; + flex: 1; + overflow: hidden; + align-self: flex-end; + } + + .message-metadata { + font-family: @font-body; + color: @beige; + white-space: nowrap; + align-items: baseline; + .message-timestamp { + font-size: var(--font-size-11); + } + } + + .subtitle { + grid-area: subtitle; flex: 1; display: flex; - flex-direction: column; justify-content: space-between; color: @beige; - - h4 { - font-size: var(--font-size-16); - font-weight: bold; - margin-bottom: 0; - font-family: @font-subtitle; - color: @golden; + gap: 4px; + align-items: baseline; + line-height: 1; + .name { + flex: 1; + } + .whisper-to { + color: @color-text-subtle; + flex: 0; + white-space: nowrap; } } } diff --git a/styles/less/global/elements.less b/styles/less/global/elements.less index d570c08c..d31e09b9 100755 --- a/styles/less/global/elements.less +++ b/styles/less/global/elements.less @@ -26,9 +26,11 @@ &:focus, &:focus[type='text'], &:focus[type='number'] { - background: light-dark(@soft-shadow, @semi-transparent-dark-blue); - box-shadow: none; - outline: 2px solid @input-color-border; + &:where(:not(:disabled)) { + background: light-dark(@soft-shadow, @semi-transparent-dark-blue); + box-shadow: none; + outline: 2px solid @input-color-border; + } } &:disabled[type='text'], @@ -306,6 +308,10 @@ min-height: auto; row-gap: 0; + &.active { + row-gap: 10px; + } + legend { display: flex; align-items: center; @@ -589,7 +595,86 @@ margin-top: 4px; color: light-dark(#14142599, #efe6d850); font-size: var(--font-size-12); - padding-left: 3px; + padding-left: 16px; + } + + section.gm-notes-section { + padding-bottom: var(--spacer-4); + header.gm-notes + p { + margin-top: 0; + } + } + + header.gm-notes { + position: relative; + display: flex; + gap: 6px; + align-items: center; + &::before, + &::after { + content: " "; + flex: 1; + border-bottom: 1px solid var(--color-dark-6); + } + &::before { + mask-image: linear-gradient(270deg, black 0%, black calc(100% - 10px), transparent 100%); + } + &::after { + mask-image: linear-gradient(270deg, transparent 0%, black 10px, black 100%); + } + margin-top: var(--spacer-8); + margin-bottom: var(--spacer-4); + font-size: var(--font-size-11); + text-transform: uppercase; + } + + secret-block { + display: block; + + /** A buffer to make the hover behavior work a bit better. The bottom in the button needs to compensate */ + @buffer: 8px; + margin-top: -@buffer; + padding-top: @buffer; + + button.reveal { + --button-size: 1rem; + height: var(--button-size); + position: absolute; + margin: auto; + left: 0; + right: 0; + width: min-content; + padding: 1px 8px 0 8px; + bottom: calc(100% - 0.4375rem - 1px); + + background-color: var(--dh-window-button-color-bg); // todo: find a better var name + border-color: var(--color-secret-border); + color: var(--dh-window-button-color-text); + font-size: var(--font-size-10); + user-select: none; + text-transform: uppercase; + white-space: nowrap; + + visibility: hidden; + } + + &:hover button.reveal { + visibility: visible; + } + } + + /** + * The element inside a secret-block. + * This is separate since during prosemirror editing, the secret-block container does not exist. + */ + section.secret { + --color-secret-bg: @red-10; + --color-revealed-bg: @green-10; + position: relative; + padding: 0; + p { + margin: 0.5rem 0; + } } } @@ -811,4 +896,8 @@ right: 2px; } } + + .gm-notes { + font-style: italic; + } } diff --git a/styles/less/global/feature-section.less b/styles/less/global/feature-section.less index 2fd4e20f..ecfb4ff6 100644 --- a/styles/less/global/feature-section.less +++ b/styles/less/global/feature-section.less @@ -3,7 +3,7 @@ .sheet.daggerheart.dh-style.item { .tab.features { - padding: 0 10px; + padding: 7px 10px; overflow-y: auto; .feature-list { display: flex; diff --git a/styles/less/global/global.less b/styles/less/global/global.less index 19a9e519..2c44c94e 100644 --- a/styles/less/global/global.less +++ b/styles/less/global/global.less @@ -111,3 +111,7 @@ body.theme-light, .themed.theme-light { color-scheme: light; } + +body:not([data-gm=true]) [data-visibility="gm"] { + display: none; +} \ No newline at end of file diff --git a/styles/less/global/inventory-item.less b/styles/less/global/inventory-item.less index b80be41b..d2ca76c6 100644 --- a/styles/less/global/inventory-item.less +++ b/styles/less/global/inventory-item.less @@ -167,37 +167,7 @@ } .inventory-description { overflow: hidden; - - h1 { - font-size: var(--font-size-32); - } - h2 { - font-size: var(--font-size-28); - font-weight: 600; - } - h3 { - font-size: var(--font-size-20); - font-weight: 600; - } - h4 { - font-size: var(--font-size-16); - color: @beige; - font-weight: 600; - } - - ul, - ol { - margin: 1rem 0; - padding: 0 0 0 1.25rem; - - li { - margin-bottom: 0.25rem; - } - } - - ul { - list-style: disc; - } + .typography(); } } .item-resources { diff --git a/styles/less/global/item-header.less b/styles/less/global/item-header.less index f47ca7dc..1a8d7fce 100755 --- a/styles/less/global/item-header.less +++ b/styles/less/global/item-header.less @@ -12,12 +12,14 @@ }); .application.sheet.daggerheart.dh-style { + --portrait-size: 150px; + .item-sheet-header { display: flex; .profile { - height: 150px; - width: 150px; + height: var(--portrait-size); + width: var(--portrait-size); object-fit: cover; border-right: 1px solid light-dark(@dark-blue, @golden); border-bottom: 1px solid light-dark(@dark-blue, @golden); @@ -34,19 +36,24 @@ text-align: center; width: 80%; - .item-name input[type='text'] { - font-size: var(--font-size-32); - height: 42px; - text-align: center; - width: 90%; - transition: all 0.3s ease; - outline: 2px solid transparent; - border: 1px solid transparent; + .item-name { + display: flex; + flex-direction: column; + margin: 10px 10px 0 10px; + input[type='text'] { + font-size: var(--font-size-30); + text-align: center; + width: 100%; + transition: all 0.3s ease; + outline: 2px solid transparent; + border: 1px solid transparent; + text-overflow: ellipsis; - &:hover[type='text'], - &:focus[type='text'] { - box-shadow: none; - outline: 2px solid light-dark(@dark-blue, @golden); + &:hover[type='text'], + &:focus[type='text'] { + box-shadow: none; + outline: 2px solid light-dark(@dark-blue, @golden); + } } } diff --git a/styles/less/global/prose-mirror.less b/styles/less/global/prose-mirror.less index 27048ddf..430ca79d 100644 --- a/styles/less/global/prose-mirror.less +++ b/styles/less/global/prose-mirror.less @@ -14,36 +14,7 @@ } .editor-content { .with-scroll-shadows(); - h1 { - font-size: var(--font-size-32); - } - h2 { - font-size: var(--font-size-28); - font-weight: 600; - } - h3 { - font-size: var(--font-size-20); - font-weight: 600; - } - h4 { - font-size: var(--font-size-16); - color: light-dark(@dark, @beige); - font-weight: 600; - } - - ul, - ol { - margin: 1rem 0; - padding: 0 0 0 1.25rem; - - li { - margin-bottom: 0.25rem; - } - } - - ul { - list-style: disc; - } + .typography(); } // Fixes centering and makes it not render over scrollbar &:hover button.toggle:enabled { diff --git a/styles/less/global/sheet.less b/styles/less/global/sheet.less index 8381c7c3..d7be1a84 100755 --- a/styles/less/global/sheet.less +++ b/styles/less/global/sheet.less @@ -36,8 +36,8 @@ body.game:is(.performance-low, .noblur) { } button { - background: light-dark(#e8e6e3, @deep-black); - color: light-dark(@dark-blue, @beige); + background: var(--dh-window-button-color-bg); + color: var(--dh-window-button-color-text); border: 1px solid light-dark(@dark-blue, transparent); padding: 0; diff --git a/styles/less/global/tab-description.less b/styles/less/global/tab-description.less index 5c18e02b..e2869723 100644 --- a/styles/less/global/tab-description.less +++ b/styles/less/global/tab-description.less @@ -6,11 +6,80 @@ display: flex; flex-direction: column; flex: 1; - overflow-y: hidden !important; - padding-top: 10px; + overflow: hidden; + padding: 0; + margin: 0; - prose-mirror.active + .artist-attribution { - display: none; + .description-section { + flex: 1; + display: flex; + flex-direction: column; + overflow: auto; + padding: 12px 16px 4px 16px; + .with-scroll-shadows(); + prose-mirror { + button.toggle { + top: 0px; + right: 0; + } + button[data-action=editGMNote] { + right: calc(var(--button-size) + 4px); + } + &.inactive { + height: unset!important; + overflow: unset; + .editor-content { + position: relative; + overflow: unset; + + // Allows content links to peek out + margin-top: -4px; + padding: 4px 0 0 0; + } + } + &.active { + --min-height: 250px; + padding: 8px 0 0 16px; + button[data-action=editGMNote] { + display: none; + } + .editor-content { + padding-right: 16px; + padding-bottom: 4px; + } + } + } + /** Hide editors that are empty when inactive if we need them to be */ + prose-mirror.inactive.hide-if-inactive { + display: none; + } + &:has(prose-mirror.active) { + padding: 0; + } + /** Description should fill available room (with overriden exceptions) */ + prose-mirror[name="system.description"] { + flex: 1 0; + } + &:has(prose-mirror[name="system.gmNotes"]:not(.hide-if-inactive)) { + prose-mirror.inactive { + --min-height: 3rem; + &[name="system.description"] { + flex: 0 0; + } + &[name="system.gmNotes"] { + flex: 1 0; + } + } + } + } + + /** Hide other elements if an editor is open */ + &:has(prose-mirror.active) { + prose-mirror.inactive, + header.gm-notes, + .artist-attribution { + display: none; + } } } } diff --git a/styles/less/sheets/actors/actor-sheet-shared.less b/styles/less/sheets/actors/actor-sheet-shared.less index 3e233013..a464d7a1 100644 --- a/styles/less/sheets/actors/actor-sheet-shared.less +++ b/styles/less/sheets/actors/actor-sheet-shared.less @@ -93,10 +93,6 @@ padding: 8px 0 0 16px; } } - - .artist-attribution { - padding-left: 16px; - } } .search-section { diff --git a/styles/less/sheets/actors/character/header.less b/styles/less/sheets/actors/character/header.less index 81345715..68ebc812 100644 --- a/styles/less/sheets/actors/character/header.less +++ b/styles/less/sheets/actors/character/header.less @@ -42,19 +42,14 @@ } h1 { + --dh-input-color-border: @color-border; display: flex; flex: 1; padding: 6px 0 0 0; font-size: var(--font-size-32); text-align: start; - border: 1px solid transparent; - outline: 2px solid transparent; transition: all 0.3s ease; word-break: break-word; - - &:hover { - outline: 2px solid light-dark(@dark, @golden); - } } .level-div { diff --git a/styles/less/sheets/actors/character/inventory.less b/styles/less/sheets/actors/character/inventory.less index ce7a8cdb..2e40b349 100644 --- a/styles/less/sheets/actors/character/inventory.less +++ b/styles/less/sheets/actors/character/inventory.less @@ -7,7 +7,7 @@ .items-section { display: flex; flex-direction: column; - gap: 10px; + gap: 10px; padding: 8px calc(12px - var(--scrollbar-width)) 4px 12px; .stable-scroll-container(); } diff --git a/styles/less/sheets/actors/party/header.less b/styles/less/sheets/actors/party/header.less index 58e3bc31..96858805 100644 --- a/styles/less/sheets/actors/party/header.less +++ b/styles/less/sheets/actors/party/header.less @@ -1,48 +1,44 @@ -@import '../../../utils/colors.less'; -@import '../../../utils/fonts.less'; -@import '../../../utils/mixin.less'; - -.party-header-sheet { - display: flex; - flex-direction: column; - justify-content: start; - text-align: center; - - .profile { - height: 235px; - cursor: pointer; - .smooth-gradient-ease-in-out(mask-image, to top, black, 3.5rem); - } - - .item-container { - margin-top: -2rem; - z-index: 1; - input.item-name[type='text'] { - backdrop-filter: none; - border: none; - color: @color-text-emphatic; - font-family: @font-title; - font-size: var(--font-size-32); - outline: 2px solid transparent; - box-shadow: unset; - text-shadow: 0 0 4px @color-text-shadow-contrast, 0 0 8px @color-text-shadow-contrast, 0 0 14px @color-text-shadow-contrast; - - text-align: center; - transition: all 0.3s ease; - width: calc(100% - 40px); - height: 2.625rem; - - &:hover[type='text'], - &:focus[type='text'] { - outline: 2px solid @color-border; - } - } - - .label { - font-style: normal; - font-weight: 700; - font-size: 16px; - margin: 5px 0; - } - } -} +@import '../../../utils/colors.less'; +@import '../../../utils/fonts.less'; +@import '../../../utils/mixin.less'; + +.party-header-sheet { + display: flex; + flex-direction: column; + justify-content: start; + text-align: center; + + .profile { + height: 235px; + cursor: pointer; + .smooth-gradient-ease-in-out(mask-image, to top, black, 3.5rem); + } + + .item-container { + margin-top: -2rem; + z-index: 1; + input.item-name[type='text'] { + --dh-input-color-border: @color-border; + backdrop-filter: none; + border: none; + color: @color-text-emphatic; + font-family: @font-title; + font-size: var(--font-size-32); + outline: 2px solid transparent; + box-shadow: unset; + text-shadow: 0 0 4px @color-text-shadow-contrast, 0 0 8px @color-text-shadow-contrast, 0 0 14px @color-text-shadow-contrast; + + text-align: center; + transition: all 0.3s ease; + width: calc(100% - 40px); + height: 2.625rem; + } + + .label { + font-style: normal; + font-weight: 700; + font-size: 16px; + margin: 5px 0; + } + } +} diff --git a/styles/less/sheets/actors/party/inventory.less b/styles/less/sheets/actors/party/inventory.less index 444c6a57..a0db5dfe 100644 --- a/styles/less/sheets/actors/party/inventory.less +++ b/styles/less/sheets/actors/party/inventory.less @@ -8,10 +8,8 @@ display: flex; flex-direction: column; gap: 10px; - overflow-y: auto; - margin-top: 20px; - padding-bottom: 4px; - .with-scroll-shadows(); + padding: 8px calc(12px - var(--scrollbar-width)) 4px 12px; + .stable-scroll-container(); } } } diff --git a/styles/less/sheets/items/beastform.less b/styles/less/sheets/items/beastform.less index 100b024a..017c4ef0 100644 --- a/styles/less/sheets/items/beastform.less +++ b/styles/less/sheets/items/beastform.less @@ -1,4 +1,6 @@ .application.sheet.daggerheart.dh-style.beastform { + --portrait-size: 130px; + .settings.tab { .advantage-on-section { display: flex; @@ -9,4 +11,11 @@ font-style: italic; } } + .tab.features.active { + display: flex; + flex-direction: column; + gap: 10px; + padding: 8px calc(12px - var(--scrollbar-width)) 4px 12px; + .stable-scroll-container(); + } } diff --git a/styles/less/sheets/items/feature.less b/styles/less/sheets/items/feature.less index f3c7cd49..9166fac1 100644 --- a/styles/less/sheets/items/feature.less +++ b/styles/less/sheets/items/feature.less @@ -2,17 +2,9 @@ @import '../../utils/fonts.less'; .application.sheet.daggerheart.dh-style.feature { - .item-sheet-header { - display: flex; - - .profile { - height: 130px; - width: 130px; - } - } + --portrait-size: 130px; section.tab { - height: 400px; overflow-y: auto; } } diff --git a/styles/less/sheets/items/index.less b/styles/less/sheets/items/index.less index 7c40a2e3..7f9bb684 100644 --- a/styles/less/sheets/items/index.less +++ b/styles/less/sheets/items/index.less @@ -1,6 +1,6 @@ +@import './item-sheet-shared.less'; @import './beastform.less'; @import './class.less'; @import './domain-card.less'; @import './feature.less'; -@import './heritage.less'; -@import './item-sheet-shared.less'; \ No newline at end of file +@import './heritage.less'; \ No newline at end of file diff --git a/styles/less/sheets/items/item-sheet-shared.less b/styles/less/sheets/items/item-sheet-shared.less index 5155ad70..63846b8e 100644 --- a/styles/less/sheets/items/item-sheet-shared.less +++ b/styles/less/sheets/items/item-sheet-shared.less @@ -1,4 +1,4 @@ -.application.sheet.daggerheart.dh-style.item { +.item.daggerheart.dh-style:where(.application.sheet) { &.minimized { .attribution-header-label { display: none; @@ -14,4 +14,22 @@ button.plain.inline-control { flex: 0 0 auto; } + + .tab-navigation { + margin-bottom: 0; + } + + /** Default tab stylings */ + .tab.active { + padding-top: 8px; + .with-scroll-shadows(); + + &.effects { + display: flex; + flex-direction: column; + gap: 10px; + padding: 8px calc(12px - var(--scrollbar-width)) 4px 12px; + .stable-scroll-container(); + } + } } diff --git a/styles/less/ui/chat/ability-use.less b/styles/less/ui/chat/ability-use.less index 981d1188..9d3cb84e 100644 --- a/styles/less/ui/chat/ability-use.less +++ b/styles/less/ui/chat/ability-use.less @@ -117,7 +117,9 @@ } .description { - padding: 8px; + padding: 0; + margin: 8px; + .typography(); } .ability-card-footer { diff --git a/styles/less/utils/colors.less b/styles/less/utils/colors.less index bb219ebb..d9358112 100755 --- a/styles/less/utils/colors.less +++ b/styles/less/utils/colors.less @@ -107,6 +107,8 @@ --dh-input-color-text: @dark; --dh-trait-color-bg: #b1afb6; --dh-trait-color-border: #8e8d96; + --dh-window-button-color-bg: #e8e6e3; + --dh-window-button-color-text: @dark-blue; } } @scope (.theme-dark) to (.themed) { @@ -124,6 +126,8 @@ --dh-input-color-text: @beige; --dh-trait-color-bg: #50433F; --dh-trait-color-border: #927952; + --dh-window-button-color-bg: @deep-black; + --dh-window-button-color-text: @beige; } } diff --git a/styles/less/utils/mixin.less b/styles/less/utils/mixin.less index 2ce85166..429fb3ef 100644 --- a/styles/less/utils/mixin.less +++ b/styles/less/utils/mixin.less @@ -203,4 +203,38 @@ overflow-y: auto; scrollbar-gutter: stable; .with-scroll-shadows(); -} \ No newline at end of file +} + +/** Typography stylings for most longform text, usually item descriptions */ +.typography() { + h1 { + font-size: var(--font-size-32); + } + h2 { + font-size: var(--font-size-28); + font-weight: 600; + } + h3 { + font-size: var(--font-size-20); + font-weight: 600; + } + h4 { + font-size: var(--font-size-16); + color: light-dark(@dark, @beige); + font-weight: 600; + } + + ul, + ol { + margin: 0.5rem 0; + padding: 0 0 0 1.25rem; + + li { + margin-bottom: 0.25rem; + } + } + + ul { + list-style: disc; + } +} diff --git a/styles/less/ux/tooltip/index.less b/styles/less/ux/tooltip/index.less index eeec9354..30cb88df 100644 --- a/styles/less/ux/tooltip/index.less +++ b/styles/less/ux/tooltip/index.less @@ -1,4 +1,130 @@ -@import './sheet.less'; +#tooltip:has(div.daggerheart.dh-style.tooltip.card-style), +aside[role='tooltip']:has(div.daggerheart.dh-style.tooltip), +#tooltip.bordered-tooltip { + .tooltip-title { + font-size: var(--font-size-20); + color: @color-text-emphatic; + font-weight: 700; + } + + .tooltip-description { + font-style: inherit; + text-align: inherit; + width: 100%; + padding: 5px 10px; + position: relative; + margin-top: 5px; + + &::before { + content: ''; + background: @golden; + mask-image: linear-gradient(270deg, transparent 0%, black 50%, transparent 100%); + height: 2px; + width: calc(100% - 10px); + } + + &::before { + position: absolute; + top: -5px; + } + } + + .tooltip-separator { + background: @golden; + mask-image: linear-gradient(270deg, transparent 0%, black 50%, transparent 100%); + height: 2px; + width: calc(100% - 10px); + margin-bottom: 2px; + } + + .tooltip-tags { + display: flex; + flex-direction: column; + gap: 10px; + width: 100%; + padding: 5px 10px; + position: relative; + max-height: 150px; + overflow-y: auto; + position: relative; + + .tooltip-tag { + display: flex; + gap: 10px; + flex-direction: column; + + .tooltip-tag-label-container { + display: flex; + align-items: center; + gap: 5px; + + img { + width: 40px; + height: 40px; + border-radius: 3px; + } + } + } + } + + .tags { + display: flex; + gap: 5px 10px; + padding-bottom: 4px; + flex-wrap: wrap; + justify-content: center; + + &.advantages { + width: 100%; + padding: 5px 10px; + padding-bottom: 16px; + position: relative; + margin-top: 5px; + + &::before { + content: ''; + background: @golden; + mask-image: linear-gradient(270deg, transparent 0%, black 50%, transparent 100%); + height: 2px; + width: calc(100% - 10px); + } + + &::before { + position: absolute; + top: -5px; + } + + .tag { + background: @green-10; + color: @green; + border-color: @green; + } + } + + .tag { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + padding: 3px 5px; + font-size: var(--font-size-12); + font: @font-body; + + background: light-dark(@dark-15, @beige-15); + border: 1px solid light-dark(@dark, @beige); + border-radius: 3px; + } + + .label { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + font-size: var(--font-size-12); + } + } +} + @import './armorManagement.less'; @import './battlepoints.less'; @import './bordered-tooltip.less'; diff --git a/styles/less/ux/tooltip/sheet.less b/styles/less/ux/tooltip/sheet.less deleted file mode 100644 index cc4166da..00000000 --- a/styles/less/ux/tooltip/sheet.less +++ /dev/null @@ -1,126 +0,0 @@ -#tooltip:has(div.daggerheart.dh-style.tooltip.card-style), -aside[role='tooltip']:has(div.daggerheart.dh-style.tooltip), -#tooltip.bordered-tooltip { - .tooltip-title { - font-size: var(--font-size-20); - color: @color-text-emphatic; - font-weight: 700; - } - - .tooltip-description { - font-style: inherit; - text-align: inherit; - width: 100%; - padding: 5px 10px; - position: relative; - margin-top: 5px; - - &::before { - content: ''; - background: @golden; - mask-image: linear-gradient(270deg, transparent 0%, black 50%, transparent 100%); - height: 2px; - width: calc(100% - 10px); - } - - &::before { - position: absolute; - top: -5px; - } - } - - .tooltip-separator { - background: @golden; - mask-image: linear-gradient(270deg, transparent 0%, black 50%, transparent 100%); - height: 2px; - width: calc(100% - 10px); - margin-bottom: 2px; - } - - .tooltip-tags { - display: flex; - flex-direction: column; - gap: 10px; - width: 100%; - padding: 5px 10px; - position: relative; - max-height: 150px; - overflow-y: auto; - position: relative; - - .tooltip-tag { - display: flex; - gap: 10px; - flex-direction: column; - - .tooltip-tag-label-container { - display: flex; - align-items: center; - gap: 5px; - - img { - width: 40px; - height: 40px; - border-radius: 3px; - } - } - } - } - - .tags { - display: flex; - gap: 5px 10px; - padding-bottom: 16px; - flex-wrap: wrap; - justify-content: center; - - &.advantages { - width: 100%; - padding: 5px 10px; - padding-bottom: 16px; - position: relative; - margin-top: 5px; - - &::before { - content: ''; - background: @golden; - mask-image: linear-gradient(270deg, transparent 0%, black 50%, transparent 100%); - height: 2px; - width: calc(100% - 10px); - } - - &::before { - position: absolute; - top: -5px; - } - - .tag { - background: @green-10; - color: @green; - border-color: @green; - } - } - - .tag { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - padding: 3px 5px; - font-size: var(--font-size-12); - font: @font-body; - - background: light-dark(@dark-15, @beige-15); - border: 1px solid light-dark(@dark, @beige); - border-radius: 3px; - } - - .label { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - font-size: var(--font-size-12); - } - } -} diff --git a/styles/less/ux/tooltip/tooltip.less b/styles/less/ux/tooltip/tooltip.less index f02499e2..26ecb5c3 100644 --- a/styles/less/ux/tooltip/tooltip.less +++ b/styles/less/ux/tooltip/tooltip.less @@ -4,6 +4,7 @@ #tooltip:has(div.daggerheart.dh-style.tooltip.card-style), aside[role='tooltip']:has(div.daggerheart.dh-style.tooltip.card-style) { padding: 0; + padding-bottom: 8px; border: none; border-radius: 10px; height: max-content; @@ -134,7 +135,6 @@ aside[role='tooltip']:has(div.daggerheart.dh-style.tooltip.card-style) { background: light-dark(@dark-blue-60, @rustic-brown-80); color: @color-text-emphatic; font-size: 12px; - margin-bottom: 10px; } } diff --git a/system.json b/system.json index d754b8bf..214ab2ee 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "id": "daggerheart", "title": "Daggerheart", "description": "An unofficial implementation of the Daggerheart system", - "version": "2.5.0", + "version": "2.5.4", "compatibility": { "minimum": "14.364", "verified": "14.364", @@ -10,7 +10,7 @@ }, "url": "https://github.com/Foundryborne/daggerheart", "manifest": "https://raw.githubusercontent.com/Foundryborne/daggerheart/v14/system.json", - "download": "https://github.com/Foundryborne/daggerheart/releases/download/2.5.0/system.zip", + "download": "https://github.com/Foundryborne/daggerheart/releases/download/2.5.4/system.zip", "authors": [ { "name": "WBHarry" @@ -256,34 +256,34 @@ }, "Item": { "ancestry": { - "htmlFields": ["description"] + "htmlFields": ["description", "gmNotes"] }, "community": { - "htmlFields": ["description"] + "htmlFields": ["description", "gmNotes"] }, "class": { - "htmlFields": ["description"] + "htmlFields": ["description", "gmNotes"] }, "subclass": { - "htmlFields": ["description"] + "htmlFields": ["description", "gmNotes"] }, "feature": { - "htmlFields": ["description"] + "htmlFields": ["description", "gmNotes"] }, "domainCard": { - "htmlFields": ["description"] + "htmlFields": ["description", "gmNotes"] }, "loot": { - "htmlFields": ["description"] + "htmlFields": ["description", "gmNotes"] }, "consumable": { - "htmlFields": ["description"] + "htmlFields": ["description", "gmNotes"] }, "weapon": { - "htmlFields": ["description"] + "htmlFields": ["description", "gmNotes"] }, "armor": { - "htmlFields": ["description"] + "htmlFields": ["description", "gmNotes"] }, "beastform": {} }, diff --git a/templates/actionTypes/cost.hbs b/templates/actionTypes/cost.hbs index 7a9f33d9..b8661b5b 100644 --- a/templates/actionTypes/cost.hbs +++ b/templates/actionTypes/cost.hbs @@ -9,7 +9,7 @@ {{/if}}
{{formField ../fields.scalable label="DAGGERHEART.GENERAL.scalable" value=cost.scalable name=(concat "cost." index ".scalable") classes="checkbox" localize=true}} - {{formField ../fields.key choices=(@root.disableOption index @root.costOptions ../source) label="DAGGERHEART.GENERAL.resource" value=cost.key name=(concat "cost." index ".key") localize=true blank=false}} + {{formField ../fields.key choices=(@root.disableOption index @root.costOptions ../source) label="DAGGERHEART.GENERAL.Resource.single" value=cost.key name=(concat "cost." index ".key") localize=true blank=false}} {{formField ../fields.value label="DAGGERHEART.GENERAL.amount" value=cost.value name=(concat "cost." index ".value") localize=true}} {{formField ../fields.step label="DAGGERHEART.GENERAL.step" value=cost.step name=(concat "cost." index ".step") disabled=(not cost.scalable) localize=true}} diff --git a/templates/actionTypes/damage.hbs b/templates/actionTypes/damage.hbs index 03300840..d430b51f 100644 --- a/templates/actionTypes/damage.hbs +++ b/templates/actionTypes/damage.hbs @@ -1,92 +1,114 @@ - -
- - {{#if (eq @root.source.type 'healing')}} - {{localize "DAGGERHEART.GENERAL.healing"}} - {{else}} +{{#unless (eq @root.source.type 'healing')}} +
+ {{localize "DAGGERHEART.GENERAL.damage"}} + {{#if source.main}} + + {{else}} + + {{/if}} + + + {{#if source.main}} +
+ {{#if @root.hasBaseDamage}} + {{formField @root.fields.damage.fields.main.fields.includeBase value=source.main.includeBase name="damage.main.includeBase" classes="checkbox" localize=true }} + {{/if}} + {{#unless (eq @root.source.type 'healing')}} + {{formField baseFields.main.fields.direct value=source.main.direct name=(concat path "damage.main.direct") localize=true classes="checkbox"}} + {{/unless}} + {{#if (and @root.isNPC (not (eq path 'system.attack.')))}} + {{formField baseFields.main.fields.groupAttack value=source.main.groupAttack name=(concat path "damage.main.groupAttack") localize=true classes="select"}} + {{/if}} +
+ {{> damageData damage=source.main fields=fields.main.fields basePath=(concat path "damage.main")}} + {{#if horde}} + {{> hordeDamage source=source.main fields=fields.main.fields basePath=(concat path "damage.main")}} + {{/if}} + {{#if (ne @root.source.type 'healing')}} + {{formField fields.main.fields.type value=source.main.type name=(concat path "damage.main.type") localize=true}} + {{/if}} {{/if}} - {{#unless (eq path 'system.attack.')}}{{/unless}} - -
- {{#if @root.hasBaseDamage}} - {{formField @root.fields.damage.fields.includeBase value=@root.source.damage.includeBase name="damage.includeBase" classes="checkbox" localize=true }} - {{/if}} - {{#unless (eq @root.source.type 'healing')}} - {{formField baseFields.direct value=source.direct name=(concat path "damage.direct") localize=true classes="checkbox"}} - {{/unless}} - {{#if (and @root.isNPC (not (eq path 'system.attack.')))}} - {{formField baseFields.groupAttack value=source.groupAttack name=(concat path "damage.groupAttack") localize=true classes="select"}} - {{/if}} -
+
+{{/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 key|}} -
- - - {{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"}} - {{/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}} -
-
- {{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}} -
-
- {{else}} - {{> formula fields=../fields.value.fields type=../fields.type dmg=dmg source=dmg.value target="value" key=dmg.applyTo 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}} - - {{#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"}} -
-
- {{/if}} - -
-
- {{/each}} - +{{#unless (eq path 'system.attack.')}} + {{! In the future, consider allowing this even on NPCs}} +
+ + {{#if (eq @root.source.type 'healing')}} + {{localize "DAGGERHEART.GENERAL.healing"}} + {{else}} + {{localize "DAGGERHEART.ACTIONS.Config.damage.markResources"}} + {{/if}} + {{#unless @root.allDamageTypesUsed}}{{/unless}} + + {{#each source.resources as |dmg key|}} +
+ + + {{localize (concat "DAGGERHEART.CONFIG.HealingType." dmg.applyTo ".name")}} + {{#unless (or dmg.base ../path)}} + + {{/unless}} + + {{> damageData damage=dmg fields=../fields.resources.element.fields basePath=(concat ../path "damage.resources." dmg.applyTo)}} +
+ + {{/each}} + +{{/unless}} {{#*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}} - {{/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}} - {{else}} -
- {{#unless @root.isNPC}} - {{formField fields.multiplier value=source.multiplier name=(concat path "damage.parts." key "." 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}} - {{#if @root.isNPC}} - - {{/if}} + {{#unless isBase}} + {{formField fields.custom.fields.enabled value=source.custom.enabled name=(concat basePath ".custom.enabled") classes="checkbox" localize=true}} + {{/unless}} + {{#if source.custom.enabled}} + {{formField fields.custom.fields.formula value=source.custom.formula name=(concat basePath ".custom.formula") localize=true}} + {{else}} +
+ {{#unless @root.isNPC}} + {{formField fields.multiplier value=source.multiplier name=(concat basePath ".multiplier") localize=true}} + {{/unless}} + {{#if (eq source.multiplier 'flat')}}{{formField fields.flatMultiplier value=source.flatMultiplier name=(concat basePath ".flatMultiplier") localize=true }}{{/if}} + {{formField fields.dice value=source.dice name=(concat basePath ".dice") localize=true}} + {{formField fields.bonus value=source.bonus name=(concat basePath ".bonus") localize=true}} +
+ {{/if}} + {{#if @root.isNPC}} + + {{/if}} +{{/inline}} + +{{#*inline "damageData"}} + {{#if (and (not @root.isNPC) @root.hasRoll (not damage.base))}} + {{formField fields.resultBased value=damage.resultBased name=(concat basePath ".resultBased") localize=true classes="checkbox"}} + {{/if}} + {{#if (and (not @root.isNPC) @root.hasRoll (not damage.base) damage.resultBased)}} +
+
+ {{localize "DAGGERHEART.GENERAL.withThing" thing=(localize "DAGGERHEART.GENERAL.hope")}} + {{> formula key=damage.applyTo fields=fields.value.fields type=fields.type isBase=damage.base source=damage.value basePath=(concat basePath ".value")}} +
+
+ {{localize "DAGGERHEART.GENERAL.withThing" thing=(localize "DAGGERHEART.GENERAL.fear")}} + {{> formula key=damage.applyTo fields=fields.valueAlt.fields type=fields.type isBase=damage.base source=damage.valueAlt basePath=(concat basePath ".valueAlt")}} +
+
+ {{else}} + {{> formula key=damage.applyTo fields=fields.value.fields type=fields.type isBase=damage.base source=damage.value basePath=(concat basePath ".value")}} + {{/if}} + +{{/inline}} + +{{#*inline "hordeDamage"}} +
+ {{localize "DAGGERHEART.ACTORS.Adversary.hordeDamage"}} +
+ + {{formField fields.valueAlt.fields.flatMultiplier value=source.valueAlt.flatMultiplier name=(concat basePath ".valueAlt.flatMultiplier") label="DAGGERHEART.ACTIONS.Settings.multiplier" classes="inline-child" localize=true }} + {{formField fields.valueAlt.fields.dice value=source.valueAlt.dice name=(concat basePath ".valueAlt.dice") classes="inline-child" localize=true}} + {{formField fields.valueAlt.fields.bonus value=source.valueAlt.bonus name=(concat basePath ".valueAlt.bonus") localize=true classes="inline-child"}} +
+
{{/inline}} \ No newline at end of file diff --git a/templates/actionTypes/resource.hbs b/templates/actionTypes/resource.hbs index 9c8fc965..97304b9a 100644 --- a/templates/actionTypes/resource.hbs +++ b/templates/actionTypes/resource.hbs @@ -1,7 +1,7 @@
-
{{localize "DAGGERHEART.GENERAL.resource"}}
+
{{localize "DAGGERHEART.GENERAL.Resource.single"}}
diff --git a/templates/dialogs/dice-roll/damageSelection.hbs b/templates/dialogs/dice-roll/damageSelection.hbs index 7bcd7063..e865ebe6 100644 --- a/templates/dialogs/dice-roll/damageSelection.hbs +++ b/templates/dialogs/dice-roll/damageSelection.hbs @@ -15,34 +15,7 @@ {{/each}}
{{/if}} - - {{#each @root.formula}} -
- {{localize "DAGGERHEART.GENERAL.formula"}}: {{roll.formula}} - - {{#with (lookup @root.config.GENERAL.healingTypes applyTo)}} - {{localize label}} - {{/with}} - {{#unless @root.hasHealing}} - {{#if damageTypes}} - {{#each damageTypes as | type | }} - {{#with (lookup @root.config.GENERAL.damageTypes type)}} - - {{/with}} - {{/each}} - {{/if}} - {{/unless}} - -
-
- - -
- {{/each}} - + {{#if damageOptions.groupAttack}}
{{localize "DAGGERHEART.ACTIONS.Settings.groupAttack.label"}} @@ -59,6 +32,45 @@
{{/if}} + + {{#if @root.damageFormula}} + {{#with @root.damageFormula}} +
+ {{localize "DAGGERHEART.GENERAL.formula"}}: {{roll.formula}} + + {{localize "DAGGERHEART.GENERAL.damage"}} + {{#if damageTypes}} + {{#each damageTypes as | type | }} + {{#with (lookup @root.config.GENERAL.damageTypes type)}} + + {{/with}} + {{/each}} + {{/if}} + +
+
+ + +
+ {{/with}} + {{/if}} + + {{#each @root.resourceFormulas}} +
+ {{localize "DAGGERHEART.GENERAL.formula"}}: {{roll.formula}} + + {{#with (lookup @root.config.GENERAL.healingTypes applyTo)}} + {{localize label}} + {{/with}} + +
+
+ +
+ {{/each}} {{#unless (empty @root.modifiers)}}
@@ -76,6 +88,7 @@ {{/each}}
{{/unless}} +
{{#if directDamage}} diff --git a/templates/sheets/activeEffect/settings.hbs b/templates/sheets/activeEffect/settings.hbs index 09b78856..60df488b 100644 --- a/templates/sheets/activeEffect/settings.hbs +++ b/templates/sheets/activeEffect/settings.hbs @@ -1,5 +1,5 @@
-
+
{{localize "DAGGERHEART.ACTIVEEFFECT.Config.stacking.title"}} @@ -13,14 +13,19 @@ {{/if}}
-
- {{localize "DAGGERHEART.ACTIVEEFFECT.Config.rangeDependence.title"}} +
+ + {{localize "DAGGERHEART.ACTIVEEFFECT.Config.rangeDependence.title"}} + + - {{formGroup systemFields.rangeDependence.fields.enabled value=source.system.rangeDependence.enabled localize=true }} - {{formGroup systemFields.rangeDependence.fields.type value=source.system.rangeDependence.type localize=true }} - {{formGroup systemFields.rangeDependence.fields.target value=source.system.rangeDependence.target localize=true }} - {{formGroup systemFields.rangeDependence.fields.range value=source.system.rangeDependence.range localize=true }} + {{#if source.system.rangeDependence}} + {{formGroup systemFields.rangeDependence.fields.type value=source.system.rangeDependence.type localize=true }} + {{formGroup systemFields.rangeDependence.fields.target value=source.system.rangeDependence.target localize=true }} + {{formGroup systemFields.rangeDependence.fields.range value=source.system.rangeDependence.range localize=true }} + {{/if}}
+
{{localize "EFFECT.DURATION.Label"}} diff --git a/templates/sheets/actors/character/inventory.hbs b/templates/sheets/actors/character/inventory.hbs index 61f98ab5..8c84ee3b 100644 --- a/templates/sheets/actors/character/inventory.hbs +++ b/templates/sheets/actors/character/inventory.hbs @@ -30,7 +30,6 @@ collection=@root.inventory.armor isGlassy=true canCreate=@root.editable - hideResources=true }} {{> 'daggerheart.inventory-items' title='TYPES.Item.consumable' diff --git a/templates/sheets/actors/character/loadout.hbs b/templates/sheets/actors/character/loadout.hbs index 9ba3fb04..41c205f1 100644 --- a/templates/sheets/actors/character/loadout.hbs +++ b/templates/sheets/actors/character/loadout.hbs @@ -1,42 +1,43 @@ -
-
- - - - - -
- -
- {{> 'daggerheart.inventory-items' - title='DAGGERHEART.GENERAL.Tabs.loadout' - type='domainCard' - isGlassy=true - cardView=cardView - collection=document.system.domainCards.loadout - canCreate=@root.editable - }} - {{> 'daggerheart.inventory-items' - title='DAGGERHEART.GENERAL.Tabs.vault' - type='domainCard' - isGlassy=true - cardView=cardView - collection=document.system.domainCards.vault - canCreate=@root.editable - inVault=true - }} -
+
+
+ + + + + +
+ +
+ {{> 'daggerheart.inventory-items' + title='DAGGERHEART.GENERAL.Tabs.loadout' + type='domainCard' + isGlassy=true + cardView=cardView + collection=document.system.domainCards.loadout + canCreate=@root.editable + inVault=false + }} + {{> 'daggerheart.inventory-items' + title='DAGGERHEART.GENERAL.Tabs.vault' + type='domainCard' + isGlassy=true + cardView=cardView + collection=document.system.domainCards.vault + canCreate=@root.editable + inVault=true + }} +
\ No newline at end of file diff --git a/templates/sheets/actors/character/sidebar.hbs b/templates/sheets/actors/character/sidebar.hbs index 6ca858bf..4e729bc5 100644 --- a/templates/sheets/actors/character/sidebar.hbs +++ b/templates/sheets/actors/character/sidebar.hbs @@ -110,7 +110,7 @@ {{/each}}
-
+

{{localize "DAGGERHEART.GENERAL.loadout"}}

@@ -118,11 +118,10 @@
    {{#each document.system.domainCards.loadout as |card|}} - {{> 'daggerheart.inventory-item-compact' - item=card - type='domainCard' - }} - + {{> 'daggerheart.inventory-item-compact' + item=card + type='domainCard' + }} {{/each}}
diff --git a/templates/sheets/actors/party/party-members.hbs b/templates/sheets/actors/party/party-members.hbs index ce04a364..6fc6ecaa 100644 --- a/templates/sheets/actors/party/party-members.hbs +++ b/templates/sheets/actors/party/party-members.hbs @@ -23,12 +23,12 @@
- {{#if @root.showStats}} -
    - {{#each partyMembers as |member id|}} -
  • -
    - +
      + {{#each partyMembers as |member id|}} +
    • +
      + + {{#if @root.showStats}} {{#if member.weapons}}
      {{#each member.weapons as |weapon|}} @@ -51,12 +51,16 @@

      {{localize "DAGGERHEART.ACTORS.Party.Thresholds.severe"}}

      {{/unless}} -
      -
      -

      - {{member.name}} + {{/if}} +

    +
    +

    + {{member.name}} + {{#if @root.editable}} -

    + {{/if}} + + {{#if @root.showStats}}
    {{#unless (or (eq member.type 'companion') (eq member.type 'adversary') (eq member.type 'npc')) }}
    @@ -73,10 +77,12 @@
    {{/unless}}
    - {{#if member.subtitle}} - {{member.subtitle}} - {{/if}} -
    + {{/if}} + {{#if member.subtitle}} + {{member.subtitle}} + {{/if}} + + {{#if @root.showStats}}
    {{#unless (or (eq member.type 'companion') (eq member.type 'npc')) }} @@ -160,29 +166,10 @@ {{/if}}
    -
  • - {{/each}} -
- {{else}} -
    - {{#each partyMembers as |member id|}} -
  • -
    - -
    -
    -

    - {{member.name}} - -

    - {{#if member.subtitle}} - {{member.subtitle}} - {{/if}} -
    -
  • - {{/each}} -
- {{/if}} + {{/if}} + + {{/each}} + {{#unless document.system.partyMembers.length}}
{{localize "DAGGERHEART.GENERAL.dropActorsHere"}} diff --git a/templates/sheets/global/partials/inventory-fieldset-items-V2.hbs b/templates/sheets/global/partials/inventory-fieldset-items-V2.hbs index db2fb6b7..35a37564 100644 --- a/templates/sheets/global/partials/inventory-fieldset-items-V2.hbs +++ b/templates/sheets/global/partials/inventory-fieldset-items-V2.hbs @@ -26,7 +26,7 @@ Parameters: - showActions {boolean} : If true show feature's actions. --}} -
+
{{localize title}} {{#if canCreate}} diff --git a/templates/sheets/global/tabs/tab-description.hbs b/templates/sheets/global/tabs/tab-description.hbs index 71995a51..3fdf1a93 100755 --- a/templates/sheets/global/tabs/tab-description.hbs +++ b/templates/sheets/global/tabs/tab-description.hbs @@ -1,11 +1,25 @@ -
- {{formInput systemFields.description value=document.system.description enriched=enrichedDescription toggled=true}} - - {{#if (and showAttribution document.system.attribution.artist)}} - - {{/if}} +
+
+ {{formInput systemFields.description value=document.system.description enriched=enrichedDescription toggled=true}} + {{#if (and systemFields.gmNotes @root.user.isGM)}} +
+ {{#if enrichedGMNotes}} +
{{localize "DAGGERHEART.ITEMS.FIELDS.gmNotes.label"}}
+ {{/if}} + {{{enrichedGMNotes}}} +
+ {{/if}} +
+ {{#if (and showAttribution document.system.attribution.artist)}} + + {{/if}}
\ No newline at end of file diff --git a/templates/sheets/items/armor/settings.hbs b/templates/sheets/items/armor/settings.hbs index 51bf1746..7ec6c109 100644 --- a/templates/sheets/items/armor/settings.hbs +++ b/templates/sheets/items/armor/settings.hbs @@ -19,4 +19,6 @@ {{ formField systemFields.baseThresholds.fields.severe value=source.system.baseThresholds.severe label=(localize "DAGGERHEART.ITEMS.Armor.baseThresholds.severe") }}
+ + {{> "systems/daggerheart/templates/sheets/global/partials/resource-section/resource-section.hbs" }} \ No newline at end of file diff --git a/templates/sheets/items/weapon/settings.hbs b/templates/sheets/items/weapon/settings.hbs index c9805e7c..fbdc1e44 100644 --- a/templates/sheets/items/weapon/settings.hbs +++ b/templates/sheets/items/weapon/settings.hbs @@ -18,26 +18,26 @@
- {{#with systemFields.attack.fields.damage.fields.parts.element.fields as | fields | }} - {{#with ../document.system.attack.damage.parts.hitPoints 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"}} - {{#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"}} - {{else}} - {{localize "DAGGERHEART.GENERAL.Dice.single"}} - {{formInput fields.value.fields.dice value=source.value.dice name="system.attack.damage.parts.hitPoints.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}} - {{/if}} - {{localize "DAGGERHEART.GENERAL.type"}} - {{formInput fields.type value=source.type name="system.attack.damage.parts.hitPoints.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 systemFields.attack.fields.damage.fields.main.fields as | fields | }} + {{#with ../document.system.attack.damage.main 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.main.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.main.value.custom.formula"}} + {{else}} + {{localize "DAGGERHEART.GENERAL.Dice.single"}} + {{formInput fields.value.fields.dice value=source.value.dice name="system.attack.damage.main.value.dice"}} + {{localize "DAGGERHEART.GENERAL.bonus"}} + {{formInput fields.value.fields.bonus value=source.value.bonus name="system.attack.damage.main.value.bonus" localize=true}} + {{/if}} + {{localize "DAGGERHEART.GENERAL.type"}} + {{formInput fields.type value=source.type name="system.attack.damage.main.type" localize=true}} + {{localize "DAGGERHEART.CONFIG.DamageType.direct.name"}} + {{formInput @root.systemFields.attack.fields.damage.fields.main.fields.direct value=@root.document.system.attack.damage.main.direct name="system.attack.damage.main.direct" localize=true}} + + {{/with}} {{/with}}
diff --git a/templates/ui/chat/action.hbs b/templates/ui/chat/action.hbs index 51840363..d9ceb417 100644 --- a/templates/ui/chat/action.hbs +++ b/templates/ui/chat/action.hbs @@ -16,10 +16,10 @@ {{#each action.summon}}
- - + +
- # {{this.rolledCount}} + # {{this.quantity}}
{{/each}} diff --git a/templates/ui/chat/chat-message.hbs b/templates/ui/chat/chat-message.hbs index 87ecce39..92490cec 100644 --- a/templates/ui/chat/chat-message.hbs +++ b/templates/ui/chat/chat-message.hbs @@ -1,23 +1,18 @@
  • -
    +
    -
    - {{#if message.title}} -

    {{message.title}}

    -
    {{alias}} {{#if author.isGM}}(GM){{/if}}
    - {{else}} - {{#unless actor.name}} -

    {{author.name}}

    - {{else}} -

    {{alias}}

    -
    {{author.name}}
    - {{/unless}} - {{/if}} -
    -
    diff --git a/templates/ui/chat/parts/button-part.hbs b/templates/ui/chat/parts/button-part.hbs index 96044075..b55dcecb 100644 --- a/templates/ui/chat/parts/button-part.hbs +++ b/templates/ui/chat/parts/button-part.hbs @@ -4,18 +4,18 @@ {{/if}} {{#if areas.length}}{{/if}} {{#if hasDamage}} - {{#unless (empty damage)}} + {{#if damage.active}} {{else}} - {{/unless}} + {{/if}} {{/if}} {{#if hasHealing}} - {{#unless (empty damage)}} + {{#if damage.active}} {{else}} - {{/unless}} + {{/if}} {{/if}} {{#if (and hasEffect)}}{{/if}}
    \ No newline at end of file diff --git a/templates/ui/chat/parts/damage-part.hbs b/templates/ui/chat/parts/damage-part.hbs index 45b09b72..7d6d983d 100644 --- a/templates/ui/chat/parts/damage-part.hbs +++ b/templates/ui/chat/parts/damage-part.hbs @@ -1,4 +1,4 @@ -
    +
    {{#if hasHealing}} @@ -10,60 +10,79 @@
    - {{#each damage as | roll index | }} -
    {{localize (concat 'DAGGERHEART.CONFIG.HealingType.' index '.inChatRoll')}}: {{total}}
    + {{#if damage.main}} + {{> formula roll=damage.main label=(localize "DAGGERHEART.GENERAL.damage") }} + {{/if}} + {{#each damage.resources as | roll index | }} + {{> formula roll=roll label=(ifThen ../hasHealing (localize (concat 'DAGGERHEART.CONFIG.HealingType.' index '.name')) (localize (concat 'DAGGERHEART.CONFIG.HealingType.' index '.inChatRoll'))) }} {{/each}}
    - {{#each damage as | roll index | }} -
    - - {{#if ../hasHealing}}{{localize (concat 'DAGGERHEART.CONFIG.HealingType.' index '.name')}}{{else}}{{localize (concat 'DAGGERHEART.CONFIG.HealingType.' index '.inChatRoll')}}{{/if}}
    {{localize "DAGGERHEART.GENERAL.total"}}: {{roll.total}}
    {{#if (and (eq index "hitPoints") ../isDirect)}}
    {{localize "DAGGERHEART.CONFIG.DamageType.direct.short"}}
    {{/if}} -
    - {{#each roll.parts}} - {{#if (and (not @root.hasHealing) damageTypes.length)}} - - {{/if}} -
    - {{#if dice.length}} - {{#each dice}} - {{#each results}} - {{#unless discarded}} -
    -
    - {{#if hasRerolls}}{{/if}} - {{result}} -
    -
    - {{/unless}} - {{/each}} - {{/each}} - {{#if modifierTotal}} -
    -
    {{modifierTotal}}
    -
    - {{/if}} - {{else}} -
    -
    {{total}}
    -
    - {{/if}} -
    - {{/each}} -
    + {{#if damage.main}} + {{> damage label=(localize "DAGGERHEART.GENERAL.damage") roll=damage.main isDirect=isDirect }} + {{/if}} + + {{#each damage.resources as | roll index | }} + {{> damage + label=(ifThen ../hasHealing (localize (concat 'DAGGERHEART.CONFIG.HealingType.' index '.name')) (localize (concat 'DAGGERHEART.CONFIG.HealingType.' index '.inChatRoll'))) + roll=roll + isResource=true + }} {{/each}}
    -
    \ No newline at end of file +
    + +{{#*inline "formula"}} +
    {{label}}: {{roll.total}}
    +{{/inline}} + +{{#*inline "damage"}} +
    + + {{label}} +
    {{localize "DAGGERHEART.GENERAL.total"}}: {{roll.total}}
    {{#if isDirect}}
    {{localize "DAGGERHEART.CONFIG.DamageType.direct.short"}}
    {{/if}} +
    + {{#if (and (not @root.hasHealing) roll.options.damageTypes.length)}} + + {{/if}} +
    + {{#if roll.dice.length}} + {{#each roll.dice}} + {{#each results}} + {{#if active}} +
    +
    + {{#if hasRerolls}}{{/if}} + {{result}} +
    +
    + {{/if}} + {{/each}} + {{/each}} + + {{#if roll.modifierTotal}} +
    +
    {{roll.modifierTotal}}
    +
    + {{/if}} + {{else}} +
    +
    {{roll.total}}
    +
    + {{/if}} +
    +
    +{{/inline}} \ No newline at end of file diff --git a/templates/ui/tooltip/attack.hbs b/templates/ui/tooltip/attack.hbs index 8e4a1bb0..903c13a5 100644 --- a/templates/ui/tooltip/attack.hbs +++ b/templates/ui/tooltip/attack.hbs @@ -23,7 +23,7 @@
    {{/if}}
    - {{{damageFormula attack}}} {{{damageSymbols attack.damage.parts}}} + {{{damageFormula attack}}} {{{damageSymbols attack.damage.main}}}
    {{#if description}} diff --git a/templates/ui/tooltip/domainCard.hbs b/templates/ui/tooltip/domainCard.hbs index 0380a523..26eeedf5 100644 --- a/templates/ui/tooltip/domainCard.hbs +++ b/templates/ui/tooltip/domainCard.hbs @@ -23,7 +23,7 @@ {{#if description}} -
    {{{description}}}
    +
    {{{description}}}
    {{/if}}

    diff --git a/templates/ui/tooltip/weapon.hbs b/templates/ui/tooltip/weapon.hbs index 4adb9c46..10889015 100644 --- a/templates/ui/tooltip/weapon.hbs +++ b/templates/ui/tooltip/weapon.hbs @@ -23,7 +23,7 @@ {{/with}}

    - {{{damageFormula item.system.attack}}} {{{damageSymbols item.system.attack.damage.parts}}} + {{{damageFormula item.system.attack}}} {{{damageSymbols item.system.attack.damage.main}}}
    {{#if description}}