mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-01-17 15:39:02 +01:00
Merged with main
This commit is contained in:
commit
9b9632cf94
150 changed files with 1077 additions and 930 deletions
2
.github/workflows/deploy.yml
vendored
2
.github/workflows/deploy.yml
vendored
|
|
@ -15,7 +15,7 @@ jobs:
|
||||||
|
|
||||||
- name: Build Packs
|
- name: Build Packs
|
||||||
run: |
|
run: |
|
||||||
npm run pullYMLtoLDB
|
npm run pullYMLtoLDBBuild
|
||||||
mv --force src/packs/LICENSE packs/LICENSE
|
mv --force src/packs/LICENSE packs/LICENSE
|
||||||
|
|
||||||
- name: Build daggerheart.js
|
- name: Build daggerheart.js
|
||||||
|
|
|
||||||
|
|
@ -259,7 +259,10 @@ Hooks.on('moveToken', async (movedToken, data) => {
|
||||||
const rangeDependantEffects = movedToken.actor.effects.filter(effect => effect.system.rangeDependence?.enabled);
|
const rangeDependantEffects = movedToken.actor.effects.filter(effect => effect.system.rangeDependence?.enabled);
|
||||||
|
|
||||||
const updateEffects = async (disposition, token, effects, effectUpdates) => {
|
const updateEffects = async (disposition, token, effects, effectUpdates) => {
|
||||||
const rangeMeasurement = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.RangeMeasurement);
|
const rangeMeasurement = game.settings.get(
|
||||||
|
CONFIG.DH.id,
|
||||||
|
CONFIG.DH.SETTINGS.gameSettings.variantRules
|
||||||
|
).rangeMeasurement;
|
||||||
|
|
||||||
for (let effect of effects.filter(x => x.system.rangeDependence?.enabled)) {
|
for (let effect of effects.filter(x => x.system.rangeDependence?.enabled)) {
|
||||||
const { target, range, type } = effect.system.rangeDependence;
|
const { target, range, type } = effect.system.rangeDependence;
|
||||||
|
|
|
||||||
18
lang/en.json
18
lang/en.json
|
|
@ -188,7 +188,8 @@
|
||||||
"manualMulticlassSubclass": {
|
"manualMulticlassSubclass": {
|
||||||
"title": "Multiclass Subclass",
|
"title": "Multiclass Subclass",
|
||||||
"text": "Do you want to add this subclass as your multiclass subclass?"
|
"text": "Do you want to add this subclass as your multiclass subclass?"
|
||||||
}
|
},
|
||||||
|
"cannotRemoveCoreExperience": "You are using Levelup Auto. You cannot remove an experience given to you by the rule progression."
|
||||||
},
|
},
|
||||||
"Companion": {
|
"Companion": {
|
||||||
"FIELDS": {
|
"FIELDS": {
|
||||||
|
|
@ -880,7 +881,7 @@
|
||||||
"Gold": {
|
"Gold": {
|
||||||
"title": "Gold",
|
"title": "Gold",
|
||||||
"coins": "Coins",
|
"coins": "Coins",
|
||||||
"handfulls": "Handfulls",
|
"handfuls": "Handfuls",
|
||||||
"bags": "Bags",
|
"bags": "Bags",
|
||||||
"chests": "Chests"
|
"chests": "Chests"
|
||||||
},
|
},
|
||||||
|
|
@ -2115,6 +2116,10 @@
|
||||||
"resourceScrollTexts": {
|
"resourceScrollTexts": {
|
||||||
"label": "Show Resource Change Scrolltexts",
|
"label": "Show Resource Change Scrolltexts",
|
||||||
"hint": "When a character is damaged, uses armor etc, a scrolling text will briefly appear by the token to signify this."
|
"hint": "When a character is damaged, uses armor etc, a scrolling text will briefly appear by the token to signify this."
|
||||||
|
},
|
||||||
|
"playerCanEditSheet": {
|
||||||
|
"label": "Players Can Manually Edit Character Settings",
|
||||||
|
"hint": "Players are allowed to access the manual Character Settings and change their statistics beyond the rules."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -2138,7 +2143,7 @@
|
||||||
"title": "Currency Overrides",
|
"title": "Currency Overrides",
|
||||||
"currencyName": "Currency Name",
|
"currencyName": "Currency Name",
|
||||||
"coinName": "Coin Name",
|
"coinName": "Coin Name",
|
||||||
"handfullName": "Handfull Name",
|
"handfulName": "Handful Name",
|
||||||
"bagName": "Bag Name",
|
"bagName": "Bag Name",
|
||||||
"chestName": "Chest Name"
|
"chestName": "Chest Name"
|
||||||
},
|
},
|
||||||
|
|
@ -2210,10 +2215,6 @@
|
||||||
"actionTokens": {
|
"actionTokens": {
|
||||||
"enabled": { "label": "Enabled" },
|
"enabled": { "label": "Enabled" },
|
||||||
"tokens": { "label": "Tokens" }
|
"tokens": { "label": "Tokens" }
|
||||||
},
|
|
||||||
"useCoins": {
|
|
||||||
"label": "Use Coins",
|
|
||||||
"hint": "test"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -2362,7 +2363,8 @@
|
||||||
"openSheetSettings": "Open Settings",
|
"openSheetSettings": "Open Settings",
|
||||||
"compendiumBrowser": "Compendium Browser",
|
"compendiumBrowser": "Compendium Browser",
|
||||||
"rulesOn": "Rules On",
|
"rulesOn": "Rules On",
|
||||||
"rulesOff": "Rules Off"
|
"rulesOff": "Rules Off",
|
||||||
|
"remainingUses": "Uses refresh on {type}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import { abilities } from '../../config/actorConfig.mjs';
|
import { abilities } from '../../config/actorConfig.mjs';
|
||||||
import { burden } from '../../config/generalConfig.mjs';
|
import { burden } from '../../config/generalConfig.mjs';
|
||||||
import { createEmbeddedItemWithEffects } from '../../helpers/utils.mjs';
|
|
||||||
import { ItemBrowser } from '../ui/itemBrowser.mjs';
|
import { ItemBrowser } from '../ui/itemBrowser.mjs';
|
||||||
|
import { createEmbeddedItemsWithEffects, createEmbeddedItemWithEffects } from '../../helpers/utils.mjs';
|
||||||
|
|
||||||
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
|
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
|
||||||
|
|
||||||
|
|
@ -21,8 +21,8 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl
|
||||||
class: this.character.system.class?.value ?? {},
|
class: this.character.system.class?.value ?? {},
|
||||||
subclass: this.character.system.class?.subclass ?? {},
|
subclass: this.character.system.class?.subclass ?? {},
|
||||||
experiences: {
|
experiences: {
|
||||||
[foundry.utils.randomID()]: { name: '', value: 2 },
|
[foundry.utils.randomID()]: { name: '', value: 2, core: true },
|
||||||
[foundry.utils.randomID()]: { name: '', value: 2 }
|
[foundry.utils.randomID()]: { name: '', value: 2, core: true }
|
||||||
},
|
},
|
||||||
domainCards: {
|
domainCards: {
|
||||||
[foundry.utils.randomID()]: {},
|
[foundry.utils.randomID()]: {},
|
||||||
|
|
@ -373,13 +373,18 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl
|
||||||
);
|
);
|
||||||
context.armor = {
|
context.armor = {
|
||||||
...this.equipment.armor,
|
...this.equipment.armor,
|
||||||
suggestion: { ...suggestions.armor, taken: suggestions.armor?.uuid === this.equipment.armor?.uuid },
|
suggestion: {
|
||||||
|
...suggestions.armor,
|
||||||
|
uuid: suggestions.armor?.uuid,
|
||||||
|
taken: suggestions.armor?.uuid === this.equipment.armor?.uuid
|
||||||
|
},
|
||||||
compendium: 'armors'
|
compendium: 'armors'
|
||||||
};
|
};
|
||||||
context.primaryWeapon = {
|
context.primaryWeapon = {
|
||||||
...this.equipment.primaryWeapon,
|
...this.equipment.primaryWeapon,
|
||||||
suggestion: {
|
suggestion: {
|
||||||
...suggestions.primaryWeapon,
|
...suggestions.primaryWeapon,
|
||||||
|
uuid: suggestions.primaryWeapon?.uuid,
|
||||||
taken: suggestions.primaryWeapon?.uuid === this.equipment.primaryWeapon?.uuid
|
taken: suggestions.primaryWeapon?.uuid === this.equipment.primaryWeapon?.uuid
|
||||||
},
|
},
|
||||||
compendium: 'weapons'
|
compendium: 'weapons'
|
||||||
|
|
@ -388,6 +393,7 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl
|
||||||
...this.equipment.secondaryWeapon,
|
...this.equipment.secondaryWeapon,
|
||||||
suggestion: {
|
suggestion: {
|
||||||
...suggestions.secondaryWeapon,
|
...suggestions.secondaryWeapon,
|
||||||
|
uuid: suggestions.secondaryWeapon?.uuid,
|
||||||
taken: suggestions.secondaryWeapon?.uuid === this.equipment.secondaryWeapon?.uuid
|
taken: suggestions.secondaryWeapon?.uuid === this.equipment.secondaryWeapon?.uuid
|
||||||
},
|
},
|
||||||
disabled: this.equipment.primaryWeapon?.system?.burden === burden.twoHanded.value,
|
disabled: this.equipment.primaryWeapon?.system?.burden === burden.twoHanded.value,
|
||||||
|
|
@ -490,22 +496,22 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl
|
||||||
|
|
||||||
static async viewCompendium(event, target) {
|
static async viewCompendium(event, target) {
|
||||||
const type = target.dataset.compendium ?? target.dataset.type;
|
const type = target.dataset.compendium ?? target.dataset.type;
|
||||||
|
|
||||||
const presets = {
|
const presets = {
|
||||||
compendium: "daggerheart",
|
compendium: 'daggerheart',
|
||||||
folder: type,
|
folder: type,
|
||||||
render: {
|
render: {
|
||||||
noFolder: true
|
noFolder: true
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if(type == "domains")
|
if (type == 'domains')
|
||||||
presets.filter = {
|
presets.filter = {
|
||||||
'level.max': { key: 'level.max', value: 1 },
|
'level.max': { key: 'level.max', value: 1 },
|
||||||
'system.domain': { key: 'system.domain', value: this.setup.class?.system.domains ?? null },
|
'system.domain': { key: 'system.domain', value: this.setup.class?.system.domains ?? null }
|
||||||
};
|
};
|
||||||
|
|
||||||
return this.itemBrowser = await new ItemBrowser({ presets }).render({ force: true });
|
return (this.itemBrowser = await new ItemBrowser({ presets }).render({ force: true }));
|
||||||
}
|
}
|
||||||
|
|
||||||
static async viewItem(_, target) {
|
static async viewItem(_, target) {
|
||||||
|
|
@ -574,13 +580,7 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl
|
||||||
await createEmbeddedItemWithEffects(this.character, this.setup.community);
|
await createEmbeddedItemWithEffects(this.character, this.setup.community);
|
||||||
await createEmbeddedItemWithEffects(this.character, this.setup.class);
|
await createEmbeddedItemWithEffects(this.character, this.setup.class);
|
||||||
await createEmbeddedItemWithEffects(this.character, this.setup.subclass);
|
await createEmbeddedItemWithEffects(this.character, this.setup.subclass);
|
||||||
await this.character.createEmbeddedDocuments(
|
await createEmbeddedItemsWithEffects(this.character, Object.values(this.setup.domainCards));
|
||||||
'Item',
|
|
||||||
Object.values(this.setup.domainCards).map(x => ({
|
|
||||||
...x,
|
|
||||||
effects: x.effects?.map(effect => effect.toObject())
|
|
||||||
}))
|
|
||||||
);
|
|
||||||
|
|
||||||
if (this.equipment.armor.uuid)
|
if (this.equipment.armor.uuid)
|
||||||
await createEmbeddedItemWithEffects(this.character, this.equipment.armor, {
|
await createEmbeddedItemWithEffects(this.character, this.equipment.armor, {
|
||||||
|
|
@ -602,24 +602,28 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl
|
||||||
if (this.equipment.inventory.choiceB.uuid)
|
if (this.equipment.inventory.choiceB.uuid)
|
||||||
await createEmbeddedItemWithEffects(this.character, this.equipment.inventory.choiceB);
|
await createEmbeddedItemWithEffects(this.character, this.equipment.inventory.choiceB);
|
||||||
|
|
||||||
await this.character.createEmbeddedDocuments(
|
await createEmbeddedItemsWithEffects(
|
||||||
'Item',
|
this.character,
|
||||||
this.setup.class.system.inventory.take
|
this.setup.class.system.inventory.take.filter(x => x)
|
||||||
.filter(x => x)
|
|
||||||
.map(x => ({
|
|
||||||
...x,
|
|
||||||
effects: x.effects?.map(effect => effect.toObject())
|
|
||||||
}))
|
|
||||||
);
|
);
|
||||||
|
|
||||||
await this.character.update({
|
await this.character.update(
|
||||||
system: {
|
{
|
||||||
traits: this.setup.traits,
|
system: {
|
||||||
experiences: this.setup.experiences
|
traits: this.setup.traits,
|
||||||
}
|
experiences: {
|
||||||
});
|
...this.setup.experiences,
|
||||||
|
...Object.keys(this.character.system.experiences).reduce((acc, key) => {
|
||||||
|
acc[`-=${key}`] = null;
|
||||||
|
return acc;
|
||||||
|
}, {})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ overwrite: true }
|
||||||
|
);
|
||||||
|
|
||||||
if(this.itemBrowser) this.itemBrowser.close();
|
if (this.itemBrowser) this.itemBrowser.close();
|
||||||
this.close();
|
this.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -710,6 +714,10 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (item.system.burden === CONFIG.DH.GENERAL.burden.twoHanded.value) {
|
||||||
|
this.equipment.secondaryWeapon = {};
|
||||||
|
}
|
||||||
|
|
||||||
this.equipment.primaryWeapon = { ...item, uuid: item.uuid };
|
this.equipment.primaryWeapon = { ...item, uuid: item.uuid };
|
||||||
} else if (item.type === 'weapon' && event.target.closest('.secondary-weapon-card')) {
|
} else if (item.type === 'weapon' && event.target.closest('.secondary-weapon-card')) {
|
||||||
if (this.equipment.primaryWeapon?.system?.burden === burden.twoHanded.value) {
|
if (this.equipment.primaryWeapon?.system?.burden === burden.twoHanded.value) {
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ export { default as BeastformDialog } from './beastformDialog.mjs';
|
||||||
export { default as d20RollDialog } from './d20RollDialog.mjs';
|
export { default as d20RollDialog } from './d20RollDialog.mjs';
|
||||||
export { default as DamageDialog } from './damageDialog.mjs';
|
export { default as DamageDialog } from './damageDialog.mjs';
|
||||||
export { default as DamageReductionDialog } from './damageReductionDialog.mjs';
|
export { default as DamageReductionDialog } from './damageReductionDialog.mjs';
|
||||||
export { default as DamageSelectionDialog } from './damageSelectionDialog.mjs';
|
|
||||||
export { default as DeathMove } from './deathMove.mjs';
|
export { default as DeathMove } from './deathMove.mjs';
|
||||||
export { default as Downtime } from './downtime.mjs';
|
export { default as Downtime } from './downtime.mjs';
|
||||||
export { default as MulticlassChoiceDialog } from './multiclassChoiceDialog.mjs';
|
export { default as MulticlassChoiceDialog } from './multiclassChoiceDialog.mjs';
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,9 @@ export default class DamageDialog extends HandlebarsApplicationMixin(Application
|
||||||
};
|
};
|
||||||
|
|
||||||
get title() {
|
get title() {
|
||||||
return game.i18n.localize(`DAGGERHEART.EFFECTS.ApplyLocations.${this.config.isHealing ? 'healing' : 'damage'}Roll.name`);
|
return game.i18n.localize(
|
||||||
|
`DAGGERHEART.EFFECTS.ApplyLocations.${this.config.hasHealing ? 'healing' : 'damage'}Roll.name`
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async _prepareContext(_options) {
|
async _prepareContext(_options) {
|
||||||
|
|
@ -46,7 +48,7 @@ export default class DamageDialog extends HandlebarsApplicationMixin(Application
|
||||||
context.config = CONFIG.DH;
|
context.config = CONFIG.DH;
|
||||||
context.title = this.config.title ?? this.title;
|
context.title = this.config.title ?? this.title;
|
||||||
context.formula = this.roll.constructFormula(this.config);
|
context.formula = this.roll.constructFormula(this.config);
|
||||||
context.isHealing = this.config.isHealing;
|
context.hasHealing = this.config.hasHealing;
|
||||||
context.directDamage = this.config.directDamage;
|
context.directDamage = this.config.directDamage;
|
||||||
context.selectedRollMode = this.config.selectedRollMode;
|
context.selectedRollMode = this.config.selectedRollMode;
|
||||||
context.rollModes = Object.entries(CONFIG.Dice.rollModes).map(([action, { label, icon }]) => ({
|
context.rollModes = Object.entries(CONFIG.Dice.rollModes).map(([action, { label, icon }]) => ({
|
||||||
|
|
|
||||||
|
|
@ -1,128 +0,0 @@
|
||||||
// TO DELETE ?
|
|
||||||
|
|
||||||
const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;
|
|
||||||
|
|
||||||
export default class DamageSelectionDialog extends HandlebarsApplicationMixin(ApplicationV2) {
|
|
||||||
constructor(rollString, bonusDamage, resolve, hope = 0) {
|
|
||||||
super({});
|
|
||||||
|
|
||||||
this.data = {
|
|
||||||
rollString,
|
|
||||||
bonusDamage: bonusDamage.reduce((acc, x) => {
|
|
||||||
if (x.appliesOn === CONFIG.DH.EFFECTS.applyLocations.damageRoll.id) {
|
|
||||||
acc.push({
|
|
||||||
...x,
|
|
||||||
hopeUses: 0
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return acc;
|
|
||||||
}, []),
|
|
||||||
hope
|
|
||||||
};
|
|
||||||
this.resolve = resolve;
|
|
||||||
}
|
|
||||||
|
|
||||||
static DEFAULT_OPTIONS = {
|
|
||||||
tag: 'form',
|
|
||||||
classes: ['daggerheart', 'dialog', 'dh-style', 'views', 'damage-selection'],
|
|
||||||
position: {
|
|
||||||
width: 400,
|
|
||||||
height: 'auto'
|
|
||||||
},
|
|
||||||
actions: {
|
|
||||||
decreaseHopeUse: this.decreaseHopeUse,
|
|
||||||
increaseHopeUse: this.increaseHopeUse,
|
|
||||||
rollDamage: this.rollDamage
|
|
||||||
},
|
|
||||||
form: {
|
|
||||||
handler: this.updateSelection,
|
|
||||||
submitOnChange: true,
|
|
||||||
closeOnSubmit: false
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/** @override */
|
|
||||||
static PARTS = {
|
|
||||||
damageSelection: {
|
|
||||||
id: 'damageSelection',
|
|
||||||
template: 'systems/daggerheart/templates/dialogs/dice-roll/damageSelection.hbs'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
|
|
||||||
/** @inheritDoc */
|
|
||||||
get title() {
|
|
||||||
return `Damage Options`;
|
|
||||||
}
|
|
||||||
|
|
||||||
async _prepareContext(_options) {
|
|
||||||
return {
|
|
||||||
rollString: this.getRollString(),
|
|
||||||
bonusDamage: this.data.bonusDamage,
|
|
||||||
hope: this.data.hope + 1,
|
|
||||||
hopeUsed: this.getHopeUsed()
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
static updateSelection(event, _, formData) {
|
|
||||||
const { bonusDamage, ...rest } = foundry.utils.expandObject(formData.object);
|
|
||||||
|
|
||||||
for (var index in bonusDamage) {
|
|
||||||
this.data.bonusDamage[index].initiallySelected = bonusDamage[index].initiallySelected;
|
|
||||||
if (bonusDamage[index].hopeUses) {
|
|
||||||
const value = Number.parseInt(bonusDamage[index].hopeUses);
|
|
||||||
if (!Number.isNaN(value)) this.data.bonusDamage[index].hopeUses = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.data = foundry.utils.mergeObject(this.data, rest);
|
|
||||||
this.render(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
getRollString() {
|
|
||||||
return this.data.rollString.concat(
|
|
||||||
this.data.bonusDamage.reduce((acc, x) => {
|
|
||||||
if (x.initiallySelected) {
|
|
||||||
const nr = 1 + x.hopeUses;
|
|
||||||
const baseDamage = x.value;
|
|
||||||
return acc.concat(` + ${nr}${baseDamage}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
return acc;
|
|
||||||
}, '')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
getHopeUsed() {
|
|
||||||
return this.data.bonusDamage.reduce((acc, x) => acc + x.hopeUses, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static decreaseHopeUse(_, button) {
|
|
||||||
const index = Number.parseInt(button.dataset.index);
|
|
||||||
if (this.data.bonusDamage[index].hopeUses - 1 >= 0) {
|
|
||||||
this.data.bonusDamage[index].hopeUses -= 1;
|
|
||||||
this.render(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static increaseHopeUse(_, button) {
|
|
||||||
const index = Number.parseInt(button.dataset.index);
|
|
||||||
if (this.data.bonusDamage[index].hopeUses <= this.data.hope + 1) {
|
|
||||||
this.data.bonusDamage[index].hopeUses += 1;
|
|
||||||
this.render(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static rollDamage(event) {
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
this.resolve({
|
|
||||||
rollString: this.getRollString(),
|
|
||||||
bonusDamage: this.data.bonusDamage,
|
|
||||||
hopeUsed: this.getHopeUsed()
|
|
||||||
});
|
|
||||||
this.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -94,7 +94,10 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV
|
||||||
const actionItems = this.actor.items.reduce((acc, x) => {
|
const actionItems = this.actor.items.reduce((acc, x) => {
|
||||||
if (x.system.actions) {
|
if (x.system.actions) {
|
||||||
const recoverable = x.system.actions.reduce((acc, action) => {
|
const recoverable = x.system.actions.reduce((acc, action) => {
|
||||||
if (action.uses.recovery && (action.uses.recovery === 'shortRest') === this.shortrest) {
|
if (
|
||||||
|
(action.uses.recovery && (action.uses.recovery === 'longRest') === !this.shortrest) ||
|
||||||
|
action.uses.recovery === 'shortRest'
|
||||||
|
) {
|
||||||
acc.push({
|
acc.push({
|
||||||
title: x.name,
|
title: x.name,
|
||||||
name: action.name,
|
name: action.name,
|
||||||
|
|
@ -116,7 +119,8 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV
|
||||||
if (
|
if (
|
||||||
x.system.resource &&
|
x.system.resource &&
|
||||||
x.system.resource.type &&
|
x.system.resource.type &&
|
||||||
(x.system.resource.recovery === 'shortRest') === this.shortrest
|
((x.system.resource.recovery === 'longRest') === !this.shortrest ||
|
||||||
|
x.system.resource.recovery === 'shortRest')
|
||||||
) {
|
) {
|
||||||
acc.push({
|
acc.push({
|
||||||
title: game.i18n.localize(`TYPES.Item.${x.type}`),
|
title: game.i18n.localize(`TYPES.Item.${x.type}`),
|
||||||
|
|
@ -226,14 +230,18 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV
|
||||||
) {
|
) {
|
||||||
for (var data of this.refreshables.actionItems) {
|
for (var data of this.refreshables.actionItems) {
|
||||||
const action = await foundry.utils.fromUuid(data.uuid);
|
const action = await foundry.utils.fromUuid(data.uuid);
|
||||||
await action.parent.parent.update({ [`system.actions.${action.id}.uses.value`]: action.uses.max ?? 1 });
|
await action.parent.parent.update({ [`system.actions.${action.id}.uses.value`]: 0 });
|
||||||
}
|
}
|
||||||
|
|
||||||
for (var data of this.refreshables.resourceItems) {
|
for (var data of this.refreshables.resourceItems) {
|
||||||
const feature = await foundry.utils.fromUuid(data.uuid);
|
const feature = await foundry.utils.fromUuid(data.uuid);
|
||||||
const increasing =
|
const increasing =
|
||||||
feature.system.resource.progression === CONFIG.DH.ITEM.itemResourceProgression.increasing.id;
|
feature.system.resource.progression === CONFIG.DH.ITEM.itemResourceProgression.increasing.id;
|
||||||
const resetValue = increasing ? 0 : (feature.system.resource.max ?? 0);
|
const resetValue = increasing
|
||||||
|
? 0
|
||||||
|
: feature.system.resource.max
|
||||||
|
? Roll.replaceFormulaData(feature.system.resource.max, this.actor)
|
||||||
|
: 0;
|
||||||
await feature.update({ 'system.resource.value': resetValue });
|
await feature.update({ 'system.resource.value': resetValue });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -289,7 +289,7 @@ export default class DhCharacterLevelUp extends LevelUpBase {
|
||||||
const experience = Object.keys(this.actor.system.experiences).find(
|
const experience = Object.keys(this.actor.system.experiences).find(
|
||||||
x => x === data
|
x => x === data
|
||||||
);
|
);
|
||||||
return this.actor.system.experiences[experience]?.description ?? '';
|
return this.actor.system.experiences[experience]?.name ?? '';
|
||||||
});
|
});
|
||||||
advancement[choiceKey].push({ data: data, value: checkbox.value });
|
advancement[choiceKey].push({ data: data, value: checkbox.value });
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -47,10 +47,12 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2)
|
||||||
|
|
||||||
static PARTS = {
|
static PARTS = {
|
||||||
tabs: { template: 'systems/daggerheart/templates/levelup/tabs/tab-navigation.hbs' },
|
tabs: { template: 'systems/daggerheart/templates/levelup/tabs/tab-navigation.hbs' },
|
||||||
advancements: { template: 'systems/daggerheart/templates/levelup/tabs/advancements.hbs' },
|
advancements: {
|
||||||
|
template: 'systems/daggerheart/templates/levelup/tabs/advancements.hbs'
|
||||||
|
},
|
||||||
selections: {
|
selections: {
|
||||||
template: 'systems/daggerheart/templates/levelup/tabs/selections.hbs',
|
template: 'systems/daggerheart/templates/levelup/tabs/selections.hbs',
|
||||||
scrollable: ['.selections']
|
scrollable: ['.levelup-selections-container']
|
||||||
},
|
},
|
||||||
summary: { template: 'systems/daggerheart/templates/levelup/tabs/summary.hbs' },
|
summary: { template: 'systems/daggerheart/templates/levelup/tabs/summary.hbs' },
|
||||||
footer: { template: 'systems/daggerheart/templates/levelup/tabs/footer.hbs' }
|
footer: { template: 'systems/daggerheart/templates/levelup/tabs/footer.hbs' }
|
||||||
|
|
@ -536,29 +538,28 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2)
|
||||||
|
|
||||||
static async viewCompendium(event, target) {
|
static async viewCompendium(event, target) {
|
||||||
const type = target.dataset.compendium ?? target.dataset.type;
|
const type = target.dataset.compendium ?? target.dataset.type;
|
||||||
|
|
||||||
const presets = {
|
const presets = {
|
||||||
compendium: "daggerheart",
|
compendium: 'daggerheart',
|
||||||
folder: type,
|
folder: type,
|
||||||
render: {
|
render: {
|
||||||
noFolder: true
|
noFolder: true
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if(type == "domains") {
|
if (type == 'domains') {
|
||||||
const domains = this.actor.system.domains,
|
const domains = this.actor.system.domains,
|
||||||
multiclassDomain = this.levelup.classUpgradeChoices?.multiclass?.domain;
|
multiclassDomain = this.levelup.classUpgradeChoices?.multiclass?.domain;
|
||||||
if (multiclassDomain) {
|
if (multiclassDomain) {
|
||||||
if (!domains.includes(x => x === multiclassDomain))
|
if (!domains.includes(x => x === multiclassDomain)) domains.push(multiclassDomain);
|
||||||
domains.push(multiclassDomain);
|
|
||||||
}
|
}
|
||||||
presets.filter = {
|
presets.filter = {
|
||||||
'level.max': { key: 'level.max', value: this.levelup.currentLevel },
|
'level.max': { key: 'level.max', value: this.levelup.currentLevel },
|
||||||
'system.domain': { key: 'system.domain', value: domains },
|
'system.domain': { key: 'system.domain', value: domains }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.itemBrowser = await new ItemBrowser({ presets }).render({ force: true });
|
return (this.itemBrowser = await new ItemBrowser({ presets }).render({ force: true }));
|
||||||
}
|
}
|
||||||
|
|
||||||
static async selectPreview(_, button) {
|
static async selectPreview(_, button) {
|
||||||
|
|
@ -659,7 +660,7 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2)
|
||||||
}, {});
|
}, {});
|
||||||
|
|
||||||
await this.actor.levelUp(levelupData);
|
await this.actor.levelUp(levelupData);
|
||||||
if(this.itemBrowser) this.itemBrowser.close();
|
if (this.itemBrowser) this.itemBrowser.close();
|
||||||
this.close();
|
this.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
export { default as DhAppearanceSettings } from './appearanceSettings.mjs';
|
export { default as DhAppearanceSettings } from './appearanceSettings.mjs';
|
||||||
export { default as DhAutomationSettings } from './automationSettings.mjs';
|
export { default as DhAutomationSettings } from './automationSettings.mjs';
|
||||||
export { default as DhHomebrewSettings } from './homebrewSettings.mjs';
|
export { default as DhHomebrewSettings } from './homebrewSettings.mjs';
|
||||||
export { default as DhRangeMeasurementSettings } from './rangeMeasurementSettings.mjs';
|
|
||||||
export { default as DhVariantRuleSettings } from './variantRuleSettings.mjs';
|
export { default as DhVariantRuleSettings } from './variantRuleSettings.mjs';
|
||||||
|
|
|
||||||
|
|
@ -1,66 +0,0 @@
|
||||||
import { DhRangeMeasurement } from '../../data/settings/_module.mjs';
|
|
||||||
|
|
||||||
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
|
|
||||||
|
|
||||||
export default class DhRangeMeasurementSettings extends HandlebarsApplicationMixin(ApplicationV2) {
|
|
||||||
constructor() {
|
|
||||||
super({});
|
|
||||||
|
|
||||||
this.settings = new DhRangeMeasurement(
|
|
||||||
game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.RangeMeasurement).toObject()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
get title() {
|
|
||||||
return game.i18n.localize('DAGGERHEART.SETTINGS.Menu.title');
|
|
||||||
}
|
|
||||||
|
|
||||||
static DEFAULT_OPTIONS = {
|
|
||||||
tag: 'form',
|
|
||||||
id: 'daggerheart-automation-settings',
|
|
||||||
classes: ['daggerheart', 'dialog', 'dh-style', 'setting'],
|
|
||||||
position: { width: '600', height: 'auto' },
|
|
||||||
window: {
|
|
||||||
icon: 'fa-solid fa-gears'
|
|
||||||
},
|
|
||||||
actions: {
|
|
||||||
reset: this.reset,
|
|
||||||
save: this.save
|
|
||||||
},
|
|
||||||
form: { handler: this.updateData, submitOnChange: true }
|
|
||||||
};
|
|
||||||
|
|
||||||
static PARTS = {
|
|
||||||
main: {
|
|
||||||
template: 'systems/daggerheart/templates/settings/range-measurement-settings.hbs'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
async _prepareContext(_options) {
|
|
||||||
const context = await super._prepareContext(_options);
|
|
||||||
context.settingFields = this.settings;
|
|
||||||
|
|
||||||
return context;
|
|
||||||
}
|
|
||||||
|
|
||||||
static async updateData(event, element, formData) {
|
|
||||||
const updatedSettings = foundry.utils.expandObject(formData.object);
|
|
||||||
|
|
||||||
await this.settings.updateSource(updatedSettings);
|
|
||||||
this.render();
|
|
||||||
}
|
|
||||||
|
|
||||||
static async reset() {
|
|
||||||
this.settings = new DhRangeMeasurement();
|
|
||||||
this.render();
|
|
||||||
}
|
|
||||||
|
|
||||||
static async save() {
|
|
||||||
await game.settings.set(
|
|
||||||
CONFIG.DH.id,
|
|
||||||
CONFIG.DH.SETTINGS.gameSettings.RangeMeasurement,
|
|
||||||
this.settings.toObject()
|
|
||||||
);
|
|
||||||
this.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -27,7 +27,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
|
||||||
toggleResourceDice: CharacterSheet.#toggleResourceDice,
|
toggleResourceDice: CharacterSheet.#toggleResourceDice,
|
||||||
handleResourceDice: CharacterSheet.#handleResourceDice,
|
handleResourceDice: CharacterSheet.#handleResourceDice,
|
||||||
useDowntime: this.useDowntime,
|
useDowntime: this.useDowntime,
|
||||||
tempBrowser: CharacterSheet.#tempBrowser,
|
tempBrowser: CharacterSheet.#tempBrowser
|
||||||
},
|
},
|
||||||
window: {
|
window: {
|
||||||
resizable: true
|
resizable: true
|
||||||
|
|
@ -158,7 +158,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
|
||||||
currency: {
|
currency: {
|
||||||
title: game.i18n.localize('DAGGERHEART.CONFIG.Gold.title'),
|
title: game.i18n.localize('DAGGERHEART.CONFIG.Gold.title'),
|
||||||
coins: game.i18n.localize('DAGGERHEART.CONFIG.Gold.coins'),
|
coins: game.i18n.localize('DAGGERHEART.CONFIG.Gold.coins'),
|
||||||
handfulls: game.i18n.localize('DAGGERHEART.CONFIG.Gold.handfulls'),
|
handfuls: game.i18n.localize('DAGGERHEART.CONFIG.Gold.handfuls'),
|
||||||
bags: game.i18n.localize('DAGGERHEART.CONFIG.Gold.bags'),
|
bags: game.i18n.localize('DAGGERHEART.CONFIG.Gold.bags'),
|
||||||
chests: game.i18n.localize('DAGGERHEART.CONFIG.Gold.chests')
|
chests: game.i18n.localize('DAGGERHEART.CONFIG.Gold.chests')
|
||||||
}
|
}
|
||||||
|
|
@ -180,6 +180,13 @@ export default class CharacterSheet extends DHBaseActorSheet {
|
||||||
async _preparePartContext(partId, context, options) {
|
async _preparePartContext(partId, context, options) {
|
||||||
context = await super._preparePartContext(partId, context, options);
|
context = await super._preparePartContext(partId, context, options);
|
||||||
switch (partId) {
|
switch (partId) {
|
||||||
|
case 'header':
|
||||||
|
const { playerCanEditSheet, levelupAuto } = game.settings.get(
|
||||||
|
CONFIG.DH.id,
|
||||||
|
CONFIG.DH.SETTINGS.gameSettings.Automation
|
||||||
|
);
|
||||||
|
context.showSettings = game.user.isGM || !levelupAuto || (levelupAuto && playerCanEditSheet);
|
||||||
|
break;
|
||||||
case 'loadout':
|
case 'loadout':
|
||||||
await this._prepareLoadoutContext(context, options);
|
await this._prepareLoadoutContext(context, options);
|
||||||
break;
|
break;
|
||||||
|
|
@ -190,6 +197,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
|
||||||
await this._prepareBiographyContext(context, options);
|
await this._prepareBiographyContext(context, options);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -596,7 +604,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
|
||||||
const { key } = button.dataset;
|
const { key } = button.dataset;
|
||||||
|
|
||||||
const presets = {
|
const presets = {
|
||||||
compendium: "daggerheart",
|
compendium: 'daggerheart',
|
||||||
folder: key,
|
folder: key,
|
||||||
render: {
|
render: {
|
||||||
noFolder: true
|
noFolder: true
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,11 @@ export default class DhpEnvironment extends DHBaseActorSheet {
|
||||||
static DEFAULT_OPTIONS = {
|
static DEFAULT_OPTIONS = {
|
||||||
classes: ['environment'],
|
classes: ['environment'],
|
||||||
position: {
|
position: {
|
||||||
width: 500
|
width: 500,
|
||||||
|
height: 725
|
||||||
|
},
|
||||||
|
window: {
|
||||||
|
resizable: true
|
||||||
},
|
},
|
||||||
actions: {},
|
actions: {},
|
||||||
dragDrop: [{ dragSelector: '.action-section .inventory-item', dropSelector: null }]
|
dragDrop: [{ dragSelector: '.action-section .inventory-item', dropSelector: null }]
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@ export default function DHApplicationMixin(Base) {
|
||||||
toggleEffect: DHSheetV2.#toggleEffect,
|
toggleEffect: DHSheetV2.#toggleEffect,
|
||||||
toggleExtended: DHSheetV2.#toggleExtended,
|
toggleExtended: DHSheetV2.#toggleExtended,
|
||||||
addNewItem: DHSheetV2.#addNewItem,
|
addNewItem: DHSheetV2.#addNewItem,
|
||||||
browseItem: DHSheetV2.#browseItem,
|
browseItem: DHSheetV2.#browseItem
|
||||||
},
|
},
|
||||||
contextMenus: [
|
contextMenus: [
|
||||||
{
|
{
|
||||||
|
|
@ -327,17 +327,31 @@ export default function DHApplicationMixin(Base) {
|
||||||
|
|
||||||
if (usable)
|
if (usable)
|
||||||
options.unshift({
|
options.unshift({
|
||||||
name: 'DAGGERHEART.APPLICATIONS.ContextMenu.useItem',
|
name: 'DAGGERHEART.GENERAL.damage',
|
||||||
icon: 'fa-solid fa-burst',
|
icon: 'fa-solid fa-explosion',
|
||||||
condition: target => {
|
condition: target => {
|
||||||
const doc = getDocFromElementSync(target);
|
const doc = getDocFromElementSync(target);
|
||||||
return doc && !(doc.type === 'domainCard' && doc.system.inVault);
|
return doc?.system?.attack?.damage.parts.length || doc?.damage?.parts.length;
|
||||||
},
|
},
|
||||||
callback: async (target, event) => (await getDocFromElement(target)).use(event)
|
callback: async (target, event) => {
|
||||||
|
const doc = await getDocFromElement(target),
|
||||||
|
action = doc?.system?.attack ?? doc;
|
||||||
|
return action && action.use(event, { byPassRoll: true });
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
options.unshift({
|
||||||
|
name: 'DAGGERHEART.APPLICATIONS.ContextMenu.useItem',
|
||||||
|
icon: 'fa-solid fa-burst',
|
||||||
|
condition: target => {
|
||||||
|
const doc = getDocFromElementSync(target);
|
||||||
|
return doc && !(doc.type === 'domainCard' && doc.system.inVault);
|
||||||
|
},
|
||||||
|
callback: async (target, event) => (await getDocFromElement(target)).use(event)
|
||||||
|
});
|
||||||
|
|
||||||
if (toChat)
|
if (toChat)
|
||||||
options.unshift({
|
options.push({
|
||||||
name: 'DAGGERHEART.APPLICATIONS.ContextMenu.sendToChat',
|
name: 'DAGGERHEART.APPLICATIONS.ContextMenu.sendToChat',
|
||||||
icon: 'fa-solid fa-message',
|
icon: 'fa-solid fa-message',
|
||||||
callback: async target => (await getDocFromElement(target)).toChat(this.document.id)
|
callback: async target => (await getDocFromElement(target)).toChat(this.document.id)
|
||||||
|
|
@ -419,25 +433,22 @@ export default function DHApplicationMixin(Base) {
|
||||||
classes: ['dh-style', 'two-big-buttons'],
|
classes: ['dh-style', 'two-big-buttons'],
|
||||||
buttons: [
|
buttons: [
|
||||||
{
|
{
|
||||||
action: "create",
|
action: 'create',
|
||||||
label: "Create Item",
|
label: 'Create Item',
|
||||||
icon: "fa-solid fa-plus"
|
icon: 'fa-solid fa-plus'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
action: "browse",
|
action: 'browse',
|
||||||
label: "Browse Compendium",
|
label: 'Browse Compendium',
|
||||||
icon: "fa-solid fa-book"
|
icon: 'fa-solid fa-book'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
if(!createChoice) return;
|
if (!createChoice) return;
|
||||||
|
|
||||||
if(createChoice === "browse")
|
|
||||||
return DHSheetV2.#browseItem.call(this, event, target);
|
|
||||||
else
|
|
||||||
return DHSheetV2.#createDoc.call(this, event, target);
|
|
||||||
|
|
||||||
|
if (createChoice === 'browse') return DHSheetV2.#browseItem.call(this, event, target);
|
||||||
|
else return DHSheetV2.#createDoc.call(this, event, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
static async #browseItem(event, target) {
|
static async #browseItem(event, target) {
|
||||||
|
|
@ -450,8 +461,8 @@ export default function DHApplicationMixin(Base) {
|
||||||
case 'consumable':
|
case 'consumable':
|
||||||
case 'armor':
|
case 'armor':
|
||||||
case 'weapon':
|
case 'weapon':
|
||||||
presets.compendium = "daggerheart";
|
presets.compendium = 'daggerheart';
|
||||||
presets.folder = "equipments";
|
presets.folder = 'equipments';
|
||||||
presets.render = {
|
presets.render = {
|
||||||
noFolder: true
|
noFolder: true
|
||||||
};
|
};
|
||||||
|
|
@ -460,14 +471,14 @@ export default function DHApplicationMixin(Base) {
|
||||||
};
|
};
|
||||||
break;
|
break;
|
||||||
case 'domainCard':
|
case 'domainCard':
|
||||||
presets.compendium = "daggerheart";
|
presets.compendium = 'daggerheart';
|
||||||
presets.folder = "domains";
|
presets.folder = 'domains';
|
||||||
presets.render = {
|
presets.render = {
|
||||||
noFolder: true
|
noFolder: true
|
||||||
};
|
};
|
||||||
presets.filter = {
|
presets.filter = {
|
||||||
'level.max': { key: 'level.max', value: this.document.system.levelData.level.current },
|
'level.max': { key: 'level.max', value: this.document.system.levelData.level.current },
|
||||||
'system.domain': { key: 'system.domain', value: this.document.system.domains },
|
'system.domain': { key: 'system.domain', value: this.document.system.domains }
|
||||||
};
|
};
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,8 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) {
|
||||||
},
|
},
|
||||||
actions: {
|
actions: {
|
||||||
openSettings: DHBaseActorSheet.#openSettings,
|
openSettings: DHBaseActorSheet.#openSettings,
|
||||||
sendExpToChat: DHBaseActorSheet.#sendExpToChat
|
sendExpToChat: DHBaseActorSheet.#sendExpToChat,
|
||||||
|
increaseActionUses: event => DHBaseActorSheet.#modifyActionUses(event, true)
|
||||||
},
|
},
|
||||||
contextMenus: [
|
contextMenus: [
|
||||||
{
|
{
|
||||||
|
|
@ -70,6 +71,15 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) {
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**@inheritdoc */
|
||||||
|
_attachPartListeners(partId, htmlElement, options) {
|
||||||
|
super._attachPartListeners(partId, htmlElement, options);
|
||||||
|
|
||||||
|
htmlElement.querySelectorAll('.item-button .action-uses-button').forEach(element => {
|
||||||
|
element.addEventListener('contextmenu', DHBaseActorSheet.#modifyActionUses);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prepare render context for the Effect part.
|
* Prepare render context for the Effect part.
|
||||||
* @param {ApplicationRenderContext} context
|
* @param {ApplicationRenderContext} context
|
||||||
|
|
@ -154,6 +164,19 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) {
|
||||||
cls.create(msg);
|
cls.create(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static async #modifyActionUses(event, increase) {
|
||||||
|
event.stopPropagation();
|
||||||
|
event.preventDefault();
|
||||||
|
const actionId = event.target.dataset.itemUuid;
|
||||||
|
const action = await foundry.utils.fromUuid(actionId);
|
||||||
|
|
||||||
|
const newValue = (action.uses.value ?? 0) + (increase ? 1 : -1);
|
||||||
|
await action.update({ 'uses.value': Math.min(Math.max(newValue, 0), action.uses.max ?? 0) });
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/* Application Drag/Drop */
|
/* Application Drag/Drop */
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ import DHBaseItemSheet from '../api/base-item.mjs';
|
||||||
export default class FeatureSheet extends DHBaseItemSheet {
|
export default class FeatureSheet extends DHBaseItemSheet {
|
||||||
/** @inheritDoc */
|
/** @inheritDoc */
|
||||||
static DEFAULT_OPTIONS = {
|
static DEFAULT_OPTIONS = {
|
||||||
id: 'daggerheart-feature',
|
|
||||||
classes: ['feature'],
|
classes: ['feature'],
|
||||||
actions: {}
|
actions: {}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ export default class SubclassSheet extends DHBaseItemSheet {
|
||||||
static DEFAULT_OPTIONS = {
|
static DEFAULT_OPTIONS = {
|
||||||
classes: ['subclass'],
|
classes: ['subclass'],
|
||||||
position: { width: 600 },
|
position: { width: 600 },
|
||||||
window: { resizable: false }
|
window: { resizable: true }
|
||||||
};
|
};
|
||||||
|
|
||||||
/**@override */
|
/**@override */
|
||||||
|
|
|
||||||
|
|
@ -194,8 +194,12 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
const item = await foundry.utils.fromUuid(message.system.origin);
|
const item = await foundry.utils.fromUuid(message.system.origin);
|
||||||
const action = item.system.actions.get(event.currentTarget.id);
|
const action =
|
||||||
await item.use(action);
|
item.system.attack?.id === event.currentTarget.id
|
||||||
|
? item.system.attack
|
||||||
|
: item.system.actions.get(event.currentTarget.id);
|
||||||
|
if (event.currentTarget.dataset.directDamage) action.use(event, { byPassRoll: true });
|
||||||
|
else action.use(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
async actionUseButton(event, message) {
|
async actionUseButton(event, message) {
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,10 @@ export default class DhCombatTracker extends foundry.applications.sidebar.tabs.C
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.viewed.update({ turn: this.viewed.turn === toggleTurn ? null : toggleTurn });
|
await this.viewed.update({
|
||||||
|
turn: this.viewed.turn === toggleTurn ? null : toggleTurn,
|
||||||
|
round: this.viewed.round + 1
|
||||||
|
});
|
||||||
await combatant.update(update);
|
await combatant.update(update);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,8 @@ export default class DhMeasuredTemplate extends foundry.canvas.placeables.Measur
|
||||||
|
|
||||||
const rangeMeasurementSettings = game.settings.get(
|
const rangeMeasurementSettings = game.settings.get(
|
||||||
CONFIG.DH.id,
|
CONFIG.DH.id,
|
||||||
CONFIG.DH.SETTINGS.gameSettings.RangeMeasurement
|
CONFIG.DH.SETTINGS.gameSettings.variantRules
|
||||||
);
|
).rangeMeasurement;
|
||||||
if (rangeMeasurementSettings.enabled) {
|
if (rangeMeasurementSettings.enabled) {
|
||||||
const splitRulerText = this.ruler.text.split(' ');
|
const splitRulerText = this.ruler.text.split(' ');
|
||||||
if (splitRulerText.length > 0) {
|
if (splitRulerText.length > 0) {
|
||||||
|
|
@ -29,7 +29,7 @@ export default class DhMeasuredTemplate extends foundry.canvas.placeables.Measur
|
||||||
if (distance <= settings.far) {
|
if (distance <= settings.far) {
|
||||||
return game.i18n.localize('DAGGERHEART.CONFIG.Range.far.name');
|
return game.i18n.localize('DAGGERHEART.CONFIG.Range.far.name');
|
||||||
}
|
}
|
||||||
if (distance <= settings.veryFar) {
|
if (distance > settings.far) {
|
||||||
return game.i18n.localize('DAGGERHEART.CONFIG.Range.veryFar.name');
|
return game.i18n.localize('DAGGERHEART.CONFIG.Range.veryFar.name');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ export default class DhpRuler extends foundry.canvas.interaction.Ruler {
|
||||||
const context = super._getWaypointLabelContext(waypoint, state);
|
const context = super._getWaypointLabelContext(waypoint, state);
|
||||||
if (!context) return;
|
if (!context) return;
|
||||||
|
|
||||||
const range = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.RangeMeasurement);
|
const range = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules).rangeMeasurement;
|
||||||
|
|
||||||
if (range.enabled) {
|
if (range.enabled) {
|
||||||
const distance = DhMeasuredTemplate.getDistanceLabel(waypoint.measurement.distance.toNearest(0.01), range);
|
const distance = DhMeasuredTemplate.getDistanceLabel(waypoint.measurement.distance.toNearest(0.01), range);
|
||||||
|
|
|
||||||
|
|
@ -53,4 +53,40 @@ export default class DhTokenPlaceable extends foundry.canvas.placeables.Token {
|
||||||
this.effects.renderable = true;
|
this.effects.renderable = true;
|
||||||
this.renderFlags.set({ refreshEffects: true });
|
this.renderFlags.set({ refreshEffects: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @inheritDoc */
|
||||||
|
_drawBar(number, bar, data) {
|
||||||
|
const val = Number(data.value);
|
||||||
|
const pct = Math.clamp(val, 0, data.max) / data.max;
|
||||||
|
|
||||||
|
// Determine sizing
|
||||||
|
const { width, height } = this.document.getSize();
|
||||||
|
const s = canvas.dimensions.uiScale;
|
||||||
|
const bw = width;
|
||||||
|
const bh = 8 * (this.document.height >= 2 ? 1.5 : 1) * s;
|
||||||
|
|
||||||
|
// Determine the color to use
|
||||||
|
const fillColor =
|
||||||
|
number === 0 ? foundry.utils.Color.fromRGB([1, 0, 0]) : foundry.utils.Color.fromString('#0032b1');
|
||||||
|
|
||||||
|
// Draw the bar
|
||||||
|
const widthUnit = bw / data.max;
|
||||||
|
bar.clear().lineStyle(s, 0x000000, 1.0);
|
||||||
|
const sections = [...Array(data.max).keys()];
|
||||||
|
for (let mark of sections) {
|
||||||
|
const x = mark * widthUnit;
|
||||||
|
const marked = mark + 1 <= data.value;
|
||||||
|
const color = marked ? fillColor : foundry.utils.Color.fromRGB([0, 0, 0]);
|
||||||
|
if (mark === 0 || mark === sections.length - 1) {
|
||||||
|
bar.beginFill(color, marked ? 1.0 : 0.5).drawRect(x, 0, widthUnit, bh, 2 * s); // Would like drawRoundedRect, but it's very troublsome with the corners. Leaving for now.
|
||||||
|
} else {
|
||||||
|
bar.beginFill(color, marked ? 1.0 : 0.5).drawRect(x, 0, widthUnit, bh, 2 * s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set position
|
||||||
|
const posY = number === 0 ? height - bh : 0;
|
||||||
|
bar.position.set(0, posY);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ export default class DhpTokenRuler extends foundry.canvas.placeables.tokens.Toke
|
||||||
const context = super._getWaypointLabelContext(waypoint, state);
|
const context = super._getWaypointLabelContext(waypoint, state);
|
||||||
if (!context) return;
|
if (!context) return;
|
||||||
|
|
||||||
const range = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.RangeMeasurement);
|
const range = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules).rangeMeasurement;
|
||||||
|
|
||||||
if (range.enabled) {
|
if (range.enabled) {
|
||||||
const distance = DhMeasuredTemplate.getDistanceLabel(waypoint.measurement.distance.toNearest(0.01), range);
|
const distance = DhMeasuredTemplate.getDistanceLabel(waypoint.measurement.distance.toNearest(0.01), range);
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ export const ruleChoice = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const range = {
|
export const templateRanges = {
|
||||||
self: {
|
self: {
|
||||||
id: 'self',
|
id: 'self',
|
||||||
short: 's',
|
short: 's',
|
||||||
|
|
@ -56,7 +56,11 @@ export const range = {
|
||||||
label: 'DAGGERHEART.CONFIG.Range.far.name',
|
label: 'DAGGERHEART.CONFIG.Range.far.name',
|
||||||
description: 'DAGGERHEART.CONFIG.Range.far.description',
|
description: 'DAGGERHEART.CONFIG.Range.far.description',
|
||||||
distance: 20
|
distance: 20
|
||||||
},
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const range = {
|
||||||
|
...templateRanges,
|
||||||
veryFar: {
|
veryFar: {
|
||||||
id: 'veryFar',
|
id: 'veryFar',
|
||||||
short: 'vf',
|
short: 'vf',
|
||||||
|
|
@ -479,7 +483,8 @@ export const multiplierTypes = {
|
||||||
cast: 'Spellcast',
|
cast: 'Spellcast',
|
||||||
scale: 'Cost Scaling',
|
scale: 'Cost Scaling',
|
||||||
result: 'Roll Result',
|
result: 'Roll Result',
|
||||||
flat: 'Flat'
|
flat: 'Flat',
|
||||||
|
tier: 'Tier'
|
||||||
};
|
};
|
||||||
|
|
||||||
export const diceSetNumbers = {
|
export const diceSetNumbers = {
|
||||||
|
|
|
||||||
|
|
@ -857,7 +857,7 @@ export const weaponFeatures = {
|
||||||
name: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.name',
|
name: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.name',
|
||||||
description: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.description',
|
description: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.description',
|
||||||
img: 'icons/commodities/currency/coins-crown-stack-gold.webp',
|
img: 'icons/commodities/currency/coins-crown-stack-gold.webp',
|
||||||
// Should cost handfull of gold,
|
// Should cost handful of gold,
|
||||||
effects: [
|
effects: [
|
||||||
{
|
{
|
||||||
name: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.actions.greed.name',
|
name: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.actions.greed.name',
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,6 @@ export const menu = {
|
||||||
export const gameSettings = {
|
export const gameSettings = {
|
||||||
Automation: 'Automation',
|
Automation: 'Automation',
|
||||||
Homebrew: 'Homebrew',
|
Homebrew: 'Homebrew',
|
||||||
RangeMeasurement: 'RangeMeasurement',
|
|
||||||
appearance: 'Appearance',
|
appearance: 'Appearance',
|
||||||
variantRules: 'VariantRules',
|
variantRules: 'VariantRules',
|
||||||
Resources: {
|
Resources: {
|
||||||
|
|
|
||||||
|
|
@ -34,8 +34,8 @@ export default class DHAttackAction extends DHDamageAction {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
async use(event, ...args) {
|
async use(event, options) {
|
||||||
const result = await super.use(event, args);
|
const result = await super.use(event, options);
|
||||||
|
|
||||||
const { updateCountdowns } = game.system.api.applications.ui.DhCountdowns;
|
const { updateCountdowns } = game.system.api.applications.ui.DhCountdowns;
|
||||||
await updateCountdowns(CONFIG.DH.GENERAL.countdownTypes.characterAttack.id);
|
await updateCountdowns(CONFIG.DH.GENERAL.countdownTypes.characterAttack.id);
|
||||||
|
|
|
||||||
|
|
@ -111,12 +111,13 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
|
||||||
return actorData;
|
return actorData;
|
||||||
}
|
}
|
||||||
|
|
||||||
async use(event, ...args) {
|
async use(event, options = {}) {
|
||||||
if (!this.actor) throw new Error("An Action can't be used outside of an Actor context.");
|
if (!this.actor) throw new Error("An Action can't be used outside of an Actor context.");
|
||||||
|
|
||||||
if (this.chatDisplay) await this.toChat();
|
if (this.chatDisplay) await this.toChat();
|
||||||
|
|
||||||
let config = this.prepareConfig(event);
|
let { byPassRoll } = options,
|
||||||
|
config = this.prepareConfig(event, byPassRoll);
|
||||||
for (let i = 0; i < this.constructor.extraSchemas.length; i++) {
|
for (let i = 0; i < this.constructor.extraSchemas.length; i++) {
|
||||||
let clsField = this.constructor.getActionField(this.constructor.extraSchemas[i]);
|
let clsField = this.constructor.getActionField(this.constructor.extraSchemas[i]);
|
||||||
if (clsField?.prepareConfig) {
|
if (clsField?.prepareConfig) {
|
||||||
|
|
@ -133,14 +134,14 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
|
||||||
if (!config) return;
|
if (!config) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.hasRoll) {
|
if (config.hasRoll) {
|
||||||
const rollConfig = this.prepareRoll(config);
|
const rollConfig = this.prepareRoll(config);
|
||||||
config.roll = rollConfig;
|
config.roll = rollConfig;
|
||||||
config = await this.actor.diceRoll(config);
|
config = await this.actor.diceRoll(config);
|
||||||
if (!config) return;
|
if (!config) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.doFollowUp()) {
|
if (this.doFollowUp(config)) {
|
||||||
if (this.rollDamage && this.damage.parts.length) await this.rollDamage(event, config);
|
if (this.rollDamage && this.damage.parts.length) await this.rollDamage(event, config);
|
||||||
else if (this.trigger) await this.trigger(event, config);
|
else if (this.trigger) await this.trigger(event, config);
|
||||||
else if (this.hasSave || this.hasEffect) {
|
else if (this.hasSave || this.hasEffect) {
|
||||||
|
|
@ -160,7 +161,8 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
prepareConfig(event) {
|
prepareConfig(event, byPass = false) {
|
||||||
|
const hasRoll = this.getUseHasRoll(byPass);
|
||||||
return {
|
return {
|
||||||
event,
|
event,
|
||||||
title: `${this.item.name}: ${this.name}`,
|
title: `${this.item.name}: ${this.name}`,
|
||||||
|
|
@ -170,10 +172,10 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
|
||||||
actor: this.actor.uuid
|
actor: this.actor.uuid
|
||||||
},
|
},
|
||||||
dialog: {
|
dialog: {
|
||||||
configure: this.hasRoll
|
configure: hasRoll
|
||||||
},
|
},
|
||||||
type: this.type,
|
type: this.type,
|
||||||
hasRoll: this.hasRoll,
|
hasRoll: hasRoll,
|
||||||
hasDamage: this.damage?.parts?.length && this.type !== 'healing',
|
hasDamage: this.damage?.parts?.length && this.type !== 'healing',
|
||||||
hasHealing: this.damage?.parts?.length && this.type === 'healing',
|
hasHealing: this.damage?.parts?.length && this.type === 'healing',
|
||||||
hasEffect: !!this.effects?.length,
|
hasEffect: !!this.effects?.length,
|
||||||
|
|
@ -182,12 +184,12 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
|
||||||
selectedRollMode: game.settings.get('core', 'rollMode'),
|
selectedRollMode: game.settings.get('core', 'rollMode'),
|
||||||
isFastForward: event.shiftKey,
|
isFastForward: event.shiftKey,
|
||||||
data: this.getRollData(),
|
data: this.getRollData(),
|
||||||
evaluate: this.hasRoll
|
evaluate: hasRoll
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
requireConfigurationDialog(config) {
|
requireConfigurationDialog(config) {
|
||||||
return !config.event.shiftKey && !this.hasRoll && (config.costs?.length || config.uses);
|
return !config.event.shiftKey && !config.hasRoll && (config.costs?.length || config.uses);
|
||||||
}
|
}
|
||||||
|
|
||||||
prepareRoll() {
|
prepareRoll() {
|
||||||
|
|
@ -205,7 +207,7 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
|
||||||
}
|
}
|
||||||
|
|
||||||
doFollowUp(config) {
|
doFollowUp(config) {
|
||||||
return !this.hasRoll;
|
return !config.hasRoll;
|
||||||
}
|
}
|
||||||
|
|
||||||
async consume(config, successCost = false) {
|
async consume(config, successCost = false) {
|
||||||
|
|
@ -220,16 +222,13 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const resources = config.costs
|
const resources = config.costs
|
||||||
.filter(c =>
|
.filter(
|
||||||
c.enabled !== false
|
c =>
|
||||||
&&
|
c.enabled !== false &&
|
||||||
(
|
((!successCost && (!c.consumeOnSuccess || config.roll?.success)) ||
|
||||||
(!successCost && (!c.consumeOnSuccess || config.roll?.success))
|
(successCost && c.consumeOnSuccess))
|
||||||
||
|
|
||||||
(successCost && c.consumeOnSuccess)
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
.map(c => {
|
.map(c => {
|
||||||
const resource = usefulResources[c.key];
|
const resource = usefulResources[c.key];
|
||||||
|
|
@ -242,21 +241,23 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
|
||||||
});
|
});
|
||||||
|
|
||||||
await this.actor.modifyResource(resources);
|
await this.actor.modifyResource(resources);
|
||||||
if (config.uses?.enabled
|
if (
|
||||||
&&
|
config.uses?.enabled &&
|
||||||
(
|
((!successCost && (!config.uses?.consumeOnSuccess || config.roll?.success)) ||
|
||||||
(!successCost && (!config.uses?.consumeOnSuccess || config.roll?.success))
|
(successCost && config.uses?.consumeOnSuccess))
|
||||||
||
|
)
|
||||||
(successCost && config.uses?.consumeOnSuccess)
|
this.update({ 'uses.value': this.uses.value + 1 });
|
||||||
)
|
|
||||||
) this.update({ 'uses.value': this.uses.value + 1 });
|
|
||||||
|
|
||||||
if(config.roll?.success || successCost)
|
if (config.roll?.success || successCost)
|
||||||
(config.message ?? config.parent).update({'system.successConsumed': true})
|
(config.message ?? config.parent).update({ 'system.successConsumed': true });
|
||||||
}
|
}
|
||||||
/* */
|
/* */
|
||||||
|
|
||||||
/* ROLL */
|
/* ROLL */
|
||||||
|
getUseHasRoll(byPass = false) {
|
||||||
|
return this.hasRoll && !byPass;
|
||||||
|
}
|
||||||
|
|
||||||
get hasRoll() {
|
get hasRoll() {
|
||||||
return !!this.roll?.type;
|
return !!this.roll?.type;
|
||||||
}
|
}
|
||||||
|
|
@ -301,11 +302,9 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
|
||||||
}
|
}
|
||||||
|
|
||||||
async applyEffect(effect, actor) {
|
async applyEffect(effect, actor) {
|
||||||
const origin = effect.parent?.parent ? effect.parent.parent.uuid : effect.parent.uuid;
|
const existingEffect = actor.effects.find(e => e.origin === effect.uuid);
|
||||||
// Enable an existing effect on the target if it originated from this effect
|
|
||||||
const existingEffect = actor.effects.find(e => e.origin === origin);
|
|
||||||
if (existingEffect) {
|
if (existingEffect) {
|
||||||
return existingEffect.update(
|
return effect.update(
|
||||||
foundry.utils.mergeObject({
|
foundry.utils.mergeObject({
|
||||||
...effect.constructor.getInitialDuration(),
|
...effect.constructor.getInitialDuration(),
|
||||||
disabled: false
|
disabled: false
|
||||||
|
|
@ -318,7 +317,7 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
|
||||||
...effect.toObject(),
|
...effect.toObject(),
|
||||||
disabled: false,
|
disabled: false,
|
||||||
transfer: false,
|
transfer: false,
|
||||||
origin: origin
|
origin: effect.uuid
|
||||||
});
|
});
|
||||||
await ActiveEffect.implementation.create(effectData, { parent: actor });
|
await ActiveEffect.implementation.create(effectData, { parent: actor });
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import DHBaseAction from './baseAction.mjs';
|
||||||
export default class DhBeastformAction extends DHBaseAction {
|
export default class DhBeastformAction extends DHBaseAction {
|
||||||
static extraSchemas = [...super.extraSchemas, 'beastform'];
|
static extraSchemas = [...super.extraSchemas, 'beastform'];
|
||||||
|
|
||||||
async use(event, ...args) {
|
async use(event, options) {
|
||||||
const beastformConfig = this.prepareBeastformConfig();
|
const beastformConfig = this.prepareBeastformConfig();
|
||||||
|
|
||||||
const abort = await this.handleActiveTransformations();
|
const abort = await this.handleActiveTransformations();
|
||||||
|
|
@ -20,7 +20,7 @@ export default class DhBeastformAction extends DHBaseAction {
|
||||||
const { selected, evolved, hybrid } = await BeastformDialog.configure(beastformConfig, this.item);
|
const { selected, evolved, hybrid } = await BeastformDialog.configure(beastformConfig, this.item);
|
||||||
if (!selected) return;
|
if (!selected) return;
|
||||||
|
|
||||||
const result = await super.use(event, args);
|
const result = await super.use(event, options);
|
||||||
if (!result) return;
|
if (!result) return;
|
||||||
|
|
||||||
await this.transform(selected, evolved, hybrid);
|
await this.transform(selected, evolved, hybrid);
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ export default class DHDamageAction extends DHBaseAction {
|
||||||
|
|
||||||
getFormulaValue(part, data) {
|
getFormulaValue(part, data) {
|
||||||
let formulaValue = part.value;
|
let formulaValue = part.value;
|
||||||
if (this.hasRoll && part.resultBased && data.system.roll.result.duality === -1) return part.valueAlt;
|
if (data.hasRoll && part.resultBased && data.system.roll.result.duality === -1) return part.valueAlt;
|
||||||
|
|
||||||
const isAdversary = this.actor.type === 'adversary';
|
const isAdversary = this.actor.type === 'adversary';
|
||||||
if (isAdversary && this.actor.system.type === CONFIG.DH.ACTOR.adversaryTypes.horde.id) {
|
if (isAdversary && this.actor.system.type === CONFIG.DH.ACTOR.adversaryTypes.horde.id) {
|
||||||
|
|
@ -51,7 +51,7 @@ export default class DHDamageAction extends DHBaseAction {
|
||||||
dialog: {},
|
dialog: {},
|
||||||
data: this.getRollData(),
|
data: this.getRollData(),
|
||||||
targetSelection: systemData.targets.length > 0
|
targetSelection: systemData.targets.length > 0
|
||||||
}
|
};
|
||||||
if (this.hasSave) config.onSave = this.save.damageMod;
|
if (this.hasSave) config.onSave = this.save.damageMod;
|
||||||
if (data.system) {
|
if (data.system) {
|
||||||
config.source.message = data._id;
|
config.source.message = data._id;
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,6 @@ export default class DHMacroAction extends DHBaseAction {
|
||||||
}
|
}
|
||||||
|
|
||||||
async trigger(event, ...args) {
|
async trigger(event, ...args) {
|
||||||
// const config = await super.use(event, args);
|
|
||||||
// if (['error', 'warning'].includes(config.type)) return;
|
|
||||||
const fixUUID = !this.documentUUID.includes('Macro.') ? `Macro.${this.documentUUID}` : this.documentUUID,
|
const fixUUID = !this.documentUUID.includes('Macro.') ? `Macro.${this.documentUUID}` : this.documentUUID,
|
||||||
macro = await fromUuid(fixUUID);
|
macro = await fromUuid(fixUUID);
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ export default class DHSummonAction extends DHBaseAction {
|
||||||
|
|
||||||
async trigger(event, ...args) {
|
async trigger(event, ...args) {
|
||||||
if (!this.canSummon || !canvas.scene) return;
|
if (!this.canSummon || !canvas.scene) return;
|
||||||
// const config = await super.use(event, args);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get canSummon() {
|
get canSummon() {
|
||||||
|
|
|
||||||
|
|
@ -68,12 +68,13 @@ export default class DhCharacter extends BaseDataActor {
|
||||||
new fields.SchemaField({
|
new fields.SchemaField({
|
||||||
name: new fields.StringField(),
|
name: new fields.StringField(),
|
||||||
value: new fields.NumberField({ integer: true, initial: 0 }),
|
value: new fields.NumberField({ integer: true, initial: 0 }),
|
||||||
description: new fields.StringField()
|
description: new fields.StringField(),
|
||||||
|
core: new fields.BooleanField({ initial: false })
|
||||||
})
|
})
|
||||||
),
|
),
|
||||||
gold: new fields.SchemaField({
|
gold: new fields.SchemaField({
|
||||||
coins: new fields.NumberField({ initial: 0, integer: true }),
|
coins: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
handfulls: new fields.NumberField({ initial: 0, integer: true }),
|
handfuls: new fields.NumberField({ initial: 1, integer: true }),
|
||||||
bags: new fields.NumberField({ initial: 0, integer: true }),
|
bags: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
chests: new fields.NumberField({ initial: 0, integer: true })
|
chests: new fields.NumberField({ initial: 0, integer: true })
|
||||||
}),
|
}),
|
||||||
|
|
@ -573,7 +574,10 @@ export default class DhCharacter extends BaseDataActor {
|
||||||
case 'experience':
|
case 'experience':
|
||||||
selection.data.forEach(id => {
|
selection.data.forEach(id => {
|
||||||
const experience = this.experiences[id];
|
const experience = this.experiences[id];
|
||||||
if (experience) experience.value += selection.value;
|
if (experience) {
|
||||||
|
experience.value += selection.value;
|
||||||
|
experience.leveledUp = true;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -620,6 +624,23 @@ export default class DhCharacter extends BaseDataActor {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async _preUpdate(changes, options, userId) {
|
||||||
|
const allowed = await super._preUpdate(changes, options, userId);
|
||||||
|
if (allowed === false) return;
|
||||||
|
|
||||||
|
/* The first two experiences are always marked as core */
|
||||||
|
if (changes.system?.experiences && Object.keys(this.experiences).length < 2) {
|
||||||
|
const experiences = new Set(Object.keys(this.experiences));
|
||||||
|
const changeExperiences = new Set(Object.keys(changes.system.experiences));
|
||||||
|
const newExperiences = Array.from(changeExperiences.difference(experiences));
|
||||||
|
|
||||||
|
for (var i = 0; i < Math.min(newExperiences.length, 2 - experiences.size); i++) {
|
||||||
|
const experience = newExperiences[i];
|
||||||
|
changes.system.experiences[experience].core = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async _preDelete() {
|
async _preDelete() {
|
||||||
if (this.companion) {
|
if (this.companion) {
|
||||||
this.companion.updateLevel(1);
|
this.companion.updateLevel(1);
|
||||||
|
|
|
||||||
|
|
@ -1,20 +1,21 @@
|
||||||
const fields = foundry.data.fields;
|
const fields = foundry.data.fields;
|
||||||
|
|
||||||
const targetsField = () => new fields.ArrayField(
|
const targetsField = () =>
|
||||||
new fields.SchemaField({
|
new fields.ArrayField(
|
||||||
id: new fields.StringField({}),
|
new fields.SchemaField({
|
||||||
actorId: new fields.StringField({}),
|
id: new fields.StringField({}),
|
||||||
name: new fields.StringField({}),
|
actorId: new fields.StringField({}),
|
||||||
img: new fields.StringField({}),
|
name: new fields.StringField({}),
|
||||||
difficulty: new fields.NumberField({ integer: true, nullable: true }),
|
img: new fields.StringField({}),
|
||||||
evasion: new fields.NumberField({ integer: true }),
|
difficulty: new fields.NumberField({ integer: true, nullable: true }),
|
||||||
hit: new fields.BooleanField({ initial: false }),
|
evasion: new fields.NumberField({ integer: true }),
|
||||||
saved: new fields.SchemaField({
|
hit: new fields.BooleanField({ initial: false }),
|
||||||
result: new fields.NumberField(),
|
saved: new fields.SchemaField({
|
||||||
success: new fields.BooleanField({ nullable: true, initial: null })
|
result: new fields.NumberField(),
|
||||||
|
success: new fields.BooleanField({ nullable: true, initial: null })
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
);
|
||||||
)
|
|
||||||
|
|
||||||
export default class DHActorRoll extends foundry.abstract.TypeDataModel {
|
export default class DHActorRoll extends foundry.abstract.TypeDataModel {
|
||||||
targetHook = null;
|
targetHook = null;
|
||||||
|
|
@ -40,27 +41,25 @@ export default class DHActorRoll extends foundry.abstract.TypeDataModel {
|
||||||
action: new fields.StringField()
|
action: new fields.StringField()
|
||||||
}),
|
}),
|
||||||
damage: new fields.ObjectField(),
|
damage: new fields.ObjectField(),
|
||||||
costs: new fields.ArrayField(
|
costs: new fields.ArrayField(new fields.ObjectField()),
|
||||||
new fields.ObjectField()
|
|
||||||
),
|
|
||||||
successConsumed: new fields.BooleanField({ initial: false })
|
successConsumed: new fields.BooleanField({ initial: false })
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
get actionActor() {
|
get actionActor() {
|
||||||
if(!this.source.actor) return null;
|
if (!this.source.actor) return null;
|
||||||
return fromUuidSync(this.source.actor);
|
return fromUuidSync(this.source.actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
get actionItem() {
|
get actionItem() {
|
||||||
const actionActor = this.actionActor;
|
const actionActor = this.actionActor;
|
||||||
if(!actionActor || !this.source.item) return null;
|
if (!actionActor || !this.source.item) return null;
|
||||||
return actionActor.items.get(this.source.item);
|
return actionActor.items.get(this.source.item);
|
||||||
}
|
}
|
||||||
|
|
||||||
get action() {
|
get action() {
|
||||||
const actionItem = this.actionItem;
|
const actionItem = this.actionItem;
|
||||||
if(!actionItem || !this.source.action) return null;
|
if (!actionItem || !this.source.action) return null;
|
||||||
return actionItem.system.actionsList?.find(a => a.id === this.source.action);
|
return actionItem.system.actionsList?.find(a => a.id === this.source.action);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -76,90 +75,85 @@ export default class DHActorRoll extends foundry.abstract.TypeDataModel {
|
||||||
this.targetSelection = mode;
|
this.targetSelection = mode;
|
||||||
this.updateTargets();
|
this.updateTargets();
|
||||||
this.registerTargetHook();
|
this.registerTargetHook();
|
||||||
this.parent.update(
|
this.parent.update({
|
||||||
{
|
system: {
|
||||||
system: {
|
targetSelection: this.targetSelection,
|
||||||
targetSelection: this.targetSelection,
|
oldTargets: this.oldTargets
|
||||||
oldTargets: this.oldTargets
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
);
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
get hitTargets() {
|
get hitTargets() {
|
||||||
return this.currentTargets.filter(t => (t.hit || !this.hasRoll || !this.targetSelection));
|
return this.currentTargets.filter(t => t.hit || !this.hasRoll || !this.targetSelection);
|
||||||
}
|
}
|
||||||
|
|
||||||
async updateTargets() {
|
async updateTargets() {
|
||||||
this.currentTargets = this.getTargetList();
|
this.currentTargets = this.getTargetList();
|
||||||
if(!this.targetSelection) {
|
if (!this.targetSelection) {
|
||||||
this.currentTargets.forEach(ct => {
|
this.currentTargets.forEach(ct => {
|
||||||
if(this.targets.find(t => t.actorId === ct.actorId)) return;
|
if (this.targets.find(t => t.actorId === ct.actorId)) return;
|
||||||
const indexTarget = this.oldTargets.findIndex(ot => ot.actorId === ct.actorId);
|
const indexTarget = this.oldTargets.findIndex(ot => ot.actorId === ct.actorId);
|
||||||
if(indexTarget === -1)
|
if (indexTarget === -1) this.oldTargets.push(ct);
|
||||||
this.oldTargets.push(ct);
|
|
||||||
});
|
});
|
||||||
if(this.hasSave) this.setPendingSaves();
|
if (this.hasSave) this.setPendingSaves();
|
||||||
if(this.currentTargets.length) {
|
if (this.currentTargets.length) {
|
||||||
if(!this.parent._id) return;
|
if (!this.parent._id) return;
|
||||||
const updates = await this.parent.update(
|
const updates = await this.parent.update({
|
||||||
{
|
system: {
|
||||||
system: {
|
oldTargets: this.oldTargets
|
||||||
oldTargets: this.oldTargets
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
);
|
});
|
||||||
if(!updates && ui.chat.collection.get(this.parent.id))
|
if (!updates && ui.chat.collection.get(this.parent.id)) ui.chat.updateMessage(this.parent);
|
||||||
ui.chat.updateMessage(this.parent);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
registerTargetHook() {
|
registerTargetHook() {
|
||||||
if(this.targetSelection && this.targetHook !== null) {
|
if (this.targetSelection && this.targetHook !== null) {
|
||||||
Hooks.off("targetToken", this.targetHook);
|
Hooks.off('targetToken', this.targetHook);
|
||||||
this.targetHook = null;
|
this.targetHook = null;
|
||||||
} else if(!this.targetSelection && this.targetHook === null) {
|
} else if (!this.targetSelection && this.targetHook === null) {
|
||||||
this.targetHook = Hooks.on("targetToken", foundry.utils.debounce(this.updateTargets.bind(this), 50));
|
this.targetHook = Hooks.on('targetToken', foundry.utils.debounce(this.updateTargets.bind(this), 50));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
prepareDerivedData() {
|
prepareDerivedData() {
|
||||||
if(this.hasTarget) {
|
if (this.hasTarget) {
|
||||||
this.hasHitTarget = this.targets.filter(t => t.hit === true).length > 0;
|
this.hasHitTarget = this.targets.filter(t => t.hit === true).length > 0;
|
||||||
this.updateTargets();
|
this.updateTargets();
|
||||||
this.registerTargetHook();
|
this.registerTargetHook();
|
||||||
if(this.targetSelection === true) {
|
if (this.targetSelection === true) {
|
||||||
this.targetShort = this.targets.reduce((a,c) => {
|
this.targetShort = this.targets.reduce(
|
||||||
if(c.hit) a.hit += 1;
|
(a, c) => {
|
||||||
else c.miss += 1;
|
if (c.hit) a.hit += 1;
|
||||||
return a;
|
else a.miss += 1;
|
||||||
}, {hit: 0, miss: 0})
|
return a;
|
||||||
|
},
|
||||||
|
{ hit: 0, miss: 0 }
|
||||||
|
);
|
||||||
}
|
}
|
||||||
if(this.hasSave) this.setPendingSaves();
|
if (this.hasSave) this.setPendingSaves();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.canViewSecret = this.parent.speakerActor?.testUserPermission(game.user, 'OBSERVER');
|
this.canViewSecret = this.parent.speakerActor?.testUserPermission(game.user, 'OBSERVER');
|
||||||
}
|
}
|
||||||
|
|
||||||
getTargetList() {
|
getTargetList() {
|
||||||
return this.targetSelection !== true
|
return this.targetSelection !== true
|
||||||
? Array.from(game.user.targets).map(t =>{
|
? Array.from(game.user.targets).map(t => {
|
||||||
const target = game.system.api.fields.ActionFields.TargetField.formatTarget(t),
|
const target = game.system.api.fields.ActionFields.TargetField.formatTarget(t),
|
||||||
oldTarget = this.targets.find(ot => ot.actorId === target.actorId) ?? this.oldTargets.find(ot => ot.actorId === target.actorId);
|
oldTarget =
|
||||||
if(oldTarget) return oldTarget;
|
this.targets.find(ot => ot.actorId === target.actorId) ??
|
||||||
return target;
|
this.oldTargets.find(ot => ot.actorId === target.actorId);
|
||||||
})
|
if (oldTarget) return oldTarget;
|
||||||
|
return target;
|
||||||
|
})
|
||||||
: this.targets;
|
: this.targets;
|
||||||
}
|
}
|
||||||
|
|
||||||
setPendingSaves() {
|
setPendingSaves() {
|
||||||
this.pendingSaves = this.targetSelection
|
this.pendingSaves = this.targetSelection
|
||||||
? this.targets.filter(
|
? this.targets.filter(target => target.hit && target.saved.success === null).length > 0
|
||||||
target => target.hit && target.saved.success === null
|
: this.currentTargets.filter(target => target.saved.success === null).length > 0;
|
||||||
).length > 0
|
|
||||||
: this.currentTargets.filter(
|
|
||||||
target => target.saved.success === null
|
|
||||||
).length > 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,25 @@ export default class BeastformField extends fields.SchemaField {
|
||||||
constructor(options = {}, context = {}) {
|
constructor(options = {}, context = {}) {
|
||||||
const beastformFields = {
|
const beastformFields = {
|
||||||
tierAccess: new fields.SchemaField({
|
tierAccess: new fields.SchemaField({
|
||||||
exact: new fields.NumberField({ integer: true, nullable: true, initial: null })
|
exact: new fields.NumberField({
|
||||||
|
integer: true,
|
||||||
|
nullable: true,
|
||||||
|
initial: null,
|
||||||
|
choices: () => {
|
||||||
|
const settingsTiers = game.settings.get(
|
||||||
|
CONFIG.DH.id,
|
||||||
|
CONFIG.DH.SETTINGS.gameSettings.LevelTiers
|
||||||
|
).tiers;
|
||||||
|
return Object.values(settingsTiers).reduce(
|
||||||
|
(acc, tier) => {
|
||||||
|
acc[tier.tier] = game.i18n.localize(tier.name);
|
||||||
|
return acc;
|
||||||
|
},
|
||||||
|
{ 1: game.i18n.localize('DAGGERHEART.GENERAL.Tiers.1') }
|
||||||
|
);
|
||||||
|
},
|
||||||
|
hint: 'DAGGERHEART.ACTIONS.Config.beastform.exactHint'
|
||||||
|
})
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
super(beastformFields, options, context);
|
super(beastformFields, options, context);
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,10 @@ export default class UsesField extends fields.SchemaField {
|
||||||
initial: null,
|
initial: null,
|
||||||
nullable: true
|
nullable: true
|
||||||
}),
|
}),
|
||||||
consumeOnSuccess: new fields.BooleanField({ initial: false, label: "DAGGERHEART.ACTIONS.Settings.consumeOnSuccess.label" })
|
consumeOnSuccess: new fields.BooleanField({
|
||||||
|
initial: false,
|
||||||
|
label: 'DAGGERHEART.ACTIONS.Settings.consumeOnSuccess.label'
|
||||||
|
})
|
||||||
};
|
};
|
||||||
super(usesFields, options, context);
|
super(usesFields, options, context);
|
||||||
}
|
}
|
||||||
|
|
@ -30,6 +33,7 @@ export default class UsesField extends fields.SchemaField {
|
||||||
if (!uses) return null;
|
if (!uses) return null;
|
||||||
return {
|
return {
|
||||||
...uses,
|
...uses,
|
||||||
|
remaining: this.remainingUses,
|
||||||
enabled: uses.hasOwnProperty('enabled') ? uses.enabled : true
|
enabled: uses.hasOwnProperty('enabled') ? uses.enabled : true
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
import DHActionConfig from '../../applications/sheets-configs/action-config.mjs';
|
import DHActionConfig from '../../applications/sheets-configs/action-config.mjs';
|
||||||
|
import { itemAbleRollParse } from '../../helpers/utils.mjs';
|
||||||
import MappingField from './mappingField.mjs';
|
import MappingField from './mappingField.mjs';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -164,6 +165,15 @@ export function ActionMixin(Base) {
|
||||||
return foundry.utils.getProperty(this.parent, this.systemPath) instanceof Collection;
|
return foundry.utils.getProperty(this.parent, this.systemPath) instanceof Collection;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get remainingUses() {
|
||||||
|
if (!this.uses) return null;
|
||||||
|
|
||||||
|
return Math.max(
|
||||||
|
(this.uses.max ? itemAbleRollParse(this.uses.max, this.actor) : 0) - (this.uses.value ?? 0),
|
||||||
|
0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
static async create(data, operation = {}) {
|
static async create(data, operation = {}) {
|
||||||
const { parent, renderSheet } = operation;
|
const { parent, renderSheet } = operation;
|
||||||
let { type } = data;
|
let { type } = data;
|
||||||
|
|
|
||||||
|
|
@ -88,6 +88,26 @@ export default class DHBeastform extends BaseDataItem {
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|
||||||
|
get beastformAttackData() {
|
||||||
|
const effect = this.parent.effects.find(x => x.type === 'beastform');
|
||||||
|
if (!effect) return null;
|
||||||
|
|
||||||
|
const traitBonus = effect.changes.find(x => x.key === `system.traits.${this.mainTrait}.value`)?.value ?? 0;
|
||||||
|
const evasionBonus = effect.changes.find(x => x.key === 'system.evasion')?.value ?? 0;
|
||||||
|
|
||||||
|
const damageDiceIndex = effect.changes.find(x => x.key === 'system.rules.attack.damage.diceIndex');
|
||||||
|
const damageDice = damageDiceIndex ? Object.keys(CONFIG.DH.GENERAL.diceTypes)[damageDiceIndex.value] : null;
|
||||||
|
const damageBonus = effect.changes.find(x => x.key === 'system.rules.attack.damage.bonus')?.value ?? 0;
|
||||||
|
|
||||||
|
return {
|
||||||
|
trait: game.i18n.localize(CONFIG.DH.ACTOR.abilities[this.mainTrait].label),
|
||||||
|
traitBonus: traitBonus ? Number(traitBonus).signedString() : '',
|
||||||
|
evasionBonus: evasionBonus ? Number(evasionBonus).signedString() : '',
|
||||||
|
damageDice: damageDice,
|
||||||
|
damageBonus: damageBonus ? `${Number(damageBonus).signedString()}` : ''
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
async _preCreate() {
|
async _preCreate() {
|
||||||
if (!this.actor) return;
|
if (!this.actor) return;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,11 @@ export default class DhAutomation extends foundry.abstract.DataModel {
|
||||||
required: true,
|
required: true,
|
||||||
initial: true,
|
initial: true,
|
||||||
label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.resourceScrollTexts.label'
|
label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.resourceScrollTexts.label'
|
||||||
|
}),
|
||||||
|
playerCanEditSheet: new fields.BooleanField({
|
||||||
|
required: true,
|
||||||
|
initial: false,
|
||||||
|
label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.playerCanEditSheet.label'
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -45,10 +45,10 @@ export default class DhHomebrew extends foundry.abstract.DataModel {
|
||||||
initial: 'Coins',
|
initial: 'Coins',
|
||||||
label: 'DAGGERHEART.SETTINGS.Homebrew.currency.coinName'
|
label: 'DAGGERHEART.SETTINGS.Homebrew.currency.coinName'
|
||||||
}),
|
}),
|
||||||
handfulls: new fields.StringField({
|
handfuls: new fields.StringField({
|
||||||
required: true,
|
required: true,
|
||||||
initial: 'Handfulls',
|
initial: 'Handfuls',
|
||||||
label: 'DAGGERHEART.SETTINGS.Homebrew.currency.handfullName'
|
label: 'DAGGERHEART.SETTINGS.Homebrew.currency.handfulName'
|
||||||
}),
|
}),
|
||||||
bags: new fields.StringField({
|
bags: new fields.StringField({
|
||||||
required: true,
|
required: true,
|
||||||
|
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
export default class DhRangeMeasurement extends foundry.abstract.DataModel {
|
|
||||||
static defineSchema() {
|
|
||||||
const fields = foundry.data.fields;
|
|
||||||
return {
|
|
||||||
enabled: new fields.BooleanField({ required: true, initial: true, label: 'DAGGERHEART.GENERAL.enabled' }),
|
|
||||||
melee: new fields.NumberField({ required: true, initial: 5, label: 'DAGGERHEART.CONFIG.Range.melee.name' }),
|
|
||||||
veryClose: new fields.NumberField({
|
|
||||||
required: true,
|
|
||||||
initial: 15,
|
|
||||||
label: 'DAGGERHEART.CONFIG.Range.veryClose.name'
|
|
||||||
}),
|
|
||||||
close: new fields.NumberField({
|
|
||||||
required: true,
|
|
||||||
initial: 30,
|
|
||||||
label: 'DAGGERHEART.CONFIG.Range.close.name'
|
|
||||||
}),
|
|
||||||
far: new fields.NumberField({ required: true, initial: 60, label: 'DAGGERHEART.CONFIG.Range.far.name' }),
|
|
||||||
veryFar: new fields.NumberField({
|
|
||||||
required: true,
|
|
||||||
initial: 120,
|
|
||||||
label: 'DAGGERHEART.CONFIG.Range.veryFar.name'
|
|
||||||
})
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -17,9 +17,28 @@ export default class DhVariantRules extends foundry.abstract.DataModel {
|
||||||
label: 'DAGGERHEART.SETTINGS.VariantRules.FIELDS.actionTokens.tokens.label'
|
label: 'DAGGERHEART.SETTINGS.VariantRules.FIELDS.actionTokens.tokens.label'
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
useCoins: new fields.BooleanField({
|
rangeMeasurement: new fields.SchemaField({
|
||||||
initial: false,
|
enabled: new fields.BooleanField({
|
||||||
label: 'DAGGERHEART.SETTINGS.VariantRules.FIELDS.useCoins.label'
|
required: true,
|
||||||
|
initial: true,
|
||||||
|
label: 'DAGGERHEART.GENERAL.enabled'
|
||||||
|
}),
|
||||||
|
melee: new fields.NumberField({
|
||||||
|
required: true,
|
||||||
|
initial: 5,
|
||||||
|
label: 'DAGGERHEART.CONFIG.Range.melee.name'
|
||||||
|
}),
|
||||||
|
veryClose: new fields.NumberField({
|
||||||
|
required: true,
|
||||||
|
initial: 15,
|
||||||
|
label: 'DAGGERHEART.CONFIG.Range.veryClose.name'
|
||||||
|
}),
|
||||||
|
close: new fields.NumberField({
|
||||||
|
required: true,
|
||||||
|
initial: 30,
|
||||||
|
label: 'DAGGERHEART.CONFIG.Range.close.name'
|
||||||
|
}),
|
||||||
|
far: new fields.NumberField({ required: true, initial: 60, label: 'DAGGERHEART.CONFIG.Range.far.name' })
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
export { default as DhAppearance } from './Appearance.mjs';
|
export { default as DhAppearance } from './Appearance.mjs';
|
||||||
export { default as DhAutomation } from './Automation.mjs';
|
export { default as DhAutomation } from './Automation.mjs';
|
||||||
export { default as DhHomebrew } from './Homebrew.mjs';
|
export { default as DhHomebrew } from './Homebrew.mjs';
|
||||||
export { default as DhRangeMeasurement } from './RangeMeasurement.mjs';
|
|
||||||
export { default as DhVariantRules } from './VariantRules.mjs';
|
export { default as DhVariantRules } from './VariantRules.mjs';
|
||||||
|
|
|
||||||
|
|
@ -18,9 +18,7 @@ export default class D20Roll extends DHRoll {
|
||||||
static DefaultDialog = D20RollDialog;
|
static DefaultDialog = D20RollDialog;
|
||||||
|
|
||||||
get title() {
|
get title() {
|
||||||
return game.i18n.localize(
|
return game.i18n.localize('DAGGERHEART.GENERAL.d20Roll');
|
||||||
"DAGGERHEART.GENERAL.d20Roll"
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get d20() {
|
get d20() {
|
||||||
|
|
@ -145,9 +143,9 @@ export default class D20Roll extends DHRoll {
|
||||||
config.targetSelection = true;
|
config.targetSelection = true;
|
||||||
config.targets.forEach(target => {
|
config.targets.forEach(target => {
|
||||||
const difficulty = config.roll.difficulty ?? target.difficulty ?? target.evasion;
|
const difficulty = config.roll.difficulty ?? target.difficulty ?? target.evasion;
|
||||||
target.hit = this.isCritical || roll.total >= difficulty;
|
target.hit = roll.isCritical || roll.total >= difficulty;
|
||||||
});
|
});
|
||||||
data.success = config.targets.some(target => target.hit)
|
data.success = config.targets.some(target => target.hit);
|
||||||
} else if (config.roll.difficulty) {
|
} else if (config.roll.difficulty) {
|
||||||
data.difficulty = config.roll.difficulty;
|
data.difficulty = config.roll.difficulty;
|
||||||
data.success = roll.isCritical || roll.total >= config.roll.difficulty;
|
data.success = roll.isCritical || roll.total >= config.roll.difficulty;
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,8 @@ export default class DamageRoll extends DHRoll {
|
||||||
static DefaultDialog = DamageDialog;
|
static DefaultDialog = DamageDialog;
|
||||||
|
|
||||||
static async buildEvaluate(roll, config = {}, message = {}) {
|
static async buildEvaluate(roll, config = {}, message = {}) {
|
||||||
if (config.evaluate !== false)
|
if (config.evaluate !== false) for (const roll of config.roll) await roll.roll.evaluate();
|
||||||
for (const roll of config.roll) await roll.roll.evaluate();
|
|
||||||
|
|
||||||
roll._evaluated = true;
|
roll._evaluated = true;
|
||||||
const parts = config.roll.map(r => this.postEvaluate(r));
|
const parts = config.roll.map(r => this.postEvaluate(r));
|
||||||
|
|
||||||
|
|
@ -42,7 +41,7 @@ export default class DamageRoll extends DHRoll {
|
||||||
if (config.source?.message) {
|
if (config.source?.message) {
|
||||||
const chatMessage = ui.chat.collection.get(config.source.message);
|
const chatMessage = ui.chat.collection.get(config.source.message);
|
||||||
chatMessage.update({ 'system.damage': config.damage });
|
chatMessage.update({ 'system.damage': config.damage });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static unifyDamageRoll(rolls) {
|
static unifyDamageRoll(rolls) {
|
||||||
|
|
@ -84,11 +83,11 @@ export default class DamageRoll extends DHRoll {
|
||||||
|
|
||||||
applyBaseBonus(part) {
|
applyBaseBonus(part) {
|
||||||
const modifiers = [],
|
const modifiers = [],
|
||||||
type = this.options.messageType ?? (this.options.isHealing ? 'healing' : 'damage'),
|
type = this.options.messageType ?? (this.options.hasHealing ? 'healing' : 'damage'),
|
||||||
options = part ?? this.options;
|
options = part ?? this.options;
|
||||||
|
|
||||||
modifiers.push(...this.getBonus(`${type}`, `${type.capitalize()} Bonus`));
|
modifiers.push(...this.getBonus(`${type}`, `${type.capitalize()} Bonus`));
|
||||||
if (!this.options.isHealing) {
|
if (!this.options.hasHealing) {
|
||||||
options.damageTypes?.forEach(t => {
|
options.damageTypes?.forEach(t => {
|
||||||
modifiers.push(...this.getBonus(`${type}.${t}`, `${t.capitalize()} ${type.capitalize()} Bonus`));
|
modifiers.push(...this.getBonus(`${type}.${t}`, `${t.capitalize()} ${type.capitalize()} Bonus`));
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,8 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect {
|
||||||
if (isOriginTarget && change.effect.origin) {
|
if (isOriginTarget && change.effect.origin) {
|
||||||
change.value = change.value.replaceAll(/origin\.@/gi, '@');
|
change.value = change.value.replaceAll(/origin\.@/gi, '@');
|
||||||
try {
|
try {
|
||||||
const doc = foundry.utils.fromUuidSync(change.effect.origin);
|
const effect = foundry.utils.fromUuidSync(change.effect.origin);
|
||||||
|
const doc = effect.parent?.parent;
|
||||||
if (doc) parseModel = doc;
|
if (doc) parseModel = doc;
|
||||||
} catch (_) {}
|
} catch (_) {}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -202,7 +202,8 @@ export default class DhpActor extends Actor {
|
||||||
await this.update({
|
await this.update({
|
||||||
[`system.experiences.${experienceKey}`]: {
|
[`system.experiences.${experienceKey}`]: {
|
||||||
name: experience.name,
|
name: experience.name,
|
||||||
value: experience.modifier
|
value: experience.modifier,
|
||||||
|
core: true
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -210,7 +211,8 @@ export default class DhpActor extends Actor {
|
||||||
await this.system.companion.update({
|
await this.system.companion.update({
|
||||||
[`system.experiences.${experienceKey}`]: {
|
[`system.experiences.${experienceKey}`]: {
|
||||||
name: '',
|
name: '',
|
||||||
value: experience.modifier
|
value: experience.modifier,
|
||||||
|
core: true
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -559,8 +561,8 @@ export default class DhpActor extends Actor {
|
||||||
|
|
||||||
updates.forEach(
|
updates.forEach(
|
||||||
u =>
|
u =>
|
||||||
(u.value =
|
(u.value =
|
||||||
u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false ? u.value * -1 : u.value)
|
u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false ? u.value * -1 : u.value)
|
||||||
);
|
);
|
||||||
|
|
||||||
await this.modifyResource(updates);
|
await this.modifyResource(updates);
|
||||||
|
|
@ -606,9 +608,9 @@ export default class DhpActor extends Actor {
|
||||||
|
|
||||||
updates.forEach(
|
updates.forEach(
|
||||||
u =>
|
u =>
|
||||||
(u.value = !(u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false)
|
(u.value = !(u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false)
|
||||||
? u.value * -1
|
? u.value * -1
|
||||||
: u.value)
|
: u.value)
|
||||||
);
|
);
|
||||||
|
|
||||||
await this.modifyResource(updates);
|
await this.modifyResource(updates);
|
||||||
|
|
|
||||||
|
|
@ -74,8 +74,8 @@ export default class DHItem extends foundry.documents.Item {
|
||||||
isInventoryItem === true
|
isInventoryItem === true
|
||||||
? 'Inventory Items' //TODO localize
|
? 'Inventory Items' //TODO localize
|
||||||
: isInventoryItem === false
|
: isInventoryItem === false
|
||||||
? 'Character Items' //TODO localize
|
? 'Character Items' //TODO localize
|
||||||
: 'Other'; //TODO localize
|
: 'Other'; //TODO localize
|
||||||
|
|
||||||
return { value: type, label, group };
|
return { value: type, label, group };
|
||||||
}
|
}
|
||||||
|
|
@ -130,7 +130,6 @@ export default class DHItem extends foundry.documents.Item {
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
async use(event) {
|
async use(event) {
|
||||||
const actions = new Set(this.system.actionsList);
|
const actions = new Set(this.system.actionsList);
|
||||||
if (actions?.size) {
|
if (actions?.size) {
|
||||||
|
|
@ -152,10 +151,10 @@ export default class DHItem extends foundry.documents.Item {
|
||||||
this.type === 'ancestry'
|
this.type === 'ancestry'
|
||||||
? game.i18n.localize('DAGGERHEART.UI.Chat.foundationCard.ancestryTitle')
|
? game.i18n.localize('DAGGERHEART.UI.Chat.foundationCard.ancestryTitle')
|
||||||
: this.type === 'community'
|
: this.type === 'community'
|
||||||
? game.i18n.localize('DAGGERHEART.UI.Chat.foundationCard.communityTitle')
|
? game.i18n.localize('DAGGERHEART.UI.Chat.foundationCard.communityTitle')
|
||||||
: this.type === 'feature'
|
: this.type === 'feature'
|
||||||
? game.i18n.localize('TYPES.Item.feature')
|
? game.i18n.localize('TYPES.Item.feature')
|
||||||
: game.i18n.localize('DAGGERHEART.UI.Chat.foundationCard.subclassFeatureTitle'),
|
: game.i18n.localize('DAGGERHEART.UI.Chat.foundationCard.subclassFeatureTitle'),
|
||||||
origin: origin,
|
origin: origin,
|
||||||
img: this.img,
|
img: this.img,
|
||||||
item: {
|
item: {
|
||||||
|
|
@ -163,7 +162,7 @@ export default class DHItem extends foundry.documents.Item {
|
||||||
img: this.img,
|
img: this.img,
|
||||||
tags: this._getTags()
|
tags: this._getTags()
|
||||||
},
|
},
|
||||||
actions: item.system.actions,
|
actions: item.system.actionsList,
|
||||||
description: this.system.description
|
description: this.system.description
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -161,7 +161,7 @@ export default class DhTooltipManager extends foundry.helpers.interaction.Toolti
|
||||||
for (const [index, itemValue] of pathValue.entries()) {
|
for (const [index, itemValue] of pathValue.entries()) {
|
||||||
const itemIsAction = itemValue instanceof game.system.api.models.actions.actionsTypes.base;
|
const itemIsAction = itemValue instanceof game.system.api.models.actions.actionsTypes.base;
|
||||||
const value = itemIsAction || !itemValue?.item ? itemValue : itemValue.item;
|
const value = itemIsAction || !itemValue?.item ? itemValue : itemValue.item;
|
||||||
const enrichedValue = await TextEditor.enrichHTML(value.description);
|
const enrichedValue = await TextEditor.enrichHTML(value.system?.description ?? value.description);
|
||||||
if (itemIsAction) value.enrichedDescription = enrichedValue;
|
if (itemIsAction) value.enrichedDescription = enrichedValue;
|
||||||
else foundry.utils.setProperty(item, `${basePath}.${index}.enrichedDescription`, enrichedValue);
|
else foundry.utils.setProperty(item, `${basePath}.${index}.enrichedDescription`, enrichedValue);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
import { range as configRange } from '../config/generalConfig.mjs';
|
|
||||||
|
|
||||||
export default function DhTemplateEnricher(match, _options) {
|
export default function DhTemplateEnricher(match, _options) {
|
||||||
const parts = match[1].split('|').map(x => x.trim());
|
const parts = match[1].split('|').map(x => x.trim());
|
||||||
|
|
||||||
|
|
@ -17,7 +15,7 @@ export default function DhTemplateEnricher(match, _options) {
|
||||||
type = matchedType;
|
type = matchedType;
|
||||||
break;
|
break;
|
||||||
case 'range':
|
case 'range':
|
||||||
const matchedRange = Object.values(configRange).find(
|
const matchedRange = Object.values(CONFIG.DH.GENERAL.templateRanges).find(
|
||||||
x => x.id.toLowerCase() === split[1] || x.short === split[1]
|
x => x.id.toLowerCase() === split[1] || x.short === split[1]
|
||||||
);
|
);
|
||||||
range = matchedRange?.id;
|
range = matchedRange?.id;
|
||||||
|
|
@ -55,7 +53,9 @@ export const renderMeasuredTemplate = async event => {
|
||||||
? '180'
|
? '180'
|
||||||
: undefined;
|
: undefined;
|
||||||
|
|
||||||
const baseDistance = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.RangeMeasurement)[range];
|
const baseDistance = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules).rangeMeasurement[
|
||||||
|
range
|
||||||
|
];
|
||||||
const distance = type === CONFIG.DH.GENERAL.templateTypes.EMANATION ? baseDistance + 2.5 : baseDistance;
|
const distance = type === CONFIG.DH.GENERAL.templateTypes.EMANATION ? baseDistance + 2.5 : baseDistance;
|
||||||
|
|
||||||
const { width, height } = game.canvas.scene.dimensions;
|
const { width, height } = game.canvas.scene.dimensions;
|
||||||
|
|
|
||||||
|
|
@ -313,8 +313,10 @@ export const itemAbleRollParse = (value, actor, item) => {
|
||||||
|
|
||||||
const isItemTarget = value.toLowerCase().includes('item.@');
|
const isItemTarget = value.toLowerCase().includes('item.@');
|
||||||
const slicedValue = isItemTarget ? value.replaceAll(/item\.@/gi, '@') : value;
|
const slicedValue = isItemTarget ? value.replaceAll(/item\.@/gi, '@') : value;
|
||||||
|
const model = isItemTarget ? item : actor;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return Roll.replaceFormulaData(slicedValue, isItemTarget ? item : actor);
|
return Roll.replaceFormulaData(slicedValue, model?.getRollData?.() ?? model);
|
||||||
} catch (_) {
|
} catch (_) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
@ -362,6 +364,7 @@ export async function createEmbeddedItemWithEffects(actor, baseData, update) {
|
||||||
const [doc] = await actor.createEmbeddedDocuments('Item', [
|
const [doc] = await actor.createEmbeddedDocuments('Item', [
|
||||||
{
|
{
|
||||||
...(update ?? data),
|
...(update ?? data),
|
||||||
|
...baseData,
|
||||||
id: data.id,
|
id: data.id,
|
||||||
uuid: data.uuid,
|
uuid: data.uuid,
|
||||||
effects: data.effects?.map(effect => effect.toObject())
|
effects: data.effects?.map(effect => effect.toObject())
|
||||||
|
|
@ -371,6 +374,21 @@ export async function createEmbeddedItemWithEffects(actor, baseData, update) {
|
||||||
return doc;
|
return doc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function createEmbeddedItemsWithEffects(actor, baseData) {
|
||||||
|
const effectData = [];
|
||||||
|
for (let d of baseData) {
|
||||||
|
const data = d.uuid.startsWith('Compendium') ? await foundry.utils.fromUuid(d.uuid) : d;
|
||||||
|
effectData.push({
|
||||||
|
...data,
|
||||||
|
id: data.id,
|
||||||
|
uuid: data.uuid,
|
||||||
|
effects: data.effects?.map(effect => effect.toObject())
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
await actor.createEmbeddedDocuments('Item', effectData);
|
||||||
|
}
|
||||||
|
|
||||||
export const slugify = name => {
|
export const slugify = name => {
|
||||||
return name.toLowerCase().replaceAll(' ', '-').replaceAll('.', '');
|
return name.toLowerCase().replaceAll(' ', '-').replaceAll('.', '');
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,10 @@
|
||||||
import { defaultLevelTiers, DhLevelTiers } from '../data/levelTier.mjs';
|
import { defaultLevelTiers, DhLevelTiers } from '../data/levelTier.mjs';
|
||||||
import DhCountdowns from '../data/countdowns.mjs';
|
import DhCountdowns from '../data/countdowns.mjs';
|
||||||
import {
|
import { DhAppearance, DhAutomation, DhHomebrew, DhVariantRules } from '../data/settings/_module.mjs';
|
||||||
DhAppearance,
|
|
||||||
DhAutomation,
|
|
||||||
DhHomebrew,
|
|
||||||
DhRangeMeasurement,
|
|
||||||
DhVariantRules
|
|
||||||
} from '../data/settings/_module.mjs';
|
|
||||||
import {
|
import {
|
||||||
DhAppearanceSettings,
|
DhAppearanceSettings,
|
||||||
DhAutomationSettings,
|
DhAutomationSettings,
|
||||||
DhHomebrewSettings,
|
DhHomebrewSettings,
|
||||||
DhRangeMeasurementSettings,
|
|
||||||
DhVariantRuleSettings
|
DhVariantRuleSettings
|
||||||
} from '../applications/settings/_module.mjs';
|
} from '../applications/settings/_module.mjs';
|
||||||
|
|
||||||
|
|
@ -58,12 +51,6 @@ const registerMenuSettings = () => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
game.settings.register(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.RangeMeasurement, {
|
|
||||||
scope: 'world',
|
|
||||||
config: false,
|
|
||||||
type: DhRangeMeasurement
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const registerMenus = () => {
|
const registerMenus = () => {
|
||||||
|
|
@ -83,14 +70,6 @@ const registerMenus = () => {
|
||||||
type: DhHomebrewSettings,
|
type: DhHomebrewSettings,
|
||||||
restricted: true
|
restricted: true
|
||||||
});
|
});
|
||||||
game.settings.registerMenu(CONFIG.DH.id, CONFIG.DH.SETTINGS.menu.Range.Name, {
|
|
||||||
name: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.range.name'),
|
|
||||||
label: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.range.label'),
|
|
||||||
hint: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.range.hint'),
|
|
||||||
icon: CONFIG.DH.SETTINGS.menu.Range.Icon,
|
|
||||||
type: DhRangeMeasurementSettings,
|
|
||||||
restricted: true
|
|
||||||
});
|
|
||||||
|
|
||||||
game.settings.registerMenu(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance, {
|
game.settings.registerMenu(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance, {
|
||||||
name: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.appearance.title'),
|
name: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.appearance.title'),
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@
|
||||||
"readline": "^1.3.0",
|
"readline": "^1.3.0",
|
||||||
"pushLDBtoYML": "node ./tools/pushLDBtoYML.mjs",
|
"pushLDBtoYML": "node ./tools/pushLDBtoYML.mjs",
|
||||||
"pullYMLtoLDB": "node ./tools/pullYMLtoLDB.mjs",
|
"pullYMLtoLDB": "node ./tools/pullYMLtoLDB.mjs",
|
||||||
|
"pullYMLtoLDBBuild": "node ./tools/pullYMLtoLDBBuild.mjs",
|
||||||
"createSymlink": "node ./tools/create-symlink.mjs"
|
"createSymlink": "node ./tools/create-symlink.mjs"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,7 @@
|
||||||
},
|
},
|
||||||
"attack": {
|
"attack": {
|
||||||
"name": "Spears",
|
"name": "Spears",
|
||||||
|
"img": "icons/weapons/polearms/spear-flared-worn.webp",
|
||||||
"range": "veryClose",
|
"range": "veryClose",
|
||||||
"roll": {
|
"roll": {
|
||||||
"bonus": 0,
|
"bonus": 0,
|
||||||
|
|
|
||||||
|
|
@ -74,6 +74,7 @@
|
||||||
"description": "<p>An undead figure wearing a heavy leather coat, with searching eyes and a casually cruel demeanor.</p>",
|
"description": "<p>An undead figure wearing a heavy leather coat, with searching eyes and a casually cruel demeanor.</p>",
|
||||||
"attack": {
|
"attack": {
|
||||||
"name": "Tear at Flesh",
|
"name": "Tear at Flesh",
|
||||||
|
"img": "icons/skills/melee/strike-slashes-red.webp",
|
||||||
"roll": {
|
"roll": {
|
||||||
"bonus": 5,
|
"bonus": 5,
|
||||||
"type": "attack"
|
"type": "attack"
|
||||||
|
|
|
||||||
|
|
@ -74,6 +74,7 @@
|
||||||
"motivesAndTactics": "Move through solid objects, rally troops, rehash old battles",
|
"motivesAndTactics": "Move through solid objects, rally troops, rehash old battles",
|
||||||
"attack": {
|
"attack": {
|
||||||
"name": "Longbow",
|
"name": "Longbow",
|
||||||
|
"img": "icons/weapons/bows/longbow-recurve-skull-brown.webp",
|
||||||
"damage": {
|
"damage": {
|
||||||
"parts": [
|
"parts": [
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -68,6 +68,7 @@
|
||||||
"description": "<p>A dust-covered golden construct with boxy limbs and a huge mace for a hand.</p>",
|
"description": "<p>A dust-covered golden construct with boxy limbs and a huge mace for a hand.</p>",
|
||||||
"attack": {
|
"attack": {
|
||||||
"name": "Charged Mace",
|
"name": "Charged Mace",
|
||||||
|
"img": "icons/weapons/maces/shortmace-ornate-gold.webp",
|
||||||
"range": "veryClose",
|
"range": "veryClose",
|
||||||
"roll": {
|
"roll": {
|
||||||
"bonus": 3,
|
"bonus": 3,
|
||||||
|
|
|
||||||
|
|
@ -26,8 +26,8 @@
|
||||||
],
|
],
|
||||||
"uses": {
|
"uses": {
|
||||||
"value": null,
|
"value": null,
|
||||||
"max": "",
|
"max": "1",
|
||||||
"recovery": null
|
"recovery": "shortRest"
|
||||||
},
|
},
|
||||||
"effects": [],
|
"effects": [],
|
||||||
"target": {
|
"target": {
|
||||||
|
|
@ -58,7 +58,7 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753997061290,
|
"createdTime": 1753997061290,
|
||||||
"modifiedTime": 1753997114091,
|
"modifiedTime": 1754498245294,
|
||||||
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_key": "!items!AXqcoxnRoWBbbKpK"
|
"_key": "!items!AXqcoxnRoWBbbKpK"
|
||||||
|
|
|
||||||
|
|
@ -26,8 +26,8 @@
|
||||||
],
|
],
|
||||||
"uses": {
|
"uses": {
|
||||||
"value": null,
|
"value": null,
|
||||||
"max": "",
|
"max": "1",
|
||||||
"recovery": null
|
"recovery": "session"
|
||||||
},
|
},
|
||||||
"effects": [],
|
"effects": [],
|
||||||
"target": {
|
"target": {
|
||||||
|
|
@ -58,7 +58,7 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753994658436,
|
"createdTime": 1753994658436,
|
||||||
"modifiedTime": 1753994711690,
|
"modifiedTime": 1754498186961,
|
||||||
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_key": "!items!U6iFjZgLYawlOlQZ"
|
"_key": "!items!U6iFjZgLYawlOlQZ"
|
||||||
|
|
|
||||||
|
|
@ -49,8 +49,8 @@
|
||||||
"suggestedTraits": {
|
"suggestedTraits": {
|
||||||
"agility": 1,
|
"agility": 1,
|
||||||
"strength": -1,
|
"strength": -1,
|
||||||
"finesse": 0,
|
"finesse": 2,
|
||||||
"instinct": 2,
|
"instinct": 0,
|
||||||
"presence": 1,
|
"presence": 1,
|
||||||
"knowledge": 0
|
"knowledge": 0
|
||||||
},
|
},
|
||||||
|
|
@ -76,8 +76,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1754325275832,
|
"createdTime": 1754325275832,
|
||||||
"modifiedTime": 1754325686143,
|
"modifiedTime": 1754500637635,
|
||||||
"lastModifiedBy": "LgnbNMLaxandgMQq"
|
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
||||||
},
|
},
|
||||||
"_key": "!items!CvHlkHZfpMiCz5uT"
|
"_key": "!items!CvHlkHZfpMiCz5uT"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,15 +6,7 @@
|
||||||
"img": "icons/magic/unholy/strike-body-explode-disintegrate.webp",
|
"img": "icons/magic/unholy/strike-body-explode-disintegrate.webp",
|
||||||
"system": {
|
"system": {
|
||||||
"description": "<p>Once per long rest, you can place a domain card from your loadout into your vault and choose to either:</p><ul><li><p>Gain Hope equal to the level of the card.</p></li><li><p>Enhance a spell that deals damage, gaining a bonus to your damage roll equal to twice the level of the card.</p></li></ul>",
|
"description": "<p>Once per long rest, you can place a domain card from your loadout into your vault and choose to either:</p><ul><li><p>Gain Hope equal to the level of the card.</p></li><li><p>Enhance a spell that deals damage, gaining a bonus to your damage roll equal to twice the level of the card.</p></li></ul>",
|
||||||
"resource": {
|
"resource": null,
|
||||||
"type": "simple",
|
|
||||||
"value": 1,
|
|
||||||
"max": "1",
|
|
||||||
"icon": "",
|
|
||||||
"recovery": "longRest",
|
|
||||||
"diceStates": {},
|
|
||||||
"dieFaces": "d4"
|
|
||||||
},
|
|
||||||
"actions": {
|
"actions": {
|
||||||
"YFmqnbMx540su2Ni": {
|
"YFmqnbMx540su2Ni": {
|
||||||
"type": "effect",
|
"type": "effect",
|
||||||
|
|
@ -26,17 +18,17 @@
|
||||||
"cost": [
|
"cost": [
|
||||||
{
|
{
|
||||||
"scalable": false,
|
"scalable": false,
|
||||||
"key": "P02cbN50LIoD662z",
|
"key": "hitPoints",
|
||||||
"value": 1,
|
"value": 1,
|
||||||
"keyIsID": true,
|
"keyIsID": false,
|
||||||
"step": null,
|
"step": null,
|
||||||
"consumeOnSuccess": false
|
"consumeOnSuccess": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"uses": {
|
"uses": {
|
||||||
"value": null,
|
"value": null,
|
||||||
"max": "",
|
"max": "1",
|
||||||
"recovery": null,
|
"recovery": "longRest",
|
||||||
"consumeOnSuccess": false
|
"consumeOnSuccess": false
|
||||||
},
|
},
|
||||||
"effects": [],
|
"effects": [],
|
||||||
|
|
@ -67,8 +59,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1754349703843,
|
"createdTime": 1754349703843,
|
||||||
"modifiedTime": 1754349703843,
|
"modifiedTime": 1754498040342,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_key": "!items!P02cbN50LIoD662z"
|
"_key": "!items!P02cbN50LIoD662z"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,15 +5,7 @@
|
||||||
"img": "icons/tools/instruments/drum-hand-tan.webp",
|
"img": "icons/tools/instruments/drum-hand-tan.webp",
|
||||||
"system": {
|
"system": {
|
||||||
"description": "<p>Once per session, describe how you rally the party and give yourself and each of your allies a Rally Die. At level 1, your Rally Die is a d6. A PC can spend their Rally Die to roll it, adding the result to their action roll, reaction roll, damage roll, or to clear a number of Stress equal to the result. At the end of each session, clear all unspent Rally Dice. At level 5, your Rally Die increases to a d8.</p>",
|
"description": "<p>Once per session, describe how you rally the party and give yourself and each of your allies a Rally Die. At level 1, your Rally Die is a d6. A PC can spend their Rally Die to roll it, adding the result to their action roll, reaction roll, damage roll, or to clear a number of Stress equal to the result. At the end of each session, clear all unspent Rally Dice. At level 5, your Rally Die increases to a d8.</p>",
|
||||||
"resource": {
|
"resource": null,
|
||||||
"type": "simple",
|
|
||||||
"value": 1,
|
|
||||||
"max": "1",
|
|
||||||
"icon": "",
|
|
||||||
"recovery": "session",
|
|
||||||
"diceStates": {},
|
|
||||||
"dieFaces": "d4"
|
|
||||||
},
|
|
||||||
"actions": {
|
"actions": {
|
||||||
"vI4Fph3y9ygsya9e": {
|
"vI4Fph3y9ygsya9e": {
|
||||||
"type": "effect",
|
"type": "effect",
|
||||||
|
|
@ -25,15 +17,16 @@
|
||||||
"cost": [
|
"cost": [
|
||||||
{
|
{
|
||||||
"scalable": false,
|
"scalable": false,
|
||||||
"key": "Y7waM3ljoRLyk38N",
|
"key": "hitPoints",
|
||||||
"value": 1,
|
"value": 1,
|
||||||
"keyIsID": true,
|
"keyIsID": false,
|
||||||
"step": null
|
"step": null,
|
||||||
|
"consumeOnSuccess": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"uses": {
|
"uses": {
|
||||||
"value": null,
|
"value": null,
|
||||||
"max": "",
|
"max": "1",
|
||||||
"recovery": "session"
|
"recovery": "session"
|
||||||
},
|
},
|
||||||
"effects": [
|
"effects": [
|
||||||
|
|
@ -114,8 +107,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1754174497668,
|
"createdTime": 1754174497668,
|
||||||
"modifiedTime": 1754246215191,
|
"modifiedTime": 1754494820213,
|
||||||
"lastModifiedBy": "LgnbNMLaxandgMQq"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"ownership": {
|
"ownership": {
|
||||||
"default": 0,
|
"default": 0,
|
||||||
|
|
|
||||||
|
|
@ -5,15 +5,7 @@
|
||||||
"img": "icons/tools/instruments/drum-hand-tan.webp",
|
"img": "icons/tools/instruments/drum-hand-tan.webp",
|
||||||
"system": {
|
"system": {
|
||||||
"description": "<p>Once per session, describe how you rally the party and give yourself and each of your allies a Rally Die. At level 1, your Rally Die is a d6. A PC can spend their Rally Die to roll it, adding the result to their action roll, reaction roll, damage roll, or to clear a number of Stress equal to the result. At the end of each session, clear all unspent Rally Dice. At level 5, your Rally Die increases to a d8.</p>",
|
"description": "<p>Once per session, describe how you rally the party and give yourself and each of your allies a Rally Die. At level 1, your Rally Die is a d6. A PC can spend their Rally Die to roll it, adding the result to their action roll, reaction roll, damage roll, or to clear a number of Stress equal to the result. At the end of each session, clear all unspent Rally Dice. At level 5, your Rally Die increases to a d8.</p>",
|
||||||
"resource": {
|
"resource": null,
|
||||||
"type": "simple",
|
|
||||||
"value": 1,
|
|
||||||
"max": "1",
|
|
||||||
"icon": "",
|
|
||||||
"recovery": "session",
|
|
||||||
"diceStates": {},
|
|
||||||
"dieFaces": "d4"
|
|
||||||
},
|
|
||||||
"actions": {
|
"actions": {
|
||||||
"Z1KWFrpXOqZWuZD1": {
|
"Z1KWFrpXOqZWuZD1": {
|
||||||
"type": "effect",
|
"type": "effect",
|
||||||
|
|
@ -25,15 +17,16 @@
|
||||||
"cost": [
|
"cost": [
|
||||||
{
|
{
|
||||||
"scalable": false,
|
"scalable": false,
|
||||||
"key": "oxv0m8AFUQVFKtZ4",
|
"key": "hitPoints",
|
||||||
"value": 1,
|
"value": 1,
|
||||||
"keyIsID": true,
|
"keyIsID": false,
|
||||||
"step": null
|
"step": null,
|
||||||
|
"consumeOnSuccess": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"uses": {
|
"uses": {
|
||||||
"value": null,
|
"value": null,
|
||||||
"max": "",
|
"max": "1",
|
||||||
"recovery": "session"
|
"recovery": "session"
|
||||||
},
|
},
|
||||||
"effects": [
|
"effects": [
|
||||||
|
|
@ -114,8 +107,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1754174499893,
|
"createdTime": 1754174499893,
|
||||||
"modifiedTime": 1754246215922,
|
"modifiedTime": 1754494835723,
|
||||||
"lastModifiedBy": "LgnbNMLaxandgMQq"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"ownership": {
|
"ownership": {
|
||||||
"default": 0,
|
"default": 0,
|
||||||
|
|
|
||||||
|
|
@ -7,10 +7,11 @@
|
||||||
"system": {
|
"system": {
|
||||||
"description": "<p>Choose a number between 1 and 12. When you roll that number on a Duality Die, gain a Hope or clear a Stress.</p><p></p><p>You can change this number when you take a long rest.</p>",
|
"description": "<p>Choose a number between 1 and 12. When you roll that number on a Duality Die, gain a Hope or clear a Stress.</p><p></p><p>You can change this number when you take a long rest.</p>",
|
||||||
"resource": {
|
"resource": {
|
||||||
"type": "simple",
|
"type": "diceValue",
|
||||||
"value": 1,
|
"value": 1,
|
||||||
"max": "",
|
"max": "1",
|
||||||
"icon": "fa-solid fa-hashtag"
|
"icon": "fa-solid fa-hashtag",
|
||||||
|
"dieFaces": "d12"
|
||||||
},
|
},
|
||||||
"actions": {
|
"actions": {
|
||||||
"RkqPzF1bdWzPPMml": {
|
"RkqPzF1bdWzPPMml": {
|
||||||
|
|
@ -100,7 +101,7 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1754254942995,
|
"createdTime": 1754254942995,
|
||||||
"modifiedTime": 1754255067467,
|
"modifiedTime": 1754498121727,
|
||||||
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_key": "!items!6YsfFjmCGuFYVhT4"
|
"_key": "!items!6YsfFjmCGuFYVhT4"
|
||||||
|
|
|
||||||
|
|
@ -30,8 +30,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1754010247432,
|
"createdTime": 1754010247432,
|
||||||
"modifiedTime": 1754010247432,
|
"modifiedTime": 1754498464092,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"sort": 0,
|
"sort": 0,
|
||||||
"ownership": {
|
"ownership": {
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"roll": {
|
"roll": {
|
||||||
"type": null,
|
"type": "spellcast",
|
||||||
"trait": null,
|
"trait": null,
|
||||||
"difficulty": null,
|
"difficulty": null,
|
||||||
"bonus": null,
|
"bonus": null,
|
||||||
|
|
@ -154,8 +154,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784434,
|
"createdTime": 1753922784434,
|
||||||
"modifiedTime": 1754253433766,
|
"modifiedTime": 1754475145346,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "5EP2Lgf7ojfrc0Is",
|
"_id": "5EP2Lgf7ojfrc0Is",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -20,9 +20,9 @@
|
||||||
"cost": [],
|
"cost": [],
|
||||||
"uses": {
|
"uses": {
|
||||||
"value": null,
|
"value": null,
|
||||||
"max": "",
|
"max": "1",
|
||||||
"recovery": null,
|
"recovery": "longRest",
|
||||||
"consumeOnSuccess": false
|
"consumeOnSuccess": true
|
||||||
},
|
},
|
||||||
"damage": {
|
"damage": {
|
||||||
"parts": [],
|
"parts": [],
|
||||||
|
|
@ -128,8 +128,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784437,
|
"createdTime": 1753922784437,
|
||||||
"modifiedTime": 1754254161910,
|
"modifiedTime": 1754501480068,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "R8NDiJXJWmC48WSr",
|
"_id": "R8NDiJXJWmC48WSr",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -9,12 +9,31 @@
|
||||||
"recallCost": 3,
|
"recallCost": 3,
|
||||||
"level": 9,
|
"level": 9,
|
||||||
"type": "spell",
|
"type": "spell",
|
||||||
"resource": {
|
"resource": null,
|
||||||
"type": "simple",
|
"actions": {
|
||||||
"value": 1,
|
"RKEceNKiQirYwN45": {
|
||||||
"recovery": "longRest",
|
"type": "effect",
|
||||||
"max": "1",
|
"_id": "RKEceNKiQirYwN45",
|
||||||
"icon": ""
|
"systemPath": "actions",
|
||||||
|
"description": "<p class=\"Body-Foundation\">Once per long rest, this card can mimic the features of another domain card of level 8 or lower in another player’s loadout. <strong>Spend Hope equal to half the card’s level</strong> to gain access to the feature. It lasts until your next rest or they place the card in their vault.</p>",
|
||||||
|
"chatDisplay": true,
|
||||||
|
"actionType": "action",
|
||||||
|
"cost": [],
|
||||||
|
"uses": {
|
||||||
|
"value": null,
|
||||||
|
"max": "1",
|
||||||
|
"recovery": "longRest",
|
||||||
|
"consumeOnSuccess": false
|
||||||
|
},
|
||||||
|
"effects": [],
|
||||||
|
"target": {
|
||||||
|
"type": "any",
|
||||||
|
"amount": null
|
||||||
|
},
|
||||||
|
"name": "Mimic",
|
||||||
|
"img": "icons/magic/perception/hand-eye-black.webp",
|
||||||
|
"range": ""
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"flags": {},
|
"flags": {},
|
||||||
|
|
@ -26,8 +45,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784439,
|
"createdTime": 1753922784439,
|
||||||
"modifiedTime": 1754329311656,
|
"modifiedTime": 1754499898585,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "3A7LZ1xmDEMGa165",
|
"_id": "3A7LZ1xmDEMGa165",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -29,9 +29,9 @@
|
||||||
],
|
],
|
||||||
"uses": {
|
"uses": {
|
||||||
"value": null,
|
"value": null,
|
||||||
"max": "",
|
"max": "1",
|
||||||
"recovery": null,
|
"recovery": "shortRest",
|
||||||
"consumeOnSuccess": false
|
"consumeOnSuccess": true
|
||||||
},
|
},
|
||||||
"damage": {
|
"damage": {
|
||||||
"parts": [
|
"parts": [
|
||||||
|
|
@ -99,13 +99,7 @@
|
||||||
"range": "veryFar"
|
"range": "veryFar"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": null
|
||||||
"type": "simple",
|
|
||||||
"value": 1,
|
|
||||||
"recovery": "shortRest",
|
|
||||||
"max": "1",
|
|
||||||
"icon": ""
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"_stats": {
|
"_stats": {
|
||||||
|
|
@ -116,8 +110,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784449,
|
"createdTime": 1753922784449,
|
||||||
"modifiedTime": 1754254262215,
|
"modifiedTime": 1754501560924,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "C0qLOwSSvZ6PG3Ws",
|
"_id": "C0qLOwSSvZ6PG3Ws",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,12 @@
|
||||||
"type": "any",
|
"type": "any",
|
||||||
"amount": null
|
"amount": null
|
||||||
},
|
},
|
||||||
"effects": [],
|
"effects": [
|
||||||
|
{
|
||||||
|
"_id": "EYG5dLImk6GkmfRd",
|
||||||
|
"onSave": false
|
||||||
|
}
|
||||||
|
],
|
||||||
"roll": {
|
"roll": {
|
||||||
"type": "spellcast",
|
"type": "spellcast",
|
||||||
"trait": null,
|
"trait": null,
|
||||||
|
|
@ -127,7 +132,7 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784451,
|
"createdTime": 1753922784451,
|
||||||
"modifiedTime": 1754340901029,
|
"modifiedTime": 1754500747453,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
||||||
},
|
},
|
||||||
"_id": "a8lFiKX1o8T924ze",
|
"_id": "a8lFiKX1o8T924ze",
|
||||||
|
|
@ -135,6 +140,10 @@
|
||||||
"effects": [
|
"effects": [
|
||||||
{
|
{
|
||||||
"name": "Enraptured",
|
"name": "Enraptured",
|
||||||
|
"img": "icons/magic/control/hypnosis-mesmerism-eye.webp",
|
||||||
|
"origin": "Compendium.daggerheart.domains.Item.a8lFiKX1o8T924ze",
|
||||||
|
"transfer": false,
|
||||||
|
"_id": "EYG5dLImk6GkmfRd",
|
||||||
"type": "base",
|
"type": "base",
|
||||||
"system": {
|
"system": {
|
||||||
"rangeDependence": {
|
"rangeDependence": {
|
||||||
|
|
@ -144,8 +153,6 @@
|
||||||
"range": "melee"
|
"range": "melee"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"_id": "FOQ2yqrpl2TPVxvt",
|
|
||||||
"img": "icons/magic/control/hypnosis-mesmerism-eye.webp",
|
|
||||||
"changes": [],
|
"changes": [],
|
||||||
"disabled": false,
|
"disabled": false,
|
||||||
"duration": {
|
"duration": {
|
||||||
|
|
@ -157,10 +164,8 @@
|
||||||
"startRound": null,
|
"startRound": null,
|
||||||
"startTurn": null
|
"startTurn": null
|
||||||
},
|
},
|
||||||
"description": "<p><span style=\"color:rgb(239, 230, 216);font-family:Montserrat, sans-serif;font-size:14px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-indent:0px;text-transform:none;widows:2;word-spacing:0px;-webkit-text-stroke-width:0px;white-space:normal;background-color:rgba(24, 22, 46, 0.376);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;display:inline !important;float:none\">While </span><span style=\"box-sizing:border-box;scrollbar-width:thin;scrollbar-color:rgb(93, 20, 43) rgba(0, 0, 0, 0);color:rgb(239, 230, 216);font-family:Montserrat, sans-serif;font-size:14px;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-indent:0px;text-transform:none;widows:2;word-spacing:0px;-webkit-text-stroke-width:0px;white-space:normal;background-color:rgba(24, 22, 46, 0.376);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial\">Enraptured</span><span style=\"color:rgb(239, 230, 216);font-family:Montserrat, sans-serif;font-size:14px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-indent:0px;text-transform:none;widows:2;word-spacing:0px;-webkit-text-stroke-width:0px;white-space:normal;background-color:rgba(24, 22, 46, 0.376);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;display:inline !important;float:none\">, a target’s attention is fixed on you, narrowing their field of view and drowning out any sound but your voice.</span></p>",
|
"description": "<p>While <em>Enraptured</em>, a target’s attention is fixed on you, narrowing their field of view and drowning out any sound but your voice.</p>",
|
||||||
"origin": null,
|
|
||||||
"tint": "#ffffff",
|
"tint": "#ffffff",
|
||||||
"transfer": true,
|
|
||||||
"statuses": [],
|
"statuses": [],
|
||||||
"sort": 0,
|
"sort": 0,
|
||||||
"flags": {},
|
"flags": {},
|
||||||
|
|
@ -171,11 +176,11 @@
|
||||||
"coreVersion": "13.346",
|
"coreVersion": "13.346",
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1754106690796,
|
"createdTime": 1754500747406,
|
||||||
"modifiedTime": 1754340886910,
|
"modifiedTime": 1754500810477,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
||||||
},
|
},
|
||||||
"_key": "!items.effects!a8lFiKX1o8T924ze.FOQ2yqrpl2TPVxvt"
|
"_key": "!items.effects!a8lFiKX1o8T924ze.EYG5dLImk6GkmfRd"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"ownership": {
|
"ownership": {
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
"type": "domainCard",
|
"type": "domainCard",
|
||||||
"folder": "7Cs44YADBTmmtCw6",
|
"folder": "7Cs44YADBTmmtCw6",
|
||||||
"system": {
|
"system": {
|
||||||
"description": "<p class=\"Body-Foundation\">Make a <strong>Spellcast Roll</strong> against all adversaries within Far range. <strong>Mark any number of Stress</strong> to make shards of arcana rain down from above. Targets you succeed against take <strong>1d20+2</strong> magic damage for each Stress marked.</p>",
|
"description": "<p class=\"Body-Foundation\">Make a <strong>Spellcast Roll</strong> against all adversaries within Far range. <strong>Mark any number of Stress</strong> to make shards of arcana rain down from above. Targets you succeed against take <strong>1d20+2</strong> magic damage for each Stress marked.</p><p>@Template[type:emanation|range:f]</p>",
|
||||||
"domain": "arcana",
|
"domain": "arcana",
|
||||||
"recallCost": 1,
|
"recallCost": 1,
|
||||||
"level": 10,
|
"level": 10,
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
"type": "attack",
|
"type": "attack",
|
||||||
"_id": "xJfXJDVsBayGaqkr",
|
"_id": "xJfXJDVsBayGaqkr",
|
||||||
"systemPath": "actions",
|
"systemPath": "actions",
|
||||||
"description": "<p>Make a <strong>Spellcast Roll</strong> against all adversaries within Far range. <strong>Mark any number of Stress</strong> to make shards of arcana rain down from above. Targets you succeed against take <strong>1d20+2</strong> magic damage for each Stress marked.</p>",
|
"description": "<p class=\"Body-Foundation\">Make a <strong>Spellcast Roll</strong> against all adversaries within Far range. <strong>Mark any number of Stress</strong> to make shards of arcana rain down from above. Targets you succeed against take <strong>1d20+2</strong> magic damage for each Stress marked.</p><p>@Template[type:emanation|range:f]</p>",
|
||||||
"chatDisplay": true,
|
"chatDisplay": true,
|
||||||
"actionType": "action",
|
"actionType": "action",
|
||||||
"cost": [
|
"cost": [
|
||||||
|
|
@ -103,8 +103,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784452,
|
"createdTime": 1753922784452,
|
||||||
"modifiedTime": 1754254370187,
|
"modifiedTime": 1754501517016,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "hZJp9mdkMnqKDROe",
|
"_id": "hZJp9mdkMnqKDROe",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -28,8 +28,8 @@
|
||||||
],
|
],
|
||||||
"uses": {
|
"uses": {
|
||||||
"value": null,
|
"value": null,
|
||||||
"max": "",
|
"max": "1",
|
||||||
"recovery": null
|
"recovery": "longRest"
|
||||||
},
|
},
|
||||||
"effects": [
|
"effects": [
|
||||||
{
|
{
|
||||||
|
|
@ -56,7 +56,7 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784460,
|
"createdTime": 1753922784460,
|
||||||
"modifiedTime": 1754242182536,
|
"modifiedTime": 1754498928489,
|
||||||
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "SgvjJfMyubZowPxS",
|
"_id": "SgvjJfMyubZowPxS",
|
||||||
|
|
|
||||||
|
|
@ -173,7 +173,8 @@
|
||||||
"value": 1,
|
"value": 1,
|
||||||
"recovery": "longRest",
|
"recovery": "longRest",
|
||||||
"max": "1",
|
"max": "1",
|
||||||
"icon": ""
|
"icon": "",
|
||||||
|
"progression": "decreasing"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"flags": {},
|
"flags": {},
|
||||||
|
|
@ -185,8 +186,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784466,
|
"createdTime": 1753922784466,
|
||||||
"modifiedTime": 1754338717920,
|
"modifiedTime": 1754499077474,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "GlRm1Dxlc0Z1b04o",
|
"_id": "GlRm1Dxlc0Z1b04o",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,8 @@
|
||||||
"value": 0,
|
"value": 0,
|
||||||
"recovery": "longRest",
|
"recovery": "longRest",
|
||||||
"max": "@system.traits.presence.value",
|
"max": "@system.traits.presence.value",
|
||||||
"icon": ""
|
"icon": "",
|
||||||
|
"progression": "decreasing"
|
||||||
},
|
},
|
||||||
"actions": {
|
"actions": {
|
||||||
"5sGMd6m6Ltahit4h": {
|
"5sGMd6m6Ltahit4h": {
|
||||||
|
|
@ -253,8 +254,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784473,
|
"createdTime": 1753922784473,
|
||||||
"modifiedTime": 1754340989544,
|
"modifiedTime": 1754499693699,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "cWu1o82ZF7GvnbXc",
|
"_id": "cWu1o82ZF7GvnbXc",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
"type": "domainCard",
|
"type": "domainCard",
|
||||||
"folder": "7O1tTswJMNdPgLsx",
|
"folder": "7O1tTswJMNdPgLsx",
|
||||||
"system": {
|
"system": {
|
||||||
"description": "<p class=\"Body-Foundation\">Make a <strong>Spellcast Roll</strong> against all targets within Far range. Targets you succeed against become temporarily <em>Enraptured</em>. While <em>Enraptured</em>, a target’s attention is fixed on you, narrowing their field of view and drowning out any sound but your voice. <strong>Mark a Stress</strong> to force all <em>Enraptured</em> targets to mark a Stress, ending this spell.</p>",
|
"description": "<p class=\"Body-Foundation\">Make a <strong>Spellcast Roll</strong> against all targets within Far range. Targets you succeed against become temporarily <em>Enraptured</em>. While <em>Enraptured</em>, a target’s attention is fixed on you, narrowing their field of view and drowning out any sound but your voice. <strong>Mark a Stress</strong> to force all <em>Enraptured</em> targets to mark a Stress, ending this spell.</p><p>@Template[type:emanation|range:f]</p>",
|
||||||
"domain": "grace",
|
"domain": "grace",
|
||||||
"recallCost": 3,
|
"recallCost": 3,
|
||||||
"level": 8,
|
"level": 8,
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
"type": "attack",
|
"type": "attack",
|
||||||
"_id": "r5eA3tAH7EplOQCP",
|
"_id": "r5eA3tAH7EplOQCP",
|
||||||
"systemPath": "actions",
|
"systemPath": "actions",
|
||||||
"description": "<p>Make a <strong>Spellcast Roll</strong> against all targets within Far range. Targets you succeed against become temporarily <em>Enraptured</em>. While <em>Enraptured</em>, a target’s attention is fixed on you, narrowing their field of view and drowning out any sound but your voice.</p>",
|
"description": "<p class=\"Body-Foundation\">Make a <strong>Spellcast Roll</strong> against all targets within Far range. Targets you succeed against become temporarily <em>Enraptured</em>. While <em>Enraptured</em>, a target’s attention is fixed on you, narrowing their field of view and drowning out any sound but your voice. <strong>Mark a Stress</strong> to force all <em>Enraptured</em> targets to mark a Stress, ending this spell.</p><p>@Template[type:emanation|range:f]</p>",
|
||||||
"chatDisplay": true,
|
"chatDisplay": true,
|
||||||
"actionType": "action",
|
"actionType": "action",
|
||||||
"cost": [],
|
"cost": [],
|
||||||
|
|
@ -132,8 +132,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784481,
|
"createdTime": 1753922784481,
|
||||||
"modifiedTime": 1754342040215,
|
"modifiedTime": 1754499825008,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "ubpixIgZrJXKyM3b",
|
"_id": "ubpixIgZrJXKyM3b",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -338,9 +338,10 @@
|
||||||
"resource": {
|
"resource": {
|
||||||
"type": "simple",
|
"type": "simple",
|
||||||
"value": 1,
|
"value": 1,
|
||||||
"recovery": "longRest",
|
"progression": "decreasing",
|
||||||
"max": "1",
|
"max": "1",
|
||||||
"icon": ""
|
"icon": "fa-solid fa-hands-praying",
|
||||||
|
"recovery": "longRest"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"flags": {},
|
"flags": {},
|
||||||
|
|
@ -352,8 +353,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784482,
|
"createdTime": 1753922784482,
|
||||||
"modifiedTime": 1754269394280,
|
"modifiedTime": 1754498631054,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "TGjR4vJVNbQRV8zr",
|
"_id": "TGjR4vJVNbQRV8zr",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
"type": "domainCard",
|
"type": "domainCard",
|
||||||
"folder": "2rqOUxEglhhPKk2j",
|
"folder": "2rqOUxEglhhPKk2j",
|
||||||
"system": {
|
"system": {
|
||||||
"description": "<p class=\"Body-Foundation\">Once per long rest, choose any targets within Very Close range to perceive you as a nightmarish horror. The targets must succeed on a Reaction Roll (16) or become temporarily <em>Horrified</em>. While <em>Horrified</em>, they’re <em>Vulnerable</em>. Steal a number of Fear from the GM equal to the number of targets that are <em>Horrified</em> (up to the number of Fear in the GM’s pool). Roll a number of <strong>d6s</strong> equal to the number of stolen Fear and deal the total damage to each <em>Horrified</em> target. Discard the stolen Fear.</p>",
|
"description": "<p class=\"Body-Foundation\">Once per long rest, choose any targets within Very Close range to perceive you as a nightmarish horror. The targets must succeed on a Reaction Roll (16) or become temporarily <em>Horrified</em>. While <em>Horrified</em>, they’re <em>Vulnerable</em>. Steal a number of Fear from the GM equal to the number of targets that are <em>Horrified</em> (up to the number of Fear in the GM’s pool). Roll a number of <strong>d6s</strong> equal to the number of stolen Fear and deal the total damage to each <em>Horrified</em> target. Discard the stolen Fear.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||||
"domain": "midnight",
|
"domain": "midnight",
|
||||||
"recallCost": 2,
|
"recallCost": 2,
|
||||||
"level": 9,
|
"level": 9,
|
||||||
|
|
@ -14,14 +14,14 @@
|
||||||
"type": "attack",
|
"type": "attack",
|
||||||
"_id": "e4A6GQERsn08IBby",
|
"_id": "e4A6GQERsn08IBby",
|
||||||
"systemPath": "actions",
|
"systemPath": "actions",
|
||||||
"description": "<p>Once per long rest, choose any targets within Very Close range to perceive you as a nightmarish horror. The targets must succeed on a Reaction Roll (16) or become temporarily <em>Horrified</em>. While <em>Horrified</em>, they’re <em>Vulnerable</em>. Steal a number of Fear from the GM equal to the number of targets that are <em>Horrified</em> (up to the number of Fear in the GM’s pool). Roll a number of <strong>d6s</strong> equal to the number of stolen Fear and deal the total damage to each <em>Horrified</em> target. Discard the stolen Fear.</p><p></p>",
|
"description": "<p class=\"Body-Foundation\">Once per long rest, choose any targets within Very Close range to perceive you as a nightmarish horror. The targets must succeed on a Reaction Roll (16) or become temporarily <em>Horrified</em>. While <em>Horrified</em>, they’re <em>Vulnerable</em>. Steal a number of Fear from the GM equal to the number of targets that are <em>Horrified</em> (up to the number of Fear in the GM’s pool). Roll a number of <strong>d6s</strong> equal to the number of stolen Fear and deal the total damage to each <em>Horrified</em> target. Discard the stolen Fear.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||||
"chatDisplay": true,
|
"chatDisplay": true,
|
||||||
"actionType": "action",
|
"actionType": "action",
|
||||||
"cost": [],
|
"cost": [],
|
||||||
"uses": {
|
"uses": {
|
||||||
"value": null,
|
"value": null,
|
||||||
"max": "",
|
"max": "1",
|
||||||
"recovery": null
|
"recovery": "longRest"
|
||||||
},
|
},
|
||||||
"damage": {
|
"damage": {
|
||||||
"parts": [],
|
"parts": [],
|
||||||
|
|
@ -121,12 +121,7 @@
|
||||||
"range": ""
|
"range": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": null
|
||||||
"type": "simple",
|
|
||||||
"value": 0,
|
|
||||||
"max": "",
|
|
||||||
"icon": ""
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"_stats": {
|
"_stats": {
|
||||||
|
|
@ -137,8 +132,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784487,
|
"createdTime": 1753922784487,
|
||||||
"modifiedTime": 1754331219352,
|
"modifiedTime": 1754499654051,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "zcldCuqOg3dphUVI",
|
"_id": "zcldCuqOg3dphUVI",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,8 @@
|
||||||
"uses": {
|
"uses": {
|
||||||
"value": null,
|
"value": null,
|
||||||
"max": "1",
|
"max": "1",
|
||||||
"recovery": "longRest"
|
"recovery": "longRest",
|
||||||
|
"consumeOnSuccess": true
|
||||||
},
|
},
|
||||||
"damage": {
|
"damage": {
|
||||||
"parts": [],
|
"parts": [],
|
||||||
|
|
@ -67,8 +68,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784493,
|
"createdTime": 1753922784493,
|
||||||
"modifiedTime": 1754340285152,
|
"modifiedTime": 1754499238543,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "9a6xP5pxhVvdugk9",
|
"_id": "9a6xP5pxhVvdugk9",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@
|
||||||
"actionType": "action",
|
"actionType": "action",
|
||||||
"cost": [],
|
"cost": [],
|
||||||
"uses": {
|
"uses": {
|
||||||
"value": 1,
|
"value": 0,
|
||||||
"max": "1",
|
"max": "1",
|
||||||
"recovery": "shortRest",
|
"recovery": "shortRest",
|
||||||
"consumeOnSuccess": false
|
"consumeOnSuccess": false
|
||||||
|
|
@ -44,8 +44,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784499,
|
"createdTime": 1753922784499,
|
||||||
"modifiedTime": 1754269219077,
|
"modifiedTime": 1754498645559,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "iYNVTB7uAD1FTCZu",
|
"_id": "iYNVTB7uAD1FTCZu",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
"type": "domainCard",
|
"type": "domainCard",
|
||||||
"folder": "qY4Zqc1Ch6p317uK",
|
"folder": "qY4Zqc1Ch6p317uK",
|
||||||
"system": {
|
"system": {
|
||||||
"description": "<p class=\"Body-Foundation\">Make a <strong>Spellcast Roll (15)</strong>. Once per rest on a success, create a temporary barrier of protective energy around you at Very Close range. You and all allies within the barrier when this spell is cast clear <strong>1d4</strong> Hit Points. While the barrier is up, you and all allies within have resistance to physical damage from outside the barrier.</p><p class=\"Body-Foundation\">When you move, the barrier follows you.</p>",
|
"description": "<p class=\"Body-Foundation\">Make a <strong>Spellcast Roll (15)</strong>. Once per rest on a success, create a temporary barrier of protective energy around you at Very Close range. You and all allies within the barrier when this spell is cast clear <strong>1d4</strong> Hit Points. While the barrier is up, you and all allies within have resistance to physical damage from outside the barrier.</p><p class=\"Body-Foundation\">When you move, the barrier follows you.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||||
"domain": "sage",
|
"domain": "sage",
|
||||||
"recallCost": 1,
|
"recallCost": 1,
|
||||||
"level": 8,
|
"level": 8,
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
"type": "healing",
|
"type": "healing",
|
||||||
"_id": "XdAwXl2uWNinInFe",
|
"_id": "XdAwXl2uWNinInFe",
|
||||||
"systemPath": "actions",
|
"systemPath": "actions",
|
||||||
"description": "<p class=\"Body-Foundation\">Make a <strong>Spellcast Roll (15)</strong>. Once per rest on a success, create a temporary barrier of protective energy around you at Very Close range. You and all allies within the barrier when this spell is cast clear <strong>1d4</strong> Hit Points. While the barrier is up, you and all allies within have resistance to physical damage from outside the barrier.</p><p class=\"Body-Foundation\">When you move, the barrier follows you.</p>",
|
"description": "<p class=\"Body-Foundation\">Make a <strong>Spellcast Roll (15)</strong>. Once per rest on a success, create a temporary barrier of protective energy around you at Very Close range. You and all allies within the barrier when this spell is cast clear <strong>1d4</strong> Hit Points. While the barrier is up, you and all allies within have resistance to physical damage from outside the barrier.</p><p class=\"Body-Foundation\">When you move, the barrier follows you.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||||
"chatDisplay": true,
|
"chatDisplay": true,
|
||||||
"actionType": "action",
|
"actionType": "action",
|
||||||
"cost": [],
|
"cost": [],
|
||||||
|
|
@ -22,7 +22,7 @@
|
||||||
"value": null,
|
"value": null,
|
||||||
"max": "1",
|
"max": "1",
|
||||||
"recovery": "shortRest",
|
"recovery": "shortRest",
|
||||||
"consumeOnSuccess": false
|
"consumeOnSuccess": true
|
||||||
},
|
},
|
||||||
"damage": {
|
"damage": {
|
||||||
"parts": [
|
"parts": [
|
||||||
|
|
@ -93,8 +93,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784502,
|
"createdTime": 1753922784502,
|
||||||
"modifiedTime": 1754339870857,
|
"modifiedTime": 1754499308449,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "HtWx5IIemCoorMj2",
|
"_id": "HtWx5IIemCoorMj2",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,8 @@
|
||||||
"value": 0,
|
"value": 0,
|
||||||
"recovery": "longRest",
|
"recovery": "longRest",
|
||||||
"max": "@cast",
|
"max": "@cast",
|
||||||
"icon": ""
|
"icon": "",
|
||||||
|
"progression": "decreasing"
|
||||||
},
|
},
|
||||||
"actions": {
|
"actions": {
|
||||||
"udmHKUtCDClxeB4h": {
|
"udmHKUtCDClxeB4h": {
|
||||||
|
|
@ -214,8 +215,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784502,
|
"createdTime": 1753922784502,
|
||||||
"modifiedTime": 1754269768509,
|
"modifiedTime": 1754498742091,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "wUQFsRtww18naYaq",
|
"_id": "wUQFsRtww18naYaq",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
"type": "domainCard",
|
"type": "domainCard",
|
||||||
"folder": "Abn46nCQst6kpGeA",
|
"folder": "Abn46nCQst6kpGeA",
|
||||||
"system": {
|
"system": {
|
||||||
"description": "<p class=\"Body-Foundation\">Make a <strong>Spellcast Roll</strong> against all adversaries within Very Close range. Targets you succeed against are temporarily <em>Restrained</em> as their shadow binds them in place.</p>",
|
"description": "<p class=\"Body-Foundation\">Make a <strong>Spellcast Roll</strong> against all adversaries within Very Close range. Targets you succeed against are temporarily <em>Restrained</em> as their shadow binds them in place.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||||
"domain": "midnight",
|
"domain": "midnight",
|
||||||
"recallCost": 0,
|
"recallCost": 0,
|
||||||
"level": 2,
|
"level": 2,
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
"type": "attack",
|
"type": "attack",
|
||||||
"_id": "Llr9uIDUCrfsiZNn",
|
"_id": "Llr9uIDUCrfsiZNn",
|
||||||
"systemPath": "actions",
|
"systemPath": "actions",
|
||||||
"description": "<p><span style=\"color: rgb(239, 230, 216); font-family: Montserrat, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgba(24, 22, 46, 0.376); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none\">Make a </span><span class=\"tooltip-convert\" style=\"box-sizing: border-box; scrollbar-width: thin; scrollbar-color: rgb(93, 20, 43) rgba(0, 0, 0, 0); color: rgb(239, 230, 216); font-family: Montserrat, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgba(24, 22, 46, 0.376); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial\"><strong style=\"box-sizing: border-box; scrollbar-width: thin; scrollbar-color: rgb(93, 20, 43) rgba(0, 0, 0, 0);\">Spellcast Roll</strong></span><span style=\"color: rgb(239, 230, 216); font-family: Montserrat, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgba(24, 22, 46, 0.376); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none\"> against all adversaries within </span><span class=\"tooltip-convert\" style=\"box-sizing: border-box; scrollbar-width: thin; scrollbar-color: rgb(93, 20, 43) rgba(0, 0, 0, 0); color: rgb(239, 230, 216); font-family: Montserrat, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgba(24, 22, 46, 0.376); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial\">Very Close</span><span style=\"color: rgb(239, 230, 216); font-family: Montserrat, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgba(24, 22, 46, 0.376); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none\"> range. Targets you succeed against are temporarily </span><span class=\"tooltip-convert\" style=\"box-sizing: border-box; scrollbar-width: thin; scrollbar-color: rgb(93, 20, 43) rgba(0, 0, 0, 0); color: rgb(239, 230, 216); font-family: Montserrat, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgba(24, 22, 46, 0.376); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial\"><em style=\"box-sizing: border-box; scrollbar-width: thin; scrollbar-color: rgb(93, 20, 43) rgba(0, 0, 0, 0);\">Restrained</em> </span><span style=\"color: rgb(239, 230, 216); font-family: Montserrat, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgba(24, 22, 46, 0.376); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none\">as their shadow binds them in place.</span></p>",
|
"description": "<p class=\"Body-Foundation\">Make a <strong>Spellcast Roll</strong> against all adversaries within Very Close range. Targets you succeed against are temporarily <em>Restrained</em> as their shadow binds them in place.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||||
"chatDisplay": true,
|
"chatDisplay": true,
|
||||||
"actionType": "action",
|
"actionType": "action",
|
||||||
"cost": [],
|
"cost": [],
|
||||||
|
|
@ -72,8 +72,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784512,
|
"createdTime": 1753922784512,
|
||||||
"modifiedTime": 1754330643864,
|
"modifiedTime": 1754499502570,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "kguhWlidhxe2GbT0",
|
"_id": "kguhWlidhxe2GbT0",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,31 @@
|
||||||
"recallCost": 0,
|
"recallCost": 0,
|
||||||
"level": 6,
|
"level": 6,
|
||||||
"type": "spell",
|
"type": "spell",
|
||||||
"actions": {}
|
"actions": {
|
||||||
|
"MjSx44ovuKBGVKGs": {
|
||||||
|
"type": "effect",
|
||||||
|
"_id": "MjSx44ovuKBGVKGs",
|
||||||
|
"systemPath": "actions",
|
||||||
|
"description": "<p class=\"Body-Foundation\">Once per rest, take on the Stress from a willing creature within Melee range. The target describes what intimate knowledge or emotions telepathically leak from their mind in this moment between you. Transfer any number of their marked Stress to you, then gain a Hope for each Stress transferred.</p>",
|
||||||
|
"chatDisplay": true,
|
||||||
|
"actionType": "action",
|
||||||
|
"cost": [],
|
||||||
|
"uses": {
|
||||||
|
"value": null,
|
||||||
|
"max": "1",
|
||||||
|
"recovery": "shortRest",
|
||||||
|
"consumeOnSuccess": false
|
||||||
|
},
|
||||||
|
"effects": [],
|
||||||
|
"target": {
|
||||||
|
"type": "any",
|
||||||
|
"amount": null
|
||||||
|
},
|
||||||
|
"name": "Take Stress",
|
||||||
|
"img": "systems/daggerheart/assets/icons/domains/domain-card/grace.png",
|
||||||
|
"range": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"_stats": {
|
"_stats": {
|
||||||
|
|
@ -20,8 +44,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784515,
|
"createdTime": 1753922784515,
|
||||||
"modifiedTime": 1754327488946,
|
"modifiedTime": 1754499760780,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "8nRle10pw1HO8QVu",
|
"_id": "8nRle10pw1HO8QVu",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -29,8 +29,8 @@
|
||||||
],
|
],
|
||||||
"uses": {
|
"uses": {
|
||||||
"value": null,
|
"value": null,
|
||||||
"max": "",
|
"max": "1",
|
||||||
"recovery": null,
|
"recovery": "shortRest",
|
||||||
"consumeOnSuccess": false
|
"consumeOnSuccess": false
|
||||||
},
|
},
|
||||||
"effects": [
|
"effects": [
|
||||||
|
|
@ -58,8 +58,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784519,
|
"createdTime": 1753922784519,
|
||||||
"modifiedTime": 1754269704377,
|
"modifiedTime": 1754498725946,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "U1uWJE94HZVudujz",
|
"_id": "U1uWJE94HZVudujz",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,9 @@
|
||||||
"level": 9,
|
"level": 9,
|
||||||
"type": "ability",
|
"type": "ability",
|
||||||
"actions": {
|
"actions": {
|
||||||
"B4vyaTibK0GiRBCW": {
|
"yjEcSlzsWGX79gpB": {
|
||||||
"type": "effect",
|
"type": "attack",
|
||||||
"_id": "B4vyaTibK0GiRBCW",
|
"_id": "yjEcSlzsWGX79gpB",
|
||||||
"systemPath": "actions",
|
"systemPath": "actions",
|
||||||
"description": "<p class=\"Body-Foundation\"><strong>Spend a Hope</strong> and make an attack against all adversaries within your weapon’s range. Once per long rest, on a success against any targets, add up the damage dealt, then redistribute that damage however you wish between the targets you succeeded against. When you deal damage to a target, roll an additional damage die and add its result to the damage you deal to that target.</p>",
|
"description": "<p class=\"Body-Foundation\"><strong>Spend a Hope</strong> and make an attack against all adversaries within your weapon’s range. Once per long rest, on a success against any targets, add up the damage dealt, then redistribute that damage however you wish between the targets you succeeded against. When you deal damage to a target, roll an additional damage die and add its result to the damage you deal to that target.</p>",
|
||||||
"chatDisplay": true,
|
"chatDisplay": true,
|
||||||
|
|
@ -29,15 +29,39 @@
|
||||||
],
|
],
|
||||||
"uses": {
|
"uses": {
|
||||||
"value": null,
|
"value": null,
|
||||||
"max": "",
|
"max": "1",
|
||||||
"recovery": null,
|
"recovery": "longRest",
|
||||||
"consumeOnSuccess": false
|
"consumeOnSuccess": true
|
||||||
|
},
|
||||||
|
"damage": {
|
||||||
|
"parts": [],
|
||||||
|
"includeBase": false
|
||||||
},
|
},
|
||||||
"effects": [],
|
|
||||||
"target": {
|
"target": {
|
||||||
"type": "any",
|
"type": "any",
|
||||||
"amount": null
|
"amount": null
|
||||||
},
|
},
|
||||||
|
"effects": [],
|
||||||
|
"roll": {
|
||||||
|
"type": "attack",
|
||||||
|
"trait": null,
|
||||||
|
"difficulty": null,
|
||||||
|
"bonus": null,
|
||||||
|
"advState": "neutral",
|
||||||
|
"diceRolling": {
|
||||||
|
"multiplier": "prof",
|
||||||
|
"flatMultiplier": 1,
|
||||||
|
"dice": "d6",
|
||||||
|
"compare": null,
|
||||||
|
"treshold": null
|
||||||
|
},
|
||||||
|
"useDefault": false
|
||||||
|
},
|
||||||
|
"save": {
|
||||||
|
"trait": null,
|
||||||
|
"difficulty": null,
|
||||||
|
"damageMod": "none"
|
||||||
|
},
|
||||||
"name": "Spend Hope",
|
"name": "Spend Hope",
|
||||||
"img": "icons/skills/melee/strike-sword-steel-yellow.webp",
|
"img": "icons/skills/melee/strike-sword-steel-yellow.webp",
|
||||||
"range": ""
|
"range": ""
|
||||||
|
|
@ -53,7 +77,7 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784522,
|
"createdTime": 1753922784522,
|
||||||
"modifiedTime": 1754252510860,
|
"modifiedTime": 1754501075258,
|
||||||
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "TYKfM3H9vBXyWiH4",
|
"_id": "TYKfM3H9vBXyWiH4",
|
||||||
|
|
|
||||||
|
|
@ -11,10 +11,11 @@
|
||||||
"type": "ability",
|
"type": "ability",
|
||||||
"resource": {
|
"resource": {
|
||||||
"type": "simple",
|
"type": "simple",
|
||||||
"value": 1,
|
"value": 0,
|
||||||
"max": "",
|
"max": "max(@system.traits.knowledge.value, 1)",
|
||||||
"icon": "fa-solid fa-bullseye",
|
"icon": "fa-solid fa-bullseye",
|
||||||
"recovery": "longRest"
|
"recovery": "longRest",
|
||||||
|
"progression": "decreasing"
|
||||||
},
|
},
|
||||||
"actions": {
|
"actions": {
|
||||||
"jTC0GbsBpGmaQLi7": {
|
"jTC0GbsBpGmaQLi7": {
|
||||||
|
|
@ -60,7 +61,7 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784523,
|
"createdTime": 1753922784523,
|
||||||
"modifiedTime": 1754249661976,
|
"modifiedTime": 1754501630846,
|
||||||
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "5b1awkgTmMp3FVrm",
|
"_id": "5b1awkgTmMp3FVrm",
|
||||||
|
|
|
||||||
|
|
@ -108,16 +108,17 @@
|
||||||
"cost": [
|
"cost": [
|
||||||
{
|
{
|
||||||
"scalable": false,
|
"scalable": false,
|
||||||
"key": "n0P3VS1WfxvmXbB6",
|
"key": "hitPoints",
|
||||||
"value": 1,
|
"value": 1,
|
||||||
"keyIsID": true,
|
"keyIsID": false,
|
||||||
"step": null
|
"step": null,
|
||||||
|
"consumeOnSuccess": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"uses": {
|
"uses": {
|
||||||
"value": null,
|
"value": null,
|
||||||
"max": "",
|
"max": "1",
|
||||||
"recovery": null
|
"recovery": "shortRest"
|
||||||
},
|
},
|
||||||
"effects": [],
|
"effects": [],
|
||||||
"target": {
|
"target": {
|
||||||
|
|
@ -129,13 +130,7 @@
|
||||||
"range": ""
|
"range": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": null
|
||||||
"type": "simple",
|
|
||||||
"value": 1,
|
|
||||||
"recovery": "shortRest",
|
|
||||||
"max": "1",
|
|
||||||
"icon": ""
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"_stats": {
|
"_stats": {
|
||||||
|
|
@ -146,8 +141,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784534,
|
"createdTime": 1753922784534,
|
||||||
"modifiedTime": 1754338673637,
|
"modifiedTime": 1754499113867,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "n0P3VS1WfxvmXbB6",
|
"_id": "n0P3VS1WfxvmXbB6",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,8 @@
|
||||||
"value": 0,
|
"value": 0,
|
||||||
"max": "@cast",
|
"max": "@cast",
|
||||||
"icon": "",
|
"icon": "",
|
||||||
"recovery": "session"
|
"recovery": "session",
|
||||||
|
"progression": "decreasing"
|
||||||
},
|
},
|
||||||
"actions": {
|
"actions": {
|
||||||
"MWvrKuwejWcQm7N1": {
|
"MWvrKuwejWcQm7N1": {
|
||||||
|
|
@ -143,8 +144,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784537,
|
"createdTime": 1753922784537,
|
||||||
"modifiedTime": 1754253370819,
|
"modifiedTime": 1754501257508,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "o62i0QdbUDIiAhSq",
|
"_id": "o62i0QdbUDIiAhSq",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@
|
||||||
"type": "effect",
|
"type": "effect",
|
||||||
"_id": "nYu6LRNVDKfWUJhx",
|
"_id": "nYu6LRNVDKfWUJhx",
|
||||||
"systemPath": "actions",
|
"systemPath": "actions",
|
||||||
"description": "",
|
"description": "<p class=\"Body-Foundation\">Once per long rest, <strong>mark a Stress</strong> to channel the natural world around you and enhance yourself. Describe how your appearance changes, then place a <strong>d6</strong> on this card with the 1 value facing up.</p><p class=\"Body-Foundation\">While the Wild Surge Die is active, you add its value to every action roll you make. After you add its value to a roll, increase the Wild Surge Die’s value by one. When the die’s value would exceed 6 or you take a rest, this form drops and you must <strong>mark an additional Stress</strong>.</p>",
|
||||||
"chatDisplay": true,
|
"chatDisplay": true,
|
||||||
"actionType": "action",
|
"actionType": "action",
|
||||||
"cost": [
|
"cost": [
|
||||||
|
|
@ -34,8 +34,8 @@
|
||||||
],
|
],
|
||||||
"uses": {
|
"uses": {
|
||||||
"value": null,
|
"value": null,
|
||||||
"max": "",
|
"max": "1",
|
||||||
"recovery": null
|
"recovery": "longRest"
|
||||||
},
|
},
|
||||||
"effects": [],
|
"effects": [],
|
||||||
"target": {
|
"target": {
|
||||||
|
|
@ -57,8 +57,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784547,
|
"createdTime": 1753922784547,
|
||||||
"modifiedTime": 1754340095871,
|
"modifiedTime": 1754499199811,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "DjnKlZQYaWdQGKcK",
|
"_id": "DjnKlZQYaWdQGKcK",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
"type": "domainCard",
|
"type": "domainCard",
|
||||||
"folder": "OwsbTSWzKq2WJmQN",
|
"folder": "OwsbTSWzKq2WJmQN",
|
||||||
"system": {
|
"system": {
|
||||||
"description": "<p class=\"Body-Foundation\">Make a <strong>Spellcast Roll (16)</strong>. Once per long rest on a success, choose a point within Far range and create a visible zone of protection there for all allies within Very Close range of that point. When you do, place a <strong>d6</strong> on this card with the 1 value facing up. When an ally in this zone takes damage, they reduce it by the die’s value. You then increase the die’s value by one. When the die’s value would exceed 6, this effect ends.</p><p></p><p><span style=\"color:oklab(0.952331 0.000418991 -0.00125992);font-family:'gg mono', 'Source Code Pro', Consolas, 'Andale Mono WT', 'Andale Mono', 'Lucida Console', 'Lucida Sans Typewriter', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Liberation Mono', 'Nimbus Mono L', Monaco, 'Courier New', Courier, monospace;font-size:13.6px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:left;text-indent:0px;text-transform:none;widows:2;word-spacing:0px;-webkit-text-stroke-width:0px;white-space:pre-wrap;background-color:oklab(0.57738 0.0140701 -0.208587 / 0.0784314);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;display:inline !important;float:none\">@Template[type:emanation|range:vc]</span></p>",
|
"description": "<p class=\"Body-Foundation\">Make a <strong>Spellcast Roll (16)</strong>. Once per long rest on a success, choose a point within Far range and create a visible zone of protection there for all allies within Very Close range of that point. When you do, place a <strong>d6</strong> on this card with the 1 value facing up. When an ally in this zone takes damage, they reduce it by the die’s value. You then increase the die’s value by one. When the die’s value would exceed 6, this effect ends.</p><p><span style=\"color:oklab(0.952331 0.000418991 -0.00125992);font-family:'gg mono', 'Source Code Pro', Consolas, 'Andale Mono WT', 'Andale Mono', 'Lucida Console', 'Lucida Sans Typewriter', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Liberation Mono', 'Nimbus Mono L', Monaco, 'Courier New', Courier, monospace;font-size:13.6px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:left;text-indent:0px;text-transform:none;widows:2;word-spacing:0px;-webkit-text-stroke-width:0px;white-space:pre-wrap;background-color:oklab(0.57738 0.0140701 -0.208587 / 0.0784314);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;display:inline !important;float:none\">@Template[type:emanation|range:vc]</span></p>",
|
||||||
"domain": "splendor",
|
"domain": "splendor",
|
||||||
"recallCost": 2,
|
"recallCost": 2,
|
||||||
"level": 6,
|
"level": 6,
|
||||||
|
|
@ -58,13 +58,7 @@
|
||||||
"range": "far"
|
"range": "far"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resource": {
|
"resource": null
|
||||||
"type": "simple",
|
|
||||||
"value": 0,
|
|
||||||
"max": "6",
|
|
||||||
"icon": "",
|
|
||||||
"recovery": "longRest"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"_stats": {
|
"_stats": {
|
||||||
|
|
@ -75,8 +69,8 @@
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"createdTime": 1753922784549,
|
"createdTime": 1753922784549,
|
||||||
"modifiedTime": 1754269795161,
|
"modifiedTime": 1754498786877,
|
||||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||||
},
|
},
|
||||||
"_id": "lOZaRb4fCVgQsWB5",
|
"_id": "lOZaRb4fCVgQsWB5",
|
||||||
"sort": 3400000,
|
"sort": 3400000,
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
"sorting": "a",
|
"sorting": "a",
|
||||||
"_id": "pPzU9WOQNv3ckO1w",
|
"_id": "pPzU9WOQNv3ckO1w",
|
||||||
"description": "",
|
"description": "",
|
||||||
"sort": 1000000,
|
"sort": 2000000,
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"_stats": {
|
"_stats": {
|
||||||
"compendiumSource": null,
|
"compendiumSource": null,
|
||||||
|
|
@ -15,8 +15,8 @@
|
||||||
"coreVersion": "13.346",
|
"coreVersion": "13.346",
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"lastModifiedBy": "YNJ4HgHtFrTI89mx",
|
"lastModifiedBy": "MQSznptE5yLT7kj8",
|
||||||
"modifiedTime": 1752681545540
|
"modifiedTime": 1754499337594
|
||||||
},
|
},
|
||||||
"_key": "!folders!pPzU9WOQNv3ckO1w"
|
"_key": "!folders!pPzU9WOQNv3ckO1w"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
"sorting": "a",
|
"sorting": "a",
|
||||||
"_id": "EJoXzO85rG5EiZsh",
|
"_id": "EJoXzO85rG5EiZsh",
|
||||||
"description": "",
|
"description": "",
|
||||||
"sort": 100000,
|
"sort": 1100000,
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"_stats": {
|
"_stats": {
|
||||||
"compendiumSource": null,
|
"compendiumSource": null,
|
||||||
|
|
@ -15,8 +15,8 @@
|
||||||
"coreVersion": "13.346",
|
"coreVersion": "13.346",
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"lastModifiedBy": "YNJ4HgHtFrTI89mx",
|
"lastModifiedBy": "MQSznptE5yLT7kj8",
|
||||||
"modifiedTime": 1752681545540
|
"modifiedTime": 1754499330683
|
||||||
},
|
},
|
||||||
"_key": "!folders!EJoXzO85rG5EiZsh"
|
"_key": "!folders!EJoXzO85rG5EiZsh"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
"sorting": "a",
|
"sorting": "a",
|
||||||
"_id": "xZrCYAd05ayNu1yW",
|
"_id": "xZrCYAd05ayNu1yW",
|
||||||
"description": "",
|
"description": "",
|
||||||
"sort": 200000,
|
"sort": 1200000,
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"_stats": {
|
"_stats": {
|
||||||
"compendiumSource": null,
|
"compendiumSource": null,
|
||||||
|
|
@ -15,8 +15,8 @@
|
||||||
"coreVersion": "13.346",
|
"coreVersion": "13.346",
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"lastModifiedBy": "YNJ4HgHtFrTI89mx",
|
"lastModifiedBy": "MQSznptE5yLT7kj8",
|
||||||
"modifiedTime": 1752681545540
|
"modifiedTime": 1754499331503
|
||||||
},
|
},
|
||||||
"_key": "!folders!xZrCYAd05ayNu1yW"
|
"_key": "!folders!xZrCYAd05ayNu1yW"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
"sorting": "a",
|
"sorting": "a",
|
||||||
"_id": "uXGugK72AffddFdH",
|
"_id": "uXGugK72AffddFdH",
|
||||||
"description": "",
|
"description": "",
|
||||||
"sort": 300000,
|
"sort": 1300000,
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"_stats": {
|
"_stats": {
|
||||||
"compendiumSource": null,
|
"compendiumSource": null,
|
||||||
|
|
@ -15,8 +15,8 @@
|
||||||
"coreVersion": "13.346",
|
"coreVersion": "13.346",
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"lastModifiedBy": "YNJ4HgHtFrTI89mx",
|
"lastModifiedBy": "MQSznptE5yLT7kj8",
|
||||||
"modifiedTime": 1752681545540
|
"modifiedTime": 1754499332151
|
||||||
},
|
},
|
||||||
"_key": "!folders!uXGugK72AffddFdH"
|
"_key": "!folders!uXGugK72AffddFdH"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
"sorting": "a",
|
"sorting": "a",
|
||||||
"_id": "BJIiOIWAQUz5zuqo",
|
"_id": "BJIiOIWAQUz5zuqo",
|
||||||
"description": "",
|
"description": "",
|
||||||
"sort": 400000,
|
"sort": 1400000,
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"_stats": {
|
"_stats": {
|
||||||
"compendiumSource": null,
|
"compendiumSource": null,
|
||||||
|
|
@ -15,8 +15,8 @@
|
||||||
"coreVersion": "13.346",
|
"coreVersion": "13.346",
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"lastModifiedBy": "YNJ4HgHtFrTI89mx",
|
"lastModifiedBy": "MQSznptE5yLT7kj8",
|
||||||
"modifiedTime": 1752681545540
|
"modifiedTime": 1754499332813
|
||||||
},
|
},
|
||||||
"_key": "!folders!BJIiOIWAQUz5zuqo"
|
"_key": "!folders!BJIiOIWAQUz5zuqo"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
"sorting": "a",
|
"sorting": "a",
|
||||||
"_id": "ZZHIbaynhzVArA1p",
|
"_id": "ZZHIbaynhzVArA1p",
|
||||||
"description": "",
|
"description": "",
|
||||||
"sort": 500000,
|
"sort": 1500000,
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"_stats": {
|
"_stats": {
|
||||||
"compendiumSource": null,
|
"compendiumSource": null,
|
||||||
|
|
@ -15,8 +15,8 @@
|
||||||
"coreVersion": "13.346",
|
"coreVersion": "13.346",
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"lastModifiedBy": "YNJ4HgHtFrTI89mx",
|
"lastModifiedBy": "MQSznptE5yLT7kj8",
|
||||||
"modifiedTime": 1752681545540
|
"modifiedTime": 1754499333460
|
||||||
},
|
},
|
||||||
"_key": "!folders!ZZHIbaynhzVArA1p"
|
"_key": "!folders!ZZHIbaynhzVArA1p"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
"sorting": "a",
|
"sorting": "a",
|
||||||
"_id": "u5Lq2kfC8LlDAGDC",
|
"_id": "u5Lq2kfC8LlDAGDC",
|
||||||
"description": "",
|
"description": "",
|
||||||
"sort": 550000,
|
"sort": 1600000,
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"_stats": {
|
"_stats": {
|
||||||
"compendiumSource": null,
|
"compendiumSource": null,
|
||||||
|
|
@ -15,8 +15,8 @@
|
||||||
"coreVersion": "13.346",
|
"coreVersion": "13.346",
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"lastModifiedBy": "YNJ4HgHtFrTI89mx",
|
"lastModifiedBy": "MQSznptE5yLT7kj8",
|
||||||
"modifiedTime": 1752681547474
|
"modifiedTime": 1754499335115
|
||||||
},
|
},
|
||||||
"_key": "!folders!u5Lq2kfC8LlDAGDC"
|
"_key": "!folders!u5Lq2kfC8LlDAGDC"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
"sorting": "a",
|
"sorting": "a",
|
||||||
"_id": "gEVGjjPrjqxxZkb5",
|
"_id": "gEVGjjPrjqxxZkb5",
|
||||||
"description": "",
|
"description": "",
|
||||||
"sort": 575000,
|
"sort": 1700000,
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"_stats": {
|
"_stats": {
|
||||||
"compendiumSource": null,
|
"compendiumSource": null,
|
||||||
|
|
@ -15,8 +15,8 @@
|
||||||
"coreVersion": "13.346",
|
"coreVersion": "13.346",
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"lastModifiedBy": "YNJ4HgHtFrTI89mx",
|
"lastModifiedBy": "MQSznptE5yLT7kj8",
|
||||||
"modifiedTime": 1752681548701
|
"modifiedTime": 1754499335821
|
||||||
},
|
},
|
||||||
"_key": "!folders!gEVGjjPrjqxxZkb5"
|
"_key": "!folders!gEVGjjPrjqxxZkb5"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
"sorting": "a",
|
"sorting": "a",
|
||||||
"_id": "qY4Zqc1Ch6p317uK",
|
"_id": "qY4Zqc1Ch6p317uK",
|
||||||
"description": "",
|
"description": "",
|
||||||
"sort": 587500,
|
"sort": 1800000,
|
||||||
"flags": {},
|
"flags": {},
|
||||||
"_stats": {
|
"_stats": {
|
||||||
"compendiumSource": null,
|
"compendiumSource": null,
|
||||||
|
|
@ -15,8 +15,8 @@
|
||||||
"coreVersion": "13.346",
|
"coreVersion": "13.346",
|
||||||
"systemId": "daggerheart",
|
"systemId": "daggerheart",
|
||||||
"systemVersion": "0.0.1",
|
"systemVersion": "0.0.1",
|
||||||
"lastModifiedBy": "YNJ4HgHtFrTI89mx",
|
"lastModifiedBy": "MQSznptE5yLT7kj8",
|
||||||
"modifiedTime": 1752681549490
|
"modifiedTime": 1754499336356
|
||||||
},
|
},
|
||||||
"_key": "!folders!qY4Zqc1Ch6p317uK"
|
"_key": "!folders!qY4Zqc1Ch6p317uK"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue