Merged with main

This commit is contained in:
WBHarry 2026-04-11 00:05:18 +02:00
commit 9bea8d6a97
64 changed files with 1556 additions and 441 deletions

View file

@ -35,7 +35,7 @@ jobs:
env: env:
version: ${{steps.get_version.outputs.version-without-v}} version: ${{steps.get_version.outputs.version-without-v}}
url: https://github.com/${{github.repository}} url: https://github.com/${{github.repository}}
manifest: https://github.com/${{github.repository}}/releases/latest/download/system.json manifest: https://raw.githubusercontent.com/${{github.repository}}/main/system.json
download: https://github.com/${{github.repository}}/releases/download/${{github.event.release.tag_name}}/system.zip download: https://github.com/${{github.repository}}/releases/download/${{github.event.release.tag_name}}/system.zip
# Create a zip file with all files required by the module to add to the release # Create a zip file with all files required by the module to add to the release

View file

@ -113,7 +113,9 @@
}, },
"displayInChat": "Display in chat", "displayInChat": "Display in chat",
"deleteTriggerTitle": "Delete Trigger", "deleteTriggerTitle": "Delete Trigger",
"deleteTriggerContent": "Are you sure you want to delete the {trigger} trigger?" "deleteTriggerContent": "Are you sure you want to delete the {trigger} trigger?",
"advantageState": "Advantage State",
"damageOnSave": "Damage on Save"
}, },
"RollField": { "RollField": {
"diceRolling": { "diceRolling": {
@ -125,10 +127,11 @@
} }
}, },
"Settings": { "Settings": {
"attackBonus": "Attack Bonus", "attackModifier": "Attack Modifier",
"attackName": "Attack Name", "attackName": "Attack Name",
"criticalThreshold": "Critical Threshold", "criticalThreshold": "Critical Threshold",
"includeBase": { "label": "Include Item Damage" }, "includeBase": { "label": "Include Item Damage" },
"groupAttack": { "label": "Group Attack" },
"multiplier": "Multiplier", "multiplier": "Multiplier",
"saveHint": "Set a default Trait to enable Reaction Roll. It can be changed later in Reaction Roll Dialog.", "saveHint": "Set a default Trait to enable Reaction Roll. It can be changed later in Reaction Roll Dialog.",
"resultBased": { "resultBased": {
@ -366,7 +369,7 @@
"selectSecondaryWeapon": "Select Secondary Weapon", "selectSecondaryWeapon": "Select Secondary Weapon",
"selectSubclass": "Select Subclass", "selectSubclass": "Select Subclass",
"setupSkipTitle": "Skipping Character Setup", "setupSkipTitle": "Skipping Character Setup",
"setupSkipContent": "You are skipping the Character Setup by adding this manually. The character setup is the blinking arrows in the top-right. Are you sure you want to continue?", "setupSkipContent": "You are skipping the Character Setup by adding this manually. The character setup is the blinking button in the top-right. Are you sure you want to continue?",
"startingItems": "Starting Items", "startingItems": "Starting Items",
"story": "Story", "story": "Story",
"storyExplanation": "Select which background and connection prompts you want to copy into your character's background.", "storyExplanation": "Select which background and connection prompts you want to copy into your character's background.",
@ -2870,6 +2873,7 @@
"system": "Dice Preset", "system": "Dice Preset",
"font": "Font", "font": "Font",
"critical": "Duality Critical Animation", "critical": "Duality Critical Animation",
"muted": "Muted",
"diceAppearance": "Dice Appearance", "diceAppearance": "Dice Appearance",
"animations": "Animations", "animations": "Animations",
"defaultAnimations": "Set Animations As Player Defaults", "defaultAnimations": "Set Animations As Player Defaults",
@ -3155,7 +3159,8 @@
"tokenActorsMissing": "[{names}] missing Actors", "tokenActorsMissing": "[{names}] missing Actors",
"domainTouchRequirement": "This domain card requires {nr} {domain} cards in the loadout to be used", "domainTouchRequirement": "This domain card requires {nr} {domain} cards in the loadout to be used",
"knowTheTide": "Know The Tide gained a token", "knowTheTide": "Know The Tide gained a token",
"lackingItemTransferPermission": "User {user} lacks owner permission needed to transfer items to {target}" "lackingItemTransferPermission": "User {user} lacks owner permission needed to transfer items to {target}",
"noTokenTargeted": "No token is targeted"
}, },
"Progress": { "Progress": {
"migrationLabel": "Performing system migration. Please wait and do not close Foundry." "migrationLabel": "Performing system migration. Please wait and do not close Foundry."

View file

@ -22,6 +22,7 @@ export default class DamageDialog extends HandlebarsApplicationMixin(Application
}, },
actions: { actions: {
toggleSelectedEffect: this.toggleSelectedEffect, toggleSelectedEffect: this.toggleSelectedEffect,
updateGroupAttack: this.updateGroupAttack,
toggleCritical: this.toggleCritical, toggleCritical: this.toggleCritical,
submitRoll: this.submitRoll submitRoll: this.submitRoll
}, },
@ -64,15 +65,40 @@ export default class DamageDialog extends HandlebarsApplicationMixin(Application
context.hasSelectedEffects = Boolean(Object.keys(this.selectedEffects).length); context.hasSelectedEffects = Boolean(Object.keys(this.selectedEffects).length);
context.selectedEffects = this.selectedEffects; context.selectedEffects = this.selectedEffects;
context.damageOptions = this.config.damageOptions;
context.rangeOptions = CONFIG.DH.GENERAL.groupAttackRange;
return context; return context;
} }
static updateRollConfiguration(_event, _, formData) { static updateRollConfiguration(_event, _, formData) {
const { ...rest } = foundry.utils.expandObject(formData.object); const data = foundry.utils.expandObject(formData.object);
foundry.utils.mergeObject(this.config.roll, rest.roll); foundry.utils.mergeObject(this.config.roll, data.roll);
foundry.utils.mergeObject(this.config.modifiers, rest.modifiers); foundry.utils.mergeObject(this.config.modifiers, data.modifiers);
this.config.selectedMessageMode = rest.selectedMessageMode; this.config.selectedMessageMode = data.selectedMessageMode;
if (data.damageOptions) {
const numAttackers = data.damageOptions.groupAttack?.numAttackers;
if (typeof numAttackers !== 'number' || numAttackers % 1 !== 0) {
data.damageOptions.groupAttack.numAttackers = null;
}
foundry.utils.mergeObject(this.config.damageOptions, data.damageOptions);
}
this.render();
}
static updateGroupAttack() {
const targets = Array.from(game.user.targets);
if (targets.length === 0)
return ui.notifications.error(game.i18n.localize('DAGGERHEART.UI.Notifications.noTokenTargeted'));
const actorId = this.roll.data.parent.id;
const range = this.config.damageOptions.groupAttack.range;
const groupAttackTokens = game.system.api.fields.ActionFields.DamageField.getGroupAttackTokens(actorId, range);
this.config.damageOptions.groupAttack.numAttackers = groupAttackTokens.length;
this.render(); this.render();
} }

View file

@ -16,9 +16,11 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio
...member.toObject(), ...member.toObject(),
uuid: member.uuid, uuid: member.uuid,
id: member.id, id: member.id,
selected: false selected: false,
owned: member.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER)
})); }));
this.intiator = null;
this.initiator = null;
this.openForAllPlayers = true; this.openForAllPlayers = true;
this.tabGroups.application = Object.keys(party.system.tagTeam.members).length this.tabGroups.application = Object.keys(party.system.tagTeam.members).length
@ -80,6 +82,18 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio
for (const element of htmlElement.querySelectorAll('.roll-type-select')) for (const element of htmlElement.querySelectorAll('.roll-type-select'))
element.addEventListener('change', this.updateRollType.bind(this)); element.addEventListener('change', this.updateRollType.bind(this));
htmlElement
.querySelector('.initiator-member-field')
?.addEventListener('input', this.updateInitiatorMemberField.bind(this));
htmlElement
.querySelector('.initiator-cost-field')
?.addEventListener('input', this.updateInitiatorCostField.bind(this));
htmlElement
.querySelector('.openforall-field')
?.addEventListener('change', this.updateOpenForAllField.bind(this));
} }
_configureRenderParts(options) { _configureRenderParts(options) {
@ -135,9 +149,12 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio
const selectedMembers = partContext.memberSelection.filter(x => x.selected); const selectedMembers = partContext.memberSelection.filter(x => x.selected);
partContext.allSelected = selectedMembers.length === 2; partContext.allSelected = selectedMembers.length === 2;
partContext.canStartTagTeam = partContext.allSelected && this.initiator; partContext.canStartTagTeam =
partContext.allSelected && this.initiator?.memberId && typeof this.initiator?.cost === 'number';
partContext.initiator = this.initiator; partContext.initiator = this.initiator;
partContext.initiatorOptions = selectedMembers.map(x => ({ value: x.id, label: x.name })); partContext.initiatorOptions = selectedMembers
.filter(actor => actor.owned)
.map(x => ({ value: x.id, label: x.name }));
partContext.initiatorDisabled = !selectedMembers.length; partContext.initiatorDisabled = !selectedMembers.length;
partContext.openForAllPlayers = this.openForAllPlayers; partContext.openForAllPlayers = this.openForAllPlayers;
@ -230,14 +247,15 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio
} }
static async updateData(event, _, formData) { static async updateData(event, _, formData) {
const { initiator, openForAllPlayers, ...partyData } = foundry.utils.expandObject(formData.object); const partyData = foundry.utils.expandObject(formData.object);
this.initiator = initiator;
this.openForAllPlayers = openForAllPlayers !== undefined ? openForAllPlayers : this.openForAllPlayers;
this.updatePartyData(partyData, this.getUpdatingParts(event.target)); this.updatePartyData(partyData, this.getUpdatingParts(event.target));
} }
async updatePartyData(update, updatingParts, options = { render: true }) { async updatePartyData(update, updatingParts, options = { render: true }) {
if (!game.users.activeGM)
return ui.notifications.error(game.i18n.localize('DAGGERHEART.UI.Notifications.gmRequired'));
const gmUpdate = async update => { const gmUpdate = async update => {
await this.party.update(update); await this.party.update(update);
this.render({ parts: updatingParts }); this.render({ parts: updatingParts });
@ -348,8 +366,7 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio
let rollIsSelected = false; let rollIsSelected = false;
for (const member of Object.values(members)) { for (const member of Object.values(members)) {
const rollFinished = Boolean(member.rollData); const rollFinished = Boolean(member.rollData);
const damageFinished = const damageFinished = member.rollData?.options?.hasDamage ? Boolean(member.rollData.options.damage) : true;
member.rollData?.options?.hasDamage !== undefined ? member.rollData.options.damage : true;
rollsAreFinished = rollsAreFinished && rollFinished && damageFinished; rollsAreFinished = rollsAreFinished && rollFinished && damageFinished;
rollIsSelected = rollIsSelected || member.selected; rollIsSelected = rollIsSelected || member.selected;
@ -374,6 +391,23 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio
); );
} }
updateInitiatorMemberField(event) {
if (!this.initiator) this.initiator = {};
this.initiator.memberId = event.target.value;
this.render();
}
updateInitiatorCostField(event) {
if (!this.initiator) this.initiator = {};
this.initiator.cost = event.target.value ? Number.parseInt(event.target.value) : null;
this.render();
}
updateOpenForAllField(event) {
this.openForAllPlayers = event.target.checked;
this.render();
}
static async #removeRoll(_, button) { static async #removeRoll(_, button) {
this.updatePartyData( this.updatePartyData(
{ {

View file

@ -21,7 +21,6 @@ export default class DHActionConfig extends DHActionBaseConfig {
static async addEffect(_event) { static async addEffect(_event) {
if (!this.action.effects) return; if (!this.action.effects) return;
const effectData = this._addEffectData.bind(this)();
const data = this.action.toObject(); const data = this.action.toObject();
const created = await this.action.item.createEmbeddedDocuments('ActiveEffect', [ const created = await this.action.item.createEmbeddedDocuments('ActiveEffect', [

View file

@ -18,7 +18,7 @@ export default class DhMeasuredTemplate extends foundry.canvas.placeables.Measur
static getRangeLabels(distanceValue, settings) { static getRangeLabels(distanceValue, settings) {
let result = { distance: distanceValue, units: '' }; let result = { distance: distanceValue, units: '' };
if (!settings.enabled) return result; if (!settings.enabled || !canvas.scene) return result;
const sceneRangeMeasurement = canvas.scene.flags.daggerheart?.rangeMeasurement; const sceneRangeMeasurement = canvas.scene.flags.daggerheart?.rangeMeasurement;
const { disable, custom } = CONFIG.DH.GENERAL.sceneRangeMeasurementSetting; const { disable, custom } = CONFIG.DH.GENERAL.sceneRangeMeasurementSetting;

View file

@ -70,6 +70,14 @@ export const range = {
} }
}; };
export const groupAttackRange = {
melee: range.melee,
veryClose: range.veryClose,
close: range.close,
far: range.far,
veryFar: range.veryFar
};
/* circle|cone|rect|ray used to be CONST.MEASURED_TEMPLATE_TYPES. Hardcoded for now */ /* circle|cone|rect|ray used to be CONST.MEASURED_TEMPLATE_TYPES. Hardcoded for now */
export const templateTypes = { export const templateTypes = {
CIRCLE: 'circle', CIRCLE: 'circle',
@ -484,7 +492,7 @@ export const defaultRestOptions = {
value: { value: {
custom: { custom: {
enabled: true, enabled: true,
formula: '@system.armorScore' formula: '@system.armorScore.max'
} }
} }
} }
@ -708,14 +716,14 @@ const getDiceSoNiceSFX = sfxOptions => {
if (sfxOptions.critical && criticalAnimationData.class) { if (sfxOptions.critical && criticalAnimationData.class) {
return { return {
specialEffect: criticalAnimationData.class, specialEffect: criticalAnimationData.class,
options: {} options: { ...criticalAnimationData.options }
}; };
} }
if (sfxOptions.higher && sfxOptions.data.higher) { if (sfxOptions.higher && sfxOptions.data.higher) {
return { return {
specialEffect: sfxOptions.data.higher.class, specialEffect: sfxOptions.data.higher.class,
options: {} options: { ...sfxOptions.data.higher.options }
}; };
} }

View file

@ -280,6 +280,26 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
} }
}; };
if (this.damage) {
config.isDirect = this.damage.direct;
const groupAttackTokens = this.damage.groupAttack
? game.system.api.fields.ActionFields.DamageField.getGroupAttackTokens(
this.actor.id,
this.damage.groupAttack
)
: null;
config.damageOptions = {
groupAttack: this.damage.groupAttack
? {
numAttackers: Math.max(groupAttackTokens.length, 1),
range: this.damage.groupAttack
}
: null
};
}
DHBaseAction.applyKeybindings(config); DHBaseAction.applyKeybindings(config);
return config; return config;
} }

View file

@ -44,7 +44,8 @@ export default class ArmorChange extends foundry.abstract.DataModel {
label: 'Armor', label: 'Armor',
defaultPriority: 20, defaultPriority: 20,
handler: (actor, change, _options, _field, replacementData) => { handler: (actor, change, _options, _field, replacementData) => {
const parsedMax = itemAbleRollParse(change.value.max, actor, change.effect.parent); const baseParsedMax = itemAbleRollParse(change.value.max, actor, change.effect.parent);
const parsedMax = new Roll(baseParsedMax).evaluateSync().total;
game.system.api.documents.DhActiveEffect.applyChange( game.system.api.documents.DhActiveEffect.applyChange(
actor, actor,
{ {
@ -110,6 +111,8 @@ export default class ArmorChange extends foundry.abstract.DataModel {
}; };
get isSuppressed() { get isSuppressed() {
if (!this.parent.parent?.actor) return false;
switch (this.value.interaction) { switch (this.value.interaction) {
case CONFIG.DH.GENERAL.activeEffectArmorInteraction.active.id: case CONFIG.DH.GENERAL.activeEffectArmorInteraction.active.id:
return !this.parent.parent?.actor.system.armor; return !this.parent.parent?.actor.system.armor;

View file

@ -48,6 +48,7 @@ export default class DHActorRoll extends foundry.abstract.TypeDataModel {
action: new fields.StringField() action: new fields.StringField()
}), }),
damage: new fields.ObjectField(), damage: new fields.ObjectField(),
damageOptions: new fields.ObjectField(),
costs: new fields.ArrayField(new fields.ObjectField()), costs: new fields.ArrayField(new fields.ObjectField()),
successConsumed: new fields.BooleanField({ initial: false }) successConsumed: new fields.BooleanField({ initial: false })
}; };

View file

@ -18,7 +18,12 @@ export default class DamageField extends fields.SchemaField {
initial: false, initial: false,
label: 'DAGGERHEART.ACTIONS.Settings.includeBase.label' label: 'DAGGERHEART.ACTIONS.Settings.includeBase.label'
}), }),
direct: new fields.BooleanField({ initial: false, label: 'DAGGERHEART.CONFIG.DamageType.direct.name' }) direct: new fields.BooleanField({ initial: false, label: 'DAGGERHEART.CONFIG.DamageType.direct.name' }),
groupAttack: new fields.StringField({
choices: CONFIG.DH.GENERAL.groupAttackRange,
blank: true,
label: 'DAGGERHEART.ACTIONS.Settings.groupAttack.label'
})
}; };
super(damageFields, options, context); super(damageFields, options, context);
} }
@ -224,6 +229,22 @@ export default class DamageField extends fields.SchemaField {
game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).roll.damageApply.players) game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).roll.damageApply.players)
); );
} }
static getGroupAttackTokens(actorId, range) {
if (!canvas.scene) return [];
const targets = Array.from(game.user.targets);
const rangeSettings = canvas.scene?.rangeSettings;
if (!rangeSettings) return [];
const maxDistance = rangeSettings[range];
return canvas.scene.tokens.filter(x => {
if (x.actor?.id !== actorId) return false;
if (targets.every(target => x.object.distanceTo(target) > maxDistance)) return false;
return true;
});
}
} }
export class DHActionDiceData extends foundry.abstract.DataModel { export class DHActionDiceData extends foundry.abstract.DataModel {
@ -232,7 +253,7 @@ export class DHActionDiceData extends foundry.abstract.DataModel {
return { return {
multiplier: new fields.StringField({ multiplier: new fields.StringField({
choices: CONFIG.DH.GENERAL.multiplierTypes, choices: CONFIG.DH.GENERAL.multiplierTypes,
initial: 'prof', initial: 'flat',
label: 'DAGGERHEART.ACTIONS.Config.damage.multiplier', label: 'DAGGERHEART.ACTIONS.Config.damage.multiplier',
nullable: false, nullable: false,
required: true required: true
@ -244,7 +265,7 @@ export class DHActionDiceData extends foundry.abstract.DataModel {
}), }),
dice: new fields.StringField({ dice: new fields.StringField({
choices: CONFIG.DH.GENERAL.diceTypes, choices: CONFIG.DH.GENERAL.diceTypes,
initial: 'd6', initial: CONFIG.DH.GENERAL.diceTypes.d6,
label: 'DAGGERHEART.GENERAL.Dice.single', label: 'DAGGERHEART.GENERAL.Dice.single',
nullable: false, nullable: false,
required: true required: true

View file

@ -89,13 +89,13 @@ class ResourcesField extends fields.TypedObjectField {
*/ */
_getField(path) { _getField(path) {
if (path.length === 0) return this; if (path.length === 0) return this;
const first = path.shift(); const name = path.pop();
if (first === this.element.name) return this.element_getField(path); if (name === this.element.name) return this.element_getField(path);
const resources = CONFIG.DH.RESOURCE[this.actorType].all; const resources = CONFIG.DH.RESOURCE[this.actorType].all;
if (first in resources) { if (name in resources) {
const field = this.element._getField(path); const field = this.element._getField(path);
field.label = resources[first].label; field.label = resources[name].label;
return field; return field;
} }

View file

@ -8,6 +8,9 @@ export default class DhAppearance extends foundry.abstract.DataModel {
initial: null, initial: null,
blank: true, blank: true,
choices: CONFIG.DH.GENERAL.diceSoNiceSFXClasses choices: CONFIG.DH.GENERAL.diceSoNiceSFXClasses
}),
options: new foundry.data.fields.SchemaField({
muteSound: new foundry.data.fields.BooleanField()
}) })
}); });

View file

@ -144,6 +144,7 @@ export default class DamageRoll extends DHRoll {
constructFormula(config) { constructFormula(config) {
this.options.isCritical = config.isCritical; this.options.isCritical = config.isCritical;
for (const [index, part] of this.options.roll.entries()) { for (const [index, part] of this.options.roll.entries()) {
const isHitpointPart = part.applyTo === CONFIG.DH.GENERAL.healingTypes.hitPoints.id;
part.roll = new Roll(Roll.replaceFormulaData(part.formula, config.data)); part.roll = new Roll(Roll.replaceFormulaData(part.formula, config.data));
part.roll.terms = Roll.parse(part.roll.formula, config.data); part.roll.terms = Roll.parse(part.roll.formula, config.data);
if (part.applyTo === CONFIG.DH.GENERAL.healingTypes.hitPoints.id) { if (part.applyTo === CONFIG.DH.GENERAL.healingTypes.hitPoints.id) {
@ -169,7 +170,16 @@ export default class DamageRoll extends DHRoll {
); );
} }
if (config.isCritical && part.applyTo === CONFIG.DH.GENERAL.healingTypes.hitPoints.id) { if (config.damageOptions.groupAttack?.numAttackers > 1 && isHitpointPart) {
const damageTypes = [foundry.dice.terms.Die, foundry.dice.terms.NumericTerm];
for (const term of part.roll.terms) {
if (damageTypes.some(type => term instanceof type)) {
term.number *= config.damageOptions.groupAttack.numAttackers;
}
}
}
if (config.isCritical && isHitpointPart) {
const total = part.roll.dice.reduce((acc, term) => acc + term._faces * term._number, 0); const total = part.roll.dice.reduce((acc, term) => acc + term._faces * term._number, 0);
if (total > 0) { if (total > 0) {
part.roll.terms.push(...this.formatModifier(total)); part.roll.terms.push(...this.formatModifier(total));

View file

@ -256,7 +256,7 @@ export default class DHRoll extends Roll {
if (!roll.terms[i].isDeterministic) continue; if (!roll.terms[i].isDeterministic) continue;
const termTotal = roll.terms[i].total; const termTotal = roll.terms[i].total;
if (typeof termTotal === 'number') { if (typeof termTotal === 'number') {
const multiplier = roll.terms[i - 1]?.operator === " - " ? -1 : 1; const multiplier = roll.terms[i - 1]?.operator === ' - ' ? -1 : 1;
modifierTotal += multiplier * termTotal; modifierTotal += multiplier * termTotal;
} }
} }
@ -272,7 +272,7 @@ export default class DHRoll extends Roll {
const changeKeys = this.getActionChangeKeys(); const changeKeys = this.getActionChangeKeys();
return ( return (
this.options.effects?.reduce((acc, effect) => { this.options.effects?.reduce((acc, effect) => {
if (effect.system.changes.some(x => changeKeys.some(key => x.key.includes(key)))) { if (effect.system.changes.some(x => changeKeys.some(key => x.key?.includes(key)))) {
acc[effect.id] = { acc[effect.id] = {
id: effect.id, id: effect.id,
name: effect.name, name: effect.name,

View file

@ -1,9 +1,13 @@
import DualityDie from './dualityDie.mjs'; import DualityDie from './dualityDie.mjs';
import HopeDie from './hopeDie.mjs';
import FearDie from './fearDie.mjs';
import AdvantageDie from './advantageDie.mjs'; import AdvantageDie from './advantageDie.mjs';
import DisadvantageDie from './disadvantageDie.mjs'; import DisadvantageDie from './disadvantageDie.mjs';
export const diceTypes = { export const diceTypes = {
DualityDie, DualityDie,
HopeDie,
FearDie,
AdvantageDie, AdvantageDie,
DisadvantageDie DisadvantageDie
}; };

View file

@ -43,9 +43,10 @@ export default class DualityDie extends foundry.dice.terms.Die {
options: { appearance: {} } options: { appearance: {} }
}; };
const preset = await getDiceSoNicePreset(diceSoNice[key], faces); const diceAppearance = await this.getDiceSoNiceAppearance(options.liveRoll.roll);
diceSoNiceRoll.dice[0].options.appearance = preset.appearance; diceSoNiceRoll.dice[0].options.appearance = diceAppearance.appearance;
diceSoNiceRoll.dice[0].options.modelFile = preset.modelFile; diceSoNiceRoll.dice[0].options.modelFile = diceAppearance.modelFile;
diceSoNiceRoll.dice[0].results = diceSoNiceRoll.dice[0].results.filter(x => x.active);
await game.dice3d.showForRoll(diceSoNiceRoll, game.user, true); await game.dice3d.showForRoll(diceSoNiceRoll, game.user, true);
} else { } else {
@ -59,4 +60,11 @@ export default class DualityDie extends foundry.dice.terms.Die {
this.#updateResources(oldDuality, newDuality, options.liveRoll.actor); this.#updateResources(oldDuality, newDuality, options.liveRoll.actor);
} }
} }
/**
* Overridden by extending classes HopeDie and FearDie
*/
async getDiceSoNiceAppearance() {
return {};
}
} }

View file

@ -0,0 +1,9 @@
import { getDiceSoNicePresets } from '../../config/generalConfig.mjs';
import DualityDie from './dualityDie.mjs';
export default class FearDie extends DualityDie {
async getDiceSoNiceAppearance(roll) {
const { fear } = await getDiceSoNicePresets(roll, this.denomination, this.denomination);
return fear;
}
}

View file

@ -0,0 +1,9 @@
import { getDiceSoNicePresets } from '../../config/generalConfig.mjs';
import DualityDie from './dualityDie.mjs';
export default class HopeDie extends DualityDie {
async getDiceSoNiceAppearance(roll) {
const { hope } = await getDiceSoNicePresets(roll, this.denomination, this.denomination);
return hope;
}
}

View file

@ -24,7 +24,7 @@ export default class DualityRoll extends D20Roll {
} }
get dHope() { get dHope() {
if (!(this.dice[0] instanceof game.system.api.dice.diceTypes.DualityDie)) this.createBaseDice(); if (!(this.dice[0] instanceof game.system.api.dice.diceTypes.HopeDie)) this.createBaseDice();
return this.dice[0]; return this.dice[0];
} }
@ -34,7 +34,7 @@ export default class DualityRoll extends D20Roll {
} }
get dFear() { get dFear() {
if (!(this.dice[1] instanceof game.system.api.dice.diceTypes.DualityDie)) this.createBaseDice(); if (!(this.dice[1] instanceof game.system.api.dice.diceTypes.FearDie)) this.createBaseDice();
return this.dice[1]; return this.dice[1];
} }
@ -68,8 +68,8 @@ export default class DualityRoll extends D20Roll {
} }
get extraDice() { get extraDice() {
const { DualityDie, AdvantageDie, DisadvantageDie } = game.system.api.dice.diceTypes; const { HopeDie, FearDie, AdvantageDie, DisadvantageDie } = game.system.api.dice.diceTypes;
return this.dice.filter(x => ![DualityDie, AdvantageDie, DisadvantageDie].some(die => x instanceof die)); return this.dice.filter(x => ![HopeDie, FearDie, AdvantageDie, DisadvantageDie].some(die => x instanceof die));
} }
setRallyChoices() { setRallyChoices() {
@ -125,8 +125,8 @@ export default class DualityRoll extends D20Roll {
/** @inheritDoc */ /** @inheritDoc */
static fromData(data) { static fromData(data) {
data.terms[0].class = 'DualityDie'; data.terms[0].class = 'HopeDie';
data.terms[2].class = 'DualityDie'; data.terms[2].class = 'FearDie';
if (data.options.roll.advantage?.type && data.terms[4]?.faces) { if (data.options.roll.advantage?.type && data.terms[4]?.faces) {
data.terms[4].class = data.options.roll.advantage.type === 1 ? 'AdvantageDie' : 'DisadvantageDie'; data.terms[4].class = data.options.roll.advantage.type === 1 ? 'AdvantageDie' : 'DisadvantageDie';
} }
@ -135,18 +135,18 @@ export default class DualityRoll extends D20Roll {
createBaseDice() { createBaseDice() {
if ( if (
this.dice[0] instanceof game.system.api.dice.diceTypes.DualityDie && this.dice[0] instanceof game.system.api.dice.diceTypes.HopeDie &&
this.dice[1] instanceof game.system.api.dice.diceTypes.DualityDie this.dice[1] instanceof game.system.api.dice.diceTypes.FearDie
) { ) {
this.terms = [this.terms[0], this.terms[1], this.terms[2]]; this.terms = [this.terms[0], this.terms[1], this.terms[2]];
return; return;
} }
this.terms[0] = new game.system.api.dice.diceTypes.DualityDie({ this.terms[0] = new game.system.api.dice.diceTypes.HopeDie({
faces: this.data.rules.dualityRoll?.defaultHopeDice ?? 12 faces: this.data.rules.dualityRoll?.defaultHopeDice ?? 12
}); });
this.terms[1] = new foundry.dice.terms.OperatorTerm({ operator: '+' }); this.terms[1] = new foundry.dice.terms.OperatorTerm({ operator: '+' });
this.terms[2] = new game.system.api.dice.diceTypes.DualityDie({ this.terms[2] = new game.system.api.dice.diceTypes.FearDie({
faces: this.data.rules.dualityRoll?.defaultFearDice ?? 12 faces: this.data.rules.dualityRoll?.defaultFearDice ?? 12
}); });
} }

View file

@ -1,6 +1,16 @@
import DHToken from './token.mjs'; import DHToken from './token.mjs';
export default class DhScene extends Scene { export default class DhScene extends Scene {
get rangeSettings() {
const { custom } = CONFIG.DH.GENERAL.sceneRangeMeasurementSetting;
const sceneMeasurements = this.flags.daggerheart?.rangeMeasurement;
const globalMeasurements = game.settings.get(
CONFIG.DH.id,
CONFIG.DH.SETTINGS.gameSettings.variantRules
).rangeMeasurement;
return sceneMeasurements?.setting === custom.id ? sceneMeasurements : globalMeasurements;
}
/** A map of `TokenDocument` IDs embedded in this scene long with new dimensions from actor size-category changes */ /** A map of `TokenDocument` IDs embedded in this scene long with new dimensions from actor size-category changes */
#sizeSyncBatch = new Map(); #sizeSyncBatch = new Map();

View file

@ -95,7 +95,7 @@ export default class DhTokenManager {
: this.#actor; : this.#actor;
const tokenData = await actor.getTokenDocument(); const tokenData = await actor.getTokenDocument();
const result = await canvas.scene.createEmbeddedDocuments('Token', [ const result = await canvas.scene.createEmbeddedDocuments('Token', [
{ ...tokenData, x: this.#activePreview.document.x, y: this.#activePreview.document.y } { ...tokenData.toObject(), x: this.#activePreview.document.x, y: this.#activePreview.document.y }
]); ]);
this.#activePreview = undefined; this.#activePreview = undefined;

View file

@ -63,14 +63,12 @@ export const renderMeasuredTemplate = async event => {
const usedAngle = const usedAngle =
type === CONE ? (angle ?? CONFIG.MeasuredTemplate.defaults.angle) : type === INFRONT ? '180' : undefined; type === CONE ? (angle ?? CONFIG.MeasuredTemplate.defaults.angle) : type === INFRONT ? '180' : undefined;
let baseDistance = range; let baseDistance = getTemplateDistance(range);
if (Number.isNaN(Number(range))) {
baseDistance = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules).rangeMeasurement[
range
];
}
const dimensionConstant = game.scenes.active.grid.size / game.scenes.active.grid.distance; const { grid, distance } = CONFIG.Scene.documentClass.schema.fields.grid.fields;
const sceneGridSize = canvas.scene?.grid.size ?? grid.size.initial;
const sceneGridDistance = canvas.scene?.grid.distance ?? distance.getInitialValue();
const dimensionConstant = sceneGridSize / sceneGridDistance;
baseDistance *= dimensionConstant; baseDistance *= dimensionConstant;
@ -115,3 +113,11 @@ export const renderMeasuredTemplate = async event => {
{ create: true } { create: true }
); );
}; };
const getTemplateDistance = range => {
const rangeNumber = Number(range);
if (!Number.isNaN(rangeNumber)) return rangeNumber;
const settings = canvas.scene?.rangeSettings;
return settings ? settings[range] : 0;
};

View file

@ -1,3 +1,4 @@
import { defaultRestOptions } from '../config/generalConfig.mjs';
import { RefreshType, socketEvent } from './socket.mjs'; import { RefreshType, socketEvent } from './socket.mjs';
export async function runMigrations() { export async function runMigrations() {
@ -341,6 +342,18 @@ export async function runMigrations() {
lastMigrationVersion = '2.0.0'; lastMigrationVersion = '2.0.0';
} }
if (foundry.utils.isNewerVersion('2.0.4', lastMigrationVersion)) {
const downtimeMoves = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew);
if (downtimeMoves.restMoves.longRest.moves.repairArmor) {
await downtimeMoves.updateSource({
'restMoves.longRest.moves.repairArmor': defaultRestOptions.longRest().repairArmor
});
game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew, downtimeMoves.toObject());
}
lastMigrationVersion = '2.0.4';
}
//#endregion //#endregion
await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.LastMigrationVersion, lastMigrationVersion); await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.LastMigrationVersion, lastMigrationVersion);

View file

@ -131,12 +131,9 @@
"src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg", "src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg",
"anchorX": 0.5, "anchorX": 0.5,
"anchorY": 0.5, "anchorY": 0.5,
"offsetX": 0,
"offsetY": 0,
"fit": "contain", "fit": "contain",
"scaleX": 1, "scaleX": 1,
"scaleY": 1, "scaleY": 1,
"rotation": 0,
"tint": "#ffffff", "tint": "#ffffff",
"alphaThreshold": 0.75 "alphaThreshold": 0.75
}, },
@ -187,7 +184,7 @@
"saturation": 0, "saturation": 0,
"contrast": 0 "contrast": 0
}, },
"detectionModes": [], "detectionModes": {},
"occludable": { "occludable": {
"radius": 0 "radius": 0
}, },
@ -213,7 +210,8 @@
"flags": {}, "flags": {},
"randomImg": false, "randomImg": false,
"appendNumber": false, "appendNumber": false,
"prependAdjective": false "prependAdjective": false,
"depth": 1
}, },
"items": [ "items": [
{ {
@ -249,33 +247,95 @@
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>", "description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"vgguNWz8vG8aoLXR": { "SrNyZgPvCXMpbCLG": {
"type": "effect", "type": "attack",
"_id": "vgguNWz8vG8aoLXR", "_id": "SrNyZgPvCXMpbCLG",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"triggers": [],
"cost": [ "cost": [
{ {
"scalable": false, "scalable": false,
"key": "fear", "key": "fear",
"value": 1, "value": 1,
"step": null "itemId": null,
"step": null,
"consumeOnSuccess": false
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null "recovery": null,
"consumeOnSuccess": false
},
"damage": {
"parts": {
"hitPoints": {
"applyTo": "hitPoints",
"resultBased": false,
"value": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": true,
"formula": "4"
}
},
"valueAlt": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false,
"formula": ""
}
},
"base": false,
"type": [
"physical"
]
}
},
"includeBase": false,
"direct": false,
"groupAttack": "close"
}, },
"effects": [],
"target": { "target": {
"type": "any", "type": "any",
"amount": null "amount": null
}, },
"effects": [],
"roll": {
"type": "attack",
"trait": null,
"difficulty": null,
"bonus": null,
"advState": "neutral",
"diceRolling": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"compare": null,
"treshold": null
},
"useDefault": false
},
"save": {
"trait": null,
"difficulty": null,
"damageMod": "none"
},
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/magic/unholy/orb-hands-pink.webp",
"range": "" "range": ""
} }
}, },

View file

@ -125,12 +125,9 @@
"src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg", "src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg",
"anchorX": 0.5, "anchorX": 0.5,
"anchorY": 0.5, "anchorY": 0.5,
"offsetX": 0,
"offsetY": 0,
"fit": "contain", "fit": "contain",
"scaleX": 1, "scaleX": 1,
"scaleY": 1, "scaleY": 1,
"rotation": 0,
"tint": "#ffffff", "tint": "#ffffff",
"alphaThreshold": 0.75 "alphaThreshold": 0.75
}, },
@ -181,7 +178,7 @@
"saturation": 0, "saturation": 0,
"contrast": 0 "contrast": 0
}, },
"detectionModes": [], "detectionModes": {},
"occludable": { "occludable": {
"radius": 0 "radius": 0
}, },
@ -207,7 +204,8 @@
"flags": {}, "flags": {},
"randomImg": false, "randomImg": false,
"appendNumber": false, "appendNumber": false,
"prependAdjective": false "prependAdjective": false,
"depth": 1
}, },
"items": [ "items": [
{ {
@ -242,33 +240,95 @@
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>", "description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"cbAvPSIhwBMBTI3D": { "FCeTuf71gCzRiO5N": {
"type": "effect", "type": "attack",
"_id": "cbAvPSIhwBMBTI3D", "_id": "FCeTuf71gCzRiO5N",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"triggers": [],
"cost": [ "cost": [
{ {
"scalable": false, "scalable": false,
"key": "fear", "key": "fear",
"value": 1, "value": 1,
"step": null "itemId": null,
"step": null,
"consumeOnSuccess": false
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null "recovery": null,
"consumeOnSuccess": false
},
"damage": {
"parts": {
"hitPoints": {
"applyTo": "hitPoints",
"resultBased": false,
"value": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": true,
"formula": "6"
}
},
"valueAlt": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false,
"formula": ""
}
},
"base": false,
"type": [
"physical"
]
}
},
"includeBase": false,
"direct": false,
"groupAttack": "close"
}, },
"effects": [],
"target": { "target": {
"type": "any", "type": "any",
"amount": null "amount": null
}, },
"effects": [],
"roll": {
"type": "attack",
"trait": null,
"difficulty": null,
"bonus": null,
"advState": "neutral",
"diceRolling": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"compare": null,
"treshold": null
},
"useDefault": false
},
"save": {
"trait": null,
"difficulty": null,
"damageMod": "none"
},
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/creatures/abilities/tail-strike-bone-orange.webp",
"range": "" "range": ""
} }
}, },

View file

@ -125,12 +125,9 @@
"src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg", "src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg",
"anchorX": 0.5, "anchorX": 0.5,
"anchorY": 0.5, "anchorY": 0.5,
"offsetX": 0,
"offsetY": 0,
"fit": "contain", "fit": "contain",
"scaleX": 1, "scaleX": 1,
"scaleY": 1, "scaleY": 1,
"rotation": 0,
"tint": "#ffffff", "tint": "#ffffff",
"alphaThreshold": 0.75 "alphaThreshold": 0.75
}, },
@ -181,7 +178,7 @@
"saturation": 0, "saturation": 0,
"contrast": 0 "contrast": 0
}, },
"detectionModes": [], "detectionModes": {},
"occludable": { "occludable": {
"radius": 0 "radius": 0
}, },
@ -207,7 +204,8 @@
"flags": {}, "flags": {},
"randomImg": false, "randomImg": false,
"appendNumber": false, "appendNumber": false,
"prependAdjective": false "prependAdjective": false,
"depth": 1
}, },
"items": [ "items": [
{ {
@ -242,33 +240,95 @@
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all Cult @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>", "description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all Cult @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"EH1preaTWBD4rOvx": { "4M2MvVzEgIQEQHBS": {
"type": "effect", "type": "attack",
"_id": "EH1preaTWBD4rOvx", "_id": "4M2MvVzEgIQEQHBS",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"triggers": [],
"cost": [ "cost": [
{ {
"scalable": false, "scalable": false,
"key": "fear", "key": "fear",
"value": 1, "value": 1,
"step": null "itemId": null,
"step": null,
"consumeOnSuccess": false
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null "recovery": null,
"consumeOnSuccess": false
},
"damage": {
"parts": {
"hitPoints": {
"applyTo": "hitPoints",
"resultBased": false,
"value": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": true,
"formula": "5"
}
},
"valueAlt": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false,
"formula": ""
}
},
"base": false,
"type": [
"physical"
]
}
},
"includeBase": false,
"direct": false,
"groupAttack": "close"
}, },
"effects": [],
"target": { "target": {
"type": "self", "type": "any",
"amount": null "amount": null
}, },
"effects": [],
"roll": {
"type": null,
"trait": null,
"difficulty": null,
"bonus": null,
"advState": "neutral",
"diceRolling": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"compare": null,
"treshold": null
},
"useDefault": false
},
"save": {
"trait": null,
"difficulty": null,
"damageMod": "none"
},
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/creatures/abilities/tail-strike-bone-orange.webp",
"range": "" "range": ""
} }
}, },

View file

@ -125,12 +125,9 @@
"src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg", "src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg",
"anchorX": 0.5, "anchorX": 0.5,
"anchorY": 0.5, "anchorY": 0.5,
"offsetX": 0,
"offsetY": 0,
"fit": "contain", "fit": "contain",
"scaleX": 1, "scaleX": 1,
"scaleY": 1, "scaleY": 1,
"rotation": 0,
"tint": "#ffffff", "tint": "#ffffff",
"alphaThreshold": 0.75 "alphaThreshold": 0.75
}, },
@ -181,7 +178,7 @@
"saturation": 0, "saturation": 0,
"contrast": 0 "contrast": 0
}, },
"detectionModes": [], "detectionModes": {},
"occludable": { "occludable": {
"radius": 0 "radius": 0
}, },
@ -207,7 +204,8 @@
"flags": {}, "flags": {},
"randomImg": false, "randomImg": false,
"appendNumber": false, "appendNumber": false,
"prependAdjective": false "prependAdjective": false,
"depth": 1
}, },
"items": [ "items": [
{ {
@ -242,33 +240,95 @@
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>", "description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"vXHZVb0Y7Hqu3uso": { "S3dYxRclyhYINRi8": {
"type": "effect", "type": "attack",
"_id": "vXHZVb0Y7Hqu3uso", "_id": "S3dYxRclyhYINRi8",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"triggers": [],
"cost": [ "cost": [
{ {
"scalable": false, "scalable": false,
"key": "fear", "key": "fear",
"value": 1, "value": 1,
"step": null "itemId": null,
"step": null,
"consumeOnSuccess": false
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null "recovery": null,
"consumeOnSuccess": false
},
"damage": {
"parts": {
"hitPoints": {
"applyTo": "hitPoints",
"resultBased": false,
"value": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": true,
"formula": "5"
}
},
"valueAlt": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false,
"formula": ""
}
},
"base": false,
"type": [
"physical"
]
}
},
"includeBase": false,
"direct": false,
"groupAttack": "close"
}, },
"effects": [],
"target": { "target": {
"type": "self", "type": "any",
"amount": null "amount": null
}, },
"effects": [],
"roll": {
"type": "attack",
"trait": null,
"difficulty": null,
"bonus": null,
"advState": "neutral",
"diceRolling": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"compare": null,
"treshold": null
},
"useDefault": false
},
"save": {
"trait": null,
"difficulty": null,
"damageMod": "none"
},
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/magic/unholy/orb-hands-pink.webp",
"range": "" "range": ""
} }
}, },

View file

@ -125,12 +125,9 @@
"src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg", "src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg",
"anchorX": 0.5, "anchorX": 0.5,
"anchorY": 0.5, "anchorY": 0.5,
"offsetX": 0,
"offsetY": 0,
"fit": "contain", "fit": "contain",
"scaleX": 1, "scaleX": 1,
"scaleY": 1, "scaleY": 1,
"rotation": 0,
"tint": "#ffffff", "tint": "#ffffff",
"alphaThreshold": 0.75 "alphaThreshold": 0.75
}, },
@ -181,7 +178,7 @@
"saturation": 0, "saturation": 0,
"contrast": 0 "contrast": 0
}, },
"detectionModes": [], "detectionModes": {},
"occludable": { "occludable": {
"radius": 0 "radius": 0
}, },
@ -207,7 +204,8 @@
"flags": {}, "flags": {},
"randomImg": false, "randomImg": false,
"appendNumber": false, "appendNumber": false,
"prependAdjective": false "prependAdjective": false,
"depth": 1
}, },
"items": [ "items": [
{ {
@ -320,33 +318,95 @@
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>", "description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"QHNRSEQmqOcaoXq4": { "G0DVft7h55pBnwJA": {
"type": "effect", "type": "attack",
"_id": "QHNRSEQmqOcaoXq4", "_id": "G0DVft7h55pBnwJA",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"triggers": [],
"cost": [ "cost": [
{ {
"scalable": false, "scalable": false,
"key": "fear", "key": "fear",
"value": 1, "value": 1,
"step": null "itemId": null,
"step": null,
"consumeOnSuccess": false
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null "recovery": null,
"consumeOnSuccess": false
},
"damage": {
"parts": {
"hitPoints": {
"applyTo": "hitPoints",
"resultBased": false,
"value": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": true,
"formula": "12"
}
},
"valueAlt": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false,
"formula": ""
}
},
"base": false,
"type": [
"physical"
]
}
},
"includeBase": false,
"direct": false,
"groupAttack": "close"
}, },
"effects": [],
"target": { "target": {
"type": "self", "type": "any",
"amount": null "amount": null
}, },
"effects": [],
"roll": {
"type": "attack",
"trait": null,
"difficulty": null,
"bonus": null,
"advState": "neutral",
"diceRolling": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"compare": null,
"treshold": null
},
"useDefault": false
},
"save": {
"trait": null,
"difficulty": null,
"damageMod": "none"
},
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/magic/unholy/orb-hands-pink.webp",
"range": "" "range": ""
} }
}, },

View file

@ -131,12 +131,9 @@
"src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg", "src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg",
"anchorX": 0.5, "anchorX": 0.5,
"anchorY": 0.5, "anchorY": 0.5,
"offsetX": 0,
"offsetY": 0,
"fit": "contain", "fit": "contain",
"scaleX": 1, "scaleX": 1,
"scaleY": 1, "scaleY": 1,
"rotation": 0,
"tint": "#ffffff", "tint": "#ffffff",
"alphaThreshold": 0.75 "alphaThreshold": 0.75
}, },
@ -187,7 +184,7 @@
"saturation": 0, "saturation": 0,
"contrast": 0 "contrast": 0
}, },
"detectionModes": [], "detectionModes": {},
"occludable": { "occludable": {
"radius": 0 "radius": 0
}, },
@ -213,7 +210,8 @@
"flags": {}, "flags": {},
"randomImg": false, "randomImg": false,
"appendNumber": false, "appendNumber": false,
"prependAdjective": false "prependAdjective": false,
"depth": 1
}, },
"items": [ "items": [
{ {
@ -272,8 +270,38 @@
"recovery": null "recovery": null
}, },
"damage": { "damage": {
"parts": {}, "parts": {
"includeBase": false "hitPoints": {
"applyTo": "hitPoints",
"resultBased": false,
"value": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": true,
"formula": "1"
}
},
"valueAlt": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false,
"formula": ""
}
},
"base": false,
"type": [
"physical"
]
}
},
"includeBase": false,
"groupAttack": "close"
}, },
"target": { "target": {
"type": "any", "type": "any",
@ -300,7 +328,7 @@
"difficulty": null, "difficulty": null,
"damageMod": "none" "damageMod": "none"
}, },
"name": "Attack", "name": "Spend Fear",
"img": "icons/creatures/abilities/tail-strike-bone-orange.webp", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp",
"range": "" "range": ""
} }

View file

@ -125,12 +125,9 @@
"src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg", "src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg",
"anchorX": 0.5, "anchorX": 0.5,
"anchorY": 0.5, "anchorY": 0.5,
"offsetX": 0,
"offsetY": 0,
"fit": "contain", "fit": "contain",
"scaleX": 1, "scaleX": 1,
"scaleY": 1, "scaleY": 1,
"rotation": 0,
"tint": "#ffffff", "tint": "#ffffff",
"alphaThreshold": 0.75 "alphaThreshold": 0.75
}, },
@ -181,7 +178,7 @@
"saturation": 0, "saturation": 0,
"contrast": 0 "contrast": 0
}, },
"detectionModes": [], "detectionModes": {},
"occludable": { "occludable": {
"radius": 0 "radius": 0
}, },
@ -207,7 +204,8 @@
"flags": {}, "flags": {},
"randomImg": false, "randomImg": false,
"appendNumber": false, "appendNumber": false,
"prependAdjective": false "prependAdjective": false,
"depth": 1
}, },
"items": [ "items": [
{ {
@ -242,35 +240,95 @@
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>", "description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"DjbPQowW1OdBD9Zn": { "wez1xgy9vScux9wi": {
"type": "effect", "type": "attack",
"_id": "DjbPQowW1OdBD9Zn", "_id": "wez1xgy9vScux9wi",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"triggers": [],
"cost": [ "cost": [
{ {
"consumeOnSuccess": false,
"scalable": false, "scalable": false,
"key": "fear", "key": "fear",
"value": 1, "value": 1,
"keyIsID": false, "itemId": null,
"step": null, "step": null
"consumeOnSuccess": false
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null "recovery": null,
"consumeOnSuccess": false
},
"damage": {
"parts": {
"hitPoints": {
"applyTo": "hitPoints",
"resultBased": false,
"value": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": true,
"formula": "5"
}
},
"valueAlt": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false,
"formula": ""
}
},
"base": false,
"type": [
"physical"
]
}
},
"includeBase": false,
"direct": false,
"groupAttack": "close"
}, },
"effects": [],
"target": { "target": {
"type": "self", "type": "any",
"amount": null "amount": null
}, },
"effects": [],
"roll": {
"type": "attack",
"trait": null,
"difficulty": null,
"bonus": null,
"advState": "neutral",
"diceRolling": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"compare": null,
"treshold": null
},
"useDefault": false
},
"save": {
"trait": null,
"difficulty": null,
"damageMod": "none"
},
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/creatures/abilities/tail-strike-bone-orange.webp",
"range": "" "range": ""
} }
}, },

View file

@ -125,12 +125,9 @@
"src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg", "src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg",
"anchorX": 0.5, "anchorX": 0.5,
"anchorY": 0.5, "anchorY": 0.5,
"offsetX": 0,
"offsetY": 0,
"fit": "contain", "fit": "contain",
"scaleX": 1, "scaleX": 1,
"scaleY": 1, "scaleY": 1,
"rotation": 0,
"tint": "#ffffff", "tint": "#ffffff",
"alphaThreshold": 0.75 "alphaThreshold": 0.75
}, },
@ -181,7 +178,7 @@
"saturation": 0, "saturation": 0,
"contrast": 0 "contrast": 0
}, },
"detectionModes": [], "detectionModes": {},
"occludable": { "occludable": {
"radius": 0 "radius": 0
}, },
@ -207,7 +204,8 @@
"flags": {}, "flags": {},
"randomImg": false, "randomImg": false,
"appendNumber": false, "appendNumber": false,
"prependAdjective": false "prependAdjective": false,
"depth": 1
}, },
"items": [ "items": [
{ {
@ -297,33 +295,95 @@
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>", "description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"eo7J0v1B5zPHul1M": { "irZGPKPpGLA6sP2y": {
"type": "effect", "type": "attack",
"_id": "eo7J0v1B5zPHul1M", "_id": "irZGPKPpGLA6sP2y",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"triggers": [],
"cost": [ "cost": [
{ {
"scalable": false, "scalable": false,
"key": "fear", "key": "fear",
"value": 1, "value": 1,
"step": null "itemId": null,
"step": null,
"consumeOnSuccess": false
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null "recovery": null,
"consumeOnSuccess": false
},
"damage": {
"parts": {
"hitPoints": {
"applyTo": "hitPoints",
"resultBased": false,
"value": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": true,
"formula": "10"
}
},
"valueAlt": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false,
"formula": ""
}
},
"base": false,
"type": [
"physical"
]
}
},
"includeBase": false,
"direct": false,
"groupAttack": "close"
}, },
"effects": [],
"target": { "target": {
"type": "self", "type": "any",
"amount": null "amount": null
}, },
"effects": [],
"roll": {
"type": "attack",
"trait": null,
"difficulty": null,
"bonus": null,
"advState": "neutral",
"diceRolling": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"compare": null,
"treshold": null
},
"useDefault": false
},
"save": {
"trait": null,
"difficulty": null,
"damageMod": "none"
},
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/creatures/abilities/tail-strike-bone-orange.webp",
"range": "" "range": ""
} }
}, },

View file

@ -131,12 +131,9 @@
"src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg", "src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg",
"anchorX": 0.5, "anchorX": 0.5,
"anchorY": 0.5, "anchorY": 0.5,
"offsetX": 0,
"offsetY": 0,
"fit": "contain", "fit": "contain",
"scaleX": 1, "scaleX": 1,
"scaleY": 1, "scaleY": 1,
"rotation": 0,
"tint": "#ffffff", "tint": "#ffffff",
"alphaThreshold": 0.75 "alphaThreshold": 0.75
}, },
@ -187,7 +184,7 @@
"saturation": 0, "saturation": 0,
"contrast": 0 "contrast": 0
}, },
"detectionModes": [], "detectionModes": {},
"occludable": { "occludable": {
"radius": 0 "radius": 0
}, },
@ -213,7 +210,8 @@
"flags": {}, "flags": {},
"randomImg": false, "randomImg": false,
"appendNumber": false, "appendNumber": false,
"prependAdjective": false "prependAdjective": false,
"depth": 1
}, },
"items": [ "items": [
{ {
@ -251,33 +249,95 @@
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name] within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>", "description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name] within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"aoQDb2m32NDxE6ZP": { "ferZO3BuiP9zU46m": {
"type": "effect", "type": "attack",
"_id": "aoQDb2m32NDxE6ZP", "_id": "ferZO3BuiP9zU46m",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"triggers": [],
"cost": [ "cost": [
{ {
"consumeOnSuccess": false,
"scalable": false, "scalable": false,
"key": "fear", "key": "fear",
"value": 1, "value": 1,
"itemId": null,
"step": null "step": null
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null "recovery": null,
"consumeOnSuccess": false
},
"damage": {
"parts": {
"hitPoints": {
"applyTo": "hitPoints",
"resultBased": false,
"value": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": true,
"formula": "2"
}
},
"valueAlt": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false,
"formula": ""
}
},
"base": false,
"type": [
"physical"
]
}
},
"includeBase": false,
"direct": false,
"groupAttack": "close"
}, },
"effects": [],
"target": { "target": {
"type": "any", "type": "any",
"amount": null "amount": null
}, },
"effects": [],
"roll": {
"type": "attack",
"trait": null,
"difficulty": null,
"bonus": null,
"advState": "neutral",
"diceRolling": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"compare": null,
"treshold": null
},
"useDefault": false
},
"save": {
"trait": null,
"difficulty": null,
"damageMod": "none"
},
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/creatures/abilities/tail-strike-bone-orange.webp",
"range": "" "range": ""
} }
}, },

View file

@ -125,12 +125,9 @@
"src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg", "src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg",
"anchorX": 0.5, "anchorX": 0.5,
"anchorY": 0.5, "anchorY": 0.5,
"offsetX": 0,
"offsetY": 0,
"fit": "contain", "fit": "contain",
"scaleX": 1, "scaleX": 1,
"scaleY": 1, "scaleY": 1,
"rotation": 0,
"tint": "#ffffff", "tint": "#ffffff",
"alphaThreshold": 0.75 "alphaThreshold": 0.75
}, },
@ -181,7 +178,7 @@
"saturation": 0, "saturation": 0,
"contrast": 0 "contrast": 0
}, },
"detectionModes": [], "detectionModes": {},
"occludable": { "occludable": {
"radius": 0 "radius": 0
}, },
@ -207,7 +204,8 @@
"flags": {}, "flags": {},
"randomImg": false, "randomImg": false,
"appendNumber": false, "appendNumber": false,
"prependAdjective": false "prependAdjective": false,
"depth": 1
}, },
"items": [ "items": [
{ {
@ -245,33 +243,95 @@
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>", "description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"xTMNAHcoErKuR6TZ": { "xFlhxnQWmVvDqQ55": {
"type": "effect", "type": "attack",
"_id": "xTMNAHcoErKuR6TZ", "_id": "xFlhxnQWmVvDqQ55",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"triggers": [],
"cost": [ "cost": [
{ {
"scalable": false, "scalable": false,
"key": "fear", "key": "fear",
"value": 1, "value": 1,
"step": null "itemId": null,
"step": null,
"consumeOnSuccess": false
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null "recovery": null,
"consumeOnSuccess": false
},
"damage": {
"parts": {
"hitPoints": {
"applyTo": "hitPoints",
"resultBased": false,
"value": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": true,
"formula": "4"
}
},
"valueAlt": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false,
"formula": ""
}
},
"base": false,
"type": [
"physical"
]
}
},
"includeBase": false,
"direct": false,
"groupAttack": "close"
}, },
"effects": [],
"target": { "target": {
"type": "self", "type": "any",
"amount": null "amount": null
}, },
"effects": [],
"roll": {
"type": "attack",
"trait": null,
"difficulty": null,
"bonus": null,
"advState": "neutral",
"diceRolling": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"compare": null,
"treshold": null
},
"useDefault": false
},
"save": {
"trait": null,
"difficulty": null,
"damageMod": "none"
},
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/creatures/abilities/tail-strike-bone-orange.webp",
"range": "" "range": ""
} }
}, },

View file

@ -125,12 +125,9 @@
"src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg", "src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg",
"anchorX": 0.5, "anchorX": 0.5,
"anchorY": 0.5, "anchorY": 0.5,
"offsetX": 0,
"offsetY": 0,
"fit": "contain", "fit": "contain",
"scaleX": 1, "scaleX": 1,
"scaleY": 1, "scaleY": 1,
"rotation": 0,
"tint": "#ffffff", "tint": "#ffffff",
"alphaThreshold": 0.75 "alphaThreshold": 0.75
}, },
@ -181,7 +178,7 @@
"saturation": 0, "saturation": 0,
"contrast": 0 "contrast": 0
}, },
"detectionModes": [], "detectionModes": {},
"occludable": { "occludable": {
"radius": 0 "radius": 0
}, },
@ -207,7 +204,8 @@
"flags": {}, "flags": {},
"randomImg": false, "randomImg": false,
"appendNumber": false, "appendNumber": false,
"prependAdjective": false "prependAdjective": false,
"depth": 1
}, },
"items": [ "items": [
{ {
@ -242,33 +240,95 @@
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>", "description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"tvQetauskZoHDR5y": { "6VKv71tPUIGGIfkZ": {
"type": "effect", "type": "attack",
"_id": "tvQetauskZoHDR5y", "_id": "6VKv71tPUIGGIfkZ",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"triggers": [],
"cost": [ "cost": [
{ {
"consumeOnSuccess": false,
"scalable": false, "scalable": false,
"key": "fear", "key": "fear",
"value": 1, "value": 1,
"itemId": null,
"step": null "step": null
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null "recovery": null,
"consumeOnSuccess": false
},
"damage": {
"parts": {
"hitPoints": {
"applyTo": "hitPoints",
"resultBased": false,
"value": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": true,
"formula": "11"
}
},
"valueAlt": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false,
"formula": ""
}
},
"base": false,
"type": [
"physical"
]
}
},
"includeBase": false,
"direct": false,
"groupAttack": "close"
}, },
"effects": [],
"target": { "target": {
"type": "self", "type": "any",
"amount": null "amount": null
}, },
"effects": [],
"roll": {
"type": "attack",
"trait": null,
"difficulty": null,
"bonus": null,
"advState": "neutral",
"diceRolling": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"compare": null,
"treshold": null
},
"useDefault": false
},
"save": {
"trait": null,
"difficulty": null,
"damageMod": "none"
},
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/creatures/abilities/tail-strike-bone-orange.webp",
"range": "" "range": ""
} }
}, },

View file

@ -125,12 +125,9 @@
"src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg", "src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg",
"anchorX": 0.5, "anchorX": 0.5,
"anchorY": 0.5, "anchorY": 0.5,
"offsetX": 0,
"offsetY": 0,
"fit": "contain", "fit": "contain",
"scaleX": 1, "scaleX": 1,
"scaleY": 1, "scaleY": 1,
"rotation": 0,
"tint": "#ffffff", "tint": "#ffffff",
"alphaThreshold": 0.75 "alphaThreshold": 0.75
}, },
@ -181,7 +178,7 @@
"saturation": 0, "saturation": 0,
"contrast": 0 "contrast": 0
}, },
"detectionModes": [], "detectionModes": {},
"occludable": { "occludable": {
"radius": 0 "radius": 0
}, },
@ -207,7 +204,8 @@
"flags": {}, "flags": {},
"randomImg": false, "randomImg": false,
"appendNumber": false, "appendNumber": false,
"prependAdjective": false "prependAdjective": false,
"depth": 1
}, },
"items": [ "items": [
{ {
@ -245,33 +243,95 @@
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>", "description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"DJBNtd3hWjwsjPwq": { "8wRrAWHU0xHW4zuE": {
"type": "effect", "type": "attack",
"_id": "DJBNtd3hWjwsjPwq", "_id": "8wRrAWHU0xHW4zuE",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"triggers": [],
"cost": [ "cost": [
{ {
"scalable": false, "scalable": false,
"key": "fear", "key": "fear",
"value": 1, "value": 1,
"step": null "itemId": null,
"step": null,
"consumeOnSuccess": false
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null "recovery": null,
"consumeOnSuccess": false
},
"damage": {
"parts": {
"hitPoints": {
"applyTo": "hitPoints",
"resultBased": false,
"value": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": true,
"formula": "2"
}
},
"valueAlt": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false,
"formula": ""
}
},
"base": false,
"type": [
"physical"
]
}
},
"includeBase": false,
"direct": false,
"groupAttack": "close"
}, },
"effects": [],
"target": { "target": {
"type": "self", "type": "any",
"amount": null "amount": null
}, },
"effects": [],
"roll": {
"type": "attack",
"trait": null,
"difficulty": null,
"bonus": null,
"advState": "neutral",
"diceRolling": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"compare": null,
"treshold": null
},
"useDefault": false
},
"save": {
"trait": null,
"difficulty": null,
"damageMod": "none"
},
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/creatures/abilities/tail-strike-bone-orange.webp",
"range": "" "range": ""
} }
}, },

View file

@ -125,12 +125,9 @@
"src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg", "src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg",
"anchorX": 0.5, "anchorX": 0.5,
"anchorY": 0.5, "anchorY": 0.5,
"offsetX": 0,
"offsetY": 0,
"fit": "contain", "fit": "contain",
"scaleX": 1, "scaleX": 1,
"scaleY": 1, "scaleY": 1,
"rotation": 0,
"tint": "#ffffff", "tint": "#ffffff",
"alphaThreshold": 0.75 "alphaThreshold": 0.75
}, },
@ -181,7 +178,7 @@
"saturation": 0, "saturation": 0,
"contrast": 0 "contrast": 0
}, },
"detectionModes": [], "detectionModes": {},
"occludable": { "occludable": {
"radius": 0 "radius": 0
}, },
@ -207,7 +204,8 @@
"flags": {}, "flags": {},
"randomImg": false, "randomImg": false,
"appendNumber": false, "appendNumber": false,
"prependAdjective": false "prependAdjective": false,
"depth": 1
}, },
"items": [ "items": [
{ {
@ -245,33 +243,95 @@
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>", "description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"ghgFZskDiizJDjcn": { "K3pF2DBnR9zJ90W8": {
"type": "effect", "type": "attack",
"_id": "ghgFZskDiizJDjcn", "_id": "K3pF2DBnR9zJ90W8",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"triggers": [],
"cost": [ "cost": [
{ {
"consumeOnSuccess": false,
"scalable": false, "scalable": false,
"key": "fear", "key": "fear",
"value": 1, "value": 1,
"itemId": null,
"step": null "step": null
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null "recovery": null,
"consumeOnSuccess": false
},
"damage": {
"parts": {
"hitPoints": {
"applyTo": "hitPoints",
"resultBased": false,
"value": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": true,
"formula": "3"
}
},
"valueAlt": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false,
"formula": ""
}
},
"base": false,
"type": [
"physical"
]
}
},
"includeBase": false,
"direct": false,
"groupAttack": "close"
}, },
"effects": [],
"target": { "target": {
"type": "self", "type": "any",
"amount": null "amount": null
}, },
"effects": [],
"roll": {
"type": "attack",
"trait": null,
"difficulty": null,
"bonus": null,
"advState": "neutral",
"diceRolling": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"compare": null,
"treshold": null
},
"useDefault": false
},
"save": {
"trait": null,
"difficulty": null,
"damageMod": "none"
},
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/creatures/abilities/tail-strike-bone-orange.webp",
"range": "" "range": ""
} }
}, },

View file

@ -125,12 +125,9 @@
"src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg", "src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg",
"anchorX": 0.5, "anchorX": 0.5,
"anchorY": 0.5, "anchorY": 0.5,
"offsetX": 0,
"offsetY": 0,
"fit": "contain", "fit": "contain",
"scaleX": 1, "scaleX": 1,
"scaleY": 1, "scaleY": 1,
"rotation": 0,
"tint": "#ffffff", "tint": "#ffffff",
"alphaThreshold": 0.75 "alphaThreshold": 0.75
}, },
@ -181,7 +178,7 @@
"saturation": 0, "saturation": 0,
"contrast": 0 "contrast": 0
}, },
"detectionModes": [], "detectionModes": {},
"occludable": { "occludable": {
"radius": 0 "radius": 0
}, },
@ -207,7 +204,8 @@
"flags": {}, "flags": {},
"randomImg": false, "randomImg": false,
"appendNumber": false, "appendNumber": false,
"prependAdjective": false "prependAdjective": false,
"depth": 1
}, },
"items": [ "items": [
{ {
@ -245,33 +243,95 @@
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>", "description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"Sz55uB8xkoNytLwJ": { "6rdwJKwsSCO4R0Ty": {
"type": "effect", "type": "attack",
"_id": "Sz55uB8xkoNytLwJ", "_id": "6rdwJKwsSCO4R0Ty",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"triggers": [],
"cost": [ "cost": [
{ {
"scalable": false, "scalable": false,
"key": "fear", "key": "fear",
"value": 1, "value": 1,
"step": null "itemId": null,
"step": null,
"consumeOnSuccess": false
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null "recovery": null,
"consumeOnSuccess": false
},
"damage": {
"parts": {
"hitPoints": {
"applyTo": "hitPoints",
"resultBased": false,
"value": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": true,
"formula": "1"
}
},
"valueAlt": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false,
"formula": ""
}
},
"base": false,
"type": [
"physical"
]
}
},
"includeBase": false,
"direct": false,
"groupAttack": "close"
}, },
"effects": [],
"target": { "target": {
"type": "self", "type": "any",
"amount": null "amount": null
}, },
"effects": [],
"roll": {
"type": "attack",
"trait": null,
"difficulty": null,
"bonus": null,
"advState": "neutral",
"diceRolling": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"compare": null,
"treshold": null
},
"useDefault": false
},
"save": {
"trait": null,
"difficulty": null,
"damageMod": "none"
},
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/creatures/abilities/tail-strike-bone-orange.webp",
"range": "" "range": ""
} }
}, },

View file

@ -164,12 +164,9 @@
"src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg", "src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg",
"anchorX": 0.5, "anchorX": 0.5,
"anchorY": 0.5, "anchorY": 0.5,
"offsetX": 0,
"offsetY": 0,
"fit": "contain", "fit": "contain",
"scaleX": 1, "scaleX": 1,
"scaleY": 1, "scaleY": 1,
"rotation": 0,
"tint": "#ffffff", "tint": "#ffffff",
"alphaThreshold": 0.75 "alphaThreshold": 0.75
}, },
@ -220,7 +217,7 @@
"saturation": 0, "saturation": 0,
"contrast": 0 "contrast": 0
}, },
"detectionModes": [], "detectionModes": {},
"occludable": { "occludable": {
"radius": 0 "radius": 0
}, },
@ -246,7 +243,8 @@
"flags": {}, "flags": {},
"randomImg": false, "randomImg": false,
"appendNumber": false, "appendNumber": false,
"prependAdjective": false "prependAdjective": false,
"depth": 1
}, },
"items": [ "items": [
{ {
@ -284,33 +282,95 @@
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>", "description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"ZC5pKIb9N82vgMWu": { "V58Ry90tvIjvfDTZ": {
"type": "effect", "type": "attack",
"_id": "ZC5pKIb9N82vgMWu", "_id": "V58Ry90tvIjvfDTZ",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"triggers": [],
"cost": [ "cost": [
{ {
"consumeOnSuccess": false,
"scalable": false, "scalable": false,
"key": "fear", "key": "fear",
"value": 1, "value": 1,
"itemId": null,
"step": null "step": null
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null "recovery": null,
"consumeOnSuccess": false
},
"damage": {
"parts": {
"hitPoints": {
"applyTo": "hitPoints",
"resultBased": false,
"value": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": true,
"formula": "2"
}
},
"valueAlt": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false,
"formula": ""
}
},
"base": false,
"type": [
"physical"
]
}
},
"includeBase": false,
"direct": false,
"groupAttack": "close"
}, },
"effects": [],
"target": { "target": {
"type": "self", "type": "any",
"amount": null "amount": null
}, },
"effects": [],
"roll": {
"type": "attack",
"trait": null,
"difficulty": null,
"bonus": null,
"advState": "neutral",
"diceRolling": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"compare": null,
"treshold": null
},
"useDefault": false
},
"save": {
"trait": null,
"difficulty": null,
"damageMod": "none"
},
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/creatures/abilities/tail-strike-bone-orange.webp",
"range": "" "range": ""
} }
}, },

View file

@ -125,12 +125,9 @@
"src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg", "src": "systems/daggerheart/assets/icons/documents/actors/dragon-head.svg",
"anchorX": 0.5, "anchorX": 0.5,
"anchorY": 0.5, "anchorY": 0.5,
"offsetX": 0,
"offsetY": 0,
"fit": "contain", "fit": "contain",
"scaleX": 1, "scaleX": 1,
"scaleY": 1, "scaleY": 1,
"rotation": 0,
"tint": "#ffffff", "tint": "#ffffff",
"alphaThreshold": 0.75 "alphaThreshold": 0.75
}, },
@ -181,7 +178,7 @@
"saturation": 0, "saturation": 0,
"contrast": 0 "contrast": 0
}, },
"detectionModes": [], "detectionModes": {},
"occludable": { "occludable": {
"radius": 0 "radius": 0
}, },
@ -207,7 +204,8 @@
"flags": {}, "flags": {},
"randomImg": false, "randomImg": false,
"appendNumber": false, "appendNumber": false,
"prependAdjective": false "prependAdjective": false,
"depth": 1
}, },
"items": [ "items": [
{ {
@ -242,33 +240,95 @@
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>", "description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal @Lookup[@system.attack.damageFormula] physical damage each. Combine this damage.</p>",
"resource": null, "resource": null,
"actions": { "actions": {
"euP8VA4wvfsCpwN1": { "Itubbr63irPJcbXG": {
"type": "effect", "type": "attack",
"_id": "euP8VA4wvfsCpwN1", "_id": "Itubbr63irPJcbXG",
"systemPath": "actions", "systemPath": "actions",
"baseAction": false,
"description": "", "description": "",
"chatDisplay": true, "chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action", "actionType": "action",
"triggers": [],
"cost": [ "cost": [
{ {
"scalable": false, "scalable": false,
"key": "fear", "key": "fear",
"value": 1, "value": 1,
"step": null "itemId": null,
"step": null,
"consumeOnSuccess": false
} }
], ],
"uses": { "uses": {
"value": null, "value": null,
"max": "", "max": "",
"recovery": null "recovery": null,
"consumeOnSuccess": false
},
"damage": {
"parts": {
"hitPoints": {
"applyTo": "hitPoints",
"resultBased": false,
"value": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": true,
"formula": "8"
}
},
"valueAlt": {
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false,
"formula": ""
}
},
"base": false,
"type": [
"physical"
]
}
},
"includeBase": false,
"direct": false,
"groupAttack": "close"
}, },
"effects": [],
"target": { "target": {
"type": "self", "type": "any",
"amount": null "amount": null
}, },
"effects": [],
"roll": {
"type": "attack",
"trait": null,
"difficulty": null,
"bonus": null,
"advState": "neutral",
"diceRolling": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"compare": null,
"treshold": null
},
"useDefault": false
},
"save": {
"trait": null,
"difficulty": null,
"damageMod": "none"
},
"name": "Spend Fear", "name": "Spend Fear",
"img": "icons/magic/unholy/orb-hands-pink.webp",
"range": "" "range": ""
} }
}, },

View file

@ -44,7 +44,9 @@
"flatMultiplier": 1 "flatMultiplier": 1
}, },
"applyTo": "hitPoints", "applyTo": "hitPoints",
"type": [], "type": [
"magical"
],
"base": false, "base": false,
"valueAlt": { "valueAlt": {
"multiplier": "prof", "multiplier": "prof",
@ -87,57 +89,6 @@
"name": "Cast", "name": "Cast",
"img": "icons/skills/melee/spear-tips-three-green.webp", "img": "icons/skills/melee/spear-tips-three-green.webp",
"range": "veryClose" "range": "veryClose"
},
"CUKoYyDxQhNc0pLs": {
"type": "damage",
"_id": "CUKoYyDxQhNc0pLs",
"systemPath": "actions",
"description": "<p>If a target you hit is <em>Vulnerable</em>, they take an extra <strong>1d8</strong> damage.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null
},
"damage": {
"parts": {
"hitPoints": {
"value": {
"custom": {
"enabled": false
},
"multiplier": "flat",
"flatMultiplier": 1,
"dice": "d8",
"bonus": null
},
"applyTo": "hitPoints",
"type": [],
"base": false,
"resultBased": false,
"valueAlt": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false
}
}
}
},
"includeBase": false
},
"target": {
"type": "any",
"amount": null
},
"effects": [],
"name": "Damage Against Vulnerable",
"img": "icons/skills/melee/spear-tips-three-purple.webp",
"range": ""
} }
}, },
"attribution": { "attribution": {

View file

@ -5,22 +5,14 @@
"_id": "ijWppQzSOqVCb3rE", "_id": "ijWppQzSOqVCb3rE",
"img": "icons/weapons/axes/axe-battle-jagged.webp", "img": "icons/weapons/axes/axe-battle-jagged.webp",
"system": { "system": {
"description": "", "description": "<strong>Protective:</strong> +1 to Armor Score",
"actions": {}, "actions": {},
"attached": [], "attached": [],
"tier": 3, "tier": 3,
"equipped": false, "equipped": false,
"secondary": false, "secondary": false,
"burden": "twoHanded", "burden": "twoHanded",
"weaponFeatures": [ "weaponFeatures": [],
{
"value": "protective",
"effectIds": [
"qTxADRsQnKiYfOiQ"
],
"actionIds": []
}
],
"attack": { "attack": {
"name": "Attack", "name": "Attack",
"img": "icons/skills/melee/blood-slash-foam-red.webp", "img": "icons/skills/melee/blood-slash-foam-red.webp",
@ -111,8 +103,8 @@
"effects": [ "effects": [
{ {
"name": "Protective", "name": "Protective",
"description": "Add your character's Tier to your Armor Score", "description": "+1 to Armor Score",
"img": "icons/skills/melee/shield-block-gray-orange.webp", "img": "icons/magic/defensive/shield-barrier-deflect-teal.webp",
"_id": "vnR4Zhnb0rOqwrFw", "_id": "vnR4Zhnb0rOqwrFw",
"type": "base", "type": "base",
"system": { "system": {
@ -122,7 +114,7 @@
"phase": "initial", "phase": "initial",
"priority": 20, "priority": 20,
"value": { "value": {
"max": "ITEM.@system.tier" "max": "1"
} }
} }
] ]

View file

@ -41,6 +41,26 @@
} }
} }
.group-attack-container {
margin: 0;
.group-attack-inner-container {
display: flex;
align-items: center;
gap: 16px;
> * {
flex: 1;
}
.group-attack-tools {
display: flex;
align-items: center;
gap: 4px;
}
}
}
.damage-section-controls { .damage-section-controls {
display: flex; display: flex;
align-items: center; align-items: center;

View file

@ -419,11 +419,19 @@
width: fit-content; width: fit-content;
display: flex; display: flex;
align-items: center; align-items: center;
.form-fields { .form-fields {
height: 32px; height: 32px;
align-content: center; align-content: center;
} }
} }
&.select {
width: fit-content;
display: flex;
align-items: center;
gap: 4px;
}
} }
.scalable-input { .scalable-input {

View file

@ -4,6 +4,7 @@
.application.daggerheart { .application.daggerheart {
prose-mirror { prose-mirror {
height: 100% !important; height: 100% !important;
width: 100%;
.editor-menu { .editor-menu {
background-color: transparent; background-color: transparent;

View file

@ -68,5 +68,29 @@
text-align: center; text-align: center;
white-space: nowrap; white-space: nowrap;
} }
color-picker {
gap: 4px;
background: inherit;
}
}
.animation-container {
display: flex;
align-items: center;
justify-content: space-between;
.animation-inner-container {
display: flex;
align-items: center;
justify-content: right;
gap: 8px;
.animation-control {
display: flex;
align-items: center;
gap: 2px;
}
}
} }
} }

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": "2.0.0", "version": "2.0.3",
"compatibility": { "compatibility": {
"minimum": "14.359", "minimum": "14.359",
"verified": "14.359", "verified": "14.359",
@ -297,7 +297,7 @@
"background": "systems/daggerheart/assets/logos/FoundrybornBackgroundLogo.png", "background": "systems/daggerheart/assets/logos/FoundrybornBackgroundLogo.png",
"primaryTokenAttribute": "resources.hitPoints", "primaryTokenAttribute": "resources.hitPoints",
"secondaryTokenAttribute": "resources.stress", "secondaryTokenAttribute": "resources.stress",
"url": "https://your/hosted/system/repo/", "url": "https://github.com/Foundryborne/daggerheart",
"manifest": "https://your/hosted/system/repo/system.json", "manifest": "https://raw.githubusercontent.com/Foundryborne/daggerheart/main/system.json",
"download": "https://your/packaged/download/archive.zip" "download": "https://github.com/Foundryborne/daggerheart/releases/download/2.0.3/system.zip"
} }

View file

@ -8,13 +8,16 @@
{{/if}} {{/if}}
{{#unless (eq path 'system.attack.')}}<a data-action="addDamage" {{#if @root.allDamageTypesUsed}}disabled{{/if}}><i class="fa-solid fa-plus icon-button"></i></a>{{/unless}} {{#unless (eq path 'system.attack.')}}<a data-action="addDamage" {{#if @root.allDamageTypesUsed}}disabled{{/if}}><i class="fa-solid fa-plus icon-button"></i></a>{{/unless}}
</legend> </legend>
<div class="nest-inputs space-between"> <div class="nest-inputs">
{{#if @root.hasBaseDamage}} {{#if @root.hasBaseDamage}}
{{formField @root.fields.damage.fields.includeBase value=@root.source.damage.includeBase name="damage.includeBase" classes="checkbox" localize=true }} {{formField @root.fields.damage.fields.includeBase value=@root.source.damage.includeBase name="damage.includeBase" classes="checkbox" localize=true }}
{{/if}} {{/if}}
{{#unless (eq @root.source.type 'healing')}} {{#unless (eq @root.source.type 'healing')}}
{{formField directField value=source.direct name=(concat path "damage.direct") localize=true classes="checkbox"}} {{formField baseFields.direct value=source.direct name=(concat path "damage.direct") localize=true classes="checkbox"}}
{{/unless}} {{/unless}}
{{#if (and @root.isNPC (not (eq path 'system.attack.')))}}
{{formField baseFields.groupAttack value=source.groupAttack name=(concat path "damage.groupAttack") localize=true classes="select"}}
{{/if}}
</div> </div>
{{!-- Handlebars uses Symbol.Iterator to produce index|key. This isn't compatible with our parts object, so we instead use applyTo, which is the same value --}} {{!-- Handlebars uses Symbol.Iterator to produce index|key. This isn't compatible with our parts object, so we instead use applyTo, which is the same value --}}

View file

@ -4,21 +4,6 @@
<a><i class="fa-solid fa-plus icon-button" data-action="addEffect"></i></a> <a><i class="fa-solid fa-plus icon-button" data-action="addEffect"></i></a>
</legend> </legend>
<ul class="items-list"> <ul class="items-list">
{{!-- {{#each source as | effect index |}}
<div class="inventory-item" data-effect-id="{{effect._id}}" data-action="editEffect">
{{#with (@root.getEffectDetails effect._id) as | details |}}
<img class="item-img" src="{{img}}">
<div class="item-label">
<span class="item-name">{{name}}</span>
</div>
{{/with}}
<input type="hidden" name="effects.{{index}}._id" value="{{effect._id}}">
{{#if @root.source.save.trait}}{{formInput ../fields.onSave value=effect.onSave name=(concat "effects." index ".onSave") dataset=(object tooltip=(localize "DAGGERHEART.UI.Tooltip.appliedEvenIfSuccessful") tooltipDirection="UP")}}{{/if}}
<div class="controls">
<a data-tooltip="{{localize "CONTROLS.CommonDelete"}}" data-action="removeEffect" data-index="{{index}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}} --}}
{{#each source as | effect index |}} {{#each source as | effect index |}}
<div class="inventory-item single-img" data-effect-id="{{effect._id}}" data-action="editEffect"> <div class="inventory-item single-img" data-effect-id="{{effect._id}}" data-action="editEffect">
<div class="inventory-item-header"> <div class="inventory-item-header">

View file

@ -1,12 +1,12 @@
<fieldset class="one-column"> <fieldset class="one-column">
<legend>{{localize "DAGGERHEART.GENERAL.range"}}{{#if fields.target}} & {{localize "DAGGERHEART.GENERAL.Target.single"}}{{/if}}</legend> <legend>{{localize "DAGGERHEART.GENERAL.range"}}{{#if fields.target}} & {{localize "DAGGERHEART.GENERAL.Target.single"}}{{/if}}</legend>
{{formField fields.range value=source.range label="DAGGERHEART.GENERAL.range" name=(concat path "range") localize=true}} {{formField fields.range value=source.range label=(localize "DAGGERHEART.GENERAL.range") name=(concat path "range") localize=true}}
{{#if fields.target}} {{#if fields.target}}
<div class="nest-inputs"> <div class="nest-inputs">
{{#if (and source.target.type (not (eq source.target.type 'self')))}} {{#if (and source.target.type (not (eq source.target.type 'self')))}}
{{ formField fields.target.amount value=source.target.amount label="DAGGERHEART.GENERAL.amount" name=(concat path "target.amount") localize=true}} {{ formField fields.target.amount value=source.target.amount label=(localize "DAGGERHEART.GENERAL.amount") name=(concat path "target.amount") localize=true}}
{{/if}} {{/if}}
{{ formField fields.target.type value=source.target.type label="DAGGERHEART.GENERAL.Target.single" name=(concat path "target.type") localize=true }} {{ formField fields.target.type value=source.target.type label=(localize "DAGGERHEART.GENERAL.Target.single") name=(concat path "target.type") localize=true }}
</div> </div>
{{/if}} {{/if}}
</fieldset> </fieldset>

View file

@ -4,7 +4,7 @@
{{#if @root.hasBaseDamage}}{{formInput fields.useDefault name="roll.useDefault" value=source.useDefault dataset=(object tooltip="Use default Item values" tooltipDirection="UP")}}{{/if}} {{#if @root.hasBaseDamage}}{{formInput fields.useDefault name="roll.useDefault" value=source.useDefault dataset=(object tooltip="Use default Item values" tooltipDirection="UP")}}{{/if}}
</legend> </legend>
{{formField fields.type label="Type" name="roll.type" value=source.type localize=true choices=@root.getRollTypeOptions}} {{formField fields.type label="DAGGERHEART.GENERAL.type" name="roll.type" value=source.type localize=true choices=@root.getRollTypeOptions localize=true}}
{{#if (eq source.type "diceSet")}} {{#if (eq source.type "diceSet")}}
<div class="nest-inputs"> <div class="nest-inputs">
{{formField fields.diceRolling.fields.multiplier name="roll.diceRolling.multiplier" value=source.diceRolling.multiplier localize=true}} {{formField fields.diceRolling.fields.multiplier name="roll.diceRolling.multiplier" value=source.diceRolling.multiplier localize=true}}
@ -17,13 +17,13 @@
<div class="nest-inputs"> <div class="nest-inputs">
{{#unless (eq source.type 'spellcast')}} {{#unless (eq source.type 'spellcast')}}
{{#if @root.isNPC}} {{#if @root.isNPC}}
{{formField fields.bonus label="Bonus" name="roll.bonus" value=source.bonus placeholder=@root.baseAttackBonus disabled=(not source.type)}} {{formField fields.bonus label="DAGGERHEART.GENERAL.Modifier.single" name="roll.bonus" value=source.bonus placeholder=@root.baseAttackBonus disabled=(not source.type) localize=true}}
{{else}} {{else}}
{{formField fields.trait label="Trait" name="roll.trait" value=source.trait localize=true disabled=(not source.type)}} {{formField fields.trait label="DAGGERHEART.GENERAL.Trait.single" name="roll.trait" value=source.trait localize=true disabled=(not source.type)}}
{{/if}} {{/if}}
{{/unless}} {{/unless}}
{{formField fields.difficulty label="Difficulty" name="roll.difficulty" value=source.difficulty disabled=(not source.type)}} {{formField fields.difficulty label="DAGGERHEART.GENERAL.difficulty" name="roll.difficulty" value=source.difficulty localize=true disabled=(not source.type)}}
{{formField fields.advState label= "Advantage State" name="roll.advState" value=source.advState localize=true disabled=(not source.type)}} {{formField fields.advState label="DAGGERHEART.ACTIONS.Config.advantageState" name="roll.advState" value=source.advState localize=true localize=true disabled=(not source.type)}}
</div> </div>
{{/if}} {{/if}}
</fieldset> </fieldset>

View file

@ -2,8 +2,8 @@
<legend>{{localize "DAGGERHEART.GENERAL.Roll.reaction"}}</legend> <legend>{{localize "DAGGERHEART.GENERAL.Roll.reaction"}}</legend>
<p class="hint">{{localize "DAGGERHEART.ACTIONS.Settings.saveHint"}}</p> <p class="hint">{{localize "DAGGERHEART.ACTIONS.Settings.saveHint"}}</p>
<div class="nest-inputs"> <div class="nest-inputs">
{{formField fields.trait label="Trait" name="save.trait" value=source.trait localize=true}} {{formField fields.trait label="DAGGERHEART.GENERAL.Trait.single" name="save.trait" value=source.trait localize=true}}
{{formField fields.difficulty label="Difficulty" name="save.difficulty" value=source.difficulty disabled=(not source.trait) placeholder=@root.baseSaveDifficulty}} {{formField fields.difficulty label="DAGGERHEART.GENERAL.difficulty" name="save.difficulty" value=source.difficulty disabled=(not source.trait) placeholder=@root.baseSaveDifficulty localize=true}}
{{formField fields.damageMod label="Damage on Save" name="save.damageMod" value=source.damageMod localize=true disabled=(not source.trait)}} {{formField fields.damageMod label="DAGGERHEART.ACTIONS.Config.damageOnSave" name="save.damageMod" value=source.damageMod localize=true localize=true disabled=(not source.trait)}}
</div> </div>
</fieldset> </fieldset>

View file

@ -42,6 +42,24 @@
</button> </button>
</div> </div>
{{/each}} {{/each}}
{{#if damageOptions.groupAttack}}
<fieldset class="group-attack-container">
<legend>{{localize "DAGGERHEART.ACTIONS.Settings.groupAttack.label"}}</legend>
<div class="group-attack-inner-container">
<input type="text" data-dtype="Number" name="damageOptions.groupAttack.numAttackers" value="{{damageOptions.groupAttack.numAttackers}}" />
<div class="group-attack-tools">
<select name="damageOptions.groupAttack.range">
{{selectOptions rangeOptions selected=damageOptions.groupAttack.range localize=true}}
</select>
<button data-action="updateGroupAttack"><i class="fa-solid fa-crosshairs"></i></button>
</div>
</div>
</fieldset>
{{/if}}
{{#unless (empty @root.modifiers)}} {{#unless (empty @root.modifiers)}}
<fieldset class="modifier-container two-columns"> <fieldset class="modifier-container two-columns">
<legend>{{localize "DAGGERHEART.GENERAL.Modifier.plural"}}</legend> <legend>{{localize "DAGGERHEART.GENERAL.Modifier.plural"}}</legend>

View file

@ -17,19 +17,24 @@
<div class="form-group"> <div class="form-group">
<label>{{localize "DAGGERHEART.APPLICATIONS.TagTeamSelect.FIELDS.initiator.memberId.label"}}</label> <label>{{localize "DAGGERHEART.APPLICATIONS.TagTeamSelect.FIELDS.initiator.memberId.label"}}</label>
<div class="form-fields"> <div class="form-fields">
<select name="initiator.memberId" {{#if initiatorDisabled}}disabled{{/if}}> <select class="initiator-member-field" {{#if initiatorDisabled}}disabled{{/if}}>
{{selectOptions initiatorOptions selected=initiator.memberId blank="" }} {{selectOptions initiatorOptions selected=initiator.memberId blank="" }}
</select> </select>
</div> </div>
</div> </div>
{{formGroup tagTeamFields.initiator.fields.cost name="initiator.cost" value=initiator.cost disabled=initiatorDisabled localize=true }} <div class="form-group">
<label>{{localize "DAGGERHEART.APPLICATIONS.TagTeamSelect.FIELDS.initiator.cost.label"}}</label>
<div class="form-fields">
<input type="text" data-dtype="Number" value="{{initiator.cost}}" class="initiator-cost-field" {{#if initiatorDisabled}}disabled{{/if}} />
</div>
</div>
</div> </div>
<footer> <footer>
<button type="button" data-action="startTagTeamRoll" {{#unless canStartTagTeam}}disabled{{/unless}}>{{localize "DAGGERHEART.APPLICATIONS.TagTeamSelect.startTagTeamRoll"}} <i class="fa-solid fa-arrow-right-long"></i></button> <button type="button" data-action="startTagTeamRoll" {{#unless canStartTagTeam}}disabled{{/unless}}>{{localize "DAGGERHEART.APPLICATIONS.TagTeamSelect.startTagTeamRoll"}} <i class="fa-solid fa-arrow-right-long"></i></button>
<div class="finish-tools {{#unless canStartTagTeam}}inactive{{/unless}}"> <div class="finish-tools {{#unless canStartTagTeam}}inactive{{/unless}}">
<span>{{localize "DAGGERHEART.APPLICATIONS.TagTeamSelect.openDialogForAll"}}</span> <span>{{localize "DAGGERHEART.APPLICATIONS.TagTeamSelect.openDialogForAll"}}</span>
<input type="checkbox" name="openForAllPlayers" {{#unless canStartTagTeam}}disabled{{/unless}} {{checked openForAllPlayers}} /> <input type="checkbox" class="openforall-field" {{#unless canStartTagTeam}}disabled{{/unless}} {{checked openForAllPlayers}} />
</div> </div>
</footer> </footer>
</section> </section>

View file

@ -9,8 +9,15 @@
{{/if}} {{/if}}
<div class="form-group"> <div class="form-group">
<label>{{localize "DAGGERHEART.SETTINGS.Menu.appearance.diceSoNice.critical"}}</label> <label>{{localize "DAGGERHEART.SETTINGS.Menu.appearance.diceSoNice.critical"}}</label>
<div class="form-fields"> <div class="form-fields">
{{formInput fields.diceSoNice.fields.sfx.fields.critical.fields.class value=setting.diceSoNice.sfx.critical.class blank="" localize=true}} <div class="form-fields">
{{formInput fields.diceSoNice.fields.sfx.fields.critical.fields.class value=setting.diceSoNice.sfx.critical.class blank="" localize=true}}
</div>
<label>{{localize "DAGGERHEART.SETTINGS.Menu.appearance.diceSoNice.muted"}}</label>
<div class="form-fields">
{{formInput fields.diceSoNice.fields.sfx.fields.critical.fields.options.fields.muteSound value=setting.diceSoNice.sfx.critical.options.muteSound localize=true}}
</div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -42,9 +42,15 @@
{{#if animations}} {{#if animations}}
<h3>{{localize "DAGGERHEART.SETTINGS.Menu.appearance.diceSoNice.animations"}}</h3> <h3>{{localize "DAGGERHEART.SETTINGS.Menu.appearance.diceSoNice.animations"}}</h3>
<div class="label-container full-width"> <div class="animation-container">
<label>{{localize "DAGGERHEART.CONFIG.DaggerheartDiceAnimationEvents.higher.name"}}</label> <label>{{localize "DAGGERHEART.CONFIG.DaggerheartDiceAnimationEvents.higher.name"}}</label>
{{formInput fields.sfx.fields.higher.fields.class value=values.sfx.higher.class blank="" localize=true}} <div class="animation-inner-container">
{{formInput fields.sfx.fields.higher.fields.class value=values.sfx.higher.class blank="" localize=true}}
<div class="animation-control">
<label>{{localize "DAGGERHEART.SETTINGS.Menu.appearance.diceSoNice.muted"}}</label>
{{formInput fields.sfx.fields.higher.fields.options.fields.muteSound value=values.sfx.higher.options.muteSound localize=true}}
</div>
</div>
</div> </div>
{{/if}} {{/if}}

View file

@ -5,7 +5,7 @@
> >
{{#if fields.roll}}{{> 'systems/daggerheart/templates/actionTypes/roll.hbs' fields=fields.roll.fields source=source.roll}}{{/if}} {{#if fields.roll}}{{> 'systems/daggerheart/templates/actionTypes/roll.hbs' fields=fields.roll.fields source=source.roll}}{{/if}}
{{#if fields.save}}{{> 'systems/daggerheart/templates/actionTypes/save.hbs' fields=fields.save.fields source=source.save}}{{/if}} {{#if fields.save}}{{> 'systems/daggerheart/templates/actionTypes/save.hbs' fields=fields.save.fields source=source.save}}{{/if}}
{{#if fields.damage}}{{> 'systems/daggerheart/templates/actionTypes/damage.hbs' fields=fields.damage.fields.parts.element.fields source=source.damage directField=fields.damage.fields.direct }}{{/if}} {{#if fields.damage}}{{> 'systems/daggerheart/templates/actionTypes/damage.hbs' fields=fields.damage.fields.parts.element.fields source=source.damage baseFields=fields.damage.fields }}{{/if}}
{{#if fields.macro}}{{> 'systems/daggerheart/templates/actionTypes/macro.hbs' fields=fields.macro source=source.macro}}{{/if}} {{#if fields.macro}}{{> 'systems/daggerheart/templates/actionTypes/macro.hbs' fields=fields.macro source=source.macro}}{{/if}}
{{#if fields.effects}}{{> 'systems/daggerheart/templates/actionTypes/effect.hbs' fields=fields.effects.element.fields source=source.effects}}{{/if}} {{#if fields.effects}}{{> 'systems/daggerheart/templates/actionTypes/effect.hbs' fields=fields.effects.element.fields source=source.effects}}{{/if}}
{{#if fields.beastform}}{{> 'systems/daggerheart/templates/actionTypes/beastform.hbs' fields=fields.beastform.fields source=source.beastform}}{{/if}} {{#if fields.beastform}}{{> 'systems/daggerheart/templates/actionTypes/beastform.hbs' fields=fields.beastform.fields source=source.beastform}}{{/if}}

View file

@ -11,7 +11,7 @@
<fieldset class="one-column"> <fieldset class="one-column">
<legend>{{localize "DAGGERHEART.GENERAL.attack"}}</legend> <legend>{{localize "DAGGERHEART.GENERAL.attack"}}</legend>
<div class="nest-inputs"> <div class="nest-inputs">
{{formField systemFields.attack.fields.roll.fields.bonus value=document._source.system.attack.roll.bonus label="DAGGERHEART.ACTIONS.Settings.attackBonus" name="system.attack.roll.bonus" localize=true}} {{formField systemFields.attack.fields.roll.fields.bonus value=document._source.system.attack.roll.bonus label="DAGGERHEART.ACTIONS.Settings.attackModifier" name="system.attack.roll.bonus" localize=true}}
{{formField systemFields.attack.fields.range value=document._source.system.attack.range label="DAGGERHEART.GENERAL.range" name="system.attack.range" localize=true}} {{formField systemFields.attack.fields.range value=document._source.system.attack.range label="DAGGERHEART.GENERAL.range" name="system.attack.range" localize=true}}
{{#if systemFields.attack.fields.target.fields}} {{#if systemFields.attack.fields.target.fields}}
{{ formField systemFields.attack.fields.target.fields.type value=document._source.system.attack.target.type label="DAGGERHEART.GENERAL.Target.single" name="system.attack.target.type" localize=true }} {{ formField systemFields.attack.fields.target.fields.type value=document._source.system.attack.target.type label="DAGGERHEART.GENERAL.Target.single" name="system.attack.target.type" localize=true }}
@ -22,5 +22,5 @@
</div> </div>
{{formGroup systemFields.criticalThreshold value=document._source.system.criticalThreshold label="DAGGERHEART.ACTIONS.Settings.criticalThreshold" name="system.criticalThreshold" localize=true}} {{formGroup systemFields.criticalThreshold value=document._source.system.criticalThreshold label="DAGGERHEART.ACTIONS.Settings.criticalThreshold" name="system.criticalThreshold" localize=true}}
</fieldset> </fieldset>
{{> 'systems/daggerheart/templates/actionTypes/damage.hbs' fields=systemFields.attack.fields.damage.fields.parts.element.fields source=document.system.attack.damage path="system.attack." directField=systemFields.attack.fields.damage.fields.direct horde=(eq document._source.system.type 'horde')}} {{> 'systems/daggerheart/templates/actionTypes/damage.hbs' fields=systemFields.attack.fields.damage.fields.parts.element.fields source=document.system.attack.damage path="system.attack." baseFields=systemFields.attack.fields.damage.fields horde=(eq document._source.system.type 'horde')}}
</section> </section>

View file

@ -18,5 +18,5 @@
{{/if}} {{/if}}
{{/if}} {{/if}}
</fieldset> </fieldset>
{{> 'systems/daggerheart/templates/actionTypes/damage.hbs' fields=systemFields.attack.fields.damage.fields.parts.element.fields source=document.system.attack.damage path="system.attack." directField=systemFields.attack.fields.damage.fields.direct}} {{> 'systems/daggerheart/templates/actionTypes/damage.hbs' fields=systemFields.attack.fields.damage.fields.parts.element.fields source=document.system.attack.damage path="system.attack." baseFields=systemFields.attack.fields.damage.fields}}
</section> </section>

View file

@ -4,17 +4,27 @@
<h1 class="actor-name input" contenteditable="plaintext-only" data-property="name" placeholder="{{localize "DAGGERHEART.GENERAL.actorName"}}">{{source.name}}</h1> <h1 class="actor-name input" contenteditable="plaintext-only" data-property="name" placeholder="{{localize "DAGGERHEART.GENERAL.actorName"}}">{{source.name}}</h1>
<div class='level-div'> <div class='level-div'>
<h3 class='label'> <h3 class='label'>
{{#if (or document.system.needsCharacterSetup document.system.levelData.canLevelUp)}} {{#if document.system.needsCharacterSetup}}
<button <button
type="button" type="button"
class="level-button glow" data-tooltip="{{#if document.system.needsCharacterSetup}}{{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.buttonTitle"}}{{else}}{{localize "DAGGERHEART.ACTORS.Character.levelUp"}}{{/if}}" class="level-button glow"
data-action="levelManagement"
>
{{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.buttonTitle"}}
</button>
{{else if document.system.levelData.canLevelUp}}
<button
type="button"
class="level-button glow" data-tooltip="{{localize "DAGGERHEART.ACTORS.Character.levelUp"}}"
data-action="levelManagement" data-action="levelManagement"
> >
<i class="fa-solid fa-angles-up"></i> <i class="fa-solid fa-angles-up"></i>
</button> </button>
{{/if}} {{/if}}
{{localize 'DAGGERHEART.GENERAL.level'}} {{#unless document.system.needsCharacterSetup}}
<input type="text" data-dtype="Number" class="level-value" value={{#if document.system.needsCharacterSetup}}0{{else}}{{document.system.levelData.level.changed}}{{/if}} {{#if document.system.needsCharacterSetup}}disabled{{/if}} /> {{localize 'DAGGERHEART.GENERAL.level'}}
<input type="text" data-dtype="Number" class="level-value" value={{#if document.system.needsCharacterSetup}}0{{else}}{{document.system.levelData.level.changed}}{{/if}} {{#if document.system.needsCharacterSetup}}disabled{{/if}} />
{{/unless}}
</h3> </h3>
</div> </div>
</div> </div>

View file

@ -1,9 +1,9 @@
<div class="item-description-outer-container"> {{#if features.length}}
{{#if features.length}} <div class="item-description-outer-container">
<div class="item-description-container"> <div class="item-description-container">
{{#each features as | feature |}} {{#each features as | feature |}}
<div><strong>{{localize feature.label}}</strong>: {{{localize feature.description}}}</div> <div><strong>{{localize feature.label}}</strong>: {{{localize feature.description}}}</div>
{{/each}} {{/each}}
</div> </div>
{{/if}} </div>
</div> {{/if}}

View file

@ -1,9 +1,9 @@
<div class="item-description-outer-container"> {{#if features.length}}
{{#if features.length}} <div class="item-description-outer-container">
<div class="item-description-container"> <div class="item-description-container">
{{#each features as | feature |}} {{#each features as | feature |}}
<div><strong>{{localize feature.label}}</strong>: {{{localize feature.description}}}</div> <div><strong>{{localize feature.label}}</strong>: {{{localize feature.description}}}</div>
{{/each}} {{/each}}
</div> </div>
{{/if}} </div>
</div> {{/if}}

View file

@ -33,31 +33,32 @@
<div class="roll-formula">{{total}}</div></span></label> <div class="roll-formula">{{total}}</div></span></label>
{{/if}} {{/if}}
<div class="roll-dice"> <div class="roll-dice">
{{#each dice}} {{#if dice.length}}
{{#each results}} {{#each dice}}
{{#unless discarded}} {{#each results}}
<div class="roll-die{{#unless @../first}} has-plus{{/unless}}"> {{#unless discarded}}
<div <div class="roll-die{{#unless @../first}} has-plus{{/unless}}">
class="dice reroll-button {{../dice}}" <div
data-die-index="0" data-type="damage" data-damage-type="{{@../../../key}}" data-part="{{@../../key}}" data-dice="{{@../key}}" data-result="{{@key}}" class="dice reroll-button {{../dice}}"
> data-die-index="0" data-type="damage" data-damage-type="{{@../../../key}}" data-part="{{@../../key}}" data-dice="{{@../key}}" data-result="{{@key}}"
{{#if hasRerolls}}<i class="fa-solid fa-dice dice-rerolled" data-tooltip="{{localize "DAGGERHEART.GENERAL.rerolled"}}"></i>{{/if}} >
{{result}} {{#if hasRerolls}}<i class="fa-solid fa-dice dice-rerolled" data-tooltip="{{localize "DAGGERHEART.GENERAL.rerolled"}}"></i>{{/if}}
{{result}}
</div>
</div> </div>
</div> {{/unless}}
{{/unless}} {{/each}}
{{/each}} {{/each}}
{{/each}} {{#if modifierTotal}}
{{#if modifierTotal}} <div class="roll-die{{#if (gt modifierTotal 0)}} has-plus{{/if}}">
<div class="roll-die{{#if (gt modifierTotal 0)}} has-plus{{/if}}"> <div class="font-20">{{modifierTotal}}</div>
<div class="font-20">{{modifierTotal}}</div> </div>
</div> {{/if}}
{{/if}} {{else}}
{{#unless dice.length}}
<div class="roll-die"> <div class="roll-die">
<div class="font-20">{{total}}</div> <div class="font-20">{{total}}</div>
</div> </div>
{{/unless}} {{/if}}
</div> </div>
{{/each}} {{/each}}
</fieldset> </fieldset>

View file

@ -11,19 +11,21 @@
{{> ".scene" }} {{> ".scene" }}
</menu> </menu>
{{/with}} {{/with}}
<menu id="scene-navigation-levels" class="scene-levels scene-navigation-menu flexcol levels-{{ scenes.levels.length }}"> {{#if scenes.levels}}
{{#each scenes.levels}} <menu id="scene-navigation-levels" class="scene-levels scene-navigation-menu flexcol" style="--max-levels: {{ scenes.levels.length }}">
<li class="level-row"> {{#each scenes.levels}}
{{#with button}} <li class="level-row">
<button type="button" class="ui-control icon fa-solid {{ css }}" data-action="cycleLevel" {{#with button}}
data-direction="{{ direction }}" aria-label="{{ label }}"></button> <button type="button" class="ui-control icon fa-solid {{ css }}" data-action="cycleLevel"
{{/with}} data-direction="{{ direction }}" aria-label="{{ label }}"></button>
<div class="ui-control scene scene-level {{ css }}" data-scene-id="{{ sceneId }}" data-level-id="{{ id }}" data-action="viewLevel"> {{/with}}
<span class="ellipsis">{{ name }}</span> <div class="ui-control scene scene-level {{ css }}" data-scene-id="{{ sceneId }}" data-level-id="{{ id }}" data-action="viewLevel">
</div> <span class="ellipsis">{{ name }}</span>
</li> </div>
{{/each}} </li>
</menu> {{/each}}
</menu>
{{/if}}
<menu id="scene-navigation-active" class="scene-navigation-menu flexcol"> <menu id="scene-navigation-active" class="scene-navigation-menu flexcol">
{{#each scenes.active}} {{#each scenes.active}}
{{> ".scene" }} {{> ".scene" }}
@ -34,39 +36,6 @@
{{> ".scene" }} {{> ".scene" }}
{{/each}} {{/each}}
</menu> </menu>
{{!-- <menu id="scene-navigation-active" class="scene-navigation-menu flexcol">
{{#each scenes.active as |scene|}}
<li class="scene-wrapper">
<ul>
<li class="ui-control scene {{scene.cssClass}}" data-scene-id="{{scene.id}}" data-action="viewScene" {{#if scene.tooltip}}data-tooltip-text="{{scene.tooltip}}"{{/if}}>
<span class="scene-name ellipsis">{{scene.name}}</span>
{{#if scene.users}}
<ul class="scene-players">
{{#each scene.users as |user|}}
<li class="scene-player" style="--color-bg:{{user.color}}; --color-border:{{user.border}}"
data-tooltip aria-label="{{user.name}}">{{user.letter}}</li>
{{/each}}
</ul>
{{/if}}
</li>
</ul>
{{#if scene.hasEnvironments}}
<button class="ui-control scene-environment {{#if (gt scene.environments.length 1)}}many-environments{{/if}}" data-action="openSceneEnvironment" data-scene-id="{{scene.id}}"><img src="{{scene.environmentImage}}" /> </button>
{{/if}}
</li>
{{/each}}
</menu>
<menu id="scene-navigation-inactive" class="scene-navigation-menu flexcol">
{{#each scenes.inactive as |scene|}}
<li class="scene-wrapper">
<ul>
<li class="ui-control scene {{scene.cssClass}}" data-scene-id="{{scene.id}}" data-action="viewScene" {{#if scene.tooltip}}data-tooltip-text="{{scene.tooltip}}"{{/if}}>
<span class="scene-name ellipsis">{{scene.name}}</span>
</li>
</ul>
</li>
{{/each}}
</menu> --}}
</nav> </nav>
{{#*inline ".scene"}} {{#*inline ".scene"}}