From 207220ff7ba21fd4e658325b116ec0870691e453 Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Thu, 20 Nov 2025 11:46:00 +0100 Subject: [PATCH] [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' --- lang/en.json | 37 ++++- .../sheets-configs/action-config.mjs | 8 +- module/applications/ui/chatLog.mjs | 6 +- module/applications/ui/combatTracker.mjs | 5 +- module/applications/ui/countdownEdit.mjs | 20 ++- module/applications/ui/countdowns.mjs | 47 +++++- module/config/actionConfig.mjs | 6 + module/config/generalConfig.mjs | 43 +++++- module/data/_module.mjs | 1 + module/data/action/_module.mjs | 2 + module/data/action/attackAction.mjs | 6 +- module/data/action/baseAction.mjs | 7 + module/data/action/countdownAction.mjs | 30 ++++ module/data/countdowns.mjs | 22 ++- module/data/fields/action/_module.mjs | 1 + module/data/fields/action/countdownField.mjs | 88 +++++++++++ module/data/fields/actionField.mjs | 2 +- module/data/settings/Automation.mjs | 5 + module/dice/dhRoll.mjs | 19 ++- module/systemRegistration/handlebars.mjs | 1 + ...ary_Adult_Flickerfly_G7jiltRjgvVhZewm.json | 48 +++++- ...ary_Arch_Necromancer_WPEOIGfclNJxWb87.json | 70 +++++---- ...rsary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json | 75 ++++++++- .../adversary_Dire_Bat_tBWHW00epmMnkawe.json | 6 +- ...sary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json | 68 +++++---- ...rlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json | 68 +++++---- ..._Undefeated_Champion_RXkZTwBRi4dJ3JE5.json | 70 +++++---- .../adversary_Gorgon_8mJYMpbLTb8qIOrr.json | 44 +++++- ...adversary_Head_Guard_mK3A5FTx6k8iPU3F.json | 49 +++++- ..._Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json | 48 +++++- .../adversary_Monarch_yx0vK2yfNVZKWUUi.json | 115 ++++++++++++-- ...ersary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json | 70 +++++---- ...ersary_Secret_Keeper_sLAccjvCWfeedbpI.json | 70 +++++---- ...dversary_Stonewraith_3aAS2Qm3R6cgaYfE.json | 44 +++++- ...Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json | 77 ++++++---- ...inCard_Mass_Disguise_dT95m0Jam8sWbeuC.json | 44 +++++- ...g_Heart_of_the_Woods_oY69NN4rYxoRE4hl.json | 70 +++++---- ...Bustling_Marketplace_HZKA7hkej7JJY503.json | 63 +++++--- ...ronment_Castle_Siege_1eZ32Esq7rfZOjlu.json | 70 +++++---- ...ironment_Chaos_Realm_2Z1mKc65LxNk2PqR.json | 140 ++++++++++------- ...ent_Cliffside_Ascent_LPpfdlNKqiZIl04w.json | 46 ++++-- ...ironment_Cult_Ritual_QAXXiOKBDmCTauHD.json | 75 ++++++++- ...nt_Divine_Usurpation_4DLYez7VbMCFDAuZ.json | 142 +++++++++++------- ...ronment_Haunted_City_OzYbizKraK92FDiI.json | 57 ++++--- ...onment_Mountain_Pass_acMu9wJrMZZzLSTJ.json | 70 +++++---- ...ronment_Raging_River_t4cdqTfzcqP3H1vJ.json | 46 ++++-- styles/less/ui/countdown/countdown-edit.less | 103 ++++++++----- styles/less/ui/countdown/countdown.less | 77 +++++++--- system.json | 2 +- templates/actionTypes/countdown.hbs | 22 +++ .../settings/automation-settings/general.hbs | 1 + .../action-settings/effect.hbs | 3 +- templates/ui/countdown-edit.hbs | 27 +++- templates/ui/countdowns.hbs | 41 +++-- 54 files changed, 1742 insertions(+), 635 deletions(-) create mode 100644 module/data/action/countdownAction.mjs create mode 100644 module/data/fields/action/countdownField.mjs create mode 100644 templates/actionTypes/countdown.hbs diff --git a/lang/en.json b/lang/en.json index 30878907..a63f25dd 100755 --- a/lang/en.json +++ b/lang/en.json @@ -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", diff --git a/module/applications/sheets-configs/action-config.mjs b/module/applications/sheets-configs/action-config.mjs index 43753f3b..81ade99b 100644 --- a/module/applications/sheets-configs/action-config.mjs +++ b/module/applications/sheets-configs/action-config.mjs @@ -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); + } } diff --git a/module/applications/ui/chatLog.mjs b/module/applications/ui/chatLog.mjs index e2e3b6d4..871ff173 100644 --- a/module/applications/ui/chatLog.mjs +++ b/module/applications/ui/chatLog.mjs @@ -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({ diff --git a/module/applications/ui/combatTracker.mjs b/module/applications/ui/combatTracker.mjs index b70f8c71..370e62e2 100644 --- a/module/applications/ui/combatTracker.mjs +++ b/module/applications/ui/combatTracker.mjs @@ -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) { diff --git a/module/applications/ui/countdownEdit.mjs b/module/applications/ui/countdownEdit.mjs index 2098fb10..1844538c 100644 --- a/module/applications/ui/countdownEdit.mjs +++ b/module/applications/ui/countdownEdit.mjs @@ -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; diff --git a/module/applications/ui/countdowns.mjs b/module/applications/ui/countdowns.mjs index 55df92b9..d7d3d25f 100644 --- a/module/applications/ui/countdowns.mjs +++ b/module/applications/ui/countdowns.mjs @@ -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]; diff --git a/module/config/actionConfig.mjs b/module/config/actionConfig.mjs index 3c669a7b..d64fd9e9 100644 --- a/module/config/actionConfig.mjs +++ b/module/config/actionConfig.mjs @@ -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', diff --git a/module/config/generalConfig.mjs b/module/config/generalConfig.mjs index 6ecc76e6..2c2b1316 100644 --- a/module/config/generalConfig.mjs +++ b/module/config/generalConfig.mjs @@ -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' } }; diff --git a/module/data/_module.mjs b/module/data/_module.mjs index 2749bfce..0a476ee9 100644 --- a/module/data/_module.mjs +++ b/module/data/_module.mjs @@ -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'; diff --git a/module/data/action/_module.mjs b/module/data/action/_module.mjs index 7f7a2c82..9cfc48cb 100644 --- a/module/data/action/_module.mjs +++ b/module/data/action/_module.mjs @@ -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, diff --git a/module/data/action/attackAction.mjs b/module/data/action/attackAction.mjs index 68afc23b..ed97072f 100644 --- a/module/data/action/attackAction.mjs +++ b/module/data/action/attackAction.mjs @@ -37,8 +37,10 @@ export default class DHAttackAction extends DHDamageAction { async use(event, options) { const result = await super.use(event, options); - const { updateCountdowns } = game.system.api.applications.ui.DhCountdowns; - await updateCountdowns(CONFIG.DH.GENERAL.countdownTypes.characterAttack.id); + if (result.message.system.action.roll?.type === 'attack') { + const { updateCountdowns } = game.system.api.applications.ui.DhCountdowns; + await updateCountdowns(CONFIG.DH.GENERAL.countdownProgressionTypes.characterAttack.id); + } return result; } diff --git a/module/data/action/baseAction.mjs b/module/data/action/baseAction.mjs index ba401ae9..6960de11 100644 --- a/module/data/action/baseAction.mjs +++ b/module/data/action/baseAction.mjs @@ -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. * diff --git a/module/data/action/countdownAction.mjs b/module/data/action/countdownAction.mjs new file mode 100644 index 00000000..a22285d9 --- /dev/null +++ b/module/data/action/countdownAction.mjs @@ -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; + } +} diff --git a/module/data/countdowns.mjs b/module/data/countdowns.mjs index 6db4cbeb..b3ef9a54 100644 --- a/module/data/countdowns.mjs +++ b/module/data/countdowns.mjs @@ -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' }) }) diff --git a/module/data/fields/action/_module.mjs b/module/data/fields/action/_module.mjs index 7a33e147..ef69394a 100644 --- a/module/data/fields/action/_module.mjs +++ b/module/data/fields/action/_module.mjs @@ -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'; diff --git a/module/data/fields/action/countdownField.mjs b/module/data/fields/action/countdownField.mjs new file mode 100644 index 00000000..2a3b3d69 --- /dev/null +++ b/module/data/fields/action/countdownField.mjs @@ -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; + } +} diff --git a/module/data/fields/actionField.mjs b/module/data/fields/actionField.mjs index ffe8bb53..6c37f153 100644 --- a/module/data/fields/actionField.mjs +++ b/module/data/fields/actionField.mjs @@ -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', diff --git a/module/data/settings/Automation.mjs b/module/data/settings/Automation.mjs index fbded2de..2aec990f 100644 --- a/module/data/settings/Automation.mjs +++ b/module/data/settings/Automation.mjs @@ -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, diff --git a/module/dice/dhRoll.mjs b/module/dice/dhRoll.mjs index 7fe90711..e6856dab 100644 --- a/module/dice/dhRoll.mjs +++ b/module/dice/dhRoll.mjs @@ -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) || diff --git a/module/systemRegistration/handlebars.mjs b/module/systemRegistration/handlebars.mjs index 2bf820c1..2b87dda1 100644 --- a/module/systemRegistration/handlebars.mjs +++ b/module/systemRegistration/handlebars.mjs @@ -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', diff --git a/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json b/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json index c04d1a65..8abd4129 100644 --- a/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json +++ b/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json @@ -611,14 +611,14 @@ "name": "Hallucinatory Breath", "type": "feature", "system": { - "description": "

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 3d8+3 direct magic damage.

@Template[type:inFront|range:f]

", + "description": "

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 3d8+3 direct magic damage.

@Template[type:inFront|range:f]

", "resource": null, "actions": { "YOyKyKGTUEWkMmJe": { "type": "attack", "_id": "YOyKyKGTUEWkMmJe", "systemPath": "actions", - "description": "

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 3d8+3 direct magic damage.

@Template[type:inFront|range:f]

", + "description": "

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 3d8+3 direct magic damage.

@Template[type:inFront|range:f]

", "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": "

Countdown (Loop 1d6). When the Flickerfly takes damage for the first time, activate the countdown.

", + "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" }, diff --git a/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json b/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json index c8f0b0d1..031786a9 100644 --- a/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json +++ b/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json @@ -712,36 +712,14 @@ "name": "Your Life Is Mine", "type": "feature", "system": { - "description": "

Countdown (Loop 2d6). When the Necromancer has marked 6 or more of their HP, activate the countdown. When it triggers, deal 2d10+6 direct magic damage to a target within Close range. The Necromancer then clears a number of Stress or HP equal to the number of HP marked by the target from this attack.

", + "description": "

Countdown (Loop 2d6). When the Necromancer has marked 6 or more of their HP, activate the countdown. When it triggers, deal 2d10+6 direct magic damage to a target within Close range. The Necromancer then clears a number of Stress or HP equal to the number of HP marked by the target from this attack.

", "resource": null, "actions": { - "Gd70IsPckAFOw0ha": { - "type": "effect", - "_id": "Gd70IsPckAFOw0ha", - "systemPath": "actions", - "description": "

Countdown (Loop 2d6). When the Necromancer has marked 6 or more of their HP, activate the countdown.

", - "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": "

When the countdown triggers, deal 2d10+6 direct magic damage to a target within Close range. The Necromancer then clears a number of Stress or HP equal to the number of HP marked by the target from this attack.

", + "description": "

Deal 2d10+6 direct magic damage to a target within Close range. The Necromancer then clears a number of Stress or HP equal to the number of HP marked by the target from this attack.

", "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": "

Countdown (Loop 2d6). When the Necromancer has marked 6 or more of their HP, activate the countdown.

", + "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" } diff --git a/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json b/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json index 027383e2..f442da25 100644 --- a/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json +++ b/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json @@ -447,9 +447,72 @@ "name": "Blood and Souls", "type": "feature", "system": { - "description": "

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.

", + "description": "

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.

", "resource": null, - "actions": {}, + "actions": { + "szg3qA09aJUt9WKS": { + "type": "countdown", + "_id": "szg3qA09aJUt9WKS", + "systemPath": "actions", + "description": "

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.

", + "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": "

Summon [[/r 1d4]]@UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demons}, who appear at Close range.

", + "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" } diff --git a/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json b/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json index 22408c0e..5eae4f5a 100644 --- a/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json +++ b/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json @@ -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" } diff --git a/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json b/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json index 43edbc70..ad396a8f 100644 --- a/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json +++ b/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json @@ -493,31 +493,9 @@ "name": "Shackles of Guilt", "type": "feature", "system": { - "description": "

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.

@Template[type:emanation|range:f]

", + "description": "

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.

@Template[type:emanation|range:f]

", "resource": null, "actions": { - "11mqihmiBK41aoDm": { - "type": "effect", - "_id": "11mqihmiBK41aoDm", - "systemPath": "actions", - "description": "

Countdown (Loop 2d6). When the Sorcerer is in the spotlight for the first time, activate the countdown.

", - "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": "

Countdown (Loop 2d6). When the Sorcerer is in the spotlight for the first time, activate the countdown.

", + "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" } diff --git a/src/packs/adversaries/adversary_Fallen_Warlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json b/src/packs/adversaries/adversary_Fallen_Warlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json index 2b44b8df..423c40d2 100644 --- a/src/packs/adversaries/adversary_Fallen_Warlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json +++ b/src/packs/adversaries/adversary_Fallen_Warlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json @@ -521,31 +521,9 @@ "name": "All-Consuming Rage", "type": "feature", "system": { - "description": "

Countdown (Decreasing 8). 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 2d6+10 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.

@Template[type:emanation|range:f]

", + "description": "

Countdown (Decreasing 8). 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 2d6+10 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.

@Template[type:emanation|range:f]

", "resource": null, "actions": { - "58JxEuvnjaAlgs3E": { - "type": "effect", - "_id": "58JxEuvnjaAlgs3E", - "systemPath": "actions", - "description": "

Countdown (Decreasing 8). When the Realm-Breaker is in the spotlight for the first time, activate the countdown.

", - "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": "

Countdown (Decreasing 8). When the Realm-Breaker is in the spotlight for the first time, activate the countdown.

", + "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" }, diff --git a/src/packs/adversaries/adversary_Fallen_Warlord__Undefeated_Champion_RXkZTwBRi4dJ3JE5.json b/src/packs/adversaries/adversary_Fallen_Warlord__Undefeated_Champion_RXkZTwBRi4dJ3JE5.json index 5e1beba4..1666ee1c 100644 --- a/src/packs/adversaries/adversary_Fallen_Warlord__Undefeated_Champion_RXkZTwBRi4dJ3JE5.json +++ b/src/packs/adversaries/adversary_Fallen_Warlord__Undefeated_Champion_RXkZTwBRi4dJ3JE5.json @@ -578,36 +578,14 @@ "name": "Circle of Defilement", "type": "feature", "system": { - "description": "

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.

", + "description": "

Countdown (1d8). 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.

", "resource": null, "actions": { - "oRenRHpOIjRqYNUG": { - "type": "effect", - "_id": "oRenRHpOIjRqYNUG", - "systemPath": "actions", - "description": "

Countdown (1d8). When the Undefeated Champion is in the spotlight for the fi rst time, activate the countdown.

", - "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": "

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.

", + "description": "

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.

", "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": "

Countdown (1d8). When the Undefeated Champion is in the spotlight for the first time, activate the countdown.

", + "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" }, diff --git a/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json b/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json index 5b7ad344..ed8cf539 100644 --- a/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json +++ b/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json @@ -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": "

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.

", + "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" }, diff --git a/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json b/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json index a191ee03..bbe7e153 100644 --- a/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json +++ b/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json @@ -332,9 +332,46 @@ "_id": "YeJ7eJVCKsRxG8mk", "img": "icons/skills/ranged/target-bullseye-arrow-blue.webp", "system": { - "description": "

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.

@Template[type:emanation|range:f]

", + "description": "

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.

@Template[type:emanation|range:f]

", "resource": null, - "actions": {}, + "actions": { + "xyhaCmPGiVMsTViH": { + "type": "countdown", + "_id": "xyhaCmPGiVMsTViH", + "systemPath": "actions", + "description": "

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.

", + "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" }, diff --git a/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json b/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json index 77b107ec..3084864e 100644 --- a/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json +++ b/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json @@ -514,14 +514,14 @@ "name": "Hallucinatory Breath", "type": "feature", "system": { - "description": "

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.

@Template[type:inFront|range:f]

", + "description": "

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.

@Template[type:inFront|range:f]

", "resource": null, "actions": { "USEkCakSzYcZbBwY": { "type": "attack", "_id": "USEkCakSzYcZbBwY", "systemPath": "actions", - "description": "

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.

@Template[type:inFront|range:f]

", + "description": "

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.

@Template[type:inFront|range:f]

", "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": "

Countdown (Loop 1d6). When the Flickerfly takes damage for the first time, activate the countdown.

", + "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" } diff --git a/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json b/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json index b4868595..56d5fedb 100644 --- a/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json +++ b/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json @@ -338,35 +338,124 @@ "name": "Casus Belli", "type": "feature", "system": { - "description": "

Long-Term Countdown (8). Spend a Fear to activate after the Monarch’s 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]] Fear.

", + "description": "

Long-Term Countdown (8). Spend a Fear to activate after the Monarch’s 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]] Fear.

", "resource": null, "actions": { - "X01RPfbvh3DUWcQY": { - "type": "effect", - "_id": "X01RPfbvh3DUWcQY", + "CNEOOdPI4xVJ2JeP": { + "type": "countdown", + "_id": "CNEOOdPI4xVJ2JeP", "systemPath": "actions", - "description": "", + "description": "

Long-Term Countdown (8). Spend a Fear to activate after the Monarch’s desire for war is first revealed.

", "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": "

The Monarch has a reason to rally the nation to war and the support to act on that reason. You gain 1d4 Fear.

", + "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" } diff --git a/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json b/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json index 8c2332aa..1bbe078b 100644 --- a/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json +++ b/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json @@ -523,36 +523,14 @@ "name": "Rampage", "type": "feature", "system": { - "description": "

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 2d8+2 physical damage.

@Template[type:ray|range:f]

", + "description": "

Countdown (Loop 1d6). 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 2d8+2 physical damage.

@Template[type:ray|range:f]

", "resource": null, "actions": { - "JGGTfZWI65nywjSu": { - "type": "effect", - "_id": "JGGTfZWI65nywjSu", - "systemPath": "actions", - "description": "

Countdown (Loop 1d6). When the Hunter is in the spotlight for the first time, activate the countdown.

", - "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": "

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 2d8+2 physical damage.

@Template[type:ray|range:f]

", + "description": "

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 2d8+2 physical damage.

@Template[type:ray|range:f]

", "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": "

Countdown (Loop 1d6). When the Hunter is in the spotlight for the first time, activate the countdown.

", + "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" } diff --git a/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json b/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json index ac2dc316..9e16426e 100644 --- a/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json +++ b/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json @@ -437,36 +437,14 @@ "name": "Summoning Ritual", "type": "feature", "system": { - "description": "

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.

", + "description": "

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.

", "resource": null, "actions": { - "PrShdg9N3MfeZaJc": { - "type": "effect", - "_id": "PrShdg9N3MfeZaJc", - "systemPath": "actions", - "description": "

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.

", - "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": "

When the countdown triggers, summon a @UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demon} who appears at Close range.

", + "description": "

Summon a @UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demon} who appears at Close range.

", "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": "

Countdown (6). When the Secret-Keeper is in the spotlight for the first time, activate the countdown.

", + "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" }, diff --git a/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json b/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json index 45e01348..19865d9f 100644 --- a/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json +++ b/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json @@ -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": "

The rubble can be cleared with a Progress Countdown (8).

", + "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" }, diff --git a/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json b/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json index 80a8230c..64e6f4f9 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json @@ -746,31 +746,9 @@ "name": "Apocalyptic Thrasing", "type": "feature", "system": { - "description": "

Countdown (1d12). Spend a Fear 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.

@Template[type:emanation|range:f]

", + "description": "

Countdown (1d12). Spend a Fear 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.

@Template[type:emanation|range:f]

", "resource": null, "actions": { - "V6gTCvCcUXf3oKwF": { - "type": "effect", - "_id": "V6gTCvCcUXf3oKwF", - "systemPath": "actions", - "description": "

Countdown (1d12). Spend a Fear to activate. It ticks down when a PC rolls with Fear.

", - "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": "

Countdown (1d12). Spend a Fear to activate. It ticks down when a PC rolls with Fear.

", + "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" } diff --git a/src/packs/domains/domainCard_Mass_Disguise_dT95m0Jam8sWbeuC.json b/src/packs/domains/domainCard_Mass_Disguise_dT95m0Jam8sWbeuC.json index b715c94a..704feaa5 100644 --- a/src/packs/domains/domainCard_Mass_Disguise_dT95m0Jam8sWbeuC.json +++ b/src/packs/domains/domainCard_Mass_Disguise_dT95m0Jam8sWbeuC.json @@ -36,6 +36,42 @@ "name": "Cast", "img": "icons/skills/social/diplomacy-unity-alliance.webp", "range": "close" + }, + "ZM96wFu3YuAeUXel": { + "type": "countdown", + "_id": "ZM96wFu3YuAeUXel", + "systemPath": "actions", + "description": "

Activate a Countdown (8). It ticks down as a consequence the GM chooses. When it triggers, the disguise drops.

", + "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, diff --git a/src/packs/environments/environment_Burning_Heart_of_the_Woods_oY69NN4rYxoRE4hl.json b/src/packs/environments/environment_Burning_Heart_of_the_Woods_oY69NN4rYxoRE4hl.json index 5683f6f5..0abe95cf 100644 --- a/src/packs/environments/environment_Burning_Heart_of_the_Woods_oY69NN4rYxoRE4hl.json +++ b/src/packs/environments/environment_Burning_Heart_of_the_Woods_oY69NN4rYxoRE4hl.json @@ -463,36 +463,14 @@ "name": "Choking Ash", "type": "feature", "system": { - "description": "

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 4d6+5 direct physical damage. Targets who succeed take half damage. Protective masks or clothes give advantage on the reaction roll.

What hallucinations does the ash induce? What incongruous taste does it possess?

", + "description": "

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 4d6+5 direct physical damage. Targets who succeed take half damage. Protective masks or clothes give advantage on the reaction roll.

What hallucinations does the ash induce? What incongruous taste does it possess?

", "resource": null, "actions": { - "U9O0nh0LkdKzjIXS": { - "type": "effect", - "_id": "U9O0nh0LkdKzjIXS", - "systemPath": "actions", - "description": "

Countdown (Loop 6). When the PCs enter the Burning Heart of the Woods, activate the countdown.

What hallucinations does the ash induce? What incongruous taste does it possess?

", - "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": "

When the countdown triggers, all characters must make a Strength or Instinct Reaction Roll. Targets who fail take 4d6+5 direct physical damage. Targets who succeed take half damage. Protective masks or clothes give advantage on the reaction roll.

What hallucinations does the ash induce? What incongruous taste does it possess?

", + "description": "

All characters must make a Strength or Instinct Reaction Roll. Targets who fail take 4d6+5 direct physical damage. Targets who succeed take half damage. Protective masks or clothes give advantage on the reaction roll.

What hallucinations does the ash induce? What incongruous taste does it possess?

", "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": "

Countdown (Loop 6). When the PCs enter the Burning Heart of the Woods, activate the countdown.

", + "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" } diff --git a/src/packs/environments/environment_Bustling_Marketplace_HZKA7hkej7JJY503.json b/src/packs/environments/environment_Bustling_Marketplace_HZKA7hkej7JJY503.json index 11b458c1..93a2c22c 100644 --- a/src/packs/environments/environment_Bustling_Marketplace_HZKA7hkej7JJY503.json +++ b/src/packs/environments/environment_Bustling_Marketplace_HZKA7hkej7JJY503.json @@ -216,7 +216,7 @@ "name": "Sticky Fingers", "type": "feature", "system": { - "description": "

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 GM’s 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.

What drove this person to pickpocketing? Where is the thief’s hideout and how has it avoided notice?

", + "description": "

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 GM’s 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.

What drove this person to pickpocketing? Where is the thief’s hideout and how has it avoided notice?

", "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": "

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.

", - "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 - }, - "name": "Countdowns", - "img": "icons/magic/time/hourglass-tilted-glowing-gold.webp", + "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 + }, + "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" }, diff --git a/src/packs/environments/environment_Castle_Siege_1eZ32Esq7rfZOjlu.json b/src/packs/environments/environment_Castle_Siege_1eZ32Esq7rfZOjlu.json index 88d9096e..cbeba54f 100644 --- a/src/packs/environments/environment_Castle_Siege_1eZ32Esq7rfZOjlu.json +++ b/src/packs/environments/environment_Castle_Siege_1eZ32Esq7rfZOjlu.json @@ -187,36 +187,14 @@ "name": "Siege Weapons (Environment Change)", "type": "feature", "system": { - "description": "

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.

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?

", + "description": "

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’ fortifications have been breached and the attackers fl ood inside. You gain 2 Fear, then shift to the Pitched Battle environment and spotlight it.

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?

", "resource": null, "actions": { - "F89TDp557TJ1vvgm": { - "type": "effect", - "_id": "F89TDp557TJ1vvgm", - "systemPath": "actions", - "description": "

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).

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?

", - "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": "

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.

", + "description": "

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.

", "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": "

Consequence Countdown (6). 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).

", + "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" }, diff --git a/src/packs/environments/environment_Chaos_Realm_2Z1mKc65LxNk2PqR.json b/src/packs/environments/environment_Chaos_Realm_2Z1mKc65LxNk2PqR.json index a2947aa3..ff130b70 100644 --- a/src/packs/environments/environment_Chaos_Realm_2Z1mKc65LxNk2PqR.json +++ b/src/packs/environments/environment_Chaos_Realm_2Z1mKc65LxNk2PqR.json @@ -144,7 +144,7 @@ "name": "Impossible Architecture", "type": "feature", "system": { - "description": "

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 roll’s other consequences.

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?

", + "description": "

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 Progress Countdown (8). On a failure, a PC must mark a Stress in addition to the roll’s other consequences.

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?

", "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": "

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 Progress Countdown (8).

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?

", + "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": "

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.

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?

", + "description": "

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.

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?

", "resource": null, "actions": { - "IexEUqnefrcD0VCz": { - "type": "attack", - "_id": "IexEUqnefrcD0VCz", - "systemPath": "actions", - "description": "

Countdown (Loop 1d4). Activate the countdown.

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?

", - "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": "

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.

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?

", + "description": "

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.

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?

", "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": "

Countdown (Loop 1d4). Activate the countdown.

", + "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" }, diff --git a/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json b/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json index ab8daf7d..d4807e68 100644 --- a/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json +++ b/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json @@ -145,28 +145,42 @@ "name": "The Climb", "type": "feature", "system": { - "description": "

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:

When the countdown triggers, the party has made it to the top of the cliff .

What strange formations are the stones arranged in? What ominous warnings did previous adventurers leave?

", + "description": "

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:

When the countdown triggers, the party has made it to the top of the cliff .

What strange formations are the stones arranged in? What ominous warnings did previous adventurers leave?

", "resource": null, "actions": { - "6GVdM7pIOpieLRA8": { - "type": "effect", - "_id": "6GVdM7pIOpieLRA8", + "TMEBwqlfvL3mb3hQ": { + "type": "countdown", + "_id": "TMEBwqlfvL3mb3hQ", "systemPath": "actions", - "description": "

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:

When the countdown triggers, the party has made it to the top of the cliff .

What strange formations are the stones arranged in? What ominous warnings did previous adventurers leave?

", + "description": "

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:

When the countdown triggers, the party has made it to the top of the cliff .

What strange formations are the stones arranged in? What ominous warnings did previous adventurers leave?

", "chatDisplay": true, + "originItem": { + "type": "itemCollection" + }, "actionType": "action", "cost": [], "uses": { "value": null, "max": "", - "recovery": null + "recovery": null, + "consumeOnSuccess": false }, - "effects": [], - "target": { - "type": "any", - "amount": null - }, - "name": "Countdown", + "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 + }, + "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" }, diff --git a/src/packs/environments/environment_Cult_Ritual_QAXXiOKBDmCTauHD.json b/src/packs/environments/environment_Cult_Ritual_QAXXiOKBDmCTauHD.json index ded1d14f..ae7902e2 100644 --- a/src/packs/environments/environment_Cult_Ritual_QAXXiOKBDmCTauHD.json +++ b/src/packs/environments/environment_Cult_Ritual_QAXXiOKBDmCTauHD.json @@ -345,9 +345,72 @@ "name": "The Summoning", "type": "feature", "system": { - "description": "

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 ritual’s leader. If the leader is defeated, the countdown ends with no effect as the ritual fails.

What will the cult do with this leashed demon if they succeed? What will they try to summon next?

", + "description": "

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 @UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demon} within Very Close range of the ritual’s leader. If the leader is defeated, the countdown ends with no effect as the ritual fails.

What will the cult do with this leashed demon if they succeed? What will they try to summon next?

", "resource": null, - "actions": {}, + "actions": { + "bUIfzuWd1VfiV8sc": { + "type": "countdown", + "_id": "bUIfzuWd1VfiV8sc", + "systemPath": "actions", + "description": "

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.

", + "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": "

Summon a @UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demon} within Very Close range of the ritual’s leader.

", + "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" }, diff --git a/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json b/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json index 38821a59..d6540a11 100644 --- a/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json +++ b/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json @@ -146,36 +146,14 @@ "name": "Final Preparations", "type": "feature", "system": { - "description": "

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.

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?

", + "description": "

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.

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?

", "resource": null, "actions": { - "pnAJNmZApL1Acsj1": { - "type": "effect", - "_id": "pnAJNmZApL1Acsj1", - "systemPath": "actions", - "description": "

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.

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?

", - "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": "

When the countdown triggers, spotlight this environment to use the “Beginning of the End” feature.

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?

", + "description": "

Spotlight this environment to use the “Beginning of the End” feature.

", "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": "

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.

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?

", + "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": "

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 Usurper’s 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.

How does the Mortal Realm writhe as the natural order is violated? What mortals witness this blasphemy from afar?

", + "description": "

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 Usurper’s 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.

How does the Mortal Realm writhe as the natural order is violated? What mortals witness this blasphemy from afar?

", "resource": null, "actions": { - "lUTJqI8Z9AR7t4B2": { - "type": "effect", - "_id": "lUTJqI8Z9AR7t4B2", - "systemPath": "actions", - "description": "

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).

How does the Mortal Realm writhe as the natural order is violated? What mortals witness this blasphemy from afar?

", - "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": "

Spotlight the Usurper to describe the Usurper’s assault and tick down the countdown by 1.

How does the Mortal Realm writhe as the natural order is violated? What mortals witness this blasphemy from afar?

", + "description": "

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.

", "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": "

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 Usurper’s assault and tick down this countdown by 1. If the Usurper takes Major or greater damage, tick up the countdown by 1.

How does the Mortal Realm writhe as the natural order is violated? What mortals witness this blasphemy from afar?

", + "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" }, diff --git a/src/packs/environments/environment_Haunted_City_OzYbizKraK92FDiI.json b/src/packs/environments/environment_Haunted_City_OzYbizKraK92FDiI.json index 0653ae50..c3a3b60c 100644 --- a/src/packs/environments/environment_Haunted_City_OzYbizKraK92FDiI.json +++ b/src/packs/environments/environment_Haunted_City_OzYbizKraK92FDiI.json @@ -323,28 +323,51 @@ "name": "Apocalypse Then", "type": "feature", "system": { - "description": "

Spend a Fear 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.

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?

", + "description": "

Spend a Fear 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.

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?

", "resource": null, "actions": { - "7H16PYHHgK0Z34NU": { - "type": "effect", - "_id": "7H16PYHHgK0Z34NU", + "VhqZKDA4032i8zY3": { + "type": "countdown", + "_id": "VhqZKDA4032i8zY3", "systemPath": "actions", - "description": "

Spend a Fear to manifest the echo of a past disaster that ravaged the city. Activate a Progress Countdown (5) as the disaster replays around the PCs.

", + "description": "

Spend a Fear 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.

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?

", "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 - }, - "name": "Countdown", + "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 + }, + "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" } diff --git a/src/packs/environments/environment_Mountain_Pass_acMu9wJrMZZzLSTJ.json b/src/packs/environments/environment_Mountain_Pass_acMu9wJrMZZzLSTJ.json index bb538c95..8f6a2bf3 100644 --- a/src/packs/environments/environment_Mountain_Pass_acMu9wJrMZZzLSTJ.json +++ b/src/packs/environments/environment_Mountain_Pass_acMu9wJrMZZzLSTJ.json @@ -303,36 +303,14 @@ "name": "Icy Winds", "type": "feature", "system": { - "description": "

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.

What parts of the PC’s bodies go numb fi rst? How do they try to keep warm as they press forward?

", + "description": "

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.

What parts of the PC’s bodies go numb fi rst? How do they try to keep warm as they press forward?

", "resource": null, "actions": { - "P6U45vsXJmEW6BBj": { - "type": "effect", - "_id": "P6U45vsXJmEW6BBj", - "systemPath": "actions", - "description": "

Countdown (Loop 4). When the PCs enter the mountain pass, activate the countdown.

What parts of the PC’s bodies go numb fi rst? How do they try to keep warm as they press forward?

", - "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": "

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.

What parts of the PC’s bodies go numb fi rst? How do they try to keep warm as they press forward?

", + "description": "

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.

What parts of the PC’s bodies go numb fi rst? How do they try to keep warm as they press forward?

", "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": "

Countdown (Loop 4). When the PCs enter the mountain pass, activate the countdown.

", + "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" } diff --git a/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json b/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json index 79c89611..6ef44f84 100644 --- a/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json +++ b/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json @@ -154,28 +154,42 @@ "name": "Dangerous Crossing", "type": "feature", "system": { - "description": "

Crossing the river requires the party to complete a Progress Countdown (4).

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.

Have any of the PCs forded rivers like this before? Are any of them afraid of drowning?

", + "description": "

Crossing the river requires the party to complete a Progress Countdown (4).

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.

Have any of the PCs forded rivers like this before? Are any of them afraid of drowning?

", "resource": null, "actions": { - "miodf3TMFrGRCvj6": { - "type": "effect", - "_id": "miodf3TMFrGRCvj6", + "91HPIEEcVKPQ5qqn": { + "type": "countdown", + "_id": "91HPIEEcVKPQ5qqn", "systemPath": "actions", - "description": "

Crossing the river requires the party to complete a Progress Countdown (4).

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.

Have any of the PCs forded rivers like this before? Are any of them afraid of drowning?

", + "description": "

Crossing the river requires the party to complete a Progress Countdown (4).

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.

Have any of the PCs forded rivers like this before? Are any of them afraid of drowning?

", "chatDisplay": true, + "originItem": { + "type": "itemCollection" + }, "actionType": "action", "cost": [], "uses": { "value": null, "max": "", - "recovery": null + "recovery": null, + "consumeOnSuccess": false }, - "effects": [], - "target": { - "type": "any", - "amount": null - }, - "name": "Countdown", + "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 + }, + "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" }, diff --git a/styles/less/ui/countdown/countdown-edit.less b/styles/less/ui/countdown/countdown-edit.less index c8092403..7a99f8d7 100644 --- a/styles/less/ui/countdown/countdown-edit.less +++ b/styles/less/ui/countdown/countdown-edit.less @@ -63,58 +63,75 @@ scrollbar-width: thin; scrollbar-color: light-dark(@dark-blue, @golden) transparent; - .countdown-edit-container { - display: grid; - grid-template-columns: 48px 1fr 68px; - align-items: center; + .countdown-edit-outer-container { + display: flex; + flex-direction: column; + align-items: flex-start; gap: 8px; - img { - width: 52px; - height: 52px; - border-radius: 6px; - } - - .countdown-edit-text { - display: flex; - flex-direction: column; - justify-content: center; + .countdown-edit-container { + width: 100%; + display: grid; + grid-template-columns: 48px 1fr 72px; + align-items: center; gap: 8px; - .countdown-edit-subtext { + img { + width: 52px; + height: 52px; + border-radius: 6px; + } + + .countdown-edit-text { display: flex; - gap: 10px; + flex-direction: column; + justify-content: center; + gap: 8px; - .countdown-edit-sub-tag { - padding: 3px 5px; - font-size: var(--font-size-12); - font: @font-body; + .countdown-edit-subtext { + display: flex; + align-items: center; + gap: 10px; - background: light-dark(@dark-15, @beige-15); - border: 1px solid light-dark(@dark, @beige); - border-radius: 3px; + .countdown-edit-sub-tag { + padding: 3px 5px; + font-size: var(--font-size-12); + font: @font-body; + + background: light-dark(@dark-15, @beige-15); + border: 1px solid light-dark(@dark, @beige); + border-radius: 3px; + } + + .countdown-edit-loop { + position: relative; + + .loop-marker { + position: absolute; + top: -4px; + font-size: 10px; + } + } + } + } + + .countdown-edit-tools { + display: flex; + gap: 8px; + + &.same-row { + margin-top: 17.5px; + } + + a { + font-size: 16px; } } } - - .countdown-edit-tools { - display: flex; - gap: 8px; - - &.same-row { - margin-top: 17.5px; - } - - a { - font-size: 16px; - } - } } - .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 { diff --git a/styles/less/ui/countdown/countdown.less b/styles/less/ui/countdown/countdown.less index 4adeff87..829a59b5 100644 --- a/styles/less/ui/countdown/countdown.less +++ b/styles/less/ui/countdown/countdown.less @@ -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,6 +76,7 @@ } .countdown-content { + flex: 1; display: flex; flex-direction: column; justify-content: space-between; @@ -82,7 +84,13 @@ .countdown-tools { display: flex; align-items: center; - gap: 16px; + justify-content: space-between; + + .countdown-tool-controls { + display: flex; + align-items: center; + gap: 16px; + } .progress-tag { border: 1px solid; @@ -90,32 +98,53 @@ padding: 2px 4px; background-color: light-dark(@beige, @dark-blue); } + + .countdown-tool-icons { + display: flex; + align-items: 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-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; - display: flex; - align-items: center; - justify-content: center; - } + // .countdown-access { + // height: 10px; + // width: 10px; + // border-radius: 50%; + // border: 1px solid light-dark(@dark-blue, @beige-80); + // content: ''; + // } + // } } } } diff --git a/system.json b/system.json index 0d564b0f..25e6e2f9 100644 --- a/system.json +++ b/system.json @@ -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", diff --git a/templates/actionTypes/countdown.hbs b/templates/actionTypes/countdown.hbs new file mode 100644 index 00000000..360b1172 --- /dev/null +++ b/templates/actionTypes/countdown.hbs @@ -0,0 +1,22 @@ +
+ + {{localize "DAGGERHEART.ACTIONS.TYPES.countdown.name"}} + + + {{#each source as |countdown index|}} +
+ {{formField ../fields.name value=countdown.name name=(concat "countdown." index ".name") localize=true}} + +
+
+ {{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}} +
+ {{formField ../fields.img value=countdown.img name=(concat "countdown." index ".img") label="DAGGERHEART.GENERAL.imagePath" localize=true}} +
+ {{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}} +
+ {{/each}} +
\ No newline at end of file diff --git a/templates/settings/automation-settings/general.hbs b/templates/settings/automation-settings/general.hbs index 8921ab6a..d49ef9b8 100644 --- a/templates/settings/automation-settings/general.hbs +++ b/templates/settings/automation-settings/general.hbs @@ -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}} + {{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}} diff --git a/templates/sheets-settings/action-settings/effect.hbs b/templates/sheets-settings/action-settings/effect.hbs index 51c15aae..bf2f3aa1 100644 --- a/templates/sheets-settings/action-settings/effect.hbs +++ b/templates/sheets-settings/action-settings/effect.hbs @@ -1,4 +1,4 @@ -
'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}}
\ No newline at end of file diff --git a/templates/ui/countdown-edit.hbs b/templates/ui/countdown-edit.hbs index b95a8471..41e3cf67 100644 --- a/templates/ui/countdown-edit.hbs +++ b/templates/ui/countdown-edit.hbs @@ -22,6 +22,7 @@
{{#each countdowns as | countdown id | }} +
{{#unless countdown.editing}} @@ -32,6 +33,17 @@
{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.currentCountdownMax" value=countdown.progress.max}}
{{countdown.typeName}}
{{countdown.progress.typeName}}
+ + {{#unless (eq countdown.progress.looping "noLooping")}} +
+ + {{#if (eq countdown.progress.looping "increasing")}} + + {{else if (eq countdown.progress.looping "decreasing")}} + + {{/if}} +
+ {{/unless}}
{{else}} @@ -56,20 +68,27 @@ -
+
- + +
+
+ +
{{/if}} + {{/each}} diff --git a/templates/ui/countdowns.hbs b/templates/ui/countdowns.hbs index 122b36e6..2480ccdb 100644 --- a/templates/ui/countdowns.hbs +++ b/templates/ui/countdowns.hbs @@ -7,26 +7,35 @@
{{#unless ../iconOnly}}{{/unless}}
- {{#if countdown.editable}}{{/if}} -
- {{countdown.progress.current}}/{{countdown.progress.max}} +
+ {{#if countdown.editable}}{{/if}} +
+ {{countdown.progress.current}}/{{countdown.progress.max}} +
+ {{#if countdown.editable}}{{/if}} +
+
+ {{#if (not ../iconOnly)}} + {{#if (and countdown.noPlayerAccess @root.isGM)}} + + {{/if}} + {{#unless (eq countdown.progress.looping "noLooping")}} + + + + {{#if (eq countdown.progress.looping "increasing")}} + + {{else if (eq countdown.progress.looping "decreasing")}} + + {{/if}} + + + {{/unless}} + {{/if}}
- {{#if countdown.editable}}{{/if}}
- {{#if (and @root.isGM (not ../iconOnly))}} - {{#if (gt countdown.playerAccess.length 0)}} -
- {{#each countdown.playerAccess as |player|}} -
- {{/each}} -
- {{/if}} - {{#if countdown.noPlayerAccess}} -
- {{/if}} - {{/if}} {{/each}}