Merged with development

This commit is contained in:
WBHarry 2025-11-10 16:31:02 +01:00
commit df0ed5dc0f
44 changed files with 382 additions and 256 deletions

View file

@ -443,6 +443,10 @@
"retrievePartyTokens": "Retrieve Party Tokens"
}
},
"ImageSelect": {
"title": "Select Image",
"selectImage": "Select Image"
},
"Levelup": {
"actions": {
"creatureComfort": {

View file

@ -5,6 +5,7 @@ export { default as DamageDialog } from './damageDialog.mjs';
export { default as DamageReductionDialog } from './damageReductionDialog.mjs';
export { default as DeathMove } from './deathMove.mjs';
export { default as Downtime } from './downtime.mjs';
export { default as ImageSelectDialog } from './imageSelectDialog.mjs';
export { default as MulticlassChoiceDialog } from './multiclassChoiceDialog.mjs';
export { default as OwnershipSelection } from './ownershipSelection.mjs';
export { default as RerollDamageDialog } from './rerollDamageDialog.mjs';

View file

@ -276,7 +276,22 @@ export default class BeastformDialog extends HandlebarsApplicationMixin(Applicat
const featureItem = item;
app.addEventListener(
'close',
() => resolve({ selected: app.selected, evolved: app.evolved, hybrid: app.hybrid, item: featureItem }),
async () => {
const selected = app.selected.toObject();
const data = await game.system.api.data.items.DHBeastform.getWildcardImage(
app.configData.data.parent,
app.selected
);
if (data) {
if (!data.selectedImage) selected = null;
else {
if (data.usesDynamicToken) selected.system.tokenRingImg = data.selectedImage;
else selected.system.tokenImg = data.selectedImage;
}
}
resolve({ selected: selected, evolved: app.evolved, hybrid: app.hybrid, item: featureItem });
},
{ once: true }
);
app.render({ force: true });

View file

@ -0,0 +1,67 @@
const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;
export default class ImageSelectDialog extends HandlebarsApplicationMixin(ApplicationV2) {
constructor(titleName, images) {
super();
this.titleName = titleName;
this.images = images;
}
static DEFAULT_OPTIONS = {
tag: 'form',
classes: ['daggerheart', 'dialog', 'dh-style', 'image-select'],
position: {
width: 600,
height: 'auto'
},
window: {
icon: 'fa-solid fa-paw'
},
actions: {
selectImage: ImageSelectDialog.#selectImage,
finishSelection: ImageSelectDialog.#finishSelection
}
};
get title() {
return this.titleName;
}
/** @override */
static PARTS = {
main: { template: 'systems/daggerheart/templates/dialogs/image-select/main.hbs' },
footer: { template: 'systems/daggerheart/templates/dialogs/image-select/footer.hbs' }
};
async _prepareContext(_options) {
const context = await super._prepareContext(_options);
context.images = this.images;
context.selectedImage = this.selectedImage;
return context;
}
static #selectImage(_event, button) {
this.selectedImage = button.dataset.image ?? button.querySelector('img').dataset.image;
this.render();
}
static #finishSelection() {
this.close({ submitted: true });
}
async close(options = {}) {
if (!options.submitted) this.selectedImage = null;
await super.close();
}
static async configure(title, images) {
return new Promise(resolve => {
const app = new this(title, images);
app.addEventListener('close', () => resolve(app.selectedImage), { once: true });
app.render({ force: true });
});
}
}

View file

@ -888,6 +888,23 @@ export default class CharacterSheet extends DHBaseActorSheet {
itemData.system.inVault = true;
}
if (item.type === 'beastform') {
if (this.document.effects.find(x => x.type === 'beastform')) {
return ui.notifications.warn(
game.i18n.localize('DAGGERHEART.UI.Notifications.beastformAlreadyApplied')
);
}
const data = await game.system.api.data.items.DHBeastform.getWildcardImage(this.document, itemData);
if (data) {
if (!data.selectedImage) return;
else {
if (data.usesDynamicToken) itemData.system.tokenRingImg = data.selectedImage;
else itemData.system.tokenImg = data.selectedImage;
}
}
}
if (this.document.uuid === item.parent?.uuid) return this._onSortItem(event, itemData);
const createdItem = await this._onDropItemCreate(itemData);

View file

@ -166,11 +166,16 @@ export const healingTypes = {
export const defeatedConditions = () => {
const defeated = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).defeated;
return Object.values(defeatedConditionChoices).map(x => ({
...x,
img: defeated[`${x.id}Icon`],
description: `DAGGERHEART.CONFIG.Condition.${x.id}.description`
}));
return Object.keys(defeatedConditionChoices).reduce((acc, key) => {
const choice = defeatedConditionChoices[key];
acc[key] = {
...choice,
img: defeated[`${choice.id}Icon`],
description: `DAGGERHEART.CONFIG.Condition.${choice.id}.description`
};
return acc;
}, {});
};
const defeatedConditionChoices = {

View file

@ -79,7 +79,7 @@ export default class BeastformField extends fields.SchemaField {
* @returns
*/
static async transform(selectedForm, evolvedData, hybridData) {
const formData = evolvedData?.form ? evolvedData.form.toObject() : selectedForm.toObject();
const formData = evolvedData?.form ? evolvedData.form.toObject() : selectedForm;
const beastformEffect = formData.effects.find(x => x.type === 'beastform');
if (!beastformEffect) {
ui.notifications.error('DAGGERHEART.UI.Notifications.beastformMissingEffect');

View file

@ -85,7 +85,7 @@ export default class DamageField extends fields.SchemaField {
const targetDamage = [];
const damagePromises = [];
for (let target of targets) {
const actor = fromUuidSync(target.actorId);
const actor = foundry.utils.fromUuidSync(target.actorId);
if (!actor) continue;
if (!config.hasHealing && config.onSave && target.saved?.success === true) {
const mod = CONFIG.DH.ACTIONS.damageOnSave[config.onSave]?.mod ?? 1;
@ -98,17 +98,16 @@ export default class DamageField extends fields.SchemaField {
});
}
const token = game.scenes.find(x => x.active).tokens.find(x => x.id === target.id);
if (config.hasHealing)
damagePromises.push(
actor
.takeHealing(config.damage)
.then(updates => targetDamage.push({ token: actor.token ?? actor.prototypeToken, updates }))
actor.takeHealing(config.damage).then(updates => targetDamage.push({ token, updates }))
);
else
damagePromises.push(
actor
.takeDamage(config.damage, config.isDirect)
.then(updates => targetDamage.push({ token: actor.token ?? actor.prototypeToken, updates }))
.then(updates => targetDamage.push({ token, updates }))
);
}

View file

@ -33,11 +33,13 @@ export default class DHBeastform extends BaseDataItem {
tokenImg: new fields.FilePathField({
initial: 'icons/svg/mystery-man.svg',
categories: ['IMAGE'],
wildcard: true,
base64: false
}),
tokenRingImg: new fields.FilePathField({
initial: 'icons/svg/mystery-man.svg',
categories: ['IMAGE'],
wildcard: true,
base64: false
}),
tokenSize: new fields.SchemaField({
@ -108,6 +110,30 @@ export default class DHBeastform extends BaseDataItem {
};
}
static async getWildcardImage(actor, beastform) {
const usesDynamicToken = actor.prototypeToken.ring.enabled && beastform.system.tokenRingImg;
const tokenPath = usesDynamicToken ? beastform.system.tokenRingImg : beastform.system.tokenImg;
const usesWildcard = tokenPath.includes('*');
if (usesWildcard) {
const filePicker = new foundry.applications.apps.FilePicker.implementation(tokenPath);
const { files } = await foundry.applications.apps.FilePicker.implementation.browse(
filePicker.activeSource,
tokenPath,
{
wildcard: true,
type: 'image'
}
);
const selectedImage = await game.system.api.applications.dialogs.ImageSelectDialog.configure(
game.i18n.localize('DAGGERHEART.APPLICATIONS.ImageSelect.title'),
files
);
return { usesDynamicToken, selectedImage };
}
return null;
}
async _preCreate() {
if (!this.actor) return;

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "normal",
"tier": 1,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/mammals/rodent-rat-diseaed-gray.webp",
"tokenRingImg": "icons/creatures/mammals/rodent-rat-diseaed-gray.webp",
"tokenSize": {
"height": null,
"width": null
@ -125,12 +125,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753570913893,
"modifiedTime": 1755395235599,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762786932553,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "a9UoCwtrbgKk02mK",
"sort": 500000,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "normal",
"tier": 3,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/fish/fish-marlin-swordfight-blue.webp",
"tokenRingImg": "icons/creatures/fish/fish-marlin-swordfight-blue.webp",
"tokenSize": {
"height": null,
"width": null
@ -130,12 +130,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753626985883,
"modifiedTime": 1755395436609,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762787103412,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "ItBVeCl2u5uetgy7",
"sort": 0,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "normal",
"tier": 1,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/tentacles/tentacles-octopus-black-pink.webp",
"tokenRingImg": "icons/creatures/tentacles/tentacles-octopus-black-pink.webp",
"tokenSize": {
"height": null,
"width": null
@ -124,12 +124,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753575463467,
"modifiedTime": 1755395249086,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762786937661,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "qqzdFCxyYupWZK23",
"sort": 200000,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "normal",
"tier": 2,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/reptiles/turtle-shell-glowing-green.webp",
"tokenRingImg": "icons/creatures/reptiles/turtle-shell-glowing-green.webp",
"tokenSize": {
"height": null,
"width": null
@ -132,10 +132,10 @@
"exportSource": null,
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.1.2",
"systemVersion": "1.2.0",
"createdTime": 1753580987168,
"modifiedTime": 1761502671010,
"lastModifiedBy": "fBcTgyTzoARBvohY"
"modifiedTime": 1762786983275,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "8pUHJv3BYdjA4Qdf",
"sort": 100000,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "normal",
"tier": 4,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/fish/squid-kraken-teal.webp",
"tokenRingImg": "icons/creatures/fish/squid-kraken-teal.webp",
"tokenSize": {
"height": null,
"width": null
@ -133,12 +133,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753628697986,
"modifiedTime": 1755395495481,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762787224941,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "wT4xbF99I55yjKZV",
"sort": 0,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "normal",
"tier": 3,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/mammals/wolf-shadow-black.webp",
"tokenRingImg": "icons/creatures/mammals/wolf-shadow-black.webp",
"tokenSize": {
"height": null,
"width": null
@ -130,12 +130,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753625648103,
"modifiedTime": 1755395413225,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762787119852,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "afbMt4Ld6nY3mw0N",
"sort": 100000,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "normal",
"tier": 3,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/birds/corvid-flying-wings-purple.webp",
"tokenRingImg": "icons/creatures/birds/corvid-flying-wings-purple.webp",
"tokenSize": {
"height": null,
"width": null
@ -130,12 +130,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753626865938,
"modifiedTime": 1755395430043,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762787132432,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "b4BMnTbJ3iPPidSb",
"sort": 200000,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "normal",
"tier": 1,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/mammals/rabbit-movement-glowing-green.webp",
"tokenRingImg": "icons/creatures/mammals/rabbit-movement-glowing-green.webp",
"tokenSize": {
"height": null,
"width": null
@ -124,12 +124,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753573035973,
"modifiedTime": 1755395259885,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762786944642,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "iDmOtiHJJ80AIAVT",
"sort": 100000,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "evolved",
"tier": 3,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/magical/humanoid-giant-forest-blue.webp",
"tokenRingImg": "icons/creatures/magical/humanoid-giant-forest-blue.webp",
"tokenSize": {
"height": null,
"width": null
@ -100,12 +100,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753627165434,
"modifiedTime": 1755395443346,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762787146758,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "mqP6z4Wg4K3oDAom",
"sort": 0,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "hybrid",
"tier": 3,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/magical/humanoid-silhouette-glowing-pink.webp",
"tokenRingImg": "icons/creatures/magical/humanoid-silhouette-glowing-pink.webp",
"tokenSize": {
"height": null,
"width": null
@ -118,12 +118,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753627303526,
"modifiedTime": 1755395450377,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762787159027,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "rRUtgcUjimlpPhnn",
"sort": 0,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "normal",
"tier": 4,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/mammals/beast-horned-scaled-glowing-orange.webp",
"tokenRingImg": "icons/creatures/mammals/beast-horned-scaled-glowing-orange.webp",
"tokenSize": {
"height": null,
"width": null
@ -134,12 +134,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753627711166,
"modifiedTime": 1755395470445,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762787235514,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "qjwMzPn33aKZACkv",
"sort": 100000,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "normal",
"tier": 3,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/reptiles/lizard-iguana-green.webp",
"tokenRingImg": "icons/creatures/reptiles/lizard-iguana-green.webp",
"tokenSize": {
"height": null,
"width": null
@ -130,12 +130,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753626720443,
"modifiedTime": 1755395421310,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762787174916,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "94tvcC3D5Kp4lzuN",
"sort": 300000,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "normal",
"tier": 2,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/environment/creatures/horse-tan.webp",
"tokenRingImg": "icons/environment/creatures/horse-tan.webp",
"tokenSize": {
"height": null,
"width": null
@ -130,12 +130,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753617739175,
"modifiedTime": 1755395313904,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762787003407,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "zRLjqKx4Rn2TjivL",
"sort": 200000,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "normal",
"tier": 4,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/reptiles/dragon-winged-blue.webp",
"tokenRingImg": "icons/creatures/reptiles/dragon-winged-blue.webp",
"tokenSize": {
"height": null,
"width": null
@ -133,12 +133,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753628382723,
"modifiedTime": 1755395486698,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762787250619,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "jV6EuEacyQlHW4SN",
"sort": 200000,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "evolved",
"tier": 4,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/eyes/lizard-single-slit-pink.webp",
"tokenRingImg": "icons/creatures/eyes/lizard-single-slit-pink.webp",
"tokenSize": {
"height": null,
"width": null
@ -106,12 +106,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753628844905,
"modifiedTime": 1755395505081,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762787259530,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "kObobka52JdpWBSu",
"sort": 0,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "hybrid",
"tier": 4,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/magical/spirit-undead-horned-blue.webp",
"tokenRingImg": "icons/creatures/magical/spirit-undead-horned-blue.webp",
"tokenSize": {
"height": null,
"width": null
@ -118,12 +118,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753628965658,
"modifiedTime": 1755395511998,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762787273314,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "WAbxCf2An8qmxyJ1",
"sort": 0,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "normal",
"tier": 1,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/mammals/deer-antlers-glowing-blue.webp",
"tokenRingImg": "icons/creatures/mammals/deer-antlers-glowing-blue.webp",
"tokenSize": {
"height": null,
"width": null
@ -124,12 +124,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753574930310,
"modifiedTime": 1755395265901,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762786950257,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "CItO8yX6amQaqyk7",
"sort": 300000,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "normal",
"tier": 1,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/mammals/wolf-howl-moon-forest-blue.webp",
"tokenRingImg": "icons/creatures/mammals/wolf-howl-moon-forest-blue.webp",
"tokenSize": {
"height": null,
"width": null
@ -130,12 +130,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753575274807,
"modifiedTime": 1755395272135,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762786928080,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "YLisKYYhAGca50WM",
"sort": 400000,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "normal",
"tier": 2,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/abilities/cougar-roar-rush-orange.webp",
"tokenRingImg": "icons/creatures/abilities/cougar-roar-rush-orange.webp",
"tokenSize": {
"height": null,
"width": null
@ -130,12 +130,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753621789186,
"modifiedTime": 1755395328437,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762787017340,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "33oFSZ1PwFqInHPe",
"sort": 0,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "normal",
"tier": 2,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/abilities/bear-roar-bite-brown-green.webp",
"tokenRingImg": "icons/creatures/abilities/bear-roar-bite-brown-green.webp",
"tokenSize": {
"height": null,
"width": null
@ -130,12 +130,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753582598510,
"modifiedTime": 1755395305302,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762787029819,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "m8BVTuJI1wCvzTcf",
"sort": 300000,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "normal",
"tier": 1,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/invertebrates/spider-mandibles-brown.webp",
"tokenRingImg": "icons/creatures/invertebrates/spider-mandibles-brown.webp",
"tokenSize": {
"height": null,
"width": null
@ -130,12 +130,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753576016472,
"modifiedTime": 1755395283720,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762786957384,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "A4TVRY0D5r9EiVwA",
"sort": 0,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "normal",
"tier": 2,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/reptiles/serpent-horned-green.webp",
"tokenRingImg": "icons/creatures/reptiles/serpent-horned-green.webp",
"tokenSize": {
"height": null,
"width": null
@ -130,12 +130,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753621251793,
"modifiedTime": 1755395321271,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762787068105,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "1XrZWGDttBAAUxR1",
"sort": 0,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "normal",
"tier": 4,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/abilities/dragon-breath-purple.webp",
"tokenRingImg": "icons/creatures/abilities/dragon-breath-purple.webp",
"tokenSize": {
"height": null,
"width": null
@ -133,12 +133,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753628213224,
"modifiedTime": 1755395476212,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762787283468,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "5BABxRe2XVrYTj8N",
"sort": 300000,

View file

@ -5,8 +5,8 @@
"system": {
"beastformType": "normal",
"tier": 2,
"tokenImg": "icons/svg/mystery-man.svg",
"tokenRingImg": "icons/svg/mystery-man.svg",
"tokenImg": "icons/creatures/birds/raptor-owl-flying-moon.webp",
"tokenRingImg": "icons/creatures/birds/raptor-owl-flying-moon.webp",
"tokenSize": {
"height": null,
"width": null
@ -130,12 +130,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753624952844,
"modifiedTime": 1755395334887,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762787081429,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "mZ4Wlqtss2FlNNvL",
"sort": 0,

View file

@ -10,7 +10,7 @@
"type": "effect",
"_id": "4yQ56hSL5LBkzrV6",
"systemPath": "actions",
"description": "",
"description": "<p><strong>Spend a Hope</strong> to move up to Far range without rolling.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [
@ -23,12 +23,12 @@
],
"uses": {
"value": null,
"max": null,
"max": "",
"recovery": null
},
"effects": [],
"target": {
"type": null,
"type": "",
"amount": null
},
"name": "Spend Hope",
@ -56,12 +56,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753569752255,
"modifiedTime": 1755395530698,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762786188592,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "xLS5YT1B6yeCiNTg",
"sort": 2700000,

View file

@ -10,7 +10,7 @@
"type": "attack",
"_id": "9lvrqQKTEB3NRwvM",
"systemPath": "actions",
"description": "",
"description": "<p>When an attack roll against you would succeed, you can <strong>mark a Stress</strong> and roll a <strong>d4</strong>. Add the result to your Evasion against this attack.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [
@ -23,7 +23,7 @@
],
"uses": {
"value": null,
"max": null,
"max": "",
"recovery": null
},
"damage": {
@ -31,7 +31,7 @@
"includeBase": false
},
"target": {
"type": null,
"type": "",
"amount": null
},
"effects": [],
@ -80,12 +80,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753574925665,
"modifiedTime": 1755395566717,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762786470855,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "a7Qvmm14nx9BCysA",
"sort": 2300000,

View file

@ -10,7 +10,7 @@
"type": "effect",
"_id": "p8DESOMGA6dLwEMz",
"systemPath": "actions",
"description": "",
"description": "<p>When you succeed on an attack against a target within Melee range, you can <strong>mark a Stress</strong> to make the target temporarily <em>Vulnerable</em>.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [
@ -23,7 +23,7 @@
],
"uses": {
"value": null,
"max": null,
"max": "",
"recovery": null
},
"effects": [
@ -33,7 +33,7 @@
}
],
"target": {
"type": null,
"type": "",
"amount": null
},
"name": "Mark Stress",
@ -101,12 +101,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753575250590,
"modifiedTime": 1755395576634,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762786502471,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "8u0HkK3WgtU9lWYs",
"sort": 2400000,

View file

@ -28,75 +28,20 @@
},
"damage": {
"parts": [
{
"resultBased": false,
"value": {
"custom": {
"enabled": false,
"formula": ""
},
"multiplier": "prof",
"dice": "d8",
"bonus": 6,
"flatMultiplier": 1
},
"applyTo": "hitPoints",
"type": [
"physical"
],
"base": false,
"valueAlt": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false,
"formula": ""
}
}
},
{
"resultBased": false,
"value": {
"custom": {
"enabled": false,
"formula": ""
},
"multiplier": "flat",
"flatMultiplier": 2,
"dice": "d8",
"bonus": null
},
"applyTo": "hitPoints",
"type": [
"physical"
],
"base": false,
"valueAlt": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false,
"formula": ""
}
}
},
{
"resultBased": false,
"value": {
"custom": {
"enabled": true,
"formula": "1"
"formula": "(@prof+2)@basicAttackDamageDice"
},
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null
},
"applyTo": "stress",
"applyTo": "hitPoints",
"type": [],
"base": false,
"valueAlt": {
"multiplier": "prof",
@ -104,11 +49,9 @@
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false,
"formula": ""
"enabled": false
}
},
"type": []
}
}
],
"includeBase": false
@ -207,12 +150,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.350",
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.1.2",
"systemVersion": "1.1.0",
"createdTime": 1753621786000,
"modifiedTime": 1762341337917,
"lastModifiedBy": "9HOfUKAXuCu7hUPY"
"modifiedTime": 1756041242273,
"lastModifiedBy": "vUIbuan0U50nfKBE"
},
"_id": "0ey4kM9ssj2otHvb",
"sort": 600000,

View file

@ -10,13 +10,13 @@
"type": "effect",
"_id": "eow90DYK6cUWOk7g",
"systemPath": "actions",
"description": "",
"description": "<p>When you succeed on an attack against a target within Melee range, the target becomes temporarily Poisoned. A Poisoned creature takes <strong>1d10</strong> direct physical damage each time they act.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": null,
"max": "",
"recovery": null
},
"effects": [
@ -63,7 +63,7 @@
"startRound": 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\">A Poisoned creature takes </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-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;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>1d10</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\"> direct physical damage each time they act.</p>",
"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\">A Poisoned creature takes </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-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;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>1d10</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\"> direct physical damage each time they act.</span></p>",
"tint": "#ffffff",
"statuses": [],
"sort": 0,
@ -91,12 +91,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753576004121,
"modifiedTime": 1755395614203,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762786649810,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "2KlTnfzO03vneVS8",
"sort": 1600000,

View file

@ -10,13 +10,13 @@
"type": "attack",
"_id": "vRU6xutkp3VYxZ0i",
"systemPath": "actions",
"description": "",
"description": "<p>You can temporarily <em>Restrain</em> a target within Close range by succeeding on a Finesse Roll against them.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": null,
"max": "",
"recovery": null
},
"damage": {
@ -117,12 +117,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.350",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.0",
"createdTime": 1753576005315,
"modifiedTime": 1755395606969,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1762786690091,
"lastModifiedBy": "gtrqalNxfl7iRwL8"
},
"_id": "D73fS1iM4SZPFimu",
"sort": 1700000,

View file

@ -0,0 +1,33 @@
.daggerheart.dh-style.dialog.image-select {
display: flex;
flex-direction: column;
.images-container {
display: flex;
flex-wrap: wrap;
gap: 8px;
img {
width: 136px;
height: 136px;
border: 1px solid light-dark(@dark-blue, @golden);
border-radius: 6px;
opacity: 0.4;
&.selected {
opacity: 1;
}
}
}
.footer {
margin-top: 8px;
display: flex;
align-items: center;
gap: 8px;
button {
flex: 1;
}
}
}

View file

@ -32,5 +32,6 @@
@import './reroll-dialog/sheet.less';
@import './group-roll/group-roll.less';
@import './tag-team-dialog/sheet.less';
@import './image-select/sheet.less';

View file

@ -1,3 +1,9 @@
.theme-light .daggerheart.placeable-hud {
.status-effects .effect-control {
filter: none;
}
}
.daggerheart.placeable-hud {
.col.right {
.palette {

View file

@ -0,0 +1,4 @@
<div class="footer">
<button data-action="close">{{localize "Cancel"}}</button>
<button type="button" data-action="finishSelection">{{localize "DAGGERHEART.APPLICATIONS.ImageSelect.selectImage"}}</button>
</div>

View file

@ -0,0 +1,5 @@
<div class="images-container">
{{#each images as |image|}}
<a data-action="selectImage"><img {{#if (eq image @root.selectedImage)}}class="selected"{{/if}} src="{{image}}" data-image="{{image}}" /></a>
{{/each}}
</div>