[Feature] Countdown Actions (#1302)

* Added countdown actions

* Added a CountdownAutomation setting to enable/disable countdown automation

* Added Looping

* Added characterSpotlight automation

* Countdown max as formula to enable random countdowns

* Updated compendiums with countdowns

* .

* Fixed lightmode colouration

* Raised system version

* Added automation for ActionRolls on countdowns

* Added automation on fear to countdowns

* Corrected attackAction countdown automation

* Added initial countdown upon creating a CountdownAction

* Improved ActionCountdown initial name to be 'Start Countdown'
This commit is contained in:
WBHarry 2025-11-20 11:46:00 +01:00 committed by GitHub
parent 0233979a9f
commit 207220ff7b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
54 changed files with 1742 additions and 635 deletions

View file

@ -46,6 +46,10 @@
"name": "Beastform",
"tooltip": "Shapeshift the user into another form."
},
"countdown": {
"name": "Countdown",
"tooltip": "Start a countdown"
},
"damage": {
"name": "Damage",
"tooltip": "Direct damage without a roll."
@ -73,6 +77,10 @@
"exactHint": "The Character's Tier is used if empty",
"label": "Beastform"
},
"countdown": {
"defaultOwnership": "Default Ownership",
"startCountdown": "Start Countdown"
},
"damage": {
"multiplier": "Multiplier",
"flatMultiplier": "Flat Multiplier"
@ -321,19 +329,26 @@
},
"Countdown": {
"addCountdown": "Add Countdown",
"loopingTypes": {
"noLooping": "No Looping",
"looping": "Looping",
"increasing": "Increasing",
"decreasing": "Decreasing"
},
"FIELDS": {
"countdowns": {
"element": {
"name": { "label": "Name" },
"progress": {
"current": { "label": "Current" },
"looping": { "label": "Looping" },
"max": { "label": "Max" },
"type": {
"label": { "label": "Label", "hint": "Used for custom" },
"value": { "label": "Value" }
}
},
"type": { "label": "Countdown Type" }
"type": { "label": "Progression Type" }
}
}
},
@ -360,7 +375,9 @@
"currentCountdownValue": "Current: {value}",
"currentCountdownMax": "Max: {value}",
"category": "Category",
"type": "Type",
"progressionType": "Progression Type",
"decreasing": "Decreasing",
"looping": "Looping",
"defaultOwnershipTooltip": "The default player ownership of countdowns",
"hideNewCountdowns": "Hide New Countdowns"
},
@ -915,9 +932,12 @@
}
},
"CountdownType": {
"spotlight": "Spotlight",
"actionRoll": "Action Roll",
"characterAttack": "Character Attack",
"characterSpotlight": "Character Spotlight",
"custom": "Custom",
"characterAttack": "Character Attack"
"fear": "Fear",
"spotlight": "Spotlight"
},
"DamageType": {
"physical": {
@ -2286,6 +2306,10 @@
"gm": { "label": "GM" },
"players": { "label": "Players" }
},
"countdownAutomation": {
"label": "Countdown Automation",
"hint": "Automatically progress countdowns based on their progression settings"
},
"levelupAuto": {
"label": "Levelup Automation",
"hint": "When you've made your choices and finish levelup, the numerical changes are automatically applied to your character."
@ -2545,7 +2569,10 @@
"Countdowns": {
"title": "Countdowns",
"toggleIconMode": "Toggle Icon Only",
"noPlayerAccess": "This countdown isn't visible to any players"
"noPlayerAccess": "This countdown isn't visible to any players",
"loop": "Looping",
"decreasingLoop": "Decreasing Looping",
"increasingLoop": "Increasing Looping"
},
"ItemBrowser": {
"title": "Daggerheart Compendium Browser",

View file

@ -200,7 +200,8 @@ export default class DHActionConfig extends DaggerheartSheet(ApplicationV2) {
const data = this.action.toObject(),
key = event.target.closest('[data-key]').dataset.key;
if (!this.action[key]) return;
data[key].push({});
data[key].push(this.action.defaultValues[key] ?? {});
this.constructor.updateForm.bind(this)(null, null, { object: foundry.utils.flattenObject(data) });
}
@ -266,4 +267,9 @@ export default class DHActionConfig extends DaggerheartSheet(ApplicationV2) {
const id = event.target.closest('[data-effect-id]')?.dataset?.effectId;
this.action.item.effects.get(id).sheet.render(true);
}
async close(options) {
this.tabGroups.primary = 'base';
await super.close(options);
}
}

View file

@ -232,7 +232,8 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo
hasRoll: true,
skips: {
createMessage: true,
resources: !isLeader
resources: !isLeader,
updateCountdowns: !isLeader
}
};
const result = await actor.diceRoll({
@ -291,7 +292,8 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo
},
hasRoll: true,
skips: {
createMessage: true
createMessage: true,
updateCountdowns: true
}
};
const result = await actor.diceRoll({

View file

@ -136,7 +136,10 @@ export default class DhCombatTracker extends foundry.applications.sidebar.tabs.C
if (this.viewed.turn !== toggleTurn) {
const { updateCountdowns } = game.system.api.applications.ui.DhCountdowns;
await updateCountdowns(CONFIG.DH.GENERAL.countdownTypes.spotlight.id);
await updateCountdowns(CONFIG.DH.GENERAL.countdownProgressionTypes.spotlight.id);
if (combatant.actor.type === 'character') {
await updateCountdowns(CONFIG.DH.GENERAL.countdownProgressionTypes.characterSpotlight.id);
}
const autoPoints = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).actionPoints;
if (autoPoints) {

View file

@ -44,18 +44,30 @@ export default class CountdownEdit extends HandlebarsApplicationMixin(Applicatio
context.ownershipDefaultOptions = CONFIG.DH.GENERAL.basicOwnershiplevels;
context.defaultOwnership = this.data.defaultOwnership;
context.countdownBaseTypes = CONFIG.DH.GENERAL.countdownBaseTypes;
context.countdownTypes = CONFIG.DH.GENERAL.countdownTypes;
context.countdownProgressionTypes = CONFIG.DH.GENERAL.countdownProgressionTypes;
context.countdownLoopingTypes = CONFIG.DH.GENERAL.countdownLoopingTypes;
context.hideNewCountdowns = this.hideNewCountdowns;
context.countdowns = Object.keys(this.data.countdowns).reduce((acc, key) => {
const countdown = this.data.countdowns[key];
const isLooping = countdown.progress.looping !== CONFIG.DH.GENERAL.countdownLoopingTypes.noLooping;
const loopTooltip = isLooping
? countdown.progress.looping === CONFIG.DH.GENERAL.countdownLoopingTypes.increasing.id
? 'DAGGERHEART.UI.Countdowns.increasingLoop'
: countdown.progress.looping === CONFIG.DH.GENERAL.countdownLoopingTypes.decreasing.id
? 'DAGGERHEART.UI.Countdowns.decreasingLoop'
: 'DAGGERHEART.UI.Countdowns.loop'
: null;
acc[key] = {
...countdown,
typeName: game.i18n.localize(CONFIG.DH.GENERAL.countdownBaseTypes[countdown.type].name),
typeName: game.i18n.localize(CONFIG.DH.GENERAL.countdownBaseTypes[countdown.type].label),
progress: {
...countdown.progress,
typeName: game.i18n.localize(CONFIG.DH.GENERAL.countdownTypes[countdown.progress.type].label)
typeName: game.i18n.localize(
CONFIG.DH.GENERAL.countdownProgressionTypes[countdown.progress.type].label
)
},
editing: this.editingCountdowns.has(key)
editing: this.editingCountdowns.has(key),
loopTooltip
};
return acc;

View file

@ -33,6 +33,7 @@ export default class DhCountdowns extends HandlebarsApplicationMixin(Application
actions: {
toggleViewMode: DhCountdowns.#toggleViewMode,
editCountdowns: DhCountdowns.#editCountdowns,
loopCountdown: DhCountdowns.#loopCountdown,
decreaseCountdown: (_, target) => this.editCountdown(false, target),
increaseCountdown: (_, target) => this.editCountdown(true, target)
},
@ -111,11 +112,26 @@ export default class DhCountdowns extends HandlebarsApplicationMixin(Application
return acc;
}, []);
const nonGmPlayers = game.users.filter(x => !x.isGM);
const countdownEditable = game.user.isGM || ownership === CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER;
const isLooping = countdown.progress.looping !== CONFIG.DH.GENERAL.countdownLoopingTypes.noLooping;
const loopTooltip = isLooping
? countdown.progress.looping === CONFIG.DH.GENERAL.countdownLoopingTypes.increasing.id
? 'DAGGERHEART.UI.Countdowns.increasingLoop'
: countdown.progress.looping === CONFIG.DH.GENERAL.countdownLoopingTypes.decreasing.id
? 'DAGGERHEART.UI.Countdowns.decreasingLoop'
: 'DAGGERHEART.UI.Countdowns.loop'
: null;
const loopDisabled =
!countdownEditable || (isLooping && (countdown.progress.current > 0 || countdown.progress.max === '0'));
acc[key] = {
...countdown,
editable: game.user.isGM || ownership === CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER,
playerAccess: playersWithAccess.length !== nonGmPlayers.length ? playersWithAccess : [],
noPlayerAccess: nonGmPlayers.length && playersWithAccess.length === 0
editable: countdownEditable,
noPlayerAccess: nonGmPlayers.length && playersWithAccess.length === 0,
shouldLoop: isLooping && countdown.progress.current === 0 && countdown.progress.max > 0,
loopDisabled: isLooping ? loopDisabled : null,
loopTooltip: isLooping && game.i18n.localize(loopTooltip)
};
return acc;
}, {});
@ -161,6 +177,28 @@ export default class DhCountdowns extends HandlebarsApplicationMixin(Application
new game.system.api.applications.ui.CountdownEdit().render(true);
}
static async #loopCountdown(_, target) {
if (!DhCountdowns.canPerformEdit()) return;
const settings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Countdowns);
const countdown = settings.countdowns[target.id];
const newMax =
countdown.progress.looping === CONFIG.DH.GENERAL.countdownLoopingTypes.increasing.id
? countdown.progress.max + 1
: countdown.progress.looping === CONFIG.DH.GENERAL.countdownLoopingTypes.decreasing.id
? Math.max(countdown.progress.max - 1, 0)
: countdown.progress.max;
await settings.updateSource({
[`countdowns.${target.id}.progress`]: {
current: newMax,
max: newMax
}
});
await emitAsGM(GMUpdateEvent.UpdateCountdowns, DhCountdowns.gmSetSetting.bind(settings), settings, null, {
refreshType: RefreshType.Countdown
});
}
static async editCountdown(increase, target) {
if (!DhCountdowns.canPerformEdit()) return;
@ -197,6 +235,9 @@ export default class DhCountdowns extends HandlebarsApplicationMixin(Application
}
static async updateCountdowns(progressType) {
const { countdownAutomation } = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation);
if (!countdownAutomation) return;
const countdownSetting = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Countdowns);
const updatedCountdowns = Object.keys(countdownSetting.countdowns).reduce((acc, key) => {
const countdown = countdownSetting.countdowns[key];

View file

@ -5,6 +5,12 @@ export const actionTypes = {
icon: 'fa-khanda',
tooltip: 'DAGGERHEART.ACTIONS.TYPES.attack.tooltip'
},
countdown: {
id: 'countdown',
name: 'DAGGERHEART.ACTIONS.TYPES.countdown.name',
icon: 'fa-hourglass-half',
tooltip: 'DAGGERHEART.ACTIONS.TYPES.countdown.tooltip'
},
healing: {
id: 'healing',
name: 'DAGGERHEART.ACTIONS.TYPES.healing.name',

View file

@ -611,18 +611,30 @@ export const abilityCosts = {
resource: itemAbilityCosts.resource
};
export const countdownTypes = {
spotlight: {
id: 'spotlight',
label: 'DAGGERHEART.CONFIG.CountdownType.spotlight'
export const countdownProgressionTypes = {
actionRoll: {
id: 'actionRoll',
label: 'DAGGERHEART.CONFIG.CountdownType.actionRoll'
},
characterAttack: {
id: 'characterAttack',
label: 'DAGGERHEART.CONFIG.CountdownType.characterAttack'
},
characterSpotlight: {
id: 'characterSpotlight',
label: 'DAGGERHEART.CONFIG.CountdownType.characterSpotlight'
},
custom: {
id: 'custom',
label: 'DAGGERHEART.CONFIG.CountdownType.custom'
},
fear: {
id: 'fear',
label: 'DAGGERHEART.CONFIG.CountdownType.fear'
},
spotlight: {
id: 'spotlight',
label: 'DAGGERHEART.CONFIG.CountdownType.spotlight'
}
};
export const rollTypes = {
@ -673,11 +685,30 @@ export const simpleOwnershiplevels = {
export const countdownBaseTypes = {
narrative: {
id: 'narrative',
name: 'DAGGERHEART.APPLICATIONS.Countdown.types.narrative'
label: 'DAGGERHEART.APPLICATIONS.Countdown.types.narrative'
},
encounter: {
id: 'encounter',
name: 'DAGGERHEART.APPLICATIONS.Countdown.types.encounter'
label: 'DAGGERHEART.APPLICATIONS.Countdown.types.encounter'
}
};
export const countdownLoopingTypes = {
noLooping: {
id: 'noLooping',
label: 'DAGGERHEART.APPLICATIONS.Countdown.loopingTypes.noLooping'
},
looping: {
id: 'looping',
label: 'DAGGERHEART.APPLICATIONS.Countdown.loopingTypes.looping'
},
increasing: {
id: 'increasing',
label: 'DAGGERHEART.APPLICATIONS.Countdown.loopingTypes.increasing'
},
decreasing: {
id: 'decreasing',
label: 'DAGGERHEART.APPLICATIONS.Countdown.loopingTypes.decreasing'
}
};

View file

@ -2,6 +2,7 @@ export { default as DhCombat } from './combat.mjs';
export { default as DhCombatant } from './combatant.mjs';
export { default as DhTagTeamRoll } from './tagTeamRoll.mjs';
export * as countdowns from './countdowns.mjs';
export * as actions from './action/_module.mjs';
export * as activeEffects from './activeEffect/_module.mjs';
export * as actors from './actor/_module.mjs';

View file

@ -1,6 +1,7 @@
import AttackAction from './attackAction.mjs';
import BaseAction from './baseAction.mjs';
import BeastformAction from './beastformAction.mjs';
import CountdownAction from './countdownAction.mjs';
import DamageAction from './damageAction.mjs';
import EffectAction from './effectAction.mjs';
import HealingAction from './healingAction.mjs';
@ -10,6 +11,7 @@ import SummonAction from './summonAction.mjs';
export const actionsTypes = {
base: BaseAction,
attack: AttackAction,
countdown: CountdownAction,
damage: DamageAction,
healing: HealingAction,
summon: SummonAction,

View file

@ -37,8 +37,10 @@ export default class DHAttackAction extends DHDamageAction {
async use(event, options) {
const result = await super.use(event, options);
if (result.message.system.action.roll?.type === 'attack') {
const { updateCountdowns } = game.system.api.applications.ui.DhCountdowns;
await updateCountdowns(CONFIG.DH.GENERAL.countdownTypes.characterAttack.id);
await updateCountdowns(CONFIG.DH.GENERAL.countdownProgressionTypes.characterAttack.id);
}
return result;
}

View file

@ -43,6 +43,13 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
return schemaFields;
}
/**
* The default values to supply to schema fields when they are created in the actionConfig. Defined by implementing classes.
*/
get defaultValues() {
return {};
}
/**
* Create a Map containing each Action step based on fields define in schema. Ordered by Fields order property.
*

View file

@ -0,0 +1,30 @@
import DHBaseAction from './baseAction.mjs';
export default class DhCountdownAction extends DHBaseAction {
static extraSchemas = [...super.extraSchemas, 'countdown'];
get defaultValues() {
return {
...super.defaultValues,
countdown: {
name: this.parent.parent.name,
img: this.img
}
};
}
/** @inheritdoc */
static getSourceConfig(parent) {
const updateSource = game.system.api.data.actions.actionsTypes.base.getSourceConfig(parent);
updateSource.name = game.i18n.localize('DAGGERHEART.ACTIONS.Config.countdown.startCountdown');
updateSource['countdown'] = [
{
...game.system.api.data.countdowns.DhCountdown.defaultCountdown(),
name: parent.parent.name,
img: parent.parent.img
}
];
return updateSource;
}
}

View file

@ -1,3 +1,5 @@
import FormulaField from './fields/formulaField.mjs';
export default class DhCountdowns extends foundry.abstract.DataModel {
static defineSchema() {
const fields = foundry.data.fields;
@ -105,8 +107,8 @@ class DhOldCountdown extends foundry.abstract.DataModel {
type: new fields.SchemaField({
value: new fields.StringField({
required: true,
choices: CONFIG.DH.GENERAL.countdownTypes,
initial: CONFIG.DH.GENERAL.countdownTypes.custom.id,
choices: CONFIG.DH.GENERAL.countdownProgressionTypes,
initial: CONFIG.DH.GENERAL.countdownProgressionTypes.custom.id,
label: 'DAGGERHEART.GENERAL.type'
}),
label: new fields.StringField({
@ -165,16 +167,22 @@ export class DhCountdown extends foundry.abstract.DataModel {
initial: 1,
label: 'DAGGERHEART.APPLICATIONS.Countdown.FIELDS.countdowns.element.progress.current.label'
}),
max: new fields.NumberField({
max: new FormulaField({
required: true,
integer: true,
initial: 1,
label: 'DAGGERHEART.APPLICATIONS.Countdown.FIELDS.countdowns.element.progress.max.label'
label: 'DAGGERHEART.APPLICATIONS.Countdown.FIELDS.countdowns.element.progress.max.label',
deterministic: false
}),
looping: new fields.StringField({
required: true,
choices: CONFIG.DH.GENERAL.countdownLoopingTypes,
initial: CONFIG.DH.GENERAL.countdownLoopingTypes.noLooping.id,
label: 'DAGGERHEART.APPLICATIONS.Countdown.FIELDS.countdowns.element.progress.looping.label'
}),
type: new fields.StringField({
required: true,
choices: CONFIG.DH.GENERAL.countdownTypes,
initial: CONFIG.DH.GENERAL.countdownTypes.custom.id,
choices: CONFIG.DH.GENERAL.countdownProgressionTypes,
initial: CONFIG.DH.GENERAL.countdownProgressionTypes.custom.id,
label: 'DAGGERHEART.APPLICATIONS.Countdown.FIELDS.countdowns.element.type.label'
})
})

View file

@ -1,4 +1,5 @@
export { default as CostField } from './costField.mjs';
export { default as CountdownField } from './countdownField.mjs';
export { default as UsesField } from './usesField.mjs';
export { default as RangeField } from './rangeField.mjs';
export { default as TargetField } from './targetField.mjs';

View file

@ -0,0 +1,88 @@
import { emitAsGM, GMUpdateEvent, RefreshType, socketEvent } from '../../../systemRegistration/socket.mjs';
const fields = foundry.data.fields;
export default class CountdownField extends fields.ArrayField {
constructor(options = {}, context = {}) {
const element = new fields.SchemaField({
...game.system.api.data.countdowns.DhCountdown.defineSchema(),
type: new fields.StringField({
required: true,
choices: CONFIG.DH.GENERAL.countdownBaseTypes,
initial: CONFIG.DH.GENERAL.countdownBaseTypes.encounter.id,
label: 'DAGGERHEART.GENERAL.type'
}),
name: new fields.StringField({
required: true,
initial: game.i18n.localize('DAGGERHEART.APPLICATIONS.Countdown.newCountdown'),
label: 'DAGGERHEART.APPLICATIONS.Countdown.FIELDS.countdowns.element.name.label'
}),
defaultOwnership: new fields.NumberField({
required: true,
choices: CONFIG.DH.GENERAL.simpleOwnershiplevels,
initial: CONST.DOCUMENT_OWNERSHIP_LEVELS.INHERIT,
label: 'DAGGERHEART.ACTIONS.Config.countdown.defaultOwnership'
})
});
super(element, options, context);
}
/**
* Countdown Action Workflow part.
* Must be called within Action context or similar. Requires a GM online to edit the game setting for countdowns.
* @param {object} config Object that contains workflow datas. Usually made from Action Fields prepareConfig methods.
*/
static async execute(config) {
const noGM = !game.users.find(x => x.isGM && x.active);
if (noGM) {
ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.gmRequired'));
return;
}
const data = { countdowns: {} };
for (let countdown of config.countdowns) {
const { total: max } = await new Roll(countdown.progress.max).evaluate();
data.countdowns[foundry.utils.randomID()] = {
...countdown,
progress: {
...countdown.progress,
current: max,
max: max
}
};
}
await emitAsGM(
GMUpdateEvent.UpdateCountdowns,
async () => {
const countdownSetting = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Countdowns);
await countdownSetting.updateSource(data);
await game.settings.set(
CONFIG.DH.id,
CONFIG.DH.SETTINGS.gameSettings.Countdowns,
countdownSetting.toObject()
),
game.socket.emit(`system.${CONFIG.DH.id}`, {
action: socketEvent.Refresh,
data: { refreshType: RefreshType.Countdown }
});
Hooks.callAll(socketEvent.Refresh, { refreshType: RefreshType.Countdown });
},
data,
null,
{
refreshType: RefreshType.Countdown
}
);
}
/**
* Update Action Workflow config object.
* Must be called within Action context.
* @param {object} config Object that contains workflow datas. Usually made from Action Fields prepareConfig methods.
*/
prepareConfig(config) {
config.countdowns = this.countdown;
return config;
}
}

View file

@ -260,7 +260,7 @@ export function ActionMixin(Base) {
origin: origin,
action: { name: this.name, img: this.img, tags: this.tags ? this.tags : ['Spell', 'Arcana', 'Lv 10'] },
itemOrigin: this.item,
description: this.description || (this.item instanceof Item ? this.item.system.description : "")
description: this.description || (this.item instanceof Item ? this.item.system.description : '')
};
const msg = {
type: 'abilityUse',

View file

@ -18,6 +18,11 @@ export default class DhAutomation extends foundry.abstract.DataModel {
label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.hopeFear.players.label'
})
}),
countdownAutomation: new fields.BooleanField({
required: true,
initial: true,
label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.countdownAutomation.label'
}),
levelupAuto: new fields.BooleanField({
required: true,
initial: true,

View file

@ -32,7 +32,7 @@ export default class DHRoll extends Roll {
const actorIdSplit = config.source?.actor?.split('.');
if (actorIdSplit) {
const tagTeamSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll);
config.tagTeamSelected = tagTeamSettings.members[actorIdSplit[actorIdSplit.length - 1]];
config.tagTeamSelected = Boolean(tagTeamSettings.members[actorIdSplit[actorIdSplit.length - 1]]);
}
for (const hook of config.hooks) {
@ -239,7 +239,22 @@ export default class DHRoll extends Roll {
export const registerRollDiceHooks = () => {
Hooks.on(`${CONFIG.DH.id}.postRollDuality`, async (config, message) => {
const hopeFearAutomation = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).hopeFear;
const automationSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation);
if (
automationSettings.countdownAutomation &&
config.actionType !== CONFIG.DH.ITEM.actionTypes.reaction.id &&
!config.tagTeamSelected &&
!config.skips?.updateCountdowns
) {
const { updateCountdowns } = game.system.api.applications.ui.DhCountdowns;
await updateCountdowns(CONFIG.DH.GENERAL.countdownProgressionTypes.actionRoll.id);
if (config.roll.result.duality === -1) {
await updateCountdowns(CONFIG.DH.GENERAL.countdownProgressionTypes.fear.id);
}
}
const hopeFearAutomation = automationSettings.hopeFear;
if (
!config.source?.actor ||
(game.user.isGM ? !hopeFearAutomation.gm : !hopeFearAutomation.players) ||

View file

@ -28,6 +28,7 @@ export const preloadHandlebarsTemplates = async function () {
'systems/daggerheart/templates/actionTypes/range-target.hbs',
'systems/daggerheart/templates/actionTypes/effect.hbs',
'systems/daggerheart/templates/actionTypes/beastform.hbs',
'systems/daggerheart/templates/actionTypes/countdown.hbs',
'systems/daggerheart/templates/settings/components/settings-item-line.hbs',
'systems/daggerheart/templates/ui/tooltip/parts/tooltipChips.hbs',
'systems/daggerheart/templates/ui/tooltip/parts/tooltipTags.hbs',

View file

@ -611,14 +611,14 @@
"name": "Hallucinatory Breath",
"type": "feature",
"system": {
"description": "<p>Countdown (Loop 1d6). When the Flickerfly takes damage for the first time, activate the countdown. When it triggers, the Flickerfly breathes hallucinatory gas on all targets in front of them up to Far range. Targets must make an Instinct Reaction Roll or be tormented by fearful hallucinations. Targets whose fears are known to the Flickerfl y have disadvantage on this roll. Targets who fail lose 2 Hope and take <strong>3d8+3</strong> direct magic damage.</p><p>@Template[type:inFront|range:f]</p>",
"description": "<p><em>Countdown (Loop 1d6)</em>. When the Flickerfly takes damage for the first time, activate the countdown. When it triggers, the Flickerfly breathes hallucinatory gas on all targets in front of them up to Far range. Targets must make an Instinct Reaction Roll or be tormented by fearful hallucinations. Targets whose fears are known to the Flickerfl y have disadvantage on this roll. Targets who fail lose 2 Hope and take <strong>3d8+3</strong> direct magic damage.</p><p>@Template[type:inFront|range:f]</p>",
"resource": null,
"actions": {
"YOyKyKGTUEWkMmJe": {
"type": "attack",
"_id": "YOyKyKGTUEWkMmJe",
"systemPath": "actions",
"description": "<p>Countdown (Loop 1d6). When the Flickerfly takes damage for the first time, activate the countdown. When it triggers, the Flickerfly breathes hallucinatory gas on all targets in front of them up to Far range. Targets must make an Instinct Reaction Roll or be tormented by fearful hallucinations. Targets whose fears are known to the Flickerfl y have disadvantage on this roll. Targets who fail lose 2 Hope and take <strong>3d8+3</strong> direct magic damage.</p><p>@Template[type:inFront|range:f]</p>",
"description": "<p>The Flickerfly breathes hallucinatory gas on all targets in front of them up to Far range. Targets must make an Instinct Reaction Roll or be tormented by fearful hallucinations. Targets whose fears are known to the Flickerfly have disadvantage on this roll. Targets who fail lose 2 Hope and take <strong>3d8+3</strong> direct magic damage.</p><p>@Template[type:inFront|range:f]</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
@ -711,6 +711,42 @@
"name": "Roll Save",
"img": "icons/magic/air/fog-gas-smoke-purple.webp",
"range": "far"
},
"lBhmLc33pcXzJHT3": {
"type": "countdown",
"_id": "lBhmLc33pcXzJHT3",
"systemPath": "actions",
"description": "<p><em>Countdown (Loop 1d6)</em>. When the Flickerfly takes damage for the first time, activate the countdown.</p>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "Hallucinatory Breath",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/air/fog-gas-smoke-purple.webp",
"progress": {
"looping": "looping",
"type": "actionRoll",
"max": "1d6",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/magic/air/fog-gas-smoke-purple.webp",
"range": ""
}
},
"originItemType": null,
@ -730,12 +766,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.4",
"createdTime": 1754122030308,
"modifiedTime": 1754122681022,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763599149242,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!G7jiltRjgvVhZewm.49cIxZRFiAM6jDva"
},

View file

@ -712,36 +712,14 @@
"name": "Your Life Is Mine",
"type": "feature",
"system": {
"description": "<p>Countdown (Loop 2d6). When the Necromancer has marked 6 or more of their HP, activate the countdown. When it triggers, deal <strong>2d10+6</strong> direct magic damage to a target within Close range. The Necromancer then <strong>clears a number of Stress or HP</strong> equal to the number of HP marked by the target from this attack.</p>",
"description": "<p><em>Countdown (Loop 2d6)</em>. When the Necromancer has marked 6 or more of their HP, activate the countdown. When it triggers, deal <strong>2d10+6</strong> direct magic damage to a target within Close range. The Necromancer then <strong>clears a number of Stress or HP</strong> equal to the number of HP marked by the target from this attack.</p>",
"resource": null,
"actions": {
"Gd70IsPckAFOw0ha": {
"type": "effect",
"_id": "Gd70IsPckAFOw0ha",
"systemPath": "actions",
"description": "<p><span style=\"color: rgb(239, 230, 216); font-family: Montserrat, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgba(24, 22, 46, 0.376); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none\">Countdown (Loop 2d6). When the Necromancer has marked 6 or more of their HP, activate the countdown.</span></p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null
},
"effects": [],
"target": {
"type": "any",
"amount": null
},
"name": "Countdown",
"img": "icons/magic/unholy/hand-claw-fire-green.webp",
"range": ""
},
"YzepYov9vEMcBPU1": {
"type": "damage",
"_id": "YzepYov9vEMcBPU1",
"systemPath": "actions",
"description": "<p>When the countdown triggers, deal <strong>2d10+6</strong> direct magic damage to a target within Close range. The Necromancer then <strong>clears a number of Stress or HP</strong> equal to the number of HP marked by the target from this attack.</p>",
"description": "<p>Deal <strong>2d10+6</strong> direct magic damage to a target within Close range. The Necromancer then <strong>clears a number of Stress or HP</strong> equal to the number of HP marked by the target from this attack.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
@ -789,6 +767,42 @@
"name": "Damage",
"img": "icons/magic/unholy/hand-claw-fire-green.webp",
"range": "close"
},
"LXhwkNCDFeUric8D": {
"type": "countdown",
"_id": "LXhwkNCDFeUric8D",
"systemPath": "actions",
"description": "<p><em>Countdown (Loop 2d6)</em>. When the Necromancer has marked 6 or more of their HP, activate the countdown.</p>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "reaction",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "Your Life Is Mine",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/unholy/hand-claw-fire-green.webp",
"progress": {
"looping": "looping",
"type": "actionRoll",
"max": "2d6",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/magic/unholy/hand-claw-fire-green.webp",
"range": ""
}
},
"originItemType": null,
@ -808,12 +822,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.4",
"createdTime": 1754132668836,
"modifiedTime": 1754135206850,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763599179169,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!WPEOIGfclNJxWb87.FKcuCo0v2U7fVkqq"
}

View file

@ -447,9 +447,72 @@
"name": "Blood and Souls",
"type": "feature",
"system": {
"description": "<p>Countdown (Loop 6). Activate the first time an attack is made within sight of the Demon. It ticks down when a PC takes a violent action. When it triggers, summon [[/r 1d4]]@UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demons}, who appear at Close range.</p>",
"description": "<p><em>Countdown (Loop 6)</em>. Activate the first time an attack is made within sight of the Demon. It ticks down when a PC takes a violent action. When it triggers, summon [[/r 1d4]]@UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demons}, who appear at Close range.</p>",
"resource": null,
"actions": {},
"actions": {
"szg3qA09aJUt9WKS": {
"type": "countdown",
"_id": "szg3qA09aJUt9WKS",
"systemPath": "actions",
"description": "<p><em>Countdown (Loop 6)</em>. Activate the first time an attack is made within sight of the Demon. It ticks down when a PC takes a violent action.</p>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "reaction",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "Blood and Souls",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/creatures/unholy/demon-fire-horned-clawed.webp",
"progress": {
"looping": "looping",
"type": "custom",
"max": "6",
"current": 1
},
"ownership": {}
}
],
"name": "Countdown",
"img": "icons/creatures/unholy/demon-fire-horned-clawed.webp",
"range": ""
},
"7G6uWlFEeOLsJIWY": {
"type": "effect",
"_id": "7G6uWlFEeOLsJIWY",
"systemPath": "actions",
"description": "<p>Summon [[/r 1d4]]@UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demons}, who appear at Close range.</p>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"effects": [],
"target": {
"type": "any",
"amount": null
},
"name": "Summon",
"img": "icons/creatures/unholy/demon-fire-horned-clawed.webp",
"range": ""
}
},
"originItemType": null,
"originId": null
},
@ -467,12 +530,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.3",
"createdTime": 1754126056313,
"modifiedTime": 1754126142902,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763488897395,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!5lphJAgzoqZI3VoG.2F75BO0xEU8Zlj7T"
}

View file

@ -287,12 +287,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"createdTime": 1754126247394,
"modifiedTime": 1755266380104,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1763488974350,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items.effects!tBWHW00epmMnkawe.gx22MpD8fWoi8klZ.qZfNiqw1iAIxeuYg"
}

View file

@ -493,31 +493,9 @@
"name": "Shackles of Guilt",
"type": "feature",
"system": {
"description": "<p>Countdown (Loop 2d6). When the Sorcerer is in the spotlight for the first time, activate the countdown. When it triggers, all targets within Far range become Vulnerable and must mark a Stress as they relive their greatest regrets. A target can break free from their regret with a successful Presence or Strength Roll. When a PC fails to break free, they lose a Hope.</p><p>@Template[type:emanation|range:f]</p>",
"description": "<p><em>Countdown (Loop 2d6)</em>. When the Sorcerer is in the spotlight for the first time, activate the countdown. When it triggers, all targets within Far range become Vulnerable and must mark a Stress as they relive their greatest regrets. A target can break free from their regret with a successful Presence or Strength Roll. When a PC fails to break free, they lose a Hope.</p><p>@Template[type:emanation|range:f]</p>",
"resource": null,
"actions": {
"11mqihmiBK41aoDm": {
"type": "effect",
"_id": "11mqihmiBK41aoDm",
"systemPath": "actions",
"description": "<p>Countdown (Loop 2d6). When the Sorcerer is in the spotlight for the first time, activate the countdown.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null
},
"effects": [],
"target": {
"type": "any",
"amount": null
},
"name": "Countdown",
"img": "icons/magic/unholy/strike-hand-glow-pink.webp",
"range": ""
},
"7b0FkpAnWz9a5EWx": {
"type": "damage",
"_id": "7b0FkpAnWz9a5EWx",
@ -574,6 +552,42 @@
"name": "Mark Stress",
"img": "icons/magic/unholy/strike-hand-glow-pink.webp",
"range": ""
},
"11PtfoxbgOXxNlkG": {
"type": "countdown",
"_id": "11PtfoxbgOXxNlkG",
"systemPath": "actions",
"description": "<p><em>Countdown (Loop 2d6)</em>. When the Sorcerer is in the spotlight for the first time, activate the countdown.</p>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "reaction",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "Shackles of Guilt",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/unholy/strike-hand-glow-pink.webp",
"progress": {
"looping": "looping",
"type": "actionRoll",
"max": "2d6",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/magic/unholy/strike-hand-glow-pink.webp",
"range": ""
}
},
"originItemType": null,
@ -640,12 +654,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.4",
"createdTime": 1754133847132,
"modifiedTime": 1754135342391,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763599235251,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!PELRry1vqjBzSAlr.gwSgBhkcekCGvXxz"
}

View file

@ -521,31 +521,9 @@
"name": "All-Consuming Rage",
"type": "feature",
"system": {
"description": "<p>Countdown (Decreasing 8). When the Realm-Breaker is in the spotlight for the first time, activate the countdown.</p><p>When it triggers, create a torrent of incarnate rage that rends flesh from bone. All targets within Far range must make a Presence Reaction Roll. Targets who fail take <strong>2d6+10</strong> direct magic damage. Targets who succeed take half damage. For each HP marked from this damage, summon a @UUID[Compendium.daggerheart.adversaries.Actor.OsLG2BjaEdTZUJU9]{Fallen Shock Troop} within Very Close range of the target who marked that HP. If the countdown ever decreases its maximum value to 0, the Realm-Breaker marks their remaining HP and all targets within Far range must mark all remaining HP and make a death move.</p><p>@Template[type:emanation|range:f]</p>",
"description": "<p><em>Countdown (Decreasing 8)</em>. When the Realm-Breaker is in the spotlight for the first time, activate the countdown. When it triggers, create a torrent of incarnate rage that rends flesh from bone. All targets within Far range must make a Presence Reaction Roll. Targets who fail take <strong>2d6+10</strong> direct magic damage. Targets who succeed take half damage. For each HP marked from this damage, summon a @UUID[Compendium.daggerheart.adversaries.Actor.OsLG2BjaEdTZUJU9]{Fallen Shock Troop} within Very Close range of the target who marked that HP. If the countdown ever decreases its maximum value to 0, the Realm-Breaker marks their remaining HP and all targets within Far range must mark all remaining HP and make a death move.</p><p>@Template[type:emanation|range:f]</p>",
"resource": null,
"actions": {
"58JxEuvnjaAlgs3E": {
"type": "effect",
"_id": "58JxEuvnjaAlgs3E",
"systemPath": "actions",
"description": "<p>Countdown (Decreasing 8). When the Realm-Breaker is in the spotlight for the first time, activate the countdown.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null
},
"effects": [],
"target": {
"type": "any",
"amount": null
},
"name": "Countdown",
"img": "icons/magic/control/fear-fright-monster-grin-red-orange.webp",
"range": ""
},
"rgy5wXyXJWh6uWxC": {
"type": "attack",
"_id": "rgy5wXyXJWh6uWxC",
@ -618,6 +596,42 @@
"name": "Roll Save",
"img": "icons/magic/control/fear-fright-monster-grin-red-orange.webp",
"range": "far"
},
"8e3BHmOFLvRwPbTW": {
"type": "countdown",
"_id": "8e3BHmOFLvRwPbTW",
"systemPath": "actions",
"description": "<p><em>Countdown (Decreasing 8)</em>. When the Realm-Breaker is in the spotlight for the first time, activate the countdown.</p>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "reaction",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "All-Consuming Rage",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/control/fear-fright-monster-grin-red-orange.webp",
"progress": {
"looping": "decreasing",
"type": "actionRoll",
"max": "8",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/magic/control/fear-fright-monster-grin-red-orange.webp",
"range": ""
}
},
"originItemType": null,
@ -637,12 +651,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.4",
"createdTime": 1754134694918,
"modifiedTime": 1754134968076,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763599267846,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!hxZ0sgoFJubh5aj6.48tIwFQr64IQ5LaY"
},

View file

@ -578,36 +578,14 @@
"name": "Circle of Defilement",
"type": "feature",
"system": {
"description": "<p>Countdown (1d8). When the Undefeated Champion is in the spotlight for the fi rst time, activate the countdown. When it triggers, activate a magical circle covering an area within Far range of the Champion. A target within that area is Vulnerable until they leave the circle. The circle can be removed by dealing Severe damage to the Undefeated Champion.</p>",
"description": "<p><em>Countdown (1d8)</em>. When the Undefeated Champion is in the spotlight for the first time, activate the countdown. When it triggers, activate a magical circle covering an area within Far range of the Champion. A target within that area is Vulnerable until they leave the circle. The circle can be removed by dealing Severe damage to the Undefeated Champion.</p>",
"resource": null,
"actions": {
"oRenRHpOIjRqYNUG": {
"type": "effect",
"_id": "oRenRHpOIjRqYNUG",
"systemPath": "actions",
"description": "<p>Countdown (1d8). When the Undefeated Champion is in the spotlight for the fi rst time, activate the countdown.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null
},
"effects": [],
"target": {
"type": "any",
"amount": null
},
"name": "Countdown",
"img": "icons/magic/unholy/barrier-fire-pink.webp",
"range": ""
},
"mHeYZ8e8MbkGz22d": {
"type": "effect",
"_id": "mHeYZ8e8MbkGz22d",
"systemPath": "actions",
"description": "<p>When the countdown triggers, activate a magical circle covering an area within Far range of the Champion. A target within that area is Vulnerable until they leave the circle. The circle can be removed by dealing Severe damage to the Undefeated Champion.</p>",
"description": "<p>Activate a magical circle covering an area within Far range of the Champion. A target within that area is Vulnerable until they leave the circle. The circle can be removed by dealing Severe damage to the Undefeated Champion.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
@ -629,6 +607,42 @@
"name": "Circle",
"img": "icons/magic/unholy/barrier-fire-pink.webp",
"range": ""
},
"4x13WyksHU0u0j20": {
"type": "countdown",
"_id": "4x13WyksHU0u0j20",
"systemPath": "actions",
"description": "<p><em>Countdown (1d8)</em>. When the Undefeated Champion is in the spotlight for the first time, activate the countdown.</p>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "reaction",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "Circle of Defilement",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/unholy/barrier-fire-pink.webp",
"progress": {
"looping": "noLooping",
"type": "actionRoll",
"max": "1d8",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/magic/unholy/barrier-fire-pink.webp",
"range": ""
}
},
"originItemType": null,
@ -695,12 +709,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.4",
"createdTime": 1754135646248,
"modifiedTime": 1754135780879,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763599314892,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!RXkZTwBRi4dJ3JE5.55P7ZijSbQeVHCw4"
},

View file

@ -596,6 +596,42 @@
"name": "Spend Fear",
"img": "icons/magic/earth/strike-body-stone-crumble.webp",
"range": ""
},
"ywZTs3D8ClT7tAsa": {
"type": "countdown",
"_id": "ywZTs3D8ClT7tAsa",
"systemPath": "actions",
"description": "<p>On a failure, they begin to turn to stone, marking a HP and starting a Petrification Countdown (4). This countdown ticks down when the Gorgon is attacked. When it triggers, the target must make a death move. If the Gorgon is defeated, all petrification countdowns end.</p>",
"chatDisplay": false,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "Petrifying Gaze",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/earth/strike-body-stone-crumble.webp",
"progress": {
"looping": "noLooping",
"type": "custom",
"max": "4",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/magic/earth/strike-body-stone-crumble.webp",
"range": ""
}
},
"originItemType": null,
@ -615,12 +651,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.3",
"createdTime": 1754079643285,
"modifiedTime": 1754142680813,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763488245078,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!8mJYMpbLTb8qIOrr.047o6OtNlUwLG1H1"
},

View file

@ -332,9 +332,46 @@
"_id": "YeJ7eJVCKsRxG8mk",
"img": "icons/skills/ranged/target-bullseye-arrow-blue.webp",
"system": {
"description": "<p>Countdown (5). When the Head Guard is in the spotlight for the first time, activate the countdown. It ticks down when a PC makes an attack roll. When it triggers, all Archer Guards within Far range make a standard attack with advantage against the nearest target within their range. If any attacks succeed on the same target, combine their damage.</p><p>@Template[type:emanation|range:f]</p>",
"description": "<p><em>Countdown (5)</em>. When the Head Guard is in the spotlight for the first time, activate the countdown. It ticks down when a PC makes an attack roll. When it triggers, all Archer Guards within Far range make a standard attack with advantage against the nearest target within their range. If any attacks succeed on the same target, combine their damage.</p><p>@Template[type:emanation|range:f]</p>",
"resource": null,
"actions": {},
"actions": {
"xyhaCmPGiVMsTViH": {
"type": "countdown",
"_id": "xyhaCmPGiVMsTViH",
"systemPath": "actions",
"description": "<p><em>Countdown (5)</em>. When the Head Guard is in the spotlight for the first time, activate the countdown. It ticks down when a PC makes an attack roll. When it triggers, all Archer Guards within Far range make a standard attack with advantage against the nearest target within their range. If any attacks succeed on the same target, combine their damage.</p>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "reaction",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "On My Signal",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/skills/ranged/target-bullseye-arrow-blue.webp",
"progress": {
"looping": "noLooping",
"type": "characterAttack",
"max": "5",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/skills/ranged/target-bullseye-arrow-blue.webp",
"range": ""
}
},
"originItemType": null,
"subType": null,
"originId": null
@ -351,12 +388,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.350",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "1.1.2",
"systemVersion": "1.2.3",
"createdTime": 1754048119625,
"modifiedTime": 1760209562267,
"lastModifiedBy": "fBcTgyTzoARBvohY"
"modifiedTime": 1763487870613,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!mK3A5FTx6k8iPU3F.YeJ7eJVCKsRxG8mk"
},

View file

@ -514,14 +514,14 @@
"name": "Hallucinatory Breath",
"type": "feature",
"system": {
"description": "<p>Countdown (Loop 1d6). When the Flickerfl y takes damage for the fi rst time, activate the countdown. When it triggers, the Flickerfly breathes hallucinatory gas on all targets in front of them up to Far range. Targets must succeed on an Instinct Reaction Roll or be tormented by fearful hallucinations. Targets whose fears are known to the Flickerfl y have disadvantage on this roll. Targets who fail must mark a Stress and lose a Hope.</p><p>@Template[type:inFront|range:f]</p>",
"description": "<p>Countdown (Loop 1d6). When the Flickerfly takes damage for the first time, activate the countdown. When it triggers, the Flickerfly breathes hallucinatory gas on all targets in front of them up to Far range. Targets must succeed on an Instinct Reaction Roll or be tormented by fearful hallucinations. Targets whose fears are known to the Flickerfly have disadvantage on this roll. Targets who fail must mark a Stress and lose a Hope.</p><p>@Template[type:inFront|range:f]</p>",
"resource": null,
"actions": {
"USEkCakSzYcZbBwY": {
"type": "attack",
"_id": "USEkCakSzYcZbBwY",
"systemPath": "actions",
"description": "<p>Countdown (Loop 1d6). When the Flickerfl y takes damage for the fi rst time, activate the countdown. When it triggers, the Flickerfly breathes hallucinatory gas on all targets in front of them up to Far range. Targets must succeed on an Instinct Reaction Roll or be tormented by fearful hallucinations. Targets whose fears are known to the Flickerfl y have disadvantage on this roll. Targets who fail must mark a Stress and lose a Hope.</p><p>@Template[type:inFront|range:f]</p>",
"description": "<p>The Flickerfly breathes hallucinatory gas on all targets in front of them up to Far range. Targets must succeed on an Instinct Reaction Roll or be tormented by fearful hallucinations. Targets whose fears are known to the Flickerfl y have disadvantage on this roll. Targets who fail must mark a Stress and lose a Hope.</p><p>@Template[type:inFront|range:f]</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
@ -613,6 +613,42 @@
"name": "Roll Save",
"img": "icons/magic/air/fog-gas-smoke-purple.webp",
"range": "far"
},
"n8ZuLjwTf2FJ7V6n": {
"type": "countdown",
"_id": "n8ZuLjwTf2FJ7V6n",
"systemPath": "actions",
"description": "<p>Countdown (Loop 1d6). When the Flickerfly takes damage for the first time, activate the countdown.</p>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "Hallucinatory Breath",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/air/fog-gas-smoke-purple.webp",
"progress": {
"looping": "looping",
"type": "actionRoll",
"max": "1d6",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/magic/air/fog-gas-smoke-purple.webp",
"range": ""
}
},
"originItemType": null,
@ -632,12 +668,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.4",
"createdTime": 1754080402680,
"modifiedTime": 1754142717997,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763599059605,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!MYXmTx2FHcIjdfYZ.EjfM83eVCdcVGC3c"
}

View file

@ -338,35 +338,124 @@
"name": "Casus Belli",
"type": "feature",
"system": {
"description": "<p>Long-Term Countdown (8). <strong>Spend a Fear</strong> to activate after the Monarchs desire for war is first revealed. When it triggers, the Monarch has a reason to rally the nation to war and the support to act on that reason. You gain [[/r 1d4]]<strong> </strong>Fear.</p>",
"description": "<p><em>Long-Term Countdown (8)</em>. <strong>Spend a Fear</strong> to activate after the Monarchs desire for war is first revealed. When it triggers, the Monarch has a reason to rally the nation to war and the support to act on that reason. You gain [[/r 1d4]]<strong> </strong>Fear.</p>",
"resource": null,
"actions": {
"X01RPfbvh3DUWcQY": {
"type": "effect",
"_id": "X01RPfbvh3DUWcQY",
"CNEOOdPI4xVJ2JeP": {
"type": "countdown",
"_id": "CNEOOdPI4xVJ2JeP",
"systemPath": "actions",
"description": "",
"description": "<p><em>Long-Term Countdown (8)</em>. <strong>Spend a Fear</strong> to activate after the Monarchs desire for war is first revealed.</p>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [
{
"scalable": false,
"key": "fear",
"value": 1,
"step": null
"itemId": null,
"step": null,
"consumeOnSuccess": false
}
],
"uses": {
"value": null,
"max": "",
"recovery": null
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "Casus Belli",
"type": "narrative",
"defaultOwnership": -1,
"img": "icons/sundries/scrolls/scroll-bound-sealed-red-tan.webp",
"progress": {
"looping": "noLooping",
"type": "custom",
"max": "8",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/sundries/scrolls/scroll-bound-sealed-red-tan.webp",
"range": ""
},
"QnZoH9LjJvKl5YcF": {
"type": "healing",
"_id": "QnZoH9LjJvKl5YcF",
"systemPath": "actions",
"description": "<p><span style=\"color: rgb(239, 230, 216); font-family: Montserrat, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgba(24, 22, 46, 0.565); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none\">The Monarch has a reason to rally the nation to war and the support to act on that reason. You gain </span><span class=\"inline-roll roll\" data-mode=\"roll\" data-flavor=\"\" data-formula=\"1d4\" data-tooltip-text=\"1d4\" style=\"box-sizing: border-box; cursor: pointer; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(11, 10, 19, 0.9); border-color: rgb(129, 107, 102); border-style: solid; border-width: 0.8px; border-image: none 100% / 1 / 0 stretch; border-radius: 2px; color: rgb(239, 230, 216); margin: -1px 0px; padding: 1px 4px 0px; white-space: nowrap; word-break: break-all; scrollbar-width: thin; scrollbar-color: rgb(93, 20, 43) rgba(0, 0, 0, 0); font-family: Montserrat, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial\">1d4</span><span style=\"box-sizing: border-box; scrollbar-width: thin; scrollbar-color: rgb(93, 20, 43) rgba(0, 0, 0, 0); color: rgb(239, 230, 216); font-family: Montserrat, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgba(24, 22, 46, 0.565); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial\"> </span><span style=\"color: rgb(239, 230, 216); font-family: Montserrat, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgba(24, 22, 46, 0.565); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none\">Fear.</span></p>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"damage": {
"parts": [
{
"value": {
"custom": {
"enabled": false,
"formula": ""
},
"flatMultiplier": 1,
"dice": "d4",
"bonus": null,
"multiplier": "flat"
},
"applyTo": "fear",
"base": false,
"resultBased": false,
"valueAlt": {
"multiplier": "prof",
"flatMultiplier": 1,
"dice": "d6",
"bonus": null,
"custom": {
"enabled": false,
"formula": ""
}
},
"type": []
}
],
"includeBase": false,
"direct": false
},
"effects": [],
"target": {
"type": "any",
"amount": null
},
"name": "Spend Fear",
"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
},
"name": "Gain Fear",
"img": "icons/sundries/scrolls/scroll-bound-sealed-red-tan.webp",
"range": ""
}
@ -388,12 +477,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.3",
"createdTime": 1754130006163,
"modifiedTime": 1754130085276,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763489308958,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!yx0vK2yfNVZKWUUi.kA5NZTdiknsh7wxp"
}

View file

@ -523,36 +523,14 @@
"name": "Rampage",
"type": "feature",
"system": {
"description": "<p>Countdown (Loop 1d6). When the Hunter is in the spotlight for the fi rst time, activate the countdown. When it triggers, move the Hunter in a straight line to a point within Far range and make an attack against all targets in their path. Targets the Hunter succeeds against take <strong>2d8+2</strong> physical damage.</p><p>@Template[type:ray|range:f]</p>",
"description": "<p><em>Countdown (Loop 1d6)</em>. When the Hunter is in the spotlight for the first time, activate the countdown. When it triggers, move the Hunter in a straight line to a point within Far range and make an attack against all targets in their path. Targets the Hunter succeeds against take <strong>2d8+2</strong> physical damage.</p><p>@Template[type:ray|range:f]</p>",
"resource": null,
"actions": {
"JGGTfZWI65nywjSu": {
"type": "effect",
"_id": "JGGTfZWI65nywjSu",
"systemPath": "actions",
"description": "<p>Countdown (Loop 1d6). When the Hunter is in the spotlight for the first time, activate the countdown.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null
},
"effects": [],
"target": {
"type": "any",
"amount": null
},
"name": "Countdown",
"img": "icons/magic/movement/trail-streak-zigzag-yellow.webp",
"range": ""
},
"VjiFxuzfAaq5N1jy": {
"type": "attack",
"_id": "VjiFxuzfAaq5N1jy",
"systemPath": "actions",
"description": "<p>When the countdown triggers, move the Hunter in a straight line to a point within Far range and make an attack against all targets in their path. Targets the Hunter succeeds against take <strong>2d8+2</strong> physical damage.</p><p>@Template[type:ray|range:f]</p>",
"description": "<p>Move the Hunter in a straight line to a point within Far range and make an attack against all targets in their path. Targets the Hunter succeeds against take <strong>2d8+2</strong> physical damage.</p><p>@Template[type:ray|range:f]</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
@ -620,6 +598,42 @@
"name": "Attack",
"img": "icons/magic/movement/trail-streak-zigzag-yellow.webp",
"range": "far"
},
"BhA3vxCuMs4UbbQU": {
"type": "countdown",
"_id": "BhA3vxCuMs4UbbQU",
"systemPath": "actions",
"description": "<p><em>Countdown (Loop 1d6)</em>. When the Hunter is in the spotlight for the first time, activate the countdown.</p>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "Rampage",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/movement/trail-streak-zigzag-yellow.webp",
"progress": {
"looping": "looping",
"type": "actionRoll",
"max": "1d6",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/magic/movement/trail-streak-zigzag-yellow.webp",
"range": ""
}
},
"originItemType": null,
@ -639,12 +653,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.4",
"createdTime": 1754082669471,
"modifiedTime": 1754142979339,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763599508803,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!mVV7a7KQAORoPMgZ.IOCG3J20wUHvyvvh"
}

View file

@ -437,36 +437,14 @@
"name": "Summoning Ritual",
"type": "feature",
"system": {
"description": "<p>Countdown (6). When the Secret-Keeper is in the spotlight for the first time, activate the countdown. When they mark HP, tick down this countdown by the number of HP marked. When it triggers, summon a @UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demon} who appears at Close range.</p>",
"description": "<p><em>Countdown (6)</em>. When the Secret-Keeper is in the spotlight for the first time, activate the countdown. When they mark HP, tick down this countdown by the number of HP marked. When it triggers, summon a @UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demon} who appears at Close range.</p>",
"resource": null,
"actions": {
"PrShdg9N3MfeZaJc": {
"type": "effect",
"_id": "PrShdg9N3MfeZaJc",
"systemPath": "actions",
"description": "<p>Countdown (6). When the Secret-Keeper is in the spotlight for the first time, activate the countdown. When they mark HP, tick down this countdown by the number of HP marked.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null
},
"effects": [],
"target": {
"type": "any",
"amount": null
},
"name": "Countdown",
"img": "icons/magic/unholy/silhouette-light-fire-blue.webp",
"range": ""
},
"0rixG6jLRynAYNqA": {
"type": "effect",
"_id": "0rixG6jLRynAYNqA",
"systemPath": "actions",
"description": "<p>When the countdown triggers, summon a @UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demon} who appears at Close range.</p>",
"description": "<p>Summon a @UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demon} who appears at Close range.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
@ -483,6 +461,42 @@
"name": "Summon",
"img": "icons/magic/unholy/silhouette-light-fire-blue.webp",
"range": "close"
},
"ZVXHY2fpomoKV7jG": {
"type": "countdown",
"_id": "ZVXHY2fpomoKV7jG",
"systemPath": "actions",
"description": "<p><em>Countdown (6)</em>. When the Secret-Keeper is in the spotlight for the first time, activate the countdown.</p>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "reaction",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "Summoning Ritual",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/unholy/silhouette-light-fire-blue.webp",
"progress": {
"looping": "noLooping",
"type": "custom",
"max": "6",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/magic/unholy/silhouette-light-fire-blue.webp",
"range": ""
}
},
"originItemType": null,
@ -502,12 +516,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.3",
"createdTime": 1754083223957,
"modifiedTime": 1754143099523,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763488650855,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!sLAccjvCWfeedbpI.4L7aM9NDLbjvuwI3"
},

View file

@ -516,6 +516,42 @@
"name": "Roll Save",
"img": "icons/magic/sonic/projectile-sound-rings-wave.webp",
"range": "close"
},
"UurIzyyMRAJc2DUX": {
"type": "countdown",
"_id": "UurIzyyMRAJc2DUX",
"systemPath": "actions",
"description": "<p>The rubble can be cleared with a <em>Progress Countdown (8)</em>.</p>",
"chatDisplay": false,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "Avalanche Roar",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/sonic/projectile-sound-rings-wave.webp",
"progress": {
"looping": "noLooping",
"type": "custom",
"max": "8",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/magic/sonic/projectile-sound-rings-wave.webp",
"range": ""
}
},
"originItemType": null,
@ -535,12 +571,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.350",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.4",
"createdTime": 1754085059319,
"modifiedTime": 1761503879335,
"lastModifiedBy": "fBcTgyTzoARBvohY"
"modifiedTime": 1763599582935,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!3aAS2Qm3R6cgaYfE.9Z0i0uURfBMVIapJ"
},

View file

@ -746,31 +746,9 @@
"name": "Apocalyptic Thrasing",
"type": "feature",
"system": {
"description": "<p>Countdown (1d12). <strong>Spend a Fear</strong> to activate. It ticks down when a PC rolls with Fear.</p><p>When it triggers, the Ashen Tyrant thrashes about, causing environmental damage (such as an earthquake, avalanche, or collapsing walls). All targets within Far range must make a Strength Reaction Roll. Targets who fail take 2d10+10 physical damage and are Restrained by the rubble until they break free with a successful Strength Roll. Targets who succeed take half damage. If the Ashen Tyrant is defeated while this countdown is active, trigger the countdown immediately as the destruction caused by their death throes.</p><p>@Template[type:emanation|range:f]</p>",
"description": "<p><em>Countdown (1d12)</em>. <strong>Spend a Fear</strong> to activate. It ticks down when a PC rolls with Fear. When it triggers, the Ashen Tyrant thrashes about, causing environmental damage (such as an earthquake, avalanche, or collapsing walls). All targets within Far range must make a Strength Reaction Roll. Targets who fail take 2d10+10 physical damage and are Restrained by the rubble until they break free with a successful Strength Roll. Targets who succeed take half damage. If the Ashen Tyrant is defeated while this countdown is active, trigger the countdown immediately as the destruction caused by their death throes.</p><p>@Template[type:emanation|range:f]</p>",
"resource": null,
"actions": {
"V6gTCvCcUXf3oKwF": {
"type": "effect",
"_id": "V6gTCvCcUXf3oKwF",
"systemPath": "actions",
"description": "<p>Countdown (1d12). <strong>Spend a Fear</strong> to activate. It ticks down when a PC rolls with Fear. </p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null
},
"effects": [],
"target": {
"type": "any",
"amount": null
},
"name": "Countdown",
"img": "icons/creatures/abilities/mouth-teeth-fire-orange.webp",
"range": ""
},
"OznXxmwiPwzuFPQZ": {
"type": "attack",
"_id": "OznXxmwiPwzuFPQZ",
@ -848,6 +826,51 @@
"name": "Roll Save",
"img": "icons/creatures/abilities/mouth-teeth-fire-orange.webp",
"range": ""
},
"rZ7IwBnDzw7VmBT6": {
"type": "countdown",
"_id": "rZ7IwBnDzw7VmBT6",
"systemPath": "actions",
"description": "<p><em>Countdown (1d12)</em>. <strong>Spend a Fear</strong> to activate. It ticks down when a PC rolls with Fear.</p>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [
{
"scalable": false,
"key": "fear",
"value": 1,
"itemId": null,
"step": null,
"consumeOnSuccess": false
}
],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "Apocalyptic Thrasing",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/creatures/abilities/mouth-teeth-fire-orange.webp",
"progress": {
"looping": "noLooping",
"type": "fear",
"max": "1d12",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/creatures/abilities/mouth-teeth-fire-orange.webp",
"range": ""
}
},
"originItemType": null,
@ -914,12 +937,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.4",
"createdTime": 1754140011482,
"modifiedTime": 1754140152923,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763601068928,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!pMuXGCSOQaxpi5tb.uWiyaJPXcoW06pOM"
}

View file

@ -36,6 +36,42 @@
"name": "Cast",
"img": "icons/skills/social/diplomacy-unity-alliance.webp",
"range": "close"
},
"ZM96wFu3YuAeUXel": {
"type": "countdown",
"_id": "ZM96wFu3YuAeUXel",
"systemPath": "actions",
"description": "<p>Activate a <em>Countdown (8)</em>. It ticks down as a consequence the GM chooses. When it triggers, the disguise drops.</p>",
"chatDisplay": false,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "Mass Disguise",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/time/hourglass-brown-orange.webp",
"progress": {
"looping": "noLooping",
"type": "custom",
"max": "8",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/magic/time/hourglass-brown-orange.webp",
"range": ""
}
},
"attribution": {
@ -49,12 +85,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.347",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.2.4",
"createdTime": 1753922784480,
"modifiedTime": 1755429370519,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1763599737574,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_id": "dT95m0Jam8sWbeuC",
"sort": 3400000,

View file

@ -463,36 +463,14 @@
"name": "Choking Ash",
"type": "feature",
"system": {
"description": "<p>Countdown (Loop 6). When the PCs enter the Burning Heart of the Woods, activate the countdown. When it triggers, all characters must make a Strength or Instinct Reaction Roll. Targets who fail take <strong>4d6+5</strong> direct physical damage. Targets who succeed take half damage. Protective masks or clothes give advantage on the reaction roll. </p><section id=\"secret-qQq9TrwyjdayheMk\" class=\"secret\"><p><em>What hallucinations does the ash induce? What incongruous taste does it possess?</em></p></section>",
"description": "<p><em>Countdown (Loop 6)</em>. When the PCs enter the Burning Heart of the Woods, activate the countdown. When it triggers, all characters must make a Strength or Instinct Reaction Roll. Targets who fail take <strong>4d6+5</strong> direct physical damage. Targets who succeed take half damage. Protective masks or clothes give advantage on the reaction roll.</p><section class=\"secret\" id=\"secret-qQq9TrwyjdayheMk\"><p><em>What hallucinations does the ash induce? What incongruous taste does it possess?</em></p></section>",
"resource": null,
"actions": {
"U9O0nh0LkdKzjIXS": {
"type": "effect",
"_id": "U9O0nh0LkdKzjIXS",
"systemPath": "actions",
"description": "<p>Countdown (Loop 6). When the PCs enter the Burning Heart of the Woods, activate the countdown.</p><section class=\"secret\" id=\"secret-szFYk9lUNPPVUeUU\"><p><em>What hallucinations does the ash induce? What incongruous taste does it possess?</em></p></section>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null
},
"effects": [],
"target": {
"type": "any",
"amount": null
},
"name": "Countdown",
"img": "icons/magic/air/fog-gas-smoke-brown.webp",
"range": ""
},
"4XVdHOzycOXM5bh9": {
"type": "damage",
"_id": "4XVdHOzycOXM5bh9",
"systemPath": "actions",
"description": "<p>When the countdown triggers, all characters must make a Strength or Instinct Reaction Roll. Targets who fail take <strong>4d6+5</strong> direct physical damage. Targets who succeed take half damage. Protective masks or clothes give advantage on the reaction roll. </p><section class=\"secret\" id=\"secret-pf0x4kYIYL4CathW\"><p><em>What hallucinations does the ash induce? What incongruous taste does it possess?</em></p></section>",
"description": "<p>All characters must make a Strength or Instinct Reaction Roll. Targets who fail take <strong>4d6+5</strong> direct physical damage. Targets who succeed take half damage. Protective masks or clothes give advantage on the reaction roll.</p><section class=\"secret\" id=\"secret-pf0x4kYIYL4CathW\"><p><em>What hallucinations does the ash induce? What incongruous taste does it possess?</em></p></section>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
@ -540,6 +518,42 @@
"name": "Damage",
"img": "icons/magic/air/fog-gas-smoke-brown.webp",
"range": ""
},
"3L0T97ZzTqZU6BE6": {
"type": "countdown",
"_id": "3L0T97ZzTqZU6BE6",
"systemPath": "actions",
"description": "<p><em>Countdown (Loop 6)</em>. When the PCs enter the Burning Heart of the Woods, activate the countdown.</p>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "reaction",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "Choking Ash",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/air/fog-gas-smoke-brown.webp",
"progress": {
"looping": "looping",
"type": "actionRoll",
"max": "6",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/magic/air/fog-gas-smoke-brown.webp",
"range": ""
}
},
"originItemType": null,
@ -559,12 +573,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.4",
"createdTime": 1754217910442,
"modifiedTime": 1754217995895,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763599784561,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!oY69NN4rYxoRE4hl.kYxuTZjH7HDUGeWh"
}

View file

@ -216,7 +216,7 @@
"name": "Sticky Fingers",
"type": "feature",
"system": {
"description": "<p>A thief tries to steal something from a PC. The PC must succeed on an Instinct Roll to notice the thief or lose an item of the GMs choice as the thief escapes to a Close distance. To retrieve the stolen item, the PCs must complete a Progress Countdown (6) to chase down the thief before the thief completes a Consequence Countdown (4) and escapes to their hideout.</p><section id=\"secret-UHBqg2AqmIAxgB15\" class=\"secret\"><p><em>What drove this person to pickpocketing? Where is the thiefs hideout and how has it avoided notice?</em></p></section>",
"description": "<p>A thief tries to steal something from a PC. The PC must succeed on an Instinct Roll to notice the thief or lose an item of the GMs choice as the thief escapes to a Close distance. To retrieve the stolen item, the PCs must complete a <em>Progress Countdown (6)</em> to chase down the thief before the thief completes a <em>Consequence Countdown (4)</em> and escapes to their hideout.</p><section class=\"secret\" id=\"secret-UHBqg2AqmIAxgB15\"><p><em>What drove this person to pickpocketing? Where is the thiefs hideout and how has it avoided notice?</em></p></section>",
"resource": null,
"actions": {
"GMy6OcMQnNJDDmtV": {
@ -265,26 +265,53 @@
"img": "icons/skills/social/theft-pickpocket-bribery-brown.webp",
"range": ""
},
"0V36HDEb9gpLubGL": {
"type": "effect",
"_id": "0V36HDEb9gpLubGL",
"L2TFexCvxvuCOCXe": {
"type": "countdown",
"_id": "L2TFexCvxvuCOCXe",
"systemPath": "actions",
"description": "<p>To retrieve the stolen item, the PCs must complete a Progress Countdown (6) to chase down the thief before the thief completes a Consequence Countdown (4) and escapes to their hideout.</p>",
"chatDisplay": true,
"description": "",
"chatDisplay": false,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null
"recovery": null,
"consumeOnSuccess": false
},
"effects": [],
"target": {
"type": "any",
"amount": null
"countdown": [
{
"name": "Chase Thief",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/skills/movement/feet-winged-boots-brown.webp",
"progress": {
"looping": "noLooping",
"type": "custom",
"max": "6",
"current": 1
},
"name": "Countdowns",
"img": "icons/magic/time/hourglass-tilted-glowing-gold.webp",
"ownership": {}
},
{
"name": "Escape To Hideout",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/perception/silhouette-stealth-shadow.webp",
"progress": {
"looping": "noLooping",
"type": "custom",
"max": "4",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdowns",
"img": "icons/skills/social/theft-pickpocket-bribery-brown.webp",
"range": ""
}
},
@ -305,12 +332,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.3",
"createdTime": 1754211683813,
"modifiedTime": 1754211879643,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763493014349,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!HZKA7hkej7JJY503.56qjiKMoN6S9riI6"
},

View file

@ -187,36 +187,14 @@
"name": "Siege Weapons (Environment Change)",
"type": "feature",
"system": {
"description": "<p>Consequence Countdown (6). The attacking force deploys siege weapons to try to raze the defenders fortifi cations. Activate the countdown when the siege begins (for a protracted siege, make this a long-term countdown instead). When it triggers, the defenders fortifi cations have been breached and the attackers fl ood inside. You gain 2 Fear, then shift to the Pitched Battle environment and spotlight it. </p><section id=\"secret-P5oJplxVBVJGtggb\" class=\"secret\"><p><em>What siege weapons are being deployed? Are they magical mundane or a mixture of both? What defenses must the characters overcome to storm the castle?</em></p></section>",
"description": "<p><em>Consequence Countdown (6)</em>. The attacking force deploys siege weapons to try to raze the defenders fortifi cations. Activate the countdown when the siege begins (for a protracted siege, make this a long-term countdown instead). When it triggers, the defenders fortifications have been breached and the attackers fl ood inside. You gain 2 Fear, then shift to the Pitched Battle environment and spotlight it.</p><section class=\"secret\" id=\"secret-P5oJplxVBVJGtggb\"><p><em>What siege weapons are being deployed? Are they magical mundane or a mixture of both? What defenses must the characters overcome to storm the castle?</em></p></section>",
"resource": null,
"actions": {
"F89TDp557TJ1vvgm": {
"type": "effect",
"_id": "F89TDp557TJ1vvgm",
"systemPath": "actions",
"description": "<p>Consequence Countdown (6). The attacking force deploys siege weapons to try to raze the defenders fortifi cations. Activate the countdown when the siege begins (for a protracted siege, make this a long-term countdown instead).</p><section class=\"secret\" id=\"secret-rgITC5rHTbEfm5Q2\"><p><em>What siege weapons are being deployed? Are they magical mundane or a mixture of both? What defenses must the characters overcome to storm the castle?</em></p></section>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null
},
"effects": [],
"target": {
"type": "any",
"amount": null
},
"name": "Countdown",
"img": "icons/weapons/artillery/catapult-simple.webp",
"range": ""
},
"TGWI1Kvw4ZEP3QEo": {
"type": "healing",
"_id": "TGWI1Kvw4ZEP3QEo",
"systemPath": "actions",
"description": "<p>When the cooldown triggers, the defenders fortifications have been breached and the attackers flood inside. You gain 2 Fear, then shift to the Pitched Battle environment and spotlight it.</p>",
"description": "<p>The defenders fortifications have been breached and the attackers flood inside. You gain 2 Fear, then shift to the Pitched Battle environment and spotlight it.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
@ -278,6 +256,42 @@
"name": "Gain Fear",
"img": "icons/weapons/artillery/catapult-simple.webp",
"range": ""
},
"udKS3ME8VKuayEyO": {
"type": "countdown",
"_id": "udKS3ME8VKuayEyO",
"systemPath": "actions",
"description": "<p><em>Consequence Countdown (6)</em>. The attacking force deploys siege weapons to try to raze the defenders fortifications. Activate the countdown when the siege begins (for a protracted siege, make this a long-term countdown instead). </p>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "reaction",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "Siege Weapons (Environment Change)",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/weapons/artillery/catapult-simple.webp",
"progress": {
"looping": "noLooping",
"type": "custom",
"max": "6",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/weapons/artillery/catapult-simple.webp",
"range": ""
}
},
"originItemType": null,
@ -297,12 +311,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.3",
"createdTime": 1754218202018,
"modifiedTime": 1754218357097,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763493953316,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!1eZ32Esq7rfZOjlu.eSTq8Y0v4Dwd13XU"
},

View file

@ -144,7 +144,7 @@
"name": "Impossible Architecture",
"type": "feature",
"system": {
"description": "<p>Up is down, down is right, right is starward. Gravity and directionality themselves are in fl ux, and any attempt to move through this realm is an odyssey unto itself, requiring a Progress Countdown (8). On a failure, a PC must mark a Stress in addition to the rolls other consequences. </p><section id=\"secret-j76pJfYX7Cbt61Pq\" class=\"secret\"><p><em>What does it feel like to move in a space so alien to the Mortal Realm? What landmark or point do you fi xate on to maintain your balance? What bizarre landmarks do you traverse on your journey?</em></p></section>",
"description": "<p>Up is down, down is right, right is starward. Gravity and directionality themselves are in flux, and any attempt to move through this realm is an odyssey unto itself, requiring a <em>Progress Countdown (8)</em>. On a failure, a PC must mark a Stress in addition to the rolls other consequences.</p><section class=\"secret\" id=\"secret-j76pJfYX7Cbt61Pq\"><p><em>What does it feel like to move in a space so alien to the Mortal Realm? What landmark or point do you fixate on to maintain your balance? What bizarre landmarks do you traverse on your journey?</em></p></section>",
"resource": null,
"actions": {
"hli84bleKqYoU7YL": {
@ -198,6 +198,42 @@
"name": "Mark Stress",
"img": "icons/magic/symbols/squares-3d-green.webp",
"range": ""
},
"uZgtjZJVCedm93aJ": {
"type": "countdown",
"_id": "uZgtjZJVCedm93aJ",
"systemPath": "actions",
"description": "<p>Up is down, down is right, right is starward. Gravity and directionality themselves are in flux, and any attempt to move through this realm is an odyssey unto itself, requiring a <em>Progress Countdown (8)</em>.</p><section class=\"secret\" id=\"secret-rsf1tT4N3HBDgKna\"><p><em>What does it feel like to move in a space so alien to the Mortal Realm? What landmark or point do you fixate on to maintain your balance? What bizarre landmarks do you traverse on your journey?</em></p></section>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "passive",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "Impossible Architecture",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/symbols/squares-3d-green.webp",
"progress": {
"looping": "noLooping",
"type": "custom",
"max": "8",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/magic/symbols/squares-3d-green.webp",
"range": ""
}
},
"originItemType": null,
@ -217,12 +253,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.3",
"createdTime": 1754219060775,
"modifiedTime": 1754219140788,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763494069315,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!2Z1mKc65LxNk2PqR.yXCBy1MQuh5GwH5Q"
},
@ -230,60 +266,14 @@
"name": "Everything You Are This Place Will Take from You",
"type": "feature",
"system": {
"description": "<p>Countdown (Loop 1d4). Activate the countdown. When it triggers, all PCs must succeed on a Presence Reaction Roll or their highest trait is temporarily reduced by [[/r 1d4]] unless they mark a number of Stress equal to its value. Any lost trait points are regained if the PC critically succeeds or escapes the Chaos Realm. </p><section id=\"secret-uG9quQrfVqBYix6p\" class=\"secret\"><p><em>How does this place try to steal from you that which makes you legendary? What does it feel like to have this power taken from you?</em></p></section>",
"description": "<p><em>Countdown (Loop 1d4)</em>. Activate the countdown. When it triggers, all PCs must succeed on a Presence Reaction Roll or their highest trait is temporarily reduced by [[/r 1d4]] unless they mark a number of Stress equal to its value. Any lost trait points are regained if the PC critically succeeds or escapes the Chaos Realm.</p><section class=\"secret\" id=\"secret-uG9quQrfVqBYix6p\"><p><em>How does this place try to steal from you that which makes you legendary? What does it feel like to have this power taken from you?</em></p></section>",
"resource": null,
"actions": {
"IexEUqnefrcD0VCz": {
"type": "attack",
"_id": "IexEUqnefrcD0VCz",
"systemPath": "actions",
"description": "<p>Countdown (Loop 1d4). Activate the countdown.</p><section class=\"secret\" id=\"secret-dFnoVgNh7bMpAQF1\"><p><em>How does this place try to steal from you that which makes you legendary? What does it feel like to have this power taken from you?</em></p></section>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null
},
"damage": {
"parts": [],
"includeBase": false
},
"target": {
"type": "any",
"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": "Countdown",
"img": "icons/magic/control/sihouette-hold-beam-green.webp",
"range": ""
},
"zOQMo13vSiX3QReJ": {
"type": "attack",
"_id": "zOQMo13vSiX3QReJ",
"systemPath": "actions",
"description": "<p>When the countdown triggers, all PCs must succeed on a Presence Reaction Roll or their highest trait is temporarily reduced by [[/r 1d4]] unless they mark a number of Stress equal to its value. Any lost trait points are regained if the PC critically succeeds or escapes the Chaos Realm. </p><section class=\"secret\" id=\"secret-nXjHVXTDY3UzkRVb\"><p><em>How does this place try to steal from you that which makes you legendary? What does it feel like to have this power taken from you?</em></p></section>",
"description": "<p>All PCs must succeed on a Presence Reaction Roll or their highest trait is temporarily reduced by [[/r 1d4]] unless they mark a number of Stress equal to its value. Any lost trait points are regained if the PC critically succeeds or escapes the Chaos Realm.</p><section class=\"secret\" id=\"secret-nXjHVXTDY3UzkRVb\"><p><em>How does this place try to steal from you that which makes you legendary? What does it feel like to have this power taken from you?</em></p></section>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
@ -324,6 +314,42 @@
"name": "Roll Save",
"img": "icons/magic/control/sihouette-hold-beam-green.webp",
"range": ""
},
"FxAFpgPbGcmi3nlh": {
"type": "countdown",
"_id": "FxAFpgPbGcmi3nlh",
"systemPath": "actions",
"description": "<p><em>Countdown (Loop 1d4)</em>. Activate the countdown.</p>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "Everything You Are This Place Will Take from You",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/control/sihouette-hold-beam-green.webp",
"progress": {
"looping": "looping",
"type": "actionRoll",
"max": "4",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/magic/control/sihouette-hold-beam-green.webp",
"range": ""
}
},
"originItemType": null,
@ -343,12 +369,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.4",
"createdTime": 1754219142956,
"modifiedTime": 1754219278386,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763599839181,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!2Z1mKc65LxNk2PqR.0OYHJZqT0DlVz5be"
},

View file

@ -145,28 +145,42 @@
"name": "The Climb",
"type": "feature",
"system": {
"description": "<p>Climbing up the cliff side uses a Progress Countdown (12). It ticks down according to the following criteria when the PCs make an action roll to climb: </p><ul><li><p><strong>Critical Success</strong>: Tick down 3</p></li><li><p><strong>Success with Hope</strong>: Tick down 2</p></li><li><p><strong>Success with Fear</strong>: Tick down 1</p></li><li><p><strong>Failure with Hope</strong>: No Advancement</p></li><li><p><strong>Failure with Fear</strong>: Tick up 1</p></li></ul><p>When the countdown triggers, the party has made it to the top of the cliff .</p><section id=\"secret-TUIXsJs6D65YsP9f\" class=\"secret\"><p><em>What strange formations are the stones arranged in? What ominous warnings did previous adventurers leave?</em></p></section>",
"description": "<p>Climbing up the cliff side uses a Progress <em>Countdown (12)</em>. It ticks down according to the following criteria when the PCs make an action roll to climb:</p><ul><li><p><strong>Critical Success</strong>: Tick down 3</p></li><li><p><strong>Success with Hope</strong>: Tick down 2</p></li><li><p><strong>Success with Fear</strong>: Tick down 1</p></li><li><p><strong>Failure with Hope</strong>: No Advancement</p></li><li><p><strong>Failure with Fear</strong>: Tick up 1</p></li></ul><p>When the countdown triggers, the party has made it to the top of the cliff .</p><section class=\"secret\" id=\"secret-TUIXsJs6D65YsP9f\"><p><em>What strange formations are the stones arranged in? What ominous warnings did previous adventurers leave?</em></p></section>",
"resource": null,
"actions": {
"6GVdM7pIOpieLRA8": {
"type": "effect",
"_id": "6GVdM7pIOpieLRA8",
"TMEBwqlfvL3mb3hQ": {
"type": "countdown",
"_id": "TMEBwqlfvL3mb3hQ",
"systemPath": "actions",
"description": "<p>Climbing up the cliff side uses a Progress Countdown (12). It ticks down according to the following criteria when the PCs make an action roll to climb: </p><ul><li><p><strong>Critical Success</strong>: Tick down 3</p></li><li><p><strong>Success with Hope</strong>: Tick down 2</p></li><li><p><strong>Success with Fear</strong>: Tick down 1</p></li><li><p><strong>Failure with Hope</strong>: No Advancement</p></li><li><p><strong>Failure with Fear</strong>: Tick up 1</p></li></ul><p>When the countdown triggers, the party has made it to the top of the cliff .</p><section class=\"secret\" id=\"secret-U5QekZcpE7tSEBy2\"><p><em>What strange formations are the stones arranged in? What ominous warnings did previous adventurers leave?</em></p></section>",
"description": "<p>Climbing up the cliff side uses a <em>Progress Countdown (12)</em>. It ticks down according to the following criteria when the PCs make an action roll to climb:</p><ul><li><p><strong>Critical Success</strong>: Tick down 3</p></li><li><p><strong>Success with Hope</strong>: Tick down 2</p></li><li><p><strong>Success with Fear</strong>: Tick down 1</p></li><li><p><strong>Failure with Hope</strong>: No Advancement</p></li><li><p><strong>Failure with Fear</strong>: Tick up 1</p></li></ul><p>When the countdown triggers, the party has made it to the top of the cliff .</p><section class=\"secret\" id=\"secret-5teov2eI5kV1P3LD\"><p><em>What strange formations are the stones arranged in? What ominous warnings did previous adventurers leave?</em></p></section>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null
"recovery": null,
"consumeOnSuccess": false
},
"effects": [],
"target": {
"type": "any",
"amount": null
"countdown": [
{
"name": "The Climb",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/environment/wilderness/terrain-rocks-brown.webp",
"progress": {
"looping": "noLooping",
"type": "custom",
"max": "12",
"current": 1
},
"name": "Countdown",
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/environment/wilderness/terrain-rocks-brown.webp",
"range": ""
}
@ -188,12 +202,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.3",
"createdTime": 1754212143089,
"modifiedTime": 1754212255805,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763493379219,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!LPpfdlNKqiZIl04w.bKBwM72OwVnlsHG6"
},

View file

@ -345,9 +345,72 @@
"name": "The Summoning",
"type": "feature",
"system": {
"description": "<p>Countdown (6). When the PCs enter the scene or the cult begins the ritual to summon a demon, activate the countdown. Designate one adversary to lead the ritual. The countdown ticks down when a PC rolls with Fear. When it triggers, summon a Minor Demon within Very Close range of the rituals leader. If the leader is defeated, the countdown ends with no effect as the ritual fails.</p><section class=\"secret\" id=\"secret-OXdRqIZ0R8wGn3Gm\"><p><em>What will the cult do with this leashed demon if they succeed? What will they try to summon next?</em></p></section>",
"description": "<p><em>Countdown (6)</em>. When the PCs enter the scene or the cult begins the ritual to summon a demon, activate the countdown. Designate one adversary to lead the ritual. The countdown ticks down when a PC rolls with Fear. When it triggers, summon a @UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demon} within Very Close range of the rituals leader. If the leader is defeated, the countdown ends with no effect as the ritual fails.</p><section class=\"secret\" id=\"secret-OXdRqIZ0R8wGn3Gm\"><p><em>What will the cult do with this leashed demon if they succeed? What will they try to summon next?</em></p></section>",
"resource": null,
"actions": {},
"actions": {
"bUIfzuWd1VfiV8sc": {
"type": "countdown",
"_id": "bUIfzuWd1VfiV8sc",
"systemPath": "actions",
"description": "<p><em>Countdown (6)</em>. When the PCs enter the scene or the cult begins the ritual to summon a demon, activate the countdown. Designate one adversary to lead the ritual. The countdown ticks down when a PC rolls with Fear.</p>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "reaction",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "The Summoning",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/unholy/barrier-fire-pink.webp",
"progress": {
"looping": "noLooping",
"type": "fear",
"max": "6",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/magic/unholy/barrier-fire-pink.webp",
"range": ""
},
"suFEnfpOfeVRvnJF": {
"type": "effect",
"_id": "suFEnfpOfeVRvnJF",
"systemPath": "actions",
"description": "<p>Summon a @UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demon} within Very Close range of the rituals leader.</p>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"effects": [],
"target": {
"type": "any",
"amount": null
},
"name": "Summon Demon",
"img": "icons/magic/unholy/barrier-fire-pink.webp",
"range": ""
}
},
"originItemType": null,
"originId": null
},
@ -365,12 +428,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.4",
"createdTime": 1754215458731,
"modifiedTime": 1754215511070,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763600981803,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!QAXXiOKBDmCTauHD.oFfu3hUhp4ta4qwT"
},

View file

@ -146,36 +146,14 @@
"name": "Final Preparations",
"type": "feature",
"system": {
"description": "<p>When the environment first takes the spotlight, designate one adversary as the Usurper seeking to overthrow the gods. Activate a Long-Term Countdown (8) as the Usurper assembles what they need to conduct the ritual. When it triggers, spotlight this environment to use the “Beginning of the End” feature. While this environment remains in play, you can hold up to 15 Fear. </p><section id=\"secret-5ezbFLP3BnyqQPov\" class=\"secret\"><p><em>What does the Usurper still require: The heart of a High Seraph? The lodestone of an ancient waygate? The loyalty of two archenemies? The heartbroken tears of a pure soul?</em></p></section>",
"description": "<p>When the environment first takes the spotlight, designate one adversary as the Usurper seeking to overthrow the gods. Activate a Long-Term <em>Countdown (8)</em> as the Usurper assembles what they need to conduct the ritual. When it triggers, spotlight this environment to use the “Beginning of the End” feature. While this environment remains in play, you can hold up to 15 Fear.</p><section class=\"secret\" id=\"secret-5ezbFLP3BnyqQPov\"><p><em>What does the Usurper still require: The heart of a High Seraph? The lodestone of an ancient waygate? The loyalty of two archenemies? The heartbroken tears of a pure soul?</em></p></section>",
"resource": null,
"actions": {
"pnAJNmZApL1Acsj1": {
"type": "effect",
"_id": "pnAJNmZApL1Acsj1",
"systemPath": "actions",
"description": "<p>When the environment first takes the spotlight, designate one adversary as the Usurper seeking to overthrow the gods. Activate a Long-Term Countdown (8) as the Usurper assembles what they need to conduct the ritual. While this environment remains in play, you can hold up to 15 Fear.</p><section class=\"secret\" id=\"secret-Ilu20TRkfslT2a3K\"><p><em>What does the Usurper still require: The heart of a High Seraph? The lodestone of an ancient waygate? The loyalty of two archenemies? The heartbroken tears of a pure soul?</em></p></section>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null
},
"effects": [],
"target": {
"type": "any",
"amount": null
},
"name": "Countdown",
"img": "icons/magic/unholy/hands-circle-light-green.webp",
"range": ""
},
"UMGyEHdQhYXyGEss": {
"type": "effect",
"_id": "UMGyEHdQhYXyGEss",
"systemPath": "actions",
"description": "<p>When the countdown triggers, spotlight this environment to use the “Beginning of the End” feature.</p><section class=\"secret\" id=\"secret-InHMXWLy76neQv3c\"><p><em>What does the Usurper still require: The heart of a High Seraph? The lodestone of an ancient waygate? The loyalty of two archenemies? The heartbroken tears of a pure soul?</em></p></section>",
"description": "<p>Spotlight this environment to use the “Beginning of the End” feature.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
@ -192,6 +170,42 @@
"name": "Trigger Countdown",
"img": "icons/magic/unholy/hands-circle-light-green.webp",
"range": ""
},
"uJSaDLFcrtvIPFaD": {
"type": "countdown",
"_id": "uJSaDLFcrtvIPFaD",
"systemPath": "actions",
"description": "<p>When the environment first takes the spotlight, designate one adversary as the Usurper seeking to overthrow the gods. Activate a Long-Term <em>Countdown (8)</em> as the Usurper assembles what they need to conduct the ritual.</p><section class=\"secret\" id=\"secret-FyeeA41DYc7DdjY7\"><p><em>What does the Usurper still require: The heart of a High Seraph? The lodestone of an ancient waygate? The loyalty of two archenemies? The heartbroken tears of a pure soul?</em></p></section>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "reaction",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "Final Preparations",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/unholy/hands-circle-light-green.webp",
"progress": {
"looping": "noLooping",
"type": "custom",
"max": "8",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/magic/unholy/hands-circle-light-green.webp",
"range": ""
}
},
"originItemType": null,
@ -211,12 +225,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.3",
"createdTime": 1754219653852,
"modifiedTime": 1754219787730,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763494304225,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!4DLYez7VbMCFDAuZ.IHLJjpOQyWjmCLAL"
},
@ -542,36 +556,14 @@
"name": "Beginning of the End",
"type": "feature",
"system": {
"description": "<p>When the “Final Preparations” long-term countdown triggers, the Usurper begins hammering on the gates of the Hallows themselves. Activate a Divine Siege Countdown (10). Spotlight the Usurper to describe the Usurpers assault and tick down this countdown by 1. If the Usurper takes Major or greater damage, tick up the countdown by 1. When it triggers, the Usurper shatters the barrier between the Mortal Realm and the Hallows Above to slay the gods and take their place. You gain a Fear for each unmarked HP the Usurper has. You can immediately use the “Godslayer” feature without spending Fear to make an additional GM move. </p><section id=\"secret-eVeMBBA7aAZgn9FO\" class=\"secret\"><p><em>How does the Mortal Realm writhe as the natural order is violated? What mortals witness this blasphemy from afar?</em></p></section>",
"description": "<p>When the “Final Preparations” long-term countdown triggers, the Usurper begins hammering on the gates of the Hallows themselves. Activate a Divine Siege <em>Countdown (10)</em>. Spotlight the Usurper to describe the Usurpers assault and tick down this countdown by 1. If the Usurper takes Major or greater damage, tick up the countdown by 1. When it triggers, the Usurper shatters the barrier between the Mortal Realm and the Hallows Above to slay the gods and take their place. You gain a Fear for each unmarked HP the Usurper has. You can immediately use the “Godslayer” feature without spending Fear to make an additional GM move.</p><section class=\"secret\" id=\"secret-eVeMBBA7aAZgn9FO\"><p><em>How does the Mortal Realm writhe as the natural order is violated? What mortals witness this blasphemy from afar?</em></p></section>",
"resource": null,
"actions": {
"lUTJqI8Z9AR7t4B2": {
"type": "effect",
"_id": "lUTJqI8Z9AR7t4B2",
"systemPath": "actions",
"description": "<p>When the “Final Preparations” long-term countdown triggers, the Usurper begins hammering on the gates of the Hallows themselves. Activate a Divine Siege Countdown (10).</p><section class=\"secret\" id=\"secret-OqCr3uNWn5xOHis0\"><p><em>How does the Mortal Realm writhe as the natural order is violated? What mortals witness this blasphemy from afar?</em></p></section>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null
},
"effects": [],
"target": {
"type": "any",
"amount": null
},
"name": "Countdown",
"img": "icons/magic/unholy/silhouette-robe-evil-glow.webp",
"range": ""
},
"N83u4SKOlCfLvdYI": {
"type": "effect",
"_id": "N83u4SKOlCfLvdYI",
"systemPath": "actions",
"description": "<p>Spotlight the Usurper to describe the Usurpers assault and tick down the countdown by 1. </p><section class=\"secret\" id=\"secret-5Nggk3PogQYR7pTg\"><p><em>How does the Mortal Realm writhe as the natural order is violated? What mortals witness this blasphemy from afar?</em></p></section>",
"description": "<p>The Usurper shatters the barrier between the Mortal Realm and the Hallows Above to slay the gods and take their place. You gain a Fear for each unmarked HP the Usurper has. You can immediately use the “Godslayer” feature without spending Fear to make an additional GM move.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
@ -585,7 +577,43 @@
"type": "any",
"amount": null
},
"name": "Spotlight Usurper",
"name": "Trigger Countdown",
"img": "icons/magic/unholy/silhouette-robe-evil-glow.webp",
"range": ""
},
"KNWpWnJboRIaZ3Yu": {
"type": "countdown",
"_id": "KNWpWnJboRIaZ3Yu",
"systemPath": "actions",
"description": "<p>When the “Final Preparations” long-term countdown triggers, the Usurper begins hammering on the gates of the Hallows themselves. Activate a Divine Siege <em>Countdown (10)</em>. Spotlight the Usurper to describe the Usurpers assault and tick down this countdown by 1. If the Usurper takes Major or greater damage, tick up the countdown by 1.</p><section class=\"secret\" id=\"secret-u7mt9OivMXWU5s3S\"><p><em>How does the Mortal Realm writhe as the natural order is violated? What mortals witness this blasphemy from afar?</em></p></section>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "Beginning of the End",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/unholy/silhouette-robe-evil-glow.webp",
"progress": {
"looping": "noLooping",
"type": "custom",
"max": "10",
"current": 1
},
"ownership": {}
}
],
"name": "Countdown",
"img": "icons/magic/unholy/silhouette-robe-evil-glow.webp",
"range": ""
}
@ -607,12 +635,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.3",
"createdTime": 1754220141696,
"modifiedTime": 1754220317609,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763494458041,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!4DLYez7VbMCFDAuZ.AJdG1krRvixBFCZG"
},

View file

@ -323,28 +323,51 @@
"name": "Apocalypse Then",
"type": "feature",
"system": {
"description": "<p><strong>Spend a Fear</strong> to manifest the echo of a past disaster that ravaged the city. Activate a Progress Countdown (5) as the disaster replays around the PCs. To complete the countdown and escape the catastrophe, the PCs must overcome threats such as rampaging fires, stampeding civilians, collapsing buildings, or crumbling streets, while recalling history and finding clues to escape the inevitable. </p><section id=\"secret-3MamLVZP4l2SxHzO\" class=\"secret\"><p><em>Is this the disaster that led the city to be abandoned? What is known about this disaster and how could that help the PCs escape?</em></p></section>",
"description": "<p><strong>Spend a Fear</strong> to manifest the echo of a past disaster that ravaged the city. Activate a <em>Progress Countdown (5)</em> as the disaster replays around the PCs. To complete the countdown and escape the catastrophe, the PCs must overcome threats such as rampaging fires, stampeding civilians, collapsing buildings, or crumbling streets, while recalling history and finding clues to escape the inevitable.</p><section class=\"secret\" id=\"secret-3MamLVZP4l2SxHzO\"><p><em>Is this the disaster that led the city to be abandoned? What is known about this disaster and how could that help the PCs escape?</em></p></section>",
"resource": null,
"actions": {
"7H16PYHHgK0Z34NU": {
"type": "effect",
"_id": "7H16PYHHgK0Z34NU",
"VhqZKDA4032i8zY3": {
"type": "countdown",
"_id": "VhqZKDA4032i8zY3",
"systemPath": "actions",
"description": "<p><strong>Spend a Fear</strong> to manifest the echo of a past disaster that ravaged the city. Activate a Progress Countdown (5) as the disaster replays around the PCs. </p>",
"description": "<p><strong>Spend a Fear</strong> to manifest the echo of a past disaster that ravaged the city. Activate a <em>Progress Countdown (5)</em> as the disaster replays around the PCs. To complete the countdown and escape the catastrophe, the PCs must overcome threats such as rampaging fires, stampeding civilians, collapsing buildings, or crumbling streets, while recalling history and finding clues to escape the inevitable.</p><section class=\"secret\" id=\"secret-2Ou4kbqfCwCgsG5X\"><p><em>Is this the disaster that led the city to be abandoned? What is known about this disaster and how could that help the PCs escape?</em></p></section>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [],
"cost": [
{
"scalable": false,
"key": "fear",
"value": 1,
"itemId": null,
"step": null,
"consumeOnSuccess": false
}
],
"uses": {
"value": null,
"max": "",
"recovery": null
"recovery": null,
"consumeOnSuccess": false
},
"effects": [],
"target": {
"type": "any",
"amount": null
"countdown": [
{
"name": "Apocalypse Then",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/death/skull-weapon-staff-glow-pink.webp",
"progress": {
"looping": "noLooping",
"type": "custom",
"max": "5",
"current": 1
},
"name": "Countdown",
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/magic/death/skull-weapon-staff-glow-pink.webp",
"range": ""
}
@ -366,12 +389,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.3",
"createdTime": 1754216782337,
"modifiedTime": 1754216854366,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763493696142,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!OzYbizKraK92FDiI.i0FV2Djaq0vB57cq"
}

View file

@ -303,36 +303,14 @@
"name": "Icy Winds",
"type": "feature",
"system": {
"description": "<p>Countdown (Loop 4). When the PCs enter the mountain pass, activate the countdown. When it triggers, all characters traveling through the pass must succeed on a Strength Reaction Roll or mark a Stress. A PC wearing clothes appropriate for extreme cold gains advantage on these rolls. </p><section id=\"secret-FsJMzj3ZZuf134s2\" class=\"secret\"><p><em>What parts of the PCs bodies go numb fi rst? How do they try to keep warm as they press forward?</em></p></section>",
"description": "<p><em>Countdown (Loop 4)</em>. When the PCs enter the mountain pass, activate the countdown. When it triggers, all characters traveling through the pass must succeed on a Strength Reaction Roll or mark a Stress. A PC wearing clothes appropriate for extreme cold gains advantage on these rolls.</p><section class=\"secret\" id=\"secret-FsJMzj3ZZuf134s2\"><p><em>What parts of the PCs bodies go numb fi rst? How do they try to keep warm as they press forward?</em></p></section>",
"resource": null,
"actions": {
"P6U45vsXJmEW6BBj": {
"type": "effect",
"_id": "P6U45vsXJmEW6BBj",
"systemPath": "actions",
"description": "<p>Countdown (Loop 4). When the PCs enter the mountain pass, activate the countdown. </p><section class=\"secret\" id=\"secret-v5D1PTyNviMNTlIO\"><p><em>What parts of the PCs bodies go numb fi rst? How do they try to keep warm as they press forward?</em></p></section>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null
},
"effects": [],
"target": {
"type": "any",
"amount": null
},
"name": "Countdown",
"img": "icons/magic/water/snowflake-ice-blue-white.webp",
"range": ""
},
"kDV2h9DhO6fEDcjl": {
"type": "attack",
"_id": "kDV2h9DhO6fEDcjl",
"systemPath": "actions",
"description": "<p>When the countdown triggers, all characters traveling through the pass must succeed on a Strength Reaction Roll or mark a Stress. A PC wearing clothes appropriate for extreme cold gains advantage on these rolls. </p><section class=\"secret\" id=\"secret-nEZRdWaqMAIUoQG0\"><p><em>What parts of the PCs bodies go numb fi rst? How do they try to keep warm as they press forward?</em></p></section>",
"description": "<p>All characters traveling through the pass must succeed on a Strength Reaction Roll or mark a Stress. A PC wearing clothes appropriate for extreme cold gains advantage on these rolls.</p><section class=\"secret\" id=\"secret-nEZRdWaqMAIUoQG0\"><p><em>What parts of the PCs bodies go numb fi rst? How do they try to keep warm as they press forward?</em></p></section>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
@ -399,6 +377,42 @@
"name": "Roll Save",
"img": "icons/magic/water/snowflake-ice-blue-white.webp",
"range": ""
},
"yJj6IsNNTEyKndvO": {
"type": "countdown",
"_id": "yJj6IsNNTEyKndvO",
"systemPath": "actions",
"description": "<p><em>Countdown (Loop 4)</em>. When the PCs enter the mountain pass, activate the countdown.</p>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "reaction",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null,
"consumeOnSuccess": false
},
"countdown": [
{
"name": "Icy Winds",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/water/snowflake-ice-blue-white.webp",
"progress": {
"looping": "looping",
"type": "actionRoll",
"max": "4",
"current": 1
},
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/magic/water/snowflake-ice-blue-white.webp",
"range": ""
}
},
"originItemType": null,
@ -418,12 +432,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.4",
"createdTime": 1754217155443,
"modifiedTime": 1754217244471,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763599993797,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!acMu9wJrMZZzLSTJ.K8ld4m5yTA6WZwUs"
}

View file

@ -154,28 +154,42 @@
"name": "Dangerous Crossing",
"type": "feature",
"system": {
"description": "<p>Crossing the river requires the party to complete a Progress Countdown (4).</p><section class=\"secret\" id=\"secret-l7tHfgFFOGdvlnll\"><p>A PC who rolls a failure with Fear is immediately targeted by the “Undertow” action without requiring a Fear to be spent on the feature.</p></section><p></p><section id=\"secret-VF0r7nXxQlmuwMpj\" class=\"secret\"><p><em>Have any of the PCs forded rivers like this before? Are any of them afraid of drowning?</em></p></section>",
"description": "<p>Crossing the river requires the party to complete a <em>Progress Countdown (4)</em>.</p><section class=\"secret\" id=\"secret-l7tHfgFFOGdvlnll\"><p>A PC who rolls a failure with Fear is immediately targeted by the “Undertow” action without requiring a Fear to be spent on the feature.</p></section><p></p><section class=\"secret\" id=\"secret-VF0r7nXxQlmuwMpj\"><p><em>Have any of the PCs forded rivers like this before? Are any of them afraid of drowning?</em></p></section>",
"resource": null,
"actions": {
"miodf3TMFrGRCvj6": {
"type": "effect",
"_id": "miodf3TMFrGRCvj6",
"91HPIEEcVKPQ5qqn": {
"type": "countdown",
"_id": "91HPIEEcVKPQ5qqn",
"systemPath": "actions",
"description": "<p>Crossing the river requires the party to complete a Progress Countdown (4). </p><section id=\"secret-mrmEGWrNJvoobYFZ\" class=\"secret\"><p>A PC who rolls a failure with Fear is immediately targeted by the “Undertow” action without requiring a Fear to be spent on the feature. </p><p><em>Have any of the PCs forded rivers like this before? Are any of them afraid of drowning?</em></p></section>",
"description": "<p>Crossing the river requires the party to complete a <em>Progress Countdown (4)</em>.</p><section class=\"secret\" id=\"secret-aKJuTbAZaPUFxoiE\"><p>A PC who rolls a failure with Fear is immediately targeted by the “Undertow” action without requiring a Fear to be spent on the feature.</p></section><p></p><section class=\"secret\" id=\"secret-GSYTFIq8J3k2a4Ww\"><p><em>Have any of the PCs forded rivers like this before? Are any of them afraid of drowning?</em></p></section>",
"chatDisplay": true,
"originItem": {
"type": "itemCollection"
},
"actionType": "action",
"cost": [],
"uses": {
"value": null,
"max": "",
"recovery": null
"recovery": null,
"consumeOnSuccess": false
},
"effects": [],
"target": {
"type": "any",
"amount": null
"countdown": [
{
"name": "Dangerous Crossing",
"type": "encounter",
"defaultOwnership": -1,
"img": "icons/magic/water/wave-water-blue.webp",
"progress": {
"looping": "noLooping",
"type": "custom",
"max": "4",
"current": 1
},
"name": "Countdown",
"ownership": {}
}
],
"name": "Start Countdown",
"img": "icons/magic/water/wave-water-blue.webp",
"range": ""
}
@ -197,12 +211,12 @@
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.346",
"coreVersion": "13.351",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.2.3",
"createdTime": 1754213872081,
"modifiedTime": 1754214257220,
"lastModifiedBy": "MQSznptE5yLT7kj8"
"modifiedTime": 1763493447490,
"lastModifiedBy": "Q4RzhhaPfvLUzzbw"
},
"_key": "!actors.items!t4cdqTfzcqP3H1vJ.4ILX7BCinmsGqrJM"
},

View file

@ -63,9 +63,16 @@
scrollbar-width: thin;
scrollbar-color: light-dark(@dark-blue, @golden) transparent;
.countdown-edit-outer-container {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 8px;
.countdown-edit-container {
width: 100%;
display: grid;
grid-template-columns: 48px 1fr 68px;
grid-template-columns: 48px 1fr 72px;
align-items: center;
gap: 8px;
@ -83,6 +90,7 @@
.countdown-edit-subtext {
display: flex;
align-items: center;
gap: 10px;
.countdown-edit-sub-tag {
@ -94,6 +102,16 @@
border: 1px solid light-dark(@dark, @beige);
border-radius: 3px;
}
.countdown-edit-loop {
position: relative;
.loop-marker {
position: absolute;
top: -4px;
font-size: 10px;
}
}
}
}
@ -110,11 +128,10 @@
}
}
}
}
.countdown-edit-subrow {
display: flex;
gap: 16px;
margin: 0 72px 0 56px;
gap: 8px;
}
.countdown-edit-input {
@ -124,6 +141,14 @@
align-items: flex-start;
gap: 2px;
&.type-input {
min-width: 120px;
}
&.looping-input {
min-width: 120px;
}
&.tiny {
flex: 0;
input {

View file

@ -47,7 +47,7 @@
.countdown-container {
display: flex;
justify-content: space-between;
width: 100%;
&.icon-only {
gap: 8px;
@ -64,6 +64,7 @@
}
.countdown-main-container {
width: 100%;
display: flex;
align-items: center;
gap: 16px;
@ -75,14 +76,21 @@
}
.countdown-content {
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
.countdown-tools {
display: flex;
align-items: center;
justify-content: space-between;
.countdown-tool-controls {
display: flex;
align-items: center;
gap: 16px;
}
.progress-tag {
border: 1px solid;
@ -90,33 +98,54 @@
padding: 2px 4px;
background-color: light-dark(@beige, @dark-blue);
}
}
}
}
.countdown-access-container {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-auto-rows: min-content;
width: 38px;
gap: 4px;
.countdown-access {
height: 10px;
width: 10px;
border-radius: 50%;
border: 1px solid light-dark(@dark-blue, @beige-80);
content: '';
}
}
.countdown-no-access-container {
width: 38px;
.countdown-tool-icons {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
.looping-container {
position: relative;
border: 1px solid light-dark(@dark-blue, white);
border-radius: 6px;
padding: 2px 4px;
&.should-loop {
background: light-dark(@golden, @golden);
.loop-marker {
color: light-dark(@dark-blue, @dark-blue);
}
}
.direction-marker {
position: absolute;
font-size: 10px;
filter: drop-shadow(0 0 3px black);
top: -3px;
}
}
}
}
}
}
/* Keep incase we want to reintroduce the player pips */
// .countdown-access-container {
// display: grid;
// grid-template-columns: 1fr 1fr 1fr;
// grid-auto-rows: min-content;
// width: 38px;
// gap: 4px;
// .countdown-access {
// height: 10px;
// width: 10px;
// border-radius: 50%;
// border: 1px solid light-dark(@dark-blue, @beige-80);
// content: '';
// }
// }
}
}
}
}

View file

@ -2,7 +2,7 @@
"id": "daggerheart",
"title": "Daggerheart",
"description": "An unofficial implementation of the Daggerheart system",
"version": "1.2.3",
"version": "1.2.4",
"compatibility": {
"minimum": "13",
"verified": "13.351",

View file

@ -0,0 +1,22 @@
<fieldset class="one-column" data-key="countdown">
<legend>
{{localize "DAGGERHEART.ACTIONS.TYPES.countdown.name"}}
<a><i class="fa-solid fa-plus icon-button" data-action="addElement"></i></a>
</legend>
{{#each source as |countdown index|}}
<div class="nest-inputs">
{{formField ../fields.name value=countdown.name name=(concat "countdown." index ".name") localize=true}}
<a class="btn" data-tooltip="{{localize "CONTROLS.CommonDelete"}}" data-action="removeElement" data-index="{{index}}"><i class="fas fa-trash"></i></a>
</div>
<div class="nest-inputs">
{{formField ../fields.type value=countdown.type name=(concat "countdown." index ".type") localize=true}}
{{formField ../fields.defaultOwnership value=countdown.defaultOwnership name=(concat "countdown." index ".defaultOwnership") localize=true}}
</div>
{{formField ../fields.img value=countdown.img name=(concat "countdown." index ".img") label="DAGGERHEART.GENERAL.imagePath" localize=true}}
<div class="nest-inputs">
{{formField ../fields.progress.fields.looping value=countdown.progress.looping name=(concat "countdown." index ".progress.looping") localize=true}}
{{formField ../fields.progress.fields.type value=countdown.progress.type name=(concat "countdown." index ".progress.type") localize=true}}
{{formField ../fields.progress.fields.max value=countdown.progress.max name=(concat "countdown." index ".progress.max") localize=true}}
</div>
{{/each}}
</fieldset>

View file

@ -13,6 +13,7 @@
{{formGroup settingFields.schema.fields.summaryMessages.fields.damage value=settingFields._source.summaryMessages.damage localize=true}}
{{formGroup settingFields.schema.fields.summaryMessages.fields.effects value=settingFields._source.summaryMessages.effects localize=true}}
</div>
{{formGroup settingFields.schema.fields.countdownAutomation value=settingFields._source.countdownAutomation localize=true}}
{{formGroup settingFields.schema.fields.actionPoints value=settingFields._source.actionPoints localize=true}}
{{formGroup settingFields.schema.fields.hordeDamage value=settingFields._source.hordeDamage localize=true}}
{{formGroup settingFields.schema.fields.effects.fields.rangeDependent value=settingFields._source.effects.rangeDependent localize=true}}

View file

@ -1,4 +1,4 @@
<section
<section
class="tab {{this.tabs.effect.cssClass}}"
data-group="primary"
data-tab="effect"
@ -9,4 +9,5 @@
{{#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.beastform}}{{> 'systems/daggerheart/templates/actionTypes/beastform.hbs' fields=fields.beastform.fields source=source.beastform}}{{/if}}
{{#if fields.countdown}}{{> 'systems/daggerheart/templates/actionTypes/countdown.hbs' fields=fields.countdown.element.fields source=source.countdown}}{{/if}}
</section>

View file

@ -22,6 +22,7 @@
<div class="edit-content">
{{#each countdowns as | countdown id | }}
<fieldset class="countdown-edit-outer-container">
<div class="countdown-edit-container {{#unless countdown.editing}}viewing{{/unless}}" data-id="{{id}}">
<a data-action="editCountdownImage" id="{{id}}"><img src="{{countdown.img}}" /></a>
{{#unless countdown.editing}}
@ -32,6 +33,17 @@
<div class="countdown-edit-sub-tag">{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.currentCountdownMax" value=countdown.progress.max}}</div>
<div class="countdown-edit-sub-tag">{{countdown.typeName}}</div>
<div class="countdown-edit-sub-tag">{{countdown.progress.typeName}}</div>
{{#unless (eq countdown.progress.looping "noLooping")}}
<div class="countdown-edit-loop" data-tooltip="{{countdown.loopTooltip}}">
<i class="fa-solid fa-repeat"></i>
{{#if (eq countdown.progress.looping "increasing")}}
<i class="loop-marker fa-solid fa-angles-up"></i>
{{else if (eq countdown.progress.looping "decreasing")}}
<i class="loop-marker fa-solid fa-angles-down"></i>
{{/if}}
</div>
{{/unless}}
</div>
</div>
{{else}}
@ -56,20 +68,27 @@
<label>{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.max"}}</label>
<input type="number" name="{{concat "countdowns." id ".progress.max"}}" value="{{countdown.progress.max}}" />
</div>
<div class="countdown-edit-input">
<div class="countdown-edit-input tiny type-input">
<label>{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.category"}}</label>
<select name="{{concat "countdowns." id ".type"}}">
{{selectOptions ../countdownBaseTypes selected=countdown.type valueAttr="id" labelAttr="name" localize=true}}
{{selectOptions ../countdownBaseTypes selected=countdown.type localize=true}}
</select>
</div>
<div class="countdown-edit-input">
<label>{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.type"}}</label>
<label>{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.progressionType"}}</label>
<select name="{{concat "countdowns." id ".progress.type"}}">
{{selectOptions ../countdownTypes selected=countdown.progress.type valueAttr="id" labelAttr="label" localize=true}}
{{selectOptions ../countdownProgressionTypes selected=countdown.progress.type localize=true}}
</select>
</div>
<div class="countdown-edit-input looping-input tiny">
<label>{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.looping"}}</label>
<select name="{{concat "countdowns." id ".progress.looping"}}">
{{selectOptions ../countdownLoopingTypes selected=countdown.progress.looping localize=true}}
</select>
</div>
</div>
{{/if}}
</fieldset>
{{/each}}
</div>
</div>

View file

@ -7,26 +7,35 @@
<div class="countdown-content">
{{#unless ../iconOnly}}<label>{{countdown.name}}</label>{{/unless}}
<div class="countdown-tools">
<div class="countdown-tool-controls">
{{#if countdown.editable}}<a data-action="decreaseCountdown" id="{{id}}"><i class="fa-solid fa-minus"></i></a>{{/if}}
<div class="progress-tag">
{{countdown.progress.current}}/{{countdown.progress.max}}
</div>
{{#if countdown.editable}}<a data-action="increaseCountdown" id="{{id}}"><i class="fa-solid fa-plus"></i></a>{{/if}}
</div>
<div class="countdown-tool-icons">
{{#if (not ../iconOnly)}}
{{#if (and countdown.noPlayerAccess @root.isGM)}}
<i class="fa-solid fa-eye-slash" data-tooltip="{{localize "DAGGERHEART.UI.Countdowns.noPlayerAccess"}}"></i>
{{/if}}
{{#unless (eq countdown.progress.looping "noLooping")}}
<span data-tooltip="{{countdown.loopTooltip}}">
<a class="looping-container {{#if countdown.shouldLoop}}should-loop{{/if}}" {{#if countdown.loopDisabled}}disabled{{/if}} data-action="loopCountdown" id="{{id}}">
<i class="loop-marker fa-solid fa-repeat"></i>
{{#if (eq countdown.progress.looping "increasing")}}
<i class="direction-marker fa-solid fa-angles-up" data-tooltip="{{localize "DAGGERHEART.UI.Countdowns.increasingLoop"}}"></i>
{{else if (eq countdown.progress.looping "decreasing")}}
<i class="direction-marker fa-solid fa-angles-down" data-tooltip="{{localize "DAGGERHEART.UI.Countdowns.decreasingLoop"}}"></i>
{{/if}}
</a>
</span>
{{/unless}}
{{/if}}
</div>
</div>
</div>
{{#if (and @root.isGM (not ../iconOnly))}}
{{#if (gt countdown.playerAccess.length 0)}}
<div class="countdown-access-container">
{{#each countdown.playerAccess as |player|}}
<div class="countdown-access" style="{{concat "background: " player.color.css ";"}}" data-tooltip="{{player.name}}"></div>
{{/each}}
</div>
{{/if}}
{{#if countdown.noPlayerAccess}}
<div class="countdown-no-access-container"><i class="fa-solid fa-eye-slash" data-tooltip="{{localize "DAGGERHEART.UI.Countdowns.noPlayerAccess"}}"></i></div>
{{/if}}
{{/if}}
</div>
{{/each}}
</div>