Compare commits

..

No commits in common. "0779443d4a44b709b9ed9df2f48eff9091a4c9d7" and "e6f26deab9216aa6f134a0e05bc9a7d1b5f71a20" have entirely different histories.

421 changed files with 4522 additions and 2881 deletions

View file

@ -392,7 +392,7 @@ const updateActorsRangeDependentEffects = async token => {
).rangeMeasurement; ).rangeMeasurement;
for (let effect of token.actor?.allApplicableEffects() ?? []) { for (let effect of token.actor?.allApplicableEffects() ?? []) {
if (!effect.system.rangeDependence) continue; if (!effect.system.rangeDependence?.enabled) continue;
const { target, range, type } = effect.system.rangeDependence; const { target, range, type } = effect.system.rangeDependence;
// If there are no targets, assume false. Otherwise, start with the effect enabled. // If there are no targets, assume false. Otherwise, start with the effect enabled.

View file

@ -167,7 +167,9 @@
}, },
"ACTIVEEFFECT": { "ACTIVEEFFECT": {
"Config": { "Config": {
"rangeDependence": { "title": "Range Dependence" }, "rangeDependence": {
"title": "Range Dependence"
},
"stacking": { "title": "Stacking" }, "stacking": { "title": "Stacking" },
"targetDispositions": "Affected Dispositions" "targetDispositions": "Affected Dispositions"
}, },
@ -772,7 +774,7 @@
"removeRoll": "Remove Roll", "removeRoll": "Remove Roll",
"resultsHint": "Results will appear when characters roll", "resultsHint": "Results will appear when characters roll",
"selectLeaderHint": "Select one Character to be the leader", "selectLeaderHint": "Select one Character to be the leader",
"selectParticipantsHint": "Select all Characters who will participate in the roll", "selectParticipantsHint": "Select one Character to be the leader",
"startGroupRoll": "Start Group Roll", "startGroupRoll": "Start Group Roll",
"title": "Group Roll" "title": "Group Roll"
}, },
@ -3233,7 +3235,7 @@
"beastformToManyAdvantages": "You cannot select any more advantages.", "beastformToManyAdvantages": "You cannot select any more advantages.",
"beastformToManyFeatures": "You cannot select any more features.", "beastformToManyFeatures": "You cannot select any more features.",
"beastformEquipWeapon": "You cannot use weapons while in a Beastform.", "beastformEquipWeapon": "You cannot use weapons while in a Beastform.",
"loadoutMaxReached": "You've reached the maximum loadout size. To add more, move at least one domain card to the vault.", "loadoutMaxReached": "You've reached maximum loadout. Move atleast one domain card to the vault, or increase the limit in homebrew settings if desired.",
"domainMaxReached": "You've reached the maximum domains for the class. Increase the limit in homebrew settings if desired.", "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.", "insufficientResources": "You don't have enough resources to use that action.",
"actionNoUsesRemaining": "That action doesn't have remaining uses.", "actionNoUsesRemaining": "That action doesn't have remaining uses.",

View file

@ -315,15 +315,15 @@ export default class BeastformDialog extends HandlebarsApplicationMixin(Applicat
const beastformEffect = selected.effects.find(x => x.type === 'beastform'); const beastformEffect = selected.effects.find(x => x.type === 'beastform');
for (const traitBonus of app.modifications.traitBonuses) { for (const traitBonus of app.modifications.traitBonuses) {
const existingChange = beastformEffect.system.changes.find( const existingChange = beastformEffect.changes.find(
x => x.key === `system.traits.${traitBonus.trait}.value` x => x.key === `system.traits.${traitBonus.trait}.value`
); );
if (existingChange) { if (existingChange) {
existingChange.value = Number.parseInt(existingChange.value) + traitBonus.bonus; existingChange.value = Number.parseInt(existingChange.value) + traitBonus.bonus;
} else { } else {
beastformEffect.system.changes.push({ beastformEffect.changes.push({
key: `system.traits.${traitBonus.trait}.value`, key: `system.traits.${traitBonus.trait}.value`,
type: 'add', mode: 2,
priority: null, priority: null,
value: traitBonus.bonus value: traitBonus.bonus
}); });

View file

@ -139,15 +139,13 @@ export default class DhDeathMove extends HandlebarsApplicationMixin(ApplicationV
name: game.i18n.localize('DAGGERHEART.CONFIG.DeathMoves.blazeOfGlory.name'), name: game.i18n.localize('DAGGERHEART.CONFIG.DeathMoves.blazeOfGlory.name'),
description: game.i18n.localize('DAGGERHEART.CONFIG.DeathMoves.blazeOfGlory.description'), description: game.i18n.localize('DAGGERHEART.CONFIG.DeathMoves.blazeOfGlory.description'),
img: CONFIG.DH.GENERAL.deathMoves.blazeOfGlory.img, img: CONFIG.DH.GENERAL.deathMoves.blazeOfGlory.img,
system: { changes: [
changes: [ {
{ key: 'system.rules.roll.guaranteedCritical',
key: 'system.rules.roll.guaranteedCritical', mode: 2,
type: 'add', value: 'true'
value: 'true' }
} ]
]
}
} }
]); ]);

View file

@ -1,7 +1,7 @@
import { ResourceUpdateMap } from '../../data/action/baseAction.mjs'; import { ResourceUpdateMap } from '../../data/action/baseAction.mjs';
import { shouldUseHopeFearAutomation } from '../../helpers/utils.mjs'; import { shouldUseHopeFearAutomation } from '../../helpers/utils.mjs';
import { emitGMUpdate, GMUpdateEvent, RefreshType, socketEvent } from '../../systemRegistration/socket.mjs'; import { emitGMUpdate, GMUpdateEvent, RefreshType, socketEvent } from '../../systemRegistration/socket.mjs';
import PartySheet from '../sheets/actors/party.mjs'; import Party from '../sheets/actors/party.mjs';
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
@ -11,7 +11,7 @@ export default class GroupRollDialog extends HandlebarsApplicationMixin(Applicat
this.party = party; this.party = party;
this.partyMembers = party.system.partyMembers this.partyMembers = party.system.partyMembers
.filter(x => PartySheet.DICE_ROLL_ACTOR_TYPES.includes(x.type)) .filter(x => Party.DICE_ROLL_ACTOR_TYPES.includes(x.type))
.map(member => ({ .map(member => ({
...member.toObject(), ...member.toObject(),
uuid: member.uuid, uuid: member.uuid,

View file

@ -2,7 +2,7 @@ import { ResourceUpdateMap } from '../../data/action/baseAction.mjs';
import { MemberData } from '../../data/tagTeamData.mjs'; import { MemberData } from '../../data/tagTeamData.mjs';
import { getCritDamageBonus, shouldUseHopeFearAutomation } from '../../helpers/utils.mjs'; import { getCritDamageBonus, shouldUseHopeFearAutomation } from '../../helpers/utils.mjs';
import { emitGMUpdate, GMUpdateEvent, RefreshType, socketEvent } from '../../systemRegistration/socket.mjs'; import { emitGMUpdate, GMUpdateEvent, RefreshType, socketEvent } from '../../systemRegistration/socket.mjs';
import PartySheet from '../sheets/actors/party.mjs'; import Party from '../sheets/actors/party.mjs';
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
@ -13,7 +13,7 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio
this.usesTagTeamHopeCost = true; this.usesTagTeamHopeCost = true;
this.party = party; this.party = party;
this.partyMembers = party.system.partyMembers this.partyMembers = party.system.partyMembers
.filter(x => PartySheet.DICE_ROLL_ACTOR_TYPES.includes(x.type)) .filter(x => Party.DICE_ROLL_ACTOR_TYPES.includes(x.type))
.map(member => ({ .map(member => ({
...member.toObject(), ...member.toObject(),
uuid: member.uuid, uuid: member.uuid,
@ -208,16 +208,6 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio
const rollOptions = []; const rollOptions = [];
const damageRollOptions = []; 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 ?? []) { for (const item of actor?.items ?? []) {
if (!item.system.metadata.hasActions) continue; if (!item.system.metadata.hasActions) continue;
const actions = [...item.system.actions, ...(item.system.attack ? [item.system.attack] : [])]; const actions = [...item.system.actions, ...(item.system.attack ? [item.system.attack] : [])];

View file

@ -155,10 +155,6 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac
.querySelector('.stacking-change-checkbox') .querySelector('.stacking-change-checkbox')
?.addEventListener('change', this.stackingChangeToggle.bind(this)); ?.addEventListener('change', this.stackingChangeToggle.bind(this));
htmlElement
.querySelector('.range-dependence-change-checkbox')
?.addEventListener('change', this.rangeDependenceChangeToggle.bind(this));
htmlElement htmlElement
.querySelector('.armor-change-checkbox') .querySelector('.armor-change-checkbox')
?.addEventListener('change', this.armorChangeToggle.bind(this)); ?.addEventListener('change', this.armorChangeToggle.bind(this));
@ -228,20 +224,6 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac
return this.submit({ updateData: { system: systemData } }); 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) { armorChangeToggle(event) {
if (event.target.checked) { if (event.target.checked) {
this.addArmorChange(); this.addArmorChange();

View file

@ -1,18 +1,8 @@
import DhCompanion from '../../../data/actor/companion.mjs'; import DhCompanion from '../../../data/actor/companion.mjs';
import DhParty from '../../../data/actor/party.mjs';
import DhpActor from '../../../documents/actor.mjs'; import DhpActor from '../../../documents/actor.mjs';
declare module './companion.mjs' { declare module './companion.mjs' {
export default interface DhCompanionSheet { export default interface DhCompanionSheet {
actor: DhpActor<DhCompanion>; actor: DhpActor<DhCompanion>;
document: DhpActor<DhCompanion>;
} }
} }
declare module './party.mjs' {
export default interface PartySheet {
actor: DhpActor<DhParty>;
document: DhpActor<DhParty>;
}
}

View file

@ -914,7 +914,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
const doc = await getDocFromElement(button); const doc = await getDocFromElement(button);
const { available } = this.document.system.loadoutSlot; const { available } = this.document.system.loadoutSlot;
if (doc.system.inVault && !available && !doc.system.loadoutIgnore) { if (doc.system.inVault && !available && !doc.system.loadoutIgnore) {
return ui.notifications.warn('DAGGERHEART.UI.Notifications.loadoutMaxReached', { localize: true }); return ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.loadoutMaxReached'));
} }
await doc?.update({ 'system.inVault': !doc.system.inVault }); await doc?.update({ 'system.inVault': !doc.system.inVault });
@ -1206,22 +1206,10 @@ export default class CharacterSheet extends DHBaseActorSheet {
if (!confirmed) return; if (!confirmed) return;
} }
// Check for same actor drag/drop attempts if (this.document.uuid === item.parent?.uuid) {
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); return super._onDropItem(event, item);
} }
// Handle beastforms
if (item.type === 'beastform') { if (item.type === 'beastform') {
if (this.document.effects.find(x => x.type === 'beastform')) { if (this.document.effects.find(x => x.type === 'beastform')) {
return ui.notifications.warn( return ui.notifications.warn(

View file

@ -6,9 +6,7 @@ import DaggerheartMenu from '../../sidebar/tabs/daggerheartMenu.mjs';
import { socketEvent } from '../../../systemRegistration/socket.mjs'; import { socketEvent } from '../../../systemRegistration/socket.mjs';
import DhpActor from '../../../documents/actor.mjs'; import DhpActor from '../../../documents/actor.mjs';
/**@typedef {import('@client/applications/_types.mjs').ApplicationClickAction} ApplicationClickAction */ export default class Party extends DHBaseActorSheet {
export default class PartySheet extends DHBaseActorSheet {
constructor(options) { constructor(options) {
super(options); super(options);
@ -26,17 +24,17 @@ export default class PartySheet extends DHBaseActorSheet {
resizable: true resizable: true
}, },
actions: { actions: {
openDocument: PartySheet.#onOpenDocument, openDocument: Party.#openDocument,
deletePartyMember: PartySheet.#onDeletePartyMember, deletePartyMember: Party.#deletePartyMember,
toggleHope: PartySheet.#onToggleHope, toggleHope: Party.#toggleHope,
toggleHitPoints: PartySheet.#onToggleHitPoints, toggleHitPoints: Party.#toggleHitPoints,
toggleStress: PartySheet.#onToggleStress, toggleStress: Party.#toggleStress,
toggleArmorSlot: PartySheet.#onToggleArmorSlot, toggleArmorSlot: Party.#toggleArmorSlot,
tempBrowser: PartySheet.#onTempBrowser, tempBrowser: Party.#tempBrowser,
refreshActions: PartySheet.#onRefreshActions, refeshActions: Party.#refeshActions,
triggerRest: PartySheet.#onTriggerRest, triggerRest: Party.#triggerRest,
tagTeamRoll: PartySheet.#onTagTeamRoll, tagTeamRoll: Party.#tagTeamRoll,
groupRoll: PartySheet.#onGroupRoll groupRoll: Party.#groupRoll
}, },
dragDrop: [{ dragSelector: '[data-item-id]', dropSelector: null }] dragDrop: [{ dragSelector: '[data-item-id]', dropSelector: null }]
}; };
@ -74,23 +72,6 @@ export default class PartySheet extends DHBaseActorSheet {
this._createSearchFilter(); 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 */ /* Prepare Context */
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -217,16 +198,8 @@ export default class PartySheet extends DHBaseActorSheet {
}; };
} }
} }
/* -------------------------------------------- */
/* Event handlers */
/* -------------------------------------------- */
/** static async #openDocument(_, target) {
* @this PartySheet
* @type {ApplicationClickAction}
*/
static async #onOpenDocument(_, target) {
const uuid = target.dataset.uuid; const uuid = target.dataset.uuid;
const document = await foundry.utils.fromUuid(uuid); const document = await foundry.utils.fromUuid(uuid);
document?.sheet?.render(true); document?.sheet?.render(true);
@ -234,10 +207,9 @@ export default class PartySheet extends DHBaseActorSheet {
/** /**
* Toggles a hope resource value. * Toggles a hope resource value.
* @this PartySheet
* @type {ApplicationClickAction} * @type {ApplicationClickAction}
*/ */
static async #onToggleHope(_, target) { static async #toggleHope(_, target) {
const hopeValue = Number.parseInt(target.dataset.value); const hopeValue = Number.parseInt(target.dataset.value);
const actor = await foundry.utils.fromUuid(target.dataset.actorId); const actor = await foundry.utils.fromUuid(target.dataset.actorId);
const newValue = actor.system.resources.hope.value >= hopeValue ? hopeValue - 1 : hopeValue; const newValue = actor.system.resources.hope.value >= hopeValue ? hopeValue - 1 : hopeValue;
@ -247,10 +219,9 @@ export default class PartySheet extends DHBaseActorSheet {
/** /**
* Toggles a hp resource value. * Toggles a hp resource value.
* @this PartySheet
* @type {ApplicationClickAction} * @type {ApplicationClickAction}
*/ */
static async #onToggleHitPoints(_, target) { static async #toggleHitPoints(_, target) {
const hitPointsValue = Number.parseInt(target.dataset.value); const hitPointsValue = Number.parseInt(target.dataset.value);
const actor = await foundry.utils.fromUuid(target.dataset.actorId); const actor = await foundry.utils.fromUuid(target.dataset.actorId);
const newValue = actor.system.resources.hitPoints.value >= hitPointsValue ? hitPointsValue - 1 : hitPointsValue; const newValue = actor.system.resources.hitPoints.value >= hitPointsValue ? hitPointsValue - 1 : hitPointsValue;
@ -260,10 +231,9 @@ export default class PartySheet extends DHBaseActorSheet {
/** /**
* Toggles a stress resource value. * Toggles a stress resource value.
* @this PartySheet
* @type {ApplicationClickAction} * @type {ApplicationClickAction}
*/ */
static async #onToggleStress(_, target) { static async #toggleStress(_, target) {
const stressValue = Number.parseInt(target.dataset.value); const stressValue = Number.parseInt(target.dataset.value);
const actor = await foundry.utils.fromUuid(target.dataset.actorId); const actor = await foundry.utils.fromUuid(target.dataset.actorId);
const newValue = actor.system.resources.stress.value >= stressValue ? stressValue - 1 : stressValue; const newValue = actor.system.resources.stress.value >= stressValue ? stressValue - 1 : stressValue;
@ -273,10 +243,9 @@ export default class PartySheet extends DHBaseActorSheet {
/** /**
* Toggles a armor slot resource value. * Toggles a armor slot resource value.
* @this PartySheet
* @type {ApplicationClickAction} * @type {ApplicationClickAction}
*/ */
static async #onToggleArmorSlot(_, target) { static async #toggleArmorSlot(_, target) {
const actor = await foundry.utils.fromUuid(target.dataset.actorId); const actor = await foundry.utils.fromUuid(target.dataset.actorId);
const { value, max } = actor.system.armorScore; const { value, max } = actor.system.armorScore;
const inputValue = Number.parseInt(target.dataset.value); const inputValue = Number.parseInt(target.dataset.value);
@ -289,19 +258,12 @@ export default class PartySheet extends DHBaseActorSheet {
/** /**
* Opens Compedium Browser * Opens Compedium Browser
* @this PartySheet
* @type {ApplicationClickAction}
*/ */
static async #onTempBrowser(_, target) { static async #tempBrowser(_, target) {
new ItemBrowser().render({ force: true }); 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({ const confirmed = await foundry.applications.api.DialogV2.confirm({
window: { window: {
title: 'New Section', title: 'New Section',
@ -319,11 +281,7 @@ export default class PartySheet extends DHBaseActorSheet {
if (!confirmed) return; if (!confirmed) return;
} }
/** static async #triggerRest(_, button) {
* @this PartySheet
* @type {ApplicationClickAction}
*/
static async #onTriggerRest(_, button) {
const confirmed = await foundry.applications.api.DialogV2.confirm({ const confirmed = await foundry.applications.api.DialogV2.confirm({
window: { window: {
title: game.i18n.localize(`DAGGERHEART.APPLICATIONS.Downtime.${button.dataset.type}.title`), title: game.i18n.localize(`DAGGERHEART.APPLICATIONS.Downtime.${button.dataset.type}.title`),
@ -346,30 +304,6 @@ export default class PartySheet 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 }) { static async downtimeMoveQuery({ actorId, downtimeType }) {
const actor = await foundry.utils.fromUuid(actorId); const actor = await foundry.utils.fromUuid(actorId);
if (!actor || !actor?.isOwner) return; if (!actor || !actor?.isOwner) return;
@ -378,19 +312,11 @@ export default class PartySheet extends DHBaseActorSheet {
}); });
} }
/** static async #tagTeamRoll() {
* @this PartySheet
* @type {ApplicationClickAction}
*/
static async #onTagTeamRoll() {
new game.system.api.applications.dialogs.TagTeamDialog(this.document).render({ force: true }); 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 }); new game.system.api.applications.dialogs.GroupRollDialog(this.document).render({ force: true });
} }
@ -534,10 +460,11 @@ export default class PartySheet extends DHBaseActorSheet {
} }
} }
/** @inheritdoc */ /* -------------------------------------------- */
async _onDropActor(event, document) { async _onDropActor(event, document) {
const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event); const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event);
if (document instanceof DhpActor && PartySheet.ALLOWED_ACTOR_TYPES.includes(document.type)) { if (document instanceof DhpActor && Party.ALLOWED_ACTOR_TYPES.includes(document.type)) {
const currentMembers = this.document.system.partyMembers.map(x => x.uuid); const currentMembers = this.document.system.partyMembers.map(x => x.uuid);
if (currentMembers.includes(data.uuid)) { if (currentMembers.includes(data.uuid)) {
return ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.duplicateCharacter')); return ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.duplicateCharacter'));
@ -550,4 +477,24 @@ export default class PartySheet extends DHBaseActorSheet {
return null; 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 });
}
} }

View file

@ -90,20 +90,18 @@ export const BPModifiers = {
name: 'DAGGERHEART.CONFIG.BPModifiers.increaseDamage.effect.name', name: 'DAGGERHEART.CONFIG.BPModifiers.increaseDamage.effect.name',
description: 'DAGGERHEART.CONFIG.BPModifiers.increaseDamage.effect.description', description: 'DAGGERHEART.CONFIG.BPModifiers.increaseDamage.effect.description',
img: 'icons/magic/control/buff-flight-wings-red.webp', img: 'icons/magic/control/buff-flight-wings-red.webp',
system: { changes: [
changes: [ {
{ key: 'system.bonuses.damage.physical.dice',
key: 'system.bonuses.damage.physical.dice', mode: 2,
type: 'add', value: '1d4'
value: '1d4' },
}, {
{ key: 'system.bonuses.damage.magical.dice',
key: 'system.bonuses.damage.magical.dice', mode: 2,
type: 'add', value: '1d4'
value: '1d4' }
} ]
]
}
} }
] ]
} }

View file

@ -37,15 +37,13 @@ export const armorFeatures = {
name: 'DAGGERHEART.CONFIG.ArmorFeature.channeling.effects.channeling.name', name: 'DAGGERHEART.CONFIG.ArmorFeature.channeling.effects.channeling.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.channeling.effects.channeling.description', description: 'DAGGERHEART.CONFIG.ArmorFeature.channeling.effects.channeling.description',
img: 'icons/magic/symbols/rune-sigil-horned-blue.webp', img: 'icons/magic/symbols/rune-sigil-horned-blue.webp',
system: { changes: [
changes: [ {
{ key: 'system.bonuses.roll.spellcast',
key: 'system.bonuses.roll.spellcast', mode: 2,
type: 'add', value: '1'
value: '1' }
} ]
]
}
} }
] ]
}, },
@ -57,45 +55,43 @@ export const armorFeatures = {
name: 'DAGGERHEART.CONFIG.ArmorFeature.difficult.effects.difficult.name', name: 'DAGGERHEART.CONFIG.ArmorFeature.difficult.effects.difficult.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.difficult.effects.difficult.description', description: 'DAGGERHEART.CONFIG.ArmorFeature.difficult.effects.difficult.description',
img: 'icons/magic/control/buff-flight-wings-red.webp', img: 'icons/magic/control/buff-flight-wings-red.webp',
system: { changes: [
changes: [ {
{ key: 'system.traits.agility.value',
key: 'system.traits.agility.value', mode: 2,
type: 'add', value: '-1'
value: '-1' },
}, {
{ key: 'system.traits.strength.value',
key: 'system.traits.strength.value', mode: 2,
type: 'add', value: '-1'
value: '-1' },
}, {
{ key: 'system.traits.finesse.value',
key: 'system.traits.finesse.value', mode: 2,
type: 'add', value: '-1'
value: '-1' },
}, {
{ key: 'system.traits.instinct.value',
key: 'system.traits.instinct.value', mode: 2,
type: 'add', value: '-1'
value: '-1' },
}, {
{ key: 'system.traits.presence.value',
key: 'system.traits.presence.value', mode: 2,
type: 'add', value: '-1'
value: '-1' },
}, {
{ key: 'system.traits.knowledge.value',
key: 'system.traits.knowledge.value', mode: 2,
type: 'add', value: '-1'
value: '-1' },
}, {
{ key: 'system.evasion',
key: 'system.evasion', mode: 2,
type: 'add', value: '-1'
value: '-1' }
} ]
]
}
} }
] ]
}, },
@ -107,15 +103,13 @@ export const armorFeatures = {
name: 'DAGGERHEART.CONFIG.ArmorFeature.flexible.effects.flexible.name', name: 'DAGGERHEART.CONFIG.ArmorFeature.flexible.effects.flexible.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.flexible.effects.flexible.description', description: 'DAGGERHEART.CONFIG.ArmorFeature.flexible.effects.flexible.description',
img: 'icons/magic/movement/abstract-ribbons-red-orange.webp', img: 'icons/magic/movement/abstract-ribbons-red-orange.webp',
system: { changes: [
changes: [ {
{ key: 'system.evasion',
key: 'system.evasion', mode: 2,
type: 'add', value: '1'
value: '1' }
} ]
]
}
} }
] ]
}, },
@ -127,15 +121,13 @@ export const armorFeatures = {
name: 'DAGGERHEART.CONFIG.ArmorFeature.fortified.effects.fortified.name', name: 'DAGGERHEART.CONFIG.ArmorFeature.fortified.effects.fortified.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.fortified.effects.fortified.description', description: 'DAGGERHEART.CONFIG.ArmorFeature.fortified.effects.fortified.description',
img: 'icons/magic/defensive/shield-barrier-glowing-blue.webp', img: 'icons/magic/defensive/shield-barrier-glowing-blue.webp',
system: { changes: [
changes: [ {
{ key: 'system.rules.damageReduction.increasePerArmorMark',
key: 'system.rules.damageReduction.increasePerArmorMark', mode: 5,
type: 'override', value: '2'
value: '2' }
} ]
]
}
} }
] ]
}, },
@ -147,15 +139,13 @@ export const armorFeatures = {
name: 'DAGGERHEART.CONFIG.ArmorFeature.gilded.effects.gilded.name', name: 'DAGGERHEART.CONFIG.ArmorFeature.gilded.effects.gilded.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.gilded.effects.gilded.description', description: 'DAGGERHEART.CONFIG.ArmorFeature.gilded.effects.gilded.description',
img: 'icons/magic/control/control-influence-crown-gold.webp', img: 'icons/magic/control/control-influence-crown-gold.webp',
system: { changes: [
changes: [ {
{ key: 'system.traits.presence.value',
key: 'system.traits.presence.value', mode: 2,
type: 'add', value: '1'
value: '1' }
} ]
]
}
} }
] ]
}, },
@ -167,15 +157,13 @@ export const armorFeatures = {
name: 'DAGGERHEART.CONFIG.ArmorFeature.heavy.effects.heavy.name', name: 'DAGGERHEART.CONFIG.ArmorFeature.heavy.effects.heavy.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.heavy.effects.heavy.description', description: 'DAGGERHEART.CONFIG.ArmorFeature.heavy.effects.heavy.description',
img: 'icons/commodities/metal/ingot-worn-iron.webp', img: 'icons/commodities/metal/ingot-worn-iron.webp',
system: { changes: [
changes: [ {
{ key: 'system.evasion',
key: 'system.evasion', mode: 2,
type: 'add', value: '-1'
value: '-1' }
} ]
]
}
} }
] ]
}, },
@ -224,15 +212,13 @@ export const armorFeatures = {
name: 'DAGGERHEART.CONFIG.ArmorFeature.magical.effects.magical.name', name: 'DAGGERHEART.CONFIG.ArmorFeature.magical.effects.magical.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.magical.effects.magical.description', description: 'DAGGERHEART.CONFIG.ArmorFeature.magical.effects.magical.description',
img: 'icons/magic/defensive/barrier-shield-dome-blue-purple.webp', img: 'icons/magic/defensive/barrier-shield-dome-blue-purple.webp',
system: { changes: [
changes: [ {
{ key: 'system.rules.damageReduction.magical',
key: 'system.rules.damageReduction.magical', mode: 5,
type: 'override', value: 1
value: 1 }
} ]
]
}
} }
] ]
}, },
@ -263,15 +249,13 @@ export const armorFeatures = {
name: 'DAGGERHEART.CONFIG.ArmorFeature.physical.effects.physical.name', name: 'DAGGERHEART.CONFIG.ArmorFeature.physical.effects.physical.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.physical.effects.physical.description', description: 'DAGGERHEART.CONFIG.ArmorFeature.physical.effects.physical.description',
img: 'icons/commodities/stone/ore-pile-tan.webp', img: 'icons/commodities/stone/ore-pile-tan.webp',
system: { changes: [
changes: [ {
{ key: 'system.rules.damageReduction.physical',
key: 'system.rules.damageReduction.physical', mode: 5,
type: 'override', value: 1
value: 1 }
} ]
]
}
} }
] ]
}, },
@ -296,20 +280,18 @@ export const armorFeatures = {
name: 'DAGGERHEART.CONFIG.ArmorFeature.reinforced.effects.reinforced.name', name: 'DAGGERHEART.CONFIG.ArmorFeature.reinforced.effects.reinforced.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.reinforced.effects.reinforced.description', description: 'DAGGERHEART.CONFIG.ArmorFeature.reinforced.effects.reinforced.description',
img: 'icons/magic/defensive/shield-barrier-glowing-triangle-green.webp', img: 'icons/magic/defensive/shield-barrier-glowing-triangle-green.webp',
system: { changes: [
changes: [ {
{ key: 'system.bunuses.damageThresholds.major',
key: 'system.bunuses.damageThresholds.major', mode: 2,
type: 'add', value: '2'
value: '2' },
}, {
{ key: 'system.bunuses.damageThresholds.severe',
key: 'system.bunuses.damageThresholds.severe', mode: 2,
type: 'add', value: '2'
value: '2' }
} ]
]
}
} }
] ]
}, },
@ -344,20 +326,18 @@ export const armorFeatures = {
name: 'DAGGERHEART.CONFIG.ArmorFeature.sharp.effects.sharp.name', name: 'DAGGERHEART.CONFIG.ArmorFeature.sharp.effects.sharp.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.sharp.effects.sharp.description', description: 'DAGGERHEART.CONFIG.ArmorFeature.sharp.effects.sharp.description',
img: 'icons/magic/defensive/shield-barrier-glowing-triangle-green.webp', img: 'icons/magic/defensive/shield-barrier-glowing-triangle-green.webp',
system: { changes: [
changes: [ {
{ key: 'system.bonuses.damage.primaryWeapon.dice',
key: 'system.bonuses.damage.primaryWeapon.dice', mode: 2,
type: 'add', value: '1d4'
value: '1d4' },
}, {
{ key: 'system.bonuses.damage.secondaryWeapon.dice',
key: 'system.bonuses.damage.secondaryWeapon.dice', mode: 2,
type: 'add', value: '1d4'
value: '1d4' }
} ]
]
}
} }
] ]
}, },
@ -428,20 +408,18 @@ export const armorFeatures = {
name: 'DAGGERHEART.CONFIG.ArmorFeature.veryHeavy.effects.veryHeavy.name', name: 'DAGGERHEART.CONFIG.ArmorFeature.veryHeavy.effects.veryHeavy.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.veryHeavy.effects.veryHeavy.description', description: 'DAGGERHEART.CONFIG.ArmorFeature.veryHeavy.effects.veryHeavy.description',
img: 'icons/commodities/metal/ingot-stamped-steel.webp', img: 'icons/commodities/metal/ingot-stamped-steel.webp',
system: { changes: [
changes: [ {
{ key: 'system.evasion',
key: 'system.evasion', mode: 2,
type: 'add', value: '-2'
value: '-2' },
}, {
{ key: 'system.traits.agility.value',
key: 'system.traits.agility.value', mode: 2,
type: 'add', value: '-1'
value: '-1' }
} ]
]
}
} }
] ]
}, },
@ -453,16 +431,14 @@ export const armorFeatures = {
name: 'DAGGERHEART.CONFIG.ArmorFeature.warded.effects.warded.name', name: 'DAGGERHEART.CONFIG.ArmorFeature.warded.effects.warded.name',
description: 'DAGGERHEART.CONFIG.ArmorFeature.warded.effects.warded.description', description: 'DAGGERHEART.CONFIG.ArmorFeature.warded.effects.warded.description',
img: 'icons/magic/defensive/barrier-shield-dome-pink.webp', img: 'icons/magic/defensive/barrier-shield-dome-pink.webp',
system: { changes: [
changes: [ {
{ key: 'system.resistance.magical.reduction',
key: 'system.resistance.magical.reduction', mode: 2,
type: 'add', value: '@system.armorScore',
value: '@system.armorScore', priority: 21
priority: 21 }
} ]
]
}
} }
] ]
} }
@ -512,23 +488,21 @@ export const weaponFeatures = {
name: 'DAGGERHEART.CONFIG.WeaponFeature.barrier.effects.barrier.name', name: 'DAGGERHEART.CONFIG.WeaponFeature.barrier.effects.barrier.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.barrier.effects.barrier.description', description: 'DAGGERHEART.CONFIG.WeaponFeature.barrier.effects.barrier.description',
img: 'icons/skills/melee/shield-block-bash-blue.webp', img: 'icons/skills/melee/shield-block-bash-blue.webp',
system: { changes: [
changes: [ {
{ key: 'system.evasion',
key: 'system.evasion', mode: 2,
type: 'add', value: '-1'
value: '-1' },
}, {
{ key: 'Armor',
key: 'Armor', type: 'armor',
typeData: {
type: 'armor', type: 'armor',
typeData: { max: 'ITEM.@system.tier + 1'
type: 'armor',
max: 'ITEM.@system.tier + 1'
}
} }
] }
} ]
} }
] ]
}, },
@ -540,15 +514,13 @@ export const weaponFeatures = {
name: 'DAGGERHEART.CONFIG.WeaponFeature.bonded.effects.damage.name', name: 'DAGGERHEART.CONFIG.WeaponFeature.bonded.effects.damage.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.bonded.effects.damage.description', description: 'DAGGERHEART.CONFIG.WeaponFeature.bonded.effects.damage.description',
img: 'icons/magic/symbols/chevron-elipse-circle-blue.webp', img: 'icons/magic/symbols/chevron-elipse-circle-blue.webp',
system: { changes: [
changes: [ {
{ key: 'system.bonuses.damage.primaryWeapon.bonus',
key: 'system.bonuses.damage.primaryWeapon.bonus', mode: 2,
type: 'add', value: '@system.levelData.level.current'
value: '@system.levelData.level.current' }
} ]
]
}
} }
] ]
}, },
@ -581,20 +553,18 @@ export const weaponFeatures = {
name: 'DAGGERHEART.CONFIG.WeaponFeature.brave.effects.brave.name', name: 'DAGGERHEART.CONFIG.WeaponFeature.brave.effects.brave.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.brave.effects.brave.description', description: 'DAGGERHEART.CONFIG.WeaponFeature.brave.effects.brave.description',
img: 'icons/magic/life/heart-cross-strong-flame-purple-orange.webp', img: 'icons/magic/life/heart-cross-strong-flame-purple-orange.webp',
system: { changes: [
changes: [ {
{ key: 'system.evasion',
key: 'system.evasion', mode: 2,
type: 'add', value: '-1'
value: '-1' },
}, {
{ key: 'system.damageThresholds.severe',
key: 'system.damageThresholds.severe', mode: 2,
type: 'add', value: 'ITEM.@system.tier'
value: 'ITEM.@system.tier' }
} ]
]
}
} }
] ]
}, },
@ -648,15 +618,13 @@ export const weaponFeatures = {
name: 'DAGGERHEART.CONFIG.WeaponFeature.charged.name', name: 'DAGGERHEART.CONFIG.WeaponFeature.charged.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.charged.description', description: 'DAGGERHEART.CONFIG.WeaponFeature.charged.description',
img: 'icons/magic/lightning/claws-unarmed-strike-teal.webp', img: 'icons/magic/lightning/claws-unarmed-strike-teal.webp',
system: { changes: [
changes: [ {
{ key: 'system.proficiency',
key: 'system.proficiency', mode: 2,
type: 'add', value: '1'
value: '1' }
} ]
]
}
} }
] ]
} }
@ -692,15 +660,13 @@ export const weaponFeatures = {
name: 'DAGGERHEART.CONFIG.WeaponFeature.cumbersome.effects.cumbersome.name', name: 'DAGGERHEART.CONFIG.WeaponFeature.cumbersome.effects.cumbersome.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.cumbersome.effects.cumbersome.description', description: 'DAGGERHEART.CONFIG.WeaponFeature.cumbersome.effects.cumbersome.description',
img: 'icons/commodities/metal/mail-plate-steel.webp', img: 'icons/commodities/metal/mail-plate-steel.webp',
system: { changes: [
changes: [ {
{ key: 'system.traits.finesse.value',
key: 'system.traits.finesse.value', mode: 2,
type: 'add', value: '-1'
value: '-1' }
} ]
]
}
} }
] ]
}, },
@ -741,16 +707,14 @@ export const weaponFeatures = {
name: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.effects.deflecting.name', name: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.effects.deflecting.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.effects.deflecting.description', description: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.effects.deflecting.description',
img: 'icons/skills/melee/hand-grip-sword-strike-orange.webp', img: 'icons/skills/melee/hand-grip-sword-strike-orange.webp',
system: { changes: [
changes: [ {
{ key: 'system.evasion',
key: 'system.evasion', mode: 2,
type: 'add', value: '@system.armorScore',
value: '@system.armorScore', priority: 21
priority: 21 }
} ]
]
}
} }
] ]
} }
@ -790,15 +754,13 @@ export const weaponFeatures = {
name: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.name', name: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.effects.agility', description: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.effects.agility',
img: 'icons/skills/melee/strike-flail-spiked-pink.webp', img: 'icons/skills/melee/strike-flail-spiked-pink.webp',
system: { changes: [
changes: [ {
{ key: 'system.traits.agility.value',
key: 'system.traits.agility.value', mode: 2,
type: 'add', value: '-1'
value: '-1' }
} ]
]
}
} }
] ]
}, },
@ -829,14 +791,14 @@ export const weaponFeatures = {
name: 'DAGGERHEART.CONFIG.WeaponFeature.doubleDuty.effects.doubleDuty.name', name: 'DAGGERHEART.CONFIG.WeaponFeature.doubleDuty.effects.doubleDuty.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.doubleDuty.effects.doubleDuty.description', description: 'DAGGERHEART.CONFIG.WeaponFeature.doubleDuty.effects.doubleDuty.description',
img: 'icons/skills/melee/sword-shield-stylized-white.webp', img: 'icons/skills/melee/sword-shield-stylized-white.webp',
changes: [
{
key: 'system.bonuses.damage.primaryWeapon.bonus',
mode: 2,
value: '1'
}
],
system: { system: {
changes: [
{
key: 'system.bonuses.damage.primaryWeapon.bonus',
type: 'add',
value: '1'
}
],
rangeDependence: { rangeDependence: {
enabled: true, enabled: true,
range: 'melee', range: 'melee',
@ -940,15 +902,13 @@ export const weaponFeatures = {
name: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.actions.greed.name', name: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.actions.greed.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.actions.greed.description', description: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.actions.greed.description',
img: 'icons/commodities/currency/coins-crown-stack-gold.webp', img: 'icons/commodities/currency/coins-crown-stack-gold.webp',
system: { changes: [
changes: [ {
{ key: 'system.proficiency',
key: 'system.proficiency', mode: 2,
type: 'add', value: '1'
value: '1' }
} ]
]
}
} }
] ]
} }
@ -991,15 +951,13 @@ export const weaponFeatures = {
name: 'DAGGERHEART.CONFIG.WeaponFeature.heavy.effects.heavy.name', name: 'DAGGERHEART.CONFIG.WeaponFeature.heavy.effects.heavy.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.heavy.effects.heavy.description', description: 'DAGGERHEART.CONFIG.WeaponFeature.heavy.effects.heavy.description',
img: 'icons/commodities/metal/ingot-worn-iron.webp', img: 'icons/commodities/metal/ingot-worn-iron.webp',
system: { changes: [
changes: [ {
{ key: 'system.evasion',
key: 'system.evasion', mode: 2,
type: 'add', value: '-1'
value: '-1' }
} ]
]
}
} }
] ]
}, },
@ -1108,15 +1066,13 @@ export const weaponFeatures = {
name: 'DAGGERHEART.CONFIG.WeaponFeature.massive.effects.massive.name', name: 'DAGGERHEART.CONFIG.WeaponFeature.massive.effects.massive.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.massive.effects.massive.description', description: 'DAGGERHEART.CONFIG.WeaponFeature.massive.effects.massive.description',
img: 'icons/skills/melee/strike-flail-destructive-yellow.webp', img: 'icons/skills/melee/strike-flail-destructive-yellow.webp',
system: { changes: [
changes: [ {
{ key: 'system.evasion',
key: 'system.evasion', mode: 2,
type: 'add', value: '-1'
value: '-1' }
} ]
]
}
} }
] ]
}, },
@ -1147,14 +1103,14 @@ export const weaponFeatures = {
name: 'DAGGERHEART.CONFIG.WeaponFeature.paired.effects.paired.name', name: 'DAGGERHEART.CONFIG.WeaponFeature.paired.effects.paired.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.paired.effects.paired.description', description: 'DAGGERHEART.CONFIG.WeaponFeature.paired.effects.paired.description',
img: 'icons/skills/melee/weapons-crossed-swords-yellow-teal.webp', 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: { system: {
changes: [
{
key: 'system.bonuses.damage.primaryWeapon.bonus',
type: 'add',
value: 'ITEM.@system.tier + 1'
}
],
rangeDependence: { rangeDependence: {
enabled: true, enabled: true,
range: 'melee', range: 'melee',
@ -1202,15 +1158,13 @@ export const weaponFeatures = {
name: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.effects.persuasive.name', name: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.effects.persuasive.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.effects.persuasive.description', description: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.effects.persuasive.description',
img: 'icons/magic/control/hypnosis-mesmerism-eye.webp', img: 'icons/magic/control/hypnosis-mesmerism-eye.webp',
system: { changes: [
changes: [ {
{ key: 'system.traits.presence.value',
key: 'system.traits.presence.value', mode: 2,
type: 'add', value: '2'
value: '2' }
} ]
]
}
} }
] ]
} }
@ -1249,20 +1203,17 @@ export const weaponFeatures = {
name: 'DAGGERHEART.CONFIG.WeaponFeature.protective.effects.protective.name', name: 'DAGGERHEART.CONFIG.WeaponFeature.protective.effects.protective.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.protective.effects.protective.description', description: 'DAGGERHEART.CONFIG.WeaponFeature.protective.effects.protective.description',
img: 'icons/skills/melee/shield-block-gray-orange.webp', img: 'icons/skills/melee/shield-block-gray-orange.webp',
system: { changes: [
changes: [ {
{ key: 'Armor',
key: 'Armor', type: 'armor',
value: 0,
typeData: {
type: 'armor', type: 'armor',
value: 0, max: 'ITEM.@system.tier'
typeData: {
type: 'armor',
max: 'ITEM.@system.tier'
}
} }
] }
} ]
} }
] ]
}, },
@ -1293,15 +1244,13 @@ export const weaponFeatures = {
name: 'DAGGERHEART.CONFIG.WeaponFeature.reliable.effects.reliable.name', name: 'DAGGERHEART.CONFIG.WeaponFeature.reliable.effects.reliable.name',
description: 'DAGGERHEART.CONFIG.WeaponFeature.reliable.effects.reliable.description', description: 'DAGGERHEART.CONFIG.WeaponFeature.reliable.effects.reliable.description',
img: 'icons/skills/melee/strike-sword-slashing-red.webp', img: 'icons/skills/melee/strike-sword-slashing-red.webp',
system: { changes: [
changes: [ {
{ key: 'system.bonuses.roll.primaryWeapon.bonus',
key: 'system.bonuses.roll.primaryWeapon.bonus', mode: 2,
type: 'add', value: 1
value: 1 }
} ]
]
}
} }
] ]
}, },
@ -1392,7 +1341,7 @@ export const weaponFeatures = {
changes: [ changes: [
{ {
key: 'system.bonuses.damage.primaryWeapon.bonus', key: 'system.bonuses.damage.primaryWeapon.bonus',
type: 'add', mode: 2,
value: '@system.traits.agility.value', value: '@system.traits.agility.value',
priority: 21 priority: 21
} }

View file

@ -57,6 +57,11 @@ export default class BaseEffect extends foundry.data.ActiveEffectTypeDataModel {
description: new fields.HTMLField({ label: 'DAGGERHEART.GENERAL.description' }) description: new fields.HTMLField({ label: 'DAGGERHEART.GENERAL.description' })
}), }),
rangeDependence: new fields.SchemaField({ rangeDependence: new fields.SchemaField({
enabled: new fields.BooleanField({
required: true,
initial: false,
label: 'DAGGERHEART.GENERAL.enabled'
}),
type: new fields.StringField({ type: new fields.StringField({
required: true, required: true,
choices: CONFIG.DH.GENERAL.rangeInclusion, choices: CONFIG.DH.GENERAL.rangeInclusion,
@ -75,7 +80,7 @@ export default class BaseEffect extends foundry.data.ActiveEffectTypeDataModel {
initial: CONFIG.DH.GENERAL.range.melee.id, initial: CONFIG.DH.GENERAL.range.melee.id,
label: 'DAGGERHEART.GENERAL.range' label: 'DAGGERHEART.GENERAL.range'
}) })
}, { nullable: true, initial: null }), }),
stacking: new fields.SchemaField( stacking: new fields.SchemaField(
{ {
value: new fields.NumberField({ value: new fields.NumberField({
@ -141,8 +146,14 @@ export default class BaseEffect extends foundry.data.ActiveEffectTypeDataModel {
description: '', description: '',
transfer: options.transfer, transfer: options.transfer,
statuses: [], statuses: [],
changes: [],
system: { system: {
changes: [] rangeDependence: {
enabled: false,
type: CONFIG.DH.GENERAL.rangeInclusion.withinRange.id,
target: CONFIG.DH.GENERAL.otherTargetTypes.hostile.id,
range: CONFIG.DH.GENERAL.range.melee.id
}
} }
}; };
} }
@ -174,12 +185,4 @@ export default class BaseEffect extends foundry.data.ActiveEffectTypeDataModel {
if (this.parent.actor && options.scrollingTextData) if (this.parent.actor && options.scrollingTextData)
this.parent.actor.queueScrollText(options.scrollingTextData); this.parent.actor.queueScrollText(options.scrollingTextData);
} }
static migrateData(source) {
if (source.rangeDependence?.enabled === false) {
source.rangeDependence = null;
}
return super.migrateData(source);
}
} }

View file

@ -8,8 +8,7 @@ export default class DHArmor extends AttachableItem {
type: 'armor', type: 'armor',
hasDescription: true, hasDescription: true,
isInventoryItem: true, isInventoryItem: true,
hasActions: true, hasActions: true
hasResource: true
}); });
} }

View file

@ -185,10 +185,8 @@ export default class D20Roll extends DHRoll {
return changeKeys; return changeKeys;
} }
static async buildEvaluate(roll, config = {}, message = {}) { static postEvaluate(roll, config = {}) {
await super.buildEvaluate(roll, config, message); const data = super.postEvaluate(roll, config);
const data = config.roll;
data.type = config.actionType; data.type = config.actionType;
data.difficulty = config.roll.difficulty; data.difficulty = config.roll.difficulty;
if (config.targets?.length) { if (config.targets?.length) {
@ -224,6 +222,7 @@ export default class D20Roll extends DHRoll {
}; };
}); });
data.modifierTotal = roll.modifierTotal; data.modifierTotal = roll.modifierTotal;
return data;
} }
resetFormula() { resetFormula() {

View file

@ -13,38 +13,32 @@ export default class DamageRoll extends DHRoll {
static DefaultDialog = DamageDialog; static DefaultDialog = DamageDialog;
/** @inheritdoc */
static async buildEvaluate(roll, config = {}, message = {}) { static async buildEvaluate(roll, config = {}, message = {}) {
if (config.dialog.configure === false) roll.constructFormula(config); if (config.dialog.configure === false) roll.constructFormula(config);
for (const roll of config.roll) await roll.roll.evaluate(); if (config.evaluate !== false) for (const roll of config.roll) await roll.roll.evaluate();
roll._evaluated = true; roll._evaluated = true;
const parts = []; const parts = [];
for (const rollData of config.roll) { for (const roll of config.roll) {
const roll = rollData.roll; parts.push(this.postEvaluate(roll));
parts.push({ roll.roll = JSON.stringify(roll.roll.toJSON());
...rollData,
...roll.options.roll,
total: roll.total,
formula: roll.formula,
dice: roll.dice.map(d => ({
dice: d.denomination,
total: d.total,
formula: d.formula,
results: d.results
})),
damageTypes: [...(rollData.damageTypes ?? [])],
roll,
type: config.type,
modifierTotal: this.calculateTotalModifiers(roll)
});
rollData.roll = JSON.stringify(roll.toJSON());
} }
config.damage = this.unifyDamageRoll(parts); config.damage = this.unifyDamageRoll(parts);
} }
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)
};
}
static async buildPost(roll, config, message) { static async buildPost(roll, config, message) {
const chatMessage = config.source?.message const chatMessage = config.source?.message
? ui.chat.collection.get(config.source.message) ? ui.chat.collection.get(config.source.message)

View file

@ -33,9 +33,7 @@ export default class DHRoll extends Roll {
if (config.skips?.createMessage) config.messageRoll = roll; if (config.skips?.createMessage) config.messageRoll = roll;
if (config.evaluate !== false) { await this.buildEvaluate(roll, config, (message = {}));
await this.buildEvaluate(roll, config, (message = {}));
}
await this.buildPost(roll, config, (message = {})); await this.buildPost(roll, config, (message = {}));
return config; return config;
} }
@ -74,30 +72,13 @@ export default class DHRoll extends Roll {
return 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 = {}) { static async buildEvaluate(roll, config = {}, message = {}) {
await roll.evaluate(); if (config.evaluate !== false) {
config.roll = { await roll.evaluate();
...roll.options.roll, config.roll = this.postEvaluate(roll, config);
total: roll.total, }
formula: roll.formula,
dice: roll.dice.map(d => ({
dice: d.denomination,
total: d.total,
formula: d.formula,
results: d.results
}))
};
} }
/**
* 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) { static async buildPost(roll, config, message) {
for (const hook of config.hooks) { for (const hook of config.hooks) {
if (Hooks.call(`${CONFIG.DH.id}.postRoll${hook.capitalize()}`, config, message) === false) return null; if (Hooks.call(`${CONFIG.DH.id}.postRoll${hook.capitalize()}`, config, message) === false) return null;
@ -110,6 +91,20 @@ export default class DHRoll extends Roll {
} }
} }
static postEvaluate(roll, config = {}) {
return {
...roll.options.roll,
total: roll.total,
formula: roll.formula,
dice: roll.dice.map(d => ({
dice: d.denomination,
total: d.total,
formula: d.formula,
results: d.results
}))
};
}
static async toMessage(roll, config) { static async toMessage(roll, config) {
const item = config.data.parent?.items?.get?.(config.source.item) ?? null; const item = config.data.parent?.items?.get?.(config.source.item) ?? null;
const action = item ? item.system.actions.get(config.source.action) : null; const action = item ? item.system.actions.get(config.source.action) : null;

View file

@ -232,41 +232,9 @@ export default class DualityRoll extends D20Roll {
return changeKeys; return changeKeys;
} }
/** @inheritdoc */
static async buildEvaluate(roll, config = {}, message = {}) { static async buildEvaluate(roll, config = {}, message = {}) {
await super.buildEvaluate(roll, config, message); await super.buildEvaluate(roll, config, message);
config.roll.hope = {
dice: roll.dHope.denomination,
value: this.guaranteedCritical ? 0 : roll.dHope.total,
rerolled: {
any: roll.dHope.results.some(x => x.rerolled),
rerolls: roll.dHope.results.filter(x => x.rerolled)
}
};
config.roll.fear = {
dice: roll.dFear.denomination,
value: this.guaranteedCritical ? 0 : roll.dFear.total,
rerolled: {
any: roll.dFear.results.some(x => x.rerolled),
rerolls: roll.dFear.results.filter(x => x.rerolled)
}
};
config.roll.rally = {
dice: roll.dRally?.denomination,
value: roll.dRally?.total
};
config.roll.result = {
duality: roll.withHope ? 1 : roll.withFear ? -1 : 0,
total: this.guaranteedCritical ? 0 : roll.dHope.total + roll.dFear.total,
label: roll.totalLabel
};
if (roll._rallyIndex && roll.data?.parent)
roll.data.parent.deleteEmbeddedDocuments('ActiveEffect', [roll._rallyIndex]);
}
/** @inheritdoc */
static async buildPost(roll, config, message) {
await setDiceSoNiceForDualityRoll( await setDiceSoNiceForDualityRoll(
roll, roll,
config.roll.advantage.type, config.roll.advantage.type,
@ -274,7 +242,44 @@ export default class DualityRoll extends D20Roll {
config.roll.fear.dice, config.roll.fear.dice,
config.roll.advantage.dice config.roll.advantage.dice
); );
}
static postEvaluate(roll, config = {}) {
const data = super.postEvaluate(roll, config);
data.hope = {
dice: roll.dHope.denomination,
value: this.guaranteedCritical ? 0 : roll.dHope.total,
rerolled: {
any: roll.dHope.results.some(x => x.rerolled),
rerolls: roll.dHope.results.filter(x => x.rerolled)
}
};
data.fear = {
dice: roll.dFear.denomination,
value: this.guaranteedCritical ? 0 : roll.dFear.total,
rerolled: {
any: roll.dFear.results.some(x => x.rerolled),
rerolls: roll.dFear.results.filter(x => x.rerolled)
}
};
data.rally = {
dice: roll.dRally?.denomination,
value: roll.dRally?.total
};
data.result = {
duality: roll.withHope ? 1 : roll.withFear ? -1 : 0,
total: this.guaranteedCritical ? 0 : roll.dHope.total + roll.dFear.total,
label: roll.totalLabel
};
if (roll._rallyIndex && roll.data?.parent)
roll.data.parent.deleteEmbeddedDocuments('ActiveEffect', [roll._rallyIndex]);
return data;
}
static async buildPost(roll, config, message) {
await super.buildPost(roll, config, message); await super.buildPost(roll, config, message);
await DualityRoll.dualityUpdate(config); await DualityRoll.dualityUpdate(config);

View file

@ -75,23 +75,25 @@ export default class FateRoll extends D20Roll {
this.terms[0] = new foundry.dice.terms.Die({ faces: 12 }); this.terms[0] = new foundry.dice.terms.Die({ faces: 12 });
} }
/** @inheritdoc */
static async buildEvaluate(roll, config = {}, message = {}) { static async buildEvaluate(roll, config = {}, message = {}) {
await super.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') { if (roll.fateDie === 'Hope') {
await setDiceSoNiceForHopeFateRoll(roll, config.roll.fate.dice); await setDiceSoNiceForHopeFateRoll(roll, config.roll.fate.dice);
} else { } else {
await setDiceSoNiceForFearFateRoll(roll, config.roll.fate.dice); await setDiceSoNiceForFearFateRoll(roll, config.roll.fate.dice);
} }
return super.buildPost(roll, config, message); }
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;
} }
} }

View file

@ -622,30 +622,22 @@ export default class DhpActor extends Actor {
return rollData; return rollData;
} }
#canReduceDamage(hpDamage, types) { #canReduceDamage(hpDamage, type) {
const { stressDamageReduction, disabledArmor, reduceSeverity, thresholdImmunities } = const { stressDamageReduction, disabledArmor } = this.system.rules.damageReduction;
this.system.rules.damageReduction;
if (disabledArmor) return false; if (disabledArmor) return false;
const availableStress = this.system.resources.stress.max - this.system.resources.stress.value; const availableStress = this.system.resources.stress.max - this.system.resources.stress.value;
const canUseArmor = const canUseArmor =
this.system.armorScore.value < this.system.armorScore.max && this.system.armorScore.value < this.system.armorScore.max &&
types.every(t => this.system.armorApplicableDamageTypes[t] === true); type.every(t => this.system.armorApplicableDamageTypes[t] === true);
const canUseStress = Object.keys(stressDamageReduction).reduce((acc, x) => { const canUseStress = Object.keys(stressDamageReduction).reduce((acc, x) => {
const rule = stressDamageReduction[x]; const rule = stressDamageReduction[x];
if (damageKeyToNumber(x) <= hpDamage) return acc || (rule.enabled && availableStress >= rule.cost); if (damageKeyToNumber(x) <= hpDamage) return acc || (rule.enabled && availableStress >= rule.cost);
return acc; return acc;
}, false); }, false);
const hasReduceSeverity = types.some(t => reduceSeverity[t]); return canUseArmor || canUseStress;
const hasThresholdImmunity = Object.entries(thresholdImmunities)
.filter(([key, value]) => Boolean(value) && damageKeyToNumber(key) === hpDamage)
.length;
return canUseArmor || canUseStress || hasReduceSeverity || hasThresholdImmunity;
} }
async takeDamage(damages, isDirect = false) { async takeDamage(damages, isDirect = false) {

View file

@ -58,7 +58,7 @@ export const renderMeasuredTemplate = async event => {
if (!type || !range || !game.canvas.scene) return; if (!type || !range || !game.canvas.scene) return;
const shapeData = CONFIG.Canvas.layers.regions.layerClass.getTemplateShape({ const shapeData = CONFIG.Canvas.layers.regions.layerClass.getTemplateShape({
shapeType: type, shapetype: type,
angle, angle,
range, range,
direction, direction,

View file

@ -35,24 +35,23 @@ export const enricherConfig = [
]; ];
export const enricherRenderSetup = element => { export const enricherRenderSetup = element => {
const clickWrapper = func => event => {
event.stopPropagation();
func(event);
};
element element
.querySelectorAll('.enriched-damage-button') .querySelectorAll('.enriched-damage-button')
.forEach(element => element.addEventListener('click', clickWrapper(renderDamageButton))); .forEach(element => element.addEventListener('click', renderDamageButton));
element element
.querySelectorAll('.duality-roll-button') .querySelectorAll('.duality-roll-button')
.forEach(element => element.addEventListener('click', clickWrapper(renderDualityButton))); .forEach(element => element.addEventListener('click', renderDualityButton));
element element
.querySelectorAll('.fate-roll-button') .querySelectorAll('.fate-roll-button')
.forEach(element => element.addEventListener('click', clickWrapper(renderFateButton))); .forEach(element => element.addEventListener('click', renderFateButton));
element element
.querySelectorAll('.measured-template-button') .querySelectorAll('.measured-template-button')
.forEach(element => element.addEventListener('click', clickWrapper(renderMeasuredTemplate))); .forEach(element => element.addEventListener('click', renderMeasuredTemplate));
// element
// .querySelectorAll('.enriched-effect')
// .forEach(element => element.addEventListener('dragstart', dragEnrichedEffect));
}; };

View file

@ -1,38 +0,0 @@
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 (
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 }
}
}
}
}

View file

@ -1,77 +0,0 @@
/**
* @import DHItem from "../../documents/item.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<object>}
* @protected
*/
async updateActiveEffectSource(effectSource, item) {
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
});
}
};
for (const actor of game.actors) {
for (const item of actor.items) {
await updateItem(item);
}
progress.advance();
}
for (const item of game.items) {
await updateItem(item);
progress.advance();
}
await foundry.documents.modifyBatch(batch);
progress.advance({ by: finalUpdateProgress });
}
}

View file

@ -1,5 +1,4 @@
import { defaultRestOptions } from '../config/generalConfig.mjs'; import { defaultRestOptions } from '../config/generalConfig.mjs';
import { Migration_2_5_2 } from './migration-handlers/2_5_2.mjs';
export async function runMigrations() { export async function runMigrations() {
let lastMigrationVersion = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.LastMigrationVersion); let lastMigrationVersion = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.LastMigrationVersion);
@ -321,19 +320,7 @@ export async function runMigrations() {
lastMigrationVersion = '2.1.0'; lastMigrationVersion = '2.1.0';
} }
//#endregion
await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.LastMigrationVersion, lastMigrationVersion); 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()
].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);
}
} }

View file

@ -1,5 +1,5 @@
import DamageReductionDialog from '../applications/dialogs/damageReductionDialog.mjs'; import DamageReductionDialog from '../applications/dialogs/damageReductionDialog.mjs';
import PartySheet from '../applications/sheets/actors/party.mjs'; import Party from '../applications/sheets/actors/party.mjs';
export function handleSocketEvent({ action = null, data = {} } = {}) { export function handleSocketEvent({ action = null, data = {} } = {}) {
switch (action) { switch (action) {
@ -16,7 +16,7 @@ export function handleSocketEvent({ action = null, data = {} } = {}) {
Hooks.call(socketEvent.Refresh, data); Hooks.call(socketEvent.Refresh, data);
break; break;
case socketEvent.DowntimeTrigger: case socketEvent.DowntimeTrigger:
PartySheet.downtimeMoveQuery(data); Party.downtimeMoveQuery(data);
break; break;
case socketEvent.TagTeamStart: case socketEvent.TagTeamStart:
Hooks.callAll(CONFIG.DH.HOOKS.hooksConfig.tagTeamStart, data); Hooks.callAll(CONFIG.DH.HOOKS.hooksConfig.tagTeamStart, data);

View file

@ -403,6 +403,12 @@
"_id": "9PsnogEPsp1OOK64", "_id": "9PsnogEPsp1OOK64",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "act" "type": "act"

View file

@ -322,23 +322,32 @@
"_id": "ia0NUIOxE3RHb45P", "_id": "ia0NUIOxE3RHb45P",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.evasion", "type": "withinRange",
"type": "override", "target": "hostile",
"value": "@system.evasion / 2", "range": "melee"
"priority": 10 }
}
]
},
"duration": {
"value": null,
"units": "seconds",
"expiry": null,
"expired": false
}, },
"changes": [
{
"key": "system.evasion",
"mode": 5,
"value": "@system.evasion / 2",
"priority": 10
}
],
"disabled": false, "disabled": false,
"description": "<p>When the Flickerfly makes an attack, the targets Evasion is halved against the attack.</p>", "duration": {
"startTime": null,
"combat": null,
"seconds": null,
"rounds": null,
"turns": null,
"startRound": null,
"startTurn": null
},
"description": "<p>When the Flickerfl y makes an attack, the targets Evasion is halved against the attack.</p>",
"tint": "#ffffff", "tint": "#ffffff",
"statuses": [], "statuses": [],
"sort": 0, "sort": 0,

View file

@ -491,6 +491,12 @@
"_id": "KGdf2eqcXkdigg0u", "_id": "KGdf2eqcXkdigg0u",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -325,15 +325,21 @@
"_id": "wGuxOLokMqdxVSOo", "_id": "wGuxOLokMqdxVSOo",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.disadvantageSources", "type": "withinRange",
"type": "add", "target": "hostile",
"value": "Agility Rolls", "range": "melee"
"priority": null }
}
]
}, },
"changes": [
{
"key": "system.disadvantageSources",
"mode": 2,
"value": "Agility Rolls",
"priority": null
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,

View file

@ -472,8 +472,14 @@
"disabled": true, "disabled": true,
"_id": "bq8hTzQoCXmA3xad", "_id": "bq8hTzQoCXmA3xad",
"system": { "system": {
"changes": [] "rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
}
}, },
"changes": [],
"duration": { "duration": {
"startTime": 0, "startTime": 0,
"combat": null "combat": null

View file

@ -270,6 +270,12 @@
"_id": "2iBVUGHtGW3I9VIj", "_id": "2iBVUGHtGW3I9VIj",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",
@ -335,17 +341,23 @@
"name": "Out of Nowhere", "name": "Out of Nowhere",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.advantageSources", "type": "withinRange",
"type": "add", "target": "hostile",
"value": "On attacks if they are Hidden.", "range": "melee"
"priority": null }
}
]
}, },
"_id": "qT5nh7OcQ6aGdiWS", "_id": "qT5nh7OcQ6aGdiWS",
"img": "icons/magic/perception/shadow-stealth-eyes-purple.webp", "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, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,
@ -440,6 +452,12 @@
"_id": "yP4ot8VqS56RnxnE", "_id": "yP4ot8VqS56RnxnE",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [] "changes": []
}, },
"disabled": false, "disabled": false,

View file

@ -680,6 +680,12 @@
"_id": "9NQcCXMhjyBReJRd", "_id": "9NQcCXMhjyBReJRd",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",
@ -921,6 +927,12 @@
"_id": "S7kJlhnV8Nexzi8l", "_id": "S7kJlhnV8Nexzi8l",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -363,6 +363,12 @@
"_id": "U50Ccm9emMqAxma6", "_id": "U50Ccm9emMqAxma6",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -371,6 +371,12 @@
"_id": "LmzztuktRkwOCy1a", "_id": "LmzztuktRkwOCy1a",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -447,6 +447,12 @@
"_id": "CjMrSdL6kgD8mKRQ", "_id": "CjMrSdL6kgD8mKRQ",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary" "type": "temporary"

View file

@ -232,17 +232,23 @@
"name": "Levitation", "name": "Levitation",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.rules.conditionImmunities.restrained", "type": "withinRange",
"type": "override", "target": "hostile",
"value": "1", "range": "melee"
"priority": null }
}
]
}, },
"_id": "k6iaQVfMZhrpwYQj", "_id": "k6iaQVfMZhrpwYQj",
"img": "icons/magic/air/fog-gas-smoke-blue-gray.webp", "img": "icons/magic/air/fog-gas-smoke-blue-gray.webp",
"changes": [
{
"key": "system.rules.conditionImmunities.restrained",
"mode": 5,
"value": "1",
"priority": null
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,
@ -295,17 +301,23 @@
"name": "Wards", "name": "Wards",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.resistance.magical.resistance", "type": "withinRange",
"type": "override", "target": "hostile",
"value": "1", "range": "melee"
"priority": null }
}
]
}, },
"_id": "4rj6PM0AGrrlbxSc", "_id": "4rj6PM0AGrrlbxSc",
"img": "icons/magic/defensive/barrier-shield-dome-blue-purple.webp", "img": "icons/magic/defensive/barrier-shield-dome-blue-purple.webp",
"changes": [
{
"key": "system.resistance.magical.resistance",
"mode": 5,
"value": "1",
"priority": null
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,

View file

@ -459,15 +459,21 @@
"_id": "xkDIZk9u2ipDHvOL", "_id": "xkDIZk9u2ipDHvOL",
"img": "icons/creatures/magical/construct-golem-stone-blue.webp", "img": "icons/creatures/magical/construct-golem-stone-blue.webp",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.bonuses.damage.physical.bonus", "type": "withinRange",
"type": "add", "target": "hostile",
"value": "10", "range": "melee"
"priority": null }
}
]
}, },
"changes": [
{
"key": "system.bonuses.damage.physical.bonus",
"mode": 2,
"value": "10",
"priority": null
}
],
"disabled": true, "disabled": true,
"duration": { "duration": {
"startTime": null, "startTime": null,

View file

@ -315,6 +315,12 @@
"_id": "blcRqns0PHqiuPac", "_id": "blcRqns0PHqiuPac",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -331,6 +331,12 @@
"_id": "YNMhgBZW8ndrCjIp", "_id": "YNMhgBZW8ndrCjIp",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "scene" "type": "scene"

View file

@ -415,6 +415,12 @@
"_id": "U9lWz1LgeAiK5L85", "_id": "U9lWz1LgeAiK5L85",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [ "changes": [
{ {
"key": "system.resistance.magical.resistance", "key": "system.resistance.magical.resistance",
@ -540,6 +546,12 @@
"_id": "lNH6srSPyEprXZ4o", "_id": "lNH6srSPyEprXZ4o",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -379,6 +379,12 @@
"_id": "LwWxRz7FTMA80VdA", "_id": "LwWxRz7FTMA80VdA",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary" "type": "temporary"

View file

@ -410,6 +410,12 @@
"_id": "F3E7fiz01AbF2kr5", "_id": "F3E7fiz01AbF2kr5",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -270,17 +270,23 @@
"name": "Numbers Must Go Up", "name": "Numbers Must Go Up",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.bonuses.roll.attack.bonus", "type": "withinRange",
"type": "add", "target": "hostile",
"value": "ITEM.@system.resource.value", "range": "melee"
"priority": 21 }
}
]
}, },
"_id": "iLeiOlUtWvYsgbDQ", "_id": "iLeiOlUtWvYsgbDQ",
"img": "icons/magic/control/fear-fright-monster-grin-red-orange.webp", "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, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,

View file

@ -238,17 +238,23 @@
"name": "Depths Of Despair", "name": "Depths Of Despair",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.rules.attack.damage.hpDamageMultiplier", "type": "withinRange",
"type": "override", "target": "hostile",
"value": "2", "range": "melee"
"priority": null }
}
]
}, },
"_id": "nofxm1vGZ2TmceA2", "_id": "nofxm1vGZ2TmceA2",
"img": "icons/magic/death/skull-horned-worn-fire-blue.webp", "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, "disabled": true,
"duration": { "duration": {
"startTime": null, "startTime": null,
@ -350,6 +356,12 @@
"_id": "6WSx03mFbpbPWnOI", "_id": "6WSx03mFbpbPWnOI",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [ "changes": [
{ {
"key": "system.rules.dualityRoll.defaultHopeDice", "key": "system.rules.dualityRoll.defaultHopeDice",

View file

@ -319,6 +319,12 @@
"_id": "gFeHLGgeRoDdd3VG", "_id": "gFeHLGgeRoDdd3VG",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [ "changes": [
{ {
"key": "system.rules.dualityRoll.defaultFearDice", "key": "system.rules.dualityRoll.defaultFearDice",

View file

@ -440,8 +440,14 @@
"disabled": true, "disabled": true,
"_id": "dPZ7PwvTERjtG92P", "_id": "dPZ7PwvTERjtG92P",
"system": { "system": {
"changes": [] "rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
}
}, },
"changes": [],
"duration": { "duration": {
"startTime": 0, "startTime": 0,
"combat": null "combat": null

View file

@ -238,6 +238,12 @@
"name": "Flying", "name": "Flying",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [ "changes": [
{ {
"key": "system.difficulty", "key": "system.difficulty",

View file

@ -430,6 +430,12 @@
"_id": "YNKHEFQ4ucGr4Rmc", "_id": "YNKHEFQ4ucGr4Rmc",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -358,8 +358,14 @@
"disabled": true, "disabled": true,
"_id": "xoal60Ed3Ih7saBJ", "_id": "xoal60Ed3Ih7saBJ",
"system": { "system": {
"changes": [] "rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
}
}, },
"changes": [],
"duration": { "duration": {
"startTime": 0, "startTime": 0,
"combat": null "combat": null

View file

@ -240,17 +240,23 @@
"name": "Warped Fortitude", "name": "Warped Fortitude",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.resistance.physical.resistance", "type": "withinRange",
"type": "override", "target": "hostile",
"value": "1", "range": "melee"
"priority": null }
}
]
}, },
"_id": "3QLH2EEtcUEZolFz", "_id": "3QLH2EEtcUEZolFz",
"img": "icons/creatures/magical/humanoid-silhouette-glowing-pink.webp", "img": "icons/creatures/magical/humanoid-silhouette-glowing-pink.webp",
"changes": [
{
"key": "system.resistance.physical.resistance",
"mode": 5,
"value": "1",
"priority": null
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,
@ -303,17 +309,23 @@
"name": "Overwhelm", "name": "Overwhelm",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.rules.attack.damage.hpDamageMultiplier", "type": "withinRange",
"type": "override", "target": "hostile",
"value": "2", "range": "melee"
"priority": null }
}
]
}, },
"_id": "eGB9G0ljYCcdGbOx", "_id": "eGB9G0ljYCcdGbOx",
"img": "icons/skills/melee/strike-slashes-orange.webp", "img": "icons/skills/melee/strike-slashes-orange.webp",
"changes": [
{
"key": "system.rules.attack.damage.hpDamageMultiplier",
"mode": 5,
"value": "2",
"priority": null
}
],
"disabled": true, "disabled": true,
"duration": { "duration": {
"startTime": null, "startTime": null,

View file

@ -388,6 +388,12 @@
"_id": "Q99saHj6NOY2PSXf", "_id": "Q99saHj6NOY2PSXf",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",
@ -590,6 +596,12 @@
"_id": "pWDg0MADoohKu40O", "_id": "pWDg0MADoohKu40O",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -656,6 +656,12 @@
"vulnerable" "vulnerable"
], ],
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"description": "", "description": "",

View file

@ -347,6 +347,12 @@
"_id": "vb1sZCOLwDNLsr3j", "_id": "vb1sZCOLwDNLsr3j",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -265,17 +265,23 @@
"name": "Flying", "name": "Flying",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.difficulty", "type": "withinRange",
"type": "add", "target": "hostile",
"value": "3", "range": "melee"
"priority": null }
}
]
}, },
"_id": "odAyKY0BSAkcO3Dd", "_id": "odAyKY0BSAkcO3Dd",
"img": "icons/creatures/birds/raptor-hawk-flying.webp", "img": "icons/creatures/birds/raptor-hawk-flying.webp",
"changes": [
{
"key": "system.difficulty",
"mode": 2,
"value": "3",
"priority": null
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,
@ -419,6 +425,12 @@
"_id": "m6qqQZxukDPVcGdQ", "_id": "m6qqQZxukDPVcGdQ",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "act" "type": "act"
@ -567,8 +579,14 @@
"_id": "Sd34xywRqiF5w9sX", "_id": "Sd34xywRqiF5w9sX",
"type": "base", "type": "base",
"system": { "system": {
"changes": [] "rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
}
}, },
"changes": [],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,

View file

@ -269,15 +269,21 @@
"_id": "aATxfjeOzUYtKuU6", "_id": "aATxfjeOzUYtKuU6",
"img": "icons/commodities/biological/wing-insect-green.webp", "img": "icons/commodities/biological/wing-insect-green.webp",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.difficulty", "type": "withinRange",
"type": "add", "target": "hostile",
"value": "2", "range": "melee"
"priority": null }
}
]
}, },
"changes": [
{
"key": "system.difficulty",
"mode": 2,
"value": "2",
"priority": null
}
],
"disabled": true, "disabled": true,
"duration": { "duration": {
"startTime": null, "startTime": null,
@ -379,8 +385,14 @@
"disabled": true, "disabled": true,
"_id": "dQgcYTz5vmV25Y6G", "_id": "dQgcYTz5vmV25Y6G",
"system": { "system": {
"changes": [] "rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
}
}, },
"changes": [],
"duration": { "duration": {
"startTime": 0, "startTime": 0,
"combat": null "combat": null

View file

@ -433,6 +433,12 @@
"_id": "oILkLJlGNZl7KI1R", "_id": "oILkLJlGNZl7KI1R",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "shortRest" "type": "shortRest"

View file

@ -597,6 +597,12 @@
"_id": "Mchd23xNQ4nSWw9X", "_id": "Mchd23xNQ4nSWw9X",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [] "changes": []
}, },
"disabled": false, "disabled": false,

View file

@ -330,6 +330,12 @@
"_id": "bYBrgiSwHwYfQyjn", "_id": "bYBrgiSwHwYfQyjn",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [ "changes": [
{ {
"key": "system.rules.conditionImmunities.hidden", "key": "system.rules.conditionImmunities.hidden",

View file

@ -340,17 +340,23 @@
"name": "Immovable Object", "name": "Immovable Object",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.resistance.physical.reduction", "type": "withinRange",
"type": "add", "target": "hostile",
"value": "7", "range": "melee"
"priority": null }
}
]
}, },
"_id": "7V7qMq9in3AArwiM", "_id": "7V7qMq9in3AArwiM",
"img": "icons/magic/defensive/shield-barrier-glowing-triangle-green.webp", "img": "icons/magic/defensive/shield-barrier-glowing-triangle-green.webp",
"changes": [
{
"key": "system.resistance.physical.reduction",
"mode": 2,
"value": "7",
"priority": null
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,
@ -504,6 +510,12 @@
"_id": "38MUzfbH64EMLVse", "_id": "38MUzfbH64EMLVse",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -323,15 +323,21 @@
"_id": "WYqjt1tVqPEdVV5l", "_id": "WYqjt1tVqPEdVV5l",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.disadvantageSources", "type": "withinRange",
"type": "add", "target": "hostile",
"value": "Your next action", "range": "melee"
"priority": null }
}
]
}, },
"changes": [
{
"key": "system.disadvantageSources",
"mode": 2,
"value": "Your next action",
"priority": null
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,
@ -456,6 +462,12 @@
"_id": "X8NF2OB23mSpDvlx", "_id": "X8NF2OB23mSpDvlx",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -460,6 +460,12 @@
"_id": "yk5kR5OVLCgDWfgY", "_id": "yk5kR5OVLCgDWfgY",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -234,17 +234,23 @@
"name": "Punish the Guilty", "name": "Punish the Guilty",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.rules.attack.damage.hpDamageMultiplier", "type": "withinRange",
"type": "override", "target": "hostile",
"value": "2", "range": "melee"
"priority": null }
}
]
}, },
"_id": "ID85zoIa5GfhNMti", "_id": "ID85zoIa5GfhNMti",
"img": "icons/magic/control/buff-flight-wings-runes-red-yellow.webp", "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, "disabled": true,
"duration": { "duration": {
"startTime": null, "startTime": null,

View file

@ -386,6 +386,12 @@
"_id": "O8G0oOf9f3qzNOAT", "_id": "O8G0oOf9f3qzNOAT",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -429,6 +429,12 @@
"_id": "EwZ8owroJxFpg81e", "_id": "EwZ8owroJxFpg81e",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -510,6 +510,12 @@
"_id": "iBJ3YhEkVsGKEIVk", "_id": "iBJ3YhEkVsGKEIVk",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [ "changes": [
{ {
"key": "system.resistance.magical.immunity", "key": "system.resistance.magical.immunity",

View file

@ -273,6 +273,12 @@
"_id": "ihy3kvEGSOEKdNfT", "_id": "ihy3kvEGSOEKdNfT",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary" "type": "temporary"

View file

@ -329,6 +329,12 @@
"_id": "d7sB1Qa1kJMnglqu", "_id": "d7sB1Qa1kJMnglqu",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [ "changes": [
{ {
"key": "system.rules.attack.damage.hpDamageTakenMultiplier", "key": "system.rules.attack.damage.hpDamageTakenMultiplier",

View file

@ -375,15 +375,21 @@
"_id": "w5VTwlHmUjl8XCQ4", "_id": "w5VTwlHmUjl8XCQ4",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.advantageSources", "type": "withinRange",
"type": "add", "target": "hostile",
"value": "Attacks made while Hidden", "range": "melee"
"priority": null }
}
]
}, },
"changes": [
{
"key": "system.advantageSources",
"mode": 2,
"value": "Attacks made while Hidden",
"priority": null
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,

View file

@ -346,15 +346,21 @@
"_id": "pZUEkMkCus4U7h8W", "_id": "pZUEkMkCus4U7h8W",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.evasion", "type": "withinRange",
"type": "override", "target": "hostile",
"value": "@system.evasion / 2", "range": "melee"
"priority": 10 }
}
]
}, },
"changes": [
{
"key": "system.evasion",
"mode": 5,
"value": "@system.evasion / 2",
"priority": 10
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,

View file

@ -250,17 +250,23 @@
"name": "Chevalier", "name": "Chevalier",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.difficulty", "type": "withinRange",
"type": "add", "target": "hostile",
"value": "2", "range": "melee"
"priority": null }
}
]
}, },
"_id": "w8wLcSsTiTU3mS7e", "_id": "w8wLcSsTiTU3mS7e",
"img": "icons/environment/people/cavalry-heavy.webp", "img": "icons/environment/people/cavalry-heavy.webp",
"changes": [
{
"key": "system.difficulty",
"mode": 2,
"value": "2",
"priority": null
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,
@ -313,17 +319,23 @@
"name": "Heavily Armored", "name": "Heavily Armored",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.resistance.physical.reduction", "type": "withinRange",
"type": "add", "target": "hostile",
"value": "3", "range": "melee"
"priority": null }
}
]
}, },
"_id": "xZjvrNRRjskY3n3j", "_id": "xZjvrNRRjskY3n3j",
"img": "icons/equipment/chest/breastplate-cuirass-steel-grey.webp", "img": "icons/equipment/chest/breastplate-cuirass-steel-grey.webp",
"changes": [
{
"key": "system.resistance.physical.reduction",
"mode": 2,
"value": "3",
"priority": null
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,

View file

@ -378,6 +378,12 @@
"_id": "Xes6ZIE01CCN67KF", "_id": "Xes6ZIE01CCN67KF",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -402,6 +402,12 @@
"_id": "zMut1PRphlwE0xOa", "_id": "zMut1PRphlwE0xOa",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -235,15 +235,21 @@
"_id": "vwc93gtzFoFZj4XT", "_id": "vwc93gtzFoFZj4XT",
"img": "icons/magic/defensive/shield-barrier-flaming-diamond-blue.webp", "img": "icons/magic/defensive/shield-barrier-flaming-diamond-blue.webp",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.resistance.magical.resistance", "type": "withinRange",
"type": "add", "target": "hostile",
"value": "1", "range": "melee"
"priority": null }
}
]
}, },
"changes": [
{
"key": "system.resistance.magical.resistance",
"mode": 2,
"value": "1",
"priority": null
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,
@ -377,6 +383,12 @@
"_id": "KIyV2eXDmmymXY5y", "_id": "KIyV2eXDmmymXY5y",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "shortRest" "type": "shortRest"

View file

@ -447,6 +447,12 @@
"_id": "YznseQP43jNrk07h", "_id": "YznseQP43jNrk07h",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "scene" "type": "scene"

View file

@ -394,6 +394,12 @@
"_id": "3PY5KIG6d3dr3dty", "_id": "3PY5KIG6d3dr3dty",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "any",
"range": "self"
},
"changes": [ "changes": [
{ {
"key": "system.resistance.physical.resistance", "key": "system.resistance.physical.resistance",

View file

@ -313,15 +313,21 @@
"_id": "rpkjVdlJYI5dB99B", "_id": "rpkjVdlJYI5dB99B",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.disadvantageSources", "type": "withinRange",
"type": "add", "target": "hostile",
"value": "On your next action roll.", "range": "melee"
"priority": null }
}
]
}, },
"changes": [
{
"key": "system.disadvantageSources",
"mode": 2,
"value": "On your next action roll.",
"priority": null
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,
@ -439,6 +445,12 @@
"_id": "edEZER9ImWicMwRb", "_id": "edEZER9ImWicMwRb",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "scene" "type": "scene"

View file

@ -446,6 +446,12 @@
"_id": "Q5eeh0B6qaXFS1Ck", "_id": "Q5eeh0B6qaXFS1Ck",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "shortRest", "type": "shortRest",

View file

@ -337,8 +337,14 @@
"disabled": true, "disabled": true,
"_id": "OU05YZwFQffawtna", "_id": "OU05YZwFQffawtna",
"system": { "system": {
"changes": [] "rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
}
}, },
"changes": [],
"duration": { "duration": {
"startTime": 0, "startTime": 0,
"combat": null "combat": null

View file

@ -404,6 +404,12 @@
"_id": "9UBLk9M87VIUziAQ", "_id": "9UBLk9M87VIUziAQ",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -411,6 +411,12 @@
"_id": "xrm5786ckKbMYHjn", "_id": "xrm5786ckKbMYHjn",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -235,17 +235,23 @@
"name": "Opportunist", "name": "Opportunist",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.rules.attack.damage.hpDamageMultiplier", "type": "withinRange",
"type": "override", "target": "hostile",
"value": "2", "range": "melee"
"priority": null }
}
]
}, },
"_id": "O03vYbyNLO3YPZGo", "_id": "O03vYbyNLO3YPZGo",
"img": "icons/skills/targeting/crosshair-triple-strike-orange.webp", "img": "icons/skills/targeting/crosshair-triple-strike-orange.webp",
"changes": [
{
"key": "system.rules.attack.damage.hpDamageMultiplier",
"mode": 5,
"value": "2",
"priority": null
}
],
"disabled": true, "disabled": true,
"duration": { "duration": {
"startTime": null, "startTime": null,

View file

@ -237,15 +237,21 @@
"_id": "zTepuF1Z5OObQdSi", "_id": "zTepuF1Z5OObQdSi",
"img": "icons/magic/death/bones-crossed-orange.webp", "img": "icons/magic/death/bones-crossed-orange.webp",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.resistance.physical.resistance", "type": "withinRange",
"type": "override", "target": "hostile",
"value": "1", "range": "melee"
"priority": null }
}
]
}, },
"changes": [
{
"key": "system.resistance.physical.resistance",
"mode": 5,
"value": "1",
"priority": null
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,

View file

@ -270,17 +270,23 @@
"name": "Ghost", "name": "Ghost",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.resistance.physical.resistance", "type": "withinRange",
"type": "override", "target": "hostile",
"value": "1", "range": "melee"
"priority": null }
}
]
}, },
"_id": "xNkkl7nwKFkiB9Rv", "_id": "xNkkl7nwKFkiB9Rv",
"img": "icons/magic/death/undead-ghost-scream-teal.webp", "img": "icons/magic/death/undead-ghost-scream-teal.webp",
"changes": [
{
"key": "system.resistance.physical.resistance",
"mode": 5,
"value": "1",
"priority": null
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,

View file

@ -270,17 +270,23 @@
"name": "Ghost", "name": "Ghost",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.resistance.physical.resistance", "type": "withinRange",
"type": "override", "target": "hostile",
"value": "1", "range": "melee"
"priority": null }
}
]
}, },
"_id": "kZhvwDvfcYQ10reO", "_id": "kZhvwDvfcYQ10reO",
"img": "icons/magic/death/undead-ghost-scream-teal.webp", "img": "icons/magic/death/undead-ghost-scream-teal.webp",
"changes": [
{
"key": "system.resistance.physical.resistance",
"mode": 5,
"value": "1",
"priority": null
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,

View file

@ -270,17 +270,23 @@
"name": "Ghost", "name": "Ghost",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.resistance.physical.resistance", "type": "withinRange",
"type": "override", "target": "hostile",
"value": "1", "range": "melee"
"priority": null }
}
]
}, },
"_id": "QDXyAMk33kJGe6hU", "_id": "QDXyAMk33kJGe6hU",
"img": "icons/magic/death/undead-ghost-scream-teal.webp", "img": "icons/magic/death/undead-ghost-scream-teal.webp",
"changes": [
{
"key": "system.resistance.physical.resistance",
"mode": 5,
"value": "1",
"priority": null
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,

View file

@ -352,6 +352,12 @@
"_id": "6UgMuuJ8ZygbCsDh", "_id": "6UgMuuJ8ZygbCsDh",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary" "type": "temporary"

View file

@ -278,8 +278,14 @@
"disabled": true, "disabled": true,
"_id": "FOV6AzngiR0PZyuN", "_id": "FOV6AzngiR0PZyuN",
"system": { "system": {
"changes": [] "rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
}
}, },
"changes": [],
"duration": { "duration": {
"startTime": 0, "startTime": 0,
"combat": null "combat": null

View file

@ -489,8 +489,14 @@
"_id": "xyXPmPIOtqXYF1TJ", "_id": "xyXPmPIOtqXYF1TJ",
"type": "base", "type": "base",
"system": { "system": {
"changes": [] "rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
}
}, },
"changes": [],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,

View file

@ -421,8 +421,14 @@
"_id": "PdkhaTw2j15KJwBf", "_id": "PdkhaTw2j15KJwBf",
"type": "base", "type": "base",
"system": { "system": {
"changes": [] "rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
}
}, },
"changes": [],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,
@ -467,8 +473,14 @@
"disabled": true, "disabled": true,
"_id": "ki4vrzrFcEYtGeJu", "_id": "ki4vrzrFcEYtGeJu",
"system": { "system": {
"changes": [] "rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
}
}, },
"changes": [],
"duration": { "duration": {
"startTime": 0, "startTime": 0,
"combat": null "combat": null

View file

@ -323,6 +323,12 @@
"_id": "6TZlstmWJPbeoL7i", "_id": "6TZlstmWJPbeoL7i",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -297,15 +297,21 @@
"_id": "Fo5bLYlmYGtQFAGg", "_id": "Fo5bLYlmYGtQFAGg",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.disadvantageSources", "type": "withinRange",
"type": "add", "target": "hostile",
"value": "On attack rolls while you're within Very Close range of the Sentinel", "range": "melee"
"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, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,

View file

@ -302,15 +302,21 @@
"_id": "yQ85C0JHRG1pwu8a", "_id": "yQ85C0JHRG1pwu8a",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.evasion", "type": "withinRange",
"type": "override", "target": "hostile",
"value": "@system.evasion / 2", "range": "melee"
"priority": 10 }
}
]
}, },
"changes": [
{
"key": "system.evasion",
"mode": 5,
"value": "@system.evasion / 2",
"priority": 10
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,

View file

@ -376,17 +376,23 @@
"name": "Injured Wings", "name": "Injured Wings",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.difficulty", "type": "withinRange",
"type": "add", "target": "hostile",
"value": "1", "range": "melee"
"priority": null }
}
]
}, },
"_id": "zCi90lgFAaA7yrJG", "_id": "zCi90lgFAaA7yrJG",
"img": "icons/commodities/biological/wing-green.webp", "img": "icons/commodities/biological/wing-green.webp",
"changes": [
{
"key": "system.difficulty",
"mode": 2,
"value": "1",
"priority": null
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,
@ -867,6 +873,12 @@
"_id": "YUjdwrEZ4zn7WR9X", "_id": "YUjdwrEZ4zn7WR9X",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -734,6 +734,12 @@
"_id": "xmzA6NC9zrulhzQs", "_id": "xmzA6NC9zrulhzQs",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -321,17 +321,23 @@
"name": "Flying", "name": "Flying",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.difficulty", "type": "withinRange",
"type": "add", "target": "hostile",
"value": "3", "range": "melee"
"priority": null }
}
]
}, },
"_id": "8o8yG73ZfrZ3hb5i", "_id": "8o8yG73ZfrZ3hb5i",
"img": "icons/commodities/biological/wing-green.webp", "img": "icons/commodities/biological/wing-green.webp",
"changes": [
{
"key": "system.difficulty",
"mode": 2,
"value": "3",
"priority": null
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,
@ -384,17 +390,23 @@
"name": "Obsidian Scales", "name": "Obsidian Scales",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.resistance.physical.resistance", "type": "withinRange",
"type": "override", "target": "hostile",
"value": "1", "range": "melee"
"priority": null }
}
]
}, },
"_id": "Jr9SlkRnkroulYhy", "_id": "Jr9SlkRnkroulYhy",
"img": "icons/commodities/leather/scale-chitin-grey.webp", "img": "icons/commodities/leather/scale-chitin-grey.webp",
"changes": [
{
"key": "system.resistance.physical.resistance",
"mode": 5,
"value": "1",
"priority": null
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,
@ -539,6 +551,12 @@
"_id": "qtIaAZDW8QsjILgb", "_id": "qtIaAZDW8QsjILgb",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [] "changes": []
}, },
"disabled": false, "disabled": false,

View file

@ -319,6 +319,12 @@
"_id": "j2jYmYbtWXvq32yX", "_id": "j2jYmYbtWXvq32yX",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -362,6 +362,12 @@
"_id": "k8LzBWRZo6VPqvpH", "_id": "k8LzBWRZo6VPqvpH",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",

View file

@ -500,6 +500,12 @@
"_id": "g9bUvmw3jet6T99e", "_id": "g9bUvmw3jet6T99e",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [] "changes": []
}, },
"disabled": false, "disabled": false,
@ -628,6 +634,12 @@
"_id": "40cFHuNdEvbUZ9rs", "_id": "40cFHuNdEvbUZ9rs",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [], "changes": [],
"duration": { "duration": {
"type": "temporary", "type": "temporary",
@ -756,6 +768,12 @@
"_id": "1JlRxa07i8T1a9x6", "_id": "1JlRxa07i8T1a9x6",
"type": "base", "type": "base",
"system": { "system": {
"rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
},
"changes": [ "changes": [
{ {
"key": "system.disadvantageSources", "key": "system.disadvantageSources",

View file

@ -259,17 +259,23 @@
"name": "Unyielding", "name": "Unyielding",
"type": "base", "type": "base",
"system": { "system": {
"changes": [ "rangeDependence": {
{ "enabled": false,
"key": "system.resistance.physical.resistance", "type": "withinRange",
"type": "override", "target": "hostile",
"value": "1", "range": "melee"
"priority": null }
}
]
}, },
"_id": "D1lCoe9WVr6vYuD9", "_id": "D1lCoe9WVr6vYuD9",
"img": "icons/magic/defensive/shield-barrier-blue.webp", "img": "icons/magic/defensive/shield-barrier-blue.webp",
"changes": [
{
"key": "system.resistance.physical.resistance",
"mode": 5,
"value": "1",
"priority": null
}
],
"disabled": false, "disabled": false,
"duration": { "duration": {
"startTime": null, "startTime": null,
@ -428,8 +434,14 @@
"disabled": true, "disabled": true,
"_id": "9D6SteWlhbfMPhvt", "_id": "9D6SteWlhbfMPhvt",
"system": { "system": {
"changes": [] "rangeDependence": {
"enabled": false,
"type": "withinRange",
"target": "hostile",
"range": "melee"
}
}, },
"changes": [],
"duration": { "duration": {
"startTime": 0, "startTime": 0,
"combat": null "combat": null

Some files were not shown because too many files have changed in this diff Show more