Compare commits

..

No commits in common. "f47cbb41e82071fdbfbecf9a6e5a471d23aca43a" and "69da660bfa7c0fd96f69217c866a82920f266d0c" have entirely different histories.

84 changed files with 460 additions and 4304 deletions

View file

@ -335,14 +335,14 @@ const updateActorsRangeDependentEffects = async token => {
break; break;
} }
// Get required distance and special case 5 feet to test adjacency const distanceBetween = canvas.grid.measurePath([
const required = rangeMeasurement[range]; userTarget.document.movement.destination,
token.movement.destination
]).distance;
const distance = rangeMeasurement[range];
const reverse = type === CONFIG.DH.GENERAL.rangeInclusion.outsideRange.id; const reverse = type === CONFIG.DH.GENERAL.rangeInclusion.outsideRange.id;
const inRange = if (reverse ? distanceBetween <= distance : distanceBetween > distance) {
required === 5
? userTarget.isAdjacentWith(token.object)
: userTarget.distanceTo(token.object) <= required;
if (reverse ? inRange : !inRange) {
enabledEffect = false; enabledEffect = false;
break; break;
} }
@ -356,15 +356,16 @@ const updateAllRangeDependentEffects = async () => {
const effectsAutomation = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).effects; const effectsAutomation = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).effects;
if (!effectsAutomation.rangeDependent) return; if (!effectsAutomation.rangeDependent) return;
const tokens = canvas.scene.tokens; // Only consider tokens on the active scene
const tokens = game.scenes.find(x => x.active).tokens;
if (game.user.character) { if (game.user.character) {
// The character updates their character's token. There can be only one token. // The character updates their character's token. There can be only one token.
const characterToken = tokens.find(x => x.actor === game.user.character); const characterToken = tokens.find(x => x.actor === game.user.character);
updateActorsRangeDependentEffects(characterToken); updateActorsRangeDependentEffects(characterToken);
} else if (game.user.isActiveGM) { } else if (game.user.isGM) {
// The GM is responsible for all other tokens. // The GM is responsible for all other tokens.
const playerCharacters = game.users.players.filter(x => x.active).map(x => x.character); const playerCharacters = game.users.players.filter(x => x.active).map(x => x.character);
for (const token of tokens.filter(x => !playerCharacters.includes(x.actor))) { for (let token of tokens.filter(x => !playerCharacters.includes(x.actor))) {
updateActorsRangeDependentEffects(token); updateActorsRangeDependentEffects(token);
} }
} }
@ -372,14 +373,12 @@ const updateAllRangeDependentEffects = async () => {
const debouncedRangeEffectCall = foundry.utils.debounce(updateAllRangeDependentEffects, 50); const debouncedRangeEffectCall = foundry.utils.debounce(updateAllRangeDependentEffects, 50);
Hooks.on('targetToken', () => { Hooks.on('targetToken', async (user, token, targeted) => {
debouncedRangeEffectCall(); debouncedRangeEffectCall();
}); });
Hooks.on('refreshToken', (_, options) => { Hooks.on('moveToken', async (movedToken, data) => {
if (options.refreshPosition) { debouncedRangeEffectCall();
debouncedRangeEffectCall();
}
}); });
Hooks.on('renderCompendiumDirectory', (app, html) => applications.ui.ItemBrowser.injectSidebarButton(html)); Hooks.on('renderCompendiumDirectory', (app, html) => applications.ui.ItemBrowser.injectSidebarButton(html));

View file

@ -233,7 +233,6 @@
"confirmText": "Would you like to level up your companion {name} by {levelChange} levels at this time? (You can do it manually later)" "confirmText": "Would you like to level up your companion {name} by {levelChange} levels at this time? (You can do it manually later)"
}, },
"viewLevelups": "View Levelups", "viewLevelups": "View Levelups",
"viewParty": "View Party",
"InvalidOldCharacterImportTitle": "Old Character Import", "InvalidOldCharacterImportTitle": "Old Character Import",
"InvalidOldCharacterImportText": "Character data exported prior to system version 1.1 will not generate a complete character. Do you wish to continue?", "InvalidOldCharacterImportText": "Character data exported prior to system version 1.1 will not generate a complete character. Do you wish to continue?",
"cancelBeastform": "Cancel Beastform" "cancelBeastform": "Cancel Beastform"
@ -334,7 +333,6 @@
"equip": "Equip", "equip": "Equip",
"sendToChat": "Send To Chat", "sendToChat": "Send To Chat",
"toLoadout": "Send to Loadout", "toLoadout": "Send to Loadout",
"recall": "Recall",
"toVault": "Send to Vault", "toVault": "Send to Vault",
"unequip": "Unequip", "unequip": "Unequip",
"useItem": "Use Item" "useItem": "Use Item"
@ -1809,9 +1807,7 @@
"label": "Long Rest: Bonus Long Rest Moves", "label": "Long Rest: Bonus Long Rest Moves",
"hint": "The number of extra Long Rest Moves the character can take during a Long Rest." "hint": "The number of extra Long Rest Moves the character can take during a Long Rest."
} }
}, }
"target": "Target",
"targetSelf": "Self"
}, },
"maxLoadout": { "maxLoadout": {
"label": "Max Loadout Cards Bonus" "label": "Max Loadout Cards Bonus"

View file

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

View file

@ -104,7 +104,7 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio
context.roll = this.roll; context.roll = this.roll;
context.rollType = this.roll?.constructor.name; context.rollType = this.roll?.constructor.name;
context.rallyDie = this.roll.rallyChoices; context.rallyDie = this.roll.rallyChoices;
const experiences = this.config.data?.system?.experiences || {}; const experiences = this.config.data?.system.experiences || {};
context.experiences = Object.keys(experiences).map(id => ({ context.experiences = Object.keys(experiences).map(id => ({
id, id,
...experiences[id] ...experiences[id]

View file

@ -93,29 +93,27 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV
} }
getRefreshables() { getRefreshables() {
const actionItems = this.actor.items const actionItems = this.actor.items.filter(x => this.actor.system.isItemAvailable(x)).reduce((acc, x) => {
.filter(x => this.actor.system.isItemAvailable(x)) if (x.system.actions) {
.reduce((acc, x) => { const recoverable = x.system.actions.reduce((acc, action) => {
if (x.system.actions) { if (refreshIsAllowed([this.shortrest ? 'shortRest' : 'longRest'], action.uses.recovery)) {
const recoverable = x.system.actions.reduce((acc, action) => { acc.push({
if (refreshIsAllowed([this.shortrest ? 'shortRest' : 'longRest'], action.uses.recovery)) { title: x.name,
acc.push({ name: action.name,
title: x.name, uuid: action.uuid
name: action.name, });
uuid: action.uuid
});
}
return acc;
}, []);
if (recoverable) {
acc.push(...recoverable);
} }
}
return acc; return acc;
}, []); }, []);
if (recoverable) {
acc.push(...recoverable);
}
}
return acc;
}, []);
const resourceItems = this.actor.items.reduce((acc, x) => { const resourceItems = this.actor.items.reduce((acc, x) => {
if ( if (
x.system.resource && x.system.resource &&
@ -183,18 +181,12 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV
.filter(x => category.moves[x].selected) .filter(x => category.moves[x].selected)
.flatMap(key => { .flatMap(key => {
const move = category.moves[key]; const move = category.moves[key];
const needsTarget = move.actions.filter(x => x.target?.type && x.target.type !== 'self').length > 0;
return [...Array(move.selected).keys()].map(_ => ({ return [...Array(move.selected).keys()].map(_ => ({
...move, ...move,
movePath: `${categoryKey}.moves.${key}`, movePath: `${categoryKey}.moves.${key}`
needsTarget: needsTarget
})); }));
}); });
}); });
const characters = game.actors
.filter(x => x.type === 'character')
.filter(x => x.testUserPermission(game.user, 'LIMITED'))
.filter(x => x.uuid !== this.actor.uuid);
const cls = getDocumentClass('ChatMessage'); const cls = getDocumentClass('ChatMessage');
const msg = { const msg = {
@ -214,9 +206,7 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV
`DAGGERHEART.APPLICATIONS.Downtime.${this.shortrest ? 'shortRest' : 'longRest'}.title` `DAGGERHEART.APPLICATIONS.Downtime.${this.shortrest ? 'shortRest' : 'longRest'}.title`
), ),
actor: { name: this.actor.name, img: this.actor.img }, actor: { name: this.actor.name, img: this.actor.img },
moves: moves, moves: moves
characters: characters,
selfId: this.actor.uuid
} }
), ),
flags: { flags: {

View file

@ -77,7 +77,7 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio
cost: this.data.initiator.cost cost: this.data.initiator.cost
}; };
const selectedMember = Object.values(context.members).find(x => x.selected && x.roll); const selectedMember = Object.values(context.members).find(x => x.selected);
const selectedIsCritical = selectedMember?.roll?.system?.isCritical; const selectedIsCritical = selectedMember?.roll?.system?.isCritical;
context.selectedData = { context.selectedData = {
result: selectedMember result: selectedMember

View file

@ -51,19 +51,6 @@ export default class DHAdversarySettings extends DHBaseActorSettings {
} }
}; };
async _prepareContext(options) {
const context = await super._prepareContext(options);
const featureForms = ['passive', 'action', 'reaction'];
context.features = context.document.system.features.sort((a, b) =>
a.system.featureForm !== b.system.featureForm
? featureForms.indexOf(a.system.featureForm) - featureForms.indexOf(b.system.featureForm)
: a.sort - b.sort
);
return context;
}
/* -------------------------------------------- */ /* -------------------------------------------- */
/** /**
@ -111,16 +98,16 @@ export default class DHAdversarySettings extends DHBaseActorSettings {
async _onDrop(event) { async _onDrop(event) {
const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event); const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event);
const item = await fromUuid(data.uuid); const item = await fromUuid(data.uuid);
if (item?.type === 'feature') { if (item?.type === 'feature') {
if (data.fromInternal && item.parent?.uuid === this.actor.uuid) { if (data.fromInternal && item.parent?.uuid === this.actor.uuid) {
return; return;
} }
const itemData = item.toObject(); const itemData = item.toObject();
delete itemData._id; delete itemData._id;
await this.actor.createEmbeddedDocuments('Item', [itemData]); await this.actor.createEmbeddedDocuments('Item', [itemData]);
} }
} }

View file

@ -49,19 +49,6 @@ export default class DHEnvironmentSettings extends DHBaseActorSettings {
} }
}; };
async _prepareContext(options) {
const context = await super._prepareContext(options);
const featureForms = ['passive', 'action', 'reaction'];
context.features = context.document.system.features.sort((a, b) =>
a.system.featureForm !== b.system.featureForm
? featureForms.indexOf(a.system.featureForm) - featureForms.indexOf(b.system.featureForm)
: a.sort - b.sort
);
return context;
}
/** /**
* Adds a new category entry to the actor. * Adds a new category entry to the actor.
* @type {ApplicationClickAction} * @type {ApplicationClickAction}

View file

@ -26,12 +26,7 @@ export default class AdversarySheet extends DHBaseActorSheet {
} }
] ]
}, },
dragDrop: [ dragDrop: [{ dragSelector: '[data-item-id]', dropSelector: null }]
{
dragSelector: '[data-item-id][draggable="true"], [data-item-id] [draggable="true"]',
dropSelector: null
}
]
}; };
static PARTS = { static PARTS = {
@ -93,13 +88,6 @@ export default class AdversarySheet extends DHBaseActorSheet {
context.resources.stress.emptyPips = context.resources.stress.emptyPips =
context.resources.stress.max < maxResource ? maxResource - context.resources.stress.max : 0; context.resources.stress.max < maxResource ? maxResource - context.resources.stress.max : 0;
const featureForms = ['passive', 'action', 'reaction'];
context.features = this.document.system.features.sort((a, b) =>
a.system.featureForm !== b.system.featureForm
? featureForms.indexOf(a.system.featureForm) - featureForms.indexOf(b.system.featureForm)
: a.sort - b.sort
);
return context; return context;
} }
@ -176,15 +164,6 @@ export default class AdversarySheet extends DHBaseActorSheet {
}); });
} }
/** @inheritdoc */
async _onDragStart(event) {
const inventoryItem = event.currentTarget.closest('.inventory-item');
if (inventoryItem) {
event.dataTransfer.setDragImage(inventoryItem.querySelector('img'), 60, 0);
}
super._onDragStart(event);
}
/* -------------------------------------------- */ /* -------------------------------------------- */
/* Application Clicks Actions */ /* Application Clicks Actions */
/* -------------------------------------------- */ /* -------------------------------------------- */

View file

@ -32,8 +32,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
handleResourceDice: CharacterSheet.#handleResourceDice, handleResourceDice: CharacterSheet.#handleResourceDice,
advanceResourceDie: CharacterSheet.#advanceResourceDie, advanceResourceDie: CharacterSheet.#advanceResourceDie,
cancelBeastform: CharacterSheet.#cancelBeastform, cancelBeastform: CharacterSheet.#cancelBeastform,
useDowntime: this.useDowntime, useDowntime: this.useDowntime
viewParty: CharacterSheet.#viewParty
}, },
window: { window: {
resizable: true, resizable: true,
@ -319,45 +318,6 @@ export default class CharacterSheet extends DHBaseActorSheet {
ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.loadoutMaxReached')); ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.loadoutMaxReached'));
} }
}, },
{
name: 'recall',
icon: 'fa-solid fa-bolt-lightning',
condition: target => {
const doc = getDocFromElementSync(target);
return doc && doc.system.inVault;
},
callback: async (target, event) => {
const doc = await getDocFromElement(target);
const actorLoadout = doc.actor.system.loadoutSlot;
if (!actorLoadout.available) {
ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.loadoutMaxReached'));
return;
}
if (doc.system.recallCost == 0) {
return doc.update({ 'system.inVault': false });
}
const type = 'effect';
const cls = game.system.api.models.actions.actionsTypes[type];
const action = new cls(
{
...cls.getSourceConfig(doc.system),
type: type,
chatDisplay: false,
cost: [
{
key: 'stress',
value: doc.system.recallCost
}
]
},
{ parent: doc.system }
);
const config = await action.use(event);
if (config) {
return doc.update({ 'system.inVault': false });
}
}
},
{ {
name: 'toVault', name: 'toVault',
icon: 'fa-solid fa-arrow-down', icon: 'fa-solid fa-arrow-down',
@ -898,41 +858,6 @@ export default class CharacterSheet extends DHBaseActorSheet {
game.system.api.fields.ActionFields.BeastformField.handleActiveTransformations.call(item); game.system.api.fields.ActionFields.BeastformField.handleActiveTransformations.call(item);
} }
static async #viewParty(_, target) {
const parties = this.document.parties;
if (parties.size <= 1) {
parties.first()?.sheet.render({ force: true });
return;
}
const buttons = parties.map(p => {
const button = document.createElement('button');
button.type = 'button';
button.classList.add('plain');
const img = document.createElement('img');
img.src = p.img;
button.append(img);
const name = document.createElement('span');
name.textContent = p.name;
button.append(name);
button.addEventListener('click', () => {
p.sheet?.render({ force: true });
game.tooltip.dismissLockedTooltips();
});
return button;
});
const html = document.createElement('div');
html.classList.add('party-list');
html.append(...buttons);
game.tooltip.dismissLockedTooltips();
game.tooltip.activate(target, {
html,
locked: true
});
}
/** /**
* Open the downtime application. * Open the downtime application.
* @type {ApplicationClickAction} * @type {ApplicationClickAction}

View file

@ -25,12 +25,7 @@ export default class DhpEnvironment extends DHBaseActorSheet {
toggleResourceDice: DhpEnvironment.#toggleResourceDice, toggleResourceDice: DhpEnvironment.#toggleResourceDice,
handleResourceDice: DhpEnvironment.#handleResourceDice handleResourceDice: DhpEnvironment.#handleResourceDice
}, },
dragDrop: [ dragDrop: [{ dragSelector: '.inventory-item', dropSelector: null }]
{
dragSelector: '[data-item-id][draggable="true"], [data-item-id] [draggable="true"]',
dropSelector: null
}
]
}; };
/**@override */ /**@override */
@ -79,9 +74,6 @@ export default class DhpEnvironment extends DHBaseActorSheet {
case 'header': case 'header':
await this._prepareHeaderContext(context, options); await this._prepareHeaderContext(context, options);
break;
case 'features':
await this._prepareFeaturesContext(context, options);
break; break;
case 'notes': case 'notes':
await this._prepareNotesContext(context, options); await this._prepareNotesContext(context, options);
@ -118,22 +110,6 @@ export default class DhpEnvironment extends DHBaseActorSheet {
} }
} }
/**
* Prepare render context for the features part.
* @param {ApplicationRenderContext} context
* @param {ApplicationRenderOptions} options
* @returns {Promise<void>}
* @protected
*/
async _prepareFeaturesContext(context, _options) {
const featureForms = ['passive', 'action', 'reaction'];
context.features = this.document.system.features.sort((a, b) =>
a.system.featureForm !== b.system.featureForm
? featureForms.indexOf(a.system.featureForm) - featureForms.indexOf(b.system.featureForm)
: a.sort - b.sort
);
}
/** /**
* Prepare render context for the Header part. * Prepare render context for the Header part.
* @param {ApplicationRenderContext} context * @param {ApplicationRenderContext} context

View file

@ -134,9 +134,7 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo
async actionUseButton(event, message) { async actionUseButton(event, message) {
const { moveIndex, actionIndex, movePath } = event.currentTarget.dataset; const { moveIndex, actionIndex, movePath } = event.currentTarget.dataset;
const targetUuid = event.currentTarget.closest('.action-use-button-parent').querySelector('select')?.value; const parent = await foundry.utils.fromUuid(message.system.actor);
const parent = await foundry.utils.fromUuid(targetUuid || message.system.actor);
const actionType = message.system.moves[moveIndex].actions[actionIndex]; const actionType = message.system.moves[moveIndex].actions[actionIndex];
const cls = game.system.api.models.actions.actionsTypes[actionType.type]; const cls = game.system.api.models.actions.actionsTypes[actionType.type];
const action = new cls( const action = new cls(
@ -148,8 +146,7 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo
type: CONFIG.DH.ITEM.originItemType.restMove, type: CONFIG.DH.ITEM.originItemType.restMove,
itemPath: movePath, itemPath: movePath,
actionIndex: actionIndex actionIndex: actionIndex
}, }
targetUuid: targetUuid
}, },
{ parent: parent.system } { parent: parent.system }
); );

View file

@ -42,69 +42,6 @@ export default class DhTokenPlaceable extends foundry.canvas.placeables.Token {
this.renderFlags.set({ refreshEffects: true }); this.renderFlags.set({ refreshEffects: true });
} }
/**
* Returns the distance from this token to another token object.
* This value is corrected to handle alternate token sizes and other grid types
* according to the diagonal rules.
*/
distanceTo(target) {
if (!canvas.ready) return NaN;
if (this === target) return 0;
const originPoint = this.center;
const destinationPoint = target.center;
// Compute for gridless. This version returns circular edge to edge + grid distance,
// so that tokens that are touching return 5.
if (canvas.grid.type === CONST.GRID_TYPES.GRIDLESS) {
const boundsCorrection = canvas.grid.distance / canvas.grid.size;
const originRadius = (this.bounds.width * boundsCorrection) / 2;
const targetRadius = (target.bounds.width * boundsCorrection) / 2;
const distance = canvas.grid.measurePath([originPoint, destinationPoint]).distance;
return distance - originRadius - targetRadius + canvas.grid.distance;
}
// Compute what the closest grid space of each token is, then compute that distance
const originEdge = this.#getEdgeBoundary(this.bounds, originPoint, destinationPoint);
const targetEdge = this.#getEdgeBoundary(target.bounds, originPoint, destinationPoint);
const adjustedOriginPoint = canvas.grid.getTopLeftPoint({
x: originEdge.x + Math.sign(originPoint.x - originEdge.x),
y: originEdge.y + Math.sign(originPoint.y - originEdge.y)
});
const adjustDestinationPoint = canvas.grid.getTopLeftPoint({
x: targetEdge.x + Math.sign(destinationPoint.x - targetEdge.x),
y: targetEdge.y + Math.sign(destinationPoint.y - targetEdge.y)
});
return canvas.grid.measurePath([adjustedOriginPoint, adjustDestinationPoint]).distance;
}
/** Returns the point at which a line starting at origin and ending at destination intersects the edge of the bounds */
#getEdgeBoundary(bounds, originPoint, destinationPoint) {
const points = [
{ x: bounds.x, y: bounds.y },
{ x: bounds.x + bounds.width, y: bounds.y },
{ x: bounds.x + bounds.width, y: bounds.y + bounds.height },
{ x: bounds.x, y: bounds.y + bounds.height }
];
const pairsToTest = [
[points[0], points[1]],
[points[1], points[2]],
[points[2], points[3]],
[points[3], points[0]]
];
for (const pair of pairsToTest) {
const result = foundry.utils.lineSegmentIntersection(originPoint, destinationPoint, pair[0], pair[1]);
if (result) return result;
}
return null;
}
/** Tests if the token is at least adjacent with another, with some leeway for diagonals */
isAdjacentWith(token) {
return this.distanceTo(token) <= canvas.grid.distance * 1.5;
}
/** @inheritDoc */ /** @inheritDoc */
_drawBar(number, bar, data) { _drawBar(number, bar, data) {
const val = Number(data.value); const val = Number(data.value);

View file

@ -2,7 +2,7 @@ export const actionTypes = {
attack: { attack: {
id: 'attack', id: 'attack',
name: 'DAGGERHEART.ACTIONS.TYPES.attack.name', name: 'DAGGERHEART.ACTIONS.TYPES.attack.name',
icon: 'fa-hand-fist', icon: 'fa-khanda',
tooltip: 'DAGGERHEART.ACTIONS.TYPES.attack.tooltip' tooltip: 'DAGGERHEART.ACTIONS.TYPES.attack.tooltip'
}, },
countdown: { countdown: {

View file

@ -232,7 +232,7 @@ export const defaultRestOptions = {
actionType: 'action', actionType: 'action',
chatDisplay: false, chatDisplay: false,
target: { target: {
type: 'friendly' type: 'self'
}, },
damage: { damage: {
parts: [ parts: [
@ -298,7 +298,7 @@ export const defaultRestOptions = {
actionType: 'action', actionType: 'action',
chatDisplay: false, chatDisplay: false,
target: { target: {
type: 'friendly' type: 'self'
}, },
damage: { damage: {
parts: [ parts: [
@ -341,7 +341,7 @@ export const defaultRestOptions = {
actionType: 'action', actionType: 'action',
chatDisplay: false, chatDisplay: false,
target: { target: {
type: 'friendly' type: 'self'
}, },
damage: { damage: {
parts: [ parts: [
@ -407,7 +407,7 @@ export const defaultRestOptions = {
actionType: 'action', actionType: 'action',
chatDisplay: false, chatDisplay: false,
target: { target: {
type: 'friendly' type: 'self'
}, },
damage: { damage: {
parts: [ parts: [

View file

@ -435,8 +435,7 @@ export const armorFeatures = {
{ {
key: 'system.resistance.magical.reduction', key: 'system.resistance.magical.reduction',
mode: 2, mode: 2,
value: '@system.armorScore', value: '@system.armorScore'
priority: 21
} }
] ]
} }
@ -710,8 +709,7 @@ export const weaponFeatures = {
{ {
key: 'system.evasion', key: 'system.evasion',
mode: 2, mode: 2,
value: '@system.armorScore', value: '@system.armorScore'
priority: 21
} }
] ]
} }
@ -1326,8 +1324,7 @@ export const weaponFeatures = {
{ {
key: 'system.bonuses.damage.primaryWeapon.bonus', key: 'system.bonuses.damage.primaryWeapon.bonus',
mode: 2, mode: 2,
value: '@system.traits.agility.value', value: '@system.traits.agility.value'
priority: 21
} }
] ]
} }
@ -1419,9 +1416,9 @@ export const orderedWeaponFeatures = () => {
}; };
export const featureForm = { export const featureForm = {
passive: 'DAGGERHEART.CONFIG.FeatureForm.passive', passive: "DAGGERHEART.CONFIG.FeatureForm.passive",
action: 'DAGGERHEART.CONFIG.FeatureForm.action', action: "DAGGERHEART.CONFIG.FeatureForm.action",
reaction: 'DAGGERHEART.CONFIG.FeatureForm.reaction' reaction: "DAGGERHEART.CONFIG.FeatureForm.reaction"
}; };
export const featureTypes = { export const featureTypes = {

View file

@ -33,8 +33,7 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
initial: 'action', initial: 'action',
nullable: false, nullable: false,
required: true required: true
}), })
targetUuid: new fields.StringField({ initial: undefined })
}; };
this.extraSchemas.forEach(s => { this.extraSchemas.forEach(s => {
@ -241,8 +240,7 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
selectedRollMode: game.settings.get('core', 'rollMode'), selectedRollMode: game.settings.get('core', 'rollMode'),
data: this.getRollData(), data: this.getRollData(),
evaluate: this.hasRoll, evaluate: this.hasRoll,
resourceUpdates: new ResourceUpdateMap(this.actor), resourceUpdates: new ResourceUpdateMap(this.actor)
targetUuid: this.targetUuid
}; };
DHBaseAction.applyKeybindings(config); DHBaseAction.applyKeybindings(config);

View file

@ -1,17 +1,3 @@
/** -- Changes Type Priorities --
* - Base Number -
* Custom: 0
* Multiply: 10
* Add: 20
* Downgrade: 30
* Upgrade: 40
* Override: 50
*
* - Changes Value Priorities -
* Standard: +0
* "Anything that uses another data model value as its value": +1 - Effects that increase traits have to be calculated first at Base priority. (EX: Raise evasion by half your agility)
*/
export default class BaseEffect extends foundry.abstract.TypeDataModel { export default class BaseEffect extends foundry.abstract.TypeDataModel {
static defineSchema() { static defineSchema() {
const fields = foundry.data.fields; const fields = foundry.data.fields;

View file

@ -66,20 +66,12 @@ export default class BeastformEffect extends BaseEffect {
}; };
const updateToken = token => { const updateToken = token => {
let x = null, const { x, y } = game.system.api.documents.DhToken.getSnappedPositionInSquareGrid(
y = null; token.object.scene.grid,
if (token.object?.scene?.grid) { { x: token.x, y: token.y, elevation: token.elevation },
const positionData = game.system.api.documents.DhToken.getSnappedPositionInSquareGrid( baseUpdate.width,
token.object.scene.grid, baseUpdate.height
{ x: token.x, y: token.y, elevation: token.elevation }, );
baseUpdate.width,
baseUpdate.height
);
x = positionData.x;
y = positionData.y;
}
return { return {
...baseUpdate, ...baseUpdate,
x, x,

View file

@ -1,6 +1,6 @@
import DHAdversarySettings from '../../applications/sheets-configs/adversary-settings.mjs'; import DHAdversarySettings from '../../applications/sheets-configs/adversary-settings.mjs';
import { ActionField } from '../fields/actionField.mjs'; import { ActionField } from '../fields/actionField.mjs';
import BaseDataActor, { commonActorRules } from './base.mjs'; import BaseDataActor from './base.mjs';
import { resourceField, bonusField } from '../fields/actorField.mjs'; import { resourceField, bonusField } from '../fields/actorField.mjs';
export default class DhpAdversary extends BaseDataActor { export default class DhpAdversary extends BaseDataActor {
@ -56,11 +56,25 @@ export default class DhpAdversary extends BaseDataActor {
}) })
}), }),
resources: new fields.SchemaField({ resources: new fields.SchemaField({
hitPoints: resourceField(0, 0, 'DAGGERHEART.GENERAL.HitPoints.plural', true), hitPoints: resourceField(
stress: resourceField(0, 0, 'DAGGERHEART.GENERAL.stress', true) 0,
0,
'DAGGERHEART.GENERAL.HitPoints.plural',
true
),
stress: resourceField(
0,
0,
'DAGGERHEART.GENERAL.stress',
true
)
}), }),
rules: new fields.SchemaField({ rules: new fields.SchemaField({
...commonActorRules() conditionImmunities: new fields.SchemaField({
hidden: new fields.BooleanField({ initial: false }),
restrained: new fields.BooleanField({ initial: false }),
vulnerable: new fields.BooleanField({ initial: false })
})
}), }),
attack: new ActionField({ attack: new ActionField({
initial: { initial: {

View file

@ -2,23 +2,21 @@ import DHBaseActorSettings from '../../applications/sheets/api/actor-setting.mjs
import DHItem from '../../documents/item.mjs'; import DHItem from '../../documents/item.mjs';
import { getScrollTextData } from '../../helpers/utils.mjs'; import { getScrollTextData } from '../../helpers/utils.mjs';
const fields = foundry.data.fields;
const resistanceField = (resistanceLabel, immunityLabel, reductionLabel) => const resistanceField = (resistanceLabel, immunityLabel, reductionLabel) =>
new fields.SchemaField({ new foundry.data.fields.SchemaField({
resistance: new fields.BooleanField({ resistance: new foundry.data.fields.BooleanField({
initial: false, initial: false,
label: `${resistanceLabel}.label`, label: `${resistanceLabel}.label`,
hint: `${resistanceLabel}.hint`, hint: `${resistanceLabel}.hint`,
isAttributeChoice: true isAttributeChoice: true
}), }),
immunity: new fields.BooleanField({ immunity: new foundry.data.fields.BooleanField({
initial: false, initial: false,
label: `${immunityLabel}.label`, label: `${immunityLabel}.label`,
hint: `${immunityLabel}.hint`, hint: `${immunityLabel}.hint`,
isAttributeChoice: true isAttributeChoice: true
}), }),
reduction: new fields.NumberField({ reduction: new foundry.data.fields.NumberField({
integer: true, integer: true,
initial: 0, initial: 0,
label: `${reductionLabel}.label`, label: `${reductionLabel}.label`,
@ -26,25 +24,6 @@ const resistanceField = (resistanceLabel, immunityLabel, reductionLabel) =>
}) })
}); });
/* Common rules applying to Characters and Adversaries */
export const commonActorRules = (extendedData = { damageReduction: {} }) => ({
conditionImmunities: new fields.SchemaField({
hidden: new fields.BooleanField({ initial: false }),
restrained: new fields.BooleanField({ initial: false }),
vulnerable: new fields.BooleanField({ initial: false })
}),
damageReduction: new fields.SchemaField({
thresholdImmunities: new fields.SchemaField({
minor: new fields.BooleanField({ initial: false })
}),
reduceSeverity: new fields.SchemaField({
magical: new fields.NumberField({ initial: 0, min: 0 }),
physical: new fields.NumberField({ initial: 0, min: 0 })
}),
...extendedData.damageReduction
})
});
/** /**
* Describes metadata about the actor data model type * Describes metadata about the actor data model type
* @typedef {Object} ActorDataModelMetadata * @typedef {Object} ActorDataModelMetadata
@ -75,6 +54,7 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel {
/** @inheritDoc */ /** @inheritDoc */
static defineSchema() { static defineSchema() {
const fields = foundry.data.fields;
const schema = {}; const schema = {};
if (this.metadata.hasAttribution) { if (this.metadata.hasAttribution) {

View file

@ -1,7 +1,7 @@
import { burden } from '../../config/generalConfig.mjs'; import { burden } from '../../config/generalConfig.mjs';
import ForeignDocumentUUIDField from '../fields/foreignDocumentUUIDField.mjs'; import ForeignDocumentUUIDField from '../fields/foreignDocumentUUIDField.mjs';
import DhLevelData from '../levelData.mjs'; import DhLevelData from '../levelData.mjs';
import BaseDataActor, { commonActorRules } from './base.mjs'; import BaseDataActor from './base.mjs';
import { attributeField, resourceField, stressDamageReductionRule, bonusField } from '../fields/actorField.mjs'; import { attributeField, resourceField, stressDamageReductionRule, bonusField } from '../fields/actorField.mjs';
import { ActionField } from '../fields/actionField.mjs'; import { ActionField } from '../fields/actionField.mjs';
import DHCharacterSettings from '../../applications/sheets-configs/character-settings.mjs'; import DHCharacterSettings from '../../applications/sheets-configs/character-settings.mjs';
@ -217,41 +217,44 @@ export default class DhCharacter extends BaseDataActor {
}), }),
companion: new ForeignDocumentUUIDField({ type: 'Actor', nullable: true, initial: null }), companion: new ForeignDocumentUUIDField({ type: 'Actor', nullable: true, initial: null }),
rules: new fields.SchemaField({ rules: new fields.SchemaField({
...commonActorRules({ damageReduction: new fields.SchemaField({
damageReduction: { maxArmorMarked: new fields.SchemaField({
magical: new fields.BooleanField({ initial: false }), value: new fields.NumberField({
physical: new fields.BooleanField({ initial: false }), required: true,
maxArmorMarked: new fields.SchemaField({
value: new fields.NumberField({
required: true,
integer: true,
initial: 1,
label: 'DAGGERHEART.GENERAL.Rules.damageReduction.maxArmorMarkedBonus'
}),
stressExtra: new fields.NumberField({
required: true,
integer: true,
initial: 0,
label: 'DAGGERHEART.GENERAL.Rules.damageReduction.maxArmorMarkedStress.label',
hint: 'DAGGERHEART.GENERAL.Rules.damageReduction.maxArmorMarkedStress.hint'
})
}),
stressDamageReduction: new fields.SchemaField({
severe: stressDamageReductionRule(
'DAGGERHEART.GENERAL.Rules.damageReduction.stress.severe'
),
major: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.major'),
minor: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.minor'),
any: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.any')
}),
increasePerArmorMark: new fields.NumberField({
integer: true, integer: true,
initial: 1, initial: 1,
label: 'DAGGERHEART.GENERAL.Rules.damageReduction.increasePerArmorMark.label', label: 'DAGGERHEART.GENERAL.Rules.damageReduction.maxArmorMarkedBonus'
hint: 'DAGGERHEART.GENERAL.Rules.damageReduction.increasePerArmorMark.hint'
}), }),
disabledArmor: new fields.BooleanField({ intial: false }) stressExtra: new fields.NumberField({
} required: true,
integer: true,
initial: 0,
label: 'DAGGERHEART.GENERAL.Rules.damageReduction.maxArmorMarkedStress.label',
hint: 'DAGGERHEART.GENERAL.Rules.damageReduction.maxArmorMarkedStress.hint'
})
}),
stressDamageReduction: new fields.SchemaField({
severe: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.severe'),
major: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.major'),
minor: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.minor'),
any: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.any')
}),
increasePerArmorMark: new fields.NumberField({
integer: true,
initial: 1,
label: 'DAGGERHEART.GENERAL.Rules.damageReduction.increasePerArmorMark.label',
hint: 'DAGGERHEART.GENERAL.Rules.damageReduction.increasePerArmorMark.hint'
}),
magical: new fields.BooleanField({ initial: false }),
physical: new fields.BooleanField({ initial: false }),
thresholdImmunities: new fields.SchemaField({
minor: new fields.BooleanField({ initial: false })
}),
reduceSeverity: new fields.SchemaField({
magical: new fields.NumberField({ initial: 0, min: 0 }),
physical: new fields.NumberField({ initial: 0, min: 0 })
}),
disabledArmor: new fields.BooleanField({ intial: false })
}), }),
attack: new fields.SchemaField({ attack: new fields.SchemaField({
damage: new fields.SchemaField({ damage: new fields.SchemaField({
@ -280,6 +283,11 @@ export default class DhCharacter extends BaseDataActor {
}) })
}) })
}), }),
conditionImmunities: new fields.SchemaField({
hidden: new fields.BooleanField({ initial: false }),
restrained: new fields.BooleanField({ initial: false }),
vulnerable: new fields.BooleanField({ initial: false })
}),
runeWard: new fields.BooleanField({ initial: false }), runeWard: new fields.BooleanField({ initial: false }),
burden: new fields.SchemaField({ burden: new fields.SchemaField({
ignore: new fields.BooleanField() ignore: new fields.BooleanField()
@ -445,7 +453,8 @@ export default class DhCharacter extends BaseDataActor {
if ( if (
item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.foundation || item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.foundation ||
(item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.specialization && subclassState >= 2) || (item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.specialization &&
subclassState >= 2) ||
(item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.mastery && subclassState >= 3) (item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.mastery && subclassState >= 3)
) { ) {
return true; return true;

View file

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

View file

@ -25,12 +25,9 @@ export default class TargetField extends fields.SchemaField {
config.hasTarget = true; config.hasTarget = true;
let targets; let targets;
// If the Action is configured as self-targeted, set targets as the owner. Probably better way than to fallback to getDependentTokens // If the Action is configured as self-targeted, set targets as the owner. Probably better way than to fallback to getDependentTokens
if (this.target?.type === CONFIG.DH.GENERAL.targetTypes.self.id) { if (this.target?.type === CONFIG.DH.GENERAL.targetTypes.self.id)
targets = [this.actor.token ?? this.actor.prototypeToken]; targets = [this.actor.token ?? this.actor.prototypeToken];
} else if (config.targetUuid) { else {
const actor = fromUuidSync(config.targetUuid);
targets = [actor.token ?? actor.prototypeToken];
} else {
targets = Array.from(game.user.targets); targets = Array.from(game.user.targets);
if (this.target.type !== CONFIG.DH.GENERAL.targetTypes.any.id) { if (this.target.type !== CONFIG.DH.GENERAL.targetTypes.any.id) {
targets = targets.filter(target => TargetField.isTargetFriendly(this.actor, target, this.target.type)); targets = targets.filter(target => TargetField.isTargetFriendly(this.actor, target, this.target.type));

View file

@ -273,17 +273,12 @@ export function ActionMixin(Base) {
itemOrigin: this.item, itemOrigin: this.item,
description: this.description || (this.item instanceof Item ? this.item.system.description : '') description: this.description || (this.item instanceof Item ? this.item.system.description : '')
}; };
const speaker = cls.getSpeaker();
const msg = { const msg = {
type: 'abilityUse', type: 'abilityUse',
user: game.user.id, user: game.user.id,
actor: { name: this.actor.name, img: this.actor.img }, actor: { name: this.actor.name, img: this.actor.img },
author: this.author, author: this.author,
speaker: { speaker: cls.getSpeaker(),
speaker,
actor: speaker.actor ?? this.actor
},
title: game.i18n.localize('DAGGERHEART.UI.Chat.action.title'), title: game.i18n.localize('DAGGERHEART.UI.Chat.action.title'),
system: systemData, system: systemData,
content: await foundry.applications.handlebars.renderTemplate( content: await foundry.applications.handlebars.renderTemplate(

View file

@ -218,20 +218,12 @@ export default class DHBeastform extends BaseDataItem {
} }
}; };
const tokenUpdate = token => { const tokenUpdate = token => {
let x = null, const { x, y } = game.system.api.documents.DhToken.getSnappedPositionInSquareGrid(
y = null; token.object.scene.grid,
if (token.object?.scene?.grid) { { x: token.x, y: token.y, elevation: token.elevation },
const positionData = game.system.api.documents.DhToken.getSnappedPositionInSquareGrid( width ?? token.width,
token.object.scene.grid, height ?? token.height
{ x: token.x, y: token.y, elevation: token.elevation }, );
width ?? token.width,
height ?? token.height
);
x = positionData.x;
y = positionData.y;
}
return { return {
...prototypeTokenUpdate, ...prototypeTokenUpdate,
x, x,

View file

@ -298,7 +298,7 @@ export default class DualityRoll extends D20Roll {
if (looseSpotlight && game.combat?.active) { if (looseSpotlight && game.combat?.active) {
const currentCombatant = game.combat.combatants.get(game.combat.current?.combatantId); const currentCombatant = game.combat.combatants.get(game.combat.current?.combatantId);
if (currentCombatant?.actorId == config.data.id) ui.combat.setCombatantSpotlight(currentCombatant.id); if (currentCombatant?.actorId == actor.id) ui.combat.setCombatantSpotlight(currentCombatant.id);
} }
} }

View file

@ -1,7 +1,7 @@
import { emitAsGM, GMUpdateEvent } from '../systemRegistration/socket.mjs'; import { emitAsGM, GMUpdateEvent } from '../systemRegistration/socket.mjs';
import { LevelOptionType } from '../data/levelTier.mjs'; import { LevelOptionType } from '../data/levelTier.mjs';
import DHFeature from '../data/item/feature.mjs'; import DHFeature from '../data/item/feature.mjs';
import { createScrollText, damageKeyToNumber, getDamageKey } from '../helpers/utils.mjs'; import { createScrollText, damageKeyToNumber } from '../helpers/utils.mjs';
import DhCompanionLevelUp from '../applications/levelup/companionLevelup.mjs'; import DhCompanionLevelUp from '../applications/levelup/companionLevelup.mjs';
import { ResourceUpdateMap } from '../data/action/baseAction.mjs'; import { ResourceUpdateMap } from '../data/action/baseAction.mjs';
@ -539,11 +539,7 @@ export default class DhpActor extends Actor {
/**@inheritdoc */ /**@inheritdoc */
getRollData() { getRollData() {
const rollData = foundry.utils.deepClone(super.getRollData()); const rollData = super.getRollData().clone();
/* system gets repeated infinately which causes issues when trying to use the data for document creation */
delete rollData.system;
rollData.id = this.id;
rollData.name = this.name; rollData.name = this.name;
rollData.system = this.system.getRollData(); rollData.system = this.system.getRollData();
rollData.prof = this.system.proficiency ?? 1; rollData.prof = this.system.proficiency ?? 1;
@ -631,19 +627,6 @@ export default class DhpActor extends Actor {
} }
} }
} }
if (this.type === 'adversary') {
const reducedSeverity = hpDamage.damageTypes.reduce((value, curr) => {
return Math.max(this.system.rules.damageReduction.reduceSeverity[curr], value);
}, 0);
hpDamage.value = Math.max(hpDamage.value - reducedSeverity, 0);
if (
hpDamage.value &&
this.system.rules.damageReduction.thresholdImmunities[getDamageKey(hpDamage.value)]
) {
hpDamage.value -= 1;
}
}
} }
updates.forEach( updates.forEach(

View file

@ -119,7 +119,7 @@ export const tagifyElement = (element, baseOptions, onChange, tagifyOptions = {}
spellcheck='false' spellcheck='false'
tabIndex="${this.settings.a11y.focusableTags ? 0 : -1}" tabIndex="${this.settings.a11y.focusableTags ? 0 : -1}"
class="${this.settings.classNames.tag} ${tagData.class ? tagData.class : ''}" class="${this.settings.classNames.tag} ${tagData.class ? tagData.class : ''}"
data-tooltip="${tagData.description ? htmlToText(tagData.description) : tagData.name}" data-tooltip="${tagData.description || tagData.name}"
${this.getAttributes(tagData)}> ${this.getAttributes(tagData)}>
<x class="${this.settings.classNames.tagX}" role='button' aria-label='remove tag'></x> <x class="${this.settings.classNames.tagX}" role='button' aria-label='remove tag'></x>
<div> <div>
@ -198,7 +198,7 @@ foundry.dice.terms.Die.prototype.selfCorrecting = function (modifier) {
}; };
export const getDamageKey = damage => { export const getDamageKey = damage => {
return ['none', 'minor', 'major', 'severe', 'massive', 'any'][damage]; return ['none', 'minor', 'major', 'severe', 'massive','any'][damage];
}; };
export const getDamageLabel = damage => { export const getDamageLabel = damage => {
@ -474,10 +474,3 @@ export async function getCritDamageBonus(formula) {
const critRoll = new Roll(formula); const critRoll = new Roll(formula);
return critRoll.dice.reduce((acc, dice) => acc + dice.faces * dice.number, 0); return critRoll.dice.reduce((acc, dice) => acc + dice.faces * dice.number, 0);
} }
export function htmlToText(html) {
var tempDivElement = document.createElement('div');
tempDivElement.innerHTML = html;
return tempDivElement.textContent || tempDivElement.innerText || '';
}

View file

@ -533,31 +533,33 @@
"description": "<p><strong>Spend a Fear</strong> to summon a @UUID[Compendium.daggerheart.adversaries.Actor.YhJrP7rTBiRdX5Fp]{Zombie Legion}, which appears at Close range and immediately takes the spotlight.</p>", "description": "<p><strong>Spend a Fear</strong> to summon a @UUID[Compendium.daggerheart.adversaries.Actor.YhJrP7rTBiRdX5Fp]{Zombie Legion}, which appears at Close range and immediately takes the spotlight.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"qSuWxC8xQOhnbBx9": { "gZg3AkzCYUTExjE6": {
"type": "summon", "type": "effect",
"_id": "qSuWxC8xQOhnbBx9", "_id": "gZg3AkzCYUTExjE6",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"cost": [], "cost": [
{
"scalable": false,
"key": "fear",
"value": 1,
"step": null
}
],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null, "recovery": null
"consumeOnSuccess": false },
"effects": [],
"target": {
"type": "any",
"amount": null
}, },
"summon": [
{
"actorUUID": "Compendium.daggerheart.adversaries.Actor.YhJrP7rTBiRdX5Fp",
"count": "1"
}
],
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/magic/death/undead-zombie-grave-green.webp",
"range": "" "range": ""
} }
}, },

View file

@ -284,7 +284,7 @@
"key": "system.bonuses.roll.attack.bonus", "key": "system.bonuses.roll.attack.bonus",
"mode": 2, "mode": 2,
"value": "ITEM.@system.resource.value", "value": "ITEM.@system.resource.value",
"priority": 21 "priority": null
} }
], ],
"disabled": false, "disabled": false,

View file

@ -457,12 +457,11 @@
"img": "icons/creatures/unholy/demon-fire-horned-clawed.webp", "img": "icons/creatures/unholy/demon-fire-horned-clawed.webp",
"range": "" "range": ""
}, },
"FlE6i0tbKEguF9wz": { "7G6uWlFEeOLsJIWY": {
"type": "summon", "type": "effect",
"_id": "FlE6i0tbKEguF9wz", "_id": "7G6uWlFEeOLsJIWY",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false, "description": "<p>Summon [[/r 1d4]]@UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demons}, who appear at Close range.</p>",
"description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": { "originItem": {
"type": "itemCollection" "type": "itemCollection"
@ -475,13 +474,13 @@
"recovery": null, "recovery": null,
"consumeOnSuccess": false "consumeOnSuccess": false
}, },
"summon": [ "effects": [],
{ "target": {
"actorUUID": "Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb", "type": "any",
"count": "1d4" "amount": null
} },
],
"name": "Summon", "name": "Summon",
"img": "icons/creatures/unholy/demon-fire-horned-clawed.webp",
"range": "" "range": ""
} }
}, },

View file

@ -363,31 +363,33 @@
"description": "<p><strong>Spend a Fear</strong> to grow three @UUID[Compendium.daggerheart.adversaries.Actor.o63nS0k3wHu6EgKP]{Treant Sapling Minions}, who appear at Close range and immediately take the spotlight.</p>", "description": "<p><strong>Spend a Fear</strong> to grow three @UUID[Compendium.daggerheart.adversaries.Actor.o63nS0k3wHu6EgKP]{Treant Sapling Minions}, who appear at Close range and immediately take the spotlight.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"R84DdS0OIx2cUt1w": { "84Q2b0zIY9c7Yhho": {
"type": "summon", "type": "effect",
"_id": "R84DdS0OIx2cUt1w", "_id": "84Q2b0zIY9c7Yhho",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"cost": [], "cost": [
{
"scalable": false,
"key": "fear",
"value": 1,
"step": null
}
],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null, "recovery": null
"consumeOnSuccess": false },
"effects": [],
"target": {
"type": "self",
"amount": null
}, },
"summon": [
{
"actorUUID": "Compendium.daggerheart.adversaries.Actor.o63nS0k3wHu6EgKP",
"count": "3"
}
],
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/magic/unholy/orb-hands-pink.webp",
"range": "" "range": ""
} }
}, },

View file

@ -510,41 +510,34 @@
"description": "<p>When the @Lookup[@name] has 3 or more HP marked, you can <strong>spend a Fear</strong> to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.aLkLFuVoKz2NLoBK]{Tiny Green Oozes} (with no marked HP or Stress). Immediately spotlight both of them.</p>", "description": "<p>When the @Lookup[@name] has 3 or more HP marked, you can <strong>spend a Fear</strong> to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.aLkLFuVoKz2NLoBK]{Tiny Green Oozes} (with no marked HP or Stress). Immediately spotlight both of them.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"J8U7dw3cDSsEirr5": { "s5mLw6DRGd76MLcC": {
"type": "summon", "type": "effect",
"_id": "J8U7dw3cDSsEirr5", "_id": "s5mLw6DRGd76MLcC",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"cost": [ "cost": [
{ {
"scalable": false, "scalable": false,
"key": "fear", "key": "fear",
"value": 1, "value": 1,
"itemId": null, "step": null
"step": null,
"consumeOnSuccess": false
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null, "recovery": null
"consumeOnSuccess": false },
"effects": [],
"target": {
"type": "self",
"amount": null
}, },
"summon": [
{
"actorUUID": "Compendium.daggerheart.adversaries.Actor.aLkLFuVoKz2NLoBK",
"count": "2"
}
],
"name": "Spend Fear", "name": "Spend Fear",
"range": "self" "img": "icons/creatures/slimes/slime-movement-pseudopods-green.webp",
"range": ""
} }
}, },
"originItemType": null, "originItemType": null,

View file

@ -474,31 +474,33 @@
"description": "<p><strong>Spend 2 Fear</strong> to summon [[/r 1d4]] @UUID[Compendium.daggerheart.adversaries.Actor.WWyUp6Mxl1S3KYUG]{Vampires}, who appear at Far range and immediately take the spotlight.</p>", "description": "<p><strong>Spend 2 Fear</strong> to summon [[/r 1d4]] @UUID[Compendium.daggerheart.adversaries.Actor.WWyUp6Mxl1S3KYUG]{Vampires}, who appear at Far range and immediately take the spotlight.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"jGFOnU6PNdWU6iF4": { "5Q6RMUTiauKw0tDj": {
"type": "summon", "type": "effect",
"_id": "jGFOnU6PNdWU6iF4", "_id": "5Q6RMUTiauKw0tDj",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"cost": [], "cost": [
{
"scalable": false,
"key": "fear",
"value": 2,
"step": null
}
],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null, "recovery": null
"consumeOnSuccess": false
}, },
"summon": [ "effects": [],
{ "target": {
"actorUUID": "Compendium.daggerheart.adversaries.Actor.WWyUp6Mxl1S3KYUG", "type": "any",
"count": "1d4" "amount": null
} },
], "name": "Summon Vampires",
"name": "Spend Fear", "img": "icons/creatures/mammals/bat-giant-tattered-purple.webp",
"range": "" "range": ""
} }
}, },

View file

@ -479,31 +479,33 @@
"description": "<p>When the @Lookup[@name] has 4 or more HP marked, you can <strong>spend a Fear</strong> to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.SHXedd9zZPVfUgUa]{Green Oozes}(with no marked HP or Stress). Immediately spotlight both of them.</p>", "description": "<p>When the @Lookup[@name] has 4 or more HP marked, you can <strong>spend a Fear</strong> to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.SHXedd9zZPVfUgUa]{Green Oozes}(with no marked HP or Stress). Immediately spotlight both of them.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"aeRdkiRsDNagTKhp": { "iQsYAqpUFvJslRDr": {
"type": "summon", "type": "effect",
"_id": "aeRdkiRsDNagTKhp", "_id": "iQsYAqpUFvJslRDr",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"cost": [], "cost": [
{
"scalable": false,
"key": "fear",
"value": 1,
"step": null
}
],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null, "recovery": null
"consumeOnSuccess": false },
"effects": [],
"target": {
"type": "any",
"amount": null
}, },
"summon": [
{
"actorUUID": "Compendium.daggerheart.adversaries.Actor.SHXedd9zZPVfUgUa",
"count": "2"
}
],
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/creatures/slimes/slime-movement-pseudopods-green.webp",
"range": "" "range": ""
} }
}, },

View file

@ -287,35 +287,7 @@
"system": { "system": {
"description": "<p>Summon three @Compendium[daggerheart.adversaries.Actor.C0OMQqV7pN6t7ouR], who appear at Far range.</p>", "description": "<p>Summon three @Compendium[daggerheart.adversaries.Actor.C0OMQqV7pN6t7ouR], who appear at Far range.</p>",
"resource": null, "resource": null,
"actions": { "actions": {},
"MCTBsw9lusUdubj0": {
"type": "summon",
"_id": "MCTBsw9lusUdubj0",
"systemPath": "actions",
"baseAction": false,
"description": "",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"summon": [
{
"actorUUID": "Compendium.daggerheart.adversaries.Actor.C0OMQqV7pN6t7ouR",
"count": "3"
}
],
"name": "Summon",
"range": ""
}
},
"originItemType": null, "originItemType": null,
"subType": null, "subType": null,
"originId": null, "originId": null,

View file

@ -258,40 +258,57 @@
"description": "<p>Once per scene, <strong>mark a Stress</strong> to summon <strong>1d4</strong> @UUID[Compendium.daggerheart.adversaries.Actor.B4LZcGuBAHzyVdzy]{Bladed Guards}, who appear at Far range to enforce the @Lookup[@name]s will.</p>", "description": "<p>Once per scene, <strong>mark a Stress</strong> to summon <strong>1d4</strong> @UUID[Compendium.daggerheart.adversaries.Actor.B4LZcGuBAHzyVdzy]{Bladed Guards}, who appear at Far range to enforce the @Lookup[@name]s will.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"tioTtYfIGFIXRITN": { "cUKwhq1imsTVru8D": {
"type": "summon", "type": "attack",
"_id": "tioTtYfIGFIXRITN", "_id": "cUKwhq1imsTVru8D",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false, "description": "<p>Once per scene, <strong>mark a Stress</strong> to summon <strong>1d4</strong> @UUID[Compendium.daggerheart.adversaries.Actor.B4LZcGuBAHzyVdzy]{Bladed Guards}, who appear at Far range to enforce the Nobles will.</p>",
"description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"cost": [ "cost": [
{ {
"scalable": false, "scalable": false,
"key": "stress", "key": "stress",
"value": 1, "value": 1,
"itemId": null, "step": null
"step": null,
"consumeOnSuccess": false
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "1", "max": "",
"recovery": "scene", "recovery": null
"consumeOnSuccess": false },
"damage": {
"parts": [],
"includeBase": false
},
"target": {
"type": "any",
"amount": null
},
"effects": [],
"roll": {
"type": "diceSet",
"trait": null,
"difficulty": null,
"bonus": null,
"advState": "neutral",
"diceRolling": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d4",
"compare": null,
"treshold": null
},
"useDefault": false
},
"save": {
"trait": null,
"difficulty": null,
"damageMod": "none"
}, },
"summon": [
{
"actorUUID": "Compendium.daggerheart.adversaries.Actor.B4LZcGuBAHzyVdzy",
"count": "1d4"
}
],
"name": "Summon Guards", "name": "Summon Guards",
"img": "icons/environment/people/infantry-armored.webp",
"range": "" "range": ""
} }
}, },

View file

@ -313,43 +313,36 @@
"_id": "WGEGO0DSOs5cF0EL", "_id": "WGEGO0DSOs5cF0EL",
"img": "icons/environment/people/charge.webp", "img": "icons/environment/people/charge.webp",
"system": { "system": {
"description": "<p>Once per scene, <strong>mark a Stress</strong> to summon a @UUID[Compendium.daggerheart.adversaries.Actor.5YgEajn0wa4i85kC]{Pirate Raider Horde}, which appears at Far range.</p>", "description": "<p>Once per scene, <strong>mark a Stress</strong> to summon a Pirate Raiders Horde, which appears at Far range.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"nuYk5WeLLpIKa69q": { "NlgIp0KrmZoS27Xy": {
"type": "summon", "type": "effect",
"_id": "nuYk5WeLLpIKa69q", "_id": "NlgIp0KrmZoS27Xy",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"cost": [ "cost": [
{ {
"scalable": false, "scalable": false,
"key": "stress", "key": "stress",
"value": 1, "value": 1,
"itemId": null, "step": null
"step": null,
"consumeOnSuccess": false
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null, "recovery": null
"consumeOnSuccess": false },
"effects": [],
"target": {
"type": "any",
"amount": null
}, },
"summon": [
{
"actorUUID": "Compendium.daggerheart.adversaries.Actor.5YgEajn0wa4i85kC",
"count": "1"
}
],
"name": "Mark Stress", "name": "Mark Stress",
"img": "icons/environment/people/charge.webp",
"range": "" "range": ""
} }
}, },

View file

@ -454,40 +454,33 @@
"description": "<p>When the @Lookup[@name] has 3 or more HP marked, you can <strong>spend a Fear</strong> to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.1fkLQXVtmILqfJ44]{Tiny Red Oozes} (with no marked HP or Stress). Immediately spotlight both of them.</p>", "description": "<p>When the @Lookup[@name] has 3 or more HP marked, you can <strong>spend a Fear</strong> to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.1fkLQXVtmILqfJ44]{Tiny Red Oozes} (with no marked HP or Stress). Immediately spotlight both of them.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"BMEr77hDxaQyYBna": { "dw6Juw8mriH7sg0e": {
"type": "summon", "type": "effect",
"_id": "BMEr77hDxaQyYBna", "_id": "dw6Juw8mriH7sg0e",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"cost": [ "cost": [
{ {
"scalable": false, "scalable": false,
"key": "fear", "key": "fear",
"value": 1, "value": 1,
"itemId": null, "step": null
"step": null,
"consumeOnSuccess": false
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null, "recovery": null
"consumeOnSuccess": false },
"effects": [],
"target": {
"type": "any",
"amount": null
}, },
"summon": [
{
"actorUUID": "Compendium.daggerheart.adversaries.Actor.1fkLQXVtmILqfJ44",
"count": "2"
}
],
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/creatures/slimes/slime-movement-splashing-red.webp",
"range": "" "range": ""
} }
}, },

View file

@ -416,6 +416,28 @@
"description": "<p><em>Countdown (6)</em>. When the @Lookup[@name] is in the spotlight for the first time, activate the countdown. When they mark HP, tick down this countdown by the number of HP marked. When it triggers, summon a @UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demon} who appears at Close range.</p>", "description": "<p><em>Countdown (6)</em>. When the @Lookup[@name] is in the spotlight for the first time, activate the countdown. When they mark HP, tick down this countdown by the number of HP marked. When it triggers, summon a @UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demon} who appears at Close range.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"0rixG6jLRynAYNqA": {
"type": "effect",
"_id": "0rixG6jLRynAYNqA",
"systemPath": "actions",
"description": "<p>Summon a @UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demon} who appears at Close range.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null
},
"effects": [],
"target": {
"type": "any",
"amount": null
},
"name": "Summon",
"img": "icons/magic/unholy/silhouette-light-fire-blue.webp",
"range": "close"
},
"ZVXHY2fpomoKV7jG": { "ZVXHY2fpomoKV7jG": {
"type": "countdown", "type": "countdown",
"_id": "ZVXHY2fpomoKV7jG", "_id": "ZVXHY2fpomoKV7jG",
@ -452,33 +474,6 @@
"name": "Start Countdown", "name": "Start Countdown",
"img": "icons/magic/unholy/silhouette-light-fire-blue.webp", "img": "icons/magic/unholy/silhouette-light-fire-blue.webp",
"range": "" "range": ""
},
"YReYG6DrWp4QGSij": {
"type": "summon",
"_id": "YReYG6DrWp4QGSij",
"systemPath": "actions",
"baseAction": false,
"description": "",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"summon": [
{
"actorUUID": "Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb",
"count": "1"
}
],
"name": "Summon",
"range": ""
} }
}, },
"originItemType": null, "originItemType": null,
@ -507,31 +502,33 @@
"description": "<p>Once per scene, when the @Lookup[@name] marks 2 or more HP, you can <strong>mark a Stress</strong> to summon a @UUID[Compendium.daggerheart.adversaries.Actor.NoRZ1PqB8N5wcIw0]{Demonic Hound Pack}, which appears at Close range and is immediately spotlighted.</p>", "description": "<p>Once per scene, when the @Lookup[@name] marks 2 or more HP, you can <strong>mark a Stress</strong> to summon a @UUID[Compendium.daggerheart.adversaries.Actor.NoRZ1PqB8N5wcIw0]{Demonic Hound Pack}, which appears at Close range and is immediately spotlighted.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"tfmY6HYkkY27NBaF": { "JBuQUJhif2A7IlJd": {
"type": "summon", "type": "effect",
"_id": "tfmY6HYkkY27NBaF", "_id": "JBuQUJhif2A7IlJd",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"cost": [], "cost": [
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"summon": [
{ {
"actorUUID": "Compendium.daggerheart.adversaries.Actor.NoRZ1PqB8N5wcIw0", "scalable": false,
"count": "1" "key": "stress",
"value": 1,
"step": null
} }
], ],
"uses": {
"value": null,
"max": "1",
"recovery": "scene"
},
"effects": [],
"target": {
"type": "self",
"amount": null
},
"name": "Mark Stress", "name": "Mark Stress",
"img": "icons/creatures/unholy/demon-fire-horned-clawed.webp",
"range": "" "range": ""
} }
}, },

View file

@ -340,35 +340,7 @@
"system": { "system": {
"description": "<p>When an attack from the @Lookup[@name] causes a target to mark HP and there are three or more @Lookup[@name] Minions within Close range, you can combine the Minions into a @UUID[Compendium.daggerheart.adversaries.Actor.PKSXFuaIHUCoH63A]{Tangle Bramble Swarm Horde}. The Hordes HP is equal to the number of Minions combined.</p>", "description": "<p>When an attack from the @Lookup[@name] causes a target to mark HP and there are three or more @Lookup[@name] Minions within Close range, you can combine the Minions into a @UUID[Compendium.daggerheart.adversaries.Actor.PKSXFuaIHUCoH63A]{Tangle Bramble Swarm Horde}. The Hordes HP is equal to the number of Minions combined.</p>",
"resource": null, "resource": null,
"actions": { "actions": {},
"g1OQ5xlMHFWsoktd": {
"type": "summon",
"_id": "g1OQ5xlMHFWsoktd",
"systemPath": "actions",
"baseAction": false,
"description": "",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"summon": [
{
"actorUUID": "Compendium.daggerheart.adversaries.Actor.PKSXFuaIHUCoH63A",
"count": "1"
}
],
"name": "Summon",
"range": ""
}
},
"originItemType": null, "originItemType": null,
"subType": null, "subType": null,
"originId": null, "originId": null,

View file

@ -36,13 +36,13 @@
"key": "system.damageThresholds.major", "key": "system.damageThresholds.major",
"mode": 2, "mode": 2,
"value": "@prof", "value": "@prof",
"priority": 21 "priority": null
}, },
{ {
"key": "system.damageThresholds.severe", "key": "system.damageThresholds.severe",
"mode": 2, "mode": 2,
"value": "@prof", "value": "@prof",
"priority": 21 "priority": null
} }
], ],
"disabled": false, "disabled": false,

View file

@ -100,7 +100,7 @@
"key": "system.resistance.physical.reduction", "key": "system.resistance.physical.reduction",
"mode": 2, "mode": 2,
"value": "@system.armorScore", "value": "@system.armorScore",
"priority": 21 "priority": null
} }
], ],
"disabled": false, "disabled": false,

View file

@ -38,13 +38,13 @@
"key": "system.bonuses.damage.primaryWeapon.bonus", "key": "system.bonuses.damage.primaryWeapon.bonus",
"mode": 2, "mode": 2,
"value": "@system.traits.strength.value", "value": "@system.traits.strength.value",
"priority": 21 "priority": null
}, },
{ {
"key": "system.bonuses.damage.secondaryWeapon.bonus", "key": "system.bonuses.damage.secondaryWeapon.bonus",
"mode": 2, "mode": 2,
"value": "@system.traits.strength.value", "value": "@system.traits.strength.value",
"priority": 21 "priority": null
} }
], ],
"disabled": false, "disabled": false,
@ -57,7 +57,7 @@
"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\">On a successful attack using a weapon with 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\">Melee</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, gain a bonus to your damage roll equal to your </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\">Strength</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\">.</span></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\">On a successful attack using a weapon with 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\">Melee</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, gain a bonus to your damage roll equal to your </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\">Strength</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\">.</p>",
"origin": null, "origin": null,
"tint": "#ffffff", "tint": "#ffffff",
"transfer": true, "transfer": true,

View file

@ -37,13 +37,13 @@
"key": "system.bonuses.damage.primaryWeapon.bonus", "key": "system.bonuses.damage.primaryWeapon.bonus",
"mode": 2, "mode": 2,
"value": "@system.traits.agility.value", "value": "@system.traits.agility.value",
"priority": 21 "priority": null
}, },
{ {
"key": "system.bonuses.damage.secondaryWeapon.bonus", "key": "system.bonuses.damage.secondaryWeapon.bonus",
"mode": 2, "mode": 2,
"value": "@system.traits.agility.value", "value": "@system.traits.agility.value",
"priority": 21 "priority": null
} }
], ],
"disabled": true, "disabled": true,

View file

@ -101,7 +101,7 @@
"key": "system.traits.presence.value", "key": "system.traits.presence.value",
"mode": 5, "mode": 5,
"value": "@cast", "value": "@cast",
"priority": 51 "priority": null
} }
], ],
"disabled": false, "disabled": false,

View file

@ -113,13 +113,13 @@
"key": "system.bonuses.damage.magical.bonus", "key": "system.bonuses.damage.magical.bonus",
"mode": 2, "mode": 2,
"value": "2*@system.traits.strength.value", "value": "2*@system.traits.strength.value",
"priority": 21 "priority": null
}, },
{ {
"key": "system.bonuses.damage.physical.bonus", "key": "system.bonuses.damage.physical.bonus",
"mode": 2, "mode": 2,
"value": "2*@system.traits.strength.value", "value": "2*@system.traits.strength.value",
"priority": 21 "priority": null
} }
], ],
"disabled": false, "disabled": false,
@ -162,13 +162,13 @@
"key": "system.bonuses.damage.magical.bonus", "key": "system.bonuses.damage.magical.bonus",
"mode": 2, "mode": 2,
"value": "4*@system.traits.strength.value", "value": "4*@system.traits.strength.value",
"priority": 21 "priority": null
}, },
{ {
"key": "system.bonuses.damage.physical.bonus", "key": "system.bonuses.damage.physical.bonus",
"mode": 2, "mode": 2,
"value": "4*@system.traits.strength.value", "value": "4*@system.traits.strength.value",
"priority": 21 "priority": null
} }
], ],
"disabled": false, "disabled": false,

View file

@ -106,7 +106,7 @@
"key": "system.damageThresholds.severe", "key": "system.damageThresholds.severe",
"mode": 2, "mode": 2,
"value": "@system.proficiency", "value": "@system.proficiency",
"priority": 21 "priority": null
} }
], ],
"disabled": false, "disabled": false,
@ -119,7 +119,7 @@
"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\">Gain a bonus to your </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\">Severe </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\">threshold equal to your </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\">Proficiency</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\">.</span></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\">Gain a bonus to your </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\">Severe </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\">threshold equal to your </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\">Proficiency</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\">.</p>",
"origin": null, "origin": null,
"tint": "#ffffff", "tint": "#ffffff",
"transfer": true, "transfer": true,

View file

@ -37,7 +37,7 @@
"key": "system.evasion", "key": "system.evasion",
"mode": 2, "mode": 2,
"value": "ceil(@system.traits.agility.value / 2)", "value": "ceil(@system.traits.agility.value / 2)",
"priority": 21 "priority": null
} }
], ],
"disabled": false, "disabled": false,

View file

@ -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 dies value. You then increase the dies value by one. When the dies value would exceed 6, this effect ends.</p><p>@Template[type:emanation|range:vc]</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 dies value. You then increase the dies value by one. When the dies 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]</p>",
"domain": "splendor", "domain": "splendor",
"recallCost": 2, "recallCost": 2,
"level": 6, "level": 6,

View file

@ -314,7 +314,7 @@
"name": "Charcoal Constructs", "name": "Charcoal Constructs",
"type": "feature", "type": "feature",
"system": { "system": {
"description": "<p>Warped animals wreathed in indigo flame trample through a point of your choice. All targets within Close range of that point must make an Agility Reaction Roll. Targets who fail take <strong>3d12+3</strong> physical damage. Targets who succeed take half damage instead.</p><p>@Template[type:emanation|range:c]</p><section class=\"secret\" id=\"secret-696PMvOPzHmkdtYc\"><p><em>Are these real animals consumed by the fl ame or merely constructs of the corrupting magic?</em></p></section>", "description": "<p>Warped animals wreathed in indigo f l ame trample through a point of your choice. All targets within Close range of that point must make an Agility Reaction Roll. Targets who fail take <strong>3d12+3</strong> physical damage. Targets who succeed take half damage instead.</p><p>@Template[type:emanation|range:c]</p><section class=\"secret\" id=\"secret-696PMvOPzHmkdtYc\"><p><em>Are these real animals consumed by the fl ame or merely constructs of the corrupting magic?</em></p></section>",
"resource": null, "resource": null,
"actions": { "actions": {
"gbXIaKr8em134IZC": { "gbXIaKr8em134IZC": {

View file

@ -467,48 +467,33 @@
"description": "<p><strong>Spend a Fear</strong> to summon an @UUID[Compendium.daggerheart.adversaries.Actor.A0SeeDzwjvqOsyof]{Outer Realms Abomination}, an@UUID[Compendium.daggerheart.adversaries.Actor.ms6nuOl3NFkhPj1k]{Outer Realms Corrupter}, and [[/r 2d6]] @UUID[Compendium.daggerheart.adversaries.Actor.moJhHgKqTKPS2WYS]{Outer Realms Thrall}, who appear at Close range of a chosen PC in defiance of logic and causality. Immediately spotlight one of these adversaries, and you can spend an additional Fear to automatically succeed on that adversarys standard attack.</p><section class=\"secret\" id=\"secret-psXRRXLoibTKFpaW\"><p><em>What halfconsumed remnants of the shattered world do these monstrosities cast aside in pursuit of living flesh? What jagged refl ections of former personhood do you catch between moments of unquestioning malice?</em></p></section>", "description": "<p><strong>Spend a Fear</strong> to summon an @UUID[Compendium.daggerheart.adversaries.Actor.A0SeeDzwjvqOsyof]{Outer Realms Abomination}, an@UUID[Compendium.daggerheart.adversaries.Actor.ms6nuOl3NFkhPj1k]{Outer Realms Corrupter}, and [[/r 2d6]] @UUID[Compendium.daggerheart.adversaries.Actor.moJhHgKqTKPS2WYS]{Outer Realms Thrall}, who appear at Close range of a chosen PC in defiance of logic and causality. Immediately spotlight one of these adversaries, and you can spend an additional Fear to automatically succeed on that adversarys standard attack.</p><section class=\"secret\" id=\"secret-psXRRXLoibTKFpaW\"><p><em>What halfconsumed remnants of the shattered world do these monstrosities cast aside in pursuit of living flesh? What jagged refl ections of former personhood do you catch between moments of unquestioning malice?</em></p></section>",
"resource": null, "resource": null,
"actions": { "actions": {
"KCzdCu2KhAx9KyhT": { "5a8ESNroEQHAm7rO": {
"type": "summon", "type": "effect",
"_id": "KCzdCu2KhAx9KyhT", "_id": "5a8ESNroEQHAm7rO",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false, "description": "<p><strong>Spend a Fear</strong> to summon an @UUID[Compendium.daggerheart.adversaries.Actor.A0SeeDzwjvqOsyof]{Outer Realms Abomination}, an@UUID[Compendium.daggerheart.adversaries.Actor.ms6nuOl3NFkhPj1k]{Outer Realms Corrupter}, and [[/r 2d6]] @UUID[Compendium.daggerheart.adversaries.Actor.moJhHgKqTKPS2WYS]{Outer Realms Thrall}, who appear at Close range of a chosen PC in defiance of logic and causality. Immediately spotlight one of these adversaries, and you can spend an additional Fear to automatically succeed on that adversarys standard attack.</p><section class=\"secret\" id=\"secret-ADMZbUwBRqcZNks5\"><p><em>What halfconsumed remnants of the shattered world do these monstrosities cast aside in pursuit of living flesh? What jagged refl ections of former personhood do you catch between moments of unquestioning malice?</em></p></section>",
"description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"cost": [ "cost": [
{ {
"scalable": false, "scalable": false,
"key": "fear", "key": "fear",
"value": 1, "value": 1,
"itemId": null, "step": null
"step": null,
"consumeOnSuccess": false
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null, "recovery": null
"consumeOnSuccess": false },
"effects": [],
"target": {
"type": "any",
"amount": null
}, },
"summon": [
{
"actorUUID": "Compendium.daggerheart.adversaries.Actor.A0SeeDzwjvqOsyof",
"count": "1"
},
{
"actorUUID": "Compendium.daggerheart.adversaries.Actor.ms6nuOl3NFkhPj1k",
"count": "1"
},
{
"actorUUID": "Compendium.daggerheart.adversaries.Actor.moJhHgKqTKPS2WYS",
"count": "2d6"
}
],
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/creatures/unholy/demons-horned-glowing-pink.webp",
"range": "" "range": ""
} }
}, },

View file

@ -343,12 +343,11 @@
"img": "icons/magic/unholy/barrier-fire-pink.webp", "img": "icons/magic/unholy/barrier-fire-pink.webp",
"range": "" "range": ""
}, },
"HG7tbEdlYl3yLQnR": { "suFEnfpOfeVRvnJF": {
"type": "summon", "type": "effect",
"_id": "HG7tbEdlYl3yLQnR", "_id": "suFEnfpOfeVRvnJF",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false, "description": "<p>Summon a @UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demon} within Very Close range of the rituals leader.</p>",
"description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": { "originItem": {
"type": "itemCollection" "type": "itemCollection"
@ -361,13 +360,13 @@
"recovery": null, "recovery": null,
"consumeOnSuccess": false "consumeOnSuccess": false
}, },
"summon": [ "effects": [],
{ "target": {
"actorUUID": "Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb", "type": "any",
"count": "1" "amount": null
} },
],
"name": "Summon Demon", "name": "Summon Demon",
"img": "icons/magic/unholy/barrier-fire-pink.webp",
"range": "" "range": ""
} }
}, },

View file

@ -248,31 +248,33 @@
"description": "<p><strong>Spend 2 Fear</strong> to summon [[/r 1d4+2]] @UUID[Compendium.daggerheart.adversaries.Actor.OsLG2BjaEdTZUJU9]{Fallen Shock Troop} that appear within Close range of the Usurper to assist their divine siege. Immediately spotlight the Shock Troops to use a “Group Attack” action.</p><section class=\"secret\" id=\"secret-QJHdwGNSuTgS59gn\"><p><em>Which High Fallen do these troops serve? Which gods fl esh do they wish to feast upon?</em></p></section>", "description": "<p><strong>Spend 2 Fear</strong> to summon [[/r 1d4+2]] @UUID[Compendium.daggerheart.adversaries.Actor.OsLG2BjaEdTZUJU9]{Fallen Shock Troop} that appear within Close range of the Usurper to assist their divine siege. Immediately spotlight the Shock Troops to use a “Group Attack” action.</p><section class=\"secret\" id=\"secret-QJHdwGNSuTgS59gn\"><p><em>Which High Fallen do these troops serve? Which gods fl esh do they wish to feast upon?</em></p></section>",
"resource": null, "resource": null,
"actions": { "actions": {
"okcqGrI4rdghugUi": { "qIQTEO5t72xFtKYI": {
"type": "summon", "type": "effect",
"_id": "okcqGrI4rdghugUi", "_id": "qIQTEO5t72xFtKYI",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false, "description": "<p><strong>Spend 2 Fear</strong> to summon [[/r 1d4+2]] @UUID[Compendium.daggerheart.adversaries.Actor.OsLG2BjaEdTZUJU9]{Fallen Shock Troop} that appear within Close range of the Usurper to assist their divine siege. Immediately spotlight the Shock Troops to use a “Group Attack” action.</p><section class=\"secret\" id=\"secret-fNfGy8lT8b7elPcE\"><p><em>Which High Fallen do these troops serve? Which gods fl esh do they wish to feast upon?</em></p></section>",
"description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"cost": [], "cost": [
{
"scalable": false,
"key": "fear",
"value": 2,
"step": null
}
],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null, "recovery": null
"consumeOnSuccess": false },
"effects": [],
"target": {
"type": "self",
"amount": null
}, },
"summon": [
{
"actorUUID": "Compendium.daggerheart.adversaries.Actor.OsLG2BjaEdTZUJU9",
"count": "1d4+2"
}
],
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/magic/unholy/orb-hands-pink.webp",
"range": "" "range": ""
} }
}, },

View file

@ -246,35 +246,7 @@
"system": { "system": {
"description": "<p>When the PCs enter the raptors hunting grounds, two @UUID[Compendium.daggerheart.adversaries.Actor.OMQ0v6PE8s1mSU0K]{Giant Eagles} appear at Very Far range of a chosen PC, identifying the PCs as likely prey. </p><section id=\"secret-aU19zKlmhVBdS2oF\" class=\"secret\"><p><em>How long has it been since the eagles last found prey? Do they have eggs in their nest or unfl edged young?</em></p></section>", "description": "<p>When the PCs enter the raptors hunting grounds, two @UUID[Compendium.daggerheart.adversaries.Actor.OMQ0v6PE8s1mSU0K]{Giant Eagles} appear at Very Far range of a chosen PC, identifying the PCs as likely prey. </p><section id=\"secret-aU19zKlmhVBdS2oF\" class=\"secret\"><p><em>How long has it been since the eagles last found prey? Do they have eggs in their nest or unfl edged young?</em></p></section>",
"resource": null, "resource": null,
"actions": { "actions": {},
"88MyOC3IRcct6VLk": {
"type": "summon",
"_id": "88MyOC3IRcct6VLk",
"systemPath": "actions",
"baseAction": false,
"description": "",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"summon": [
{
"actorUUID": "Compendium.daggerheart.adversaries.Actor.OMQ0v6PE8s1mSU0K",
"count": "2"
}
],
"name": "Summon",
"range": ""
}
},
"originItemType": null, "originItemType": null,
"originId": null, "originId": null,
"featureForm": "reaction" "featureForm": "reaction"

View file

@ -360,40 +360,33 @@
"description": "<p><strong>Spend a Fear</strong> to summon a @UUID[Compendium.daggerheart.adversaries.Actor.8KWVLWXFhlY2kYx0]{Glass Snake} within Close range of a chosen PC. The Snake appears in or near the river and immediately takes the spotlight to use their “Spinning Serpent” action.</p><section class=\"secret\" id=\"secret-F8zsJQg3xWOPpH5v\"><p><em>What treasures does the beast have in their burrow? What travelers have already fallen victim to this predator?</em></p></section>", "description": "<p><strong>Spend a Fear</strong> to summon a @UUID[Compendium.daggerheart.adversaries.Actor.8KWVLWXFhlY2kYx0]{Glass Snake} within Close range of a chosen PC. The Snake appears in or near the river and immediately takes the spotlight to use their “Spinning Serpent” action.</p><section class=\"secret\" id=\"secret-F8zsJQg3xWOPpH5v\"><p><em>What treasures does the beast have in their burrow? What travelers have already fallen victim to this predator?</em></p></section>",
"resource": null, "resource": null,
"actions": { "actions": {
"uY9HMKE4Q5g7bRKg": { "Mnp0Yzc7EPVXm8So": {
"type": "summon", "type": "effect",
"_id": "uY9HMKE4Q5g7bRKg", "_id": "Mnp0Yzc7EPVXm8So",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false, "description": "<p><strong>Spend a Fear</strong> to summon a @UUID[Compendium.daggerheart.adversaries.Actor.8KWVLWXFhlY2kYx0]{Glass Snake} within Close range of a chosen PC. The Snake appears in or near the river and immediately takes the spotlight to use their “Spinning Serpent” action.</p><section class=\"secret\" id=\"secret-YIc1Y8jgJKanim7f\"><p><em>What treasures does the beast have in their burrow? What travelers have already fallen victim to this predator?</em></p></section>",
"description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"cost": [ "cost": [
{ {
"scalable": false, "scalable": false,
"key": "fear", "key": "fear",
"value": 1, "value": 1,
"itemId": null, "step": null
"step": null,
"consumeOnSuccess": false
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null, "recovery": null
"consumeOnSuccess": false },
"effects": [],
"target": {
"type": "self",
"amount": null
}, },
"summon": [
{
"actorUUID": "Compendium.daggerheart.adversaries.Actor.8KWVLWXFhlY2kYx0",
"count": "1"
}
],
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/creatures/reptiles/snake-fangs-bite-green-yellow.webp",
"range": "" "range": ""
} }
}, },

View file

@ -39,7 +39,7 @@
"key": "system.armorScore", "key": "system.armorScore",
"mode": 2, "mode": 2,
"value": "@system.traits.strength.value", "value": "@system.traits.strength.value",
"priority": 21 "priority": null
} }
], ],
"disabled": false, "disabled": false,

View file

@ -42,8 +42,7 @@
{ {
"key": "system.resistance.magical.reduction", "key": "system.resistance.magical.reduction",
"mode": 2, "mode": 2,
"value": "@system.armorScore", "value": "@system.armorScore"
"priority": 21
} }
], ],
"_id": "xGxqTCO8MjNq5Cw6", "_id": "xGxqTCO8MjNq5Cw6",

View file

@ -4,7 +4,7 @@
"_id": "y4c1jrlHrf0wBWOq", "_id": "y4c1jrlHrf0wBWOq",
"img": "icons/magic/light/projectiles-star-purple.webp", "img": "icons/magic/light/projectiles-star-purple.webp",
"system": { "system": {
"description": "<p>You can use this stardrop to summon a hailstorm of comets that deals 8d20 physical damage to all targets within Very Far range.</p>", "description": "<p>You can use this stardrop to summon a hailstorm of comets that deals 8d20 physical damage to all targets within Very Far range.</p><p>@Template[type:emanation|range:vf]</p>",
"quantity": 1, "quantity": 1,
"actions": { "actions": {
"pt5U6hlyx4T7MUOa": { "pt5U6hlyx4T7MUOa": {

View file

@ -155,8 +155,7 @@
{ {
"key": "system.evasion", "key": "system.evasion",
"mode": 2, "mode": 2,
"value": "@system.armorScore", "value": "@system.armorScore"
"priority": 21
} }
], ],
"transfer": false, "transfer": false,

View file

@ -117,8 +117,7 @@
{ {
"key": "system.bonuses.damage.primaryWeapon.bonus", "key": "system.bonuses.damage.primaryWeapon.bonus",
"mode": 2, "mode": 2,
"value": "@system.traits.agility.value", "value": "@system.traits.agility.value"
"priority": 21
} }
], ],
"_id": "jMIrOhpPUncn7dWg", "_id": "jMIrOhpPUncn7dWg",

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,319 +0,0 @@
{
"name": "Table of Random Objectives",
"img": "icons/sundries/documents/document-torn-diagram-tan.webp",
"description": "<p>Layering Goals Other than Attrition into Combat</p>",
"results": [
{
"type": "text",
"weight": 1,
"range": [
1,
1
],
"_id": "LDuVbmdvhJiEOe7U",
"name": "",
"img": "icons/svg/d12-grey.svg",
"description": "<p>Acquire (obtain or steal) an important item or items.</p>",
"drawn": false,
"flags": {},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "1.4.4",
"lastModifiedBy": null
},
"documentUuid": null,
"_key": "!tables.results!I5L1dlgxXTNrCCkL.LDuVbmdvhJiEOe7U"
},
{
"type": "text",
"weight": 1,
"range": [
2,
2
],
"_id": "FxYpST4nQUTBp1mN",
"name": "",
"img": "icons/svg/d12-grey.svg",
"description": "<p>Capture one or more of the opponents.</p>",
"drawn": false,
"flags": {},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "1.4.4",
"lastModifiedBy": null
},
"documentUuid": null,
"_key": "!tables.results!I5L1dlgxXTNrCCkL.FxYpST4nQUTBp1mN"
},
{
"type": "text",
"weight": 1,
"range": [
3,
3
],
"_id": "bTkZgxqEr4lNxzeK",
"name": "",
"img": "icons/svg/d12-grey.svg",
"description": "<p>Activate a magical device.</p>",
"drawn": false,
"flags": {},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "1.4.4",
"lastModifiedBy": null
},
"documentUuid": null,
"_key": "!tables.results!I5L1dlgxXTNrCCkL.bTkZgxqEr4lNxzeK"
},
{
"type": "text",
"weight": 1,
"range": [
4,
4
],
"_id": "T39LgOL1cw5AIY59",
"name": "",
"img": "icons/svg/d12-grey.svg",
"description": "<p>Frame a character or tarnish their reputation.</p>",
"drawn": false,
"flags": {},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "1.4.4",
"lastModifiedBy": null
},
"documentUuid": null,
"_key": "!tables.results!I5L1dlgxXTNrCCkL.T39LgOL1cw5AIY59"
},
{
"type": "text",
"weight": 1,
"range": [
5,
5
],
"_id": "MHgv8dlrwA3ZmBKq",
"name": "",
"img": "icons/svg/d12-grey.svg",
"description": "<p>Drive the opponent into a corner or ambush point.</p>",
"drawn": false,
"flags": {},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "1.4.4",
"lastModifiedBy": null
},
"documentUuid": null,
"_key": "!tables.results!I5L1dlgxXTNrCCkL.MHgv8dlrwA3ZmBKq"
},
{
"type": "text",
"weight": 1,
"range": [
6,
6
],
"_id": "4USCNNavzVvBqldn",
"name": "",
"img": "icons/svg/d12-grey.svg",
"description": "<p>Stop a magical ritual, legal ceremony, or time-sensitive spell.</p>",
"drawn": false,
"flags": {},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "1.4.4",
"lastModifiedBy": null
},
"documentUuid": null,
"_key": "!tables.results!I5L1dlgxXTNrCCkL.4USCNNavzVvBqldn"
},
{
"type": "text",
"weight": 1,
"range": [
7,
7
],
"_id": "gwZnWTauHsbb6rsr",
"name": "",
"img": "icons/svg/d12-grey.svg",
"description": "<p>Hold the line—keep the enemy from reaching a specific area or group.</p>",
"drawn": false,
"flags": {},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "1.4.4",
"lastModifiedBy": null
},
"documentUuid": null,
"_key": "!tables.results!I5L1dlgxXTNrCCkL.gwZnWTauHsbb6rsr"
},
{
"type": "text",
"weight": 1,
"range": [
8,
8
],
"_id": "beDIxxPyCCVa8nlE",
"name": "",
"img": "icons/svg/d12-grey.svg",
"description": "<p>Plant evidence or a tracking device on a target.</p>",
"drawn": false,
"flags": {},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "1.4.4",
"lastModifiedBy": null
},
"documentUuid": null,
"_key": "!tables.results!I5L1dlgxXTNrCCkL.beDIxxPyCCVa8nlE"
},
{
"type": "text",
"weight": 1,
"range": [
9,
9
],
"_id": "C70V6prVmZd5VRV8",
"name": "",
"img": "icons/svg/d12-grey.svg",
"description": "<p>Secure a specific location ahead of another groups arrival.</p>",
"drawn": false,
"flags": {},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "1.4.4",
"lastModifiedBy": null
},
"documentUuid": null,
"_key": "!tables.results!I5L1dlgxXTNrCCkL.C70V6prVmZd5VRV8"
},
{
"type": "text",
"weight": 1,
"range": [
10,
10
],
"_id": "i02rh05CvhHlKJCN",
"name": "",
"img": "icons/svg/d12-grey.svg",
"description": "<p>Harass the opponent to deplete their resources or keep them occupied.</p>",
"drawn": false,
"flags": {},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "1.4.4",
"lastModifiedBy": null
},
"documentUuid": null,
"_key": "!tables.results!I5L1dlgxXTNrCCkL.i02rh05CvhHlKJCN"
},
{
"type": "text",
"weight": 1,
"range": [
11,
11
],
"_id": "AbNgD5GCbWuui9oP",
"name": "",
"img": "icons/svg/d12-grey.svg",
"description": "<p>Destroy a piece of architecture, a statue, a shrine, or a weapon.</p>",
"drawn": false,
"flags": {},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "1.4.4",
"lastModifiedBy": null
},
"documentUuid": null,
"_key": "!tables.results!I5L1dlgxXTNrCCkL.AbNgD5GCbWuui9oP"
},
{
"type": "text",
"weight": 1,
"range": [
12,
12
],
"_id": "TCrdyh3qhl2vtQxO",
"name": "",
"img": "icons/svg/d12-grey.svg",
"description": "<p>Investigate a situation to confirm or deny existing information.</p>",
"drawn": false,
"flags": {},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "1.4.4",
"lastModifiedBy": null
},
"documentUuid": null,
"_key": "!tables.results!I5L1dlgxXTNrCCkL.TCrdyh3qhl2vtQxO"
}
],
"replacement": true,
"displayRoll": true,
"folder": null,
"ownership": {
"default": 0,
"Bgvu4A6AMkRFOTGR": 3
},
"flags": {},
"formula": "1d12",
"_id": "I5L1dlgxXTNrCCkL",
"sort": 400000,
"_key": "!tables!I5L1dlgxXTNrCCkL"
}

View file

@ -35,7 +35,7 @@
"key": "system.evasion", "key": "system.evasion",
"mode": 2, "mode": 2,
"value": "@system.proficiency", "value": "@system.proficiency",
"priority": 21 "priority": null
} }
], ],
"disabled": false, "disabled": false,

View file

@ -255,13 +255,13 @@
"key": "system.damageThresholds.major", "key": "system.damageThresholds.major",
"mode": 2, "mode": 2,
"value": "@system.proficiency", "value": "@system.proficiency",
"priority": 21 "priority": null
}, },
{ {
"key": "system.damageThresholds.severe", "key": "system.damageThresholds.severe",
"mode": 2, "mode": 2,
"value": "@system.proficiency", "value": "@system.proficiency",
"priority": 21 "priority": null
} }
], ],
"disabled": false, "disabled": false,

View file

@ -145,11 +145,6 @@
button { button {
flex: 1; flex: 1;
padding: 0 0.375rem;
}
button[data-action='viewParty'] {
margin-right: 6px;
} }
} }

View file

@ -102,27 +102,17 @@
.summons-header { .summons-header {
font-size: var(--font-size-14); font-size: var(--font-size-14);
text-align: center; text-align: center;
display: flex;
align-items: center;
justify-content: center;
span { span::before,
width: 100%; span::after {
color: @dark-blue;
} }
&:before,
&:after {
content: ' ';
height: 1px;
width: 100%;
}
&:before { &:before {
background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, light-dark(@dark-blue, @golden) 100%); background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, @dark-blue 100%);
} }
&:after { &:after {
background: linear-gradient(90deg, light-dark(@dark-blue, @golden) 0%, rgba(0, 0, 0, 0) 100%); background: linear-gradient(90deg, @dark-blue 0%, rgba(0, 0, 0, 0) 100%);
} }
} }

View file

@ -99,28 +99,6 @@
} }
} }
.action-use-button-parent {
width: 100%;
.action-use-target {
display: flex;
align-items: center;
justify-content: space-between;
gap: 4px;
width: 100%;
padding: 4px 8px 10px 40px;
font-size: var(--font-size-12);
label {
font-weight: bold;
}
select {
flex: 1;
}
}
}
.action-use-button { .action-use-button {
width: -webkit-fill-available; width: -webkit-fill-available;
margin: 0 8px; margin: 0 8px;

View file

@ -11,7 +11,7 @@ aside[role='tooltip']:has(div.daggerheart.dh-style.tooltip.card-style) {
width: 18rem; width: 18rem;
background-image: url('../assets/parchments/dh-parchment-dark.png'); background-image: url('../assets/parchments/dh-parchment-dark.png');
outline: 1px solid light-dark(@dark-80, @beige-80); outline: 1px solid light-dark(@dark-80, @beige-80);
box-shadow: 0 0 25px rgba(0, 0, 0, 0.8); box-shadow: 0 0 25px rgba(0, 0, 0, 0.80);
.tooltip-title { .tooltip-title {
font-size: var(--font-size-20); font-size: var(--font-size-20);
@ -235,6 +235,7 @@ aside[role='tooltip'].locked-tooltip:has(div.daggerheart.dh-style.tooltip.card-s
.theme-light aside[role='tooltip'].locked-tooltip:has(div.daggerheart.dh-style.tooltip) { .theme-light aside[role='tooltip'].locked-tooltip:has(div.daggerheart.dh-style.tooltip) {
box-shadow: 0 0 25px @dark-blue-90; box-shadow: 0 0 25px @dark-blue-90;
outline: 1px solid light-dark(@dark-blue, @golden); outline: 1px solid light-dark(@dark-blue, @golden);
} }
#tooltip, #tooltip,
@ -343,20 +344,4 @@ aside[role='tooltip'].locked-tooltip:has(div.daggerheart.dh-style.tooltip.card-s
margin-bottom: 4px; margin-bottom: 4px;
} }
} }
.party-list {
display: flex;
flex-direction: column;
button {
width: 100%;
align-items: center;
justify-content: start;
img {
border: none;
width: 1rem;
height: 1rem;
object-fit: contain;
}
}
}
} }

View file

@ -2,7 +2,7 @@
"id": "daggerheart", "id": "daggerheart",
"title": "Daggerheart", "title": "Daggerheart",
"description": "An unofficial implementation of the Daggerheart system", "description": "An unofficial implementation of the Daggerheart system",
"version": "1.4.5", "version": "1.4.1",
"compatibility": { "compatibility": {
"minimum": "13.346", "minimum": "13.346",
"verified": "13.351", "verified": "13.351",
@ -173,15 +173,6 @@
"private": false, "private": false,
"flags": {} "flags": {}
}, },
{
"name": "rolltables",
"label": "Rolltables",
"system": "daggerheart",
"path": "packs/rolltables.db",
"type": "RollTable",
"private": false,
"flags": {}
},
{ {
"name": "beastforms", "name": "beastforms",
"label": "Beastforms", "label": "Beastforms",
@ -197,7 +188,7 @@
"name": "Daggerheart SRD", "name": "Daggerheart SRD",
"sorting": "m", "sorting": "m",
"color": "#08718c", "color": "#08718c",
"packs": ["adversaries", "environments", "journals", "rolltables"], "packs": ["adversaries", "environments", "journals"],
"folders": [ "folders": [
{ {
"name": "Character Options", "name": "Character Options",

View file

@ -1,5 +1,5 @@
<section <section
class="tab {{tabs.domains.cssClass}} {{tabs.domains.id}} scrollable" class="tab {{tabs.domains.cssClass}} {{tabs.domains.id}}"
data-tab="{{tabs.domains.id}}" data-tab="{{tabs.domains.id}}"
data-group="{{tabs.domains.group}}" data-group="{{tabs.domains.group}}"
> >

View file

@ -1,5 +1,5 @@
<section <section
class="tab {{tabs.downtime.cssClass}} {{tabs.downtime.id}} scrollable" class="tab {{tabs.downtime.cssClass}} {{tabs.downtime.id}}"
data-tab="{{tabs.downtime.id}}" data-tab="{{tabs.downtime.id}}"
data-group="{{tabs.downtime.group}}" data-group="{{tabs.downtime.group}}"
> >

View file

@ -1,5 +1,5 @@
<section <section
class="tab {{tabs.itemFeatures.cssClass}} {{tabs.itemFeatures.id}} scrollable" class="tab {{tabs.itemFeatures.cssClass}} {{tabs.itemFeatures.id}}"
data-tab="{{tabs.itemFeatures.id}}" data-tab="{{tabs.itemFeatures.id}}"
data-group="{{tabs.itemFeatures.group}}" data-group="{{tabs.itemFeatures.group}}"
> >

View file

@ -1,5 +1,5 @@
<section <section
class="tab {{tabs.settings.cssClass}} {{tabs.settings.id}} scrollable" class="tab {{tabs.settings.cssClass}} {{tabs.settings.id}}"
data-tab="{{tabs.settings.id}}" data-tab="{{tabs.settings.id}}"
data-group="{{tabs.settings.group}}" data-group="{{tabs.settings.group}}"
> >

View file

@ -1,5 +1,5 @@
<section <section
class="tab {{tabs.types.cssClass}} {{tabs.types.id}} scrollable" class="tab {{tabs.types.cssClass}} {{tabs.types.id}}"
data-tab="{{tabs.types.id}}" data-tab="{{tabs.types.id}}"
data-group="{{tabs.types.group}}" data-group="{{tabs.types.group}}"
> >

View file

@ -9,7 +9,7 @@
<fieldset> <fieldset>
<legend>{{localize tabs.features.label}}</legend> <legend>{{localize tabs.features.label}}</legend>
<ul class="feature-list"> <ul class="feature-list">
{{#each @root.features as |feature|}} {{#each document.system.features as |feature|}}
<li class="feature-item" id="{{feature.id}}" draggable="true"> <li class="feature-item" id="{{feature.id}}" draggable="true">
<img src="{{feature.img}}" alt=""> <img src="{{feature.img}}" alt="">
<div class="label"> <div class="label">

View file

@ -9,7 +9,7 @@
<fieldset> <fieldset>
<legend>{{localize tabs.features.label}}</legend> <legend>{{localize tabs.features.label}}</legend>
<ul class="feature-list"> <ul class="feature-list">
{{#each @root.features as |feature|}} {{#each document.system.features as |feature|}}
<li class="feature-item" id="{{feature.id}}"> <li class="feature-item" id="{{feature.id}}">
<img src="{{feature.img}}" alt=""> <img src="{{feature.img}}" alt="">
<div class="label"> <div class="label">

View file

@ -4,7 +4,7 @@
{{> 'daggerheart.inventory-items' {{> 'daggerheart.inventory-items'
title=tabs.features.label title=tabs.features.label
type='feature' type='feature'
collection=@root.features collection=document.system.features
hideContextMenu=true hideContextMenu=true
canCreate=true canCreate=true
showActions=true showActions=true

View file

@ -87,16 +87,11 @@
</div> </div>
{{/if}} {{/if}}
<div class="downtime-section"> <div class="downtime-section">
{{#if document.parties.size}} <button type="button" data-action="useDowntime" data-type="shortRest" data-tooltip="{{localize "DAGGERHEART.APPLICATIONS.Downtime.shortRest.title"}}">
<button type="button" data-action="viewParty" data-tooltip="DAGGERHEART.ACTORS.Character.viewParty"> <i class="fa-solid fa-utensils"></i>
<i class="fa-solid fa-fw fa-users"></i>
</button>
{{/if}}
<button type="button" data-action="useDowntime" data-type="shortRest" data-tooltip="DAGGERHEART.APPLICATIONS.Downtime.shortRest.title">
<i class="fa-solid fa-fw fa-utensils"></i>
</button> </button>
<button type="button" data-action="useDowntime" data-type="longRest" data-tooltip="DAGGERHEART.APPLICATIONS.Downtime.longRest.title"> <button type="button" data-action="useDowntime" data-type="longRest" data-tooltip="{{localize "DAGGERHEART.APPLICATIONS.Downtime.longRest.title"}}">
<i class="fa-solid fa-fw fa-bed"></i> <i class="fa-solid fa-bed"></i>
</button> </button>
</div> </div>
</div> </div>

View file

@ -7,7 +7,7 @@
{{> 'daggerheart.inventory-items' {{> 'daggerheart.inventory-items'
title=tabs.features.label title=tabs.features.label
type='feature' type='feature'
collection=@root.features collection=document.system.features
hideContextMenu=true hideContextMenu=true
canCreate=true canCreate=true
showActions=true showActions=true

View file

@ -15,22 +15,9 @@
</div> </div>
</details> </details>
{{#each move.actions as | action index |}} {{#each move.actions as | action index |}}
<div class="action-use-button-parent"> <button class="action-use-button" data-move-index="{{@../key}}" data-action-index="{{index}}" data-move-path="{{../movePath}}" >
<button class="action-use-button" data-move-index="{{@../key}}" data-action-index="{{index}}" data-move-path="{{../movePath}}" > <span>{{localize action.name}}</span>
<span>{{localize action.name}}</span> </button>
</button>
{{#if move.needsTarget}}
<div class="action-use-target">
<label>{{localize "DAGGERHEART.GENERAL.Bonuses.rest.target"}}:</label>
<select>
<option value="{{../../selfId}}">{{localize "DAGGERHEART.GENERAL.Bonuses.rest.targetSelf"}}</option>
{{#each ../../characters as | character |}}
<option value="{{character.uuid}}">{{character.name}}</option>
{{/each}}
</select>
</div>
{{/if}}
</div>
{{/each}} {{/each}}
{{/each}} {{/each}}
</ul> </ul>