From e74ce7726a9d7ca535b9fc7950fc3e9b30334f48 Mon Sep 17 00:00:00 2001 From: Nick Salyzyn Date: Wed, 17 Dec 2025 10:42:02 -0700 Subject: [PATCH 01/33] Make wings of light self-target (#1426) --- .../subclasses/feature_Wings_of_Light_KkQH0tYhagIqe2MT.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/packs/subclasses/feature_Wings_of_Light_KkQH0tYhagIqe2MT.json b/src/packs/subclasses/feature_Wings_of_Light_KkQH0tYhagIqe2MT.json index f7157194..5b86e348 100644 --- a/src/packs/subclasses/feature_Wings_of_Light_KkQH0tYhagIqe2MT.json +++ b/src/packs/subclasses/feature_Wings_of_Light_KkQH0tYhagIqe2MT.json @@ -69,12 +69,12 @@ } ], "target": { - "type": "any", + "type": "self", "amount": null }, "name": "Spend Hope", "img": "icons/magic/light/projectile-beam-yellow.webp", - "range": "" + "range": "self" } }, "originItemType": null, From 05dec9fcea45ee6dd8f7d589bb06bbbc1cd8ddca Mon Sep 17 00:00:00 2001 From: Nick Salyzyn Date: Thu, 18 Dec 2025 05:37:09 -0700 Subject: [PATCH 02/33] Moving chat display to be after processing (#1428) --- module/data/action/baseAction.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/data/action/baseAction.mjs b/module/data/action/baseAction.mjs index 93de0a2d..ae085064 100644 --- a/module/data/action/baseAction.mjs +++ b/module/data/action/baseAction.mjs @@ -193,8 +193,6 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel async use(event) { if (!this.actor) throw new Error("An Action can't be used outside of an Actor context."); - if (this.chatDisplay) await this.toChat(); - let config = this.prepareConfig(event); if (!config) return; @@ -211,6 +209,8 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel if (Hooks.call(`${CONFIG.DH.id}.postUseAction`, this, config) === false) return; + if (this.chatDisplay) await this.toChat(); + return config; } From 0936b46926354799ec1600878204be3a261e2f0f Mon Sep 17 00:00:00 2001 From: Nick Salyzyn Date: Thu, 18 Dec 2025 15:00:02 -0700 Subject: [PATCH 03/33] [PR] Avoid getRollData adding side effects to the system data (#1436) --- module/documents/actor.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index c269b686..35ab5cc6 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -526,7 +526,7 @@ export default class DhpActor extends Actor { /**@inheritdoc */ getRollData() { - const rollData = super.getRollData(); + const rollData = super.getRollData().clone(); rollData.name = this.name; rollData.system = this.system.getRollData(); rollData.prof = this.system.proficiency ?? 1; From 27fe83d9069d668d32d416e5ea773a858a763591 Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Thu, 18 Dec 2025 23:55:25 +0100 Subject: [PATCH 04/33] Fixed so effects are only applied to correct tokens (#1439) --- module/applications/ui/combatTracker.mjs | 18 ++++++++++++------ module/config/encounterConfig.mjs | 1 + module/documents/combat.mjs | 7 ++----- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/module/applications/ui/combatTracker.mjs b/module/applications/ui/combatTracker.mjs index 2ed0e52b..babc4a65 100644 --- a/module/applications/ui/combatTracker.mjs +++ b/module/applications/ui/combatTracker.mjs @@ -5,8 +5,7 @@ export default class DhCombatTracker extends foundry.applications.sidebar.tabs.C actions: { requestSpotlight: this.requestSpotlight, toggleSpotlight: this.toggleSpotlight, - setActionTokens: this.setActionTokens, - openCountdowns: this.openCountdowns + setActionTokens: this.setActionTokens } }; @@ -57,7 +56,10 @@ export default class DhCombatTracker extends foundry.applications.sidebar.tabs.C const adversaries = context.turns?.filter(x => x.isNPC) ?? []; const characters = context.turns?.filter(x => !x.isNPC) ?? []; - const spotlightQueueEnabled = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.SpotlightRequestQueue); + const spotlightQueueEnabled = game.settings.get( + CONFIG.DH.id, + CONFIG.DH.SETTINGS.gameSettings.SpotlightRequestQueue + ); const spotlightRequests = characters ?.filter(x => !x.isNPC && spotlightQueueEnabled) @@ -71,7 +73,9 @@ export default class DhCombatTracker extends foundry.applications.sidebar.tabs.C Object.assign(context, { actionTokens: game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules).actionTokens, adversaries, - characters: characters?.filter(x => !x.isNPC).filter(x => !spotlightQueueEnabled || x.system.spotlight.requestOrderIndex == 0), + characters: characters + ?.filter(x => !x.isNPC) + .filter(x => !spotlightQueueEnabled || x.system.spotlight.requestOrderIndex == 0), spotlightRequests }); } @@ -162,8 +166,10 @@ export default class DhCombatTracker extends foundry.applications.sidebar.tabs.C if (this.viewed.turn !== toggleTurn) { const { updateCountdowns } = game.system.api.applications.ui.DhCountdowns; if (combatant.actor.type === 'character') { - await updateCountdowns(CONFIG.DH.GENERAL.countdownProgressionTypes.spotlight.id, - CONFIG.DH.GENERAL.countdownProgressionTypes.characterSpotlight.id); + await updateCountdowns( + CONFIG.DH.GENERAL.countdownProgressionTypes.spotlight.id, + CONFIG.DH.GENERAL.countdownProgressionTypes.characterSpotlight.id + ); } else { await updateCountdowns(CONFIG.DH.GENERAL.countdownProgressionTypes.spotlight.id); } diff --git a/module/config/encounterConfig.mjs b/module/config/encounterConfig.mjs index 0269b5c1..7565652f 100644 --- a/module/config/encounterConfig.mjs +++ b/module/config/encounterConfig.mjs @@ -84,6 +84,7 @@ export const BPModifiers = { increaseDamage: { sort: 2, description: 'DAGGERHEART.CONFIG.BPModifiers.increaseDamage.description', + effectTargetTypes: ['adversary'], effects: [ { name: 'DAGGERHEART.CONFIG.BPModifiers.increaseDamage.effect.name', diff --git a/module/documents/combat.mjs b/module/documents/combat.mjs index 01cbee61..20996b77 100644 --- a/module/documents/combat.mjs +++ b/module/documents/combat.mjs @@ -28,6 +28,7 @@ export default class DhpCombat extends Combat { ...effect, name: game.i18n.localize(effect.name), description: game.i18n.localize(effect.description), + effectTargetTypes: grouping.effectTargetTypes ?? [], flags: { [`${CONFIG.DH.id}.${CONFIG.DH.FLAGS.combatToggle}`]: { category: toggle.category, @@ -45,11 +46,7 @@ export default class DhpCombat extends Combat { for (let actor of actors) { await actor.createEmbeddedDocuments( 'ActiveEffect', - effects.map(effect => ({ - ...effect, - name: game.i18n.localize(effect.name), - description: game.i18n.localize(effect.description) - })) + effects.filter(x => x.effectTargetTypes.includes(actor.type)) ); } } else { From a8b15c8252a84d756f7b99ebdf74e18822ae2f1f Mon Sep 17 00:00:00 2001 From: Nick Salyzyn Date: Fri, 19 Dec 2025 10:53:25 -0700 Subject: [PATCH 05/33] Fixing Summon Swarm to do damage threshold reduction (#1425) --- .../domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/packs/domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json b/src/packs/domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json index 2fca6775..ededde93 100644 --- a/src/packs/domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json +++ b/src/packs/domains/domainCard_Conjure_Swarm_rZPH0BY8Sznc9sFG.json @@ -208,13 +208,13 @@ }, "changes": [ { - "key": "system.resistance.magical.reduction", + "key": "system.rules.damageReduction.reduceSeverity.magical", "mode": 2, "value": "1", "priority": null }, { - "key": "system.resistance.magical.reduction", + "key": "system.rules.damageReduction.reduceSeverity.physical", "mode": 2, "value": "1", "priority": null From 5f6d08d8c27dca2d998f7fcb1f8b875b5b13ea1c Mon Sep 17 00:00:00 2001 From: Nick Salyzyn Date: Fri, 19 Dec 2025 10:53:44 -0700 Subject: [PATCH 06/33] Fixing spelling error in Elundrian Chain Armor (#1442) --- ...Z.json => armor_Elundrian_Chain_Armor_Q6LxmtFetDDkoZVZ.json} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/packs/items/armors/{armor_Elundrian_Chain_Mail_Q6LxmtFetDDkoZVZ.json => armor_Elundrian_Chain_Armor_Q6LxmtFetDDkoZVZ.json} (97%) diff --git a/src/packs/items/armors/armor_Elundrian_Chain_Mail_Q6LxmtFetDDkoZVZ.json b/src/packs/items/armors/armor_Elundrian_Chain_Armor_Q6LxmtFetDDkoZVZ.json similarity index 97% rename from src/packs/items/armors/armor_Elundrian_Chain_Mail_Q6LxmtFetDDkoZVZ.json rename to src/packs/items/armors/armor_Elundrian_Chain_Armor_Q6LxmtFetDDkoZVZ.json index d8b938fd..abf81dae 100644 --- a/src/packs/items/armors/armor_Elundrian_Chain_Mail_Q6LxmtFetDDkoZVZ.json +++ b/src/packs/items/armors/armor_Elundrian_Chain_Armor_Q6LxmtFetDDkoZVZ.json @@ -1,6 +1,6 @@ { "folder": "hLn0v6ov6KuFgptu", - "name": "Elundrian Chain Mail", + "name": "Elundrian Chain Armor", "type": "armor", "_id": "Q6LxmtFetDDkoZVZ", "img": "icons/equipment/chest/breastplate-sculpted-green.webp", From 474cf28a53621fbb468f647eef859ec732c7a7db Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Fri, 19 Dec 2025 16:57:15 -0500 Subject: [PATCH 07/33] [PR][Feature] Support multiline adversary and character names (#1437) * Support multiline adversary names * Create fake placeholder * Also support multiline character names --- .../sheets/api/application-mixin.mjs | 20 +++++++++++++++++++ styles/less/global/elements.less | 11 +++++++++- .../less/sheets/actors/adversary/header.less | 11 +++++----- .../less/sheets/actors/character/header.less | 11 +++++++--- templates/sheets/actors/adversary/header.hbs | 5 +---- templates/sheets/actors/character/header.hbs | 10 +--------- 6 files changed, 46 insertions(+), 22 deletions(-) diff --git a/module/applications/sheets/api/application-mixin.mjs b/module/applications/sheets/api/application-mixin.mjs index b11fc779..619305f1 100644 --- a/module/applications/sheets/api/application-mixin.mjs +++ b/module/applications/sheets/api/application-mixin.mjs @@ -179,6 +179,7 @@ export default function DHApplicationMixin(Base) { super._attachPartListeners(partId, htmlElement, options); this._dragDrop.forEach(d => d.bind(htmlElement)); + // Handle delta inputs for (const deltaInput of htmlElement.querySelectorAll('input[data-allow-delta]')) { deltaInput.dataset.numValue = deltaInput.value; deltaInput.inputMode = 'numeric'; @@ -232,6 +233,25 @@ export default function DHApplicationMixin(Base) { handleUpdate(); }); } + + // Handle contenteditable + for (const input of htmlElement.querySelectorAll('[contenteditable][data-property]')) { + const property = input.dataset.property; + input.addEventListener("blur", () => { + const selection = document.getSelection(); + if (input.contains(selection.anchorNode)) { + selection.empty(); + } + this.document.update({ [property]: input.textContent }); + }); + + input.addEventListener("keydown", event => { + if (event.key === "Enter") input.blur(); + }); + + // Chrome sometimes add
, which aren't a problem for the value but are for the placeholder + input.addEventListener("input", () => input.querySelectorAll("br").forEach((i) => i.remove())); + } } /**@inheritdoc */ diff --git a/styles/less/global/elements.less b/styles/less/global/elements.less index 79deb99d..e740d917 100755 --- a/styles/less/global/elements.less +++ b/styles/less/global/elements.less @@ -6,7 +6,8 @@ input[type='text'], input[type='number'], - textarea { + textarea, + .input[contenteditable] { background: light-dark(transparent, transparent); border-radius: 6px; box-shadow: 0 4px 30px @soft-shadow; @@ -43,6 +44,14 @@ } } + .input[contenteditable] { + cursor: var(--cursor-text); + &:empty:before { + color: light-dark(@dark-40, @beige-50); + content: attr(placeholder); + } + } + input[type='checkbox'], input[type='radio'] { &:checked::after { diff --git a/styles/less/sheets/actors/adversary/header.less b/styles/less/sheets/actors/adversary/header.less index d4a7812e..aa3e6e83 100644 --- a/styles/less/sheets/actors/adversary/header.less +++ b/styles/less/sheets/actors/adversary/header.less @@ -12,18 +12,19 @@ gap: 5px; align-items: center; justify-content: space-between; - padding: 0; - padding-top: 5px; - padding-bottom: 8px; + padding: 8px 0; flex: 1; - input[type='text'] { + h1 { + display: flex; + flex: 1; + padding: 6px 0 0 0; font-size: var(--font-size-32); - height: 42px; text-align: start; border: 1px solid transparent; outline: 2px solid transparent; transition: all 0.3s ease; + word-break: break-word; &:hover { outline: 2px solid light-dark(@dark, @golden); diff --git a/styles/less/sheets/actors/character/header.less b/styles/less/sheets/actors/character/header.less index 80089cf7..4115fbd5 100644 --- a/styles/less/sheets/actors/character/header.less +++ b/styles/less/sheets/actors/character/header.less @@ -34,19 +34,22 @@ .name-row { display: flex; gap: 5px; - align-items: end; + align-items: start; justify-content: space-between; padding: 0; padding-top: 5px; flex: 1; - input[type='text'] { + h1 { + display: flex; + flex: 1; + padding: 6px 0 0 0; font-size: var(--font-size-32); - height: 42px; text-align: start; border: 1px solid transparent; outline: 2px solid transparent; transition: all 0.3s ease; + word-break: break-word; &:hover { outline: 2px solid light-dark(@dark, @golden); @@ -57,6 +60,8 @@ white-space: nowrap; display: flex; justify-content: end; + height: var(--font-size-32); + margin-top: 6px; .label { display: flex; diff --git a/templates/sheets/actors/adversary/header.hbs b/templates/sheets/actors/adversary/header.hbs index e6f829b8..42a673d5 100644 --- a/templates/sheets/actors/adversary/header.hbs +++ b/templates/sheets/actors/adversary/header.hbs @@ -1,10 +1,7 @@
-

- -

+

{{source.name}}

diff --git a/templates/sheets/actors/character/header.hbs b/templates/sheets/actors/character/header.hbs index e19c1dea..be3557ff 100644 --- a/templates/sheets/actors/character/header.hbs +++ b/templates/sheets/actors/character/header.hbs @@ -1,15 +1,7 @@
-

- -

- +

{{source.name}}

{{#if (or document.system.needsCharacterSetup document.system.levelData.canLevelUp)}} From 7d1e70f66f001488e952b8133ad2e36aab538d29 Mon Sep 17 00:00:00 2001 From: Nikhil Nagarajan Date: Sat, 20 Dec 2025 13:36:06 -0500 Subject: [PATCH 08/33] [PR] [Feature] Feature form labels + SRD Update (Adversaries & Environments) (#1429) * New labels. Time to print them somewhere. * Action buttons have icons. Pretty Iconic * Features tweaked to support only on limited actors * Duplicate ActionTypes+references are removed. * Adversary and Environment SRD entries updated. * Updated name field workflow in character actor. * Adversary name fields are improved as well. * Revert "Updated name field workflow in character actor." This reverts commit 66924c530fd4c188ef0dfcfd0b841f6c7187063d. * Revert "Adversary name fields are improved as well." This reverts commit f60e8cffda9d286f80cf1403d9137c83e1a8f95b. * Fixed prototype token in Abandoned Grove * Label change --------- Co-authored-by: WBHarry --- lang/en.json | 16 +++-- module/applications/sheets/items/feature.mjs | 7 ++ module/config/itemConfig.mjs | 64 ++----------------- module/data/action/baseAction.mjs | 1 - module/data/fields/actionField.mjs | 6 ++ module/data/item/feature.mjs | 8 ++- ...ersary_Acid_Burrower_89yAh30vaNQOALlz.json | 9 ++- ...ary_Adult_Flickerfly_G7jiltRjgvVhZewm.json | 26 ++++---- ..._Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json | 6 +- ...ary_Arch_Necromancer_WPEOIGfclNJxWb87.json | 15 +++-- ...versary_Archer_Guard_JRhrrEg5UroURiAD.json | 3 +- ...sary_Archer_Squadron_0ts6CGd93lLqGZI5.json | 6 +- ...ry_Assassin_Poisoner_h5RuhzGL17dW5FBT.json | 3 +- ...adversary_Battle_Box_dgH3fW9FTYLaIDvS.json | 27 +++++--- .../adversary_Bear_71qKDLKO3CsrNkdy.json | 6 +- ...versary_Bladed_Guard_B4LZcGuBAHzyVdzy.json | 3 +- ...ersary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json | 6 +- .../adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json | 6 +- ...dversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json | 6 +- .../adversary_Conscript_99TqczuQipBmaB8i.json | 3 +- .../adversary_Construct_uOP5oT9QzXPlnf3p.json | 9 ++- .../adversary_Courtesan_ZxWaWPdzFIUPNC62.json | 3 +- .../adversary_Courtier_CBBuEXAlLKFMJdjg.json | 6 +- ...adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json | 12 ++-- .../adversary_Cult_Fang_tyBOpLfigAhI9bU3.json | 3 +- ...ersary_Cult_Initiate_zx99sOGTXicP4SSD.json | 3 +- ...ry_Deeproot_Defender_9x2xY9zwc3xzbXo5.json | 6 +- ...ary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json | 3 +- ...ary_Demon_of_Despair_kE4dfhqmIQpNd44e.json | 9 ++- ...sary_Demon_of_Hubris_2VN3BftageoTTIzu.json | 9 ++- ...ry_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json | 9 ++- ...rsary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json | 9 ++- ...y_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json | 6 +- .../adversary_Dire_Bat_tBWHW00epmMnkawe.json | 6 +- .../adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json | 3 +- .../adversary_Dryad_wR7cFKrHvRzbzhBT.json | 9 ++- ...ersary_Electric_Eels_TLzY1nDw0Bu9Ud40.json | 3 +- ...sary_Elemental_Spark_P7h54ZePFPHpYwvB.json | 3 +- ...ersary_Elite_Soldier_bfhVWMBUh61b9J6n.json | 6 +- ...ry_Failed_Experiment_ChwwVqowFw8hJQwT.json | 3 +- ...y_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json | 3 +- ...sary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json | 12 ++-- ...rlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json | 12 ++-- ..._Undefeated_Champion_RXkZTwBRi4dJ3JE5.json | 15 +++-- ...ry_Giant_Beastmaster_8VZIgU12cB3cvlyH.json | 6 +- ...ersary_Giant_Brawler_YnObCleGjPT7yqEc.json | 9 ++- ...dversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json | 9 ++- ...ary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json | 3 +- .../adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json | 3 +- ...ersary_Giant_Recruit_5s8wSvpyC5rxY5aD.json | 3 +- ...rsary_Giant_Scorpion_fmfntuJ8mHRCAktP.json | 9 ++- ...dversary_Glass_Snake_8KWVLWXFhlY2kYx0.json | 6 +- .../adversary_Gorgon_8mJYMpbLTb8qIOrr.json | 9 ++- ...ater_Earth_Elemental_dsfB3YhoL5SudvS2.json | 6 +- ...ater_Water_Elemental_xIICT6tEdnA7dKDV.json | 9 ++- ...adversary_Green_Ooze_SHXedd9zZPVfUgUa.json | 6 +- ...sary_Hallowed_Archer_kabueAo6BALApWqp.json | 3 +- ...ary_Hallowed_Soldier_VENwg7xEFcYObjmT.json | 3 +- .../adversary_Harrier_uRtghKE9mHlII4rs.json | 3 +- ...adversary_Head_Guard_mK3A5FTx6k8iPU3F.json | 9 ++- ...versary_Head_Vampire_i2UNbRvgyoSs07M6.json | 9 ++- ...dversary_High_Seraph_r1mbfSSwKWdcFdAU.json | 9 ++- ...sary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json | 6 +- .../adversary_Hydra_MI126iMOOobQ1Obn.json | 9 ++- ...y_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json | 6 +- ...ed_Knife_Kneebreaker_CBKixLH3yhivZZuL.json | 3 +- ..._Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json | 3 +- ...ged_Knife_Lieutenant_aTljstqteGoLpCBq.json | 12 ++-- ..._Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json | 3 +- ..._Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json | 6 +- ..._Knight_of_the_Realm_7ai2opemrclQe3VF.json | 6 +- .../adversary_Kraken_4nqv3ZwJGjnmic8j.json | 9 ++- ...versary_Masked_Thief_niBpVU7yeo5ccskE.json | 6 +- ...sary_Master_Assassin_dNta0cUzr96xcFhf.json | 9 ++- ...rsary_Merchant_Baron_Vy02IhGhkJLuezu4.json | 6 +- ...inor_Chaos_Elemental_sRn4bqerfARvhgSV.json | 12 ++-- ...dversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json | 9 ++- ...Minor_Fire_Elemental_DscWkNVoHak6P4hh.json | 12 ++-- ...versary_Minor_Treant_G62k4oSkhkoXEs2D.json | 3 +- ...ary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json | 6 +- .../adversary_Monarch_yx0vK2yfNVZKWUUi.json | 9 ++- ...ersary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json | 9 ++- ...adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json | 6 +- ...rsary_Oracle_of_Doom_befIqd5IYKg6eUz2.json | 12 ++-- ...r_Realms_Abomination_A0SeeDzwjvqOsyof.json | 6 +- ...ter_Realms_Corrupter_ms6nuOl3NFkhPj1k.json | 3 +- ..._Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json | 3 +- ...atchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json | 6 +- ...ary_Perfected_Zombie_CP6iRfHdyFWniTHY.json | 6 +- ...dversary_Petty_Noble_wycLpvebWdUqRhpP.json | 6 +- ...rsary_Pirate_Captain_OROJbjsqagVh7ECV.json | 9 ++- ...versary_Pirate_Tough_mhcVkVFrzIJ18FDm.json | 3 +- .../adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json | 6 +- ...ersary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json | 3 +- ...ersary_Royal_Advisor_EtLJiTsilPPZvLUX.json | 6 +- ...ersary_Secret_Keeper_sLAccjvCWfeedbpI.json | 12 ++-- .../adversary_Sellsword_bgreCaQ6ap2DVpCr.json | 3 +- .../adversary_Shark_YmVAkdNsyuXWTtYp.json | 3 +- .../adversary_Siren_BK4jwyXSRx7IOQiO.json | 3 +- ...sary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json | 3 +- ...sary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json | 3 +- ...sary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json | 6 +- ...ary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json | 3 +- ...sary_Spectral_Archer_5tCkhnBByUIN5UdG.json | 3 +- ...ary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json | 9 ++- ...ry_Spectral_Guardian_UFVGl1osOsJTneLf.json | 3 +- ...adversary_Spellblade_ldbWEL7uZs84vyrR.json | 9 ++- .../adversary_Spy_8zlynOhnVA59KpKT.json | 6 +- ...dversary_Stag_Knight_KGVwnLq85ywP9xvB.json | 6 +- ...dversary_Stonewraith_3aAS2Qm3R6cgaYfE.json | 9 ++- ...rsary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json | 6 +- ...Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json | 6 +- ...rsary_Tangle_Bramble_XcAGOSmtCFLT1unN.json | 6 +- ...ersary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json | 3 +- ...rsary_Treant_Sapling_o63nS0k3wHu6EgKP.json | 3 +- .../adversary_Vampire_WWyUp6Mxl1S3KYUG.json | 6 +- ...ault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json | 3 +- ...lt_Guardian_Sentinel_FVgYb28fhxlVcGwA.json | 9 ++- ...ault_Guardian_Turret_c5hGdvY5UnSjlHws.json | 9 ++- ...Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json | 9 ++- ...agon__Molten_Scourge_eArAPuB38CNR0ZIM.json | 15 +++-- ...n__Obsidian_Predator_ladm7wykhZczYzrQ.json | 9 ++- ...adversary_War_Wizard_noDdT0tsN6FXSmC8.json | 14 ++-- ...versary_Weaponmaster_ZNbQ2jg35LG4t9eH.json | 9 ++- ...dversary_Young_Dryad_8yUj2Mzvnifhxegm.json | 9 ++- ...ary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json | 12 ++-- ...ersary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json | 3 +- ...dversary_Zombie_Pack_Nf0v43rtflV56V2T.json | 3 +- ...ment_Abandoned_Grove_pGEdzdLkqYtBhxnG.json | 17 +++-- ...environment_Ambushed_uGEdNYERCTJBEjc5.json | 3 +- ...nvironment_Ambushers_uXZpebPR77YQ1oXI.json | 3 +- ...g_Heart_of_the_Woods_oY69NN4rYxoRE4hl.json | 9 ++- ...Bustling_Marketplace_HZKA7hkej7JJY503.json | 9 ++- ...ronment_Castle_Siege_1eZ32Esq7rfZOjlu.json | 9 ++- ...ironment_Chaos_Realm_2Z1mKc65LxNk2PqR.json | 12 ++-- ...ent_Cliffside_Ascent_LPpfdlNKqiZIl04w.json | 3 +- ...ironment_Cult_Ritual_QAXXiOKBDmCTauHD.json | 9 ++- ...nt_Divine_Usurpation_4DLYez7VbMCFDAuZ.json | 12 ++-- ...ment_Hallowed_Temple_dsA6j69AnaJhUyqH.json | 8 ++- ...ronment_Haunted_City_OzYbizKraK92FDiI.json | 6 +- ...nment_Imperial_Court_jr1xAoXzVwVblzxI.json | 9 ++- ...ronment_Local_Tavern_cM4X81DOyvxNIi52.json | 11 ++-- ...onment_Mountain_Pass_acMu9wJrMZZzLSTJ.json | 9 ++- ...ecromancer_s_Ossuary_h3KyRL7AshhLAmcH.json | 9 ++- ...ronment_Outpost_Town_YezryR32uo39xRxW.json | 6 +- ...nment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json | 9 ++- ...ronment_Raging_River_t4cdqTfzcqP3H1vJ.json | 6 +- .../sheets-settings/action-settings/base.hbs | 1 - .../global/partials/inventory-item-V2.hbs | 15 +++++ .../sheets/global/partials/inventory-item.hbs | 15 +++++ templates/sheets/items/feature/header.hbs | 2 +- templates/sheets/items/feature/settings.hbs | 7 ++ 152 files changed, 731 insertions(+), 405 deletions(-) diff --git a/lang/en.json b/lang/en.json index 32717fcb..8a3481c8 100755 --- a/lang/en.json +++ b/lang/en.json @@ -620,11 +620,6 @@ } }, "CONFIG": { - "ActionType": { - "passive": "Passive", - "action": "Action", - "reaction": "Reaction" - }, "AdversaryTrait": { "relentless": { "name": "Relentless", @@ -1033,6 +1028,12 @@ "description": "" } }, + "FeatureForm": { + "label": "Feature Form", + "passive": "Passive", + "action": "Action", + "reaction": "Reaction" + }, "Gold": { "title": "Gold", "coins": "Coins", @@ -2094,6 +2095,7 @@ "fear": "Fear", "features": "Features", "formula": "Formula", + "general": "General", "gm": "GM", "healing": "Healing", "healingRoll": "Healing Roll", @@ -2527,8 +2529,8 @@ "enabled": { "label": "Enabled" }, "tokens": { "label": "Tokens" } }, - "massiveDamage":{ - "title":"Massive Damage", + "massiveDamage": { + "title": "Massive Damage", "enabled": { "label": "Enabled" } } } diff --git a/module/applications/sheets/items/feature.mjs b/module/applications/sheets/items/feature.mjs index 1575067b..6ff98ca7 100644 --- a/module/applications/sheets/items/feature.mjs +++ b/module/applications/sheets/items/feature.mjs @@ -31,4 +31,11 @@ export default class FeatureSheet extends DHBaseItemSheet { labelPrefix: 'DAGGERHEART.GENERAL.Tabs' } }; +//Might be wrong location but testing out if here is okay. + /**@override */ + async _prepareContext(options) { + const context = await super._prepareContext(options); + context.featureFormChoices = CONFIG.DH.ITEM.featureForm; + return context; + } } diff --git a/module/config/itemConfig.mjs b/module/config/itemConfig.mjs index a9ad1d68..02914143 100644 --- a/module/config/itemConfig.mjs +++ b/module/config/itemConfig.mjs @@ -5,7 +5,6 @@ export const armorFeatures = { actions: [ { type: 'damage', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.ArmorFeature.burning.actions.burn.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.burning.actions.burn.description', @@ -174,7 +173,6 @@ export const armorFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.ArmorFeature.hopeful.actions.hope.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.hopeful.actions.hope.description', @@ -188,7 +186,6 @@ export const armorFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.ArmorFeature.impenetrable.actions.impenetrable.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.impenetrable.actions.impenetrable.description', @@ -231,7 +228,6 @@ export const armorFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.ArmorFeature.painful.actions.pain.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.painful.actions.pain.description', @@ -269,7 +265,6 @@ export const armorFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.ArmorFeature.quiet.actions.quiet.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.quiet.actions.quiet.description', @@ -306,7 +301,6 @@ export const armorFeatures = { actions: [ { type: 'attack', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.ArmorFeature.resilient.actions.resilient.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.resilient.actions.resilient.description', @@ -353,7 +347,6 @@ export const armorFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.ArmorFeature.shifting.actions.shift.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.shifting.actions.shift.description', @@ -373,7 +366,6 @@ export const armorFeatures = { actions: [ { type: 'attack', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.ArmorFeature.timeslowing.actions.slowTime.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.timeslowing.actions.slowTime.description', @@ -401,7 +393,6 @@ export const armorFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.ArmorFeature.truthseeking.actions.truthseeking.name', description: 'DAGGERHEART.CONFIG.ArmorFeature.truthseeking.actions.truthseeking.description', @@ -537,7 +528,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.bouncing.actions.bounce.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.bouncing.actions.bounce.description', @@ -582,7 +572,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.brutal.actions.addDamage.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.brutal.actions.addDamage.description', @@ -596,7 +585,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.burning.actions.burn.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.burning.actions.burn.description', @@ -610,7 +598,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.charged.actions.markStress.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.charged.actions.markStress.description', @@ -647,7 +634,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.concussive.actions.attack.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.concussive.actions.attack.description', @@ -688,7 +674,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.deadly.actions.extraDamage.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.deadly.actions.extraDamage.description', @@ -702,7 +687,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.actions.deflect.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.deflecting.actions.deflect.description', @@ -739,7 +723,6 @@ export const weaponFeatures = { actions: [ { type: 'damage', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.actions.attack.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.destructive.actions.attack.descriptive', @@ -784,7 +767,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.devastating.actions.devastate.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.devastating.actions.devastate.description', @@ -835,7 +817,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.doubledUp.actions.doubleUp.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.doubledUp.actions.doubleUp.description', @@ -849,7 +830,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.dueling.actions.duel.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.dueling.actions.duel.description', @@ -863,7 +843,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', // Should prompt a dc 14 reaction save on adversaries - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.eruptive.actions.erupt.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.eruptive.actions.erupt.description', @@ -877,7 +856,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.grappling.actions.grapple.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.grappling.actions.grapple.description', @@ -897,7 +875,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.greedy.description', @@ -929,7 +906,6 @@ export const weaponFeatures = { actions: [ { type: 'healing', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.healing.actions.heal.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.healing.actions.heal.description', @@ -977,7 +953,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.hooked.actions.hook.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.hooked.actions.hook.description', @@ -991,7 +966,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.hot.actions.hot.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.hot.actions.hot.description', @@ -1005,7 +979,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.invigorating.actions.invigorate.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.invigorating.actions.invigorate.description', @@ -1019,7 +992,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.lifestealing.actions.lifesteal.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.lifestealing.actions.lifesteal.description', @@ -1033,7 +1005,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.lockedOn.actions.lockOn.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.lockedOn.actions.lockOn.description', @@ -1047,7 +1018,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.long.actions.long.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.long.actions.long.description', @@ -1061,7 +1031,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.lucky.actions.luck.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.lucky.actions.luck.description', @@ -1099,7 +1068,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.painful.actions.pain.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.painful.actions.pain.description', @@ -1145,7 +1113,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.parry.actions.parry.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.parry.actions.parry.description', @@ -1159,7 +1126,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.actions.persuade.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.persuasive.actions.persuade.description', @@ -1196,7 +1162,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.pompous.actions.pompous.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.pompous.actions.pompous.description', @@ -1240,7 +1205,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.quick.actions.quick.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.quick.actions.quick.description', @@ -1278,7 +1242,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.reloading.actions.reload.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.reloading.actions.reload.description', @@ -1292,7 +1255,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.retractable.actions.retract.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.retractable.actions.retract.description', @@ -1306,7 +1268,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.returning.actions.return.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.returning.actions.return.description', @@ -1320,7 +1281,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.scary.actions.scare.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.scary.actions.scare.description', @@ -1376,7 +1336,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.sheltering.actions.shelter.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.sheltering.actions.shelter.description', @@ -1390,7 +1349,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.startling.actions.startle.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.startling.actions.startle.description', @@ -1410,7 +1368,6 @@ export const weaponFeatures = { actions: [ { type: 'effect', - actionType: 'action', chatDisplay: true, name: 'DAGGERHEART.CONFIG.WeaponFeature.timebending.actions.bendTime.name', description: 'DAGGERHEART.CONFIG.WeaponFeature.timebending.actions.bendTime.description', @@ -1458,6 +1415,12 @@ export const orderedWeaponFeatures = () => { return Object.values(all).sort((a, b) => game.i18n.localize(a.label).localeCompare(game.i18n.localize(b.label))); }; +export const featureForm = { + passive: "DAGGERHEART.CONFIG.FeatureForm.passive", + action: "DAGGERHEART.CONFIG.FeatureForm.action", + reaction: "DAGGERHEART.CONFIG.FeatureForm.reaction" +}; + export const featureTypes = { ancestry: { id: 'ancestry', @@ -1515,21 +1478,6 @@ export const featureSubTypes = { mastery: 'mastery' }; -export const actionTypes = { - passive: { - id: 'passive', - label: 'DAGGERHEART.CONFIG.ActionType.passive' - }, - action: { - id: 'action', - label: 'DAGGERHEART.CONFIG.ActionType.action' - }, - reaction: { - id: 'reaction', - label: 'DAGGERHEART.CONFIG.ActionType.reaction' - } -}; - export const itemResourceTypes = { simple: { id: 'simple', diff --git a/module/data/action/baseAction.mjs b/module/data/action/baseAction.mjs index ae085064..b15d6c4e 100644 --- a/module/data/action/baseAction.mjs +++ b/module/data/action/baseAction.mjs @@ -324,7 +324,6 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel _getTags() { const tags = [ game.i18n.localize(`DAGGERHEART.ACTIONS.TYPES.${this.type}.name`), - game.i18n.localize(`DAGGERHEART.CONFIG.ActionType.${this.actionType}`) ]; return tags; diff --git a/module/data/fields/actionField.mjs b/module/data/fields/actionField.mjs index 8661f500..2d968fe0 100644 --- a/module/data/fields/actionField.mjs +++ b/module/data/fields/actionField.mjs @@ -141,6 +141,12 @@ export function ActionMixin(Base) { return this.documentName; } + //Getter for icons + get typeIcon() { + const config = CONFIG.DH.ACTIONS.actionTypes[this.type]; + return config?.icon || 'fa-question'; // Fallback icon just in case + } + get relativeUUID() { return `.Item.${this.item.id}.Action.${this.id}`; } diff --git a/module/data/item/feature.mjs b/module/data/item/feature.mjs index 3b8fe064..cb01b1fb 100644 --- a/module/data/item/feature.mjs +++ b/module/data/item/feature.mjs @@ -30,7 +30,13 @@ export default class DHFeature extends BaseDataItem { initial: null }), multiclassOrigin: new fields.BooleanField({ initial: false }), - identifier: new fields.StringField() + identifier: new fields.StringField(), + featureForm: new fields.StringField({ + required: true, + initial: 'passive', + choices: CONFIG.DH.ITEM.featureForm, + label: 'DAGGERHEART.CONFIG.FeatureForm.label' + }) }; } } diff --git a/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json b/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json index 8060ab72..1d4cf11a 100644 --- a/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json +++ b/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json @@ -381,7 +381,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [ { @@ -546,7 +547,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -681,7 +683,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json b/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json index 0e3a89c6..3d1404a7 100644 --- a/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json +++ b/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json @@ -263,7 +263,7 @@ "img": "icons/magic/unholy/silhouette-evil-horned-giant.webp", "effects": [], "folder": null, - "sort": 0, + "sort": 100000, "ownership": { "default": 0, "MQSznptE5yLT7kj8": 3 @@ -360,7 +360,7 @@ } ], "folder": null, - "sort": 0, + "sort": 200000, "ownership": { "default": 0, "MQSznptE5yLT7kj8": 3 @@ -461,13 +461,14 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "BuL6ndgaiJtjaM2T", "img": "icons/skills/melee/strike-slashes-orange.webp", "effects": [], "folder": null, - "sort": 0, + "sort": 300000, "ownership": { "default": 0, "MQSznptE5yLT7kj8": 3 @@ -540,13 +541,14 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "bOTsfXr9yNIGkIzK", "img": "icons/magic/light/explosion-glow-spiral-yellow.webp", "effects": [], "folder": null, - "sort": 0, + "sort": 400000, "ownership": { "default": 0, "MQSznptE5yLT7kj8": 3 @@ -701,13 +703,14 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "49cIxZRFiAM6jDva", "img": "icons/magic/air/fog-gas-smoke-purple.webp", "effects": [], "folder": null, - "sort": 0, + "sort": 500000, "ownership": { "default": 0, "MQSznptE5yLT7kj8": 3 @@ -756,13 +759,14 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "KLdLRKoJHBJlHwYe", "img": "icons/skills/movement/arrow-upward-yellow.webp", "effects": [], "folder": null, - "sort": 0, + "sort": 600000, "ownership": { "default": 0, "MQSznptE5yLT7kj8": 3 @@ -787,7 +791,7 @@ "img": "icons/skills/movement/feet-winged-boots-blue.webp", "effects": [], "folder": null, - "sort": 0, + "sort": 700000, "ownership": { "default": 0, "fBcTgyTzoARBvohY": 3 diff --git a/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json b/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json index 0fd791e0..fbf53d80 100644 --- a/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json +++ b/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json @@ -223,7 +223,8 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "passive" }, "_id": "2yREz60uPY80tAa4", "img": "icons/magic/symbols/runes-carved-stone-yellow.webp", @@ -278,7 +279,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "4wT7CmM1DJEPcraF", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", diff --git a/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json b/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json index cbba184b..2962b84c 100644 --- a/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json +++ b/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json @@ -289,7 +289,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "jNmMyq5QI2HNgffy", "img": "icons/magic/death/skull-weapon-staff-glow-pink.webp", @@ -467,7 +468,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "4EECsXzHFG0RoIg0", "img": "icons/magic/unholy/projectile-missile-green.webp", @@ -561,7 +563,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "XxXOrFovbCz9zFxR", "img": "icons/magic/death/undead-zombie-grave-green.webp", @@ -640,7 +643,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "k4MSykLRoW3qp7Lk", "img": "icons/magic/death/skull-horned-worn-fire-blue.webp", @@ -756,7 +760,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "FKcuCo0v2U7fVkqq", "img": "icons/magic/unholy/hand-claw-fire-green.webp", diff --git a/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json b/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json index f4520545..bfdee207 100644 --- a/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json +++ b/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json @@ -311,7 +311,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [ { diff --git a/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json b/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json index 00b2462a..88d63721 100644 --- a/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json +++ b/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json @@ -328,7 +328,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "Wuf5y9tJ88BwzLv2", "img": "icons/skills/ranged/arrows-flying-triple-brown.webp", @@ -425,7 +426,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "ayGHTtyjSuIR4BrV", "img": "icons/skills/ranged/arrows-flying-salvo-blue.webp", diff --git a/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json b/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json index e887b4ba..b962fe78 100644 --- a/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json +++ b/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json @@ -419,7 +419,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "lAmiK8wVxjyHwKlp", "img": "icons/magic/air/fog-gas-smoke-green.webp", diff --git a/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json b/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json index 49982ae2..b172b646 100644 --- a/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json +++ b/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json @@ -342,7 +342,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "ZqfLMjVkbUwDw4p6", "img": "icons/commodities/tech/transmission.webp", @@ -441,7 +442,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "lqyN4CQop53BzarW", "img": "icons/magic/light/beam-rays-blue.webp", @@ -540,7 +542,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "IHQoqt39T772FVMs", "img": "icons/magic/fire/explosion-embers-orange.webp", @@ -644,7 +647,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "XtnByqUr9AuYU9Ip", "img": "icons/skills/movement/arrow-upward-yellow.webp", @@ -781,7 +785,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "3bPURmuwQs06fThQ", "img": "icons/magic/lightning/bolt-strike-embers-teal.webp", @@ -858,7 +863,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "ijIaKjroxq3xZd9Z", "img": "icons/magic/sonic/explosion-impact-shock-wave.webp", @@ -996,7 +1002,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "JCue4ko61bjhedXv", "img": "icons/creatures/invertebrates/wasp-swarm-tan.webp", @@ -1096,7 +1103,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "ITzpRJr2jWK0Ksmp", "img": "icons/creatures/magical/construct-golem-stone-blue.webp", @@ -1195,7 +1203,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "YvfzPyJbbv2ia6Yp", "img": "icons/magic/sonic/explosion-shock-wave-teal.webp", diff --git a/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json b/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json index e902ac32..f804c06e 100644 --- a/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json +++ b/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json @@ -350,7 +350,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [ { @@ -485,7 +486,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json b/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json index 24194f3d..ecc547f8 100644 --- a/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json +++ b/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json @@ -358,7 +358,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [ { diff --git a/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json b/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json index cf6583e4..96e00139 100644 --- a/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json +++ b/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json @@ -342,7 +342,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -433,7 +434,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [ { diff --git a/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json b/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json index fd73ee36..91ba0045 100644 --- a/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json +++ b/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json @@ -467,7 +467,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -548,7 +549,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json b/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json index a9686bf0..cf2be503 100644 --- a/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json +++ b/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json @@ -443,7 +443,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "Zn25zBr96y1hrmnr", "img": "icons/magic/lightning/bolt-strike-purple.webp", @@ -540,7 +541,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "urXRi4bdBfvl8U6K", "img": "icons/magic/control/sihouette-hold-beam-green.webp", diff --git a/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json b/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json index bf302c3f..d79aed6c 100644 --- a/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json +++ b/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json @@ -272,7 +272,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "MWfKUGzT1YBmLvpn", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", diff --git a/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json b/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json index b8d8cfa0..964b1354 100644 --- a/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json +++ b/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json @@ -393,7 +393,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -449,7 +450,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [ { @@ -593,7 +595,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json b/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json index f6b94677..571d8cf1 100644 --- a/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json +++ b/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json @@ -300,7 +300,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "rSMUPC5GhR982ifg", "img": "icons/magic/perception/eye-slit-orange.webp", diff --git a/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json b/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json index 28222226..c22a8130 100644 --- a/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json +++ b/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json @@ -318,7 +318,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [ { @@ -413,7 +414,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json b/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json index 7c90a78b..8e4f477e 100644 --- a/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json +++ b/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json @@ -341,7 +341,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "kCffzM8rX8NEr9d2", "img": "icons/magic/unholy/beam-ringed-impact-purple.webp", @@ -401,7 +402,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "IHWDn097sRgjlZXO", "img": "icons/magic/unholy/orb-contained-pink.webp", @@ -511,7 +513,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "JpSrduK3vjd9h098", "img": "icons/magic/air/fog-gas-smoke-dense-pink.webp", @@ -643,7 +646,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "x6FbcrfOscb3er6P", "img": "icons/magic/unholy/silhouette-robe-evil-glow.webp", diff --git a/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json b/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json index 76a338d2..5b167356 100644 --- a/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json +++ b/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json @@ -364,7 +364,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "ohASSruBxcvuItIK", "img": "icons/magic/unholy/barrier-fire-pink.webp", diff --git a/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json b/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json index f748df8b..0aa5c326 100644 --- a/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json +++ b/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json @@ -272,7 +272,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "WP6xQtYzouPEFr82", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", diff --git a/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json b/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json index eea41180..19d0fd4d 100644 --- a/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json +++ b/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json @@ -285,7 +285,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -388,7 +389,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [ { diff --git a/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json b/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json index 3c76628d..fa925b38 100644 --- a/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json +++ b/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json @@ -329,7 +329,8 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "BKgv2D1IdI813R8k", "img": "icons/skills/movement/arrows-up-trio-red.webp", diff --git a/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json b/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json index 3ae3639d..cc792029 100644 --- a/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json +++ b/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json @@ -290,7 +290,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "FC8PIf4BVkhmoJX8", "img": "icons/magic/death/skull-flames-white-blue.webp", @@ -412,7 +413,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "dlMdfUjy2GaqgeOJ", "img": "icons/creatures/unholy/demon-fire-horned-mask.webp", @@ -507,7 +509,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "7qjx1c4C1fUfvXnu", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json b/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json index b425ec66..04f6a778 100644 --- a/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json +++ b/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json @@ -454,7 +454,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "Y3W44ifKIcoYpONN", "img": "icons/skills/melee/spear-tips-quintuple-orange.webp", @@ -509,7 +510,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "6BKWOTuxQWJd5RP5", "img": "icons/creatures/unholy/demon-fire-horned-winged-roar.webp", @@ -587,7 +589,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "FLp1dPSJz1ezY0gD", "img": "icons/magic/control/fear-fright-shadow-monster-red.webp", diff --git a/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json b/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json index 7ea12036..e79eef29 100644 --- a/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json +++ b/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json @@ -256,7 +256,8 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "KVyhgMJSSHTwRISA", "img": "icons/magic/control/fear-fright-monster-grin-purple-blue.webp", @@ -311,7 +312,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "pSAupMWw1eYqm84z", "img": "icons/magic/perception/eye-ringed-glow-angry-small-teal.webp", @@ -383,7 +385,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "589tCxFc8KZ3rdzP", "img": "icons/magic/perception/hand-eye-black.webp", diff --git a/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json b/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json index 72ec986d..cfe301f5 100644 --- a/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json +++ b/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json @@ -286,7 +286,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "a33PW8UkziliowlR", "img": "icons/skills/melee/maneuver-greatsword-yellow.webp", @@ -393,7 +394,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "DjGydqLXT4rDa7Av", "img": "icons/skills/melee/blood-slash-foam-red.webp", @@ -482,7 +484,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "2F75BO0xEU8Zlj7T", "img": "icons/creatures/unholy/demon-fire-horned-clawed.webp", diff --git a/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json b/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json index b7ac7cb5..d407949e 100644 --- a/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json +++ b/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json @@ -308,7 +308,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "WEbHwamS5ZBphiKq", "img": "icons/creatures/unholy/demons-horned-glowing-pink.webp", @@ -403,7 +404,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "3mOBJE5c3cP2cGP1", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json b/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json index 38bba1d3..9c367879 100644 --- a/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json +++ b/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json @@ -350,7 +350,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "o69lipskvBwGVhe4", "img": "icons/magic/sonic/projectile-sound-rings-wave.webp", @@ -456,7 +457,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "BQPGgbNzKbNkGDJb", "img": "icons/skills/melee/strike-slashes-red.webp", diff --git a/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json b/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json index a900aa7b..f40c2310 100644 --- a/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json +++ b/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json @@ -417,7 +417,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [ { diff --git a/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json b/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json index 845e447a..0bd8939e 100644 --- a/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json +++ b/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json @@ -337,7 +337,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "i9HbArl09dX2BvzY", "img": "icons/magic/nature/root-vines-grow-brown.webp", @@ -392,7 +393,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "yKWQLL3qsEZlQjyb", "img": "icons/magic/nature/tree-animated-stump-mushrooms-teal.webp", @@ -517,7 +519,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "z4JbqiHuxrWy6Cpu", "img": "icons/magic/nature/vines-thorned-curled-glow-teal-purple.webp", diff --git a/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json b/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json index 6d25a124..0354d820 100644 --- a/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json +++ b/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json @@ -330,7 +330,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "u5NL1eUJeAkIEpgt", "img": "icons/magic/lightning/bolt-strike-sparks-teal.webp", diff --git a/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json b/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json index a774d40e..9713e7ba 100644 --- a/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json +++ b/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json @@ -272,7 +272,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "13OraSLq2YjpZqbm", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", diff --git a/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json b/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json index 5baabdec..18dc586b 100644 --- a/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json +++ b/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json @@ -336,7 +336,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "ojiIZHBd0sMLxSUE", "img": "icons/skills/melee/hand-grip-sword-orange.webp", @@ -391,7 +392,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "zcfyEY29yWqJtZbl", "img": "icons/magic/defensive/shield-barrier-blue.webp", diff --git a/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json b/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json index 7d439a1b..7e97c5b1 100644 --- a/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json +++ b/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json @@ -354,7 +354,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "g0h3Zo6xqgfSlyxi", "img": "icons/skills/melee/strike-slashes-red.webp", diff --git a/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json b/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json index df039d82..b8b054c8 100644 --- a/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json +++ b/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json @@ -350,7 +350,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "gC4whvt2r9Tfso9Y", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", diff --git a/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json b/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json index 48dbefcc..8b690bfd 100644 --- a/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json +++ b/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json @@ -311,7 +311,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "s15sNyb3JYMzBLIU", "img": "icons/magic/fire/projectile-beams-salvo-red.webp", @@ -364,7 +365,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "ecp9o8t1dQFXGsse", "img": "icons/magic/death/skull-energy-light-white.webp", @@ -429,7 +431,8 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "C74czwNeWF5vS1DZ", "img": "icons/magic/symbols/ring-circle-smoke-blue.webp", @@ -549,7 +552,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "gwSgBhkcekCGvXxz", "img": "icons/magic/unholy/strike-hand-glow-pink.webp", 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 c432cae2..8d75dd9e 100644 --- a/src/packs/adversaries/adversary_Fallen_Warlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json +++ b/src/packs/adversaries/adversary_Fallen_Warlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json @@ -476,7 +476,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "PVLjJaQLH3LK3svk", "img": "icons/skills/melee/blood-slash-foam-red.webp", @@ -612,7 +613,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "48tIwFQr64IQ5LaY", "img": "icons/magic/control/fear-fright-monster-grin-red-orange.webp", @@ -690,7 +692,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "v74W0MUqVi9vPUEw", "img": "icons/magic/death/skull-energy-light-purple.webp", @@ -715,7 +718,8 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "RscRTl8U8u6WcwAB", "img": "icons/magic/unholy/silhouette-evil-horned-giant.webp", 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 ab5d5c41..061abed8 100644 --- a/src/packs/adversaries/adversary_Fallen_Warlord__Undefeated_Champion_RXkZTwBRi4dJ3JE5.json +++ b/src/packs/adversaries/adversary_Fallen_Warlord__Undefeated_Champion_RXkZTwBRi4dJ3JE5.json @@ -470,7 +470,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "t8yOkGWmPgQ6EbIr", "img": "icons/skills/melee/sword-stuck-glowing-pink.webp", @@ -525,7 +526,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "AP7W9ruUCdTHO69S", "img": "icons/magic/death/undead-skeleton-worn-blue.webp", @@ -615,7 +617,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "55P7ZijSbQeVHCw4", "img": "icons/magic/unholy/barrier-fire-pink.webp", @@ -749,7 +752,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "ReWtcLE5akrSauI1", "img": "icons/skills/melee/strike-weapons-orange.webp", @@ -827,7 +831,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "tQRotPLi3eokgUdM", "img": "icons/magic/death/skull-energy-light-purple.webp", diff --git a/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json b/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json index 7eb4f6fc..e82d30d8 100644 --- a/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json +++ b/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json @@ -332,7 +332,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "6ZrDjgnWufJohkp1", "img": "icons/skills/ranged/arrow-flying-broadhead-metal.webp", @@ -420,7 +421,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "w1oHm0NoEavQgUzl", "img": "icons/creatures/mammals/ox-bull-horned-glowing-orange.webp", diff --git a/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json b/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json index bce45f4c..a51abc03 100644 --- a/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json +++ b/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json @@ -311,7 +311,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "ro8AtBdgklyyuydK", "img": "icons/skills/melee/shield-damaged-broken-orange.webp", @@ -410,7 +411,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "kKBbEAffbHxmHo15", "img": "icons/skills/melee/strike-flail-spiked-pink.webp", @@ -505,7 +507,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "B0EniYxyLvjJSqYb", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json b/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json index 7606d09f..dc21e5aa 100644 --- a/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json +++ b/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json @@ -410,7 +410,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "MabIQE1Kjn60j08J", "img": "icons/skills/melee/strike-slashes-orange.webp", @@ -553,7 +554,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "NEOQ0E9AGSSIDm4v", "img": "icons/skills/movement/arrow-upward-yellow.webp", @@ -671,7 +673,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "jY0ynjYvbS6E3NgJ", "img": "icons/skills/movement/arrow-down-pink.webp", diff --git a/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json b/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json index 7b21aca5..0db2613f 100644 --- a/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json +++ b/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json @@ -359,7 +359,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json b/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json index afeb44ad..7da2eabd 100644 --- a/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json +++ b/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json @@ -306,7 +306,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json b/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json index a38fce28..0ef9eb18 100644 --- a/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json +++ b/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json @@ -274,7 +274,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "FMgB28X1LammRInU", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", diff --git a/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json b/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json index d5f25734..b65a27ba 100644 --- a/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json +++ b/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json @@ -314,7 +314,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -419,7 +420,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [ { @@ -552,7 +554,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json b/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json index ec94123b..67d9a7d7 100644 --- a/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json +++ b/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json @@ -385,7 +385,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -565,7 +566,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [ { diff --git a/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json b/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json index 7445c992..98080be6 100644 --- a/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json +++ b/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json @@ -484,7 +484,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "9SO2ov36lFH2YV0S", "img": "icons/creatures/reptiles/snake-fangs-bite-green.webp", @@ -600,7 +601,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "047o6OtNlUwLG1H1", "img": "icons/magic/earth/strike-body-stone-crumble.webp", @@ -695,7 +697,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "IRIaFxFughjXVu0Y", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json b/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json index 3a19084d..e8bc6601 100644 --- a/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json +++ b/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json @@ -487,7 +487,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "q45DiEFlXqcXZ5hv", "img": "icons/magic/earth/barrier-stone-brown-green.webp", @@ -621,7 +622,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "ag7t5EW358M0qiSL", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json b/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json index bdc22b1a..73b702fb 100644 --- a/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json +++ b/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json @@ -310,7 +310,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "B8ZrtRCZrwwwWJOE", "img": "icons/magic/water/projectile-icecicle-glowing.webp", @@ -438,7 +439,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "bcwFQeuU6ZfIGjau", "img": "icons/magic/water/vortex-water-whirlpool-blue.webp", @@ -533,7 +535,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "BGE42W1XPd0vpimR", "img": "icons/magic/water/tendrils-ice-thorns.webp", diff --git a/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json b/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json index 426803c2..5746f57b 100644 --- a/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json +++ b/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json @@ -447,7 +447,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [ { @@ -540,7 +541,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json b/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json index 43e10f5f..6ad8d177 100644 --- a/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json +++ b/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json @@ -330,7 +330,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "Ye35DuZroQfeFoNw", "img": "icons/skills/ranged/arrows-flying-salvo-yellow.webp", diff --git a/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json b/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json index b9a50759..5a1ccc65 100644 --- a/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json +++ b/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json @@ -327,7 +327,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "ZpypjDbaurs1YSFb", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", diff --git a/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json b/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json index b2ebe434..d5ce14ff 100644 --- a/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json +++ b/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json @@ -339,7 +339,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json b/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json index e0e2a946..d9f6e8b9 100644 --- a/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json +++ b/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json @@ -292,7 +292,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -356,7 +357,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, @@ -452,7 +454,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json b/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json index 0c22e7fa..d80504a7 100644 --- a/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json +++ b/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json @@ -448,7 +448,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "Oj6qkLG1N6uqQHcx", "img": "icons/creatures/abilities/fang-tooth-blood-red.webp", @@ -503,7 +504,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "IWtpuQCuV82lOSry", "img": "icons/creatures/mammals/bat-giant-tattered-purple.webp", @@ -601,7 +603,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "6FsQf339qGHnz3ZF", "img": "icons/magic/unholy/strike-beam-blood-small-red-purple.webp", diff --git a/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json b/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json index d03fdea1..58b26f24 100644 --- a/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json +++ b/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json @@ -371,7 +371,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "FilEB21L5q9XxKE1", "img": "icons/magic/light/beams-rays-orange-purple-small.webp", @@ -514,7 +515,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "Vrb8dIJcOJ3ClwO5", "img": "icons/magic/light/beam-strike-orange-gold.webp", @@ -569,7 +571,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "9LpLXpQBfQryJA60", "img": "icons/magic/holy/barrier-shield-winged-blue.webp", diff --git a/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json b/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json index 9341c9ab..d291f805 100644 --- a/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json +++ b/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json @@ -416,7 +416,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "pfXYuH7rtsyVjSXh", "img": "icons/creatures/slimes/slime-face-melting-green.webp", @@ -508,7 +509,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "Mq90kFBM5ix2pzzh", "img": "icons/creatures/slimes/slime-movement-pseudopods-green.webp", diff --git a/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json b/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json index 0bc04c03..3c39550c 100644 --- a/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json +++ b/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json @@ -354,7 +354,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "b2KflqWoOxHMQf97", "img": "icons/magic/life/cross-beam-green.webp", @@ -432,7 +433,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "bCeCu8M25izOAsuY", "img": "icons/magic/death/skull-energy-light-white.webp", @@ -485,7 +487,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "sJzjcRBgYRp5f53E", "img": "icons/magic/symbols/star-rising-purple.webp", diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json b/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json index 465dd7a2..26d83e78 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json @@ -260,7 +260,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [ { @@ -397,7 +398,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json b/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json index e7ec011d..698ef485 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json @@ -316,7 +316,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [ { diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json b/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json index 99381bd6..668852a8 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json @@ -282,7 +282,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json b/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json index 7e448a62..6f4b54a5 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json @@ -262,7 +262,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -288,7 +289,8 @@ "actions": {}, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -420,7 +422,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -516,7 +519,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json b/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json index 10dc241f..ad53f212 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json @@ -362,7 +362,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [ { diff --git a/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json b/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json index 25b0b8b0..fc30a072 100644 --- a/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json +++ b/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json @@ -450,7 +450,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "Bt7MqMkPpPpzWksK", "img": "icons/magic/light/explosion-glow-spiral-yellow.webp", @@ -610,7 +611,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "EjfM83eVCdcVGC3c", "img": "icons/magic/air/fog-gas-smoke-purple.webp", diff --git a/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json b/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json index 298af435..51e7979d 100644 --- a/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json +++ b/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json @@ -475,7 +475,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "djKDZawLnGF1zkbY", "img": "icons/skills/movement/arrow-upward-yellow.webp", @@ -530,7 +531,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "RoxNNIn0m9rHQDH8", "img": "icons/environment/people/charge.webp", diff --git a/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json b/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json index 12f881d4..62d443c9 100644 --- a/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json +++ b/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json @@ -365,7 +365,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "vz2BWhispgR7mSWF", "img": "icons/magic/water/orb-water-bubbles-blue.webp", @@ -504,7 +505,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "eksa3E2ecBgdib6h", "img": "icons/magic/water/projectile-icecicle-glowing.webp", @@ -599,7 +601,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "m4aybzb8tXWHelDU", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json b/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json index 90ede3ec..5af8b388 100644 --- a/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json +++ b/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json @@ -302,7 +302,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "Cgk36WXthA9LwOYb", "img": "icons/skills/melee/strike-sword-gray.webp", @@ -379,7 +380,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "tP2DD751nOLxFVps", "img": "icons/environment/traps/trap-jaw-tan.webp", diff --git a/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json b/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json index 557ef607..5ac80827 100644 --- a/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json +++ b/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json @@ -372,7 +372,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "za6Qr0CjI9Kb4I0U", "img": "icons/skills/movement/arrows-up-trio-red.webp", @@ -427,7 +428,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "s0WcpK43WN2ptqNc", "img": "icons/skills/melee/strike-dagger-blood-red.webp", @@ -522,7 +524,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "PcNgHScmTd9l3exN", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json b/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json index a3ab2363..0dea7b8e 100644 --- a/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json +++ b/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json @@ -308,7 +308,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "7dxToUpxOyISXXde", "img": "icons/commodities/currency/coins-plain-stack-gold-yellow.webp", @@ -363,7 +364,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "QnDvERcyaq3XLCjF", "img": "icons/environment/people/charge.webp", diff --git a/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json b/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json index edb50cf1..8d7c1888 100644 --- a/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json +++ b/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json @@ -362,7 +362,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [ { @@ -488,7 +489,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -514,7 +516,8 @@ "actions": {}, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, @@ -610,7 +613,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json b/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json index 5d6c34cd..813af3c3 100644 --- a/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json +++ b/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json @@ -445,7 +445,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -501,7 +502,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, @@ -597,7 +599,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json b/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json index 7421e270..f57abdd9 100644 --- a/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json +++ b/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json @@ -358,7 +358,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -465,7 +466,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -631,7 +633,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, @@ -727,7 +730,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json b/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json index 267a1e14..c16b2c36 100644 --- a/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json +++ b/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json @@ -276,7 +276,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json b/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json index 570db804..9ac0caa9 100644 --- a/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json +++ b/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json @@ -414,7 +414,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "b2QvDYOq1nreI2uD", "img": "icons/creatures/mammals/bull-horned-blue.webp", @@ -512,7 +513,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "WxbHcbaeb6L7g8qN", "img": "icons/skills/melee/strike-slashes-red.webp", diff --git a/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json b/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json index 3f2d7d88..8ec7b09d 100644 --- a/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json +++ b/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json @@ -235,7 +235,8 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "iYHCYTJzZbw5f0pF", "img": "icons/commodities/treasure/crown-gold-satin-gems-red.webp", @@ -290,7 +291,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "9K7C1PR4Q6QrUjjb", "img": "icons/environment/people/charge.webp", @@ -435,7 +437,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "kA5NZTdiknsh7wxp", "img": "icons/sundries/scrolls/scroll-bound-sealed-red-tan.webp", diff --git a/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json b/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json index 721d8973..febdc8e7 100644 --- a/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json +++ b/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json @@ -424,7 +424,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "r1T70u9n3bRfUTX5", "img": "icons/magic/unholy/hand-marked-pink.webp", @@ -540,7 +541,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "5AQTqW1GDidHfU3a", "img": "icons/skills/movement/arrows-up-trio-red.webp", @@ -676,7 +678,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "IOCG3J20wUHvyvvh", "img": "icons/magic/movement/trail-streak-zigzag-yellow.webp", diff --git a/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json b/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json index 00ba4dfe..977792ea 100644 --- a/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json +++ b/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json @@ -315,7 +315,8 @@ } }, "originItemType": null, - "multiclassOrigin": false + "multiclassOrigin": false, + "featureForm": "action" }, "_id": "Q2slH9qkBO5SPw43", "img": "icons/consumables/nuts/nut-spiked-shell.webp", @@ -378,7 +379,8 @@ } }, "originItemType": null, - "multiclassOrigin": false + "multiclassOrigin": false, + "featureForm": "action" }, "_id": "sqkgw26P2KiQVtXT", "img": "icons/consumables/plants/thorned-stem-brown.webp", diff --git a/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json b/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json index 0925049d..be97acf2 100644 --- a/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json +++ b/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json @@ -467,7 +467,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "QoFecwKWBFzrk4Wp", "img": "icons/magic/death/skeleton-skull-soul-blue.webp", @@ -546,7 +547,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "A4yI2RENCuLk6mg9", "img": "icons/magic/death/skull-horned-worn-fire-blue.webp", @@ -571,7 +573,8 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "IPoWZmSQ2kgWek5T", "img": "icons/magic/symbols/mask-yellow-orange.webp", @@ -657,7 +660,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "kuxTMjy8lOmNSa8e", "img": "icons/magic/control/sihouette-hold-beam-green.webp", diff --git a/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json b/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json index 8e9d6b37..d4b37075 100644 --- a/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json +++ b/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json @@ -422,7 +422,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "K3MQO1I42nmfM2F2", "img": "icons/magic/sonic/explosion-shock-sound-wave.webp", @@ -531,7 +532,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "u9dR2Qh3swHZalXj", "img": "icons/magic/unholy/orb-contained-pink.webp", diff --git a/src/packs/adversaries/adversary_Outer_Realms_Corrupter_ms6nuOl3NFkhPj1k.json b/src/packs/adversaries/adversary_Outer_Realms_Corrupter_ms6nuOl3NFkhPj1k.json index 4226d346..f84bc04d 100644 --- a/src/packs/adversaries/adversary_Outer_Realms_Corrupter_ms6nuOl3NFkhPj1k.json +++ b/src/packs/adversaries/adversary_Outer_Realms_Corrupter_ms6nuOl3NFkhPj1k.json @@ -375,7 +375,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "gBLVvHbyekmIUITD", "img": "icons/magic/unholy/barrier-shield-glowing-pink.webp", diff --git a/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json b/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json index f5558098..38ed9db0 100644 --- a/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json +++ b/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json @@ -272,7 +272,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "7DWNmxZvp1Fm3aq3", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", diff --git a/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json b/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json index efffaf03..1575bbf8 100644 --- a/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json +++ b/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json @@ -438,7 +438,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -544,7 +545,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json b/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json index ae8bb68f..3a7af054 100644 --- a/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json +++ b/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json @@ -413,7 +413,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "CKy2r6FguyTSO9Fm", "img": "icons/skills/melee/strike-axe-energy-pink.webp", @@ -500,7 +501,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "hWxjmdc1O5J1otLM", "img": "icons/magic/perception/shadow-stealth-eyes-purple.webp", diff --git a/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json b/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json index fc5d8f01..6e3c052c 100644 --- a/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json +++ b/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json @@ -313,7 +313,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -369,7 +370,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json b/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json index 5b3db044..a1c05eab 100644 --- a/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json +++ b/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json @@ -347,7 +347,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -452,7 +453,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -548,7 +550,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Pirate_Tough_mhcVkVFrzIJ18FDm.json b/src/packs/adversaries/adversary_Pirate_Tough_mhcVkVFrzIJ18FDm.json index 919b8aaf..6d15f7da 100644 --- a/src/packs/adversaries/adversary_Pirate_Tough_mhcVkVFrzIJ18FDm.json +++ b/src/packs/adversaries/adversary_Pirate_Tough_mhcVkVFrzIJ18FDm.json @@ -407,7 +407,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "uzlxE1Cxm9GGmrNs", "img": "icons/skills/melee/unarmed-punch-fist-blue.webp", diff --git a/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json b/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json index f555999d..dc5b66f4 100644 --- a/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json +++ b/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json @@ -391,7 +391,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [ { @@ -484,7 +485,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json b/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json index 461846a2..6a7ae3ff 100644 --- a/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json +++ b/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json @@ -276,7 +276,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json b/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json index 36c5a617..ef295cb0 100644 --- a/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json +++ b/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json @@ -343,7 +343,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "lG6vMc0zUbijpvCM", "img": "icons/skills/social/diplomacy-handshake.webp", @@ -398,7 +399,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "iwNrNBbvm3RMgSw5", "img": "icons/skills/social/diplomacy-unity-alliance.webp", diff --git a/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json b/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json index 113d8f73..9c158011 100644 --- a/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json +++ b/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json @@ -289,7 +289,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "WLnguxRo9egh2hfX", "img": "icons/skills/movement/arrows-up-trio-red.webp", @@ -389,7 +390,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "O5Nn1Slv8RJJpNeT", "img": "icons/magic/unholy/hand-claw-glow-orange.webp", @@ -474,7 +476,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "4L7aM9NDLbjvuwI3", "img": "icons/magic/unholy/silhouette-light-fire-blue.webp", @@ -529,7 +532,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "Q28NPuSMccjzykib", "img": "icons/creatures/unholy/demon-fire-horned-clawed.webp", diff --git a/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json b/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json index 8f490686..d5da4bca 100644 --- a/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json +++ b/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json @@ -276,7 +276,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json b/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json index 8729ac0a..dce37d5a 100644 --- a/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json +++ b/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json @@ -456,7 +456,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "LBKPfi8XktBAwbrt", "img": "icons/skills/wounds/blood-spurt-spray-red.webp", diff --git a/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json b/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json index 4e3f2aca..e6700b73 100644 --- a/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json +++ b/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json @@ -388,7 +388,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "Ks3HpB4W1l5FqR7p", "img": "icons/magic/control/hypnosis-mesmerism-eye.webp", diff --git a/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json b/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json index aeb2dd0e..845bd708 100644 --- a/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json +++ b/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json @@ -327,7 +327,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json b/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json index 22d00f72..e5daed4f 100644 --- a/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json +++ b/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json @@ -276,7 +276,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json b/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json index c16d878b..b4a349b5 100644 --- a/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json +++ b/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json @@ -412,7 +412,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -512,7 +513,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json b/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json index 1a1ca906..dbf39bed 100644 --- a/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json +++ b/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json @@ -344,7 +344,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json b/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json index 9832d7ce..7dfe0c09 100644 --- a/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json +++ b/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json @@ -403,7 +403,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "0h4IVmCgWXyQngAw", "img": "icons/skills/targeting/crosshair-triple-strike-orange.webp", diff --git a/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json b/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json index 3cb0a37c..dd044b50 100644 --- a/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json +++ b/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json @@ -359,7 +359,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "7YVe4DfEWMNLXNvu", "img": "icons/magic/death/undead-skeleton-worn-blue.webp", @@ -414,7 +415,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "X0vtV30ACVVZ6NfF", "img": "icons/magic/defensive/shield-barrier-flaming-diamond-teal.webp", @@ -509,7 +511,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "b9wn9oVMne8E1OYx", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json b/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json index 04062b0d..6dcd83c4 100644 --- a/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json +++ b/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json @@ -435,7 +435,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "L48tQmj5O3s2pjBn", "img": "icons/weapons/swords/sword-flanged-lightning.webp", diff --git a/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json b/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json index f096aeef..d9b3dbf3 100644 --- a/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json +++ b/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json @@ -341,7 +341,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -397,7 +398,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -493,7 +495,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json b/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json index 88f8eb5b..ffc4dfe7 100644 --- a/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json +++ b/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json @@ -260,7 +260,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "csCWQuSqic5ckHeO", "img": "icons/magic/perception/orb-eye-scrying.webp", @@ -381,7 +382,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "UvgVDn0YjISLdKE4", "img": "icons/magic/perception/silhouette-stealth-shadow.webp", diff --git a/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json b/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json index 0f6fbc5f..2fb0c531 100644 --- a/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json +++ b/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json @@ -363,7 +363,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "CYaSykD9BUxpiOxg", "img": "icons/skills/melee/strike-blade-hooked-green-purple.webp", @@ -447,7 +448,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "1LHHdn4ToSwSznuP", "img": "icons/magic/nature/root-vine-barrier-wall-brown.webp", diff --git a/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json b/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json index 6572d058..807d6675 100644 --- a/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json +++ b/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json @@ -339,7 +339,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "tQgxiSS48TJ3X1Dl", "img": "icons/creatures/abilities/mouth-teeth-rows-white.webp", @@ -521,7 +522,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "9Z0i0uURfBMVIapJ", "img": "icons/magic/sonic/projectile-sound-rings-wave.webp", @@ -616,7 +618,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "faM1UzclP0X3ZrkJ", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json b/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json index bcaf166a..af64867f 100644 --- a/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json +++ b/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json @@ -414,7 +414,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -475,7 +476,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [ { diff --git a/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json b/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json index 2a753812..1d686445 100644 --- a/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json +++ b/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json @@ -353,7 +353,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -407,7 +408,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [ { diff --git a/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json b/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json index 8b984fc1..74b228f5 100644 --- a/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json +++ b/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json @@ -315,7 +315,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -341,7 +342,8 @@ "actions": {}, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json b/src/packs/adversaries/adversary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json index f3ea25ff..7c3da937 100644 --- a/src/packs/adversaries/adversary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json +++ b/src/packs/adversaries/adversary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json @@ -277,7 +277,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json b/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json index e4e5f6f7..0ff01c70 100644 --- a/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json +++ b/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json @@ -271,7 +271,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "fh8ehANkVOnxEKVa", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", diff --git a/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json b/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json index f2522a90..59bdb150 100644 --- a/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json +++ b/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json @@ -352,7 +352,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "X0VgwJbK2n3mez0p", "img": "icons/creatures/abilities/fang-tooth-blood-red.webp", @@ -407,7 +408,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "DKVB4rbX2M1CCVM7", "img": "icons/magic/air/fog-gas-smoke-blue-gray.webp", diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json b/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json index 38cddad7..575d88ee 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json @@ -308,7 +308,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "VlHp8RjHy7MK8rqC", "img": "icons/environment/traps/cage-grey-steel.webp", diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json b/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json index 10e023c1..e0776c8c 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json @@ -284,7 +284,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "DLspoIclNJcTB3YJ", "img": "icons/magic/perception/eye-ringed-glow-angry-red.webp", @@ -434,7 +435,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "LVFZ4AfVhS6Q9hRy", "img": "icons/magic/sonic/projectile-shock-wave-blue.webp", @@ -529,7 +531,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "N4446BxubUanUQHH", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json b/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json index 6b4671ea..a11bef82 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json @@ -289,7 +289,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "uwAr6wR4k7ppI2cW", "img": "icons/skills/targeting/crosshair-pointed-orange.webp", @@ -388,7 +389,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "G7qZ9RHPyNns3axX", "img": "icons/commodities/tech/cog-brass.webp", @@ -487,7 +489,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "ALDtQci3ktq9cajU", "img": "icons/magic/sonic/explosion-shock-wave-teal.webp", 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 3bcdd49a..6f3d436e 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json @@ -614,7 +614,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "AXhSVGL33i0j6DAw", "img": "icons/creatures/abilities/tail-swipe-green.webp", @@ -669,7 +670,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "ggCol5LQ2ZpeQjly", "img": "icons/magic/air/fog-gas-smoke-brown.webp", @@ -819,7 +821,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "uWiyaJPXcoW06pOM", "img": "icons/creatures/abilities/mouth-teeth-fire-orange.webp", diff --git a/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json b/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json index d04dab50..2fcc4ada 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json @@ -419,7 +419,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "bpjpHxf6tj4i3H4r", "img": "icons/creatures/abilities/tail-swipe-green.webp", @@ -518,7 +519,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "NuksKUrbf4yj4vR2", "img": "icons/magic/fire/blast-jet-stream-embers-red.webp", @@ -699,7 +701,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "2mK8kxfp2WBUeBri", "img": "icons/magic/fire/blast-jet-stream-embers-orange.webp", @@ -818,7 +821,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "3VdQdUDULZCQPvLZ", "img": "icons/magic/fire/blast-jet-stream-embers-red.webp", @@ -843,7 +847,8 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "qYFoyDSdZ5X2h245", "img": "icons/magic/fire/flame-burning-eye.webp", diff --git a/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json b/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json index 2be56990..1eb81b18 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json @@ -528,7 +528,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "8bMOItTuL7PfAYcJ", "img": "icons/creatures/abilities/tail-swipe-green.webp", @@ -716,7 +717,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "5wLxyaWJuUhkx1EX", "img": "icons/creatures/reptiles/dragon-winged-blue.webp", @@ -741,7 +743,8 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "5llfnRwO7mfzDFgT", "img": "icons/magic/fire/flame-burning-eye.webp", diff --git a/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json b/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json index fcb3dc5a..efe20210 100644 --- a/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json +++ b/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json @@ -320,7 +320,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "dI2MGjC7NFAru1Gd", "img": "icons/magic/defensive/shield-barrier-blades-teal.webp", @@ -426,7 +427,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "PnQ0m0FLnpht7oE4", "img": "icons/magic/earth/barrier-stone-explosion-red.webp", @@ -532,7 +534,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "s2luvEVxJLZmOrdh", "img": "icons/magic/light/projectiles-trio-pink.webp", @@ -565,7 +568,7 @@ "actionType": "action", "cost": [], "uses": { - "value": null, + "value": 0, "max": "1", "recovery": null }, @@ -611,7 +614,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "9cPigHRcUfJC9gD8", "img": "icons/magic/defensive/barrier-shield-dome-blue-purple.webp", diff --git a/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json b/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json index d1d936e1..6319c895 100644 --- a/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json +++ b/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json @@ -306,7 +306,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [ { @@ -484,7 +485,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -580,7 +582,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json b/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json index 80fb7ce2..9cfb1884 100644 --- a/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json +++ b/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json @@ -287,7 +287,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [], "folder": null, @@ -348,7 +349,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "effects": [ { @@ -483,7 +485,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json b/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json index 28c00c51..f025f45f 100644 --- a/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json +++ b/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json @@ -477,7 +477,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "QV2ytK4b1VWF71OS", "img": "icons/magic/water/projectiles-ice-faceted-shard-salvo-blue.webp", @@ -600,7 +601,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "CcRTxCDCJskiu3fI", "img": "icons/magic/water/barrier-ice-wall-snow.webp", @@ -722,7 +724,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "nXZHOfcYvjg3YMNU", "img": "icons/commodities/leather/scales-blue.webp", @@ -861,7 +864,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "QHdJgT2fvwqquyf7", "img": "icons/skills/melee/strike-weapons-orange.webp", diff --git a/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json b/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json index a67dda37..0650319b 100644 --- a/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json +++ b/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json @@ -406,7 +406,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "d5Vilu9cUub1O6TD", "img": "icons/skills/melee/strike-slashes-orange.webp", diff --git a/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json b/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json index 9b8a118d..3e94c738 100644 --- a/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json +++ b/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json @@ -283,7 +283,8 @@ }, "originItemType": null, "subType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "effects": [], "folder": null, diff --git a/src/packs/environments/environment_Abandoned_Grove_pGEdzdLkqYtBhxnG.json b/src/packs/environments/environment_Abandoned_Grove_pGEdzdLkqYtBhxnG.json index 4d9be4f8..c1006da4 100644 --- a/src/packs/environments/environment_Abandoned_Grove_pGEdzdLkqYtBhxnG.json +++ b/src/packs/environments/environment_Abandoned_Grove_pGEdzdLkqYtBhxnG.json @@ -49,7 +49,7 @@ "width": 1, "height": 1, "texture": { - "src": "AbominationVaults.webp", + "src": "systems/daggerheart/assets/icons/documents/actors/forest.svg", "anchorX": 0.5, "anchorY": 0.5, "offsetX": 0, @@ -67,10 +67,10 @@ "disposition": -1, "displayBars": 0, "bar1": { - "attribute": "resources.hitPoints" + "attribute": null }, "bar2": { - "attribute": "resources.stress" + "attribute": null }, "light": { "negative": false, @@ -118,7 +118,7 @@ "ring": null, "background": null }, - "effects": 1, + "effects": 0, "subject": { "scale": 1, "texture": null @@ -249,7 +249,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "maK5OyfrOxcjCoPt", "img": "icons/magic/nature/root-vine-spiral-thorns-teal.webp", @@ -313,7 +314,8 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "uG5A2XQuUcPsXzgP", "img": "icons/magic/nature/hand-weapon-wood-bark-brown.webp", @@ -361,7 +363,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "3kkkbnWEvXk5TPK8", "img": "icons/magic/unholy/strike-hand-glow-pink.webp", diff --git a/src/packs/environments/environment_Ambushed_uGEdNYERCTJBEjc5.json b/src/packs/environments/environment_Ambushed_uGEdNYERCTJBEjc5.json index b32128dd..b0ccd435 100644 --- a/src/packs/environments/environment_Ambushed_uGEdNYERCTJBEjc5.json +++ b/src/packs/environments/environment_Ambushed_uGEdNYERCTJBEjc5.json @@ -221,7 +221,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "HfuVxgVidIVsapvI", "img": "icons/magic/perception/shadow-stealth-eyes-purple.webp", diff --git a/src/packs/environments/environment_Ambushers_uXZpebPR77YQ1oXI.json b/src/packs/environments/environment_Ambushers_uXZpebPR77YQ1oXI.json index ed40af4a..e8ba889a 100644 --- a/src/packs/environments/environment_Ambushers_uXZpebPR77YQ1oXI.json +++ b/src/packs/environments/environment_Ambushers_uXZpebPR77YQ1oXI.json @@ -183,7 +183,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "b6Qviz1ANG8OrAYq", "img": "icons/skills/wounds/injury-face-impact-orange.webp", 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 39070236..dc42fb07 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 @@ -252,7 +252,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "1aOeMMX0XuDtZbbB", "img": "icons/magic/nature/root-vine-spiral-thorns-teal.webp", @@ -391,7 +392,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "JKFkDvwUOP35Tsr1", "img": "icons/creatures/magical/construct-face-stone-pink.webp", @@ -508,7 +510,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "kYxuTZjH7HDUGeWh", "img": "icons/magic/air/fog-gas-smoke-brown.webp", diff --git a/src/packs/environments/environment_Bustling_Marketplace_HZKA7hkej7JJY503.json b/src/packs/environments/environment_Bustling_Marketplace_HZKA7hkej7JJY503.json index b0b5b591..ad96108b 100644 --- a/src/packs/environments/environment_Bustling_Marketplace_HZKA7hkej7JJY503.json +++ b/src/packs/environments/environment_Bustling_Marketplace_HZKA7hkej7JJY503.json @@ -168,7 +168,8 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "60uDqt9omFifZ7xd", "img": "icons/commodities/treasure/brooch-jeweled-pink.webp", @@ -291,7 +292,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "56qjiKMoN6S9riI6", "img": "icons/skills/social/theft-pickpocket-bribery-brown.webp", @@ -316,7 +318,8 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "l2FzZpR2reVmlkdp", "img": "icons/skills/movement/arrow-upward-blue.webp", diff --git a/src/packs/environments/environment_Castle_Siege_1eZ32Esq7rfZOjlu.json b/src/packs/environments/environment_Castle_Siege_1eZ32Esq7rfZOjlu.json index 80344b0f..411a10c7 100644 --- a/src/packs/environments/environment_Castle_Siege_1eZ32Esq7rfZOjlu.json +++ b/src/packs/environments/environment_Castle_Siege_1eZ32Esq7rfZOjlu.json @@ -277,7 +277,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "eSTq8Y0v4Dwd13XU", "img": "icons/weapons/artillery/catapult-simple.webp", @@ -302,7 +303,8 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "U59K0WKVjwbgzMZU", "img": "icons/environment/people/charge.webp", @@ -401,7 +403,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "bemKmwjBtbEFVWXM", "img": "icons/magic/earth/projectile-stone-boulder-brown.webp", diff --git a/src/packs/environments/environment_Chaos_Realm_2Z1mKc65LxNk2PqR.json b/src/packs/environments/environment_Chaos_Realm_2Z1mKc65LxNk2PqR.json index 9ceca2a6..77781de0 100644 --- a/src/packs/environments/environment_Chaos_Realm_2Z1mKc65LxNk2PqR.json +++ b/src/packs/environments/environment_Chaos_Realm_2Z1mKc65LxNk2PqR.json @@ -335,7 +335,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "0OYHJZqT0DlVz5be", "img": "icons/magic/control/sihouette-hold-beam-green.webp", @@ -441,7 +442,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "RNbAdBZM6gDNaRPn", "img": "icons/magic/unholy/energy-smoke-pink.webp", @@ -496,7 +498,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "SZpUJeJETVQtZwae", "img": "icons/creatures/unholy/demons-horned-glowing-pink.webp", @@ -574,7 +577,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "MyIh4CJsDnkjmeYs", "img": "icons/magic/perception/hand-eye-pink.webp", diff --git a/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json b/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json index e72ac02e..548cf7c4 100644 --- a/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json +++ b/src/packs/environments/environment_Cliffside_Ascent_LPpfdlNKqiZIl04w.json @@ -462,7 +462,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "EP4FXeQqbqFGQoIX", "img": "icons/skills/movement/arrow-down-pink.webp", diff --git a/src/packs/environments/environment_Cult_Ritual_QAXXiOKBDmCTauHD.json b/src/packs/environments/environment_Cult_Ritual_QAXXiOKBDmCTauHD.json index 80074b2e..705c9585 100644 --- a/src/packs/environments/environment_Cult_Ritual_QAXXiOKBDmCTauHD.json +++ b/src/packs/environments/environment_Cult_Ritual_QAXXiOKBDmCTauHD.json @@ -195,7 +195,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "0Rgqw1kUPeJ11ldd", "img": "icons/magic/unholy/orb-swirling-teal.webp", @@ -370,7 +371,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "oFfu3hUhp4ta4qwT", "img": "icons/magic/unholy/barrier-fire-pink.webp", @@ -395,7 +397,8 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "WltEUhtYwfnX8WCc", "img": "icons/skills/wounds/blood-drip-droplet-red.webp", diff --git a/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json b/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json index ada17126..aacf87e9 100644 --- a/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json +++ b/src/packs/environments/environment_Divine_Usurpation_4DLYez7VbMCFDAuZ.json @@ -279,7 +279,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "OWUM3eFiZrIn0Bjd", "img": "icons/magic/unholy/orb-hands-pink.webp", @@ -384,7 +385,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "CL3wPZNOtw6m5WVT", "img": "icons/magic/unholy/hand-light-pink.webp", @@ -561,7 +563,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "AJdG1krRvixBFCZG", "img": "icons/magic/unholy/silhouette-robe-evil-glow.webp", @@ -638,7 +641,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "GUAo44cJCnS1GE9p", "img": "icons/magic/unholy/barrier-fire-pink.webp", diff --git a/src/packs/environments/environment_Hallowed_Temple_dsA6j69AnaJhUyqH.json b/src/packs/environments/environment_Hallowed_Temple_dsA6j69AnaJhUyqH.json index 342039be..f005fa59 100644 --- a/src/packs/environments/environment_Hallowed_Temple_dsA6j69AnaJhUyqH.json +++ b/src/packs/environments/environment_Hallowed_Temple_dsA6j69AnaJhUyqH.json @@ -226,7 +226,7 @@ "name": "Divine Guidance", "type": "feature", "system": { - "description": "

A PC who prays to a deity while in the Hallowed Temple can make an Instinct Roll to receive answers. If the god they beseech isn’t welcome in this temple, the roll is made with disadvantage.

  • Critical Success: The PC gains clear information. Additionally, they gain [[/r 1d4]] Hope, which can be distributed between the party if they share the vision and guidance they received.

  • Success with Hope: The PC receives clear information.

  • Success with Fear: The PC receives brief flashes of insight and an emotional impression conveying an answer.

  • Any Failure: The PC receives only vague flashes. They can mark a Stress to receive one clear image without context.

What does it feel like as you are touched by this vision? What feeling lingers after the images have passed?
", + "description": "

A PC who prays to a deity while in the Hallowed Temple can make an Instinct Roll to receive answers. If the god they beseech isn’t welcome in this temple, the roll is made with disadvantage.

  • Critical Success: The PC gains clear information. Additionally, they gain [[/r 1d4]] Hope, which can be distributed between the party if they share the vision and guidance they received.

  • Success with Hope: The PC receives clear information.

  • Success with Fear: The PC receives brief flashes of insight and an emotional impression conveying an answer.

  • Any Failure: The PC receives only vague flashes. They can mark a Stress to receive one clear image without context.

What does it feel like as you are touched by this vision? What feeling lingers after the images have passed?

", "resource": null, "actions": {}, "originItemType": null, @@ -308,7 +308,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "vICfHK2urDQ2Jm8s", "img": "icons/magic/holy/barrier-shield-winged-blue.webp", @@ -363,7 +364,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "8tGAuFRyM4onvQ2o", "img": "icons/magic/holy/projectiles-blades-salvo-yellow.webp", diff --git a/src/packs/environments/environment_Haunted_City_OzYbizKraK92FDiI.json b/src/packs/environments/environment_Haunted_City_OzYbizKraK92FDiI.json index 30a436bd..1bd07a57 100644 --- a/src/packs/environments/environment_Haunted_City_OzYbizKraK92FDiI.json +++ b/src/packs/environments/environment_Haunted_City_OzYbizKraK92FDiI.json @@ -259,7 +259,8 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "ZA2RzxH5FlnrcYLN", "img": "icons/magic/death/undead-ghosts-trio-blue.webp", @@ -331,7 +332,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "i0FV2Djaq0vB57cq", "img": "icons/magic/death/skull-weapon-staff-glow-pink.webp", diff --git a/src/packs/environments/environment_Imperial_Court_jr1xAoXzVwVblzxI.json b/src/packs/environments/environment_Imperial_Court_jr1xAoXzVwVblzxI.json index 5af29dd0..4b49c341 100644 --- a/src/packs/environments/environment_Imperial_Court_jr1xAoXzVwVblzxI.json +++ b/src/packs/environments/environment_Imperial_Court_jr1xAoXzVwVblzxI.json @@ -268,7 +268,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "tm9FL5gJF7Oheu21", "img": "icons/magic/death/skull-energy-light-white.webp", @@ -340,7 +341,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "HwSKX5r40ux0OfJN", "img": "icons/sundries/documents/document-sealed-red-white.webp", @@ -419,7 +421,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "YPMgWUagVq1Hicqo", "img": "icons/magic/perception/orb-eye-scrying.webp", diff --git a/src/packs/environments/environment_Local_Tavern_cM4X81DOyvxNIi52.json b/src/packs/environments/environment_Local_Tavern_cM4X81DOyvxNIi52.json index 8ff4d3b5..105f230f 100644 --- a/src/packs/environments/environment_Local_Tavern_cM4X81DOyvxNIi52.json +++ b/src/packs/environments/environment_Local_Tavern_cM4X81DOyvxNIi52.json @@ -201,7 +201,8 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "cAbSo5VQHxJqJPKm", "img": "icons/magic/unholy/silhouette-robe-evil-power.webp", @@ -222,11 +223,12 @@ "name": "Someone Comes to Town", "type": "feature", "system": { - "description": "

Introduce a signifi cant NPC who wants to hire the party for something or who relates to a PC’s background.

Did they know the PCs were here? What do they want in this town?

", + "description": "

Introduce a significant NPC who wants to hire the party for something or who relates to a PC’s background.

Did they know the PCs were here? What do they want in this town?

", "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "QPezCAC18vIc5xRC", "img": "icons/environment/people/commoner.webp", @@ -303,7 +305,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "H3LNvVrUbsAkgjni", "img": "icons/skills/melee/unarmed-punch-fist-white.webp", diff --git a/src/packs/environments/environment_Mountain_Pass_acMu9wJrMZZzLSTJ.json b/src/packs/environments/environment_Mountain_Pass_acMu9wJrMZZzLSTJ.json index 3be39fc8..8e7cf1c8 100644 --- a/src/packs/environments/environment_Mountain_Pass_acMu9wJrMZZzLSTJ.json +++ b/src/packs/environments/environment_Mountain_Pass_acMu9wJrMZZzLSTJ.json @@ -222,7 +222,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "jkm03DXYYajsRk2j", "img": "icons/magic/earth/projectile-boulder-dust.webp", @@ -247,7 +248,8 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "hkZVEduCWJFR0h2S", "img": "icons/creatures/birds/corvid-flying-wings-purple.webp", @@ -382,7 +384,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "K8ld4m5yTA6WZwUs", "img": "icons/magic/water/snowflake-ice-blue-white.webp", diff --git a/src/packs/environments/environment_Necromancer_s_Ossuary_h3KyRL7AshhLAmcH.json b/src/packs/environments/environment_Necromancer_s_Ossuary_h3KyRL7AshhLAmcH.json index 1cb43050..e96b9177 100644 --- a/src/packs/environments/environment_Necromancer_s_Ossuary_h3KyRL7AshhLAmcH.json +++ b/src/packs/environments/environment_Necromancer_s_Ossuary_h3KyRL7AshhLAmcH.json @@ -311,7 +311,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "asSGMUdf4gG4PO8F", "img": "icons/magic/death/bones-crossed-gray.webp", @@ -383,7 +384,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "mnpqMpYCjdlwtvBp", "img": "icons/magic/death/skull-weapon-staff-glow-pink.webp", @@ -438,7 +440,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "chJRXNg5zyTGbcG5", "img": "icons/magic/death/undead-zombie-grave-green.webp", diff --git a/src/packs/environments/environment_Outpost_Town_YezryR32uo39xRxW.json b/src/packs/environments/environment_Outpost_Town_YezryR32uo39xRxW.json index d0f4eae2..bc3c211d 100644 --- a/src/packs/environments/environment_Outpost_Town_YezryR32uo39xRxW.json +++ b/src/packs/environments/environment_Outpost_Town_YezryR32uo39xRxW.json @@ -222,7 +222,8 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "uxu8YrvYVxP3Qc2y", "img": "icons/skills/melee/unarmed-punch-fist-yellow-red.webp", @@ -277,7 +278,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "reaction" }, "_id": "21tdueq5Wgvj3vG4", "img": "icons/environment/settlement/watchtower-moonlit-blue.webp", diff --git a/src/packs/environments/environment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json b/src/packs/environments/environment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json index 36e21f82..7be27924 100644 --- a/src/packs/environments/environment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json +++ b/src/packs/environments/environment_Pitched_Battle_EWD3ZsLoK6VMVOf7.json @@ -172,7 +172,8 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "fnvOiHKsd34EaLqG", "img": "icons/magic/fire/flame-burning-building.webp", @@ -278,7 +279,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "r9kkodHghWm01mje", "img": "icons/magic/fire/explosion-flame-lightning-strike.webp", @@ -303,7 +305,8 @@ "resource": null, "actions": {}, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "ZAIvH5CfhehW48EY", "img": "icons/environment/people/charge.webp", diff --git a/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json b/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json index 40dbb1c6..5c973fa6 100644 --- a/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json +++ b/src/packs/environments/environment_Raging_River_t4cdqTfzcqP3H1vJ.json @@ -296,7 +296,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "WsNoSwwtv0r80BMj", "img": "icons/magic/water/wave-water-teal.webp", @@ -390,7 +391,8 @@ } }, "originItemType": null, - "originId": null + "originId": null, + "featureForm": "action" }, "_id": "SDTS3LOPMVJOt1S1", "img": "icons/creatures/reptiles/snake-fangs-bite-green-yellow.webp", diff --git a/templates/sheets-settings/action-settings/base.hbs b/templates/sheets-settings/action-settings/base.hbs index 69b5dfce..65010903 100644 --- a/templates/sheets-settings/action-settings/base.hbs +++ b/templates/sheets-settings/action-settings/base.hbs @@ -7,7 +7,6 @@ {{localize "DAGGERHEART.GENERAL.identify"}} {{formField fields.name value=source.name label="Name" name="name"}} {{formField fields.img value=source.img label="Icon" name="img"}} - {{formField fields.actionType value=source.actionType label="Type" name="actionType" localize=true}} {{formField fields.chatDisplay value=source.chatDisplay name="chatDisplay" classes="checkbox" localize=true}}
diff --git a/templates/sheets/global/partials/inventory-item-V2.hbs b/templates/sheets/global/partials/inventory-item-V2.hbs index cd9626e3..daf12132 100644 --- a/templates/sheets/global/partials/inventory-item-V2.hbs +++ b/templates/sheets/global/partials/inventory-item-V2.hbs @@ -49,6 +49,19 @@ Parameters: {{tag}}

{{/each}} + + {{!-- Feature Form Tag Start --}} + {{#if (eq ../type 'feature')}} + {{#if (or (eq @root.document.type 'adversary') (eq @root.document.type 'environment'))}} + {{#if system.featureForm}} +
+ {{localize (concat "DAGGERHEART.CONFIG.FeatureForm." system.featureForm)}} +
+ {{/if}} + {{/if}} + {{/if}} + {{!-- Feature Form Tag End --}} +
{{/if}} {{/with}} @@ -145,10 +158,12 @@ Parameters:
{{#if (and (eq action.type 'beastform') @root.beastformActive)}} {{else}} {{/if}} diff --git a/templates/sheets/global/partials/inventory-item.hbs b/templates/sheets/global/partials/inventory-item.hbs index b239e226..d69b0abb 100644 --- a/templates/sheets/global/partials/inventory-item.hbs +++ b/templates/sheets/global/partials/inventory-item.hbs @@ -67,6 +67,21 @@
{{/if}} {{/if}} + + + {{#if (eq type 'feature')}} + {{#if (or (eq @root.document.type 'adversary') (eq @root.document.type 'environment'))}} + {{#if item.system.featureForm}} +
+
+ {{localize "DAGGERHEART.CONFIG.FeatureForm.label"}}: + {{localize (concat "DAGGERHEART.CONFIG.FeatureForm." item.system.featureForm)}} +
+
+ {{/if}} + {{/if}} + {{/if}} + {{#if (eq type 'domainCard')}} {{#if isSidebar}}
diff --git a/templates/sheets/items/feature/header.hbs b/templates/sheets/items/feature/header.hbs index e603c0f7..efaba77b 100755 --- a/templates/sheets/items/feature/header.hbs +++ b/templates/sheets/items/feature/header.hbs @@ -4,7 +4,7 @@

-

{{localize 'TYPES.Item.feature'}}

+

{{localize (concat 'DAGGERHEART.CONFIG.FeatureForm.' source.system.featureForm)}} {{localize 'TYPES.Item.feature'}}

\ No newline at end of file diff --git a/templates/sheets/items/feature/settings.hbs b/templates/sheets/items/feature/settings.hbs index c2ecb3fe..63aa9502 100644 --- a/templates/sheets/items/feature/settings.hbs +++ b/templates/sheets/items/feature/settings.hbs @@ -3,5 +3,12 @@ data-tab='{{tabs.settings.id}}' data-group='{{tabs.settings.group}}' > + {{#if (or (eq document.parent.type "adversary") (eq document.parent.type "environment"))}} +
+ {{localize "DAGGERHEART.GENERAL.general"}} + {{localize "DAGGERHEART.CONFIG.FeatureForm.label"}} + {{formInput document.system.schema.fields.featureForm value=document.system.featureForm choices=featureFormChoices localize=true}} +
+ {{/if}} {{> "systems/daggerheart/templates/sheets/global/partials/resource-section/resource-section.hbs" }} \ No newline at end of file From 605a23ab58d4c7c711e89504fb25193c767ad5db Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Sat, 20 Dec 2025 15:25:51 -0500 Subject: [PATCH 09/33] Fix invalid form control is not focusable error on gold fields (#1451) --- module/applications/sheets/api/application-mixin.mjs | 1 - 1 file changed, 1 deletion(-) diff --git a/module/applications/sheets/api/application-mixin.mjs b/module/applications/sheets/api/application-mixin.mjs index 619305f1..d25a1a4e 100644 --- a/module/applications/sheets/api/application-mixin.mjs +++ b/module/applications/sheets/api/application-mixin.mjs @@ -183,7 +183,6 @@ export default function DHApplicationMixin(Base) { for (const deltaInput of htmlElement.querySelectorAll('input[data-allow-delta]')) { deltaInput.dataset.numValue = deltaInput.value; deltaInput.inputMode = 'numeric'; - deltaInput.pattern = '^[+=\\-]?\d*'; const handleUpdate = (delta = 0) => { const min = Number(deltaInput.min) || 0; From 0508bf4188097294ffe960a1aa4feed5e1369b7c Mon Sep 17 00:00:00 2001 From: Nick Salyzyn Date: Sat, 20 Dec 2025 14:00:16 -0700 Subject: [PATCH 10/33] [PR] Removing refreshables the user doesn't have during rest actions (#1449) * Marking up the places that need changing for bug #1160 * Creating a shared method called isItemAvailable and using it in downtime * Explicitely adding the false value rather than relying on undefined returns. Oops * Removing spaces * Removing a needless return line * Adding missing semicolon --- module/applications/dialogs/downtime.mjs | 2 +- module/data/actor/base.mjs | 12 +++++++ module/data/actor/character.mjs | 45 ++++++++++++++++-------- module/documents/activeEffect.mjs | 25 +++---------- 4 files changed, 47 insertions(+), 37 deletions(-) diff --git a/module/applications/dialogs/downtime.mjs b/module/applications/dialogs/downtime.mjs index 96e06446..3d5b7f0f 100644 --- a/module/applications/dialogs/downtime.mjs +++ b/module/applications/dialogs/downtime.mjs @@ -93,7 +93,7 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV } getRefreshables() { - const actionItems = this.actor.items.reduce((acc, x) => { + const actionItems = this.actor.items.filter(x => this.actor.system.isItemAvailable(x)).reduce((acc, x) => { if (x.system.actions) { const recoverable = x.system.actions.reduce((acc, action) => { if (refreshIsAllowed([this.shortrest ? 'shortRest' : 'longRest'], action.uses.recovery)) { diff --git a/module/data/actor/base.mjs b/module/data/actor/base.mjs index c7f7ee75..f3662da2 100644 --- a/module/data/actor/base.mjs +++ b/module/data/actor/base.mjs @@ -1,4 +1,5 @@ import DHBaseActorSettings from '../../applications/sheets/api/actor-setting.mjs'; +import DHItem from '../../documents/item.mjs'; import { getScrollTextData } from '../../helpers/utils.mjs'; const resistanceField = (resistanceLabel, immunityLabel, reductionLabel) => @@ -106,6 +107,17 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel { return data; } + /** + * Checks if an item is available for use, such as multiclass features being disabled + * on a character. + * + * @param {DHItem} item The item being checked for availability + * @return {boolean} whether the item is available + */ + isItemAvailable(item) { + return true; + } + async _preDelete() { /* Clear all partyMembers from tagTeam setting.*/ /* Revisit this when tagTeam is improved for many parties */ diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs index c5ab914c..5bce5c55 100644 --- a/module/data/actor/character.mjs +++ b/module/data/actor/character.mjs @@ -435,6 +435,34 @@ export default class DhCharacter extends BaseDataActor { return attack; } + /** @inheritDoc */ + isItemAvailable(item) { + if (!super.isItemAvailable(this)) return false; + /** + * Preventing subclass features from being available if the chacaracter does not + * have the right subclass advancement + */ + if (item.system.originItemType !== CONFIG.DH.ITEM.featureTypes.subclass.id) { + return true; + } + if (!this.class.subclass) return false; + + const prop = item.system.multiclassOrigin ? 'multiclass' : 'class'; + const subclassState = this[prop].subclass?.system?.featureState; + if (!subclassState) return false; + + if ( + item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.foundation || + (item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.specialization && + subclassState >= 2) || + (item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.mastery && subclassState >= 3) + ) { + return true; + } else { + return false; + } + } + get sheetLists() { const ancestryFeatures = [], communityFeatures = [], @@ -443,7 +471,7 @@ export default class DhCharacter extends BaseDataActor { companionFeatures = [], features = []; - for (let item of this.parent.items) { + for (let item of this.parent.items.filter(x => this.isItemAvailable(x))) { if (item.system.originItemType === CONFIG.DH.ITEM.featureTypes.ancestry.id) { ancestryFeatures.push(item); } else if (item.system.originItemType === CONFIG.DH.ITEM.featureTypes.community.id) { @@ -451,20 +479,7 @@ export default class DhCharacter extends BaseDataActor { } else if (item.system.originItemType === CONFIG.DH.ITEM.featureTypes.class.id) { classFeatures.push(item); } else if (item.system.originItemType === CONFIG.DH.ITEM.featureTypes.subclass.id) { - if (this.class.subclass) { - const prop = item.system.multiclassOrigin ? 'multiclass' : 'class'; - const subclassState = this[prop].subclass?.system?.featureState; - if (!subclassState) continue; - - if ( - item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.foundation || - (item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.specialization && - subclassState >= 2) || - (item.system.identifier === CONFIG.DH.ITEM.featureSubTypes.mastery && subclassState >= 3) - ) { - subclassFeatures.push(item); - } - } + subclassFeatures.push(item); } else if (item.system.originItemType === CONFIG.DH.ITEM.featureTypes.companion.id) { companionFeatures.push(item); } else if (item.type === 'feature' && !item.system.type) { diff --git a/module/documents/activeEffect.mjs b/module/documents/activeEffect.mjs index fcf1d590..2297ea27 100644 --- a/module/documents/activeEffect.mjs +++ b/module/documents/activeEffect.mjs @@ -194,27 +194,10 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect { } prepareDerivedData() { - /* Preventing subclass features from transferring to actor if they do not have the right subclass advancement */ - if (this.parent?.type === 'feature') { - const origSubclassParent = this.parent.system.originItemType === 'subclass'; - if (origSubclassParent) { - const subclass = this.parent.parent.items.find( - x => - x.type === 'subclass' && - x.system.isMulticlass === (this.parent.system.identifier === 'multiclass') - ); - - if (subclass) { - const featureState = subclass.system.featureState; - - if ( - (this.parent.system.identifier === CONFIG.DH.ITEM.featureSubTypes.specialization && - featureState < 2) || - (this.parent.system.identifier === CONFIG.DH.ITEM.featureSubTypes.mastery && featureState < 3) - ) { - this.transfer = false; - } - } + /* Check for item availability such as in the case of subclass advancement. */ + if (this.parent?.parent?.system?.isItemAvailable) { + if (!this.parent.parent.system.isItemAvailable(this.parent)) { + this.transfer = false; } } } From 9cfa206adc156eda75ea994f9f883c5009bff11a Mon Sep 17 00:00:00 2001 From: Nick Salyzyn Date: Sat, 20 Dec 2025 14:56:22 -0700 Subject: [PATCH 11/33] [PR] Checking for empty data in renderChatMessageHTML calls (#1452) --- daggerheart.mjs | 4 ++-- module/applications/ui/chatLog.mjs | 17 +++++++++-------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/daggerheart.mjs b/daggerheart.mjs index 644d6d86..eeed29dc 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -193,9 +193,9 @@ Hooks.on('ready', async () => { Hooks.once('dicesoniceready', () => {}); -Hooks.on('renderChatMessageHTML', (_, element, message) => { +Hooks.on('renderChatMessageHTML', (document, element) => { enricherRenderSetup(element); - const cssClass = message.message.flags?.daggerheart?.cssClass; + const cssClass = document.flags?.daggerheart?.cssClass; if (cssClass) cssClass.split(' ').forEach(cls => element.classList.add(cls)); }); diff --git a/module/applications/ui/chatLog.mjs b/module/applications/ui/chatLog.mjs index 47dfe500..45d9c0b3 100644 --- a/module/applications/ui/chatLog.mjs +++ b/module/applications/ui/chatLog.mjs @@ -55,27 +55,28 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo ]; } - addChatListeners = async (app, html, data) => { + addChatListeners = async (document, html, data) => { + const message = data?.message ?? document.toObject(false); html.querySelectorAll('.simple-roll-button').forEach(element => - element.addEventListener('click', event => this.onRollSimple(event, data.message)) + element.addEventListener('click', event => this.onRollSimple(event, message)) ); html.querySelectorAll('.ability-use-button').forEach(element => - element.addEventListener('click', event => this.abilityUseButton(event, data.message)) + element.addEventListener('click', event => this.abilityUseButton(event, message)) ); html.querySelectorAll('.action-use-button').forEach(element => - element.addEventListener('click', event => this.actionUseButton(event, data.message)) + element.addEventListener('click', event => this.actionUseButton(event, message)) ); html.querySelectorAll('.reroll-button').forEach(element => - element.addEventListener('click', event => this.rerollEvent(event, data.message)) + element.addEventListener('click', event => this.rerollEvent(event, message)) ); html.querySelectorAll('.group-roll-button').forEach(element => - element.addEventListener('click', event => this.groupRollButton(event, data.message)) + element.addEventListener('click', event => this.groupRollButton(event, message)) ); html.querySelectorAll('.group-roll-reroll').forEach(element => - element.addEventListener('click', event => this.groupRollReroll(event, data.message)) + element.addEventListener('click', event => this.groupRollReroll(event, message)) ); html.querySelectorAll('.group-roll-success').forEach(element => - element.addEventListener('click', event => this.groupRollSuccessEvent(event, data.message)) + element.addEventListener('click', event => this.groupRollSuccessEvent(event, message)) ); html.querySelectorAll('.group-roll-header-expand-section').forEach(element => element.addEventListener('click', this.groupRollExpandSection) From 148c9c019a30ceca242d0b4c10cdd5a0dd85f4cb Mon Sep 17 00:00:00 2001 From: Nick Salyzyn Date: Sat, 20 Dec 2025 15:04:36 -0700 Subject: [PATCH 12/33] [PR] Use the token name in the chat message targets window (#1441) --- module/data/fields/action/targetField.mjs | 2 +- templates/ui/chat/parts/target-part.hbs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/data/fields/action/targetField.mjs b/module/data/fields/action/targetField.mjs index 41383fea..73766118 100644 --- a/module/data/fields/action/targetField.mjs +++ b/module/data/fields/action/targetField.mjs @@ -79,7 +79,7 @@ export default class TargetField extends fields.SchemaField { return { id: token.id, actorId: token.actor.uuid, - name: token.actor.name, + name: token.name, img: token.actor.img, difficulty: token.actor.system.difficulty, evasion: token.actor.system.evasion, diff --git a/templates/ui/chat/parts/target-part.hbs b/templates/ui/chat/parts/target-part.hbs index 7c777fdb..477445a3 100644 --- a/templates/ui/chat/parts/target-part.hbs +++ b/templates/ui/chat/parts/target-part.hbs @@ -29,7 +29,7 @@
-
{{name}}
+
{{name}}
{{#if (and ../hasRoll (hasProperty this "hit"))}}
{{#if hit}} From fe80b4d0f882ea1408cf26ece015f321cbc7685f Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Sat, 20 Dec 2025 17:08:24 -0500 Subject: [PATCH 13/33] [PR] [Feature] Refocus consumable quantity and simple resource fields on change (#1401) * Refocus quantity and simple resource fields on change * Swap to uuid --- templates/sheets/global/partials/inventory-item-V2.hbs | 2 +- templates/sheets/global/partials/item-resource.hbs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/sheets/global/partials/inventory-item-V2.hbs b/templates/sheets/global/partials/inventory-item-V2.hbs index daf12132..91f8d581 100644 --- a/templates/sheets/global/partials/inventory-item-V2.hbs +++ b/templates/sheets/global/partials/inventory-item-V2.hbs @@ -74,7 +74,7 @@ Parameters: {{/if}} {{#if (and (not hideResources) (gte item.system.quantity 0))}}
- +
{{/if}} diff --git a/templates/sheets/global/partials/item-resource.hbs b/templates/sheets/global/partials/item-resource.hbs index def153ea..fbcf02ca 100644 --- a/templates/sheets/global/partials/item-resource.hbs +++ b/templates/sheets/global/partials/item-resource.hbs @@ -1,7 +1,7 @@ {{#if (eq item.system.resource.type 'simple')}}
- +
{{else if (eq item.system.resource.type 'diceValue')}}
From b8e08fccd104d6a378b4c9fd4ad9fa808ccf39dc Mon Sep 17 00:00:00 2001 From: Nick Salyzyn Date: Sat, 20 Dec 2025 15:14:23 -0700 Subject: [PATCH 14/33] [PR] Removing a potential reference error when creating a tag team roll (#1430) --- module/applications/dialogs/tagTeamDialog.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/applications/dialogs/tagTeamDialog.mjs b/module/applications/dialogs/tagTeamDialog.mjs index b53d03ab..0bc4bf0c 100644 --- a/module/applications/dialogs/tagTeamDialog.mjs +++ b/module/applications/dialogs/tagTeamDialog.mjs @@ -220,8 +220,8 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio !roll.system.isCritical && criticalRoll ? (await getCritDamageBonus(damage.formula)) + damage.total : damage.total; + const updatedDamageParts = damage.parts; if (systemData.damage[key]) { - const updatedDamageParts = damage.parts; if (!roll.system.isCritical && criticalRoll) { for (let part of updatedDamageParts) { const criticalDamage = await getCritDamageBonus(part.formula); From f786ee5f06168b014aa09b971f337ddd5fe3d1e8 Mon Sep 17 00:00:00 2001 From: WBHarry Date: Sun, 21 Dec 2025 15:39:05 +0100 Subject: [PATCH 15/33] Fixed actionType constants --- module/applications/dialogs/d20RollDialog.mjs | 6 +-- module/dice/dhRoll.mjs | 38 +++++++++---------- module/dice/dualityRoll.mjs | 2 +- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/module/applications/dialogs/d20RollDialog.mjs b/module/applications/dialogs/d20RollDialog.mjs index b28a3ffb..5ef9e005 100644 --- a/module/applications/dialogs/d20RollDialog.mjs +++ b/module/applications/dialogs/d20RollDialog.mjs @@ -195,9 +195,9 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio if (this.config.roll) { this.reactionOverride = !this.reactionOverride; this.config.actionType = this.reactionOverride - ? CONFIG.DH.ITEM.actionTypes.reaction.id - : this.config.actionType === CONFIG.DH.ITEM.actionTypes.reaction.id - ? CONFIG.DH.ITEM.actionTypes.action.id + ? 'reaction' + : this.config.actionType === 'reaction' + ? 'action' : this.config.actionType; this.render(); } diff --git a/module/dice/dhRoll.mjs b/module/dice/dhRoll.mjs index ce39ed6a..ec289941 100644 --- a/module/dice/dhRoll.mjs +++ b/module/dice/dhRoll.mjs @@ -240,11 +240,13 @@ export default class DHRoll extends Roll { async function automateHopeFear(config) { const automationSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation); const hopeFearAutomation = automationSettings.hopeFear; - if (!config.source?.actor || + if ( + !config.source?.actor || (game.user.isGM ? !hopeFearAutomation.gm : !hopeFearAutomation.players) || config.actionType === 'reaction' || config.tagTeamSelected || - config.skips?.resources) + config.skips?.resources + ) return; const actor = await fromUuid(config.source.actor); let updates = []; @@ -252,26 +254,22 @@ async function automateHopeFear(config) { if (config.rerolledRoll) { if (config.roll.result.duality != config.rerolledRoll.result.duality) { - const hope = (config.roll.isCritical || config.roll.result.duality === 1 ? 1 : 0) - - (config.rerolledRoll.isCritical || config.rerolledRoll.result.duality === 1 ? 1 : 0); + const hope = + (config.roll.isCritical || config.roll.result.duality === 1 ? 1 : 0) - + (config.rerolledRoll.isCritical || config.rerolledRoll.result.duality === 1 ? 1 : 0); const stress = (config.roll.isCritical ? 1 : 0) - (config.rerolledRoll.isCritical ? 1 : 0); - const fear = (config.roll.result.duality === -1 ? 1 : 0) - - (config.rerolledRoll.result.duality === -1 ? 1 : 0) + const fear = + (config.roll.result.duality === -1 ? 1 : 0) - (config.rerolledRoll.result.duality === -1 ? 1 : 0); - if (hope !== 0) - updates.push({ key: 'hope', value: hope, total: -1 * hope, enabled: true }); - if (stress !== 0) - updates.push({ key: 'stress', value: -1 * stress, total: stress, enabled: true }); - if (fear !== 0) - updates.push({ key: 'fear', value: fear, total: -1 * fear, enabled: true }); + if (hope !== 0) updates.push({ key: 'hope', value: hope, total: -1 * hope, enabled: true }); + if (stress !== 0) updates.push({ key: 'stress', value: -1 * stress, total: stress, enabled: true }); + if (fear !== 0) updates.push({ key: 'fear', value: fear, total: -1 * fear, enabled: true }); } } else { if (config.roll.isCritical || config.roll.result.duality === 1) updates.push({ key: 'hope', value: 1, total: -1, enabled: true }); - if (config.roll.isCritical) - updates.push({ key: 'stress', value: -1, total: 1, enabled: true }); - if (config.roll.result.duality === -1) - updates.push({ key: 'fear', value: 1, total: -1, enabled: true }); + if (config.roll.isCritical) updates.push({ key: 'stress', value: -1, total: 1, enabled: true }); + if (config.roll.result.duality === -1) updates.push({ key: 'fear', value: 1, total: -1, enabled: true }); } if (updates.length) { @@ -287,15 +285,17 @@ export const registerRollDiceHooks = () => { 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.actionType !== 'reaction' && !config.tagTeamSelected && !config.skips?.updateCountdowns ) { const { updateCountdowns } = game.system.api.applications.ui.DhCountdowns; if (config.roll.result.duality === -1) { - await updateCountdowns(CONFIG.DH.GENERAL.countdownProgressionTypes.actionRoll.id, - CONFIG.DH.GENERAL.countdownProgressionTypes.fear.id); + await updateCountdowns( + CONFIG.DH.GENERAL.countdownProgressionTypes.actionRoll.id, + CONFIG.DH.GENERAL.countdownProgressionTypes.fear.id + ); } else { await updateCountdowns(CONFIG.DH.GENERAL.countdownProgressionTypes.actionRoll.id); } diff --git a/module/dice/dualityRoll.mjs b/module/dice/dualityRoll.mjs index 59cb6e02..4d305c6c 100644 --- a/module/dice/dualityRoll.mjs +++ b/module/dice/dualityRoll.mjs @@ -19,7 +19,7 @@ export default class DualityRoll extends D20Roll { get title() { return game.i18n.localize( - `DAGGERHEART.GENERAL.${this.options?.actionType === CONFIG.DH.ITEM.actionTypes.reaction.id ? 'reactionRoll' : 'dualityRoll'}` + `DAGGERHEART.GENERAL.${this.options?.actionType === 'reaction' ? 'reactionRoll' : 'dualityRoll'}` ); } From 99d0eab5bdaea6a431807def45353f55c777c6c9 Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Sun, 21 Dec 2025 11:37:00 -0500 Subject: [PATCH 16/33] [PR] [Feature] Support drag dropping currencies to actor sheets (#1431) * Support drag dropping currencies to actor sheets * Adjust sizing and spacing * Restore ItemTransferDialog subclass for module use * Bigger is better --- module/applications/dialogs/itemTransfer.mjs | 62 ++++++++----------- module/applications/sheets/api/base-actor.mjs | 50 ++++++++++++--- styles/less/dialog/item-transfer/sheet.less | 43 ++++++++----- templates/dialogs/item-transfer.hbs | 31 +++++++--- .../sheets/actors/character/inventory.hbs | 6 +- templates/sheets/actors/party/inventory.hbs | 6 +- 6 files changed, 128 insertions(+), 70 deletions(-) diff --git a/module/applications/dialogs/itemTransfer.mjs b/module/applications/dialogs/itemTransfer.mjs index aba43d27..ad3cf103 100644 --- a/module/applications/dialogs/itemTransfer.mjs +++ b/module/applications/dialogs/itemTransfer.mjs @@ -1,69 +1,61 @@ const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; export default class ItemTransferDialog extends HandlebarsApplicationMixin(ApplicationV2) { - constructor(item) { + constructor(data) { super({}); - - this.item = item; - this.quantity = item.system.quantity; + this.data = data; } get title() { - return this.item.name; + return this.data.title; } static DEFAULT_OPTIONS = { tag: 'form', classes: ['daggerheart', 'dh-style', 'dialog', 'item-transfer'], - position: { width: 300, height: 'auto' }, + position: { width: 400, height: 'auto' }, window: { icon: 'fa-solid fa-hand-holding-hand' }, actions: { finish: ItemTransferDialog.#finish - }, - form: { handler: this.updateData, submitOnChange: true, closeOnSubmit: false } + } }; static PARTS = { - main: { template: 'systems/daggerheart/templates/dialogs/item-transfer.hbs' } + main: { template: 'systems/daggerheart/templates/dialogs/item-transfer.hbs', root: true } }; - _attachPartListeners(partId, htmlElement, options) { - super._attachPartListeners(partId, htmlElement, options); - - htmlElement.querySelector('.number-display').addEventListener('change', event => { - this.quantity = isNaN(event.target.value) ? this.quantity : Number(event.target.value); - this.render(); - }); - } - async _prepareContext(_options) { const context = await super._prepareContext(_options); - context.item = this.item; - context.quantity = this.quantity; - - return context; - } - - static async updateData(_event, _element, formData) { - const { quantity } = foundry.utils.expandObject(formData.object); - this.quantity = quantity; - this.render(); + return foundry.utils.mergeObject(context, this.data); } static async #finish() { - this.close({ submitted: true }); + this.selected = this.form.elements.quantity.valueAsNumber || null; + this.close(); } - close(options = {}) { - if (!options.submitted) this.quantity = null; + static #determineTransferOptions({ originActor, targetActor, item, currency }) { + originActor ??= item?.actor; + const homebrewKey = CONFIG.DH.SETTINGS.gameSettings.Homebrew; + const currencySetting = game.settings.get(CONFIG.DH.id, homebrewKey).currency?.[currency] ?? null; - super.close(); + return { + originActor, + targetActor, + itemImage: item?.img, + currencyIcon: currencySetting?.icon, + max: item?.system.quantity ?? originActor.system.gold[currency] ?? 0, + title: item?.name ?? currencySetting?.label + }; } - static async configure(item) { + static async configure(options) { return new Promise(resolve => { - const app = new this(item); - app.addEventListener('close', () => resolve(app.quantity), { once: true }); + const data = this.#determineTransferOptions(options); + if (data.max <= 1) return resolve(data.max); + + const app = new this(data); + app.addEventListener('close', () => resolve(app.selected), { once: true }); app.render({ force: true }); }); } diff --git a/module/applications/sheets/api/base-actor.mjs b/module/applications/sheets/api/base-actor.mjs index adb0d39a..5d054949 100644 --- a/module/applications/sheets/api/base-actor.mjs +++ b/module/applications/sheets/api/base-actor.mjs @@ -34,7 +34,10 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { } } ], - dragDrop: [{ dragSelector: '.inventory-item[data-type="attack"]', dropSelector: null }] + dragDrop: [ + { dragSelector: '.inventory-item[data-type="attack"]', dropSelector: null }, + { dragSelector: ".currency[data-currency] .drag-handle", dropSelector: null } + ] }; /* -------------------------------------------- */ @@ -254,14 +257,35 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { /* Application Drag/Drop */ /* -------------------------------------------- */ + async _onDrop(event) { + event.stopPropagation(); + const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event); + if (data.type === 'Currency' && ['character', 'party'].includes(this.document.type)) { + const originActor = await foundry.utils.fromUuid(data.originActor); + if (!originActor || originActor.uuid === this.document.uuid) return; + const currency = data.currency; + const quantity = await game.system.api.applications.dialogs.ItemTransferDialog.configure({ + originActor, + targetActor: this.document, + currency + }); + if (quantity) { + originActor.update({ [`system.gold.${currency}`]: Math.max(0, originActor.system.gold[currency] - quantity) }); + this.document.update({ [`system.gold.${currency}`]: this.document.system.gold[currency] + quantity }); + } + return; + } + + return super._onDrop(event); + } + async _onDropItem(event, item) { const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event); - const physicalActorTypes = ['character', 'party']; const originActor = item.actor; if ( item.actor?.uuid === this.document.uuid || !originActor || - !physicalActorTypes.includes(this.document.type) + !['character', 'party'].includes(this.document.type) ) { return super._onDropItem(event, item); } @@ -270,10 +294,10 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { if (item.system.metadata.isInventoryItem) { if (item.system.metadata.isQuantifiable) { const actorItem = originActor.items.get(data.originId); - const quantityTransfered = - actorItem.system.quantity === 1 - ? 1 - : await game.system.api.applications.dialogs.ItemTransferDialog.configure(item); + const quantityTransfered = await game.system.api.applications.dialogs.ItemTransferDialog.configure({ + item, + targetActor: this.document + }); if (quantityTransfered) { if (quantityTransfered === actorItem.system.quantity) { @@ -314,6 +338,16 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { * @param {DragEvent} event - The drag event */ async _onDragStart(event) { + // Handle drag/dropping currencies + const currencyEl = event.currentTarget.closest(".currency[data-currency]"); + if (currencyEl) { + const currency = currencyEl.dataset.currency; + const data = { type: 'Currency', currency, originActor: this.document.uuid }; + event.dataTransfer.setData('text/plain', JSON.stringify(data)); + return; + } + + // Handle drag/dropping attacks const attackItem = event.currentTarget.closest('.inventory-item[data-type="attack"]'); if (attackItem) { const attackData = { @@ -340,4 +374,4 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { super._onDragStart(event); } -} +} \ No newline at end of file diff --git a/styles/less/dialog/item-transfer/sheet.less b/styles/less/dialog/item-transfer/sheet.less index dd55fdb2..7807e479 100644 --- a/styles/less/dialog/item-transfer/sheet.less +++ b/styles/less/dialog/item-transfer/sheet.less @@ -1,20 +1,35 @@ .daggerheart.dh-style.dialog.item-transfer { - .item-transfer-container { - display: grid; - grid-template-columns: 1fr 42px; - gap: 4px; + .summary { + display: flex; + align-items: center; + justify-content: center; + gap: 3rem; + + .actor-img { + border-radius: 50%; + width: 5rem; + height: 5rem; + object-fit: cover; + object-position: top center; + } - .number-display { - text-align: center; + .granted-item { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: var(--font-size-32); + + img { + width: 2rem; + height: 2rem; + object-fit: contain; + border-radius: 3px; + } } } - - .item-sheet-footer { - padding-top: 8px; - display: flex; - - button { - flex: 1; - } + label { + flex: 0; + margin-right: 0.5rem; } } diff --git a/templates/dialogs/item-transfer.hbs b/templates/dialogs/item-transfer.hbs index 2b9fa19c..0e7df3dc 100644 --- a/templates/dialogs/item-transfer.hbs +++ b/templates/dialogs/item-transfer.hbs @@ -1,9 +1,26 @@ -
-
- - +
+
+ +
+ {{#if itemImage}} + + {{else}} + + {{/if}} + +
+
-
- -
+
+ +
+ +
+
+
+
+
\ No newline at end of file diff --git a/templates/sheets/actors/character/inventory.hbs b/templates/sheets/actors/character/inventory.hbs index f9dee872..a05fed35 100644 --- a/templates/sheets/actors/character/inventory.hbs +++ b/templates/sheets/actors/character/inventory.hbs @@ -14,10 +14,10 @@ {{#if this.inventory.hasCurrency}}
- {{#each this.inventory.currencies as | currency |}} + {{#each this.inventory.currencies as |currency key|}} {{#if currency.enabled}} -
- +
+ {{localize currency.label}} diff --git a/templates/sheets/actors/party/inventory.hbs b/templates/sheets/actors/party/inventory.hbs index 09f3ba62..92371b8d 100644 --- a/templates/sheets/actors/party/inventory.hbs +++ b/templates/sheets/actors/party/inventory.hbs @@ -17,10 +17,10 @@ {{#if inventory.hasCurrency}}
- {{#each this.inventory.currencies as | currency |}} + {{#each this.inventory.currencies as |currency key|}} {{#if currency.enabled}} -
- +
+ {{localize currency.label}} From e8dd38fbfa4330c18062ef771a313d58c2f89c8d Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Mon, 22 Dec 2025 07:48:03 -0500 Subject: [PATCH 17/33] [PR] [Feature] Refresh actors when a homebrew setting is changed (#1382) * Refresh actors when a homebrew setting is changed * Newline at end of file * Close open prosemirror documents during reset --- module/systemRegistration/settings.mjs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/module/systemRegistration/settings.mjs b/module/systemRegistration/settings.mjs index d08d65d1..46aa2a84 100644 --- a/module/systemRegistration/settings.mjs +++ b/module/systemRegistration/settings.mjs @@ -46,6 +46,9 @@ const registerMenuSettings = () => { if (value.maxFear) { if (ui.resources) ui.resources.render({ force: true }); } + + // Some homebrew settings may change sheets in various ways, so trigger a re-render + resetActors(); } }); @@ -140,3 +143,25 @@ const registerNonConfigSettings = () => { type: DhTagTeamRoll }); }; + +/** + * Triggers a reset and non-forced re-render on all given actors (if given) + * or all world actors and actors in all scenes to show immediate results for a changed setting. + */ +function resetActors(actors) { + actors ??= [ + game.actors.contents, + game.scenes.contents.flatMap(s => s.tokens.contents).flatMap(t => t.actor ?? []) + ].flat(); + actors = new Set(actors); + for (const actor of actors) { + for (const app of Object.values(actor.apps)) { + for (const element of app.element?.querySelectorAll('prose-mirror.active')) { + element.open = false; // This triggers a save + } + } + + actor.reset(); + actor.render(); + } +} From 659f73116a2e0748fab6666589dd6428d7084f74 Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Mon, 22 Dec 2025 13:56:49 +0100 Subject: [PATCH 18/33] [Fix] 1453 - Async Resource Generation Errors (#1454) * Fixed so that we do not run separate actor.modifyResource calls during actions and dice rolls * . * Simplified resourcemap --- daggerheart.mjs | 2 - .../applications/sheets/actors/character.mjs | 15 ++- module/data/action/baseAction.mjs | 47 ++++++++- module/data/fields/action/costField.mjs | 2 +- module/dice/dhRoll.mjs | 78 --------------- module/dice/dualityRoll.mjs | 96 ++++++++++++++++++- module/documents/actor.mjs | 9 +- 7 files changed, 153 insertions(+), 96 deletions(-) diff --git a/daggerheart.mjs b/daggerheart.mjs index eeed29dc..f1fe602e 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -17,7 +17,6 @@ import { socketRegistration } from './module/systemRegistration/_module.mjs'; import { placeables } from './module/canvas/_module.mjs'; -import { registerRollDiceHooks } from './module/dice/dhRoll.mjs'; import './node_modules/@yaireo/tagify/dist/tagify.css'; import TemplateManager from './module/documents/templateManager.mjs'; @@ -177,7 +176,6 @@ Hooks.on('ready', async () => { ui.compendiumBrowser = new applications.ui.ItemBrowser(); socketRegistration.registerSocketHooks(); - registerRollDiceHooks(); socketRegistration.registerUserQueries(); if (!game.user.getFlag(CONFIG.DH.id, CONFIG.DH.FLAGS.userFlags.welcomeMessage)) { diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index 953a0cf6..51df2fc9 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -675,16 +675,21 @@ export default class CharacterSheet extends DHBaseActorSheet { roll: { trait: button.dataset.attribute }, - hasRoll: true - }; - const result = await this.document.diceRoll({ - ...config, + hasRoll: true, actionType: 'action', headerTitle: `${game.i18n.localize('DAGGERHEART.GENERAL.dualityRoll')}: ${this.actor.name}`, title: game.i18n.format('DAGGERHEART.UI.Chat.dualityRoll.abilityCheckTitle', { ability: abilityLabel }) - }); + }; + const result = await this.document.diceRoll(config); + + /* This could be avoided by baking config.costs into config.resourceUpdates. Didn't feel like messing with it at the time */ + const costResources = result.costs + .filter(x => x.enabled) + .map(cost => ({ ...cost, value: -cost.value, total: -cost.total })); + config.resourceUpdates.addResources(costResources); + await config.resourceUpdates.updateResources(); } //TODO: redo toggleEquipItem method diff --git a/module/data/action/baseAction.mjs b/module/data/action/baseAction.mjs index b15d6c4e..998fe0ab 100644 --- a/module/data/action/baseAction.mjs +++ b/module/data/action/baseAction.mjs @@ -206,6 +206,7 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel // Execute the Action Worflow in order based of schema fields await this.executeWorkflow(config); + await config.resourceUpdates.updateResources(); if (Hooks.call(`${CONFIG.DH.id}.postUseAction`, this, config) === false) return; @@ -239,8 +240,10 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel isDirect: !!this.damage?.direct, selectedRollMode: game.settings.get('core', 'rollMode'), data: this.getRollData(), - evaluate: this.hasRoll + evaluate: this.hasRoll, + resourceUpdates: new ResourceUpdateMap(this.actor) }; + DHBaseAction.applyKeybindings(config); return config; } @@ -322,10 +325,46 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel * @returns {string[]} An array of localized tag strings. */ _getTags() { - const tags = [ - game.i18n.localize(`DAGGERHEART.ACTIONS.TYPES.${this.type}.name`), - ]; + const tags = [game.i18n.localize(`DAGGERHEART.ACTIONS.TYPES.${this.type}.name`)]; return tags; } } + +export class ResourceUpdateMap extends Map { + #actor; + + constructor(actor) { + super(); + + this.#actor = actor; + } + + addResources(resources) { + for (const resource of resources) { + if (!resource.key) continue; + + const existing = this.get(resource.key); + if (existing) { + this.set(resource.key, { + ...existing, + value: existing.value + (resource.value ?? 0), + total: existing.total + (resource.total ?? 0) + }); + } else { + this.set(resource.key, resource); + } + } + } + + #getResources() { + return Array.from(this.values()); + } + + async updateResources() { + if (this.#actor) { + const target = this.#actor.system.partner ?? this.#actor; + await target.modifyResource(this.#getResources()); + } + } +} diff --git a/module/data/fields/action/costField.mjs b/module/data/fields/action/costField.mjs index 656edee3..9271f6b0 100644 --- a/module/data/fields/action/costField.mjs +++ b/module/data/fields/action/costField.mjs @@ -75,7 +75,7 @@ export default class CostField extends fields.ArrayField { } }, []); - await actor.modifyResource(resources); + config.resourceUpdates.addResources(resources); } /** diff --git a/module/dice/dhRoll.mjs b/module/dice/dhRoll.mjs index ec289941..ea24f238 100644 --- a/module/dice/dhRoll.mjs +++ b/module/dice/dhRoll.mjs @@ -236,81 +236,3 @@ export default class DHRoll extends Roll { return {}; } } - -async function automateHopeFear(config) { - const automationSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation); - const hopeFearAutomation = automationSettings.hopeFear; - if ( - !config.source?.actor || - (game.user.isGM ? !hopeFearAutomation.gm : !hopeFearAutomation.players) || - config.actionType === 'reaction' || - config.tagTeamSelected || - config.skips?.resources - ) - return; - const actor = await fromUuid(config.source.actor); - let updates = []; - if (!actor) return; - - if (config.rerolledRoll) { - if (config.roll.result.duality != config.rerolledRoll.result.duality) { - const hope = - (config.roll.isCritical || config.roll.result.duality === 1 ? 1 : 0) - - (config.rerolledRoll.isCritical || config.rerolledRoll.result.duality === 1 ? 1 : 0); - const stress = (config.roll.isCritical ? 1 : 0) - (config.rerolledRoll.isCritical ? 1 : 0); - const fear = - (config.roll.result.duality === -1 ? 1 : 0) - (config.rerolledRoll.result.duality === -1 ? 1 : 0); - - if (hope !== 0) updates.push({ key: 'hope', value: hope, total: -1 * hope, enabled: true }); - if (stress !== 0) updates.push({ key: 'stress', value: -1 * stress, total: stress, enabled: true }); - if (fear !== 0) updates.push({ key: 'fear', value: fear, total: -1 * fear, enabled: true }); - } - } else { - if (config.roll.isCritical || config.roll.result.duality === 1) - updates.push({ key: 'hope', value: 1, total: -1, enabled: true }); - if (config.roll.isCritical) updates.push({ key: 'stress', value: -1, total: 1, enabled: true }); - if (config.roll.result.duality === -1) updates.push({ key: 'fear', value: 1, total: -1, enabled: true }); - } - - if (updates.length) { - const target = actor.system.partner ?? actor; - if (!['dead', 'defeated', 'unconscious'].some(x => actor.statuses.has(x))) { - await target.modifyResource(updates); - } - } -} - -export const registerRollDiceHooks = () => { - Hooks.on(`${CONFIG.DH.id}.postRollDuality`, async (config, message) => { - const automationSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation); - if ( - automationSettings.countdownAutomation && - config.actionType !== 'reaction' && - !config.tagTeamSelected && - !config.skips?.updateCountdowns - ) { - const { updateCountdowns } = game.system.api.applications.ui.DhCountdowns; - - if (config.roll.result.duality === -1) { - await updateCountdowns( - CONFIG.DH.GENERAL.countdownProgressionTypes.actionRoll.id, - CONFIG.DH.GENERAL.countdownProgressionTypes.fear.id - ); - } else { - await updateCountdowns(CONFIG.DH.GENERAL.countdownProgressionTypes.actionRoll.id); - } - } - - await automateHopeFear(config); - - if (!config.roll.hasOwnProperty('success') && !config.targets?.length) return; - - const rollResult = config.roll.success || config.targets.some(t => t.hit), - looseSpotlight = !rollResult || config.roll.result.duality === -1; - - if (looseSpotlight && game.combat?.active) { - const currentCombatant = game.combat.combatants.get(game.combat.current?.combatantId); - if (currentCombatant?.actorId == actor.id) ui.combat.setCombatantSpotlight(currentCombatant.id); - } - }); -}; diff --git a/module/dice/dualityRoll.mjs b/module/dice/dualityRoll.mjs index 4d305c6c..3b00dd7c 100644 --- a/module/dice/dualityRoll.mjs +++ b/module/dice/dualityRoll.mjs @@ -2,6 +2,7 @@ import D20RollDialog from '../applications/dialogs/d20RollDialog.mjs'; import D20Roll from './d20Roll.mjs'; import { setDiceSoNiceForDualityRoll } from '../helpers/utils.mjs'; import { getDiceSoNicePresets } from '../config/generalConfig.mjs'; +import { ResourceUpdateMap } from '../data/action/baseAction.mjs'; export default class DualityRoll extends D20Roll { _advantageFaces = 6; @@ -219,6 +220,88 @@ export default class DualityRoll extends D20Roll { return data; } + static async buildPost(roll, config, message) { + await super.buildPost(roll, config, message); + + await DualityRoll.dualityUpdate(config); + } + + static async addDualityResourceUpdates(config) { + const automationSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation); + const hopeFearAutomation = automationSettings.hopeFear; + if ( + !config.source?.actor || + (game.user.isGM ? !hopeFearAutomation.gm : !hopeFearAutomation.players) || + config.actionType === 'reaction' || + config.tagTeamSelected || + config.skips?.resources + ) + return; + const actor = await fromUuid(config.source.actor); + let updates = []; + if (!actor) return; + + if (config.rerolledRoll) { + if (config.roll.result.duality != config.rerolledRoll.result.duality) { + const hope = + (config.roll.isCritical || config.roll.result.duality === 1 ? 1 : 0) - + (config.rerolledRoll.isCritical || config.rerolledRoll.result.duality === 1 ? 1 : 0); + const stress = (config.roll.isCritical ? 1 : 0) - (config.rerolledRoll.isCritical ? 1 : 0); + const fear = + (config.roll.result.duality === -1 ? 1 : 0) - (config.rerolledRoll.result.duality === -1 ? 1 : 0); + + if (hope !== 0) updates.push({ key: 'hope', value: hope, total: -1 * hope, enabled: true }); + if (stress !== 0) updates.push({ key: 'stress', value: -1 * stress, total: stress, enabled: true }); + if (fear !== 0) updates.push({ key: 'fear', value: fear, total: -1 * fear, enabled: true }); + } + } else { + if (config.roll.isCritical || config.roll.result.duality === 1) + updates.push({ key: 'hope', value: 1, total: -1, enabled: true }); + if (config.roll.isCritical) updates.push({ key: 'stress', value: -1, total: 1, enabled: true }); + if (config.roll.result.duality === -1) updates.push({ key: 'fear', value: 1, total: -1, enabled: true }); + } + + if (updates.length) { + // const target = actor.system.partner ?? actor; + if (!['dead', 'defeated', 'unconscious'].some(x => actor.statuses.has(x))) { + config.resourceUpdates.addResources(updates); + } + } + } + + static async dualityUpdate(config) { + const automationSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation); + if ( + automationSettings.countdownAutomation && + config.actionType !== 'reaction' && + !config.tagTeamSelected && + !config.skips?.updateCountdowns + ) { + const { updateCountdowns } = game.system.api.applications.ui.DhCountdowns; + + if (config.roll.result.duality === -1) { + await updateCountdowns( + CONFIG.DH.GENERAL.countdownProgressionTypes.actionRoll.id, + CONFIG.DH.GENERAL.countdownProgressionTypes.fear.id + ); + } else { + await updateCountdowns(CONFIG.DH.GENERAL.countdownProgressionTypes.actionRoll.id); + } + } + + await DualityRoll.addDualityResourceUpdates(config); + + if (!config.roll.hasOwnProperty('success') && !config.targets?.length) return; + + const rollResult = config.roll.success || config.targets.some(t => t.hit), + looseSpotlight = !rollResult || config.roll.result.duality === -1; + + if (looseSpotlight && game.combat?.active) { + const currentCombatant = game.combat.combatants.get(game.combat.current?.combatantId); + if (currentCombatant?.actorId == actor.id) ui.combat.setCombatantSpotlight(currentCombatant.id); + } + } + static async reroll(rollString, target, message) { let parsedRoll = game.system.api.dice.DualityRoll.fromData({ ...rollString, evaluated: false }); const term = parsedRoll.terms[target.dataset.dieIndex]; @@ -257,13 +340,20 @@ export default class DualityRoll extends D20Roll { newRoll.extra = newRoll.extra.slice(2); const tagTeamSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.TagTeamRoll); - Hooks.call(`${CONFIG.DH.id}.postRollDuality`, { + + const actor = message.system.source.actor ? await foundry.utils.fromUuid(message.system.source.actor) : null; + const config = { source: { actor: message.system.source.actor ?? '' }, targets: message.system.targets, tagTeamSelected: Object.values(tagTeamSettings.members).some(x => x.messageId === message._id), roll: newRoll, - rerolledRoll: message.system.roll - }); + rerolledRoll: message.system.roll, + resourceUpdates: new ResourceUpdateMap(actor) + }; + + await DualityRoll.addDualityResourceUpdates(config); + await config.resourceUpdates.updateResources(); + return { newRoll, parsedRoll }; } } diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index 35ab5cc6..3e1a9eca 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -3,6 +3,7 @@ import { LevelOptionType } from '../data/levelTier.mjs'; import DHFeature from '../data/item/feature.mjs'; import { createScrollText, damageKeyToNumber } from '../helpers/utils.mjs'; import DhCompanionLevelUp from '../applications/levelup/companionLevelup.mjs'; +import { ResourceUpdateMap } from '../data/action/baseAction.mjs'; export default class DhpActor extends Actor { parties = new Set(); @@ -477,6 +478,7 @@ export default class DhpActor extends Actor { async diceRoll(config) { config.source = { ...(config.source ?? {}), actor: this.uuid }; config.data = this.getRollData(); + config.resourceUpdates = new ResourceUpdateMap(this); const rollClass = config.roll.lite ? CONFIG.Dice.daggerheart['DHRoll'] : this.rollClass; return await rollClass.build(config); } @@ -765,9 +767,10 @@ export default class DhpActor extends Actor { } convertDamageToThreshold(damage) { - const massiveDamageEnabled=game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules).massiveDamage.enabled; - if (massiveDamageEnabled && damage >= (this.system.damageThresholds.severe * 2)) { - return 4; + const massiveDamageEnabled = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules) + .massiveDamage.enabled; + if (massiveDamageEnabled && damage >= this.system.damageThresholds.severe * 2) { + return 4; } return damage >= this.system.damageThresholds.severe ? 3 : damage >= this.system.damageThresholds.major ? 2 : 1; } From 16f6fa98a6985be0f608975ce72ec826b346c36f Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Mon, 22 Dec 2025 14:34:43 +0100 Subject: [PATCH 19/33] Fixed so that players rolling reactions will update the message (#1455) --- module/data/fields/actionField.mjs | 2 +- module/dice/dualityRoll.mjs | 2 +- module/systemRegistration/settings.mjs | 4 ++-- module/systemRegistration/socket.mjs | 11 +++++++---- templates/dialogs/dice-roll/header.hbs | 2 +- templates/sheets/global/partials/inventory-item.hbs | 4 ++-- 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/module/data/fields/actionField.mjs b/module/data/fields/actionField.mjs index 2d968fe0..6257da38 100644 --- a/module/data/fields/actionField.mjs +++ b/module/data/fields/actionField.mjs @@ -262,7 +262,7 @@ export function ActionMixin(Base) { async toChat(origin) { const cls = getDocumentClass('ChatMessage'); const systemData = { - title: game.i18n.localize('DAGGERHEART.CONFIG.ActionType.action'), + title: game.i18n.localize('DAGGERHEART.CONFIG.FeatureForm.action'), origin: origin, action: { name: this.name, diff --git a/module/dice/dualityRoll.mjs b/module/dice/dualityRoll.mjs index 3b00dd7c..91c0a197 100644 --- a/module/dice/dualityRoll.mjs +++ b/module/dice/dualityRoll.mjs @@ -293,7 +293,7 @@ export default class DualityRoll extends D20Roll { if (!config.roll.hasOwnProperty('success') && !config.targets?.length) return; - const rollResult = config.roll.success || config.targets.some(t => t.hit), + const rollResult = config.roll.success || config.targets?.some(t => t.hit), looseSpotlight = !rollResult || config.roll.result.duality === -1; if (looseSpotlight && game.combat?.active) { diff --git a/module/systemRegistration/settings.mjs b/module/systemRegistration/settings.mjs index 46aa2a84..053325a8 100644 --- a/module/systemRegistration/settings.mjs +++ b/module/systemRegistration/settings.mjs @@ -21,8 +21,8 @@ export const registerDHSettings = () => { scope: 'world', config: true, type: Boolean, - onChange: () => ui.combat.render(), - }) + onChange: () => ui.combat.render() + }); }; const registerMenuSettings = () => { diff --git a/module/systemRegistration/socket.mjs b/module/systemRegistration/socket.mjs index 27bf48c5..046f1b68 100644 --- a/module/systemRegistration/socket.mjs +++ b/module/systemRegistration/socket.mjs @@ -73,10 +73,13 @@ export const registerSocketHooks = () => { Hooks.callAll(socketEvent.Refresh, { refreshType: RefreshType.Countdown }); break; case GMUpdateEvent.UpdateSaveMessage: - const action = await fromUuid(data.update.action), - message = game.messages.get(data.update.message); - if (!action || !message) return; - action.updateSaveMessage(data.update.result, message, data.update.token); + const message = game.messages.get(data.update.message); + if (!message) return; + game.system.api.fields.ActionFields.SaveField.updateSaveMessage( + data.update.result, + message, + data.update.token + ); break; } diff --git a/templates/dialogs/dice-roll/header.hbs b/templates/dialogs/dice-roll/header.hbs index b2ca18cd..21967655 100644 --- a/templates/dialogs/dice-roll/header.hbs +++ b/templates/dialogs/dice-roll/header.hbs @@ -2,7 +2,7 @@

{{#if reactionOverride}} - {{localize "DAGGERHEART.CONFIG.ActionType.reaction"}} + {{localize "DAGGERHEART.CONFIG.FeatureForm.reaction"}} {{else}} {{ifThen rollConfig.headerTitle rollConfig.headerTitle rollConfig.title}} {{/if}} diff --git a/templates/sheets/global/partials/inventory-item.hbs b/templates/sheets/global/partials/inventory-item.hbs index d69b0abb..c2b2a241 100644 --- a/templates/sheets/global/partials/inventory-item.hbs +++ b/templates/sheets/global/partials/inventory-item.hbs @@ -136,7 +136,7 @@ {{localize (concat 'DAGGERHEART.ACTIONS.TYPES.' item.type '.name')}}

- {{localize (concat 'DAGGERHEART.CONFIG.ActionType.' item.actionType)}} + {{localize (concat 'DAGGERHEART.CONFIG.FeatureForm.' item.actionType)}}
{{/if}} @@ -146,7 +146,7 @@ {{localize 'DAGGERHEART.GENERAL.unarmed'}}
- {{localize 'DAGGERHEART.CONFIG.ActionType.action'}} + {{localize 'DAGGERHEART.CONFIG.FeatureForm.action'}}
{{/if}} From 7926c614e31193573a8ac96d6f6e20d3b857ae1e Mon Sep 17 00:00:00 2001 From: Nick Salyzyn Date: Mon, 22 Dec 2025 06:45:27 -0700 Subject: [PATCH 20/33] [PR] Updating the logic for rangeDependencies so that paired weapons work with multiple adversaries (#1434) * Include item effects when applying rangeDependence * Creating a new method to update range dependent effects that uses the players targets * Using debouncing to fix an issue with selected and unselecting targets * Using token destinations instead of their current location for calculation range --- daggerheart.mjs | 84 ++++++++++++++++++++++++++++++------------------- 1 file changed, 51 insertions(+), 33 deletions(-) diff --git a/daggerheart.mjs b/daggerheart.mjs index f1fe602e..acbffd38 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -246,52 +246,70 @@ Hooks.on('chatMessage', (_, message) => { } }); -Hooks.on('moveToken', async (movedToken, data) => { - const effectsAutomation = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).effects; - if (!effectsAutomation.rangeDependent) return; +const updateActorsRangeDependentEffects = async (token) => { + const rangeMeasurement = game.settings.get( + CONFIG.DH.id, + CONFIG.DH.SETTINGS.gameSettings.variantRules + ).rangeMeasurement; - const rangeDependantEffects = movedToken.actor.effects.filter(effect => effect.system.rangeDependence?.enabled); + for (let effect of token.actor.allApplicableEffects()) { + if (!effect.system.rangeDependence?.enabled) continue; + const { target, range, type } = effect.system.rangeDependence; - const updateEffects = async (disposition, token, effects, effectUpdates) => { - const rangeMeasurement = game.settings.get( - CONFIG.DH.id, - CONFIG.DH.SETTINGS.gameSettings.variantRules - ).rangeMeasurement; - - for (let effect of effects.filter(x => x.system.rangeDependence?.enabled)) { - const { target, range, type } = effect.system.rangeDependence; - if ((target === 'friendly' && disposition !== 1) || (target === 'hostile' && disposition !== -1)) - return false; + // If there are no targets, assume false. Otherwise, start with the effect enabled. + let enabledEffect = game.user.targets.size !== 0; + // Expect all targets to meet the rangeDependence requirements + for (let userTarget of game.user.targets) { + const disposition = userTarget.document.disposition; + if ((target === 'friendly' && disposition !== 1) || (target === 'hostile' && disposition !== -1)) { + enabledEffect = false; + break; + } const distanceBetween = canvas.grid.measurePath([ - { ...movedToken.toObject(), x: data.destination.x, y: data.destination.y }, - token + userTarget.document.movement.destination, + token.movement.destination ]).distance; const distance = rangeMeasurement[range]; const reverse = type === CONFIG.DH.GENERAL.rangeInclusion.outsideRange.id; - const newDisabled = reverse ? distanceBetween <= distance : distanceBetween > distance; - const oldDisabled = effectUpdates[effect.uuid] ? effectUpdates[effect.uuid].disabled : newDisabled; - effectUpdates[effect.uuid] = { - disabled: oldDisabled || newDisabled, - value: effect - }; - } - }; - - const effectUpdates = {}; - for (let token of game.scenes.find(x => x.active).tokens) { - if (token.id !== movedToken.id) { - await updateEffects(token.disposition, token, rangeDependantEffects, effectUpdates); + if (reverse ? distanceBetween <= distance : distanceBetween > distance) { + enabledEffect = false; + break; + } } - if (token.actor) await updateEffects(movedToken.disposition, token, token.actor.effects, effectUpdates); + await effect.update({ disabled: !enabledEffect }); } +} - for (let key in effectUpdates) { - const effect = effectUpdates[key]; - await effect.value.update({ disabled: effect.disabled }); +const updateAllRangeDependentEffects = async () => { + const effectsAutomation = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).effects; + if (!effectsAutomation.rangeDependent) return; + + // Only consider tokens on the active scene + const tokens = game.scenes.find(x => x.active).tokens; + if (game.user.character) { + // The character updates their character's token. There can be only one token. + const characterToken = tokens.find(x => x.actor === game.user.character); + updateActorsRangeDependentEffects(characterToken); + } else if (game.user.isGM) { + // The GM is responsible for all other tokens. + const playerCharacters = game.users.players.filter(x => x.active).map(x => x.character); + for (let token of tokens.filter(x => !playerCharacters.includes(x.actor))) { + updateActorsRangeDependentEffects(token); + } } +}; + +const debouncedRangeEffectCall = foundry.utils.debounce(updateAllRangeDependentEffects, 50); + +Hooks.on('targetToken', async (user, token, targeted) => { + debouncedRangeEffectCall(); +}); + +Hooks.on('moveToken', async (movedToken, data) => { + debouncedRangeEffectCall(); }); Hooks.on('renderCompendiumDirectory', (app, html) => applications.ui.ItemBrowser.injectSidebarButton(html)); From 8178fa57384f08403a30a053bcdd4f4fdf9cfc2a Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Mon, 22 Dec 2025 16:58:53 +0100 Subject: [PATCH 21/33] [PR][Feature] Actor Sizes (#1433) * Added support for adversary actor sizes * . * . * Finished token implementation * Fixed token-config * Updated SRD adversaries * . * Added size to Beastform tokenData * Fixed sizing for evolved beastforms * Beastform compendium update * . --- daggerheart.mjs | 2 + lang/en.json | 20 +- .../settings/homebrewSettings.mjs | 9 + .../sheets-configs/prototype-token-config.mjs | 21 + .../sheets-configs/token-config.mjs | 21 + .../applications/sheets/items/beastform.mjs | 1 + .../sidebar/tabs/actorDirectory.mjs | 26 ++ module/config/actorConfig.mjs | 38 ++ module/data/activeEffect/beastformEffect.mjs | 38 +- module/data/actor/adversary.mjs | 5 +- module/data/actor/base.mjs | 10 +- module/data/actor/party.mjs | 2 +- module/data/fields/action/beastformField.mjs | 12 + module/data/item/beastform.mjs | 46 +- module/data/settings/Homebrew.mjs | 32 ++ module/documents/_module.mjs | 1 + module/documents/actor.mjs | 23 +- module/documents/scene.mjs | 40 ++ module/documents/token.mjs | 438 +++++++++++++++++- ...ersary_Acid_Burrower_89yAh30vaNQOALlz.json | 6 +- ...ary_Adult_Flickerfly_G7jiltRjgvVhZewm.json | 3 +- ..._Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json | 3 +- ...ary_Arch_Necromancer_WPEOIGfclNJxWb87.json | 3 +- ...versary_Archer_Guard_JRhrrEg5UroURiAD.json | 6 +- ...sary_Archer_Squadron_0ts6CGd93lLqGZI5.json | 3 +- ...ry_Assassin_Poisoner_h5RuhzGL17dW5FBT.json | 3 +- ...adversary_Battle_Box_dgH3fW9FTYLaIDvS.json | 3 +- .../adversary_Bear_71qKDLKO3CsrNkdy.json | 3 +- ...versary_Bladed_Guard_B4LZcGuBAHzyVdzy.json | 3 +- ...ersary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json | 3 +- .../adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json | 3 +- ...dversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json | 3 +- .../adversary_Conscript_99TqczuQipBmaB8i.json | 3 +- .../adversary_Construct_uOP5oT9QzXPlnf3p.json | 3 +- .../adversary_Courtesan_ZxWaWPdzFIUPNC62.json | 3 +- .../adversary_Courtier_CBBuEXAlLKFMJdjg.json | 3 +- ...adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json | 3 +- .../adversary_Cult_Fang_tyBOpLfigAhI9bU3.json | 3 +- ...ersary_Cult_Initiate_zx99sOGTXicP4SSD.json | 3 +- ...ry_Deeproot_Defender_9x2xY9zwc3xzbXo5.json | 3 +- ...ary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json | 3 +- ...ary_Demon_of_Despair_kE4dfhqmIQpNd44e.json | 3 +- ...sary_Demon_of_Hubris_2VN3BftageoTTIzu.json | 3 +- ...ry_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json | 3 +- ...rsary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json | 3 +- ...y_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json | 3 +- .../adversary_Dire_Bat_tBWHW00epmMnkawe.json | 3 +- .../adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json | 3 +- .../adversary_Dryad_wR7cFKrHvRzbzhBT.json | 3 +- ...ersary_Electric_Eels_TLzY1nDw0Bu9Ud40.json | 3 +- ...sary_Elemental_Spark_P7h54ZePFPHpYwvB.json | 3 +- ...ersary_Elite_Soldier_bfhVWMBUh61b9J6n.json | 3 +- ...ry_Failed_Experiment_ChwwVqowFw8hJQwT.json | 3 +- ...y_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json | 3 +- ...sary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json | 3 +- ...rlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json | 3 +- ..._Undefeated_Champion_RXkZTwBRi4dJ3JE5.json | 3 +- ...ry_Giant_Beastmaster_8VZIgU12cB3cvlyH.json | 3 +- ...ersary_Giant_Brawler_YnObCleGjPT7yqEc.json | 3 +- ...dversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json | 3 +- ...ary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json | 3 +- .../adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json | 3 +- ...ersary_Giant_Recruit_5s8wSvpyC5rxY5aD.json | 3 +- ...rsary_Giant_Scorpion_fmfntuJ8mHRCAktP.json | 3 +- ...dversary_Glass_Snake_8KWVLWXFhlY2kYx0.json | 3 +- .../adversary_Gorgon_8mJYMpbLTb8qIOrr.json | 3 +- ...ater_Earth_Elemental_dsfB3YhoL5SudvS2.json | 3 +- ...ater_Water_Elemental_xIICT6tEdnA7dKDV.json | 3 +- ...adversary_Green_Ooze_SHXedd9zZPVfUgUa.json | 3 +- ...sary_Hallowed_Archer_kabueAo6BALApWqp.json | 3 +- ...ary_Hallowed_Soldier_VENwg7xEFcYObjmT.json | 3 +- .../adversary_Harrier_uRtghKE9mHlII4rs.json | 3 +- ...adversary_Head_Guard_mK3A5FTx6k8iPU3F.json | 3 +- ...versary_Head_Vampire_i2UNbRvgyoSs07M6.json | 3 +- ...dversary_High_Seraph_r1mbfSSwKWdcFdAU.json | 3 +- ...sary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json | 3 +- .../adversary_Hydra_MI126iMOOobQ1Obn.json | 3 +- ..._Jagged_Knife_Bandit_5Lh1T0zaT8Pkr2U2.json | 3 +- ...y_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json | 3 +- ...ed_Knife_Kneebreaker_CBKixLH3yhivZZuL.json | 3 +- ..._Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json | 3 +- ...ged_Knife_Lieutenant_aTljstqteGoLpCBq.json | 3 +- ..._Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json | 3 +- ..._Jagged_Knife_Sniper_1zuyof1XuIfi3aMG.json | 3 +- ..._Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json | 3 +- ..._Knight_of_the_Realm_7ai2opemrclQe3VF.json | 3 +- .../adversary_Kraken_4nqv3ZwJGjnmic8j.json | 3 +- ...versary_Masked_Thief_niBpVU7yeo5ccskE.json | 3 +- ...sary_Master_Assassin_dNta0cUzr96xcFhf.json | 3 +- .../adversary_Merchant_Al3w2CgjfdT3p9ma.json | 3 +- ...rsary_Merchant_Baron_Vy02IhGhkJLuezu4.json | 3 +- ...inor_Chaos_Elemental_sRn4bqerfARvhgSV.json | 3 +- ...dversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json | 3 +- ...Minor_Fire_Elemental_DscWkNVoHak6P4hh.json | 3 +- ...versary_Minor_Treant_G62k4oSkhkoXEs2D.json | 3 +- ...ary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json | 3 +- .../adversary_Monarch_yx0vK2yfNVZKWUUi.json | 3 +- ...ersary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json | 3 +- ...adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json | 3 +- ...rsary_Oracle_of_Doom_befIqd5IYKg6eUz2.json | 3 +- ...r_Realms_Abomination_A0SeeDzwjvqOsyof.json | 3 +- ...ter_Realms_Corrupter_ms6nuOl3NFkhPj1k.json | 3 +- ..._Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json | 3 +- ...atchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json | 9 +- ...ary_Perfected_Zombie_CP6iRfHdyFWniTHY.json | 3 +- ...dversary_Petty_Noble_wycLpvebWdUqRhpP.json | 3 +- ...rsary_Pirate_Captain_OROJbjsqagVh7ECV.json | 3 +- ...rsary_Pirate_Raiders_5YgEajn0wa4i85kC.json | 3 +- ...versary_Pirate_Tough_mhcVkVFrzIJ18FDm.json | 3 +- .../adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json | 3 +- ...ersary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json | 3 +- ...ersary_Royal_Advisor_EtLJiTsilPPZvLUX.json | 3 +- ...ersary_Secret_Keeper_sLAccjvCWfeedbpI.json | 3 +- .../adversary_Sellsword_bgreCaQ6ap2DVpCr.json | 3 +- ...ary_Shambling_Zombie_2nXz4ilAY4xuhKLm.json | 3 +- .../adversary_Shark_YmVAkdNsyuXWTtYp.json | 3 +- .../adversary_Siren_BK4jwyXSRx7IOQiO.json | 3 +- ...sary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json | 3 +- ...sary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json | 3 +- ...sary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json | 3 +- ...ary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json | 3 +- ...sary_Spectral_Archer_5tCkhnBByUIN5UdG.json | 3 +- ...ary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json | 3 +- ...ry_Spectral_Guardian_UFVGl1osOsJTneLf.json | 3 +- ...adversary_Spellblade_ldbWEL7uZs84vyrR.json | 3 +- .../adversary_Spy_8zlynOhnVA59KpKT.json | 3 +- ...dversary_Stag_Knight_KGVwnLq85ywP9xvB.json | 3 +- ...dversary_Stonewraith_3aAS2Qm3R6cgaYfE.json | 3 +- ...ersary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json | 3 +- ...rsary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json | 3 +- ...Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json | 3 +- ...rsary_Tangle_Bramble_XcAGOSmtCFLT1unN.json | 3 +- ...sary_Tiny_Green_Ooze_aLkLFuVoKz2NLoBK.json | 3 +- ...ersary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json | 3 +- ...rsary_Treant_Sapling_o63nS0k3wHu6EgKP.json | 6 +- .../adversary_Vampire_WWyUp6Mxl1S3KYUG.json | 3 +- ...ault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json | 3 +- ...lt_Guardian_Sentinel_FVgYb28fhxlVcGwA.json | 3 +- ...ault_Guardian_Turret_c5hGdvY5UnSjlHws.json | 3 +- ...Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json | 3 +- ...agon__Molten_Scourge_eArAPuB38CNR0ZIM.json | 3 +- ...n__Obsidian_Predator_ladm7wykhZczYzrQ.json | 3 +- ...adversary_War_Wizard_noDdT0tsN6FXSmC8.json | 3 +- ...versary_Weaponmaster_ZNbQ2jg35LG4t9eH.json | 3 +- ...dversary_Young_Dryad_8yUj2Mzvnifhxegm.json | 3 +- ...ary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json | 3 +- ...ersary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json | 3 +- ...dversary_Zombie_Pack_Nf0v43rtflV56V2T.json | 3 +- ...eastform_Agile_Scout_a9UoCwtrbgKk02mK.json | 3 +- ...orm_Aquatic_Predator_ItBVeCl2u5uetgy7.json | 3 +- ...stform_Aquatic_Scout_qqzdFCxyYupWZK23.json | 3 +- ...tform_Armored_Sentry_8pUHJv3BYdjA4Qdf.json | 3 +- ...m_Epic_Aquatic_Beast_wT4xbF99I55yjKZV.json | 3 +- ...tform_Great_Predator_afbMt4Ld6nY3mw0N.json | 3 +- ...m_Great_Winged_Beast_b4BMnTbJ3iPPidSb.json | 3 +- ...orm_Household_Friend_iDmOtiHJJ80AIAVT.json | 3 +- ...orm_Massive_Behemoth_qjwMzPn33aKZACkv.json | 3 +- ...stform_Mighty_Lizard_94tvcC3D5Kp4lzuN.json | 3 +- ...tform_Mighty_Strider_zRLjqKx4Rn2TjivL.json | 3 +- ...Mythic_Aerial_Hunter_jV6EuEacyQlHW4SN.json | 3 +- ...stform_Nimble_Grazer_CItO8yX6amQaqyk7.json | 3 +- ...stform_Pack_Predator_YLisKYYhAGca50WM.json | 3 +- ...rm_Pouncing_Predator_33oFSZ1PwFqInHPe.json | 3 +- ...tform_Powerful_Beast_m8BVTuJI1wCvzTcf.json | 3 +- ...rm_Stalking_Arachnid_A4TVRY0D5r9EiVwA.json | 3 +- ...orm_Striking_Serpent_1XrZWGDttBAAUxR1.json | 3 +- ...form_Terrible_Lizard_5BABxRe2XVrYTj8N.json | 3 +- ...astform_Winged_Beast_mZ4Wlqtss2FlNNvL.json | 3 +- .../less/sheets/actors/adversary/header.less | 1 + styles/less/sheets/items/beastform.less | 3 + styles/less/ui/settings/settings.less | 6 + .../settings/homebrew-settings/settings.hbs | 14 + .../adversary-settings/details.hbs | 1 + .../token-config/appearance.hbs | 82 ++++ templates/sheets/actors/adversary/header.hbs | 8 + templates/sheets/items/beastform/settings.hbs | 39 +- 176 files changed, 1198 insertions(+), 203 deletions(-) create mode 100644 module/documents/scene.mjs create mode 100644 templates/sheets-settings/token-config/appearance.hbs diff --git a/daggerheart.mjs b/daggerheart.mjs index acbffd38..08a1be02 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -53,6 +53,8 @@ CONFIG.Canvas.rulerClass = placeables.DhRuler; CONFIG.Canvas.layers.templates.layerClass = placeables.DhTemplateLayer; CONFIG.MeasuredTemplate.objectClass = placeables.DhMeasuredTemplate; +CONFIG.Scene.documentClass = documents.DhScene; + CONFIG.Token.documentClass = documents.DhToken; CONFIG.Token.prototypeSheetClass = applications.sheetConfigs.DhPrototypeTokenConfig; CONFIG.Token.objectClass = placeables.DhTokenPlaceable; diff --git a/lang/en.json b/lang/en.json index 8a3481c8..498a45cb 100755 --- a/lang/en.json +++ b/lang/en.json @@ -611,6 +611,9 @@ "insufficientHope": "The initiating character doesn't have enough hope", "createTagTeam": "Create TagTeam Roll", "chatMessageRollTitle": "Roll" + }, + "TokenConfig": { + "actorSizeUsed": "Actor size is set, determining the dimensions" } }, "CLASS": { @@ -1147,6 +1150,14 @@ "rect": "Rectangle", "ray": "Ray" }, + "TokenSize": { + "tiny": "Tiny", + "small": "Small", + "medium": "Medium", + "large": "Large", + "huge": "Huge", + "gargantuan": "Gargantuan" + }, "Traits": { "agility": { "name": "Agility", @@ -2168,6 +2179,7 @@ "plural": "Targets" }, "title": "Title", + "tokenSize": "Token Size", "total": "Total", "traitModifier": "Trait Modifier", "true": "True", @@ -2224,6 +2236,7 @@ "tokenRingImg": { "label": "Subject Texture" }, "tokenSize": { "placeholder": "Using character dimensions", + "disabledPlaceholder": "Set by character size", "height": { "label": "Height" }, "width": { "label": "Width" } }, @@ -2249,7 +2262,9 @@ "hybridizeFeatureTitle": "Hybrid Features", "hybridizeDrag": "Drag a form here to hybridize it.", "mainTrait": "Main Trait", - "traitBonus": "Trait Bonus" + "traitBonus": "Trait Bonus", + "evolvedTokenHint": "An evolved beastform's token is based on that of the form you evolve", + "evolvedImagePlaceholder": "The image for the form selected for evolution will be used" }, "Class": { "hopeFeatures": "Hope Features", @@ -2802,7 +2817,8 @@ "companionPartnerLevelBlock": "The companion needs an assigned partner to level up.", "configureAttribution": "Configure Attribution", "deleteItem": "Delete Item", - "immune": "Immune" + "immune": "Immune", + "tokenSize": "The token size used on the canvas" } } } diff --git a/module/applications/settings/homebrewSettings.mjs b/module/applications/settings/homebrewSettings.mjs index 6d36a2b3..3c4486c1 100644 --- a/module/applications/settings/homebrewSettings.mjs +++ b/module/applications/settings/homebrewSettings.mjs @@ -44,6 +44,7 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli deleteAdversaryType: this.deleteAdversaryType, selectAdversaryType: this.selectAdversaryType, save: this.save, + resetTokenSizes: this.resetTokenSizes, reset: this.reset }, form: { handler: this.updateData, submitOnChange: true } @@ -424,6 +425,14 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli this.close(); } + static async resetTokenSizes() { + await this.settings.updateSource({ + tokenSizes: this.settings.schema.fields.tokenSizes.initial + }); + + this.render(); + } + static async reset() { const confirmed = await foundry.applications.api.DialogV2.confirm({ window: { diff --git a/module/applications/sheets-configs/prototype-token-config.mjs b/module/applications/sheets-configs/prototype-token-config.mjs index 24c9dabb..0bb9703a 100644 --- a/module/applications/sheets-configs/prototype-token-config.mjs +++ b/module/applications/sheets-configs/prototype-token-config.mjs @@ -1,4 +1,18 @@ export default class DhPrototypeTokenConfig extends foundry.applications.sheets.PrototypeTokenConfig { + /** @override */ + static PARTS = { + tabs: super.PARTS.tabs, + identity: super.PARTS.identity, + appearance: { + template: 'systems/daggerheart/templates/sheets-settings/token-config/appearance.hbs', + scrollable: [''] + }, + vision: super.PARTS.vision, + light: super.PARTS.light, + resources: super.PARTS.resources, + footer: super.PARTS.footer + }; + /** @inheritDoc */ async _prepareResourcesTab() { const token = this.token; @@ -17,4 +31,11 @@ export default class DhPrototypeTokenConfig extends foundry.applications.sheets. turnMarkerAnimations: CONFIG.Combat.settings.turnMarkerAnimations }; } + + async _prepareAppearanceTab() { + const context = await super._prepareAppearanceTab(); + context.actorSizeUsed = this.token.actor ? Boolean(this.token.actor.system.size) : false; + + return context; + } } diff --git a/module/applications/sheets-configs/token-config.mjs b/module/applications/sheets-configs/token-config.mjs index ee573e5d..5f4e4f56 100644 --- a/module/applications/sheets-configs/token-config.mjs +++ b/module/applications/sheets-configs/token-config.mjs @@ -1,4 +1,18 @@ export default class DhTokenConfig extends foundry.applications.sheets.TokenConfig { + /** @override */ + static PARTS = { + tabs: super.PARTS.tabs, + identity: super.PARTS.identity, + appearance: { + template: 'systems/daggerheart/templates/sheets-settings/token-config/appearance.hbs', + scrollable: [''] + }, + vision: super.PARTS.vision, + light: super.PARTS.light, + resources: super.PARTS.resources, + footer: super.PARTS.footer + }; + /** @inheritDoc */ async _prepareResourcesTab() { const token = this.token; @@ -17,4 +31,11 @@ export default class DhTokenConfig extends foundry.applications.sheets.TokenConf turnMarkerAnimations: CONFIG.Combat.settings.turnMarkerAnimations }; } + + async _prepareAppearanceTab() { + const context = await super._prepareAppearanceTab(); + context.actorSizeUsed = this.token.actor ? Boolean(this.token.actor.system.size) : false; + + return context; + } } diff --git a/module/applications/sheets/items/beastform.mjs b/module/applications/sheets/items/beastform.mjs index 1c4a4880..880c0796 100644 --- a/module/applications/sheets/items/beastform.mjs +++ b/module/applications/sheets/items/beastform.mjs @@ -77,6 +77,7 @@ export default class BeastformSheet extends DHBaseItemSheet { name: context.document.system.advantageOn[key].value })) ); + context.dimensionsDisabled = context.document.system.tokenSize.size !== 'custom'; break; case 'effects': context.effects.actives = context.effects.actives.map(effect => { diff --git a/module/applications/sidebar/tabs/actorDirectory.mjs b/module/applications/sidebar/tabs/actorDirectory.mjs index 4a528e74..d40443a0 100644 --- a/module/applications/sidebar/tabs/actorDirectory.mjs +++ b/module/applications/sidebar/tabs/actorDirectory.mjs @@ -17,4 +17,30 @@ export default class DhActorDirectory extends foundry.applications.sidebar.tabs. : null; }; } + + /** @inheritDoc */ + _onDragStart(event) { + let actor; + const { entryId } = event.currentTarget.dataset; + if (entryId) { + actor = this.collection.get(entryId); + if (!actor?.visible) return false; + } + super._onDragStart(event); + + // Create the drag preview. + if (actor && canvas.ready) { + const img = event.currentTarget.querySelector('img'); + const pt = actor.prototypeToken; + const usesSize = actor.system.metadata.usesSize; + const tokenSizes = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).tokenSizes; + const width = usesSize ? tokenSizes[actor.system.size] : pt.width; + const height = usesSize ? tokenSizes[actor.system.size] : pt.height; + + const w = width * canvas.dimensions.size * Math.abs(pt.texture.scaleX) * canvas.stage.scale.x; + const h = height * canvas.dimensions.size * Math.abs(pt.texture.scaleY) * canvas.stage.scale.y; + const preview = foundry.applications.ux.DragDrop.implementation.createDragImage(img, w, h); + event.dataTransfer.setDragImage(preview, w / 2, h / 2); + } + } } diff --git a/module/config/actorConfig.mjs b/module/config/actorConfig.mjs index 7ff42754..fdef7d03 100644 --- a/module/config/actorConfig.mjs +++ b/module/config/actorConfig.mjs @@ -211,6 +211,44 @@ export const adversaryTraits = { } }; +export const tokenSize = { + custom: { + id: 'custom', + value: 0, + label: 'DAGGERHEART.GENERAL.custom' + }, + tiny: { + id: 'tiny', + value: 1, + label: 'DAGGERHEART.CONFIG.TokenSize.tiny' + }, + small: { + id: 'small', + value: 2, + label: 'DAGGERHEART.CONFIG.TokenSize.small' + }, + medium: { + id: 'medium', + value: 3, + label: 'DAGGERHEART.CONFIG.TokenSize.medium' + }, + large: { + id: 'large', + value: 4, + label: 'DAGGERHEART.CONFIG.TokenSize.large' + }, + huge: { + id: 'huge', + value: 5, + label: 'DAGGERHEART.CONFIG.TokenSize.huge' + }, + gargantuan: { + id: 'gargantuan', + value: 6, + label: 'DAGGERHEART.CONFIG.TokenSize.gargantuan' + } +}; + export const levelChoices = { attributes: { name: 'attributes', diff --git a/module/data/activeEffect/beastformEffect.mjs b/module/data/activeEffect/beastformEffect.mjs index b5e775fc..b041b59e 100644 --- a/module/data/activeEffect/beastformEffect.mjs +++ b/module/data/activeEffect/beastformEffect.mjs @@ -65,20 +65,30 @@ export default class BeastformEffect extends BaseEffect { } }; - const updateToken = token => ({ - ...baseUpdate, - 'texture': { - enabled: this.characterTokenData.usesDynamicToken, - src: token.flags.daggerheart?.beastformTokenImg ?? this.characterTokenData.tokenImg - }, - 'ring': { - subject: { - texture: - token.flags.daggerheart?.beastformSubjectTexture ?? this.characterTokenData.tokenRingImg - } - }, - 'flags.daggerheart': { '-=beastformTokenImg': null, '-=beastformSubjectTexture': null } - }); + const updateToken = token => { + const { x, y } = game.system.api.documents.DhToken.getSnappedPositionInSquareGrid( + token.object.scene.grid, + { x: token.x, y: token.y, elevation: token.elevation }, + baseUpdate.width, + baseUpdate.height + ); + return { + ...baseUpdate, + x, + y, + 'texture': { + enabled: this.characterTokenData.usesDynamicToken, + src: token.flags.daggerheart?.beastformTokenImg ?? this.characterTokenData.tokenImg + }, + 'ring': { + subject: { + texture: + token.flags.daggerheart?.beastformSubjectTexture ?? this.characterTokenData.tokenRingImg + } + }, + 'flags.daggerheart': { '-=beastformTokenImg': null, '-=beastformSubjectTexture': null } + }; + }; await updateActorTokens(this.parent.parent, update, updateToken); diff --git a/module/data/actor/adversary.mjs b/module/data/actor/adversary.mjs index bb8df3ee..a7b66d4d 100644 --- a/module/data/actor/adversary.mjs +++ b/module/data/actor/adversary.mjs @@ -11,7 +11,8 @@ export default class DhpAdversary extends BaseDataActor { label: 'TYPES.Actor.adversary', type: 'adversary', settingSheet: DHAdversarySettings, - hasAttribution: true + hasAttribution: true, + usesSize: true }); } @@ -142,7 +143,7 @@ export default class DhpAdversary extends BaseDataActor { } isItemValid(source) { - return source.type === "feature"; + return source.type === 'feature'; } async _preUpdate(changes, options, user) { diff --git a/module/data/actor/base.mjs b/module/data/actor/base.mjs index f3662da2..29b0af28 100644 --- a/module/data/actor/base.mjs +++ b/module/data/actor/base.mjs @@ -42,7 +42,8 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel { settingSheet: null, hasResistances: true, hasAttribution: false, - hasLimitedView: true + hasLimitedView: true, + usesSize: false }; } @@ -77,6 +78,13 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel { 'DAGGERHEART.GENERAL.DamageResistance.magicalReduction' ) }); + if (this.metadata.usesSize) + schema.size = new fields.StringField({ + required: true, + nullable: false, + choices: CONFIG.DH.ACTOR.tokenSize, + initial: CONFIG.DH.ACTOR.tokenSize.custom.id + }); return schema; } diff --git a/module/data/actor/party.mjs b/module/data/actor/party.mjs index b306c486..236d65db 100644 --- a/module/data/actor/party.mjs +++ b/module/data/actor/party.mjs @@ -26,7 +26,7 @@ export default class DhParty extends BaseDataActor { /* -------------------------------------------- */ isItemValid(source) { - return ["weapon", "armor", "consumable", "loot"].includes(source.type); + return ['weapon', 'armor', 'consumable', 'loot'].includes(source.type); } prepareBaseData() { diff --git a/module/data/fields/action/beastformField.mjs b/module/data/fields/action/beastformField.mjs index 6ec5fdac..6185f0f8 100644 --- a/module/data/fields/action/beastformField.mjs +++ b/module/data/fields/action/beastformField.mjs @@ -92,6 +92,18 @@ export default class BeastformField extends fields.SchemaField { beastformEffect.changes = [...beastformEffect.changes, ...evolvedForm.changes]; formData.system.features = [...formData.system.features, ...selectedForm.system.features.map(x => x.uuid)]; + + const baseSize = evolvedData.form.system.tokenSize.size; + const evolvedSize = + baseSize === 'custom' + ? 'custom' + : (Object.keys(CONFIG.DH.ACTOR.tokenSize).find( + x => CONFIG.DH.ACTOR.tokenSize[x].value === CONFIG.DH.ACTOR.tokenSize[baseSize].value + 1 + ) ?? baseSize); + formData.system.tokenSize = { + ...evolvedData.form.system.tokenSize, + size: evolvedSize + }; } if (selectedForm.system.beastformType === CONFIG.DH.ITEM.beastformTypes.hybrid.id) { diff --git a/module/data/item/beastform.mjs b/module/data/item/beastform.mjs index 51ca298d..669cd4b1 100644 --- a/module/data/item/beastform.mjs +++ b/module/data/item/beastform.mjs @@ -43,6 +43,12 @@ export default class DHBeastform extends BaseDataItem { base64: false }), tokenSize: new fields.SchemaField({ + size: new fields.StringField({ + required: true, + nullable: false, + choices: CONFIG.DH.ACTOR.tokenSize, + initial: CONFIG.DH.ACTOR.tokenSize.custom.id + }), height: new fields.NumberField({ integer: true, min: 1, initial: null, nullable: true }), width: new fields.NumberField({ integer: true, min: 1, initial: null, nullable: true }) }), @@ -190,9 +196,18 @@ export default class DHBeastform extends BaseDataItem { await this.parent.parent.createEmbeddedDocuments('ActiveEffect', [beastformEffect.toObject()]); + const autoTokenSize = + this.tokenSize.size !== 'custom' + ? game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).tokenSizes[ + this.tokenSize.size + ] + : null; + const width = autoTokenSize ?? this.tokenSize.width; + const height = autoTokenSize ?? this.tokenSize.height; + const prototypeTokenUpdate = { - height: this.tokenSize.height, - width: this.tokenSize.width, + height, + width, texture: { src: this.tokenImg }, @@ -202,16 +217,25 @@ export default class DHBeastform extends BaseDataItem { } } }; - - const tokenUpdate = token => ({ - ...prototypeTokenUpdate, - flags: { - daggerheart: { - beastformTokenImg: token.texture.src, - beastformSubjectTexture: token.ring.subject.texture + const tokenUpdate = token => { + const { x, y } = game.system.api.documents.DhToken.getSnappedPositionInSquareGrid( + token.object.scene.grid, + { x: token.x, y: token.y, elevation: token.elevation }, + width ?? token.width, + height ?? token.height + ); + return { + ...prototypeTokenUpdate, + x, + y, + flags: { + daggerheart: { + beastformTokenImg: token.texture.src, + beastformSubjectTexture: token.ring.subject.texture + } } - } - }); + }; + }; await updateActorTokens(this.parent.parent, prototypeTokenUpdate, tokenUpdate); diff --git a/module/data/settings/Homebrew.mjs b/module/data/settings/Homebrew.mjs index 6f280cbd..7572c9ea 100644 --- a/module/data/settings/Homebrew.mjs +++ b/module/data/settings/Homebrew.mjs @@ -40,6 +40,38 @@ export default class DhHomebrew extends foundry.abstract.DataModel { traitArray: new fields.ArrayField(new fields.NumberField({ required: true, integer: true }), { initial: () => [2, 1, 1, 0, 0, -1] }), + tokenSizes: new fields.SchemaField({ + tiny: new fields.NumberField({ + integer: false, + initial: 0.5, + label: 'DAGGERHEART.CONFIG.TokenSize.tiny' + }), + small: new fields.NumberField({ + integer: false, + initial: 0.8, + label: 'DAGGERHEART.CONFIG.TokenSize.small' + }), + medium: new fields.NumberField({ + integer: false, + initial: 1, + label: 'DAGGERHEART.CONFIG.TokenSize.medium' + }), + large: new fields.NumberField({ + integer: false, + initial: 2, + label: 'DAGGERHEART.CONFIG.TokenSize.large' + }), + huge: new fields.NumberField({ + integer: false, + initial: 3, + label: 'DAGGERHEART.CONFIG.TokenSize.huge' + }), + gargantuan: new fields.NumberField({ + integer: false, + initial: 4, + label: 'DAGGERHEART.CONFIG.TokenSize.gargantuan' + }) + }), currency: new fields.SchemaField({ title: new fields.StringField({ required: true, diff --git a/module/documents/_module.mjs b/module/documents/_module.mjs index af1e9942..22718bea 100644 --- a/module/documents/_module.mjs +++ b/module/documents/_module.mjs @@ -4,6 +4,7 @@ export { default as DhpCombat } from './combat.mjs'; export { default as DHCombatant } from './combatant.mjs'; export { default as DhActiveEffect } from './activeEffect.mjs'; export { default as DhChatMessage } from './chatMessage.mjs'; +export { default as DhScene } from './scene.mjs'; export { default as DhToken } from './token.mjs'; export { default as DhTooltipManager } from './tooltipManager.mjs'; export { default as DhTemplateManager } from './templateManager.mjs'; diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index 3e1a9eca..06b60447 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -74,16 +74,27 @@ export default class DhpActor extends Actor { /**@inheritdoc */ async _preCreate(data, options, user) { if ((await super._preCreate(data, options, user)) === false) return false; + const update = {}; + + // Set default token size. Done here as we do not want to set a datamodel default, since that would apply the sizing to third party actor modules that aren't set up with the size system. + if (this.system.metadata.usesSize && !data.system?.size) { + Object.assign(update, { + system: { + size: CONFIG.DH.ACTOR.tokenSize.medium.id + } + }); + } // Configure prototype token settings - const prototypeToken = {}; if (['character', 'companion', 'party'].includes(this.type)) - Object.assign(prototypeToken, { - sight: { enabled: true }, - actorLink: true, - disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY + Object.assign(update, { + prototypeToken: { + sight: { enabled: true }, + actorLink: true, + disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY + } }); - this.updateSource({ prototypeToken }); + this.updateSource(update); } _onUpdate(changes, options, userId) { diff --git a/module/documents/scene.mjs b/module/documents/scene.mjs new file mode 100644 index 00000000..c6cdd2c2 --- /dev/null +++ b/module/documents/scene.mjs @@ -0,0 +1,40 @@ +import DHToken from './token.mjs'; + +export default class DhScene extends Scene { + /** A map of `TokenDocument` IDs embedded in this scene long with new dimensions from actor size-category changes */ + #sizeSyncBatch = new Map(); + + /** Synchronize a token's dimensions with its actor's size category. */ + syncTokenDimensions(tokenDoc, tokenSize) { + if (!tokenDoc.parent?.tokens.has(tokenDoc.id)) return; + const prototype = tokenDoc.actor?.prototypeToken ?? tokenDoc; + this.#sizeSyncBatch.set(tokenDoc.id, { + size: tokenSize, + prototypeSize: { width: prototype.width, height: prototype.height }, + position: { x: tokenDoc.x, y: tokenDoc.y, elevation: tokenDoc.elevation } + }); + this.#processSyncBatch(); + } + + /** Retrieve size and clear size-sync batch, make updates. */ + #processSyncBatch = foundry.utils.debounce(() => { + const tokenSizes = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).tokenSizes; + const entries = this.#sizeSyncBatch + .entries() + .toArray() + .map(([_id, { size, prototypeSize, position }]) => { + const tokenSize = tokenSizes[size]; + const width = size !== CONFIG.DH.ACTOR.tokenSize.custom.id ? tokenSize : prototypeSize.width; + const height = size !== CONFIG.DH.ACTOR.tokenSize.custom.id ? tokenSize : prototypeSize.height; + const updatedPosition = DHToken.getSnappedPositionInSquareGrid(this.grid, position, width, height); + return { + _id, + width, + height, + ...updatedPosition + }; + }); + this.#sizeSyncBatch.clear(); + this.updateEmbeddedDocuments('Token', entries, { animation: { movementSpeed: 1.5 } }); + }, 0); +} diff --git a/module/documents/token.mjs b/module/documents/token.mjs index 6996708b..c3babaa1 100644 --- a/module/documents/token.mjs +++ b/module/documents/token.mjs @@ -1,4 +1,4 @@ -export default class DHToken extends TokenDocument { +export default class DHToken extends CONFIG.Token.documentClass { /** * Inspect the Actor data model and identify the set of attributes which could be used for a Token Bar. * @param {object} attributes The tracked attributes which can be chosen from @@ -100,4 +100,440 @@ export default class DHToken extends TokenDocument { } super.deleteCombatants(tokens, combat ?? {}); } + + /**@inheritdoc */ + static async _preCreateOperation(documents, operation, user) { + const allowed = await super._preCreateOperation(documents, operation, user); + if (allowed === false) return false; + + const tokenSizes = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).tokenSizes; + for (const document of documents) { + const actor = document.actor; + if (actor?.system.metadata.usesSize) { + const tokenSize = tokenSizes[actor.system.size]; + if (tokenSize && actor.system.size !== CONFIG.DH.ACTOR.tokenSize.custom.id) { + document.updateSource({ + width: tokenSize, + height: tokenSize + }); + } + } + } + } + + /**@inheritdoc */ + _onRelatedUpdate(update = {}, operation = {}) { + super._onRelatedUpdate(update, operation); + + if (!this.actor?.isOwner) return; + + const updates = Array.isArray(update) ? update : [update]; + const activeGM = game.users.activeGM; // Let the active GM take care of updates if available + for (let update of updates) { + if ( + this.actor.system.metadata.usesSize && + update.system?.size && + activeGM && + game.user.id === activeGM.id + ) { + const tokenSizes = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).tokenSizes; + const tokenSize = tokenSizes[update.system.size]; + if (tokenSize !== this.width || tokenSize !== this.height) { + this.parent?.syncTokenDimensions(this, update.system.size); + } + } + } + } + + /**@inheritdoc */ + getSnappedPosition(data = {}) { + const grid = this.parent?.grid ?? BaseScene.defaultGrid; + const x = data.x ?? this.x; + const y = data.y ?? this.y; + let elevation = data.elevation ?? this.elevation; + const unsnapped = { x, y, elevation }; + + // Gridless grid + if (grid.isGridless) return unsnapped; + + // Get position and elevation + elevation = Math.round(elevation / grid.distance) * grid.distance; + + let width = data.width ?? this.width; + let height = data.height ?? this.height; + + if (this.actor?.system.metadata.usesSize) { + const tokenSizes = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).tokenSizes; + const tokenSize = tokenSizes[this.actor.system.size]; + if (tokenSize && this.actor.system.size !== CONFIG.DH.ACTOR.tokenSize.custom.id) { + width = tokenSize ?? width; + height = tokenSize ?? height; + } + } + + // Round width and height to nearest multiple of 0.5 if not small + width = width < 1 ? width : Math.round(width * 2) / 2; + height = height < 1 ? height : Math.round(height * 2) / 2; + const shape = data.shape ?? this.shape; + + // Square grid + let snapped; + if (grid.isSquare) snapped = DHToken.getSnappedPositionInSquareGrid(grid, unsnapped, width, height); + // Hexagonal grid + else snapped = DHToken.getSnappedPositionInHexagonalGrid(grid, unsnapped, width, height, shape); + return { x: snapped.x, y: snapped.y, elevation }; + } + + static getSnappedPositionInSquareGrid(grid, position, width, height) { + const M = CONST.GRID_SNAPPING_MODES; + // Small tokens snap to any vertex of the subgrid with resolution 4 + // where the token is fully contained within the grid space + const isTiny = (width === 0.5 && height <= 1) || (width <= 1 && height === 0.5); + if (isTiny) { + let x = position.x / grid.size; + let y = position.y / grid.size; + if (width === 1) x = Math.round(x); + else { + x = Math.floor(x * 8); + const k = ((x % 8) + 8) % 8; + if (k >= 6) x = Math.ceil(x / 8); + else if (k === 5) x = Math.floor(x / 8) + 0.5; + else x = Math.round(x / 2) / 4; + } + if (height === 1) y = Math.round(y); + else { + y = Math.floor(y * 8); + const k = ((y % 8) + 8) % 8; + if (k >= 6) y = Math.ceil(y / 8); + else if (k === 5) y = Math.floor(y / 8) + 0.5; + else y = Math.round(y / 2) / 4; + } + + x *= grid.size; + y *= grid.size; + + return { x, y }; + } else if (width < 1 && height < 1) { + // isSmall + let xGrid = Math.round(position.x / grid.size); + let yGrid = Math.round(position.y / grid.size); + + const x = xGrid * grid.size + grid.size / 2 - (width * grid.size) / 2; + const y = yGrid * grid.size + grid.size / 2 - (height * grid.size) / 2; + + return { x, y }; + } + + const modeX = Number.isInteger(width) ? M.VERTEX : M.VERTEX | M.EDGE_MIDPOINT | M.CENTER; + const modeY = Number.isInteger(height) ? M.VERTEX : M.VERTEX | M.EDGE_MIDPOINT | M.CENTER; + + if (modeX === modeY) return grid.getSnappedPoint(position, { mode: modeX }); + + return { + x: grid.getSnappedPoint(position, { mode: modeX }).x, + y: grid.getSnappedPoint(position, { mode: modeY }).y + }; + } + + //#region CopyPasta for mean private methods that have to be duplicated + static getSnappedPositionInHexagonalGrid(grid, position, width, height, shape) { + // Hexagonal shape + const hexagonalShape = DHToken.#getHexagonalShape(width, height, shape, grid.columns); + if (hexagonalShape) { + const offsetX = hexagonalShape.anchor.x * grid.sizeX; + const offsetY = hexagonalShape.anchor.y * grid.sizeY; + position = grid.getCenterPoint({ x: position.x + offsetX, y: position.y + offsetY }); + position.x -= offsetX; + position.y -= offsetY; + return position; + } + + // Rectagular shape + const M = CONST.GRID_SNAPPING_MODES; + return grid.getSnappedPoint(position, { mode: M.CENTER | M.VERTEX | M.CORNER | M.SIDE_MIDPOINT }); + } + + /** + * The cache of hexagonal shapes. + * @type {Map>} + */ + static #hexagonalShapes = new Map(); + + static #getHexagonalShape(width, height, shape, columns) { + if (!Number.isInteger(width * 2) || !Number.isInteger(height * 2)) return null; + + // TODO: can we set a max of 2^13 on width and height so that we may use an integer key? + const key = `${width},${height},${shape}${columns ? 'C' : 'R'}`; + let data = DHToken.#hexagonalShapes.get(key); + if (data) return data; + + // Hexagon symmetry + if (columns) { + const rowData = BaseToken.#getHexagonalShape(height, width, shape, false); + if (!rowData) return null; + + // Transpose the offsets/points of the shape in row orientation + const offsets = { even: [], odd: [] }; + for (const { i, j } of rowData.offsets.even) offsets.even.push({ i: j, j: i }); + for (const { i, j } of rowData.offsets.odd) offsets.odd.push({ i: j, j: i }); + offsets.even.sort(({ i: i0, j: j0 }, { i: i1, j: j1 }) => j0 - j1 || i0 - i1); + offsets.odd.sort(({ i: i0, j: j0 }, { i: i1, j: j1 }) => j0 - j1 || i0 - i1); + const points = []; + for (let i = rowData.points.length; i > 0; i -= 2) { + points.push(rowData.points[i - 1], rowData.points[i - 2]); + } + data = { + offsets, + points, + center: { x: rowData.center.y, y: rowData.center.x }, + anchor: { x: rowData.anchor.y, y: rowData.anchor.x } + }; + } + + // Small hexagon + else if (width === 0.5 && height === 0.5) { + data = { + offsets: { even: [{ i: 0, j: 0 }], odd: [{ i: 0, j: 0 }] }, + points: [0.25, 0.0, 0.5, 0.125, 0.5, 0.375, 0.25, 0.5, 0.0, 0.375, 0.0, 0.125], + center: { x: 0.25, y: 0.25 }, + anchor: { x: 0.25, y: 0.25 } + }; + } + + // Normal hexagon + else if (width === 1 && height === 1) { + data = { + offsets: { even: [{ i: 0, j: 0 }], odd: [{ i: 0, j: 0 }] }, + points: [0.5, 0.0, 1.0, 0.25, 1, 0.75, 0.5, 1.0, 0.0, 0.75, 0.0, 0.25], + center: { x: 0.5, y: 0.5 }, + anchor: { x: 0.5, y: 0.5 } + }; + } + + // Hexagonal ellipse or trapezoid + else if (shape <= CONST.TOKEN_SHAPES.TRAPEZOID_2) { + data = DHToken.#createHexagonalEllipseOrTrapezoid(width, height, shape); + } + + // Hexagonal rectangle + else if (shape <= CONST.TOKEN_SHAPES.RECTANGLE_2) { + data = DHToken.#createHexagonalRectangle(width, height, shape); + } + + // Cache the shape + if (data) { + foundry.utils.deepFreeze(data); + DHToken.#hexagonalShapes.set(key, data); + } + + return data; + } + + static #createHexagonalEllipseOrTrapezoid(width, height, shape) { + if (!Number.isInteger(width) || !Number.isInteger(height)) return null; + const points = []; + let top; + let bottom; + switch (shape) { + case CONST.TOKEN_SHAPES.ELLIPSE_1: + if (height >= 2 * width) return null; + top = Math.floor(height / 2); + bottom = Math.floor((height - 1) / 2); + break; + case CONST.TOKEN_SHAPES.ELLIPSE_2: + if (height >= 2 * width) return null; + top = Math.floor((height - 1) / 2); + bottom = Math.floor(height / 2); + break; + case CONST.TOKEN_SHAPES.TRAPEZOID_1: + if (height > width) return null; + top = height - 1; + bottom = 0; + break; + case CONST.TOKEN_SHAPES.TRAPEZOID_2: + if (height > width) return null; + top = 0; + bottom = height - 1; + break; + } + const offsets = { even: [], odd: [] }; + for (let i = bottom; i > 0; i--) { + for (let j = 0; j < width - i; j++) { + offsets.even.push({ i: bottom - i, j: j + (((bottom & 1) + i + 1) >> 1) }); + offsets.odd.push({ i: bottom - i, j: j + (((bottom & 1) + i) >> 1) }); + } + } + for (let i = 0; i <= top; i++) { + for (let j = 0; j < width - i; j++) { + offsets.even.push({ i: bottom + i, j: j + (((bottom & 1) + i + 1) >> 1) }); + offsets.odd.push({ i: bottom + i, j: j + (((bottom & 1) + i) >> 1) }); + } + } + let x = 0.5 * bottom; + let y = 0.25; + for (let k = width - bottom; k--; ) { + points.push(x, y); + x += 0.5; + y -= 0.25; + points.push(x, y); + x += 0.5; + y += 0.25; + } + points.push(x, y); + for (let k = bottom; k--; ) { + y += 0.5; + points.push(x, y); + x += 0.5; + y += 0.25; + points.push(x, y); + } + y += 0.5; + for (let k = top; k--; ) { + points.push(x, y); + x -= 0.5; + y += 0.25; + points.push(x, y); + y += 0.5; + } + for (let k = width - top; k--; ) { + points.push(x, y); + x -= 0.5; + y += 0.25; + points.push(x, y); + x -= 0.5; + y -= 0.25; + } + points.push(x, y); + for (let k = top; k--; ) { + y -= 0.5; + points.push(x, y); + x -= 0.5; + y -= 0.25; + points.push(x, y); + } + y -= 0.5; + for (let k = bottom; k--; ) { + points.push(x, y); + x += 0.5; + y -= 0.25; + points.push(x, y); + y -= 0.5; + } + return { + offsets, + points, + // We use the centroid of the polygon for ellipse and trapzoid shapes + center: foundry.utils.polygonCentroid(points), + anchor: bottom % 2 ? { x: 0.0, y: 0.5 } : { x: 0.5, y: 0.5 } + }; + } + + /** + * Create the row-based hexagonal rectangle given the type, width, and height. + * @param {number} width The width of the Token (positive) + * @param {number} height The height of the Token (positive) + * @param {TokenShapeType} shape The shape type (must be RECTANGLE_1 or RECTANGLE_2) + * @returns {TokenHexagonalShapeData|null} The hexagonal shape or null if there is no shape + * for the given combination of arguments + */ + static #createHexagonalRectangle(width, height, shape) { + if (width < 1 || !Number.isInteger(height)) return null; + if (width === 1 && height > 1) return null; + if (!Number.isInteger(width) && height === 1) return null; + + const even = shape === CONST.TOKEN_SHAPES.RECTANGLE_1 || height === 1; + const offsets = { even: [], odd: [] }; + for (let i = 0; i < height; i++) { + const j0 = even ? 0 : (i + 1) & 1; + const j1 = ((width + (i & 1) * 0.5) | 0) - (even ? i & 1 : 0); + for (let j = j0; j < j1; j++) { + offsets.even.push({ i, j: j + (i & 1) }); + offsets.odd.push({ i, j }); + } + } + let x = even ? 0.0 : 0.5; + let y = 0.25; + const points = [x, y]; + while (x + 1 <= width) { + x += 0.5; + y -= 0.25; + points.push(x, y); + x += 0.5; + y += 0.25; + points.push(x, y); + } + if (x !== width) { + y += 0.5; + points.push(x, y); + x += 0.5; + y += 0.25; + points.push(x, y); + } + while (y + 1.5 <= 0.75 * height) { + y += 0.5; + points.push(x, y); + x -= 0.5; + y += 0.25; + points.push(x, y); + y += 0.5; + points.push(x, y); + x += 0.5; + y += 0.25; + points.push(x, y); + } + if (y + 0.75 < 0.75 * height) { + y += 0.5; + points.push(x, y); + x -= 0.5; + y += 0.25; + points.push(x, y); + } + y += 0.5; + points.push(x, y); + while (x - 1 >= 0) { + x -= 0.5; + y += 0.25; + points.push(x, y); + x -= 0.5; + y -= 0.25; + points.push(x, y); + } + if (x !== 0) { + y -= 0.5; + points.push(x, y); + x -= 0.5; + y -= 0.25; + points.push(x, y); + } + while (y - 1.5 > 0) { + y -= 0.5; + points.push(x, y); + x += 0.5; + y -= 0.25; + points.push(x, y); + y -= 0.5; + points.push(x, y); + x -= 0.5; + y -= 0.25; + points.push(x, y); + } + if (y - 0.75 > 0) { + y -= 0.5; + points.push(x, y); + x += 0.5; + y -= 0.25; + points.push(x, y); + } + return { + offsets, + points, + // We use center of the rectangle (and not the centroid of the polygon) for the rectangle shapes + center: { + x: width / 2, + y: (0.75 * Math.floor(height) + 0.5 * (height % 1) + 0.25) / 2 + }, + anchor: even ? { x: 0.5, y: 0.5 } : { x: 0.0, y: 0.5 } + }; + } + //#endregion } diff --git a/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json b/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json index 1d4cf11a..e93017f9 100644 --- a/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json +++ b/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json @@ -40,7 +40,8 @@ "experiences": { "pe7OIoJsqlpMXEvs": { "name": "Tremor Sense", - "value": 2 + "value": 2, + "description": "" } }, "bonuses": { @@ -148,7 +149,8 @@ "source": "Daggerheart SRD", "page": 75, "artist": "" - } + }, + "size": "large" }, "flags": {}, "ownership": { diff --git a/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json b/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json index 3d1404a7..be14ae49 100644 --- a/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json +++ b/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 91, "artist": "" - } + }, + "size": "gargantuan" }, "flags": {}, "_id": "G7jiltRjgvVhZewm", diff --git a/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json b/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json index fbf53d80..41bd6fca 100644 --- a/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json +++ b/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json @@ -110,7 +110,8 @@ "source": "Daggerheart SRD", "page": 84, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "vNIbYQ4YSzNf0WPE", diff --git a/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json b/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json index 2962b84c..d2fb5183 100644 --- a/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json +++ b/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json @@ -122,7 +122,8 @@ "source": "Daggerheart SRD", "page": 97, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "WPEOIGfclNJxWb87", diff --git a/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json b/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json index bfdee207..034905aa 100644 --- a/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json +++ b/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json @@ -39,7 +39,8 @@ "experiences": { "Gtr9I2G39GcXT2Si": { "name": "Local Knowledge", - "value": 3 + "value": 3, + "description": "" } }, "bonuses": { @@ -116,7 +117,8 @@ "source": "Daggerheart SRD", "page": 77, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "JRhrrEg5UroURiAD", diff --git a/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json b/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json index 88d63721..1b2c8cad 100644 --- a/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json +++ b/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 84, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "0ts6CGd93lLqGZI5", diff --git a/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json b/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json index b962fe78..cae27b60 100644 --- a/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json +++ b/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 84, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "h5RuhzGL17dW5FBT", diff --git a/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json b/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json index b172b646..14b5c0f3 100644 --- a/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json +++ b/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 85, "artist": "" - } + }, + "size": "large" }, "flags": {}, "_id": "dgH3fW9FTYLaIDvS", diff --git a/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json b/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json index f804c06e..2e4da586 100644 --- a/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json +++ b/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json @@ -122,7 +122,8 @@ "source": "Daggerheart SRD", "page": 75, "artist": "" - } + }, + "size": "large" }, "flags": {}, "_id": "71qKDLKO3CsrNkdy", diff --git a/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json b/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json index ecc547f8..f4227a91 100644 --- a/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json +++ b/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 77, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "B4LZcGuBAHzyVdzy", diff --git a/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json b/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json index 96e00139..d522e737 100644 --- a/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json +++ b/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json @@ -120,7 +120,8 @@ "source": "Daggerheart SRD", "page": 83, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "2UeZ0tEe7AzgSJNd", diff --git a/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json b/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json index 91ba0045..a85d9bf2 100644 --- a/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json +++ b/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json @@ -118,7 +118,8 @@ "source": "Daggerheart SRD", "page": 75, "artist": "" - } + }, + "size": "large" }, "flags": {}, "_id": "8Zkqk1jU09nKL2fy", diff --git a/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json b/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json index cf2be503..fabb0a14 100644 --- a/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json +++ b/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 85, "artist": "" - } + }, + "size": "tiny" }, "flags": {}, "_id": "jDmHqGvzg5wjgmxE", diff --git a/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json b/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json index d79aed6c..9503a299 100644 --- a/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json +++ b/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json @@ -104,7 +104,8 @@ "source": "Daggerheart SRD", "page": 85, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "99TqczuQipBmaB8i", diff --git a/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json b/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json index 964b1354..428e2def 100644 --- a/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json +++ b/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 75, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "uOP5oT9QzXPlnf3p", diff --git a/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json b/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json index 571d8cf1..470dc140 100644 --- a/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json +++ b/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json @@ -122,7 +122,8 @@ "source": "Daggerheart SRD", "page": 85, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "ZxWaWPdzFIUPNC62", diff --git a/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json b/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json index c22a8130..eabd803e 100644 --- a/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json +++ b/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 76, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "CBBuEXAlLKFMJdjg", diff --git a/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json b/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json index 8e4f477e..587d980c 100644 --- a/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json +++ b/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json @@ -122,7 +122,8 @@ "source": "Daggerheart SRD", "page": 85, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "0NxCSugvKQ4W8OYZ", diff --git a/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json b/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json index 5b167356..2dfb331d 100644 --- a/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json +++ b/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 86, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "tyBOpLfigAhI9bU3", diff --git a/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json b/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json index 0aa5c326..6078e25c 100644 --- a/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json +++ b/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json @@ -104,7 +104,8 @@ "source": "Daggerheart SRD", "page": 86, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "zx99sOGTXicP4SSD", diff --git a/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json b/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json index 19d0fd4d..4fab7cb6 100644 --- a/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json +++ b/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json @@ -116,7 +116,8 @@ "source": "Daggerheart SRD", "page": 76, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "9x2xY9zwc3xzbXo5", diff --git a/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json b/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json index fa925b38..38b5a23c 100644 --- a/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json +++ b/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 91, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "pnyjIGxxvurcWmTv", diff --git a/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json b/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json index cc792029..c9e9579a 100644 --- a/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json +++ b/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 92, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "kE4dfhqmIQpNd44e", diff --git a/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json b/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json index 04f6a778..be8f3eab 100644 --- a/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json +++ b/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 92, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "2VN3BftageoTTIzu", diff --git a/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json b/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json index e79eef29..7e3b5c6d 100644 --- a/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json +++ b/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json @@ -118,7 +118,8 @@ "source": "Daggerheart SRD", "page": 92, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "SxSOkM4bcVOFyjbo", diff --git a/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json b/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json index cfe301f5..538c0d0a 100644 --- a/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json +++ b/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json @@ -118,7 +118,8 @@ "source": "Daggerheart SRD", "page": 92, "artist": "" - } + }, + "size": "large" }, "flags": {}, "_id": "5lphJAgzoqZI3VoG", diff --git a/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json b/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json index d407949e..cf982cda 100644 --- a/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json +++ b/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 86, "artist": "" - } + }, + "size": "large" }, "flags": {}, "_id": "NoRZ1PqB8N5wcIw0", diff --git a/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json b/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json index 9c367879..91f4d795 100644 --- a/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json +++ b/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json @@ -116,7 +116,8 @@ "source": "Daggerheart SRD", "page": 93, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "tBWHW00epmMnkawe", diff --git a/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json b/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json index f40c2310..5028e88c 100644 --- a/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json +++ b/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 76, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "wNzeuQLfLUMvgHlQ", diff --git a/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json b/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json index 0bd8939e..2b1596da 100644 --- a/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json +++ b/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 93, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "wR7cFKrHvRzbzhBT", diff --git a/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json b/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json index 0354d820..73074ca1 100644 --- a/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json +++ b/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 86, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "TLzY1nDw0Bu9Ud40", diff --git a/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json b/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json index 9713e7ba..1a265528 100644 --- a/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json +++ b/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json @@ -104,7 +104,8 @@ "source": "Daggerheart SRD", "page": 93, "artist": "" - } + }, + "size": "tiny" }, "flags": {}, "_id": "P7h54ZePFPHpYwvB", diff --git a/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json b/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json index 18dc586b..cc98f31d 100644 --- a/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json +++ b/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json @@ -143,7 +143,8 @@ "source": "Daggerheart SRD", "page": 86, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "ownership": { diff --git a/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json b/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json index 7e97c5b1..89c922f4 100644 --- a/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json +++ b/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 86, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "ChwwVqowFw8hJQwT", diff --git a/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json b/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json index b8b054c8..9833a495 100644 --- a/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json +++ b/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json @@ -104,7 +104,8 @@ "source": "Daggerheart SRD", "page": 97, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "OsLG2BjaEdTZUJU9", diff --git a/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json b/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json index 8b690bfd..9c63042e 100644 --- a/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json +++ b/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 97, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "PELRry1vqjBzSAlr", 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 8d75dd9e..8b0d912d 100644 --- a/src/packs/adversaries/adversary_Fallen_Warlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json +++ b/src/packs/adversaries/adversary_Fallen_Warlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json @@ -160,7 +160,8 @@ "source": "Daggerheart SRD", "page": 97, "artist": "" - } + }, + "size": "medium" }, "prototypeToken": { "name": "Fallen Warlord: Realm Breaker", 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 061abed8..bc5ceee1 100644 --- a/src/packs/adversaries/adversary_Fallen_Warlord__Undefeated_Champion_RXkZTwBRi4dJ3JE5.json +++ b/src/packs/adversaries/adversary_Fallen_Warlord__Undefeated_Champion_RXkZTwBRi4dJ3JE5.json @@ -161,7 +161,8 @@ "source": "Daggerheart SRD", "page": 98, "artist": "" - } + }, + "size": "medium" }, "prototypeToken": { "name": "Fallen Warlord: Undefeated Champion", diff --git a/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json b/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json index e82d30d8..52e27c88 100644 --- a/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json +++ b/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 87, "artist": "" - } + }, + "size": "large" }, "flags": {}, "_id": "8VZIgU12cB3cvlyH", diff --git a/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json b/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json index a51abc03..def13ed1 100644 --- a/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json +++ b/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 87, "artist": "" - } + }, + "size": "large" }, "flags": {}, "_id": "YnObCleGjPT7yqEc", diff --git a/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json b/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json index dc21e5aa..3b877a09 100644 --- a/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json +++ b/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json @@ -143,7 +143,8 @@ "source": "Daggerheart SRD", "page": 87, "artist": "" - } + }, + "size": "large" }, "flags": {}, "ownership": { diff --git a/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json b/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json index 0db2613f..842f4adf 100644 --- a/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json +++ b/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 76, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "IIWV4ysJPFPnTP7W", diff --git a/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json b/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json index 7da2eabd..26b5b232 100644 --- a/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json +++ b/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json @@ -110,7 +110,8 @@ "source": "Daggerheart SRD", "page": 76, "artist": "" - } + }, + "size": "small" }, "flags": {}, "_id": "4PfLnaCrOcMdb4dK", diff --git a/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json b/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json index 0ef9eb18..f926bd4b 100644 --- a/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json +++ b/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json @@ -104,7 +104,8 @@ "source": "Daggerheart SRD", "page": 87, "artist": "" - } + }, + "size": "large" }, "flags": {}, "_id": "5s8wSvpyC5rxY5aD", diff --git a/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json b/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json index b65a27ba..cebcaced 100644 --- a/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json +++ b/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 76, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "fmfntuJ8mHRCAktP", diff --git a/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json b/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json index 67d9a7d7..b730dc57 100644 --- a/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json +++ b/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 77, "artist": "" - } + }, + "size": "large" }, "flags": {}, "_id": "8KWVLWXFhlY2kYx0", diff --git a/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json b/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json index 98080be6..b8e1012b 100644 --- a/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json +++ b/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 88, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "8mJYMpbLTb8qIOrr", diff --git a/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json b/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json index e8bc6601..ebb104f6 100644 --- a/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json +++ b/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 93, "artist": "" - } + }, + "size": "gargantuan" }, "flags": {}, "_id": "dsfB3YhoL5SudvS2", diff --git a/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json b/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json index 73b702fb..1ce86201 100644 --- a/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json +++ b/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 93, "artist": "" - } + }, + "size": "gargantuan" }, "flags": {}, "_id": "xIICT6tEdnA7dKDV", diff --git a/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json b/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json index 5746f57b..eaaecf2f 100644 --- a/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json +++ b/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 80, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "SHXedd9zZPVfUgUa", diff --git a/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json b/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json index 6ad8d177..e9a1a19f 100644 --- a/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json +++ b/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 98, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "kabueAo6BALApWqp", diff --git a/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json b/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json index 5a1ccc65..f84daf3c 100644 --- a/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json +++ b/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json @@ -104,7 +104,8 @@ "source": "Daggerheart SRD", "page": 98, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "VENwg7xEFcYObjmT", diff --git a/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json b/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json index d5ce14ff..105c5afd 100644 --- a/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json +++ b/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json @@ -116,7 +116,8 @@ "source": "Daggerheart SRD", "page": 77, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "uRtghKE9mHlII4rs", diff --git a/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json b/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json index d9f6e8b9..48ff14a8 100644 --- a/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json +++ b/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json @@ -122,7 +122,8 @@ "source": "Daggerheart SRD", "page": 77, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "mK3A5FTx6k8iPU3F", diff --git a/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json b/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json index d80504a7..d010ee34 100644 --- a/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json +++ b/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 95, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "i2UNbRvgyoSs07M6", diff --git a/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json b/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json index 58b26f24..a2734e0d 100644 --- a/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json +++ b/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 98, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "r1mbfSSwKWdcFdAU", diff --git a/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json b/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json index d291f805..6e5c45f9 100644 --- a/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json +++ b/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 94, "artist": "" - } + }, + "size": "large" }, "flags": {}, "_id": "6hbqmxDXFOzZJDk4", diff --git a/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json b/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json index 3c39550c..592d0da1 100644 --- a/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json +++ b/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 94, "artist": "" - } + }, + "size": "huge" }, "flags": {}, "_id": "MI126iMOOobQ1Obn", diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Bandit_5Lh1T0zaT8Pkr2U2.json b/src/packs/adversaries/adversary_Jagged_Knife_Bandit_5Lh1T0zaT8Pkr2U2.json index 8828c612..7a95c097 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Bandit_5Lh1T0zaT8Pkr2U2.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Bandit_5Lh1T0zaT8Pkr2U2.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 77, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "5Lh1T0zaT8Pkr2U2", diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json b/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json index 26d83e78..200ed9b1 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json @@ -116,7 +116,8 @@ "source": "Daggerheart SRD", "page": 78, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "MbBPIOxaxXYNApXz", diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json b/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json index 698ef485..48edab51 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json @@ -122,7 +122,8 @@ "source": "Daggerheart SRD", "page": 78, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "CBKixLH3yhivZZuL", diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json b/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json index 668852a8..65c41639 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json @@ -110,7 +110,8 @@ "source": "Daggerheart SRD", "page": 78, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "C0OMQqV7pN6t7ouR", diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json b/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json index 6f4b54a5..004c740a 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json @@ -116,7 +116,8 @@ "source": "Daggerheart SRD", "page": 78, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "aTljstqteGoLpCBq", diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json b/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json index ad53f212..96c65c8c 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 78, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "XF4tYTq9nPJAy2ox", diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Sniper_1zuyof1XuIfi3aMG.json b/src/packs/adversaries/adversary_Jagged_Knife_Sniper_1zuyof1XuIfi3aMG.json index 968e227a..1ef7070c 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Sniper_1zuyof1XuIfi3aMG.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Sniper_1zuyof1XuIfi3aMG.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 78, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "1zuyof1XuIfi3aMG", diff --git a/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json b/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json index fc30a072..242bedcb 100644 --- a/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json +++ b/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 88, "artist": "" - } + }, + "size": "large" }, "flags": {}, "_id": "MYXmTx2FHcIjdfYZ", diff --git a/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json b/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json index 51e7979d..dca27ce3 100644 --- a/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json +++ b/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json @@ -127,7 +127,8 @@ "source": "Daggerheart SRD", "page": 88, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "7ai2opemrclQe3VF", diff --git a/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json b/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json index 62d443c9..58169e89 100644 --- a/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json +++ b/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 99, "artist": "" - } + }, + "size": "gargantuan" }, "flags": {}, "_id": "4nqv3ZwJGjnmic8j", diff --git a/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json b/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json index 5af8b388..500d1211 100644 --- a/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json +++ b/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 88, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "niBpVU7yeo5ccskE", diff --git a/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json b/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json index 5ac80827..f654773a 100644 --- a/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json +++ b/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json @@ -122,7 +122,8 @@ "source": "Daggerheart SRD", "page": 84, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "dNta0cUzr96xcFhf", diff --git a/src/packs/adversaries/adversary_Merchant_Al3w2CgjfdT3p9ma.json b/src/packs/adversaries/adversary_Merchant_Al3w2CgjfdT3p9ma.json index 43135e6f..15197d52 100644 --- a/src/packs/adversaries/adversary_Merchant_Al3w2CgjfdT3p9ma.json +++ b/src/packs/adversaries/adversary_Merchant_Al3w2CgjfdT3p9ma.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 79, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "Al3w2CgjfdT3p9ma", diff --git a/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json b/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json index 0dea7b8e..2d392f8c 100644 --- a/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json +++ b/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json @@ -122,7 +122,8 @@ "source": "Daggerheart SRD", "page": 88, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "Vy02IhGhkJLuezu4", diff --git a/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json b/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json index 8d7c1888..5a9cd4c1 100644 --- a/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json +++ b/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 79, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "sRn4bqerfARvhgSV", diff --git a/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json b/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json index 813af3c3..9f47ce8b 100644 --- a/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json +++ b/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json @@ -110,7 +110,8 @@ "source": "Daggerheart SRD", "page": 79, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "3tqCjDwJAQ7JKqMb", diff --git a/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json b/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json index f57abdd9..24f6da13 100644 --- a/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json +++ b/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 79, "artist": "" - } + }, + "size": "large" }, "flags": {}, "_id": "DscWkNVoHak6P4hh", diff --git a/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json b/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json index c16b2c36..e1f388cf 100644 --- a/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json +++ b/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json @@ -104,7 +104,8 @@ "source": "Daggerheart SRD", "page": 80, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "G62k4oSkhkoXEs2D", diff --git a/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json b/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json index 9ac0caa9..15889935 100644 --- a/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json +++ b/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 89, "artist": "" - } + }, + "size": "large" }, "flags": {}, "_id": "rM9qCIYeWg9I0B4l", diff --git a/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json b/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json index 8ec7b09d..a0d7a81c 100644 --- a/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json +++ b/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json @@ -122,7 +122,8 @@ "source": "Daggerheart SRD", "page": 94, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "yx0vK2yfNVZKWUUi", diff --git a/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json b/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json index febdc8e7..5a7b3aac 100644 --- a/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json +++ b/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 89, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "mVV7a7KQAORoPMgZ", diff --git a/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json b/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json index 977792ea..d35547bd 100644 --- a/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json +++ b/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json @@ -111,7 +111,8 @@ "page": 95, "artist": "" }, - "motivesAndTactics": "Hide in plain sight, preserve the forest, root down, swing branches" + "motivesAndTactics": "Hide in plain sight, preserve the forest, root down, swing branches", + "size": "large" }, "flags": {}, "_id": "XK78QUfY8c8Go8Uv", diff --git a/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json b/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json index be97acf2..b225cf7b 100644 --- a/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json +++ b/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 99, "artist": "" - } + }, + "size": "large" }, "flags": {}, "_id": "befIqd5IYKg6eUz2", diff --git a/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json b/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json index d4b37075..b10f611b 100644 --- a/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json +++ b/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 99, "artist": "" - } + }, + "size": "large" }, "flags": {}, "_id": "A0SeeDzwjvqOsyof", diff --git a/src/packs/adversaries/adversary_Outer_Realms_Corrupter_ms6nuOl3NFkhPj1k.json b/src/packs/adversaries/adversary_Outer_Realms_Corrupter_ms6nuOl3NFkhPj1k.json index f84bc04d..43d029ca 100644 --- a/src/packs/adversaries/adversary_Outer_Realms_Corrupter_ms6nuOl3NFkhPj1k.json +++ b/src/packs/adversaries/adversary_Outer_Realms_Corrupter_ms6nuOl3NFkhPj1k.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 99, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "ms6nuOl3NFkhPj1k", diff --git a/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json b/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json index 38ed9db0..387e4006 100644 --- a/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json +++ b/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json @@ -104,7 +104,8 @@ "source": "Daggerheart SRD", "page": 99, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "moJhHgKqTKPS2WYS", diff --git a/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json b/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json index 1575bbf8..4aca5200 100644 --- a/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json +++ b/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json @@ -40,11 +40,13 @@ "experiences": { "rLPEhboQmaD7QV7T": { "name": "Intimidation", - "value": 2 + "value": 2, + "description": "" }, "ejtjcqd5oW6eKnav": { "name": "Tear Things Apart", - "value": 2 + "value": 2, + "description": "" } }, "bonuses": { @@ -120,7 +122,8 @@ "source": "Daggerheart SRD", "page": 83, "artist": "" - } + }, + "size": "huge" }, "flags": {}, "_id": "EQTOAOUrkIvS2z88", diff --git a/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json b/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json index 3a7af054..b7844a11 100644 --- a/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json +++ b/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 101, "artist": "" - } + }, + "size": "large" }, "flags": {}, "_id": "CP6iRfHdyFWniTHY", diff --git a/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json b/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json index 6e3c052c..80235a50 100644 --- a/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json +++ b/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 80, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "wycLpvebWdUqRhpP", diff --git a/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json b/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json index a1c05eab..ac414c0a 100644 --- a/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json +++ b/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json @@ -122,7 +122,8 @@ "source": "Daggerheart SRD", "page": 81, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "OROJbjsqagVh7ECV", diff --git a/src/packs/adversaries/adversary_Pirate_Raiders_5YgEajn0wa4i85kC.json b/src/packs/adversaries/adversary_Pirate_Raiders_5YgEajn0wa4i85kC.json index dd69529d..baac89b1 100644 --- a/src/packs/adversaries/adversary_Pirate_Raiders_5YgEajn0wa4i85kC.json +++ b/src/packs/adversaries/adversary_Pirate_Raiders_5YgEajn0wa4i85kC.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 81, "artist": "" - } + }, + "size": "huge" }, "flags": {}, "_id": "5YgEajn0wa4i85kC", diff --git a/src/packs/adversaries/adversary_Pirate_Tough_mhcVkVFrzIJ18FDm.json b/src/packs/adversaries/adversary_Pirate_Tough_mhcVkVFrzIJ18FDm.json index 6d15f7da..db91bdc1 100644 --- a/src/packs/adversaries/adversary_Pirate_Tough_mhcVkVFrzIJ18FDm.json +++ b/src/packs/adversaries/adversary_Pirate_Tough_mhcVkVFrzIJ18FDm.json @@ -150,7 +150,8 @@ "source": "Daggerheart SRD", "page": 81, "artist": "" - } + }, + "size": "medium" }, "prototypeToken": { "name": "Pirate Tough", diff --git a/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json b/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json index dc5b66f4..3535a53f 100644 --- a/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json +++ b/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 80, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "9rVlbJVrDNn1x7PS", diff --git a/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json b/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json index 6a7ae3ff..eb49897a 100644 --- a/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json +++ b/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json @@ -104,7 +104,8 @@ "source": "Daggerheart SRD", "page": 83, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "gP3fWTLzSFnpA8EJ", diff --git a/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json b/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json index ef295cb0..7d6c966d 100644 --- a/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json +++ b/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json @@ -122,7 +122,8 @@ "source": "Daggerheart SRD", "page": 89, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "EtLJiTsilPPZvLUX", diff --git a/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json b/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json index 9c158011..064f2e9b 100644 --- a/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json +++ b/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json @@ -122,7 +122,8 @@ "source": "Daggerheart SRD", "page": 89, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "sLAccjvCWfeedbpI", diff --git a/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json b/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json index d5da4bca..5d6d92cc 100644 --- a/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json +++ b/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json @@ -104,7 +104,8 @@ "source": "Daggerheart SRD", "page": 81, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "bgreCaQ6ap2DVpCr", diff --git a/src/packs/adversaries/adversary_Shambling_Zombie_2nXz4ilAY4xuhKLm.json b/src/packs/adversaries/adversary_Shambling_Zombie_2nXz4ilAY4xuhKLm.json index 2e6d7fd2..4c27ae4a 100644 --- a/src/packs/adversaries/adversary_Shambling_Zombie_2nXz4ilAY4xuhKLm.json +++ b/src/packs/adversaries/adversary_Shambling_Zombie_2nXz4ilAY4xuhKLm.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 84, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "2nXz4ilAY4xuhKLm", diff --git a/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json b/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json index dce37d5a..aeb3c752 100644 --- a/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json +++ b/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 90, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "YmVAkdNsyuXWTtYp", diff --git a/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json b/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json index e6700b73..412fc519 100644 --- a/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json +++ b/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 90, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "BK4jwyXSRx7IOQiO", diff --git a/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json b/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json index 845bd708..bd47f587 100644 --- a/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json +++ b/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 81, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "7X5q7a6ueeHs5oA9", diff --git a/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json b/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json index e5daed4f..b1a83ac1 100644 --- a/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json +++ b/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json @@ -104,7 +104,8 @@ "source": "Daggerheart SRD", "page": 81, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "6l1a3Fazq8BoKIcc", diff --git a/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json b/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json index b4a349b5..769302b2 100644 --- a/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json +++ b/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 82, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "Q9LaVTyXF9NF12C7", diff --git a/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json b/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json index dbf39bed..e9a5d149 100644 --- a/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json +++ b/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 82, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "10YIQl0lvCJXZLfX", diff --git a/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json b/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json index 7dfe0c09..37398954 100644 --- a/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json +++ b/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 90, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "5tCkhnBByUIN5UdG", diff --git a/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json b/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json index dd044b50..c4da2d97 100644 --- a/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json +++ b/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 90, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "65cSO3EQEh6ZH6Xk", diff --git a/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json b/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json index 6dcd83c4..b41573f4 100644 --- a/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json +++ b/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 90, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "UFVGl1osOsJTneLf", diff --git a/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json b/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json index d9b3dbf3..2d9f2374 100644 --- a/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json +++ b/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json @@ -118,7 +118,8 @@ "source": "Daggerheart SRD", "page": 82, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "ldbWEL7uZs84vyrR", diff --git a/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json b/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json index ffc4dfe7..1ebe23ff 100644 --- a/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json +++ b/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 90, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "8zlynOhnVA59KpKT", diff --git a/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json b/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json index 2fb0c531..3785ea48 100644 --- a/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json +++ b/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 94, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "KGVwnLq85ywP9xvB", diff --git a/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json b/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json index 807d6675..1c4f6b11 100644 --- a/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json +++ b/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 91, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "3aAS2Qm3R6cgaYfE", diff --git a/src/packs/adversaries/adversary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json b/src/packs/adversaries/adversary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json index 1db0df10..500744e2 100644 --- a/src/packs/adversaries/adversary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json +++ b/src/packs/adversaries/adversary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 82, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "qNgs3AbLyJrY19nt", diff --git a/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json b/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json index af64867f..182afa6a 100644 --- a/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json +++ b/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 82, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "VtFBt9XBE0WrGGxP", diff --git a/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json b/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json index 1d686445..e914cba5 100644 --- a/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json +++ b/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json @@ -148,7 +148,8 @@ "source": "Daggerheart SRD", "page": 82, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "ownership": { diff --git a/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json b/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json index 74b228f5..18baa82c 100644 --- a/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json +++ b/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json @@ -144,7 +144,8 @@ "source": "Daggerheart SRD", "page": 83, "artist": "" - } + }, + "size": "tiny" }, "flags": {}, "ownership": { diff --git a/src/packs/adversaries/adversary_Tiny_Green_Ooze_aLkLFuVoKz2NLoBK.json b/src/packs/adversaries/adversary_Tiny_Green_Ooze_aLkLFuVoKz2NLoBK.json index 8864c47c..5371aa70 100644 --- a/src/packs/adversaries/adversary_Tiny_Green_Ooze_aLkLFuVoKz2NLoBK.json +++ b/src/packs/adversaries/adversary_Tiny_Green_Ooze_aLkLFuVoKz2NLoBK.json @@ -107,7 +107,8 @@ "source": "Daggerheart SRD", "page": 80, "artist": "" - } + }, + "size": "tiny" }, "flags": {}, "_id": "aLkLFuVoKz2NLoBK", diff --git a/src/packs/adversaries/adversary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json b/src/packs/adversaries/adversary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json index 7c3da937..a8d1efb7 100644 --- a/src/packs/adversaries/adversary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json +++ b/src/packs/adversaries/adversary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json @@ -107,7 +107,8 @@ "source": "Daggerheart SRD", "page": 80, "artist": "" - } + }, + "size": "tiny" }, "flags": {}, "_id": "1fkLQXVtmILqfJ44", diff --git a/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json b/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json index 0ff01c70..7c734bf2 100644 --- a/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json +++ b/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json @@ -97,13 +97,15 @@ ] }, "type": "attack", - "chatDisplay": false + "chatDisplay": false, + "range": "" }, "attribution": { "source": "Daggerheart SRD", "page": 95, "artist": "" - } + }, + "size": "small" }, "flags": {}, "_id": "o63nS0k3wHu6EgKP", diff --git a/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json b/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json index 59bdb150..0ec631f1 100644 --- a/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json +++ b/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 95, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "WWyUp6Mxl1S3KYUG", diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json b/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json index 575d88ee..248ff278 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 95, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "JqYraOqNmmhHk4Yy", diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json b/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json index e0776c8c..bf525d9e 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 96, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "FVgYb28fhxlVcGwA", diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json b/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json index a11bef82..cf259cdb 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 96, "artist": "" - } + }, + "size": "large" }, "flags": {}, "_id": "c5hGdvY5UnSjlHws", 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 6f3d436e..25bc361c 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json @@ -150,7 +150,8 @@ "source": "Daggerheart SRD", "page": 101, "artist": "" - } + }, + "size": "gargantuan" }, "prototypeToken": { "name": "Volcanic Dragon: Ashen Tyrant", diff --git a/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json b/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json index 2fcc4ada..befbca6e 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json @@ -150,7 +150,8 @@ "source": "Daggerheart SRD", "page": 100, "artist": "" - } + }, + "size": "gargantuan" }, "prototypeToken": { "name": "Volcanic Dragon: Molten Scourge", diff --git a/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json b/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json index 1eb81b18..be007f4e 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json @@ -150,7 +150,8 @@ "source": "Daggerheart SRD", "page": 100, "artist": "" - } + }, + "size": "gargantuan" }, "prototypeToken": { "name": "Volcanic Dragon: Obsidian Predator", diff --git a/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json b/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json index efe20210..0bcb8e25 100644 --- a/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json +++ b/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json @@ -122,7 +122,8 @@ "source": "Daggerheart SRD", "page": 91, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "noDdT0tsN6FXSmC8", diff --git a/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json b/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json index 6319c895..01d1758b 100644 --- a/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json +++ b/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 83, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "ZNbQ2jg35LG4t9eH", diff --git a/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json b/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json index 9cfb1884..fd978c58 100644 --- a/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json +++ b/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 83, "artist": "" - } + }, + "size": "medium" }, "flags": {}, "_id": "8yUj2Mzvnifhxegm", diff --git a/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json b/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json index f025f45f..d42bda4e 100644 --- a/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json +++ b/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json @@ -117,7 +117,8 @@ "source": "Daggerheart SRD", "page": 96, "artist": "" - } + }, + "size": "huge" }, "flags": {}, "_id": "UGPiPLJsPvMTSKEF", diff --git a/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json b/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json index 0650319b..f93a0993 100644 --- a/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json +++ b/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 101, "artist": "" - } + }, + "size": "huge" }, "flags": {}, "_id": "YhJrP7rTBiRdX5Fp", diff --git a/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json b/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json index 3e94c738..cf5520d6 100644 --- a/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json +++ b/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json @@ -111,7 +111,8 @@ "source": "Daggerheart SRD", "page": 84, "artist": "" - } + }, + "size": "huge" }, "flags": {}, "_id": "Nf0v43rtflV56V2T", diff --git a/src/packs/beastforms/beastform_Agile_Scout_a9UoCwtrbgKk02mK.json b/src/packs/beastforms/beastform_Agile_Scout_a9UoCwtrbgKk02mK.json index 58892f81..71018bc9 100644 --- a/src/packs/beastforms/beastform_Agile_Scout_a9UoCwtrbgKk02mK.json +++ b/src/packs/beastforms/beastform_Agile_Scout_a9UoCwtrbgKk02mK.json @@ -9,7 +9,8 @@ "tokenRingImg": "icons/creatures/mammals/rodent-rat-diseaed-gray.webp", "tokenSize": { "height": null, - "width": null + "width": null, + "size": "tiny" }, "mainTrait": "agility", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Aquatic_Predator_ItBVeCl2u5uetgy7.json b/src/packs/beastforms/beastform_Aquatic_Predator_ItBVeCl2u5uetgy7.json index 46610de3..5287de84 100644 --- a/src/packs/beastforms/beastform_Aquatic_Predator_ItBVeCl2u5uetgy7.json +++ b/src/packs/beastforms/beastform_Aquatic_Predator_ItBVeCl2u5uetgy7.json @@ -9,7 +9,8 @@ "tokenRingImg": "icons/creatures/fish/fish-marlin-swordfight-blue.webp", "tokenSize": { "height": null, - "width": null + "width": null, + "size": "large" }, "mainTrait": "agility", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Aquatic_Scout_qqzdFCxyYupWZK23.json b/src/packs/beastforms/beastform_Aquatic_Scout_qqzdFCxyYupWZK23.json index ef28f80c..95bea914 100644 --- a/src/packs/beastforms/beastform_Aquatic_Scout_qqzdFCxyYupWZK23.json +++ b/src/packs/beastforms/beastform_Aquatic_Scout_qqzdFCxyYupWZK23.json @@ -9,7 +9,8 @@ "tokenRingImg": "icons/creatures/tentacles/tentacles-octopus-black-pink.webp", "tokenSize": { "height": null, - "width": null + "width": null, + "size": "tiny" }, "mainTrait": "agility", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Armored_Sentry_8pUHJv3BYdjA4Qdf.json b/src/packs/beastforms/beastform_Armored_Sentry_8pUHJv3BYdjA4Qdf.json index 8b752488..ba18c05f 100644 --- a/src/packs/beastforms/beastform_Armored_Sentry_8pUHJv3BYdjA4Qdf.json +++ b/src/packs/beastforms/beastform_Armored_Sentry_8pUHJv3BYdjA4Qdf.json @@ -9,7 +9,8 @@ "tokenRingImg": "icons/creatures/reptiles/turtle-shell-glowing-green.webp", "tokenSize": { "height": null, - "width": null + "width": null, + "size": "small" }, "mainTrait": "strength", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Epic_Aquatic_Beast_wT4xbF99I55yjKZV.json b/src/packs/beastforms/beastform_Epic_Aquatic_Beast_wT4xbF99I55yjKZV.json index 710bb3c8..0dfe9c20 100644 --- a/src/packs/beastforms/beastform_Epic_Aquatic_Beast_wT4xbF99I55yjKZV.json +++ b/src/packs/beastforms/beastform_Epic_Aquatic_Beast_wT4xbF99I55yjKZV.json @@ -9,7 +9,8 @@ "tokenRingImg": "icons/creatures/fish/squid-kraken-teal.webp", "tokenSize": { "height": null, - "width": null + "width": null, + "size": "gargantuan" }, "mainTrait": "agility", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Great_Predator_afbMt4Ld6nY3mw0N.json b/src/packs/beastforms/beastform_Great_Predator_afbMt4Ld6nY3mw0N.json index 984c72c8..450a1312 100644 --- a/src/packs/beastforms/beastform_Great_Predator_afbMt4Ld6nY3mw0N.json +++ b/src/packs/beastforms/beastform_Great_Predator_afbMt4Ld6nY3mw0N.json @@ -9,7 +9,8 @@ "tokenRingImg": "icons/creatures/mammals/wolf-shadow-black.webp", "tokenSize": { "height": null, - "width": null + "width": null, + "size": "large" }, "mainTrait": "strength", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Great_Winged_Beast_b4BMnTbJ3iPPidSb.json b/src/packs/beastforms/beastform_Great_Winged_Beast_b4BMnTbJ3iPPidSb.json index 444fda44..c04b2182 100644 --- a/src/packs/beastforms/beastform_Great_Winged_Beast_b4BMnTbJ3iPPidSb.json +++ b/src/packs/beastforms/beastform_Great_Winged_Beast_b4BMnTbJ3iPPidSb.json @@ -9,7 +9,8 @@ "tokenRingImg": "icons/creatures/birds/corvid-flying-wings-purple.webp", "tokenSize": { "height": null, - "width": null + "width": null, + "size": "large" }, "mainTrait": "finesse", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Household_Friend_iDmOtiHJJ80AIAVT.json b/src/packs/beastforms/beastform_Household_Friend_iDmOtiHJJ80AIAVT.json index 80756af0..cfb6aea7 100644 --- a/src/packs/beastforms/beastform_Household_Friend_iDmOtiHJJ80AIAVT.json +++ b/src/packs/beastforms/beastform_Household_Friend_iDmOtiHJJ80AIAVT.json @@ -9,7 +9,8 @@ "tokenRingImg": "icons/creatures/mammals/rabbit-movement-glowing-green.webp", "tokenSize": { "height": null, - "width": null + "width": null, + "size": "tiny" }, "mainTrait": "instinct", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Massive_Behemoth_qjwMzPn33aKZACkv.json b/src/packs/beastforms/beastform_Massive_Behemoth_qjwMzPn33aKZACkv.json index 8e3c0ce5..35715056 100644 --- a/src/packs/beastforms/beastform_Massive_Behemoth_qjwMzPn33aKZACkv.json +++ b/src/packs/beastforms/beastform_Massive_Behemoth_qjwMzPn33aKZACkv.json @@ -9,7 +9,8 @@ "tokenRingImg": "icons/creatures/mammals/beast-horned-scaled-glowing-orange.webp", "tokenSize": { "height": null, - "width": null + "width": null, + "size": "huge" }, "mainTrait": "strength", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Mighty_Lizard_94tvcC3D5Kp4lzuN.json b/src/packs/beastforms/beastform_Mighty_Lizard_94tvcC3D5Kp4lzuN.json index 4dcb396a..390bf054 100644 --- a/src/packs/beastforms/beastform_Mighty_Lizard_94tvcC3D5Kp4lzuN.json +++ b/src/packs/beastforms/beastform_Mighty_Lizard_94tvcC3D5Kp4lzuN.json @@ -9,7 +9,8 @@ "tokenRingImg": "icons/creatures/reptiles/lizard-iguana-green.webp", "tokenSize": { "height": null, - "width": null + "width": null, + "size": "large" }, "mainTrait": "instinct", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Mighty_Strider_zRLjqKx4Rn2TjivL.json b/src/packs/beastforms/beastform_Mighty_Strider_zRLjqKx4Rn2TjivL.json index f77c7b5d..adb9627b 100644 --- a/src/packs/beastforms/beastform_Mighty_Strider_zRLjqKx4Rn2TjivL.json +++ b/src/packs/beastforms/beastform_Mighty_Strider_zRLjqKx4Rn2TjivL.json @@ -9,7 +9,8 @@ "tokenRingImg": "icons/environment/creatures/horse-tan.webp", "tokenSize": { "height": null, - "width": null + "width": null, + "size": "large" }, "mainTrait": "agility", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Mythic_Aerial_Hunter_jV6EuEacyQlHW4SN.json b/src/packs/beastforms/beastform_Mythic_Aerial_Hunter_jV6EuEacyQlHW4SN.json index 34898d53..dc373c27 100644 --- a/src/packs/beastforms/beastform_Mythic_Aerial_Hunter_jV6EuEacyQlHW4SN.json +++ b/src/packs/beastforms/beastform_Mythic_Aerial_Hunter_jV6EuEacyQlHW4SN.json @@ -9,7 +9,8 @@ "tokenRingImg": "icons/creatures/reptiles/dragon-winged-blue.webp", "tokenSize": { "height": null, - "width": null + "width": null, + "size": "gargantuan" }, "mainTrait": "finesse", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Nimble_Grazer_CItO8yX6amQaqyk7.json b/src/packs/beastforms/beastform_Nimble_Grazer_CItO8yX6amQaqyk7.json index 08d83325..183ad150 100644 --- a/src/packs/beastforms/beastform_Nimble_Grazer_CItO8yX6amQaqyk7.json +++ b/src/packs/beastforms/beastform_Nimble_Grazer_CItO8yX6amQaqyk7.json @@ -9,7 +9,8 @@ "tokenRingImg": "icons/creatures/mammals/deer-antlers-glowing-blue.webp", "tokenSize": { "height": null, - "width": null + "width": null, + "size": "medium" }, "mainTrait": "agility", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Pack_Predator_YLisKYYhAGca50WM.json b/src/packs/beastforms/beastform_Pack_Predator_YLisKYYhAGca50WM.json index 58d28e2d..834493bb 100644 --- a/src/packs/beastforms/beastform_Pack_Predator_YLisKYYhAGca50WM.json +++ b/src/packs/beastforms/beastform_Pack_Predator_YLisKYYhAGca50WM.json @@ -9,7 +9,8 @@ "tokenRingImg": "icons/creatures/mammals/wolf-howl-moon-forest-blue.webp", "tokenSize": { "height": null, - "width": null + "width": null, + "size": "medium" }, "mainTrait": "strength", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Pouncing_Predator_33oFSZ1PwFqInHPe.json b/src/packs/beastforms/beastform_Pouncing_Predator_33oFSZ1PwFqInHPe.json index 5df71fd3..d172d8f3 100644 --- a/src/packs/beastforms/beastform_Pouncing_Predator_33oFSZ1PwFqInHPe.json +++ b/src/packs/beastforms/beastform_Pouncing_Predator_33oFSZ1PwFqInHPe.json @@ -9,7 +9,8 @@ "tokenRingImg": "icons/creatures/abilities/cougar-roar-rush-orange.webp", "tokenSize": { "height": null, - "width": null + "width": null, + "size": "medium" }, "mainTrait": "instinct", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Powerful_Beast_m8BVTuJI1wCvzTcf.json b/src/packs/beastforms/beastform_Powerful_Beast_m8BVTuJI1wCvzTcf.json index bbbc9a66..7fa832e6 100644 --- a/src/packs/beastforms/beastform_Powerful_Beast_m8BVTuJI1wCvzTcf.json +++ b/src/packs/beastforms/beastform_Powerful_Beast_m8BVTuJI1wCvzTcf.json @@ -9,7 +9,8 @@ "tokenRingImg": "icons/creatures/abilities/bear-roar-bite-brown-green.webp", "tokenSize": { "height": null, - "width": null + "width": null, + "size": "large" }, "mainTrait": "strength", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Stalking_Arachnid_A4TVRY0D5r9EiVwA.json b/src/packs/beastforms/beastform_Stalking_Arachnid_A4TVRY0D5r9EiVwA.json index dc1ba68f..16520a9c 100644 --- a/src/packs/beastforms/beastform_Stalking_Arachnid_A4TVRY0D5r9EiVwA.json +++ b/src/packs/beastforms/beastform_Stalking_Arachnid_A4TVRY0D5r9EiVwA.json @@ -9,7 +9,8 @@ "tokenRingImg": "icons/creatures/invertebrates/spider-mandibles-brown.webp", "tokenSize": { "height": null, - "width": null + "width": null, + "size": "tiny" }, "mainTrait": "finesse", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Striking_Serpent_1XrZWGDttBAAUxR1.json b/src/packs/beastforms/beastform_Striking_Serpent_1XrZWGDttBAAUxR1.json index 1cdf3fa3..f78500c9 100644 --- a/src/packs/beastforms/beastform_Striking_Serpent_1XrZWGDttBAAUxR1.json +++ b/src/packs/beastforms/beastform_Striking_Serpent_1XrZWGDttBAAUxR1.json @@ -9,7 +9,8 @@ "tokenRingImg": "icons/creatures/reptiles/serpent-horned-green.webp", "tokenSize": { "height": null, - "width": null + "width": null, + "size": "small" }, "mainTrait": "finesse", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Terrible_Lizard_5BABxRe2XVrYTj8N.json b/src/packs/beastforms/beastform_Terrible_Lizard_5BABxRe2XVrYTj8N.json index d15fa0d9..49818b74 100644 --- a/src/packs/beastforms/beastform_Terrible_Lizard_5BABxRe2XVrYTj8N.json +++ b/src/packs/beastforms/beastform_Terrible_Lizard_5BABxRe2XVrYTj8N.json @@ -9,7 +9,8 @@ "tokenRingImg": "icons/creatures/abilities/dragon-breath-purple.webp", "tokenSize": { "height": null, - "width": null + "width": null, + "size": "gargantuan" }, "mainTrait": "strength", "advantageOn": { diff --git a/src/packs/beastforms/beastform_Winged_Beast_mZ4Wlqtss2FlNNvL.json b/src/packs/beastforms/beastform_Winged_Beast_mZ4Wlqtss2FlNNvL.json index cc78e6a4..4ca44471 100644 --- a/src/packs/beastforms/beastform_Winged_Beast_mZ4Wlqtss2FlNNvL.json +++ b/src/packs/beastforms/beastform_Winged_Beast_mZ4Wlqtss2FlNNvL.json @@ -9,7 +9,8 @@ "tokenRingImg": "icons/creatures/birds/raptor-owl-flying-moon.webp", "tokenSize": { "height": null, - "width": null + "width": null, + "size": "tiny" }, "mainTrait": "finesse", "advantageOn": { diff --git a/styles/less/sheets/actors/adversary/header.less b/styles/less/sheets/actors/adversary/header.less index aa3e6e83..8bd3fcee 100644 --- a/styles/less/sheets/actors/adversary/header.less +++ b/styles/less/sheets/actors/adversary/header.less @@ -40,6 +40,7 @@ .tag { display: flex; flex-direction: row; + gap: 4px; justify-content: center; align-items: center; padding: 3px 5px; diff --git a/styles/less/sheets/items/beastform.less b/styles/less/sheets/items/beastform.less index 162c4925..100b024a 100644 --- a/styles/less/sheets/items/beastform.less +++ b/styles/less/sheets/items/beastform.less @@ -5,5 +5,8 @@ flex-direction: column; margin-top: 10px; } + .hint { + font-style: italic; + } } } diff --git a/styles/less/ui/settings/settings.less b/styles/less/ui/settings/settings.less index 49c9fc7c..34f17d53 100644 --- a/styles/less/ui/settings/settings.less +++ b/styles/less/ui/settings/settings.less @@ -16,6 +16,12 @@ } } + &.three-columns { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + gap: 2px; + } + &.six-columns { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr; diff --git a/templates/settings/homebrew-settings/settings.hbs b/templates/settings/homebrew-settings/settings.hbs index e7340323..5da053f4 100644 --- a/templates/settings/homebrew-settings/settings.hbs +++ b/templates/settings/homebrew-settings/settings.hbs @@ -25,6 +25,20 @@ {{/each}} +
+ + {{localize "Token Sizes"}} + + + + {{formGroup settingFields.schema.fields.tokenSizes.fields.tiny value=settingFields._source.tokenSizes.tiny localize=true}} + {{formGroup settingFields.schema.fields.tokenSizes.fields.small value=settingFields._source.tokenSizes.small localize=true}} + {{formGroup settingFields.schema.fields.tokenSizes.fields.medium value=settingFields._source.tokenSizes.medium localize=true}} + {{formGroup settingFields.schema.fields.tokenSizes.fields.large value=settingFields._source.tokenSizes.large localize=true}} + {{formGroup settingFields.schema.fields.tokenSizes.fields.huge value=settingFields._source.tokenSizes.huge localize=true}} + {{formGroup settingFields.schema.fields.tokenSizes.fields.gargantuan value=settingFields._source.tokenSizes.gargantuan localize=true}} +
+
{{localize "DAGGERHEART.SETTINGS.Homebrew.currency.title"}} diff --git a/templates/sheets-settings/adversary-settings/details.hbs b/templates/sheets-settings/adversary-settings/details.hbs index 194c7f0c..0eb8da30 100644 --- a/templates/sheets-settings/adversary-settings/details.hbs +++ b/templates/sheets-settings/adversary-settings/details.hbs @@ -13,6 +13,7 @@ {{/if}} {{formGroup systemFields.difficulty value=document._source.system.difficulty localize=true}}
+ {{formGroup systemFields.size value=document._source.system.size label=(localize "DAGGERHEART.GENERAL.tokenSize") localize=true}} {{formField systemFields.description value=document._source.system.description label=(localize "DAGGERHEART.ACTORS.Adversary.FIELDS.description.label")}} {{formField systemFields.motivesAndTactics value=document._source.system.motivesAndTactics label=(localize "DAGGERHEART.ACTORS.Adversary.FIELDS.motivesAndTactics.label")}} diff --git a/templates/sheets-settings/token-config/appearance.hbs b/templates/sheets-settings/token-config/appearance.hbs new file mode 100644 index 00000000..0f6019ba --- /dev/null +++ b/templates/sheets-settings/token-config/appearance.hbs @@ -0,0 +1,82 @@ +
+ {{formGroup fields.texture.fields.src value=source.texture.src rootId=rootId}} + {{#if randomImgEnabled}} + {{formGroup fields.randomImg value=source.randomImg classes="slim" rootId=rootId}} + {{else if hasAlternates}} +
+ + +
+ {{/if}} + + +
+ +
+ + {{formInput fields.width value=source.width id=(concat rootId "-width") disabled=actorSizeUsed}} + + {{formInput fields.height value=source.height id=(concat rootId "-height") disabled=actorSizeUsed}} +
+
+ + {{#if shapes}} + {{formGroup fields.shape value=source.shape choices=shapes classes="slim" rootId=rootId}} + {{/if}} + {{formGroup fields.texture.fields.fit value=source.texture.fit choices=textureFitModes classes="slim" rootId=rootId}} + +
+ +
+ + {{formInput fields.texture.fields.anchorX value=source.texture.anchorX id=(concat rootId "-anchorX") + placeholder="0.5"}} + + {{formInput fields.texture.fields.anchorY value=source.texture.anchorY id=(concat rootId "-anchorY") + placeholder="0.5"}} +
+

{{localize "TOKEN.AnchorHint"}}

+
+ +
+ +
+ +
+
+ +
+ +
+ + +
+
+ + {{formGroup fields.texture.fields.tint value=source.texture.tint placeholder="#ffffff" rootId=rootId}} + {{formGroup fields.alpha value=source.alpha step=0.05 rootId=rootId}} + {{formGroup fields.lockRotation value=source.lockRotation rootId=rootId}} + +
+ {{localize "TOKEN.RING.SHEET.legend"}} + {{formGroup fields.ring.fields.enabled value=source.ring.enabled rootId=rootId}} + {{formGroup fields.ring.fields.colors.fields.ring value=source.ring.colors.ring rootId=rootId}} + {{formGroup fields.ring.fields.colors.fields.background value=source.ring.colors.background rootId=rootId}} + {{formGroup fields.ring.fields.subject.fields.texture value=source.ring.subject.texture rootId=rootId}} + {{formGroup fields.ring.fields.subject.fields.scale value=source.ring.subject.scale max=3 step=0.02 rootId=rootId}} + {{formGroup fields.ring.fields.effects value=source.ring.effects input=ringEffectsInput stacked=true rootId=rootId}} +
+
diff --git a/templates/sheets/actors/adversary/header.hbs b/templates/sheets/actors/adversary/header.hbs index 42a673d5..5bdfa421 100644 --- a/templates/sheets/actors/adversary/header.hbs +++ b/templates/sheets/actors/adversary/header.hbs @@ -18,6 +18,14 @@ /{{localize "DAGGERHEART.GENERAL.HitPoints.short"}}
{{/if}} +
+ + {{#unless (eq source.system.size 'custom')}} + {{localize (concat "DAGGERHEART.CONFIG.TokenSize." source.system.size)}} + {{else}} + {{source.prototypeToken.width}}x{{source.prototypeToken.height}} + {{/unless}} +
diff --git a/templates/sheets/items/beastform/settings.hbs b/templates/sheets/items/beastform/settings.hbs index c0ea3965..844b9d61 100644 --- a/templates/sheets/items/beastform/settings.hbs +++ b/templates/sheets/items/beastform/settings.hbs @@ -20,18 +20,35 @@ {{/unless}} {{/if}} -
+
{{localize "DAGGERHEART.ITEMS.Beastform.tokenTitle"}} + {{#unless (eq source.system.beastformType 'evolved')}} +
+ {{formGroup systemFields.tokenImg value=source.system.tokenImg localize=true}} +
-
- {{formGroup systemFields.tokenImg value=source.system.tokenImg localize=true}} -
- -
- {{formGroup systemFields.tokenRingImg value=source.system.tokenRingImg localize=true}} -
- - {{formGroup systemFields.tokenSize.fields.height value=source.system.tokenSize.height localize=true placeholder=(localize "DAGGERHEART.ITEMS.Beastform.FIELDS.tokenSize.placeholder") }} - {{formGroup systemFields.tokenSize.fields.width value=source.system.tokenSize.width localize=true placeholder=(localize "DAGGERHEART.ITEMS.Beastform.FIELDS.tokenSize.placeholder")}} +
+ {{formGroup systemFields.tokenRingImg value=source.system.tokenRingImg localize=true}} +
+
+ {{formGroup systemFields.tokenSize.fields.size value=source.system.tokenSize.size label=(localize "DAGGERHEART.GENERAL.tokenSize") localize=true }} + {{formGroup + systemFields.tokenSize.fields.height + value=source.system.tokenSize.height + localize=true + placeholder=(localize (ifThen dimensionsDisabled "DAGGERHEART.ITEMS.Beastform.FIELDS.tokenSize.disabledPlaceholder" "DAGGERHEART.ITEMS.Beastform.FIELDS.tokenSize.placeholder")) + disabled=dimensionsDisabled + }} + {{formGroup + systemFields.tokenSize.fields.width + value=source.system.tokenSize.width + localize=true + placeholder=(localize (ifThen dimensionsDisabled "DAGGERHEART.ITEMS.Beastform.FIELDS.tokenSize.disabledPlaceholder" "DAGGERHEART.ITEMS.Beastform.FIELDS.tokenSize.placeholder")) + disabled=dimensionsDisabled + }} +
+ {{else}} + {{localize "DAGGERHEART.ITEMS.Beastform.evolvedTokenHint"}} + {{/unless}}
\ No newline at end of file From 790a5b4938232241e1d4f4b46b845d14e81ad74a Mon Sep 17 00:00:00 2001 From: Nikhil Nagarajan Date: Mon, 22 Dec 2025 10:59:22 -0500 Subject: [PATCH 22/33] Adding in more details in authors - Ikraik (#1457) --- system.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/system.json b/system.json index 14a4efc8..b9aada8c 100644 --- a/system.json +++ b/system.json @@ -20,6 +20,9 @@ }, { "name": "Ikraik" + "url": "https://github.com/ikraik", + "email": "ikraik0.0gaming@gmail.com", + "discord": "ikraik" }, { "name": "IrkTheImp" From f0531d3587291e2bfffba8ccdabd7b2435c61d7f Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Mon, 22 Dec 2025 17:03:49 +0100 Subject: [PATCH 23/33] [Fix] Sheet Labels (#1456) * Added human readable sheet labels to all sheets * Prefixed sheet labels with 'Default DH' * :carpentry_saw: --- daggerheart.mjs | 102 ++++++++++++++++++++++++++++++++++++++---------- lang/en.json | 2 + 2 files changed, 84 insertions(+), 20 deletions(-) diff --git a/daggerheart.mjs b/daggerheart.mjs index 08a1be02..f1d8c67a 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -90,34 +90,94 @@ Hooks.once('init', () => { makeDefault: true }); + const sheetLabel = typePath => () => + game.i18n.format('DAGGERHEART.GENERAL.typeSheet', { + type: game.i18n.localize(typePath) + }); + const { Items, Actors } = foundry.documents.collections; Items.unregisterSheet('core', foundry.applications.sheets.ItemSheetV2); - Items.registerSheet(SYSTEM.id, applications.sheets.items.Ancestry, { types: ['ancestry'], makeDefault: true }); - Items.registerSheet(SYSTEM.id, applications.sheets.items.Community, { types: ['community'], makeDefault: true }); - Items.registerSheet(SYSTEM.id, applications.sheets.items.Class, { types: ['class'], makeDefault: true }); - Items.registerSheet(SYSTEM.id, applications.sheets.items.Subclass, { types: ['subclass'], makeDefault: true }); - Items.registerSheet(SYSTEM.id, applications.sheets.items.Feature, { types: ['feature'], makeDefault: true }); - Items.registerSheet(SYSTEM.id, applications.sheets.items.DomainCard, { types: ['domainCard'], makeDefault: true }); + Items.registerSheet(SYSTEM.id, applications.sheets.items.Ancestry, { + types: ['ancestry'], + makeDefault: true, + label: sheetLabel('TYPES.Item.ancestry') + }); + Items.registerSheet(SYSTEM.id, applications.sheets.items.Community, { + types: ['community'], + makeDefault: true, + label: sheetLabel('TYPES.Item.community') + }); + Items.registerSheet(SYSTEM.id, applications.sheets.items.Class, { + types: ['class'], + makeDefault: true, + label: sheetLabel('TYPES.Item.class') + }); + Items.registerSheet(SYSTEM.id, applications.sheets.items.Subclass, { + types: ['subclass'], + makeDefault: true, + label: sheetLabel('TYPES.Item.subclass') + }); + Items.registerSheet(SYSTEM.id, applications.sheets.items.Feature, { + types: ['feature'], + makeDefault: true, + label: sheetLabel('TYPES.Item.feature') + }); + Items.registerSheet(SYSTEM.id, applications.sheets.items.DomainCard, { + types: ['domainCard'], + makeDefault: true, + label: sheetLabel('TYPES.Item.domainCard') + }); Items.registerSheet(SYSTEM.id, applications.sheets.items.Loot, { types: ['loot'], - makeDefault: true + makeDefault: true, + label: sheetLabel('TYPES.Item.loot') + }); + Items.registerSheet(SYSTEM.id, applications.sheets.items.Consumable, { + types: ['consumable'], + makeDefault: true, + label: sheetLabel('TYPES.Item.consumable') + }); + Items.registerSheet(SYSTEM.id, applications.sheets.items.Weapon, { + types: ['weapon'], + makeDefault: true, + label: sheetLabel('TYPES.Item.weapon') + }); + Items.registerSheet(SYSTEM.id, applications.sheets.items.Armor, { + types: ['armor'], + makeDefault: true, + label: sheetLabel('TYPES.Item.armor') + }); + Items.registerSheet(SYSTEM.id, applications.sheets.items.Beastform, { + types: ['beastform'], + makeDefault: true, + label: sheetLabel('TYPES.Item.beastform') }); - Items.registerSheet(SYSTEM.id, applications.sheets.items.Consumable, { types: ['consumable'], makeDefault: true }); - Items.registerSheet(SYSTEM.id, applications.sheets.items.Weapon, { types: ['weapon'], makeDefault: true }); - Items.registerSheet(SYSTEM.id, applications.sheets.items.Armor, { types: ['armor'], makeDefault: true }); - Items.registerSheet(SYSTEM.id, applications.sheets.items.Beastform, { types: ['beastform'], makeDefault: true }); Actors.unregisterSheet('core', foundry.applications.sheets.ActorSheetV2); - Actors.registerSheet(SYSTEM.id, applications.sheets.actors.Character, { types: ['character'], makeDefault: true }); - Actors.registerSheet(SYSTEM.id, applications.sheets.actors.Companion, { types: ['companion'], makeDefault: true }); - Actors.registerSheet(SYSTEM.id, applications.sheets.actors.Adversary, { types: ['adversary'], makeDefault: true }); + Actors.registerSheet(SYSTEM.id, applications.sheets.actors.Character, { + types: ['character'], + makeDefault: true, + label: sheetLabel('TYPES.Actor.character') + }); + Actors.registerSheet(SYSTEM.id, applications.sheets.actors.Companion, { + types: ['companion'], + makeDefault: true, + label: sheetLabel('TYPES.Actor.companion') + }); + Actors.registerSheet(SYSTEM.id, applications.sheets.actors.Adversary, { + types: ['adversary'], + makeDefault: true, + label: sheetLabel('TYPES.Actor.adversary') + }); Actors.registerSheet(SYSTEM.id, applications.sheets.actors.Environment, { types: ['environment'], - makeDefault: true + makeDefault: true, + label: sheetLabel('TYPES.Actor.environment') }); Actors.registerSheet(SYSTEM.id, applications.sheets.actors.Party, { types: ['party'], - makeDefault: true + makeDefault: true, + label: sheetLabel('TYPES.Actor.party') }); DocumentSheetConfig.unregisterSheet( @@ -130,7 +190,8 @@ Hooks.once('init', () => { SYSTEM.id, applications.sheetConfigs.ActiveEffectConfig, { - makeDefault: true + makeDefault: true, + label: sheetLabel('DOCUMENT.ActiveEffect') } ); @@ -139,9 +200,10 @@ Hooks.once('init', () => { // Make Compendium Dialog resizable foundry.applications.sidebar.apps.Compendium.DEFAULT_OPTIONS.window.resizable = true; + DocumentSheetConfig.unregisterSheet(foundry.documents.Scene, 'core', foundry.applications.sheets.SceneConfig); DocumentSheetConfig.registerSheet(foundry.documents.Scene, SYSTEM.id, applications.scene.DhSceneConfigSettings, { makeDefault: true, - label: 'Daggerheart' + label: sheetLabel('DOCUMENT.Scene') }); settingsRegistration.registerDHSettings(); @@ -248,7 +310,7 @@ Hooks.on('chatMessage', (_, message) => { } }); -const updateActorsRangeDependentEffects = async (token) => { +const updateActorsRangeDependentEffects = async token => { const rangeMeasurement = game.settings.get( CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules @@ -283,7 +345,7 @@ const updateActorsRangeDependentEffects = async (token) => { await effect.update({ disabled: !enabledEffect }); } -} +}; const updateAllRangeDependentEffects = async () => { const effectsAutomation = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).effects; diff --git a/lang/en.json b/lang/en.json index 498a45cb..6e9a2489 100755 --- a/lang/en.json +++ b/lang/en.json @@ -36,6 +36,7 @@ }, "DAGGERHEART": { + "CharacterSheet": "Character Sheet", "ACTIONS": { "TYPES": { "attack": { @@ -2184,6 +2185,7 @@ "traitModifier": "Trait Modifier", "true": "True", "type": "Type", + "typeSheet": "System {type} Sheet", "unarmed": "Unarmed", "unarmedAttack": "Unarmed Attack", "unarmored": "Unarmored", From 51eadc499f9f46d18ea8d523f5d315658fdef4eb Mon Sep 17 00:00:00 2001 From: WBHarry Date: Mon, 22 Dec 2025 17:06:43 +0100 Subject: [PATCH 24/33] Corrected system.json syntax --- system.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system.json b/system.json index b9aada8c..a58f23db 100644 --- a/system.json +++ b/system.json @@ -19,7 +19,7 @@ "discord": "cptn_cosmo" }, { - "name": "Ikraik" + "name": "Ikraik", "url": "https://github.com/ikraik", "email": "ikraik0.0gaming@gmail.com", "discord": "ikraik" From a168d8de652622094aa8cde8ca1d31b7ff0092c0 Mon Sep 17 00:00:00 2001 From: Nick Salyzyn Date: Tue, 23 Dec 2025 06:14:55 -0700 Subject: [PATCH 25/33] [PR] Changing the drag targets in the inventory item v2 template (#1443) * Adding styles to make the text div take up the full area of the inventory items * Moving the draggable spots to internal divs and images * For better visuals in dragDrop, always make the drag image the first image selected * Fixing the dragDrop behavior on the sidebar, which still uses the classic layout * Fixing other uses of dragDrop to handle the layout change * Moving the draggable attribute to the parent img-portrait from img directly * Switching to the less pretty version of the drag drop in case of currency problems * Reverting how the dragSelector DEFAULT_OPTION is set and only modifying a few * Removing extra space in styles/less/global/inventory-item.less Co-authored-by: Carlos Fernandez * Fixing up the character sheet to once again allow selecting the text areas --------- Co-authored-by: Carlos Fernandez --- module/applications/sheets/actors/adversary.mjs | 2 +- module/applications/sheets/actors/character.mjs | 11 ++++++++++- module/applications/sheets/actors/party.mjs | 2 +- module/applications/sheets/api/base-actor.mjs | 2 +- styles/less/global/inventory-item.less | 3 ++- .../sheets/global/partials/inventory-item-V2.hbs | 6 +++--- 6 files changed, 18 insertions(+), 8 deletions(-) diff --git a/module/applications/sheets/actors/adversary.mjs b/module/applications/sheets/actors/adversary.mjs index 6b6354ef..345f6fed 100644 --- a/module/applications/sheets/actors/adversary.mjs +++ b/module/applications/sheets/actors/adversary.mjs @@ -26,7 +26,7 @@ export default class AdversarySheet extends DHBaseActorSheet { } ] }, - dragDrop: [{ dragSelector: '[data-item-id][draggable="true"]', dropSelector: null }] + dragDrop: [{ dragSelector: '[data-item-id]', dropSelector: null }] }; static PARTS = { diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index 51df2fc9..66ed6315 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -46,7 +46,7 @@ export default class CharacterSheet extends DHBaseActorSheet { }, dragDrop: [ { - dragSelector: '[data-item-id][draggable="true"]', + dragSelector: '[data-item-id][draggable="true"], [data-item-id] [draggable="true"]', dropSelector: null } ], @@ -868,6 +868,15 @@ export default class CharacterSheet extends DHBaseActorSheet { }); } + /** @inheritdoc */ + async _onDragStart(event) { + const inventoryItem = event.currentTarget.closest('.inventory-item'); + if (inventoryItem) { + event.dataTransfer.setDragImage(inventoryItem.querySelector('img'), 60, 0); + } + super._onDragStart(event); + } + async _onDropItem(event, item) { if (this.document.uuid === item.parent?.uuid) { return super._onDropItem(event, item); diff --git a/module/applications/sheets/actors/party.mjs b/module/applications/sheets/actors/party.mjs index 5c448b49..d78519cb 100644 --- a/module/applications/sheets/actors/party.mjs +++ b/module/applications/sheets/actors/party.mjs @@ -40,7 +40,7 @@ export default class Party extends DHBaseActorSheet { selectRefreshable: DaggerheartMenu.selectRefreshable, refreshActors: DaggerheartMenu.refreshActors }, - dragDrop: [{ dragSelector: '[data-item-id][draggable="true"]', dropSelector: null }] + dragDrop: [{ dragSelector: '[data-item-id]', dropSelector: null }] }; /**@override */ diff --git a/module/applications/sheets/api/base-actor.mjs b/module/applications/sheets/api/base-actor.mjs index 5d054949..85ecd616 100644 --- a/module/applications/sheets/api/base-actor.mjs +++ b/module/applications/sheets/api/base-actor.mjs @@ -374,4 +374,4 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { super._onDragStart(event); } -} \ No newline at end of file +} diff --git a/styles/less/global/inventory-item.less b/styles/less/global/inventory-item.less index d936358b..c8a29795 100644 --- a/styles/less/global/inventory-item.less +++ b/styles/less/global/inventory-item.less @@ -129,7 +129,8 @@ .item-label { flex: 1; - align-self: center; + align-self: stretch; + align-content: center; .item-name { font-size: var(--font-size-14); diff --git a/templates/sheets/global/partials/inventory-item-V2.hbs b/templates/sheets/global/partials/inventory-item-V2.hbs index 91f8d581..dbacd1e4 100644 --- a/templates/sheets/global/partials/inventory-item-V2.hbs +++ b/templates/sheets/global/partials/inventory-item-V2.hbs @@ -18,12 +18,12 @@ Parameters: --}}
  • + data-action-id="{{item.id}}" {{/if}} data-item-uuid="{{item.uuid}}" data-type="{{type}}" data-no-compendium-edit="{{noCompendiumEdit}}">
    {{!-- Image --}}
    + data-tooltip="#attack#{{item.actor.uuid}}" {{else}} data-tooltip="#item#{{item.uuid}}" {{/if}} {{/unless}} draggable="true"> {{#if (or item.system.actionsList.size item.system.actionsList.length item.actionType)}} {{#if @root.isNPC}} @@ -35,7 +35,7 @@ Parameters:
    {{!-- Name & Tags --}} -
    +
    {{!-- Item Name --}} {{localize item.name}} {{#unless (or noExtensible (not item.system.description))}}{{/unless}} From 0f5f866b2225ec3bf5e83fe016ac3c989e257999 Mon Sep 17 00:00:00 2001 From: Nick Salyzyn Date: Tue, 23 Dec 2025 06:17:50 -0700 Subject: [PATCH 26/33] [PR] Adding max attributes to the action list and missing localization for them (#1446) * Adding max attributes and missing localization for them * Making sure the adversary settings page has only 'max' in the fieldset --- module/applications/sheets-configs/activeEffectConfig.mjs | 3 +++ module/data/actor/adversary.mjs | 6 ++---- templates/sheets-settings/adversary-settings/details.hbs | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/module/applications/sheets-configs/activeEffectConfig.mjs b/module/applications/sheets-configs/activeEffectConfig.mjs index 468aba5c..d7b1b536 100644 --- a/module/applications/sheets-configs/activeEffectConfig.mjs +++ b/module/applications/sheets-configs/activeEffectConfig.mjs @@ -9,6 +9,9 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac if (!ignoredActorKeys.includes(key)) { const model = game.system.api.models.actors[key]; const attributes = CONFIG.Token.documentClass.getTrackedAttributes(model); + // As per DHToken._getTrackedAttributesFromSchema, attributes.bar have a max version as well. + const maxAttributes = attributes.bar.map(x => [...x, 'max']); + attributes.value.push(...maxAttributes); const group = game.i18n.localize(model.metadata.label); const choices = CONFIG.Token.documentClass .getTrackedAttributeChoices(attributes, model) diff --git a/module/data/actor/adversary.mjs b/module/data/actor/adversary.mjs index a7b66d4d..32f5c979 100644 --- a/module/data/actor/adversary.mjs +++ b/module/data/actor/adversary.mjs @@ -60,15 +60,13 @@ export default class DhpAdversary extends BaseDataActor { 0, 0, 'DAGGERHEART.GENERAL.HitPoints.plural', - true, - game.i18n.localize('DAGGERHEART.GENERAL.max') + true ), stress: resourceField( 0, 0, 'DAGGERHEART.GENERAL.stress', - true, - game.i18n.localize('DAGGERHEART.GENERAL.max') + true ) }), rules: new fields.SchemaField({ diff --git a/templates/sheets-settings/adversary-settings/details.hbs b/templates/sheets-settings/adversary-settings/details.hbs index 0eb8da30..065ebe74 100644 --- a/templates/sheets-settings/adversary-settings/details.hbs +++ b/templates/sheets-settings/adversary-settings/details.hbs @@ -22,12 +22,12 @@
    {{localize "DAGGERHEART.GENERAL.HitPoints.plural"}} {{formGroup systemFields.resources.fields.hitPoints.fields.value value=document._source.system.resources.hitPoints.value label=(localize "DAGGERHEART.ACTORS.Adversary.FIELDS.resources.hitPoints.value.label")}} - {{formGroup systemFields.resources.fields.hitPoints.fields.max value=document._source.system.resources.hitPoints.max}} + {{formGroup systemFields.resources.fields.hitPoints.fields.max value=document._source.system.resources.hitPoints.max label=(localize "DAGGERHEART.ACTORS.Adversary.FIELDS.resources.hitPoints.max.label")}}
    {{localize "DAGGERHEART.GENERAL.stress"}} {{formGroup systemFields.resources.fields.stress.fields.value value=document._source.system.resources.stress.value label=(localize "DAGGERHEART.ACTORS.Adversary.FIELDS.resources.stress.value.label")}} - {{formGroup systemFields.resources.fields.stress.fields.max value=document._source.system.resources.stress.max}} + {{formGroup systemFields.resources.fields.stress.fields.max value=document._source.system.resources.stress.max label=(localize "DAGGERHEART.ACTORS.Adversary.FIELDS.resources.stress.max.label")}}
    From 1b7893324aa2e85ce0f70cec5f8418e102e21f83 Mon Sep 17 00:00:00 2001 From: Murilo Brito <91566541+moliloo@users.noreply.github.com> Date: Tue, 23 Dec 2025 19:59:23 -0300 Subject: [PATCH 27/33] bugfix: fix chat styles breaking in stream mode (#1467) --- styles/less/global/chat.less | 1 + styles/less/ui/chat/chat.less | 1 + 2 files changed, 2 insertions(+) diff --git a/styles/less/global/chat.less b/styles/less/global/chat.less index 3f83294a..69ee369a 100644 --- a/styles/less/global/chat.less +++ b/styles/less/global/chat.less @@ -25,6 +25,7 @@ padding: 8px; } +.vtt.stream.system-daggerheart .chat-sidebar, .daggerheart.chat-sidebar, #chat-notifications { .chat-log { diff --git a/styles/less/ui/chat/chat.less b/styles/less/ui/chat/chat.less index 828e2774..6f0e5e85 100644 --- a/styles/less/ui/chat/chat.less +++ b/styles/less/ui/chat/chat.less @@ -152,6 +152,7 @@ } } +.vtt.stream.system-daggerheart .chat-sidebar, .daggerheart, #chat-notifications { .chat-message { From 7e2b144bf437c73ab5c68bfa41480250db9ce28b Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Wed, 24 Dec 2025 00:11:01 +0100 Subject: [PATCH 28/33] Fixed so that the reaction rolls from chat messages work with diceSoNice (#1465) --- module/data/fields/action/saveField.mjs | 32 ++++++++++--------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/module/data/fields/action/saveField.mjs b/module/data/fields/action/saveField.mjs index 473286b1..c9030036 100644 --- a/module/data/fields/action/saveField.mjs +++ b/module/data/fields/action/saveField.mjs @@ -124,29 +124,21 @@ export default class SaveField extends fields.SchemaField { */ static async updateSaveMessage(result, message, targetId) { if (!result) return; - const updateMsg = async function (message, targetId, result) { - // setTimeout(async () => { - const chatMessage = ui.chat.collection.get(message._id), - changes = { - flags: { - [game.system.id]: { - reactionRolls: { - [targetId]: { - result: result.roll.total, - success: result.roll.success - } + + const chatMessage = ui.chat.collection.get(message._id), + changes = { + flags: { + [game.system.id]: { + reactionRolls: { + [targetId]: { + result: result.roll.total, + success: result.roll.success } } } - }; - await chatMessage.update(changes); - // }, 100); - }; - if (game.modules.get('dice-so-nice')?.active) - game.dice3d - .waitFor3DAnimationByMessageID(result.message.id ?? result.message._id) - .then(async () => await updateMsg(message, targetId, result)); - else await updateMsg(message, targetId, result); + } + }; + await chatMessage.update(changes); } /** From f184db1f9392e9f98bb75d118707df0b42bcc843 Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Wed, 24 Dec 2025 00:52:57 +0100 Subject: [PATCH 29/33] [Fix] Sheet Sidebar Experience Layout (#1462) * Fixed the layout * Added small line-height to the experience name * Centered --- styles/less/sheets/actors/adversary/sidebar.less | 4 ++++ styles/less/sheets/actors/character/sidebar.less | 7 +++++++ styles/less/sheets/actors/companion/details.less | 4 ++++ templates/sheets/actors/character/sidebar.hbs | 2 +- 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/styles/less/sheets/actors/adversary/sidebar.less b/styles/less/sheets/actors/adversary/sidebar.less index f8537525..4e7535c1 100644 --- a/styles/less/sheets/actors/adversary/sidebar.less +++ b/styles/less/sheets/actors/adversary/sidebar.less @@ -344,15 +344,19 @@ .experience-name { width: 180px; + display: flex; + align-items: center; text-align: start; font-size: var(--font-size-14); color: light-dark(@dark, @beige); + line-height: 1; } } .experience-value { height: 25px; width: 35px; + min-width: 35px; font-size: var(--font-size-14); color: light-dark(@dark, @beige); align-content: center; diff --git a/styles/less/sheets/actors/character/sidebar.less b/styles/less/sheets/actors/character/sidebar.less index e66cba82..04baf2b9 100644 --- a/styles/less/sheets/actors/character/sidebar.less +++ b/styles/less/sheets/actors/character/sidebar.less @@ -592,6 +592,7 @@ .experience-value { height: 25px; width: 35px; + min-width: 35px; font-size: var(--font-size-14); color: light-dark(@dark, @beige); align-content: center; @@ -599,6 +600,12 @@ margin-right: 5px; } + .experience-name { + display: flex; + align-items: center; + line-height: 1; + } + .controls { margin-left: auto; } diff --git a/styles/less/sheets/actors/companion/details.less b/styles/less/sheets/actors/companion/details.less index cbdc25e6..2e43cac4 100644 --- a/styles/less/sheets/actors/companion/details.less +++ b/styles/less/sheets/actors/companion/details.less @@ -57,6 +57,9 @@ .experience-name { width: 180px; + display: flex; + align-items: center; + line-height: 1; text-align: start; font-size: var(--font-size-14); color: light-dark(@dark, @beige); @@ -66,6 +69,7 @@ .experience-value { height: 25px; width: 35px; + min-width: 35px; font-size: var(--font-size-14); color: light-dark(@dark, @beige); align-content: center; diff --git a/templates/sheets/actors/character/sidebar.hbs b/templates/sheets/actors/character/sidebar.hbs index 7f470b0a..0db2bf42 100644 --- a/templates/sheets/actors/character/sidebar.hbs +++ b/templates/sheets/actors/character/sidebar.hbs @@ -147,7 +147,7 @@ +{{experience.value}} - {{experience.name}} + {{experience.name}}
    From 0806c2d1ac3c24cad7ed3b3884b21355127822db Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Wed, 24 Dec 2025 01:00:24 +0100 Subject: [PATCH 30/33] [Fix] Levelup New Experience Increase (#1461) * Fixed so you can select a newly gained experience to increase * . * Exchanged forEach with for..of. The future is now --- module/applications/dialogs/d20RollDialog.mjs | 4 ++-- .../applications/levelup/characterLevelup.mjs | 16 ++++++++++++---- module/applications/levelup/levelup.mjs | 18 +++++++++++++++--- module/dice/d20Roll.mjs | 6 +++--- 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/module/applications/dialogs/d20RollDialog.mjs b/module/applications/dialogs/d20RollDialog.mjs index 5ef9e005..d872a1f8 100644 --- a/module/applications/dialogs/d20RollDialog.mjs +++ b/module/applications/dialogs/d20RollDialog.mjs @@ -104,7 +104,7 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio context.roll = this.roll; context.rollType = this.roll?.constructor.name; context.rallyDie = this.roll.rallyChoices; - const experiences = this.config.data?.experiences || {}; + const experiences = this.config.data?.system.experiences || {}; context.experiences = Object.keys(experiences).map(id => ({ id, ...experiences[id] @@ -185,7 +185,7 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio extKey: button.dataset.key, key: this.config?.data?.parent?.isNPC ? 'fear' : 'hope', value: 1, - name: this.config.data?.experiences?.[button.dataset.key]?.name + name: this.config.data?.system.experiences?.[button.dataset.key]?.name } ]; this.render(); diff --git a/module/applications/levelup/characterLevelup.mjs b/module/applications/levelup/characterLevelup.mjs index 623f0308..f7ef2ffa 100644 --- a/module/applications/levelup/characterLevelup.mjs +++ b/module/applications/levelup/characterLevelup.mjs @@ -280,11 +280,19 @@ export default class DhCharacterLevelUp extends LevelUpBase { break; case 'experience': if (!advancement[choiceKey]) advancement[choiceKey] = []; + const allExperiences = { + ...this.actor.system.experiences, + ...Object.values(this.levelup.levels).reduce((acc, level) => { + for (const key of Object.keys(level.achievements.experiences)) { + acc[key] = level.achievements.experiences[key]; + } + + return acc; + }, {}) + }; const data = checkbox.data.map(data => { - const experience = Object.keys(this.actor.system.experiences).find( - x => x === data - ); - return this.actor.system.experiences[experience]?.name ?? ''; + const experience = Object.keys(allExperiences).find(x => x === data); + return allExperiences[experience]?.name ?? ''; }); advancement[choiceKey].push({ data: data, value: checkbox.value }); break; diff --git a/module/applications/levelup/levelup.mjs b/module/applications/levelup/levelup.mjs index c3cc6e81..ba6110cc 100644 --- a/module/applications/levelup/levelup.mjs +++ b/module/applications/levelup/levelup.mjs @@ -357,11 +357,23 @@ export default class DhlevelUp extends HandlebarsApplicationMixin(ApplicationV2) const experienceIncreaseTagify = htmlElement.querySelector('.levelup-experience-increases'); if (experienceIncreaseTagify) { + const allExperiences = { + ...this.actor.system.experiences, + ...Object.values(this.levelup.levels).reduce((acc, level) => { + for (const key of Object.keys(level.achievements.experiences)) { + acc[key] = level.achievements.experiences[key]; + } + + return acc; + }, {}) + }; tagifyElement( experienceIncreaseTagify, - Object.keys(this.actor.system.experiences).reduce((acc, id) => { - const experience = this.actor.system.experiences[id]; - acc.push({ id: id, label: experience.name }); + Object.keys(allExperiences).reduce((acc, id) => { + const experience = allExperiences[id]; + if (experience.name) { + acc.push({ id: id, label: experience.name }); + } return acc; }, []), diff --git a/module/dice/d20Roll.mjs b/module/dice/d20Roll.mjs index 387123c4..0256f281 100644 --- a/module/dice/d20Roll.mjs +++ b/module/dice/d20Roll.mjs @@ -98,10 +98,10 @@ export default class D20Roll extends DHRoll { this.options.roll.modifiers = this.applyBaseBonus(); this.options.experiences?.forEach(m => { - if (this.options.data.experiences?.[m]) + if (this.options.data.system?.experiences?.[m]) this.options.roll.modifiers.push({ - label: this.options.data.experiences[m].name, - value: this.options.data.experiences[m].value + label: this.options.data.system.experiences[m].name, + value: this.options.data.system.experiences[m].value }); }); From f8b003b30483dc024b0316374ce5f66d44fd5671 Mon Sep 17 00:00:00 2001 From: Murilo Brito <91566541+moliloo@users.noreply.github.com> Date: Tue, 23 Dec 2025 21:02:28 -0300 Subject: [PATCH 31/33] [PR][Feature] Items Tooltips Styles (#1445) * feat: add basic tooltip style and style domain card template * feat: change weapon hbs tooltip and increase box-shadow blur * feat: style armor hbs tooltip * feat: style consumable hbs tooltip * feat: style loot hbs tooltip * feat: style feature hbs tooltip * bugfix: prevent style conflicts between tooltips * feat: style action hbs tooltip * feat: style attack hbs tooltip * feat: style effect hbs tooltip * feat: increase tooltip width * style beatform tooltip, fix unnarmed attack location, add outline border when users use midle click * feat: add beige outline and box shadow to tooltips to enhance contrast * bugfix: requested changes * bugfix: fix typo * bugfix: fix tooltip breaking interface position --- lang/en.json | 1 + styles/less/ux/index.less | 2 + styles/less/ux/tooltip/domain-cards.less | 18 ++ styles/less/ux/tooltip/tooltip.less | 288 +++++++++++++++++---- templates/ui/tooltip/action.hbs | 125 ++++----- templates/ui/tooltip/armor.hbs | 31 +-- templates/ui/tooltip/attack.hbs | 51 ++-- templates/ui/tooltip/beastform.hbs | 48 ++-- templates/ui/tooltip/consumable.hbs | 20 +- templates/ui/tooltip/domainCard.hbs | 47 ++-- templates/ui/tooltip/effect.hbs | 8 +- templates/ui/tooltip/feature.hbs | 13 +- templates/ui/tooltip/loot.hbs | 8 +- templates/ui/tooltip/parts/tooltipTags.hbs | 6 +- templates/ui/tooltip/weapon.hbs | 44 ++-- 15 files changed, 469 insertions(+), 241 deletions(-) create mode 100644 styles/less/ux/tooltip/domain-cards.less diff --git a/lang/en.json b/lang/en.json index 6e9a2489..a70698ca 100755 --- a/lang/en.json +++ b/lang/en.json @@ -2820,6 +2820,7 @@ "configureAttribution": "Configure Attribution", "deleteItem": "Delete Item", "immune": "Immune", + "middleClick": "[Middle Click] Keep tooltip view", "tokenSize": "The token size used on the canvas" } } diff --git a/styles/less/ux/index.less b/styles/less/ux/index.less index dd0492da..0bd1b71e 100644 --- a/styles/less/ux/index.less +++ b/styles/less/ux/index.less @@ -1,4 +1,6 @@ @import './tooltip/tooltip.less'; @import './tooltip/battlepoints.less'; @import './tooltip/bordered-tooltip.less'; +@import './tooltip/domain-cards.less'; + @import './autocomplete/autocomplete.less'; diff --git a/styles/less/ux/tooltip/domain-cards.less b/styles/less/ux/tooltip/domain-cards.less new file mode 100644 index 00000000..3ef1d83a --- /dev/null +++ b/styles/less/ux/tooltip/domain-cards.less @@ -0,0 +1,18 @@ +@import '../../utils/colors.less'; +@import '../../utils/fonts.less'; + +.theme-light .daggerheart.dh-style.tooltip { + &.domain-card { + .item-icons-list .item-icon img { + filter: @bright-beige-filter; + } + } +} + +.daggerheart.dh-style.tooltip { + &.domain-card { + .item-icons-list .item-icon img { + filter: @golden-filter !important; + } + } +} diff --git a/styles/less/ux/tooltip/tooltip.less b/styles/less/ux/tooltip/tooltip.less index 2aa1c2c7..d9a83d59 100644 --- a/styles/less/ux/tooltip/tooltip.less +++ b/styles/less/ux/tooltip/tooltip.less @@ -1,5 +1,246 @@ +@import '../../utils/colors.less'; +@import '../../utils/fonts.less'; + +#tooltip:has(div.daggerheart.dh-style.tooltip.card-style), +aside[role='tooltip']:has(div.daggerheart.dh-style.tooltip.card-style) { + padding: 0; + border: none; + border-radius: 10px; + height: max-content; + max-height: 650px; + width: 18rem; + background-image: url('../assets/parchments/dh-parchment-dark.png'); + outline: 1px solid light-dark(@dark-80, @beige-80); + box-shadow: 0 0 25px rgba(0, 0, 0, 0.80); + + .tooltip-title { + font-size: var(--font-size-20); + color: light-dark(@dark-blue, @golden); + font-weight: 700; + margin-bottom: 5px; + } + + .tooltip-subtitle { + margin: 0; + } + + .tooltip-image { + width: 100%; + height: 160px; + object-fit: cover; + mask-image: linear-gradient(180deg, black 88%, transparent 100%); + } + + .tooltip-description { + font-style: inherit; + text-align: inherit; + width: 100%; + padding: 5px 10px; + position: relative; + margin-top: 5px; + + &::before { + content: ''; + background: @golden; + mask-image: linear-gradient(270deg, transparent 0%, black 50%, transparent 100%); + height: 2px; + width: calc(100% - 10px); + } + + &::before { + position: absolute; + top: -5px; + } + } + + .tooltip-tags { + display: flex; + flex-direction: column; + gap: 10px; + width: 100%; + padding: 5px 10px; + position: relative; + padding-top: 10px; + max-height: 150px; + overflow-y: auto; + position: relative; + + scrollbar-width: thin; + scrollbar-color: light-dark(@dark-blue, @golden) transparent; + + &::before { + content: ''; + background: @golden; + mask-image: linear-gradient(270deg, transparent 0%, black 50%, transparent 100%); + height: 2px; + width: calc(100% - 10px); + } + + &::before { + position: absolute; + top: 0px; + } + + .tooltip-tag { + display: flex; + gap: 10px; + flex-direction: column; + + .tooltip-tag-label-container { + display: flex; + align-items: center; + gap: 5px; + + img { + width: 40px; + height: 40px; + border-radius: 3px; + } + } + } + } + + .tags { + display: flex; + gap: 5px 10px; + padding-bottom: 16px; + flex-wrap: wrap; + justify-content: center; + + &.advantages { + width: 100%; + padding: 5px 10px; + padding-bottom: 16px; + position: relative; + margin-top: 5px; + + &::before { + content: ''; + background: @golden; + mask-image: linear-gradient(270deg, transparent 0%, black 50%, transparent 100%); + height: 2px; + width: calc(100% - 10px); + } + + &::before { + position: absolute; + top: -5px; + } + + .tag { + background: @green-10; + color: @green; + border-color: @green; + } + } + + .tag { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + 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; + } + + .label { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + font-size: var(--font-size-12); + } + } + + .item-icons-list { + position: absolute; + display: flex; + flex-direction: column; + gap: 5px; + align-items: end; + justify-content: center; + top: 25px; + right: 10px; + z-index: 1; + + .item-icon { + display: flex; + align-items: center; + justify-content: end; + text-align: center; + padding-right: 8px; + width: 50px; + height: 50px; + font-size: 1.2rem; + background: light-dark(@dark-blue-60, @dark-golden-80); + backdrop-filter: blur(8px); + border: 4px double light-dark(@beige, @golden); + color: light-dark(@beige, @golden); + border-radius: 999px; + transition: all 0.3s ease; + + .recall-label { + font-size: var(--font-size-14); + opacity: 0; + margin-right: 0.3rem; + transition: all 0.3s ease; + } + + i { + font-size: 0.8rem; + } + + img { + height: 24px; + width: 24px; + } + + &:hover { + max-width: 300px; + padding: 0 10px; + border-radius: 60px; + + .recall-label { + opacity: 1; + } + } + } + } + + .tooltip-hint { + border-radius: 3px; + padding: 3px; + background: light-dark(@dark-blue-60, @rustic-brown-80); + color: light-dark(@dark-blue, @golden); + font-size: 12px; + margin-bottom: 10px; + } +} + +aside[role='tooltip'].locked-tooltip:has(div.daggerheart.dh-style.tooltip.card-style) { + box-shadow: 0 0 25px @golden-90; + outline: 1px solid light-dark(@dark-blue, @golden); +} + +.theme-light #tooltip:has(div.daggerheart.dh-style.tooltip.card-style), +.theme-light aside[role='tooltip']:has(div.daggerheart.dh-style.tooltip.card-style) { + background-image: url('../assets/parchments/dh-parchment-light.png'); +} + +.theme-light aside[role='tooltip'].locked-tooltip:has(div.daggerheart.dh-style.tooltip) { + box-shadow: 0 0 25px @dark-blue-90; + outline: 1px solid light-dark(@dark-blue, @golden); + +} + #tooltip, -.locked-tooltip { +.locked-tooltip, +.daggerheart.dh-style.tooltip { &.wide { max-width: 480px; @@ -48,11 +289,6 @@ font-style: italic; } - .tooltip-sub-title { - margin: 0; - color: light-dark(@dark-blue, @beige); - } - .tooltip-information-section { width: 100%; display: grid; @@ -104,46 +340,6 @@ } } - .tooltip-tags { - width: 100%; - display: flex; - flex-direction: column; - gap: 4px; - - .tooltip-tag { - width: 100%; - display: grid; - grid-template-columns: 80px 1fr; - align-items: start; - gap: 8px; - padding: 4px; - border: 1px solid light-dark(@dark-blue, @golden); - border-radius: 6px; - - .tooltip-tag-label-container { - display: flex; - align-items: center; - flex-direction: column; - gap: 2px; - - .tooltip-tag-image { - width: 40px; - height: 40px; - } - } - - .tooltip-tag-label { - font-weight: bold; - text-align: center; - } - - .tooltip-tag-description { - display: flex; - flex-wrap: wrap; - } - } - } - .spaced { margin-bottom: 4px; } diff --git a/templates/ui/tooltip/action.hbs b/templates/ui/tooltip/action.hbs index a3020aff..29d44dde 100644 --- a/templates/ui/tooltip/action.hbs +++ b/templates/ui/tooltip/action.hbs @@ -1,82 +1,67 @@ -
    -

    {{localize item.name}}

    +
    -
    {{{description}}}
    - {{#if item.uses.max}} -

    {{localize "DAGGERHEART.GENERAL.uses"}}

    -
    -
    - -
    {{item.uses.value}}
    +

    {{localize item.name}}

    +
    + {{#if item.uses.max}} +
    + {{localize "DAGGERHEART.GENERAL.used"}} {{item.uses.value}}
    -
    - -
    {{formulaValue item.uses.max item}}
    +
    + {{localize "DAGGERHEART.GENERAL.max"}} {{formulaValue item.uses.max item}}
    -
    - - {{#with (lookup config.GENERAL.refreshTypes item.uses.recovery) as | type |}} -
    {{localize type.label}}
    - {{/with}} +
    + {{localize "DAGGERHEART.GENERAL.recovery"}} {{#with (lookup config.GENERAL.refreshTypes item.uses.recovery) as | type |}}{{localize type.label}}{{/with}}
    -
    - {{/if}} - - {{#if (gt item.cost.length 0)}} -

    {{localize "DAGGERHEART.GENERAL.Cost.plural"}}

    - {{#each item.cost as | cost |}} -
    -
    - - {{#with (lookup @root.config.GENERAL.abilityCosts cost.type) as | type |}} -
    {{localize type.label}}
    - {{/with}} + {{/if}} + {{#if (gt item.cost.length 0)}} + {{#each item.cost as | cost |}} +
    + {{localize "Type"}} {{#with (lookup @root.config.GENERAL.abilityCosts cost.type) as | type |}}{{localize type.label}}{{/with}}
    -
    - -
    {{cost.value}}
    +
    + {{localize "DAGGERHEART.GENERAL.value"}} {{cost.value}}
    {{#if cost.scalable}} -
    - -
    {{localize "DAGGERHEART.GENERAL.true"}}
    -
    -
    - -
    {{cost.step}}
    -
    +
    + {{localize "DAGGERHEART.GENERAL.scalable"}} {{localize "DAGGERHEART.GENERAL.true"}} +
    +
    + {{localize "DAGGERHEART.GENERAL.step"}} {{cost.step}} +
    {{/if}} + {{/each}} + {{/if}} + {{#if (or item.range item.target)}} +
    + + {{localize "DAGGERHEART.GENERAL.range"}} + {{#if item.range}} + {{#with (lookup @root.config.GENERAL.range item.range) as | range |}} + {{localize range.label}} + {{/with}} + {{else}} + {{localize "DAGGERHEART.GENERAL.none"}} + {{/if}} +
    - {{/each}} - {{/if}} - - {{#if (or item.range item.target)}} -

    {{localize "DAGGERHEART.UI.Tooltip.rangeAndTarget"}}

    -
    -
    - -
    - {{#if item.range}} - {{#with (lookup @root.config.GENERAL.range item.range) as | range |}} -
    {{localize range.label}}
    - {{/with}} - {{else}} -
    {{localize "DAGGERHEART.GENERAL.none"}}
    - {{/if}} -
    -
    -
    - -
    - {{#if item.target.type}} - {{#with (lookup @root.config.ACTIONS.targetTypes item.target.type) as | target |}} -
    {{@root.item.target.amount}} {{localize target.label}}
    - {{/with}} - {{else}} -
    {{localize "DAGGERHEART.GENERAL.none"}}
    - {{/if}} -
    -
    + {{/if}} +
    + + {{localize "DAGGERHEART.GENERAL.Target.single"}} + {{#if item.target.type}} + {{#with (lookup @root.config.ACTIONS.targetTypes item.target.type) as | target |}} + {{@root.item.target.amount}} {{localize target.label}} + {{/with}} + {{else}} + {{localize "DAGGERHEART.GENERAL.none"}} + {{/if}} +
    +
    + {{#if description}} +
    {{{description}}}
    {{/if}} +

    + {{localize "DAGGERHEART.UI.Tooltip.middleClick"}} +

    \ No newline at end of file diff --git a/templates/ui/tooltip/armor.hbs b/templates/ui/tooltip/armor.hbs index b2e07970..95fc20c9 100644 --- a/templates/ui/tooltip/armor.hbs +++ b/templates/ui/tooltip/armor.hbs @@ -1,21 +1,22 @@ -
    -

    {{item.name}}

    +
    -
    {{{description}}}
    - -
    -
    - -
    {{item.system.baseScore}}
    +

    {{item.name}}

    +
    +
    + {{localize "DAGGERHEART.ITEMS.Armor.baseScore"}} {{item.system.baseScore}}
    - -
    - -
    {{item.system.baseThresholds.major}}
    +
    + {{localize "DAGGERHEART.ITEMS.Armor.baseThresholds.major"}} {{item.system.baseThresholds.major}}
    -
    - -
    {{item.system.baseThresholds.severe}}
    +
    + {{localize "DAGGERHEART.ITEMS.Armor.baseThresholds.severe"}} {{item.system.baseThresholds.severe}}
    + {{#if description}} +
    {{{description}}}
    + {{/if}} + +

    + {{localize "DAGGERHEART.UI.Tooltip.middleClick"}} +

    \ No newline at end of file diff --git a/templates/ui/tooltip/attack.hbs b/templates/ui/tooltip/attack.hbs index efd40311..8e4a1bb0 100644 --- a/templates/ui/tooltip/attack.hbs +++ b/templates/ui/tooltip/attack.hbs @@ -1,35 +1,36 @@ -
    -

    {{attack.name}}

    +
    -
    {{{description}}}
    - -
    - +

    {{localize attack.name}}

    +
    {{#if (lookup config.ACTOR.abilities attack.roll.trait)}} -
    - - {{#with (lookup config.ACTOR.abilities attack.roll.trait) as | trait |}} -
    {{localize trait.label}}
    - {{/with}} +
    + + {{localize "DAGGERHEART.GENERAL.Trait.single"}} + {{#with (lookup config.ACTOR.abilities attack.roll.trait) as | trait |}} + {{localize trait.label}} + {{/with}} +
    {{/if}} - {{#if (lookup config.GENERAL.range attack.range)}} -
    - - {{#with (lookup config.GENERAL.range attack.range) as | range |}} -
    {{localize range.label}}
    - {{/with}} +
    + + {{localize "DAGGERHEART.GENERAL.range"}} + {{#with (lookup config.GENERAL.range attack.range) as | range |}} + {{localize range.label}} + {{/with}} +
    {{/if}} - -
    - -
    {{{damageFormula attack}}}
    -
    -
    - -
    {{{damageSymbols attack.damage.parts}}}
    +
    + {{{damageFormula attack}}} {{{damageSymbols attack.damage.parts}}}
    + {{#if description}} +
    {{{description}}}
    + {{/if}} + +

    + {{localize "DAGGERHEART.UI.Tooltip.middleClick"}} +

    \ No newline at end of file diff --git a/templates/ui/tooltip/beastform.hbs b/templates/ui/tooltip/beastform.hbs index 0b90c8f7..1b04ac82 100644 --- a/templates/ui/tooltip/beastform.hbs +++ b/templates/ui/tooltip/beastform.hbs @@ -1,31 +1,41 @@ -
    -

    {{item.name}}

    +
    -
    {{{description}}}
    +

    {{item.name}}

    +

    {{item.system.examples}}

    -
    {{item.system.examples}}
    - {{> "systems/daggerheart/templates/ui/tooltip/parts/tooltipChips.hbs" chips=item.system.advantageOn label=(localize "DAGGERHEART.ITEMS.Beastform.FIELDS.advantageOn.label")}} + {{#if description}} +
    {{{description}}}
    + {{/if}} -
    - {{#with item.system.beastformAttackData}} -
    - -
    {{this.trait}}
    +
    + {{#with item.system.beastformAttackData}} +
    + {{localize "DAGGERHEART.ITEMS.Beastform.mainTrait"}} {{this.trait}}
    -
    - -
    {{this.traitBonus}}
    +
    + {{localize "DAGGERHEART.ITEMS.Beastform.traitBonus"}} {{this.traitBonus}}
    -
    - -
    {{this.evasionBonus}}
    +
    + {{localize "DAGGERHEART.GENERAL.evasion"}} {{this.evasionBonus}}
    -
    - -
    {{concat this.damageDice ' ' this.damageBonus}}
    +
    + {{localize "DAGGERHEART.GENERAL.damage"}} {{concat this.damageDice ' ' this.damageBonus}}
    {{/with}}
    +

    {{localize "DAGGERHEART.ITEMS.Beastform.FIELDS.advantageOn.label"}}

    +
    + {{#each item.system.advantageOn as | chip |}} +
    + {{ifThen chip.value chip.value chip}} +
    + {{/each}} +
    + {{> "systems/daggerheart/templates/ui/tooltip/parts/tooltipTags.hbs" features=item.system.features label=(localize "DAGGERHEART.GENERAL.features")}} + +

    + {{localize "DAGGERHEART.UI.Tooltip.middleClick"}} +

    \ No newline at end of file diff --git a/templates/ui/tooltip/consumable.hbs b/templates/ui/tooltip/consumable.hbs index d39cdfa6..db87547c 100644 --- a/templates/ui/tooltip/consumable.hbs +++ b/templates/ui/tooltip/consumable.hbs @@ -1,12 +1,16 @@ -
    -

    {{item.name}}

    +
    -
    {{{description}}}
    - -
    -
    - -
    {{item.system.quantity}}
    +

    {{item.name}}

    +
    +
    + {{localize "DAGGERHEART.GENERAL.quantity"}} {{item.system.quantity}}
    + {{#if description}} +
    {{{description}}}
    + {{/if}} + +

    + {{localize "DAGGERHEART.UI.Tooltip.middleClick"}} +

    \ No newline at end of file diff --git a/templates/ui/tooltip/domainCard.hbs b/templates/ui/tooltip/domainCard.hbs index 80d2b208..9388f1a4 100644 --- a/templates/ui/tooltip/domainCard.hbs +++ b/templates/ui/tooltip/domainCard.hbs @@ -1,29 +1,32 @@ -
    -

    {{item.name}}

    +
    +
    + + {{item.system.recallCost}} + + + + {{#with (lookup config.DOMAIN.domains item.system.domain) as | domain |}} + + {{/with}} + +
    -
    {{{description}}}
    - -
    -
    - - {{#with (lookup allDomains item.system.domain) as | domain |}} -
    {{localize domain.label}}
    - {{/with}} -
    - -
    - +

    {{item.name}}

    +
    +
    {{#with (lookup config.DOMAIN.cardTypes item.system.type) as | type |}} -
    {{localize type.label}}
    + {{localize type.label}} {{/with}}
    -
    - -
    {{item.system.level}}
    -
    -
    - -
    {{item.system.recallCost}}
    +
    + {{localize 'DAGGERHEART.GENERAL.levelShort'}} {{ item.system.level }}
    + {{#if description}} +
    {{{description}}}
    + {{/if}} + +

    + {{localize "DAGGERHEART.UI.Tooltip.middleClick"}} +

    \ No newline at end of file diff --git a/templates/ui/tooltip/effect.hbs b/templates/ui/tooltip/effect.hbs index fb07d895..4430b91d 100644 --- a/templates/ui/tooltip/effect.hbs +++ b/templates/ui/tooltip/effect.hbs @@ -1,5 +1,7 @@ -
    -

    {{item.name}}

    +
    -
    {{{description}}}
    +

    {{item.name}}

    + {{#if description}} +
    {{{description}}}
    + {{/if}}
    \ No newline at end of file diff --git a/templates/ui/tooltip/feature.hbs b/templates/ui/tooltip/feature.hbs index fb07d895..3dedb9b0 100644 --- a/templates/ui/tooltip/feature.hbs +++ b/templates/ui/tooltip/feature.hbs @@ -1,5 +1,12 @@ -
    -

    {{item.name}}

    +
    -
    {{{description}}}
    +

    {{item.name}}

    +
    +
    + {{localize 'TYPES.Item.feature'}} +
    +
    + {{#if description}} +
    {{{description}}}
    + {{/if}}
    \ No newline at end of file diff --git a/templates/ui/tooltip/loot.hbs b/templates/ui/tooltip/loot.hbs index 38e7cfb0..7d793d7c 100644 --- a/templates/ui/tooltip/loot.hbs +++ b/templates/ui/tooltip/loot.hbs @@ -1,7 +1,9 @@ -
    -

    {{item.name}}

    +
    -
    {{{description}}}
    +

    {{item.name}}

    + {{#if description}} +
    {{{description}}}
    + {{/if}} {{> "systems/daggerheart/templates/ui/tooltip/parts/tooltipTags.hbs" features=item.system.actions isAction=true label=(localize "DAGGERHEART.GENERAL.Action.plural") }}
    \ No newline at end of file diff --git a/templates/ui/tooltip/parts/tooltipTags.hbs b/templates/ui/tooltip/parts/tooltipTags.hbs index b77c2215..6a6d126d 100644 --- a/templates/ui/tooltip/parts/tooltipTags.hbs +++ b/templates/ui/tooltip/parts/tooltipTags.hbs @@ -1,12 +1,12 @@ -{{#if (gt features.length 0)}}

    {{label}}

    {{/if}} +{{#if (gt features.length 0)}}

    {{label}}

    {{/if}}
    {{#each features as | feature |}} {{#with (ifThen ../isAction feature (ifThen feature.item feature.item feature))}}
    -
    {{localize this.name}}
    {{#if this.img}}{{/if}} -
    + {{localize this.name}} +
    {{{localize (ifThen this.enrichedDescription this.enrichedDescription this.system.enrichedDescription)}}}
    {{/with}} diff --git a/templates/ui/tooltip/weapon.hbs b/templates/ui/tooltip/weapon.hbs index 3c2a1407..a672c883 100644 --- a/templates/ui/tooltip/weapon.hbs +++ b/templates/ui/tooltip/weapon.hbs @@ -1,40 +1,36 @@ -
    -

    {{item.name}}

    +
    -
    {{{description}}}
    - -
    -
    - -
    {{#if item.system.secondary}}{{localize "DAGGERHEART.ITEMS.Weapon.secondaryWeapon"}}{{else}}{{localize "DAGGERHEART.ITEMS.Weapon.primaryWeapon"}}{{/if}}
    +

    {{item.name}}

    +
    +
    + {{#if item.system.secondary}}{{localize "DAGGERHEART.ITEMS.Weapon.secondaryWeapon"}}{{else}}{{localize "DAGGERHEART.ITEMS.Weapon.primaryWeapon"}}{{/if}}
    -
    - +
    {{#with (lookup config.GENERAL.burden item.system.burden) as | burden |}} -
    {{localize burden.label}}
    + {{localize burden.label}} {{/with}}
    {{#if item.system.attack.roll.trait}} -
    - +
    {{#with (lookup config.ACTOR.abilities item.system.attack.roll.trait) as | trait |}} -
    {{localize trait.label}}
    + {{localize trait.label}} {{/with}}
    {{/if}} -
    - +
    {{#with (lookup config.GENERAL.range item.system.attack.range) as | range |}} -
    {{localize range.label}}
    + {{localize range.label}} {{/with}}
    -
    - -
    {{{damageFormula item.system.attack}}}
    -
    -
    - -
    {{{damageSymbols item.system.attack.damage.parts}}}
    +
    + {{{damageFormula item.system.attack}}} {{{damageSymbols item.system.attack.damage.parts}}}
    + {{#if description}} +
    {{{description}}}
    + {{/if}} + +

    + {{localize "DAGGERHEART.UI.Tooltip.middleClick"}} +

    \ No newline at end of file From 92b31b71a7d95fe2ebdad49cc1f8744b4f882f20 Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Wed, 24 Dec 2025 01:09:51 +0100 Subject: [PATCH 32/33] [PR][Fix] Cleaned Up Countdown Ownership View (#1459) * Removed the disabled default ownership select in the ownership view. Added a fallback text incase there are no players added yet * Corrected noPlayers condition --- lang/en.json | 1 + .../dialogs/ownershipSelection.mjs | 2 +- .../ownership-selection.less | 4 +++ system.json | 2 +- templates/dialogs/ownershipSelection.hbs | 34 ++++++++----------- 5 files changed, 22 insertions(+), 21 deletions(-) diff --git a/lang/en.json b/lang/en.json index a70698ca..828b2303 100755 --- a/lang/en.json +++ b/lang/en.json @@ -586,6 +586,7 @@ }, "OwnershipSelection": { "title": "Ownership Selection - {name}", + "noPlayers": "No players to assign ownership to", "default": "Default Ownership" }, "ReactionRoll": { diff --git a/module/applications/dialogs/ownershipSelection.mjs b/module/applications/dialogs/ownershipSelection.mjs index 049f4d99..64173221 100644 --- a/module/applications/dialogs/ownershipSelection.mjs +++ b/module/applications/dialogs/ownershipSelection.mjs @@ -38,7 +38,6 @@ export default class OwnershipSelection extends HandlebarsApplicationMixin(Appli async _prepareContext(_options) { const context = await super._prepareContext(_options); - context.ownershipDefaultOptions = CONFIG.DH.GENERAL.basicOwnershiplevels; context.ownershipOptions = CONFIG.DH.GENERAL.simpleOwnershiplevels; context.defaultOwnership = this.defaultOwnership; context.ownership = game.users.reduce((acc, user) => { @@ -52,6 +51,7 @@ export default class OwnershipSelection extends HandlebarsApplicationMixin(Appli return acc; }, {}); + context.showOwnership = Boolean(Object.keys(context.ownership).length); return context; } diff --git a/styles/less/ui/ownership-selection/ownership-selection.less b/styles/less/ui/ownership-selection/ownership-selection.less index 76ae0930..ae7b5e2d 100644 --- a/styles/less/ui/ownership-selection/ownership-selection.less +++ b/styles/less/ui/ownership-selection/ownership-selection.less @@ -36,6 +36,10 @@ } } + .hint { + text-align: center; + } + footer { margin-top: 10px; button { diff --git a/system.json b/system.json index a58f23db..c58be61d 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.3.2", + "version": "1.4.0", "compatibility": { "minimum": "13.346", "verified": "13.351", diff --git a/templates/dialogs/ownershipSelection.hbs b/templates/dialogs/ownershipSelection.hbs index b16e5d75..ccd90cdf 100644 --- a/templates/dialogs/ownershipSelection.hbs +++ b/templates/dialogs/ownershipSelection.hbs @@ -1,23 +1,19 @@
    -
    -
    - - -
    -
    -
      - {{#each ownership as |player id|}} -
    • - - {{player.name}} - -
    • - {{/each}} -
    + {{#if showOwnership}} +
      + {{#each ownership as |player id|}} +
    • + + {{player.name}} + +
    • + {{/each}} +
    + {{else}} + {{localize "DAGGERHEART.APPLICATIONS.OwnershipSelection.noPlayers"}} + {{/if}}
    From 2104549617011bf46e624bf2c98aa0e0746913ae Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Wed, 24 Dec 2025 01:15:50 +0100 Subject: [PATCH 33/33] [PR][Feature] Adversary Compendium Name Lookup (#1458) * Exchanged all name references for @Lookup. Removed duplicated descriptions on feature actions. * Corrected action.description fallback --- .../sheets-configs/action-base-config.mjs | 2 +- module/data/action/baseAction.mjs | 3 ++ ...ersary_Acid_Burrower_89yAh30vaNQOALlz.json | 18 ++++----- ...ary_Adult_Flickerfly_G7jiltRjgvVhZewm.json | 28 ++++++------- ..._Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json | 6 +-- ...ary_Arch_Necromancer_WPEOIGfclNJxWb87.json | 16 ++++---- ...versary_Archer_Guard_JRhrrEg5UroURiAD.json | 2 +- ...sary_Archer_Squadron_0ts6CGd93lLqGZI5.json | 8 ++-- ...ry_Assassin_Poisoner_h5RuhzGL17dW5FBT.json | 8 ++-- ...adversary_Battle_Box_dgH3fW9FTYLaIDvS.json | 40 +++++++++---------- .../adversary_Bear_71qKDLKO3CsrNkdy.json | 4 +- ...versary_Bladed_Guard_B4LZcGuBAHzyVdzy.json | 6 +-- ...ersary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json | 10 ++--- .../adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json | 14 +++---- ...dversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json | 12 +++--- .../adversary_Conscript_99TqczuQipBmaB8i.json | 6 +-- .../adversary_Construct_uOP5oT9QzXPlnf3p.json | 18 ++++----- .../adversary_Courtesan_ZxWaWPdzFIUPNC62.json | 4 +- .../adversary_Courtier_CBBuEXAlLKFMJdjg.json | 6 +-- ...adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json | 10 ++--- .../adversary_Cult_Fang_tyBOpLfigAhI9bU3.json | 8 ++-- ...ersary_Cult_Initiate_zx99sOGTXicP4SSD.json | 6 +-- ...ry_Deeproot_Defender_9x2xY9zwc3xzbXo5.json | 6 +-- ...ary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json | 4 +- ...ary_Demon_of_Despair_kE4dfhqmIQpNd44e.json | 10 ++--- ...sary_Demon_of_Hubris_2VN3BftageoTTIzu.json | 16 ++++---- ...ry_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json | 10 ++--- ...rsary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json | 12 +++--- ...y_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json | 8 ++-- .../adversary_Dire_Bat_tBWHW00epmMnkawe.json | 8 ++-- .../adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json | 6 +-- .../adversary_Dryad_wR7cFKrHvRzbzhBT.json | 6 +-- ...ersary_Electric_Eels_TLzY1nDw0Bu9Ud40.json | 4 +- ...sary_Elemental_Spark_P7h54ZePFPHpYwvB.json | 4 +- ...ersary_Elite_Soldier_bfhVWMBUh61b9J6n.json | 6 +-- ...ry_Failed_Experiment_ChwwVqowFw8hJQwT.json | 8 ++-- ...y_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json | 8 ++-- ...sary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json | 12 +++--- ...rlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json | 22 +++++----- ..._Undefeated_Champion_RXkZTwBRi4dJ3JE5.json | 28 ++++++------- ...ry_Giant_Beastmaster_8VZIgU12cB3cvlyH.json | 8 ++-- ...ersary_Giant_Brawler_YnObCleGjPT7yqEc.json | 12 +++--- ...dversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json | 12 +++--- ...ary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json | 8 ++-- .../adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json | 6 +-- ...ersary_Giant_Recruit_5s8wSvpyC5rxY5aD.json | 6 +-- ...rsary_Giant_Scorpion_fmfntuJ8mHRCAktP.json | 6 +-- ...dversary_Glass_Snake_8KWVLWXFhlY2kYx0.json | 14 +++---- .../adversary_Gorgon_8mJYMpbLTb8qIOrr.json | 22 +++++----- ...ater_Earth_Elemental_dsfB3YhoL5SudvS2.json | 16 ++++---- ...ater_Water_Elemental_xIICT6tEdnA7dKDV.json | 10 ++--- ...adversary_Green_Ooze_SHXedd9zZPVfUgUa.json | 14 +++---- ...sary_Hallowed_Archer_kabueAo6BALApWqp.json | 4 +- ...ary_Hallowed_Soldier_VENwg7xEFcYObjmT.json | 10 ++--- .../adversary_Harrier_uRtghKE9mHlII4rs.json | 4 +- ...adversary_Head_Guard_mK3A5FTx6k8iPU3F.json | 12 +++--- ...versary_Head_Vampire_i2UNbRvgyoSs07M6.json | 18 ++++----- ...dversary_High_Seraph_r1mbfSSwKWdcFdAU.json | 16 ++++---- ...sary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json | 12 +++--- .../adversary_Hydra_MI126iMOOobQ1Obn.json | 12 +++--- ..._Jagged_Knife_Bandit_5Lh1T0zaT8Pkr2U2.json | 6 +-- ...y_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json | 6 +-- ...ed_Knife_Kneebreaker_CBKixLH3yhivZZuL.json | 6 +-- ..._Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json | 6 +-- ...ged_Knife_Lieutenant_aTljstqteGoLpCBq.json | 10 ++--- ..._Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json | 8 ++-- ..._Jagged_Knife_Sniper_1zuyof1XuIfi3aMG.json | 4 +- ..._Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json | 18 ++++----- ..._Knight_of_the_Realm_7ai2opemrclQe3VF.json | 10 ++--- .../adversary_Kraken_4nqv3ZwJGjnmic8j.json | 14 +++---- ...versary_Masked_Thief_niBpVU7yeo5ccskE.json | 8 ++-- ...sary_Master_Assassin_dNta0cUzr96xcFhf.json | 16 ++++---- .../adversary_Merchant_Al3w2CgjfdT3p9ma.json | 6 +-- ...rsary_Merchant_Baron_Vy02IhGhkJLuezu4.json | 6 +-- ...inor_Chaos_Elemental_sRn4bqerfARvhgSV.json | 12 +++--- ...dversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json | 18 ++++----- ...Minor_Fire_Elemental_DscWkNVoHak6P4hh.json | 18 ++++----- ...versary_Minor_Treant_G62k4oSkhkoXEs2D.json | 6 +-- ...ary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json | 8 ++-- .../adversary_Monarch_yx0vK2yfNVZKWUUi.json | 10 ++--- ...ersary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json | 18 ++++----- ...adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json | 8 ++-- ...rsary_Oracle_of_Doom_befIqd5IYKg6eUz2.json | 18 ++++----- ...r_Realms_Abomination_A0SeeDzwjvqOsyof.json | 14 +++---- ...ter_Realms_Corrupter_ms6nuOl3NFkhPj1k.json | 6 +-- ..._Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json | 6 +-- ...atchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json | 10 ++--- ...ary_Perfected_Zombie_CP6iRfHdyFWniTHY.json | 16 ++++---- ...dversary_Petty_Noble_wycLpvebWdUqRhpP.json | 8 ++-- ...rsary_Pirate_Captain_OROJbjsqagVh7ECV.json | 14 +++---- ...rsary_Pirate_Raiders_5YgEajn0wa4i85kC.json | 6 +-- ...versary_Pirate_Tough_mhcVkVFrzIJ18FDm.json | 6 +-- .../adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json | 8 ++-- ...ersary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json | 6 +-- ...ersary_Royal_Advisor_EtLJiTsilPPZvLUX.json | 10 ++--- ...ersary_Secret_Keeper_sLAccjvCWfeedbpI.json | 12 +++--- .../adversary_Sellsword_bgreCaQ6ap2DVpCr.json | 6 +-- ...ary_Shambling_Zombie_2nXz4ilAY4xuhKLm.json | 6 +-- .../adversary_Shark_YmVAkdNsyuXWTtYp.json | 12 +++--- .../adversary_Siren_BK4jwyXSRx7IOQiO.json | 8 ++-- ...sary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json | 4 +- ...sary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json | 6 +-- ...sary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json | 12 +++--- ...ary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json | 4 +- ...sary_Spectral_Archer_5tCkhnBByUIN5UdG.json | 4 +- ...ary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json | 12 +++--- ...ry_Spectral_Guardian_UFVGl1osOsJTneLf.json | 4 +- ...adversary_Spellblade_ldbWEL7uZs84vyrR.json | 12 +++--- .../adversary_Spy_8zlynOhnVA59KpKT.json | 10 ++--- ...dversary_Stag_Knight_KGVwnLq85ywP9xvB.json | 12 +++--- ...dversary_Stonewraith_3aAS2Qm3R6cgaYfE.json | 10 ++--- ...ersary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json | 4 +- ...rsary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json | 10 ++--- ...Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json | 8 ++-- ...rsary_Tangle_Bramble_XcAGOSmtCFLT1unN.json | 8 ++-- ...sary_Tiny_Green_Ooze_aLkLFuVoKz2NLoBK.json | 4 +- ...ersary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json | 2 +- ...rsary_Treant_Sapling_o63nS0k3wHu6EgKP.json | 4 +- .../adversary_Vampire_WWyUp6Mxl1S3KYUG.json | 8 ++-- ...ault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json | 6 +-- ...lt_Guardian_Sentinel_FVgYb28fhxlVcGwA.json | 12 +++--- ...ault_Guardian_Turret_c5hGdvY5UnSjlHws.json | 14 +++---- ...Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json | 22 +++++----- ...agon__Molten_Scourge_eArAPuB38CNR0ZIM.json | 26 ++++++------ ...n__Obsidian_Predator_ladm7wykhZczYzrQ.json | 18 ++++----- ...adversary_War_Wizard_noDdT0tsN6FXSmC8.json | 14 +++---- ...versary_Weaponmaster_ZNbQ2jg35LG4t9eH.json | 10 ++--- ...dversary_Young_Dryad_8yUj2Mzvnifhxegm.json | 8 ++-- ...ary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json | 24 +++++------ ...ersary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json | 12 +++--- ...dversary_Zombie_Pack_Nf0v43rtflV56V2T.json | 6 +-- .../adversary-settings/features.hbs | 2 +- 132 files changed, 672 insertions(+), 669 deletions(-) diff --git a/module/applications/sheets-configs/action-base-config.mjs b/module/applications/sheets-configs/action-base-config.mjs index 70252642..7190a5b7 100644 --- a/module/applications/sheets-configs/action-base-config.mjs +++ b/module/applications/sheets-configs/action-base-config.mjs @@ -98,7 +98,7 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2) async _prepareContext(_options) { const context = await super._prepareContext(_options, 'action'); - context.source = this.action.toObject(false); + context.source = this.action._source; context.openSection = this.openSection; context.tabs = this._getTabs(this.constructor.TABS); context.config = CONFIG.DH; diff --git a/module/data/action/baseAction.mjs b/module/data/action/baseAction.mjs index 998fe0ab..239bfa1e 100644 --- a/module/data/action/baseAction.mjs +++ b/module/data/action/baseAction.mjs @@ -95,6 +95,9 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel prepareData() { this.name = this.name || game.i18n.localize(CONFIG.DH.ACTIONS.actionTypes[this.type].name); this.img = this.img ?? this.parent?.parent?.img; + + /* Fallback to feature description */ + this.description = this.description || this.parent?.description; } /** diff --git a/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json b/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json index e93017f9..e2b3a444 100644 --- a/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json +++ b/src/packs/adversaries/adversary_Acid_Burrower_89yAh30vaNQOALlz.json @@ -260,14 +260,14 @@ "_id": "MFmGN6Tbf5GYxrQ9", "img": "icons/magic/unholy/silhouette-evil-horned-giant.webp", "system": { - "description": "

    The Burrower can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "

    The @Lookup[@name] can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

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

    The Burrower can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "", "chatDisplay": false, "actionType": "passive", "cost": [ @@ -319,14 +319,14 @@ "_id": "ctXYwil2D1zfsekT", "img": "icons/magic/earth/barrier-stone-explosion-red.webp", "system": { - "description": "

    Mark a Stress to have the Burrower burst out of the ground. All creatures within Very Close range must succeed on an Agility Reaction Roll or be knocked over, making them Vulnerable until they next act.

    @Template[type:emanation|range:vc]

    ", + "description": "

    Mark a Stress to have the @Lookup[@name] burst out of the ground. All creatures within Very Close range must succeed on an Agility Reaction Roll or be knocked over, making them Vulnerable until they next act.

    @Template[type:emanation|range:vc]

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

    Mark a Stress to have the Burrower burst out of the ground. All creatures within Very Close range must succeed on an Agility Reaction Roll or be knocked over, making them Vulnerable until they next act.

    @Template[type:emanation|range:vc]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -444,14 +444,14 @@ "_id": "UpFsnlbZkyvM2Ftv", "img": "icons/magic/acid/projectile-smoke-glowing.webp", "system": { - "description": "

    Make an attack against all targets in front of the Burrower within Close range. Targets the Burrower succeeds against take 2d6 physical damage and must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP and you gain a Fear.

    @Template[type:inFront|range:c]

    ", + "description": "

    Make an attack against all targets in front of the @Lookup[@name] within Close range. Targets the @Lookup[@name] succeeds against take 2d6 physical damage and must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP and you gain a Fear.

    @Template[type:inFront|range:c]

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

    Make an attack against all targets in front of the Burrower within Close range. Targets the Burrower succeeds against take 2d6 physical damage and must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP and you gain a Fear.

    @Template[type:inFront|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -571,14 +571,14 @@ "_id": "aNIVT5LKhwLyjKpI", "img": "icons/magic/acid/dissolve-drip-droplet-smoke.webp", "system": { - "description": "

    When the Burrower takes Severe damage, all creatures within Close range are bathed in their acidic blood, taking 1d10 physical damage. This splash covers the ground within Very Close range with blood, and all creatures other than the Burrower who move through it take 1d6 physical damage.

    @Template[type:emanation|range:c]

    ", + "description": "

    When the @Lookup[@name] takes Severe damage, all creatures within Close range are bathed in their acidic blood, taking 1d10 physical damage. This splash covers the ground within Very Close range with blood, and all creatures other than the @Lookup[@name] who move through it take 1d6 physical damage.

    @Template[type:emanation|range:c]

    ", "resource": null, "actions": { "XbtTzOBvlTaxOKTy": { "type": "damage", "_id": "XbtTzOBvlTaxOKTy", "systemPath": "actions", - "description": "

    When the Burrower takes Severe damage, all creatures within Close range are bathed in their acidic blood, taking 1d10 physical damage. This splash covers the ground within Very Close range with blood, and all creatures other than the Burrower who move through it take 1d6 physical damage.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -632,7 +632,7 @@ "type": "damage", "_id": "xpcp1ECTWF20kxve", "systemPath": "actions", - "description": "

    This splash covers the ground within Very Close range with blood, and all creatures other than the Burrower who move through it take 1d6 physical damage.

    ", + "description": "

    This splash covers the ground within Very Close range with blood, and all creatures other than the @Lookup[@name] who move through it take 1d6 physical damage.

    ", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json b/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json index be14ae49..266cba24 100644 --- a/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json +++ b/src/packs/adversaries/adversary_Adult_Flickerfly_G7jiltRjgvVhZewm.json @@ -221,14 +221,14 @@ "name": "Relentless (4)", "type": "feature", "system": { - "description": "

    The Flickerfly can be spotlighted up to four times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "

    The @Lookup[@name] can be spotlighted up to four times per GM turn. Spend Fear as usual to spotlight them.

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

    The Flickerfly can be spotlighted up to four times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -279,14 +279,14 @@ "name": "Never Misses", "type": "feature", "system": { - "description": "

    When the Flickerfly makes an attack, the target’s Evasion is halved against the attack.

    ", + "description": "

    When the @Lookup[@name] makes an attack, the target’s Evasion is halved against the attack.

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

    When the Flickerfly makes an attack, the target’s Evasion is halved against the attack.

    ", + "description": "", "chatDisplay": true, "actionType": "passive", "cost": [], @@ -376,14 +376,14 @@ "name": "Whirlwind", "type": "feature", "system": { - "description": "

    Spend a Fear to whirl, making an attack against all targets within Very Close range. Targets the Flickerfly succeeds against take 3d8 direct physical damage.

    @Template[type:emanation|range:vc]

    ", + "description": "

    Spend a Fear to whirl, making an attack against all targets within Very Close range. Targets the @Lookup[@name] succeeds against take 3d8 direct physical damage.

    @Template[type:emanation|range:vc]

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

    Spend a Fear to whirl, making an attack against all targets within Very Close range. Targets the Flickerfly succeeds against take 3d8 direct physical damage.

    @Template[type:emanation|range:vc]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -484,14 +484,14 @@ "name": "Mind Dance", "type": "feature", "system": { - "description": "

    Mark a Stress to create a magically dazzling display that grapples the minds of nearby foes. All targets within Close range must make an Instinct Reaction Roll. For each target who failed, you gain a Fear and the Flickerfl y learns one of the target’s fears.

    @Template[type:emanation|range:c]

    ", + "description": "

    Mark a Stress to create a magically dazzling display that grapples the minds of nearby foes. All targets within Close range must make an Instinct Reaction Roll. For each target who failed, you gain a Fear and the @Lookup[@name] learns one of the target’s fears.

    @Template[type:emanation|range:c]

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

    Mark a Stress to create a magically dazzling display that grapples the minds of nearby foes. All targets within Close range must make an Instinct Reaction Roll. For each target who failed, you gain a Fear and the Flickerfl y learns one of the target’s fears.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -564,14 +564,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 @Lookup[@name] takes damage for the first time, activate the countdown. When it triggers, the @Lookup[@name] 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 @Lookup[@name] 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": "

    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]

    ", + "description": "

    The @Lookup[@name] 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 @Lookup[@name] 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": [], @@ -669,7 +669,7 @@ "type": "countdown", "_id": "lBhmLc33pcXzJHT3", "systemPath": "actions", - "description": "

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

    ", + "description": "

    Countdown (Loop 1d6). When the @Lookup[@name] takes damage for the first time, activate the countdown.

    ", "chatDisplay": true, "originItem": { "type": "itemCollection" @@ -726,14 +726,14 @@ "name": "Uncanny Reflexes", "type": "feature", "system": { - "description": "

    When the Flickerfly takes damage from an attack within Close range, you can mark a Stress to take half damage.

    ", + "description": "

    When the @Lookup[@name] takes damage from an attack within Close range, you can mark a Stress to take half damage.

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

    When the Flickerfly takes damage from an attack within Close range, you can mark a Stress to take half damage.

    ", + "description": "", "chatDisplay": true, "actionType": "reaction", "cost": [ @@ -782,7 +782,7 @@ "name": "Deadly Flight", "type": "feature", "system": { - "description": "

    While flying the Flickerfly can move up to Far range instead of Close range before taking an action.

    ", + "description": "

    While flying the @Lookup[@name] can move up to Far range instead of Close range before taking an action.

    ", "resource": null, "actions": {}, "originItemType": null, diff --git a/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json b/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json index 41bd6fca..3f31ff76 100644 --- a/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json +++ b/src/packs/adversaries/adversary_Apprentice_Assassin_vNIbYQ4YSzNf0WPE.json @@ -220,7 +220,7 @@ "name": "Minion (6)", "type": "feature", "system": { - "description": "

    The Assassin is defeated when they take any damage. For every 6 damage a PC deals to the Assassin, defeat an additional Minion within range the attack would succeed against.

    ", + "description": "

    The @Lookup[@name] is defeated when they take any damage. For every 6 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -246,14 +246,14 @@ "name": "Group Attack", "type": "feature", "system": { - "description": "

    Spend a Fear to choose a target and spotlight all Apprentice Assassins within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 4 physical damage each. Combine this damage.

    ", + "description": "

    Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 4 physical damage each. Combine this damage.

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

    Spend a Fear to choose a target and spotlight all Apprentice Assassins within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 4 physical damage each. Combine this damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json b/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json index d2fb5183..4fc58990 100644 --- a/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json +++ b/src/packs/adversaries/adversary_Arch_Necromancer_WPEOIGfclNJxWb87.json @@ -239,7 +239,7 @@ "type": "attack", "_id": "wi2DDvBhlg6sxQoc", "systemPath": "actions", - "description": "

    Mark a Stress to spotlight 1d4 allies. Attacks they make while spotlighted in this way deal half damage, or full damage if you spend a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -319,7 +319,7 @@ "type": "attack", "_id": "vaXLESD4sRkQ3Ahn", "systemPath": "actions", - "description": "

    Mark 2 Stress to cause all targets within Far range to make a Strength Reaction Roll. Targets who fail take 2d20+12 magic damage and you gain a Fear. Targets who succeed take half damage. A target who marks 2 or more HP must also mark 2 Stress and becomes Vulnerable until they roll with Hope.

    @Template[type:emanation|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -537,7 +537,7 @@ "type": "effect", "_id": "gZg3AkzCYUTExjE6", "systemPath": "actions", - "description": "

    Spend a Fear to summon a @UUID[Compendium.daggerheart.adversaries.Actor.YhJrP7rTBiRdX5Fp]{Zombie Legion}, which appears at Close range and immediately takes the spotlight.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -586,14 +586,14 @@ "name": "Not Today, My Dears", "type": "feature", "system": { - "description": "

    When the Necromancer has marked 7 or more of their HP, you can spend a Fear to have them teleport away to a safe location to recover. A PC who succeeds on an Instinct Roll can trace the teleportation magic to their destination.

    ", + "description": "

    When the @Lookup[@name] has marked 7 or more of their HP, you can spend a Fear to have them teleport away to a safe location to recover. A PC who succeeds on an Instinct Roll can trace the teleportation magic to their destination.

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

    When the Necromancer has marked 7 or more of their HP, you can spend a Fear to have them teleport away to a safe location to recover. A PC who succeeds on an Instinct Roll can trace the teleportation magic to their destination.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -666,14 +666,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 @Lookup[@name] 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 @Lookup[@name] then clears a number of Stress or HP equal to the number of HP marked by the target from this attack.

    ", "resource": null, "actions": { "YzepYov9vEMcBPU1": { "type": "damage", "_id": "YzepYov9vEMcBPU1", "systemPath": "actions", - "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.

    ", + "description": "

    Deal 2d10+6 direct magic damage to a target within Close range. The @Lookup[@name] 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": [], @@ -726,7 +726,7 @@ "type": "countdown", "_id": "LXhwkNCDFeUric8D", "systemPath": "actions", - "description": "

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

    ", + "description": "

    Countdown (Loop 2d6). When the @Lookup[@name] has marked 6 or more of their HP, activate the countdown.

    ", "chatDisplay": true, "originItem": { "type": "itemCollection" diff --git a/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json b/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json index 034905aa..5a13b3d9 100644 --- a/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json +++ b/src/packs/adversaries/adversary_Archer_Guard_JRhrrEg5UroURiAD.json @@ -236,7 +236,7 @@ "type": "attack", "_id": "84rwldOFvTPrrHJJ", "systemPath": "actions", - "description": "

    Make an attack against a target within Far range. On a success, mark a Stress to deal 1d12+3 physical damage. If the target marks HP from this attack, they have disadvantage on Agility Rolls until they clear at least 1 HP.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json b/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json index 1b2c8cad..55229040 100644 --- a/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json +++ b/src/packs/adversaries/adversary_Archer_Squadron_0ts6CGd93lLqGZI5.json @@ -221,7 +221,7 @@ "name": "Horde (1d6+3)", "type": "feature", "system": { - "description": "

    When the Squadron has marked half or more of their HP, their standard attack deals 1d6+3 physical damage instead.

    ", + "description": "

    When the @Lookup[@name] has marked half or more of their HP, their standard attack deals 1d6+3 physical damage instead.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -246,14 +246,14 @@ "name": "Focused Volley", "type": "feature", "system": { - "description": "

    Spend a Fear to target a point within Far range. Make an attack with advantage against all targets within Close range of that point. Targets the Squadron succeeds against take 1d10+4 physical damage.

    @Template[type:circle|range:c]

    ", + "description": "

    Spend a Fear to target a point within Far range. Make an attack with advantage against all targets within Close range of that point. Targets the @Lookup[@name] succeeds against take 1d10+4 physical damage.

    @Template[type:circle|range:c]

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

    Spend a Fear to target a point within Far range. Make an attack with advantage against all targets within Close range of that point. Targets the Squadron succeeds against take 1d10+4 physical damage.

    @Template[type:circle|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -358,7 +358,7 @@ "type": "attack", "_id": "mH6mmJIMM1fwzePt", "systemPath": "actions", - "description": "

    Mark a Stress to target a point within Far range. Until the next roll with Fear, a creature who moves within Close range of that point must make an Agility Reaction Roll. On a failure, they take 2d6+3 physical damage. On a success, they take half damage.

    @Template[type:circle|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json b/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json index cae27b60..6594cbbe 100644 --- a/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json +++ b/src/packs/adversaries/adversary_Assassin_Poisoner_h5RuhzGL17dW5FBT.json @@ -227,14 +227,14 @@ "name": "Grindletooth Venom", "type": "feature", "system": { - "description": "

    Targets who mark HP from the Assassin’s attacks are Vulnerable until they clear a HP.

    ", + "description": "

    Targets who mark HP from the @Lookup[@name]’s attacks are Vulnerable until they clear a HP.

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

    Targets who mark HP from the Assassin’s attacks are Vulnerable until they clear a HP.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -319,7 +319,7 @@ "name": "Assassin Poisoner", "type": "feature", "system": { - "description": "

    The Assassin has advantage on attacks if they are Hidden.

    ", + "description": "

    The @Lookup[@name] has advantage on attacks if they are Hidden.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -395,7 +395,7 @@ "type": "effect", "_id": "sp7RfJRQJsEUm09m", "systemPath": "actions", - "description": "

    Drop a smoke bomb that fills the air within Close range with smoke, Dizzying all targets in this area. Dizzied targets have disadvantage on their next action roll, then clear the condition.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json b/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json index 14b5c0f3..96a1b752 100644 --- a/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json +++ b/src/packs/adversaries/adversary_Battle_Box_dgH3fW9FTYLaIDvS.json @@ -227,14 +227,14 @@ "name": "Relentless (2)", "type": "feature", "system": { - "description": "

    The Box can be spotlighted up to two times times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "

    The @Lookup[@name] can be spotlighted up to two times times per GM turn. Spend Fear as usual to spotlight them.

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

    The Box can be spotlighted up to two times times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -285,14 +285,14 @@ "name": "Randomized Tactics", "type": "feature", "system": { - "description": "

    Mark a Stress and roll a d6. The Box uses the corresponding move:

    1. Mana Beam

    2. Fire Jets

    3. Trample

    4. Shocking Gas

    5. Stunning Clap

    6. Psionic Whine

    ", + "description": "

    Mark a Stress and roll a d6. The @Lookup[@name] uses the corresponding move:

    1. Mana Beam

    2. Fire Jets

    3. Trample

    4. Shocking Gas

    5. Stunning Clap

    6. Psionic Whine

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

    Mark a Stress and roll a d6. The Box uses the corresponding move:

    1. Mana Beam

    2. Fire Jets

    3. Trample

    4. Shocking Gas

    5. Stunning Clap

    6. Psionic Whine

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -365,14 +365,14 @@ "name": "Mana Beam", "type": "feature", "system": { - "description": "

    The Box fires a searing beam. Make an attack against a target within Far range. On a success, deal 2d10+2 magic damage.

    ", + "description": "

    The @Lookup[@name] fires a searing beam. Make an attack against a target within Far range. On a success, deal 2d10+2 magic damage.

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

    The Box fires a searing beam. Make an attack against a target within Far range. On a success, deal 2d10+2 magic damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -465,14 +465,14 @@ "name": "Fire Jets", "type": "feature", "system": { - "description": "

    The Box shoots into the air, spinning and releasing jets of flame. Make an attack against all targets within Close range. Targets the Box succeeds against take 2d8 physical damage.

    @Template[type:emanation|range:c]

    ", + "description": "

    The @Lookup[@name] shoots into the air, spinning and releasing jets of flame. Make an attack against all targets within Close range. Targets the @Lookup[@name] succeeds against take 2d8 physical damage.

    @Template[type:emanation|range:c]

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

    The Box shoots into the air, spinning and releasing jets of flame. Make an attack against all targets within Close range. Targets the Box succeeds against take 2d8 physical damage.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -565,14 +565,14 @@ "name": "Trample", "type": "feature", "system": { - "description": "

    The Box rockets around erratically. Make an attack against all PCs within Close range. Targets the Box succeeds against take 1d6+5 physical damage and are Vulnerable until their next roll with Hope.

    @Template[type:emanation|range:c]

    ", + "description": "

    The @Lookup[@name] rockets around erratically. Make an attack against all PCs within Close range. Targets the @Lookup[@name] succeeds against take 1d6+5 physical damage and are Vulnerable until their next roll with Hope.

    @Template[type:emanation|range:c]

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

    The Box rockets around erratically. Make an attack against all PCs within Close range. Targets the Box succeeds against take 1d6+5 physical damage and are Vulnerable until their next roll with Hope.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -709,14 +709,14 @@ "name": "Shocking Gas", "type": "feature", "system": { - "description": "

    The Box sprays out a silver gas sparking with lightning. All targets within Close range must succeed on a Finesse Reaction Roll or mark 3 Stress.

    @Template[type:emanation|range:c]

    ", + "description": "

    The @Lookup[@name] sprays out a silver gas sparking with lightning. All targets within Close range must succeed on a Finesse Reaction Roll or mark 3 Stress.

    @Template[type:emanation|range:c]

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

    The Box sprays out a silver gas sparking with lightning. All targets within Close range must succeed on a Finesse Reaction Roll or mark 3 Stress.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -808,14 +808,14 @@ "name": "Stunning Clap", "type": "feature", "system": { - "description": "

    The Box leaps and their sides clap, creating a small sonic boom. All targets within Very Close range must succeed on a Strength Reaction Roll or become Vulnerable until the cube is defeated.

    @Template[type:emanation|range:vc]

    ", + "description": "

    The @Lookup[@name] leaps and their sides clap, creating a small sonic boom. All targets within Very Close range must succeed on a Strength Reaction Roll or become Vulnerable until the cube is defeated.

    @Template[type:emanation|range:vc]

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

    The Box leaps and their sides clap, creating a small sonic boom. All targets within Very Close range must succeed on a Strength Reaction Roll or become Vulnerable until the cube is defeated.

    @Template[type:emanation|range:vc]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -925,14 +925,14 @@ "name": "Psionic Whine", "type": "feature", "system": { - "description": "

    The Box releases a cluster of mechanical bees whose buzz rattles mortal minds. All targets within Close range must succeed on a Presence Reaction Roll or take 2d4+9 direct magic damage.

    @Template[type:emanation|range:c]

    ", + "description": "

    The @Lookup[@name] releases a cluster of mechanical bees whose buzz rattles mortal minds. All targets within Close range must succeed on a Presence Reaction Roll or take 2d4+9 direct magic damage.

    @Template[type:emanation|range:c]

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

    The Box releases a cluster of mechanical bees whose buzz rattles mortal minds. All targets within Close range must succeed on a Presence Reaction Roll or take 2d4+9 direct magic damage.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -1025,14 +1025,14 @@ "name": "Overcharge", "type": "feature", "system": { - "description": "

    Before rolling damage for the Box’s attack, you can mark a Stress to add a d6 to the damage roll. Additionally, you gain a Fear.

    ", + "description": "

    Before rolling damage for the @Lookup[@name]’s attack, you can mark a Stress to add a d6 to the damage roll. Additionally, you gain a Fear.

    ", "resource": null, "actions": { "3XOvKoYz4CqMNrU9": { "type": "healing", "_id": "3XOvKoYz4CqMNrU9", "systemPath": "actions", - "description": "

    Before rolling damage for the Box’s attack, you can mark a Stress to add a d6 to the damage roll. Additionally, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -1126,14 +1126,14 @@ "name": "Death Quake", "type": "feature", "system": { - "description": "

    When the Box marks their last HP, the magic powering them ruptures in an explosion of force. All targets within Close range must succeed on an Instinct Reaction Roll or take 2d8+1 magic damage

    @Template[type:emanation|range:c]

    ", + "description": "

    When the @Lookup[@name] marks their last HP, the magic powering them ruptures in an explosion of force. All targets within Close range must succeed on an Instinct Reaction Roll or take 2d8+1 magic damage

    @Template[type:emanation|range:c]

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

    When the Box marks their last HP, the magic powering them ruptures in an explosion of force. All targets within Close range must succeed on an Instinct Reaction Roll or take 2d8+1 magic damage

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json b/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json index 2e4da586..da5de611 100644 --- a/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json +++ b/src/packs/adversaries/adversary_Bear_71qKDLKO3CsrNkdy.json @@ -234,7 +234,7 @@ "_id": "2fXzhh2qil8dw3vw", "img": "icons/skills/melee/strike-slashes-orange.webp", "system": { - "description": "

    Targets who mark HP from the Bear’s standard attack are knocked back to Very Close range.

    ", + "description": "

    Targets who mark HP from the @Lookup[@name]’s standard attack are knocked back to Very Close range.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -267,7 +267,7 @@ "type": "attack", "_id": "PXL3e51eBYZ4O2lb", "systemPath": "actions", - "description": "

    Mark a Stress to make an attack against a target within Melee range. On a success, deal 3d4+10 physical damage and the target is Restrained until they break free with a successful Strength Roll.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json b/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json index f4227a91..8ee7c56c 100644 --- a/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json +++ b/src/packs/adversaries/adversary_Bladed_Guard_B4LZcGuBAHzyVdzy.json @@ -229,14 +229,14 @@ "_id": "qEn4baWgkjKtmILp", "img": "icons/equipment/shield/shield-round-boss-wood-brown.webp", "system": { - "description": "

    A creature who tries to move within Very Close range of the Guard must succeed on an Agility Roll. If additional Bladed Guards are standing in a line alongside the first, and each is within Melee range of another guard in the line, the Difficulty increases by the total number of guards in that line.

    ", + "description": "

    A creature who tries to move within Very Close range of the @Lookup[@name] must succeed on an Agility Roll. If additional @Lookup[@name]s are standing in a line alongside the first, and each is within Melee range of another guard in the line, the Difficulty increases by the total number of guards in that line.

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

    A creature who tries to move within Very Close range of the Guard must succeed on an Agility Roll. If additional Bladed Guards are standing in a line alongside the first, and each is within Melee range of another guard in the line, the Difficulty increases by the total number of guards in that line.

    ", + "description": "", "chatDisplay": true, "actionType": "passive", "cost": [], @@ -309,7 +309,7 @@ "type": "attack", "_id": "TK5R00afB1RIA6gp", "systemPath": "actions", - "description": "

    Make an attack against a target within Very Close range. On a success, mark a Stress to Restrain the target until they break free with a successful attack, Finesse Roll, or Strength Roll.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json b/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json index d522e737..c829c3f9 100644 --- a/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json +++ b/src/packs/adversaries/adversary_Brawny_Zombie_2UeZ0tEe7AzgSJNd.json @@ -232,7 +232,7 @@ "_id": "yBaLF9DwPH2GSRKf", "img": "icons/magic/time/hourglass-brown-orange.webp", "system": { - "description": "

    When you spotlight the Zombie and they don’t have a token on their stat block, they can’t act yet. Place a token on their stat block and describe what they’re preparing to do. When you spotlight the Zombie and they have a token on their stat block, clear the token and they can act.

    ", + "description": "

    When you spotlight the @Lookup[@name] and they don’t have a token on their stat block, they can’t act yet. Place a token on their stat block and describe what they’re preparing to do. When you spotlight the @Lookup[@name] and they have a token on their stat block, clear the token and they can act.

    ", "resource": { "type": "simple", "value": 0, @@ -263,14 +263,14 @@ "_id": "LP7xVLMTkJsmiIvl", "img": "icons/skills/melee/strike-slashes-red.webp", "system": { - "description": "

    Make a standard attack with advantage against a target the Zombie has Restrained. On a success, the attack deals direct damage.

    ", + "description": "

    Make a standard attack with advantage against a target the @Lookup[@name] has Restrained. On a success, the attack deals direct damage.

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

    Make a standard attack with advantage against a target the Zombie has Restrained. On a success, the attack deals direct damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -365,14 +365,14 @@ "_id": "69reUZ5tv3splqyO", "img": "icons/creatures/abilities/mouth-teeth-lamprey-red.webp", "system": { - "description": "

    When the Zombies makes a successful standard attack, you can mark a Stress to temporarily Restrain the target and force them to mark 2 Stress.

    ", + "description": "

    When the @Lookup[@name] makes a successful standard attack, you can mark a Stress to temporarily Restrain the target and force them to mark 2 Stress.

    ", "resource": null, "actions": { "xV1z3dk9c7jIkk7v": { "type": "damage", "_id": "xV1z3dk9c7jIkk7v", "systemPath": "actions", - "description": "

    When the Zombies makes a successful standard attack, you can mark a Stress to temporarily Restrain the target and force them to mark 2 Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json b/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json index a85d9bf2..5b2d2e41 100644 --- a/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json +++ b/src/packs/adversaries/adversary_Cave_Ogre_8Zkqk1jU09nKL2fy.json @@ -230,14 +230,14 @@ "_id": "ynuyMl1sMQYINfcQ", "img": "icons/weapons/clubs/club-spiked-glowing.webp", "system": { - "description": "

    You must spend a Fear to spotlight the Ogre. While spotlighted, they can make their standard attack against all targets within range.

    ", + "description": "

    You must spend a Fear to spotlight the @Lookup[@name]. While spotlighted, they can make their standard attack against all targets within range.

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

    You must spend a Fear to spotlight the Ogre. While spotlighted, they can make their standard attack against all targets within range.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -286,7 +286,7 @@ "_id": "szu5YYQ6klkDbqAT", "img": "icons/skills/wounds/bone-broken-marrow-red.webp", "system": { - "description": "

    The Ogre’s attacks deal direct damage.

    ", + "description": "

    The @Lookup[@name]’s attacks deal direct damage.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -312,14 +312,14 @@ "_id": "zGvaBYJPOOnQVQEn", "img": "icons/magic/earth/projectile-stone-boulder-orange.webp", "system": { - "description": "

    Mark a Stress to pick up heavy objects and throw them at all targets in front of the Ogre within Far range. Make an attack against these targets. Targets the Ogre succeeds against take 1d10+2 physical damage. If they succeed against more than one target, you gain a Fear.

    @Template[type:inFront|range:f]

    ", + "description": "

    Mark a Stress to pick up heavy objects and throw them at all targets in front of the @Lookup[@name] within Far range. Make an attack against these targets. Targets the @Lookup[@name] succeeds against take 1d10+2 physical damage. If they succeed against more than one target, you gain a Fear.

    @Template[type:inFront|range:f]

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

    Mark a Stress to pick up heavy objects and throw them at all targets in front of the Ogre within Far range. Make an attack against these targets. Targets the Ogre succeeds against take 1d10+2 physical damage. If they succeed against more than one target, you gain a Fear.

    @Template[type:inFront|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -490,14 +490,14 @@ "_id": "Qxkddj6nQc4RDExW", "img": "icons/skills/melee/strike-flail-destructive-yellow.webp", "system": { - "description": "

    When the Ogre marks 2 or more HP, they can rampage. Move the Ogre to a point within Close range and deal 2d6+3 direct physical damage to all targets in their path.

    ", + "description": "

    When the @Lookup[@name] marks 2 or more HP, they can rampage. Move the @Lookup[@name] to a point within Close range and deal 2d6+3 direct physical damage to all targets in their path.

    ", "resource": null, "actions": { "PtTu9bnCJKMySBSV": { "type": "damage", "_id": "PtTu9bnCJKMySBSV", "systemPath": "actions", - "description": "

    When the Ogre marks 2 or more HP, they can rampage. Move the Ogre to a point within Close range and deal 2d6+3 direct physical damage to all targets in their path.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json b/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json index fabb0a14..f548870a 100644 --- a/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json +++ b/src/packs/adversaries/adversary_Chaos_Skull_jDmHqGvzg5wjgmxE.json @@ -221,7 +221,7 @@ "name": "Levitation", "type": "feature", "system": { - "description": "

    The Skull levitates several feet off the ground and can’t be Restrained.

    ", + "description": "

    The @Lookup[@name] levitates several feet off the ground and can’t be Restrained.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -290,7 +290,7 @@ "name": "Wards", "type": "feature", "system": { - "description": "

    The Skull is resistant to magic damage.

    ", + "description": "

    The @Lookup[@name] is resistant to magic damage.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -359,14 +359,14 @@ "name": "Magic Burst", "type": "feature", "system": { - "description": "

    Mark a Stress to make an attack against all targets within Close range. Targets the Skull succeeds against take 2d6+4 magic damage.

    @Template[type:emanation|range:c]

    ", + "description": "

    Mark a Stress to make an attack against all targets within Close range. Targets the @Lookup[@name] succeeds against take 2d6+4 magic damage.

    @Template[type:emanation|range:c]

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

    Mark a Stress to make an attack against all targets within Close range. Targets the Skull succeeds against take 2d6+4 magic damage.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -466,14 +466,14 @@ "name": "Siphon Magic", "type": "feature", "system": { - "description": "

    Spend a Fear to make an attack against a PC with a Spellcast trait within Very Close range. On a success, the target marks 1d4 Stress and the Skull clears that many Stress. Additionally, on a success, the Skull can immediately be spotlighted again.

    ", + "description": "

    Spend a Fear to make an attack against a PC with a Spellcast trait within Very Close range. On a success, the target marks 1d4 Stress and the @Lookup[@name] clears that many Stress. Additionally, on a success, the @Lookup[@name] can immediately be spotlighted again.

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

    Spend a Fear to make an attack against a PC with a Spellcast trait within Very Close range. On a success, the target marks 1d4 Stress and the Skull clears that many Stress. Additionally, on a success, the Skull can immediately be spotlighted again.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json b/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json index 9503a299..c5b4357d 100644 --- a/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json +++ b/src/packs/adversaries/adversary_Conscript_99TqczuQipBmaB8i.json @@ -214,7 +214,7 @@ "name": "Minion (6)", "type": "feature", "system": { - "description": "

    The Conscript is defeated when they take any damage. For every 6 damage a PC deals to the Conscript, defeat an additional Minion within range the attack would succeed against.

    ", + "description": "

    The @Lookup[@name] is defeated when they take any damage. For every 6 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -239,14 +239,14 @@ "name": "Group Attack", "type": "feature", "system": { - "description": "

    Spend a Fear to choose a target and spotlight all Conscripts within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 6 physical damage each. Combine this damage.

    ", + "description": "

    Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 6 physical damage each. Combine this damage.

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

    Spend a Fear to choose a target and spotlight all Conscripts within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 6 physical damage each. Combine this damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json b/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json index 428e2def..310eefce 100644 --- a/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json +++ b/src/packs/adversaries/adversary_Construct_uOP5oT9QzXPlnf3p.json @@ -223,14 +223,14 @@ "_id": "y3oUmDLGkcSjOO5Q", "img": "icons/magic/unholy/silhouette-evil-horned-giant.webp", "system": { - "description": "

    The Construct can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "

    The @Lookup[@name] can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

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

    The Construct can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -282,7 +282,7 @@ "_id": "p4HLIkiM3HsglRoA", "img": "icons/commodities/metal/barstock-broken-steel.webp", "system": { - "description": "

    When the Construct marks HP from physical damage, they must mark an additional HP.

    ", + "description": "

    When the @Lookup[@name] marks HP from physical damage, they must mark an additional HP.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -308,14 +308,14 @@ "_id": "93m085bEaKFzvEWT", "img": "icons/skills/movement/arrow-upward-blue.webp", "system": { - "description": "

    Mark a Stress to make an attack against all targets in the Construct’s path when they move. Targets the Construct succeeds against take 1d8 physical damage.

    ", + "description": "

    Mark a Stress to make an attack against all targets in the @Lookup[@name]’s path when they move. Targets the @Lookup[@name] succeeds against take 1d8 physical damage.

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

    Mark a Stress to make an attack against all targets in the Construct’s path when they move. Targets the Construct succeeds against take 1d8 physical damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -416,14 +416,14 @@ "_id": "EF6YIDjQ0liFubGA", "img": "icons/creatures/magical/construct-golem-stone-blue.webp", "system": { - "description": "

    Before rolling damage for the Construct’s attack, you can mark a Stress to gain a +10 bonus to the damage roll. The Construct can then take the spotlight again.

    ", + "description": "

    Before rolling damage for the @Lookup[@name]’s attack, you can mark a Stress to gain a +10 bonus to the damage roll. The @Lookup[@name] can then take the spotlight again.

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

    Before rolling damage for the Construct’s attack, you can mark a Stress to gain a +10 bonus to the damage roll. The Construct can then take the spotlight again.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -517,14 +517,14 @@ "_id": "UlGLuV1L33tDWkli", "img": "icons/magic/sonic/explosion-shock-wave-teal.webp", "system": { - "description": "

    When the Construct marks their last HP, the magic powering them ruptures in an explosion of force. Make an attack with advantage against all targets within Very Close range. Targets the Construct succeeds against take 1d12+2 magic damage.

    ", + "description": "

    When the @Lookup[@name] marks their last HP, the magic powering them ruptures in an explosion of force. Make an attack with advantage against all targets within Very Close range. Targets the @Lookup[@name] succeeds against take 1d12+2 magic damage.

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

    When the Construct marks their last HP, the magic powering them ruptures in an explosion of force. Make an attack with advantage against all targets within Very Close range. Targets the Construct succeeds against take 1d12+2 magic damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json b/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json index 470dc140..668cd943 100644 --- a/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json +++ b/src/packs/adversaries/adversary_Courtesan_ZxWaWPdzFIUPNC62.json @@ -232,14 +232,14 @@ "name": "Searing Glance", "type": "feature", "system": { - "description": "

    When a PC within Close range makes a Presence Roll, you can mark a Stress to cast a gaze toward the aftermath. On the target’s failure, they must mark 2 Stress and are Vulnerable until the scene ends or they succeed on a social action against the Courtesan. On the target’s success, they must mark a Stress.

    ", + "description": "

    When a PC within Close range makes a Presence Roll, you can mark a Stress to cast a gaze toward the aftermath. On the target’s failure, they must mark 2 Stress and are Vulnerable until the scene ends or they succeed on a social action against the @Lookup[@name]. On the target’s success, they must mark a Stress.

    ", "resource": null, "actions": { "dRtDCrAPLc1GYqBs": { "type": "damage", "_id": "dRtDCrAPLc1GYqBs", "systemPath": "actions", - "description": "

    When a PC within Close range makes a Presence Roll, you can mark a Stress to cast a gaze toward the aftermath. On the target’s failure, they must mark 2 Stress and are Vulnerable until the scene ends or they succeed on a social action against the Courtesan. On the target’s success, they must mark a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json b/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json index eabd803e..6721666f 100644 --- a/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json +++ b/src/packs/adversaries/adversary_Courtier_CBBuEXAlLKFMJdjg.json @@ -236,7 +236,7 @@ "type": "attack", "_id": "Yi3rvjj0Umqt5Z8j", "systemPath": "actions", - "description": "

    Mark a Stress to say something mocking and force a target within Close range to make a Presence Reaction Roll (14) to see if they can save face. On a failure, the target must mark 2 Stress and is Vulnerable until the scene ends.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -380,14 +380,14 @@ "_id": "Ux42ELBBuSYwm4yW", "img": "icons/skills/social/diplomacy-unity-alliance.webp", "system": { - "description": "

    Spend a Fear and target a PC. The Courtier convinces a crowd or prominent individual that the target is the cause of their current conflict or misfortune.

    ", + "description": "

    Spend a Fear and target a PC. The @Lookup[@name] convinces a crowd or prominent individual that the target is the cause of their current conflict or misfortune.

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

    Spend a Fear and target a PC. The Courtier convinces a crowd or prominent individual that the target is the cause of their current conflict or misfortune.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json b/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json index 587d980c..14eb579b 100644 --- a/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json +++ b/src/packs/adversaries/adversary_Cult_Adept_0NxCSugvKQ4W8OYZ.json @@ -239,7 +239,7 @@ "type": "attack", "_id": "TQv3o9sRnlDNbPyu", "systemPath": "actions", - "description": "

    Spend a Fear to make a standard attack against a target within range. On a success, the target must mark a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -364,14 +364,14 @@ "name": "Shroud of the Fallen", "type": "feature", "system": { - "description": "

    Mark a Stress to wrap an ally within Close range in a shroud of Protection until the Adept marks their last HP. While Protected, the target has resistance to all damage.

    ", + "description": "

    Mark a Stress to wrap an ally within Close range in a shroud of Protection until the @Lookup[@name] marks their last HP. While Protected, the target has resistance to all damage.

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

    Mark a Stress to wrap an ally within Close range in a shroud of Protection until the Adept marks their last HP. While Protected, the target has resistance to all damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -482,7 +482,7 @@ "type": "effect", "_id": "g4RDHrY0AEYXjH52", "systemPath": "actions", - "description": "

    Spend a Fear and choose a point within Far range. All targets within Close range of that point are Restrained in smoky chains until they break free with a successful Strength or Instinct Roll. A target Restrained by this feature must spend a Hope to make an action roll.

    @Template[type:circle|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -582,7 +582,7 @@ "type": "healing", "_id": "3tibqB97ooJesxf0", "systemPath": "actions", - "description": "

    Twice per scene, when a PC rolls a failure with Fear, clear a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json b/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json index 2dfb331d..57e7a7c7 100644 --- a/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json +++ b/src/packs/adversaries/adversary_Cult_Fang_tyBOpLfigAhI9bU3.json @@ -221,14 +221,14 @@ "name": "Shadow's Embrace", "type": "feature", "system": { - "description": "

    The Fang can climb and walk on vertical surfaces. Mark a Stress to move from one shadow to another within Far range.

    ", + "description": "

    The @Lookup[@name] can climb and walk on vertical surfaces. Mark a Stress to move from one shadow to another within Far range.

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

    The Fang can climb and walk on vertical surfaces. Mark a Stress to move from one shadow to another within Far range.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -276,14 +276,14 @@ "name": "Pick Off the Straggler", "type": "feature", "system": { - "description": "

    Mark a Stress to cause a target within Melee range to make an Instinct Reaction Roll. On a failure, the target must mark 2 Stress and is teleported with the Fang to a shadow within Far range, making them temporarily Vulnerable. On a success, the target must mark a Stress.

    ", + "description": "

    Mark a Stress to cause a target within Melee range to make an Instinct Reaction Roll. On a failure, the target must mark 2 Stress and is teleported with the @Lookup[@name] to a shadow within Far range, making them temporarily Vulnerable. On a success, the target must mark a Stress.

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

    Mark a Stress to cause a target within Melee range to make an Instinct Reaction Roll. On a failure, the target must mark 2 Stress and is teleported with the Fang to a shadow within Far range, making them temporarily Vulnerable. On a success, the target must mark a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json b/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json index 6078e25c..0e14a661 100644 --- a/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json +++ b/src/packs/adversaries/adversary_Cult_Initiate_zx99sOGTXicP4SSD.json @@ -214,7 +214,7 @@ "name": "Minion (6)", "type": "feature", "system": { - "description": "

    The Initiate is defeated when they take any damage. For every 6 damage a PC deals to the Initiate, defeat an additional Minion within range the attack would succeed against.

    ", + "description": "

    The @Lookup[@name] is defeated when they take any damage. For every 6 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -239,14 +239,14 @@ "name": "Group Attack", "type": "feature", "system": { - "description": "

    Spend a Fear to choose a target and spotlight all Cult Initiates within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 5 physical damage each. Combine this damage.

    ", + "description": "

    Spend a Fear to choose a target and spotlight all Cult @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 5 physical damage each. Combine this damage.

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

    Spend a Fear to choose a target and spotlight all Cult Initiates within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 5 physical damage each. Combine this damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json b/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json index 4fab7cb6..cd745eb6 100644 --- a/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json +++ b/src/packs/adversaries/adversary_Deeproot_Defender_9x2xY9zwc3xzbXo5.json @@ -235,7 +235,7 @@ "type": "damage", "_id": "55hCZsJQhJNcZ0lX", "systemPath": "actions", - "description": "

    Slam the ground, knocking all targets within Very Close range back to Far range. Each target knocked back this way must mark a Stress.

    @Template[type:emanation|range:vc]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -308,14 +308,14 @@ "_id": "rreGFW5TbhUoZf2T", "img": "icons/magic/nature/root-vine-entangled-hand.webp", "system": { - "description": "

    Make an attack against a target within Close range. On a success, spend a Fear to pull them into Melee range, deal 1d6+2 physical damage, and Restrain them until the Defender takes Severe damage.

    ", + "description": "

    Make an attack against a target within Close range. On a success, spend a Fear to pull them into Melee range, deal 1d6+2 physical damage, and Restrain them until the @Lookup[@name] takes Severe damage.

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

    Make an attack against a target within Close range. On a success, spend a Fear to pull them into Melee range, deal 1d6+2 physical damage, and Restrain them until the Defender takes Severe damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json b/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json index 38b5a23c..6bfb88a6 100644 --- a/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json +++ b/src/packs/adversaries/adversary_Demon_of_Avarice_pnyjIGxxvurcWmTv.json @@ -227,7 +227,7 @@ "name": "Money Talks", "type": "feature", "system": { - "description": "

    Attacks against the Demon are made with disadvantage unless the attacker spends a handful of gold. This Demon starts with a number of handfuls equal to the number of PCs. When a target marks HP from the Demon’s standard attack, they can spend a handful of gold instead of marking HP (1 handful per HP). Add a handful of gold to the Demon for each handful of gold spent by PCs on this feature.

    ", + "description": "

    Attacks against the @Lookup[@name] are made with disadvantage unless the attacker spends a handful of gold. This @Lookup[@name] starts with a number of handfuls equal to the number of PCs. When a target marks HP from the @Lookup[@name]’s standard attack, they can spend a handful of gold instead of marking HP (1 handful per HP). Add a handful of gold to the @Lookup[@name] for each handful of gold spent by PCs on this feature.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -252,7 +252,7 @@ "name": "Number Must Go Up", "type": "feature", "system": { - "description": "

    Add a bonus to the Demon’s attack rolls equal to the number of handfuls of gold they have.

    ", + "description": "

    Add a bonus to the @Lookup[@name]’s attack rolls equal to the number of handfuls of gold they have.

    ", "resource": { "type": "simple", "value": 0, diff --git a/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json b/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json index c9e9579a..b1804074 100644 --- a/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json +++ b/src/packs/adversaries/adversary_Demon_of_Despair_kE4dfhqmIQpNd44e.json @@ -227,7 +227,7 @@ "name": "Depths of Despair", "type": "feature", "system": { - "description": "

    The Demon deals double damage to PCs with 0 Hope.

    ", + "description": "

    The @Lookup[@name] deals double damage to PCs with 0 Hope.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -259,7 +259,7 @@ "type": "effect", "_id": "n0RYO05pROFU6ov3", "systemPath": "actions", - "description": "

    Spend a Fear to weigh down the spirits of all PCs within Far range. All targets affected replace their Hope Die with a d8 until they roll a success with Hope or their next rest.

    @Template[type:emanation|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -357,7 +357,7 @@ "type": "damage", "_id": "urrp8SCFgqbmSTvm", "systemPath": "actions", - "description": "

    When a PC fails with Fear, you can mark a Stress to cause all other PCs within Close range to lose a Hope.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -436,14 +436,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

    When the Demon makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "N0Xx6GnijLXIMGBw": { "type": "healing", "_id": "N0Xx6GnijLXIMGBw", "systemPath": "actions", - "description": "

    When the Demon makes a successful attack against a PC, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json b/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json index be8f3eab..16bc1d1f 100644 --- a/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json +++ b/src/packs/adversaries/adversary_Demon_of_Hubris_2VN3BftageoTTIzu.json @@ -227,14 +227,14 @@ "name": "Terrifying", "type": "feature", "system": { - "description": "

    When the Demon makes a successful attack, all PCs within Far range must lose a Hope and you gain a Fear.

    @Template[type:emanation|range:f]

    ", + "description": "

    When the @Lookup[@name] makes a successful attack, all PCs within Far range must lose a Hope and you gain a Fear.

    @Template[type:emanation|range:f]

    ", "resource": null, "actions": { "v3XbljQeHEyfuSXz": { "type": "damage", "_id": "v3XbljQeHEyfuSXz", "systemPath": "actions", - "description": "

    When the Demon makes a successful attack, all PCs within Far range must lose a Hope and you gain a Fear.

    @Template[type:emanation|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -319,7 +319,7 @@ "type": "damage", "_id": "nNfWqBgysVPtFh4w", "systemPath": "actions", - "description": "

    When a PC within Far range fails a roll, they can choose to reroll their Fear Die and take the new result. If they still fail, they mark 2 Stress and the Demon clears a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -390,14 +390,14 @@ "name": "Unparalleled Skill", "type": "feature", "system": { - "description": "

    Mark a Stress to deal the Demon’s standard attack damage to a target within Close range.

    ", + "description": "

    Mark a Stress to deal the @Lookup[@name]’s standard attack damage to a target within Close range.

    ", "resource": null, "actions": { "MYOD2VAfdVC6hMCs": { "type": "damage", "_id": "MYOD2VAfdVC6hMCs", "systemPath": "actions", - "description": "

    Mark a Stress to deal the Demon’s standard attack damage to a target within Close range.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -484,7 +484,7 @@ "type": "effect", "_id": "ozGST8UY2MJnrd3w", "systemPath": "actions", - "description": "

    Spend a Fear to spotlight two other Demons within Far range.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -533,14 +533,14 @@ "name": "You Pale in Comparison", "type": "feature", "system": { - "description": "

    When a PC fails a roll within Close range of the Demon, they must mark a Stress.

    @Template[type:emanation|range:c]

    ", + "description": "

    When a PC fails a roll within Close range of the @Lookup[@name], they must mark a Stress.

    @Template[type:emanation|range:c]

    ", "resource": null, "actions": { "kuCPWb9cu3pZdAhh": { "type": "damage", "_id": "kuCPWb9cu3pZdAhh", "systemPath": "actions", - "description": "

    When a PC fails a roll within Close range of the Demon, they must mark a Stress.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json b/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json index 7e3b5c6d..31f9b942 100644 --- a/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json +++ b/src/packs/adversaries/adversary_Demon_of_Jealousy_SxSOkM4bcVOFyjbo.json @@ -228,7 +228,7 @@ "name": "Unprotected Mind", "type": "feature", "system": { - "description": "

    The Demon’s standard attack deals direct damage.

    ", + "description": "

    The @Lookup[@name]’s standard attack deals direct damage.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -253,7 +253,7 @@ "name": "My Turn", "type": "feature", "system": { - "description": "

    When the Demon marks HP from an attack, spend a number of Fear equal to the HP marked by the Demon to cause the attacker to mark the same number of HP.

    ", + "description": "

    When the @Lookup[@name] marks HP from an attack, spend a number of Fear equal to the HP marked by the @Lookup[@name] to cause the attacker to mark the same number of HP.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -286,7 +286,7 @@ "type": "effect", "_id": "UU3H5aPQejOSoFZw", "systemPath": "actions", - "description": "

    When a creature within Close range takes damage from a different adversary, you can mark a Stress to add a d4 to the damage roll.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -335,14 +335,14 @@ "name": "What's Yours Is Mine", "type": "feature", "system": { - "description": "

    When a PC takes Severe damage within Very Close range of the Demon, you can spend a Fear to cause the target to make a Finesse Reaction Roll. On a failure, the Demon seizes one item or consumable of their choice from the target’s inventory.

    @Template[type:emanation|range:vc]

    ", + "description": "

    When a PC takes Severe damage within Very Close range of the @Lookup[@name], you can spend a Fear to cause the target to make a Finesse Reaction Roll. On a failure, the @Lookup[@name] seizes one item or consumable of their choice from the target’s inventory.

    @Template[type:emanation|range:vc]

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

    When a PC takes Severe damage within Very Close range of the Demon, you can spend a Fear to cause the target to make a Finesse Reaction Roll. On a failure, the Demon seizes one item or consumable of their choice from the target’s inventory.

    @Template[type:emanation|range:vc]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json b/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json index 538c0d0a..9e838d6d 100644 --- a/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json +++ b/src/packs/adversaries/adversary_Demon_of_Wrath_5lphJAgzoqZI3VoG.json @@ -228,7 +228,7 @@ "name": "Anger Unrelenting", "type": "feature", "system": { - "description": "

    The Demon’s attacks deal direct damage.

    ", + "description": "

    The @Lookup[@name]’s attacks deal direct damage.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -260,7 +260,7 @@ "type": "effect", "_id": "V142qYppCGJn8OiN", "systemPath": "actions", - "description": "

    Spend a Fear to boil the blood of all PCs within Far range. They use a d20 as their Fear Die until the end of the scene.

    @Template[type:emanation|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -309,14 +309,14 @@ "name": "Retalliation", "type": "feature", "system": { - "description": "

    When the Demon takes damage from an attack within Close range, you can mark a Stress to make a standard attack against the attacker.

    @Template[type:emanation|range:c]

    ", + "description": "

    When the @Lookup[@name] takes damage from an attack within Close range, you can mark a Stress to make a standard attack against the attacker.

    @Template[type:emanation|range:c]

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

    When the Demon takes damage from an attack within Close range, you can mark a Stress to make a standard attack against the attacker.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -417,14 +417,14 @@ "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 @Lookup[@name]. 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": { "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.

    ", + "description": "

    Countdown (Loop 6). Activate the first time an attack is made within sight of the @Lookup[@name]. It ticks down when a PC takes a violent action.

    ", "chatDisplay": true, "originItem": { "type": "itemCollection" diff --git a/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json b/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json index cf982cda..2947b7a1 100644 --- a/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json +++ b/src/packs/adversaries/adversary_Demonic_Hound_Pack_NoRZ1PqB8N5wcIw0.json @@ -227,7 +227,7 @@ "name": "Horde (2d4+1)", "type": "feature", "system": { - "description": "

    When the Pack has marked half or more of their HP, their standard attack deals 2d4+1 physical damage instead.

    ", + "description": "

    When the @Lookup[@name] has marked half or more of their HP, their standard attack deals 2d4+1 physical damage instead.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -259,7 +259,7 @@ "type": "damage", "_id": "XyLlX9RWSxciZ7oV", "systemPath": "actions", - "description": "

    Mark a Stress to make all targets within Very Close range lose a Hope. If a target is not able to lose a Hope, they must instead mark 2 Stress.

    @Template[type:emanation|range:vc]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -331,14 +331,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

    When the Pack makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "BApDkAKPfyBkqrKY": { "type": "healing", "_id": "BApDkAKPfyBkqrKY", "systemPath": "actions", - "description": "

    When the Pack makes a successful attack against a PC, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "reaction", "cost": [], diff --git a/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json b/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json index 91f4d795..16ec7643 100644 --- a/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json +++ b/src/packs/adversaries/adversary_Dire_Bat_tBWHW00epmMnkawe.json @@ -226,7 +226,7 @@ "name": "Flying", "type": "feature", "system": { - "description": "

    While flying, the Bat gains a +3 bonus to their Difficulty.

    ", + "description": "

    While flying, the @Lookup[@name] gains a +3 bonus to their Difficulty.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -295,14 +295,14 @@ "name": "Screech", "type": "feature", "system": { - "description": "

    Mark a Stress to send a high-pitch screech out toward all targets in front of the Bat within Far range. Those targets must mark 1d4 Stress.

    @Template[type:inFront|range:f]

    ", + "description": "

    Mark a Stress to send a high-pitch screech out toward all targets in front of the @Lookup[@name] within Far range. Those targets must mark 1d4 Stress.

    @Template[type:inFront|range:f]

    ", "resource": null, "actions": { "2ILfoiBoMyBCtBsL": { "type": "damage", "_id": "2ILfoiBoMyBCtBsL", "systemPath": "actions", - "description": "

    Mark a Stress to send a high-pitch screech out toward all targets in front of the Bat within Far range. Those targets must mark 1d4 Stress.

    @Template[type:inFront|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -380,7 +380,7 @@ "type": "attack", "_id": "wW7WGisUBzyxjsH2", "systemPath": "actions", - "description": "

    When an allied Vampire marks HP, you can mark a Stress to fl y into Melee range of the attacker and make an attack with advantage against them. On a success, deal 2d6+2 physical damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json b/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json index 5028e88c..e3ecda4e 100644 --- a/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json +++ b/src/packs/adversaries/adversary_Dire_Wolf_wNzeuQLfLUMvgHlQ.json @@ -229,14 +229,14 @@ "_id": "wQXEnMqrl2jo91oy", "img": "icons/creatures/abilities/wolf-howl-moon-purple.webp", "system": { - "description": "

    If the Wolf makes a successful standard attack and another Dire Wolf is within Melee range of the target, deal 1d6+5 physical damage instead of their standard damage and you gain a Fear.

    ", + "description": "

    If the @Lookup[@name] makes a successful standard attack and another @Lookup[@name] is within Melee range of the target, deal 1d6+5 physical damage instead of their standard damage and you gain a Fear.

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

    If the Wolf makes a successful standard attack and another Dire Wolf is within Melee range of the target, deal 1d6+5 physical damage instead of their standard damage and you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "passive", "cost": [], @@ -335,7 +335,7 @@ "type": "attack", "_id": "Tvizq1jEfG8FyfNc", "systemPath": "actions", - "description": "

    Mark a Stress to make an attack against a target within Melee range. On a success, deal 3d4+10 direct physical damage and make them Vulnerable until they clear at least 1 HP.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json b/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json index 2b1596da..f0a5d81c 100644 --- a/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json +++ b/src/packs/adversaries/adversary_Dryad_wR7cFKrHvRzbzhBT.json @@ -227,14 +227,14 @@ "name": "Bramble Patch", "type": "feature", "system": { - "description": "

    Mark a Stress to target a point within Far range. Create a patch of thorns that covers an area within Close range of that point. All targets within that area take 2d6+2 physical damage when they act. A target must succeed on a Finesse Roll or deal more than 20 damage to the Dryad with an attack to leave the area.

    @Template[type:circle|range:c]

    ", + "description": "

    Mark a Stress to target a point within Far range. Create a patch of thorns that covers an area within Close range of that point. All targets within that area take 2d6+2 physical damage when they act. A target must succeed on a Finesse Roll or deal more than 20 damage to the @Lookup[@name] with an attack to leave the area.

    @Template[type:circle|range:c]

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

    Mark a Stress to target a point within Far range. Create a patch of thorns that covers an area within Close range of that point. All targets within that area take 2d6+2 physical damage when they act. A target must succeed on a Finesse Roll or deal more than 20 damage to the Dryad with an attack to leave the area.

    @Template[type:circle|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -367,7 +367,7 @@ "type": "effect", "_id": "84Q2b0zIY9c7Yhho", "systemPath": "actions", - "description": "

    Spend a Fear to grow three @UUID[Compendium.daggerheart.adversaries.Actor.o63nS0k3wHu6EgKP]{Treant Sapling Minions}, who appear at Close range and immediately take the spotlight.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json b/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json index 73074ca1..7b41b9e5 100644 --- a/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json +++ b/src/packs/adversaries/adversary_Electric_Eels_TLzY1nDw0Bu9Ud40.json @@ -221,7 +221,7 @@ "name": "Horde (2d4+1)", "type": "feature", "system": { - "description": "

    When the Eels have marked half or more of their HP, their standard attack deals 2d4+1 physical damage instead.

    ", + "description": "

    When the @Lookup[@name] have marked half or more of their HP, their standard attack deals 2d4+1 physical damage instead.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -253,7 +253,7 @@ "type": "attack", "_id": "L4Rpg7fnFuxpD3im", "systemPath": "actions", - "description": "

    Mark a Stress to make a standard attack against all targets within Very Close range. You gain a Fear for each target that marks HP.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json b/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json index 1a265528..b17cae1c 100644 --- a/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json +++ b/src/packs/adversaries/adversary_Elemental_Spark_P7h54ZePFPHpYwvB.json @@ -214,7 +214,7 @@ "name": "Minion (9)", "type": "feature", "system": { - "description": "

    The Elemental is defeated when they take any damage. For every 9 damage a PC deals to the Elemental, defeat an additional Minion within range the attack would succeed against.

    ", + "description": "

    The @Lookup[@name] is defeated when they take any damage. For every 9 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -239,7 +239,7 @@ "name": "Group Attack", "type": "feature", "system": { - "description": "

    Spend a Fear to choose a target and spotlight all Elemental Sparks within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 5 physical damage each. Combine this damage.

    ", + "description": "

    Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 5 physical damage each. Combine this damage.

    ", "resource": null, "actions": { "vXHZVb0Y7Hqu3uso": { diff --git a/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json b/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json index cc98f31d..de5db0b2 100644 --- a/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json +++ b/src/packs/adversaries/adversary_Elite_Soldier_bfhVWMBUh61b9J6n.json @@ -259,7 +259,7 @@ "type": "attack", "_id": "XquYMA2xJZUKSmXQ", "systemPath": "actions", - "description": "

    Mark a Stress to move into Melee range of an ally and make a standard attack against a target within Very Close range. On a success, deal 2d10+2 physical damage and the ally can clear a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -359,14 +359,14 @@ "name": "Vassal's Loyalty", "type": "feature", "system": { - "description": "

    When the Soldier is within Very Close range of a knight or other noble who would take damage, you can mark a Stress to move into Melee range of them and take the damage instead.

    ", + "description": "

    When the @Lookup[@name] is within Very Close range of a knight or other noble who would take damage, you can mark a Stress to move into Melee range of them and take the damage instead.

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

    When the Soldier is within Very Close range of a knight or other noble who would take damage, you can mark a Stress to move into Melee range of them and take the damage instead.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json b/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json index 89c922f4..39800002 100644 --- a/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json +++ b/src/packs/adversaries/adversary_Failed_Experiment_ChwwVqowFw8hJQwT.json @@ -227,7 +227,7 @@ "name": "Warped Fortitude", "type": "feature", "system": { - "description": "

    The Experiment is resistant to physical damage.

    ", + "description": "

    The @Lookup[@name] is resistant to physical damage.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -296,7 +296,7 @@ "name": "Overwhelm", "type": "feature", "system": { - "description": "

    When a target the Experiment attacks has other adversaries within Very Close range, the Experiment deals double damage.

    ", + "description": "

    When a target the @Lookup[@name] attacks has other adversaries within Very Close range, the @Lookup[@name] deals double damage.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -321,14 +321,14 @@ "name": "Lurching Lunge", "type": "feature", "system": { - "description": "

    Mark a Stress to spotlight the Experiment as an additional GM move instead of spending Fear.

    ", + "description": "

    Mark a Stress to spotlight the @Lookup[@name] as an additional GM move instead of spending Fear.

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

    Mark a Stress to spotlight the Experiment as an additional GM move instead of spending Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json b/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json index 9833a495..163c61f7 100644 --- a/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json +++ b/src/packs/adversaries/adversary_Fallen_Shock_Troop_OsLG2BjaEdTZUJU9.json @@ -214,7 +214,7 @@ "name": "Minion (12)", "type": "feature", "system": { - "description": "

    The Shock Troop is defeated when they take any damage. For every 12 damage a PC deals to the Shock Troop, defeat an additional Minion within range the attack would succeed against.

    ", + "description": "

    The @Lookup[@name] is defeated when they take any damage. For every 12 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -239,7 +239,7 @@ "name": "Aura of Doom", "type": "feature", "system": { - "description": "

    When a PC marks HP from an attack by the Shock Troop, they lose a Hope.

    ", + "description": "

    When a PC marks HP from an attack by the @Lookup[@name], they lose a Hope.

    ", "resource": null, "actions": { "HcGa2nD0WziA0lFP": { @@ -317,14 +317,14 @@ "name": "Group Attack", "type": "feature", "system": { - "description": "

    Spend a Fear to choose a target and spotlight all Fallen Shock Troops within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 12 physical damage each. Combine this damage.

    ", + "description": "

    Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 12 physical damage each. Combine this damage.

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

    Spend a Fear to choose a target and spotlight all Fallen Shock Troops within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 12 physical damage each. Combine this damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json b/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json index 9c63042e..fc064958 100644 --- a/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json +++ b/src/packs/adversaries/adversary_Fallen_Sorcerer_PELRry1vqjBzSAlr.json @@ -227,14 +227,14 @@ "name": "Conflagration", "type": "feature", "system": { - "description": "

    Spend a Fear to unleash an all-consuming f i restorm and make an attack against all targets within Close range. Targets the Sorcerer succeeds against take 2d10+6 direct magic damage.

    @Template[type:emanation|range:c]

    ", + "description": "

    Spend a Fear to unleash an all-consuming firestorm and make an attack against all targets within Close range. Targets the @Lookup[@name] succeeds against take 2d10+6 direct magic damage.

    @Template[type:emanation|range:c]

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

    Spend a Fear to unleash an all-consuming f i restorm and make an attack against all targets within Close range. Targets the Sorcerer succeeds against take 2d10+6 direct magic damage.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -341,7 +341,7 @@ "type": "effect", "_id": "mXWOpXcYALYqicTw", "systemPath": "actions", - "description": "

    Mark a Stress to trap a target within Far range in a powerful illusion of their worst fears. While trapped, the target is Restrained and Vulnerable until they break free, ending both conditions, with a successful Instinct Roll.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -428,7 +428,7 @@ "name": "Slippery", "type": "feature", "system": { - "description": "

    When the Sorcerer takes damage from an attack, they can teleport up to Far range.

    ", + "description": "

    When the @Lookup[@name] takes damage from an attack, they can teleport up to Far range.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -454,7 +454,7 @@ "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 @Lookup[@name] 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": { "7b0FkpAnWz9a5EWx": { @@ -518,7 +518,7 @@ "type": "countdown", "_id": "11PtfoxbgOXxNlkG", "systemPath": "actions", - "description": "

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

    ", + "description": "

    Countdown (Loop 2d6). When the @Lookup[@name] is in the spotlight for the first time, activate the countdown.

    ", "chatDisplay": true, "originItem": { "type": "itemCollection" 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 8b0d912d..b2cdc489 100644 --- a/src/packs/adversaries/adversary_Fallen_Warlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json +++ b/src/packs/adversaries/adversary_Fallen_Warlord__Realm_Breaker_hxZ0sgoFJubh5aj6.json @@ -262,14 +262,14 @@ "name": "Relentless (2)", "type": "feature", "system": { - "description": "

    The Realm-Breaker can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "

    The @Lookup[@name] can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

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

    The Realm-Breaker can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -320,14 +320,14 @@ "name": "Firespite Plate Armor", "type": "feature", "system": { - "description": "

    When the Realm-Breaker takes damage, reduce it by 2d10.

    ", + "description": "

    When the @Lookup[@name] takes damage, reduce it by 2d10.

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

    When the Realm-Breaker takes damage, reduce it by 2d10.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -399,7 +399,7 @@ "type": "attack", "_id": "zMVhUekP8pcyQGFR", "systemPath": "actions", - "description": "

    Mark a Stress to make a standard attack against all targets within Very Close range. When a target uses armor to reduce damage from this attack, they must mark 2 Armor Slots.

    @Template[type:emanation|range:vc]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -499,14 +499,14 @@ "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 @Lookup[@name] 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 @Lookup[@name] 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": { "rgy5wXyXJWh6uWxC": { "type": "attack", "_id": "rgy5wXyXJWh6uWxC", "systemPath": "actions", - "description": "

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

    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 @Lookup[@name] 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]

    ", "chatDisplay": true, "actionType": "action", "cost": [], @@ -579,7 +579,7 @@ "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.

    ", + "description": "

    Countdown (Decreasing 8). When the @Lookup[@name] is in the spotlight for the first time, activate the countdown.

    ", "chatDisplay": true, "originItem": { "type": "itemCollection" @@ -636,14 +636,14 @@ "name": "Doombringer", "type": "feature", "system": { - "description": "

    When a target marks HP from an attack by the Realm-Breaker, all PCs within Far range of the target must lose a Hope.

    @Template[type:emanation|range:f]

    ", + "description": "

    When a target marks HP from an attack by the @Lookup[@name], all PCs within Far range of the target must lose a Hope.

    @Template[type:emanation|range:f]

    ", "resource": null, "actions": { "WEBPJCbXfBeyHFJ4": { "type": "damage", "_id": "WEBPJCbXfBeyHFJ4", "systemPath": "actions", - "description": "

    When a target marks HP from an attack by the Realm-Breaker, all PCs within Far range of the target must lose a Hope.

    @Template[type:emanation|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -715,7 +715,7 @@ "name": "I Have Never Known Defeat", "type": "feature", "system": { - "description": "

    When the Realm-Breaker marks their last HP, replace them with the @UUID[Compendium.daggerheart.adversaries.Actor.RXkZTwBRi4dJ3JE5]{Fallen Warlord: Undefeated Champion} and immediately spotlight them.

    ", + "description": "

    When the @Lookup[@name] marks their last HP, replace them with the @UUID[Compendium.daggerheart.adversaries.Actor.RXkZTwBRi4dJ3JE5]{Fallen Warlord: Undefeated Champion} and immediately spotlight them.

    ", "resource": null, "actions": {}, "originItemType": null, 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 bc5ceee1..89d61c1c 100644 --- a/src/packs/adversaries/adversary_Fallen_Warlord__Undefeated_Champion_RXkZTwBRi4dJ3JE5.json +++ b/src/packs/adversaries/adversary_Fallen_Warlord__Undefeated_Champion_RXkZTwBRi4dJ3JE5.json @@ -263,14 +263,14 @@ "name": "Relentless (3)", "type": "feature", "system": { - "description": "

    The Undefeated Champion can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "

    The @Lookup[@name] can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

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

    The Undefeated Champion can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -321,14 +321,14 @@ "name": "Faltering Armor", "type": "feature", "system": { - "description": "

    When the Undefeated Champion takes damage, reduce it by 1d10.

    ", + "description": "

    When the @Lookup[@name] takes damage, reduce it by 1d10.

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

    When the Undefeated Champion takes damage, reduce it by 1d10.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -393,14 +393,14 @@ "name": "Shattering Strike", "type": "feature", "system": { - "description": "

    Mark a Stress to make a standard attack against all targets within Very Close range. PCs the Champion succeeds against lose a number of Hope equal to the HP they marked from this attack.

    @Template[type:emanation|range:vc]

    ", + "description": "

    Mark a Stress to make a standard attack against all targets within Very Close range. PCs the @Lookup[@name] succeeds against lose a number of Hope equal to the HP they marked from this attack.

    @Template[type:emanation|range:vc]

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

    Mark a Stress to make a standard attack against all targets within Very Close range. PCs the Champion succeeds against lose a number of Hope equal to the HP they marked from this attack.

    @Template[type:emanation|range:vc]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -500,7 +500,7 @@ "type": "effect", "_id": "hGMzqw00JTlYfHYy", "systemPath": "actions", - "description": "

    Spend a Fear to summon a number of @UUID[Compendium.daggerheart.adversaries.Actor.OsLG2BjaEdTZUJU9]{Fallen Shock Troops} equal to twice the number of PCs. The Shock Troops appear at Far range.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -549,14 +549,14 @@ "name": "Circle of Defilement", "type": "feature", "system": { - "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.

    ", + "description": "

    Countdown (1d8). When the @Lookup[@name] 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 @Lookup[@name]. A target within that area is Vulnerable until they leave the circle. The circle can be removed by dealing Severe damage to the @Lookup[@name].

    ", "resource": null, "actions": { "mHeYZ8e8MbkGz22d": { "type": "effect", "_id": "mHeYZ8e8MbkGz22d", "systemPath": "actions", - "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.

    ", + "description": "

    Activate a magical circle covering an area within Far range of the @Lookup[@name]. A target within that area is Vulnerable until they leave the circle. The circle can be removed by dealing Severe damage to the @Lookup[@name].

    ", "chatDisplay": true, "actionType": "action", "cost": [], @@ -583,7 +583,7 @@ "type": "countdown", "_id": "4x13WyksHU0u0j20", "systemPath": "actions", - "description": "

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

    ", + "description": "

    Countdown (1d8). When the @Lookup[@name] is in the spotlight for the first time, activate the countdown.

    ", "chatDisplay": true, "originItem": { "type": "itemCollection" @@ -679,14 +679,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

    When the Undefeated Champion makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "i1Wmh6Mok4Qsur00": { "type": "healing", "_id": "i1Wmh6Mok4Qsur00", "systemPath": "actions", - "description": "

    When the Undefeated Champion makes a successful attack against a PC, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "reaction", "cost": [], @@ -775,14 +775,14 @@ "name": "Doombringer", "type": "feature", "system": { - "description": "

    When a target marks HP from an attack by the Undefeated Champion, all PCs within Far range of the target lose a Hope.

    @Template[type:emanation|range:f]

    ", + "description": "

    When a target marks HP from an attack by the @Lookup[@name], all PCs within Far range of the target lose a Hope.

    @Template[type:emanation|range:f]

    ", "resource": null, "actions": { "liwKSCTmQqZasAf6": { "type": "damage", "_id": "liwKSCTmQqZasAf6", "systemPath": "actions", - "description": "

    When a target marks HP from an attack by the Undefeated Champion, all PCs within Far range of the target lose a Hope.

    @Template[type:emanation|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json b/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json index 52e27c88..6d09a490 100644 --- a/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json +++ b/src/packs/adversaries/adversary_Giant_Beastmaster_8VZIgU12cB3cvlyH.json @@ -227,7 +227,7 @@ "name": "Two as One", "type": "feature", "system": { - "description": "

    When the Beastmaster is spotlighted, you can also spotlight a Tier 1 animal adversary currently under their control.

    ", + "description": "

    When the @Lookup[@name] is spotlighted, you can also spotlight a Tier 1 animal adversary currently under their control.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -259,7 +259,7 @@ "type": "attack", "_id": "ErwQgU4dwBcmZIBX", "systemPath": "actions", - "description": "

    Make a standard attack against a target. On a success, you can mark a Stress to pin them to a nearby surface. The pinned target is Restrained until they break free with a successful Finesse or Strength Roll.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -394,14 +394,14 @@ "name": "Deadly Companion", "type": "feature", "system": { - "description": "

    Twice per scene, summon a Bear, Dire Wolf, or similar Tier 1 animal adversary under the Beastmaster’s control. The adversary appears at Close range and is immediately spotlighted.

    ", + "description": "

    Twice per scene, summon a Bear, Dire Wolf, or similar Tier 1 animal adversary under the @Lookup[@name]’s control. The adversary appears at Close range and is immediately spotlighted.

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

    Twice per scene, summon a @UUID[Compendium.daggerheart.adversaries.Actor.71qKDLKO3CsrNkdy]{Bear}, @UUID[Compendium.daggerheart.adversaries.Actor.wNzeuQLfLUMvgHlQ]{Dire Wolf} or similar Tier 1 animal adversary under the Beastmaster’s control. The adversary appears at Close range and is immediately spotlighted.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json b/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json index def13ed1..4f76b706 100644 --- a/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json +++ b/src/packs/adversaries/adversary_Giant_Brawler_YnObCleGjPT7yqEc.json @@ -227,14 +227,14 @@ "name": "Battering Ram", "type": "feature", "system": { - "description": "

    Mark a Stress to have the Brawler charge at an inanimate object within Close range they could feasibly smash (such as a wall, cart, or market stand) and destroy it. All targets within Very Close range of the object must succeed on an Agility Reaction Roll or take 2d4+3 physical damage from the shrapnel.

    @Template[type:circle|range:vc]

    ", + "description": "

    Mark a Stress to have the @Lookup[@name] charge at an inanimate object within Close range they could feasibly smash (such as a wall, cart, or market stand) and destroy it. All targets within Very Close range of the object must succeed on an Agility Reaction Roll or take 2d4+3 physical damage from the shrapnel.

    @Template[type:circle|range:vc]

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

    Mark a Stress to have the Brawler charge at an inanimate object within Close range they could feasibly smash (such as a wall, cart, or market stand) and destroy it. All targets within Very Close range of the object must succeed on an Agility Reaction Roll or take 2d4+3 physical damage from the shrapnel.

    @Template[type:circle|range:vc]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -334,14 +334,14 @@ "name": "Bloody Reprisal", "type": "feature", "system": { - "description": "

    When the Brawler marks 2 or more HP from an attack within Very Close range, you can make a standard attack against the attacker. On a success, the Brawler deals 2d6+15 physical damage instead of their standard damage.

    ", + "description": "

    When the @Lookup[@name] marks 2 or more HP from an attack within Very Close range, you can make a standard attack against the attacker. On a success, the @Lookup[@name] deals 2d6+15 physical damage instead of their standard damage.

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

    When the Brawler marks 2 or more HP from an attack within Very Close range, you can make a standard attack against the attacker. On a success, the Brawler deals 2d6+15 physical damage instead of their standard damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -434,14 +434,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

    When the Brawler makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "U2AfyadkJluHXA4r": { "type": "healing", "_id": "U2AfyadkJluHXA4r", "systemPath": "actions", - "description": "

    When the Brawler makes a successful attack against a PC you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "reaction", "cost": [], diff --git a/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json b/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json index 3b877a09..b0ba4170 100644 --- a/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json +++ b/src/packs/adversaries/adversary_Giant_Eagle_OMQ0v6PE8s1mSU0K.json @@ -252,7 +252,7 @@ "name": "Flight", "type": "feature", "system": { - "description": "

    While flying, the Eagle gains a +3 bonus to their Difficulty.

    ", + "description": "

    While flying, the @Lookup[@name] gains a +3 bonus to their Difficulty.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -328,7 +328,7 @@ "type": "attack", "_id": "KwsxjI3jBzmxgkPu", "systemPath": "actions", - "description": "

    Mark a Stress to attack a target within Far range. On a success, deal 2d10+2 physical damage and knock the target over, making them Vulnerable until they next act.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -472,14 +472,14 @@ "name": "Take Off", "type": "feature", "system": { - "description": "

    Make an attack against a target within Very Close range. On a success, deal 2d4+3 physical damage and the target must succeed on an Agility Reaction Roll or become temporarily Restrained within the Eagle’s massive talons. If the target is Restrained, the Eagle immediately lifts into the air to Very Far range above the battlefi eld while holding them.

    ", + "description": "

    Make an attack against a target within Very Close range. On a success, deal 2d4+3 physical damage and the target must succeed on an Agility Reaction Roll or become temporarily Restrained within the @Lookup[@name]’s massive talons. If the target is Restrained, the @Lookup[@name] immediately lifts into the air to Very Far range above the battlefi eld while holding them.

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

    Make an attack against a target within Very Close range. On a success, deal 2d4+3 physical damage and the target must succeed on an Agility Reaction Roll or become temporarily Restrained within the Eagle’s massive talons. If the target is Restrained, the Eagle immediately lifts into the air to Very Far range above the battlefi eld while holding them.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -616,14 +616,14 @@ "name": "Deadly Drop", "type": "feature", "system": { - "description": "

    While flying, the Eagle can drop a Restrained target they are holding. When dropped, the target is no longer Restrained but starts falling. If their fall isn’t prevented during the PCs’ next action, the target takes 2d20 physical damage when they land.

    ", + "description": "

    While flying, the @Lookup[@name] can drop a Restrained target they are holding. When dropped, the target is no longer Restrained but starts falling. If their fall isn’t prevented during the PCs’ next action, the target takes 2d20 physical damage when they land.

    ", "resource": null, "actions": { "1tO018UgL0VG51ti": { "type": "damage", "_id": "1tO018UgL0VG51ti", "systemPath": "actions", - "description": "

    While flying, the Eagle can drop a Restrained target they are holding. When dropped, the target is no longer Restrained but starts falling. If their fall isn’t prevented during the PCs’ next action, the target takes 2d20 physical damage when they land.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json b/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json index 842f4adf..54f12efa 100644 --- a/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json +++ b/src/packs/adversaries/adversary_Giant_Mosquitoes_IIWV4ysJPFPnTP7W.json @@ -229,7 +229,7 @@ "_id": "9RduwBLYcBaiouYk", "img": "icons/creatures/magical/humanoid-silhouette-aliens-green.webp", "system": { - "description": "

    When the Mosquitoes have marked half or more of their HP, their standard attack deals 1d4+1 physical damage instead.

    ", + "description": "

    When the @Lookup[@name] have marked half or more of their HP, their standard attack deals 1d4+1 physical damage instead.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -255,7 +255,7 @@ "_id": "gxYV6iTMM1S9Vv5v", "img": "icons/commodities/biological/wing-insect-green.webp", "system": { - "description": "

    While flying, the Mosquitoes have a +2 bonus to their Difficulty.

    ", + "description": "

    While flying, the @Lookup[@name] have a +2 bonus to their Difficulty.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -325,14 +325,14 @@ "_id": "BTlMLjG65KQs0Jk2", "img": "icons/skills/wounds/blood-drip-droplet-red.webp", "system": { - "description": "

    When the Mosquitoes’ attack causes a target to mark HP, you can mark a Stress to force the target to mark an additional HP.

    ", + "description": "

    When the @Lookup[@name]’s attack causes a target to mark HP, you can mark a Stress to force the target to mark an additional HP.

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

    When the Mosquitoes’ attack causes a target to mark HP, you can mark a Stress to force the target to mark an additional HP.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json b/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json index 26b5b232..d4655880 100644 --- a/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json +++ b/src/packs/adversaries/adversary_Giant_Rat_4PfLnaCrOcMdb4dK.json @@ -222,7 +222,7 @@ "_id": "v3AcLcWrXy2rtW4Z", "img": "icons/magic/symbols/runes-carved-stone-yellow.webp", "system": { - "description": "

    The Rat is defeated when they take any damage. For every 3 damage a PC deals to the Rat, defeat an additional Minion within range the attack would succeed against.

    ", + "description": "

    The @Lookup[@name] is defeated when they take any damage. For every 3 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -248,14 +248,14 @@ "_id": "fsaBlCjTdq1jM23G", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", "system": { - "description": "

    Spend a Fear to choose a target and spotlight all Giant Rats within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 1 physical damage each. Combine this damage.

    ", + "description": "

    Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 1 physical damage each. Combine this damage.

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

    Spend a Fear to choose a target and spotlight all Giant Rats within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 1 physical damage each. Combine this damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json b/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json index f926bd4b..75da96b2 100644 --- a/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json +++ b/src/packs/adversaries/adversary_Giant_Recruit_5s8wSvpyC5rxY5aD.json @@ -214,7 +214,7 @@ "name": "Minion (7)", "type": "feature", "system": { - "description": "

    The Recruit is defeated when they take any damage. For every 7 damage a PC deals to the Recruit, defeat an additional Minion within range the attack would succeed against.

    ", + "description": "

    The @Lookup[@name] is defeated when they take any damage. For every 7 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -239,14 +239,14 @@ "name": "Group Attack", "type": "feature", "system": { - "description": "

    Spend a Fear to choose a target and spotlight all Giant Recruits within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 5 physical damage each. Combine this damage.

    ", + "description": "

    Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 5 physical damage each. Combine this damage.

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

    Spend a Fear to choose a target and spotlight all Giant Recruits within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 5 physical damage each. Combine this damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json b/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json index cebcaced..99b5ed46 100644 --- a/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json +++ b/src/packs/adversaries/adversary_Giant_Scorpion_fmfntuJ8mHRCAktP.json @@ -236,7 +236,7 @@ "type": "attack", "_id": "PJbZ4ibLPle9BBRv", "systemPath": "actions", - "description": "

    Mark a Stress to make a standard attack against two targets within Melee range.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -344,7 +344,7 @@ "type": "attack", "_id": "ZkcplnqoMP7dH9F4", "systemPath": "actions", - "description": "

    Make an attack against a target within Very Close range. On a success, spend a Fear to deal 1d4+4 physical damage and Poison them until their next rest or they succeed on a Knowledge Roll (16). While Poisoned, the target must roll a d6 before they make an action roll. On a result of 4 or lower, they must mark a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -480,7 +480,7 @@ "_id": "TmDpAY5t3PjhEv9K", "img": "icons/skills/melee/strike-weapons-orange.webp", "system": { - "description": "

    When the Scorpion makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "1Fn4rvhueQoMXqFc": { diff --git a/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json b/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json index b730dc57..f02a1c52 100644 --- a/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json +++ b/src/packs/adversaries/adversary_Glass_Snake_8KWVLWXFhlY2kYx0.json @@ -223,14 +223,14 @@ "_id": "Efa6t9Ow8b1DRyZV", "img": "icons/skills/melee/shield-damaged-broken-gold.webp", "system": { - "description": "

    On a successful attack within Melee range against the Snake, the attacker must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

    ", + "description": "

    On a successful attack within Melee range against the @Lookup[@name], the attacker must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

    ", "resource": null, "actions": { "H1nUSOudbtha1lnC": { "type": "damage", "_id": "H1nUSOudbtha1lnC", "systemPath": "actions", - "description": "

    On a successful attack within Melee range against the Snake, the attacker must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -302,14 +302,14 @@ "_id": "Ro9XCeXsTOT9SXyo", "img": "icons/skills/melee/blood-slash-foam-red.webp", "system": { - "description": "

    Mark a Stress to make an attack against all targets within Very Close range. Targets the Snake succeeds against take 1d6+1 physical damage.

    ", + "description": "

    Mark a Stress to make an attack against all targets within Very Close range. Targets the @Lookup[@name] succeeds against take 1d6+1 physical damage.

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

    Mark a Stress to make an attack against all targets within Very Close range. Targets the Snake succeeds against take 1d6+1 physical damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -408,7 +408,7 @@ "_id": "LR5XHauNtWcl18CY", "img": "icons/magic/acid/projectile-needles-salvo-green.webp", "system": { - "description": "

    Spend a Fear to introduce a d6 Spitter Die. When the Snake is in the spotlight, roll this die. On a result of 5 or higher, all targets in front of the Snake within Far range must succeed on an Agility Reaction Roll or take 1d4 physical damage. The Snake can take the spotlight a second time this GM turn.

    @Template[type:inFront|range:f]

    ", + "description": "

    Spend a Fear to introduce a d6 Spitter Die. When the @Lookup[@name] is in the spotlight, roll this die. On a result of 5 or higher, all targets in front of the @Lookup[@name] within Far range must succeed on an Agility Reaction Roll or take 1d4 physical damage. The @Lookup[@name] can take the spotlight a second time this GM turn.

    @Template[type:inFront|range:f]

    ", "resource": null, "actions": { "yx5fjMLLwSnvSbqs": { @@ -449,7 +449,7 @@ "type": "attack", "_id": "Ds6KlQKZCOhh5OMT", "systemPath": "actions", - "description": "

    All targets in front of the Snake within Far range must succeed on an Agility Reaction Roll or take 1d4 physical damage.

    @Template[type:inFront|range:f]

    ", + "description": "

    All targets in front of the @Lookup[@name] within Far range must succeed on an Agility Reaction Roll or take 1d4 physical damage.

    @Template[type:inFront|range:f]

    ", "chatDisplay": true, "actionType": "action", "cost": [], @@ -522,7 +522,7 @@ "type": "attack", "_id": "xccwknU2xHUwQSdn", "systemPath": "actions", - "description": "

    When the Snake is in the spotlight, roll the spitter die. On a result of 5 or higher, do a spit Attack.

    ", + "description": "

    When the @Lookup[@name] is in the spotlight, roll the spitter die. On a result of 5 or higher, do a spit Attack.

    ", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json b/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json index b8e1012b..deeafa37 100644 --- a/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json +++ b/src/packs/adversaries/adversary_Gorgon_8mJYMpbLTb8qIOrr.json @@ -227,14 +227,14 @@ "name": "Relentless (2)", "type": "feature", "system": { - "description": "

    The Gorgon can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "

    The @Lookup[@name] can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

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

    The Gorgon can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -285,14 +285,14 @@ "name": "Sunsear Arrows", "type": "feature", "system": { - "description": "

    When the Gorgon makes a successful standard attack, the target Glows until the end of the scene and can’t become Hidden. Attack rolls made against a Glowing target have advantage.

    ", + "description": "

    When the @Lookup[@name] makes a successful standard attack, the target Glows until the end of the scene and can’t become Hidden. Attack rolls made against a Glowing target have advantage.

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

    When the Gorgon makes a successful standard attack, the target Glows until the end of the scene and can’t become Hidden. Attack rolls made against a Glowing target have advantage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -382,14 +382,14 @@ "name": "Crown of Serpents", "type": "feature", "system": { - "description": "

    Make an attack roll against a target within Melee range using the Gorgon’s protective snakes. On a success, mark a Stress to deal 2d10+4 physical damage and the target must mark a Stress.

    ", + "description": "

    Make an attack roll against a target within Melee range using the @Lookup[@name]’s protective snakes. On a success, mark a Stress to deal 2d10+4 physical damage and the target must mark a Stress.

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

    Make an attack roll against a target within Melee range using the Gorgon’s protective snakes. On a success, mark a Stress to deal 2d10+4 physical damage and the target must mark a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -507,14 +507,14 @@ "name": "Petrifying Gaze", "type": "feature", "system": { - "description": "

    When the Gorgon takes damage from an attack within Close range, you can spend a Fear to force the attacker to make an Instinct Reaction Roll. 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.

    ", + "description": "

    When the @Lookup[@name] takes damage from an attack within Close range, you can spend a Fear to force the attacker to make an Instinct Reaction Roll. On a failure, they begin to turn to stone, marking a HP and starting a Petrification Countdown (4). This countdown ticks down when the @Lookup[@name] is attacked. When it triggers, the target must make a death move. If the @Lookup[@name] is defeated, all petrification countdowns end.

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

    When the Gorgon takes damage from an attack within Close range, you can spend a Fear to force the attacker to make an Instinct Reaction Roll. 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.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -567,7 +567,7 @@ "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.

    ", + "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 @Lookup[@name] is attacked. When it triggers, the target must make a death move. If the @Lookup[@name] is defeated, all petrification countdowns end.

    ", "chatDisplay": false, "originItem": { "type": "itemCollection" @@ -624,14 +624,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

    When the Gorgon makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "V6tkBYSjOt1LZCkp": { "type": "healing", "_id": "V6tkBYSjOt1LZCkp", "systemPath": "actions", - "description": "

    When the Gorgon makes a successful attack against a PC, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "reaction", "cost": [], diff --git a/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json b/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json index ebb104f6..a20d80e6 100644 --- a/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json +++ b/src/packs/adversaries/adversary_Greater_Earth_Elemental_dsfB3YhoL5SudvS2.json @@ -221,7 +221,7 @@ "name": "Slow", "type": "feature", "system": { - "description": "

    When you spotlight the Elemental and they don’t have a token on their stat block, they can’t act yet. Place a token on their stat block and describe what they’re preparing to do. When you spotlight the Elemental and they have a token on their stat block, clear the token and they can act.

    ", + "description": "

    When you spotlight the @Lookup[@name] and they don’t have a token on their stat block, they can’t act yet. Place a token on their stat block and describe what they’re preparing to do. When you spotlight the @Lookup[@name] and they have a token on their stat block, clear the token and they can act.

    ", "resource": { "type": "simple", "value": 0, @@ -251,14 +251,14 @@ "name": "Crushing Blows", "type": "feature", "system": { - "description": "

    When the Elemental makes a successful attack, the target must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack, the target must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

    ", "resource": null, "actions": { "0sXciTiPc30v8czv": { "type": "damage", "_id": "0sXciTiPc30v8czv", "systemPath": "actions", - "description": "

    When the Elemental makes a successful attack, the target must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -329,7 +329,7 @@ "name": "Immovable Object", "type": "feature", "system": { - "description": "

    An attack that would move the Elemental moves them two fewer ranges (for example, Far becomes Very Close). When the Elemental takes physical damage, reduce it by 7.

    ", + "description": "

    An attack that would move the @Lookup[@name] moves them two fewer ranges (for example, Far becomes Very Close). When the @Lookup[@name] takes physical damage, reduce it by 7.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -398,14 +398,14 @@ "name": "Rockslide", "type": "feature", "system": { - "description": "

    Mark a Stress to create a rockslide that buries the land in front of Elemental within Close range with rockfall. All targets in this area must make an Agility Reaction Roll (19). Targets who fail take 2d12+5 physical damage and become Vulnerable until their next roll with Hope. Targets who succeed take half damage.

    @Template[type:inFront|range:c]

    ", + "description": "

    Mark a Stress to create a rockslide that buries the land in front of @Lookup[@name] within Close range with rockfall. All targets in this area must make an Agility Reaction Roll (19). Targets who fail take 2d12+5 physical damage and become Vulnerable until their next roll with Hope. Targets who succeed take half damage.

    @Template[type:inFront|range:c]

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

    Mark a Stress to create a rockslide that buries the land in front of Elemental within Close range with rockfall. All targets in this area must make an Agility Reaction Roll (19). Targets who fail take 2d12+5 physical damage and become Vulnerable until their next roll with Hope. Targets who succeed take half damage.

    @Template[type:inFront|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -549,14 +549,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

    When the Elemental makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "FPIpslusIeVQGdnb": { "type": "healing", "_id": "FPIpslusIeVQGdnb", "systemPath": "actions", - "description": "

    When the Elemental makes a successful attack against a PC, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "reaction", "cost": [], diff --git a/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json b/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json index 1ce86201..be037b10 100644 --- a/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json +++ b/src/packs/adversaries/adversary_Greater_Water_Elemental_xIICT6tEdnA7dKDV.json @@ -228,7 +228,7 @@ "type": "attack", "_id": "Gk5tcqshtwP4JsKS", "systemPath": "actions", - "description": "

    Mark a Stress to attack a target within Very Close range. On a success, deal 2d4+7 physical damage and the target’s next action has disadvantage. On a failure, the target must mark a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -377,14 +377,14 @@ "name": "Drowning Embrace", "type": "feature", "system": { - "description": "

    Spend a Fear to make an attack against all targets within Very Close range. Targets the Elemental succeeds against become Restrained and Vulnerable as they begin drowning. A target can break free, ending both conditions, with a successful Strength or Instinct Roll.

    @Template[type:emanation|range:vc]

    ", + "description": "

    Spend a Fear to make an attack against all targets within Very Close range. Targets the @Lookup[@name] succeeds against become Restrained and Vulnerable as they begin drowning. A target can break free, ending both conditions, with a successful Strength or Instinct Roll.

    @Template[type:emanation|range:vc]

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

    Spend a Fear to make an attack against all targets within Very Close range. Targets the Elemental succeeds against become Restrained and Vulnerable as they begin drowning. A target can break free, ending both conditions, with a successful Strength or Instinct Roll.

    @Template[type:emanation|range:vc]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -502,14 +502,14 @@ "name": "High Tide", "type": "feature", "system": { - "description": "

    When the Elemental makes a successful standard attack, you can mark a Stress to knock the target back to Close range.

    ", + "description": "

    When the @Lookup[@name] makes a successful standard attack, you can mark a Stress to knock the target back to Close range.

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

    When the Elemental makes a successful standard attack, you can mark a Stress to knock the target back to Close range.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json b/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json index eaaecf2f..c7446a11 100644 --- a/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json +++ b/src/packs/adversaries/adversary_Green_Ooze_SHXedd9zZPVfUgUa.json @@ -229,7 +229,7 @@ "_id": "DquXi9yCNsPAFEmK", "img": "icons/magic/time/hourglass-brown-orange.webp", "system": { - "description": "

    When you spotlight the Ooze and they don’t have a token on their stat block, they can’t act yet. Place a token on their stat block and describe what they’re preparing to do. When you spotlight the Ooze and they have a token on their stat block, clear the token and they can act.

    ", + "description": "

    When you spotlight the @Lookup[@name] and they don’t have a token on their stat block, they can’t act yet. Place a token on their stat block and describe what they’re preparing to do. When you spotlight the @Lookup[@name] and they have a token on their stat block, clear the token and they can act.

    ", "resource": { "type": "simple", "value": 0, @@ -260,14 +260,14 @@ "_id": "gJWoUSTGwVsJwPmK", "img": "icons/skills/melee/shield-damaged-broken-gold.webp", "system": { - "description": "

    When the Ooze makes a successful attack, the target must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack, the target must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

    ", "resource": null, "actions": { "nU4xpjruOvskcmiA": { "type": "damage", "_id": "nU4xpjruOvskcmiA", "systemPath": "actions", - "description": "

    When the Ooze makes a successful attack, the target must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -339,14 +339,14 @@ "_id": "Sm9Sk4mSvcq6PkmR", "img": "icons/creatures/slimes/slime-face-melting-green.webp", "system": { - "description": "

    Make a standard attack against a target within Melee range. On a success, the Ooze envelops them and the target must mark 2 Stress. The target must mark an additional Stress when they make an action roll. If the Ooze takes Severe damage, the target is freed.

    ", + "description": "

    Make a standard attack against a target within Melee range. On a success, the @Lookup[@name] envelops them and the target must mark 2 Stress. The target must mark an additional Stress when they make an action roll. If the @Lookup[@name] takes Severe damage, the target is freed.

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

    Make a standard attack against a target within Melee range. On a success, the Ooze envelops them and the target must mark 2 Stress. The target must mark an additional Stress when they make an action roll. If the Ooze takes Severe damage, the target is freed.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -507,14 +507,14 @@ "_id": "qNhrEK2YF8e3ljU6", "img": "icons/creatures/slimes/slime-movement-pseudopods-green.webp", "system": { - "description": "

    When the Ooze has 3 or more HP marked, you can spend a Fear to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.aLkLFuVoKz2NLoBK]{Tiny Green Oozes} (with no marked HP or Stress). Immediately spotlight both of them.

    ", + "description": "

    When the @Lookup[@name] has 3 or more HP marked, you can spend a Fear to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.aLkLFuVoKz2NLoBK]{Tiny Green Oozes} (with no marked HP or Stress). Immediately spotlight both of them.

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

    When the Ooze has 3 or more HP marked, you can spend a Fear to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.aLkLFuVoKz2NLoBK]{Tiny Green Oozes} (with no marked HP or Stress). Immediately spotlight both of them.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json b/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json index e9a1a19f..0abf1661 100644 --- a/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json +++ b/src/packs/adversaries/adversary_Hallowed_Archer_kabueAo6BALApWqp.json @@ -221,7 +221,7 @@ "name": "Punish the Guilty", "type": "feature", "system": { - "description": "

    The Archer deals double damage to targets marked Guilty by a High Seraph.

    ", + "description": "

    The @Lookup[@name] deals double damage to targets marked Guilty by a High Seraph.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -253,7 +253,7 @@ "type": "attack", "_id": "pQLfy0I6sZhgAoIm", "systemPath": "actions", - "description": "

    Mark a Stress to make a standard attack against up to three targets.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json b/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json index f84daf3c..cceed989 100644 --- a/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json +++ b/src/packs/adversaries/adversary_Hallowed_Soldier_VENwg7xEFcYObjmT.json @@ -214,7 +214,7 @@ "name": "Minion (13)", "type": "feature", "system": { - "description": "

    The Soldier is defeated when they take any damage. For every 13 damage a PC deals to the Soldier, defeat an additional Minion within range the attack would succeed against.

    ", + "description": "

    The @Lookup[@name] is defeated when they take any damage. For every 13 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -239,14 +239,14 @@ "name": "Divine Flight", "type": "feature", "system": { - "description": "

    While the Soldier is flying, spend a Fear to move up to Far range instead of Close range before taking an action.

    ", + "description": "

    While the @Lookup[@name] is flying, spend a Fear to move up to Far range instead of Close range before taking an action.

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

    While the Soldier is flying, spend a Fear to move up to Far range instead of Close range before taking an action.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -294,14 +294,14 @@ "name": "Group Attack", "type": "feature", "system": { - "description": "

    Spend a Fear to choose a target and spotlight all Hallowed Soldiers within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 10 physical damage each. Combine this damage.

    ", + "description": "

    Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 10 physical damage each. Combine this damage.

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

    Spend a Fear to choose a target and spotlight all Hallowed Soldiers within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 10 physical damage each. Combine this damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json b/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json index 105c5afd..89d82a0b 100644 --- a/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json +++ b/src/packs/adversaries/adversary_Harrier_uRtghKE9mHlII4rs.json @@ -228,7 +228,7 @@ "_id": "t9Fa5jKLhvjD8Ar2", "img": "icons/skills/movement/arrow-upward-blue.webp", "system": { - "description": "

    After making a standard attack, the Harrier can move anywhere within Far range.

    ", + "description": "

    After making a standard attack, the @Lookup[@name] can move anywhere within Far range.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -261,7 +261,7 @@ "type": "attack", "_id": "FiuiLUbNUL0YKq7w", "systemPath": "actions", - "description": "

    When a creature moves into Melee range to make an attack, you can mark a Stress before the attack roll to move anywhere within Close range and make an attack against that creature. On a success, deal 1d10+2 physical damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json b/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json index 48ff14a8..75afed49 100644 --- a/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json +++ b/src/packs/adversaries/adversary_Head_Guard_mK3A5FTx6k8iPU3F.json @@ -234,14 +234,14 @@ "_id": "SsgN2qSYpQLR43Cz", "img": "icons/skills/movement/arrows-up-trio-red.webp", "system": { - "description": "

    Spend 2 Fear to spotlight the Head Guard and up to 2d4 allies within Far range.

    @Template[type:emanation|range:f]

    ", + "description": "

    Spend 2 Fear to spotlight the @Lookup[@name] and up to 2d4 allies within Far range.

    @Template[type:emanation|range:f]

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

    Spend 2 Fear to spotlight the Head Guard and up to 2d4 allies within Far range.

    @Template[type:emanation|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -315,14 +315,14 @@ "_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 @Lookup[@name] 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": { "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.

    ", + "description": "", "chatDisplay": true, "originItem": { "type": "itemCollection" @@ -380,14 +380,14 @@ "_id": "sd2OlhLchyoqeKke", "img": "icons/skills/melee/strike-weapons-orange.webp", "system": { - "description": "

    When the Head Guard makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "tD1hAwP6scxXrouw": { "type": "healing", "_id": "tD1hAwP6scxXrouw", "systemPath": "actions", - "description": "

    When the Head Guard makes a successful attack against a PC, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "reaction", "cost": [], diff --git a/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json b/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json index d010ee34..9e948594 100644 --- a/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json +++ b/src/packs/adversaries/adversary_Head_Vampire_i2UNbRvgyoSs07M6.json @@ -227,14 +227,14 @@ "name": "Terrifying", "type": "feature", "system": { - "description": "

    When the Vampire makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

    @Template[type:emanation|range:f]

    ", + "description": "

    When the @Lookup[@name] makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

    @Template[type:emanation|range:f]

    ", "resource": null, "actions": { "Rf2ZL3EjCzudonRb": { "type": "damage", "_id": "Rf2ZL3EjCzudonRb", "systemPath": "actions", - "description": "

    When the Vampire makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

    @Template[type:emanation|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -305,14 +305,14 @@ "name": "Look into My Eyes", "type": "feature", "system": { - "description": "

    A creature who moves into Melee range of the Vampire must make an Instinct Reaction Roll. On a failure, you gain [[/r 1d4]] Fear.

    ", + "description": "

    A creature who moves into Melee range of the @Lookup[@name] must make an Instinct Reaction Roll. On a failure, you gain [[/r 1d4]] Fear.

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

    A creature who moves into Melee range of the Vampire must make an Instinct Reaction Roll. On a failure, you gain [[/r 1d4]] Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -377,14 +377,14 @@ "name": "Feed on Followers", "type": "feature", "system": { - "description": "

    When the Vampire is within Melee range of an ally, they can cause the ally to mark a HP. The Vampire then clears a HP.

    ", + "description": "

    When the @Lookup[@name] is within Melee range of an ally, they can cause the ally to mark a HP. The @Lookup[@name] then clears a HP.

    ", "resource": null, "actions": { "tM6TBTtmCXTnIzen": { "type": "healing", "_id": "tM6TBTtmCXTnIzen", "systemPath": "actions", - "description": "

    When the Vampire is within Melee range of an ally, they can cause the ally to mark a HP. The Vampire then clears a HP.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -478,7 +478,7 @@ "type": "effect", "_id": "5Q6RMUTiauKw0tDj", "systemPath": "actions", - "description": "

    Spend 2 Fear to summon [[/r 1d4]] @UUID[Compendium.daggerheart.adversaries.Actor.WWyUp6Mxl1S3KYUG]{Vampires}, who appear at Far range and immediately take the spotlight.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -527,14 +527,14 @@ "name": "Lifesuck", "type": "feature", "system": { - "description": "

    When the Vampire is spotlighted, roll a d8. On a result of 6 or higher, all targets within Very Close range must mark a HP.

    @Template[type:emanation|range:vc]

    ", + "description": "

    When the @Lookup[@name] is spotlighted, roll a d8. On a result of 6 or higher, all targets within Very Close range must mark a HP.

    @Template[type:emanation|range:vc]

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

    When the Vampire is spotlighted, roll a d8. On a result of 6 or higher, all targets within Very Close range must mark a HP.

    @Template[type:emanation|range:vc]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json b/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json index a2734e0d..0a952540 100644 --- a/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json +++ b/src/packs/adversaries/adversary_High_Seraph_r1mbfSSwKWdcFdAU.json @@ -227,14 +227,14 @@ "name": "Relentless (3)", "type": "feature", "system": { - "description": "

    The Seraph can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "

    The @Lookup[@name] can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

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

    The Seraph can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -285,14 +285,14 @@ "name": "Divine Flight", "type": "feature", "system": { - "description": "

    While the Seraph is flying, spend a Fear to move up to Far range instead of Close range before taking an action.

    ", + "description": "

    While the @Lookup[@name] is flying, spend a Fear to move up to Far range instead of Close range before taking an action.

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

    While the Seraph is flying, spend a Fear to move up to Far range instead of Close range before taking an action.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -340,14 +340,14 @@ "name": "Judgement", "type": "feature", "system": { - "description": "

    Spend a Fear to make a target Guilty in the eyes of the Seraph’s god until the Seraph is defeated. While Guilty, the target doesn’t gain Hope on a result with Hope. When the Seraph succeeds on a standard attack against a Guilty target, they deal Severe damage instead of their standard damage. The Seraph can only mark one target at a time.

    ", + "description": "

    Spend a Fear to make a target Guilty in the eyes of the Seraph’s god until the @Lookup[@name] is defeated. While Guilty, the target doesn’t gain Hope on a result with Hope. When the @Lookup[@name] succeeds on a standard attack against a Guilty target, they deal Severe damage instead of their standard damage. The @Lookup[@name] can only mark one target at a time.

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

    Spend a Fear to make a target Guilty in the eyes of the Seraph’s god until the Seraph is defeated. While Guilty, the target doesn’t gain Hope on a result with Hope. When the Seraph succeeds on a standard attack against a Guilty target, they deal Severe damage instead of their standard damage. The Seraph can only mark one target at a time.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -438,7 +438,7 @@ "type": "attack", "_id": "HwC75gazlN0k30AL", "systemPath": "actions", - "description": "

    Mark a Stress to reflect a sliver of divinity as a searing beam of light that hits up to twenty targets within Very Far range. Targets must make a Presence Reaction Roll, with disadvantage if they are marked Guilty. Targets who fail take 4d6+12 magic damage. Targets who succeed take half damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -545,7 +545,7 @@ "type": "effect", "_id": "j6DmU9dtob5QStxY", "systemPath": "actions", - "description": "

    Once per scene, spend a Fear to spotlight all other adversaries within Far range. Attacks they make while spotlighted in this way deal half damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json b/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json index 6e5c45f9..6f64f883 100644 --- a/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json +++ b/src/packs/adversaries/adversary_Huge_Green_Ooze_6hbqmxDXFOzZJDk4.json @@ -227,7 +227,7 @@ "name": "Slow", "type": "feature", "system": { - "description": "

    When you spotlight the Ooze and they don’t have a token on their stat block, they can’t act yet. Place a token on their stat block and describe what they’re preparing to do. When you spotlight the Ooze and they have a token on their stat block, clear the token and they can act.

    ", + "description": "

    When you spotlight the @Lookup[@name] and they don’t have a token on their stat block, they can’t act yet. Place a token on their stat block and describe what they’re preparing to do. When you spotlight the @Lookup[@name] and they have a token on their stat block, clear the token and they can act.

    ", "resource": { "type": "simple", "value": 0, @@ -257,14 +257,14 @@ "name": "Acidic Form", "type": "feature", "system": { - "description": "

    When the Ooze makes a successful attack, the target must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack, the target must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

    ", "resource": null, "actions": { "gtT2oHSyZg9OHHJD": { "type": "damage", "_id": "gtT2oHSyZg9OHHJD", "systemPath": "actions", - "description": "

    When the Ooze makes a successful attack, the target must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -335,7 +335,7 @@ "name": "Envelop", "type": "feature", "system": { - "description": "

    Make an attack against a target within Melee range. On a success, the Ooze Envelops them and the target must mark 2 Stress. While Enveloped, the target must mark an additional Stress every time they make an action roll. When the Ooze takes Severe damage, all Enveloped targets are freed and the condition is cleared.

    ", + "description": "

    Make an attack against a target within Melee range. On a success, the @Lookup[@name] Envelops them and the target must mark 2 Stress. While Enveloped, the target must mark an additional Stress every time they make an action roll. When the @Lookup[@name] takes Severe damage, all Enveloped targets are freed and the condition is cleared.

    ", "resource": null, "actions": { "hQBYPagz5yuTcCQq": { @@ -476,14 +476,14 @@ "name": "Split", "type": "feature", "system": { - "description": "

    When the Ooze has 4 or more HP marked, you can spend a Fear to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.SHXedd9zZPVfUgUa]{Green Oozes}(with no marked HP or Stress). Immediately spotlight both of them.

    ", + "description": "

    When the @Lookup[@name] has 4 or more HP marked, you can spend a Fear to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.SHXedd9zZPVfUgUa]{Green Oozes}(with no marked HP or Stress). Immediately spotlight both of them.

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

    When the Ooze has 4 or more HP marked, you can spend a Fear to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.SHXedd9zZPVfUgUa]{Green Oozes}(with no marked HP or Stress). Immediately spotlight both of them.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json b/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json index 592d0da1..4c6fd61f 100644 --- a/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json +++ b/src/packs/adversaries/adversary_Hydra_MI126iMOOobQ1Obn.json @@ -221,7 +221,7 @@ "name": "Many-Headed Menace", "type": "feature", "system": { - "description": "

    The Hydra begins with three heads and can have up to five. When the Hydra takes Major or greater damage, they lose a head.

    ", + "description": "

    The @Lookup[@name] begins with three heads and can have up to five. When the @Lookup[@name] takes Major or greater damage, they lose a head.

    ", "resource": { "type": "simple", "value": 3, @@ -251,7 +251,7 @@ "name": "Relentless (X)", "type": "feature", "system": { - "description": "

    The Hydra can be spotlighted X times per GM turn, where X is the Hydra’s number of heads. Spend Fear as usual to spotlight them.

    Note: Automation is not added so manually spend fear as per text.

    ", + "description": "

    The @Lookup[@name] can be spotlighted X times per GM turn, where X is the @Lookup[@name]’s number of heads. Spend Fear as usual to spotlight them.


    Note: Automation is not added so manually spend fear as per text.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -276,14 +276,14 @@ "name": "Regeneration", "type": "feature", "system": { - "description": "

    If the Hydra has any marked HP, spend a Fear to clear a HP and grow two heads.

    ", + "description": "

    If the @Lookup[@name] has any marked HP, spend a Fear to clear a HP and grow two heads.

    ", "resource": null, "actions": { "SsRtZwee1mYlPLUy": { "type": "healing", "_id": "SsRtZwee1mYlPLUy", "systemPath": "actions", - "description": "

    If the Hydra has any marked HP, spend a Fear to clear a HP and grow two heads.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -384,7 +384,7 @@ "type": "damage", "_id": "nJxpFR4Ul0e2RrL4", "systemPath": "actions", - "description": "

    All PCs within Far range lose 2 Hope.

    @Template[type:emanation|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -456,7 +456,7 @@ "name": "Magical Weakness", "type": "feature", "system": { - "description": "

    When the Hydra takes magic damage, they become Dazed until the next roll with Fear. While Dazed, they can’t use their Regeneration action but are immune to magic damage.

    ", + "description": "

    When the @Lookup[@name] takes magic damage, they become Dazed until the next roll with Fear. While Dazed, they can’t use their Regeneration action but are immune to magic damage.

    ", "resource": null, "actions": { "heAkvOuQG1EJmVbb": { diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Bandit_5Lh1T0zaT8Pkr2U2.json b/src/packs/adversaries/adversary_Jagged_Knife_Bandit_5Lh1T0zaT8Pkr2U2.json index 7a95c097..ae359eaf 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Bandit_5Lh1T0zaT8Pkr2U2.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Bandit_5Lh1T0zaT8Pkr2U2.json @@ -229,7 +229,7 @@ "_id": "5VPb3OJDv6Q5150r", "img": "icons/skills/movement/arrow-upward-white.webp", "system": { - "description": "

    The Bandit climbs just as easily as they run.

    ", + "description": "

    The @Lookup[@name] climbs just as easily as they run.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -255,14 +255,14 @@ "_id": "V7haVmSLm6vTeffc", "img": "icons/skills/movement/arrow-down-pink.webp", "system": { - "description": "

    When the Bandit succeeds on a standard attack from above a target, they deal 1d10+1 physical damage instead of their standard damage.

    ", + "description": "

    When the @Lookup[@name] succeeds on a standard attack from above a target, they deal 1d10+1 physical damage instead of their standard damage.

    ", "resource": null, "actions": { "X7xdCLY7ySMpaTHe": { "type": "damage", "_id": "X7xdCLY7ySMpaTHe", "systemPath": "actions", - "description": "

    When the Bandit succeeds on a standard attack from above a target, they deal 1d10+1 physical damage instead of their standard damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json b/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json index 200ed9b1..6ca9749c 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Hexer_MbBPIOxaxXYNApXz.json @@ -235,7 +235,7 @@ "type": "effect", "_id": "yzjCJyfGzZrEd0G3", "systemPath": "actions", - "description": "

    Choose a target within Far range and temporarily Curse them. While the target is Cursed, you can mark a Stress when that target rolls with Hope to make the roll be with Fear instead.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -320,14 +320,14 @@ "_id": "d8uVdKpTm9yw6TZS", "img": "icons/magic/unholy/projectile-bolts-salvo-pink.webp", "system": { - "description": "

    Make an attack against up to three targets within Very Close range. Mark a Stress to deal 2d6+3 magic damage to targets the Hexer succeeded against.

    ", + "description": "

    Make an attack against up to three targets within Very Close range. Mark a Stress to deal 2d6+3 magic damage to targets the @Lookup[@name] succeeded against.

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

    Make an attack against up to three targets within Very Close range. Mark a Stress to deal 2d6+3 magic damage to targets the Hexer succeeded against.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json b/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json index 48edab51..fc644604 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Kneebreaker_CBKixLH3yhivZZuL.json @@ -234,7 +234,7 @@ "_id": "vipYd2zMFs0i4Ock", "img": "icons/commodities/metal/chain-silver.webp", "system": { - "description": "

    Creatures Restrained by the Kneebreaker take double damage from attacks by other adversaries.

    ", + "description": "

    Creatures Restrained by the @Lookup[@name] take double damage from attacks by other adversaries.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -260,14 +260,14 @@ "_id": "Sa4Nt0eoDjirBKGf", "img": "icons/skills/melee/unarmed-punch-fist.webp", "system": { - "description": "

    Make an attack against a target within Melee range. On a success, the target takes no damage but is Restrained and Vulnerable. The target can break free, clearing both conditions, with a successful Strength Roll or is freed automatically if the Kneebreaker takes Major or greater damage.

    ", + "description": "

    Make an attack against a target within Melee range. On a success, the target takes no damage but is Restrained and Vulnerable. The target can break free, clearing both conditions, with a successful Strength Roll or is freed automatically if the @Lookup[@name] takes Major or greater damage.

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

    Make an attack against a target within Melee range. On a success, the target takes no damage but is Restrained and Vulnerable. The target can break free, clearing both conditions, with a successful Strength Roll or is freed automatically if the Kneebreaker takes Major or greater damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json b/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json index 65c41639..1a95bf87 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Lackey_C0OMQqV7pN6t7ouR.json @@ -222,7 +222,7 @@ "_id": "hfP30YIlYDW9wkHe", "img": "icons/magic/symbols/runes-carved-stone-yellow.webp", "system": { - "description": "

    The Lackey is defeated when they take any damage. For every 3 damage a PC deals to the Lackey, defeat an additional Minion within range the attack would succeed against.

    ", + "description": "

    The @Lookup[@name] is defeated when they take any damage. For every 3 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -248,14 +248,14 @@ "_id": "1k5TmQIAunM7Bv32", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", "system": { - "description": "

    Spend a Fear to choose a target and spotlight all Jagged Knife Lackeys within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 2 physical damage each. Combine this damage.

    ", + "description": "

    Spend a Fear to choose a target and spotlight all @Lookup[@name] within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 2 physical damage each. Combine this damage.

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

    Spend a Fear to choose a target and spotlight all Jagged Knife Lackeys within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 2 physical damage each. Combine this damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json b/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json index 004c740a..165bb160 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Lieutenant_aTljstqteGoLpCBq.json @@ -228,14 +228,14 @@ "_id": "LIAbel7pMzAHpgF3", "img": "icons/skills/movement/arrows-up-trio-red.webp", "system": { - "description": "

    When you spotlight the Lieutenant, mark a Stress to also spotlight two allies within Close range.

    ", + "description": "

    When you spotlight the @Lookup[@name], mark a Stress to also spotlight two allies within Close range.

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

    When you spotlight the Lieutenant, mark a Stress to also spotlight two allies within Close range.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -319,7 +319,7 @@ "type": "attack", "_id": "fzVyO0DUwIVEUCtg", "systemPath": "actions", - "description": "

    Spend a Fear to make an attack against a Vulnerable target within Close range. On a success, deal 2d6+12 physical damage and the target must mark a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -445,14 +445,14 @@ "_id": "uelnRgGStjJ27VtO", "img": "icons/skills/melee/strike-weapons-orange.webp", "system": { - "description": "

    When the Lieutenant makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "GSjfSgBzyhbVcpbt": { "type": "healing", "_id": "GSjfSgBzyhbVcpbt", "systemPath": "actions", - "description": "

    When the Lieutenant makes a successful attack against a PC, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json b/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json index 96c65c8c..bca035c1 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Shadow_XF4tYTq9nPJAy2ox.json @@ -229,14 +229,14 @@ "_id": "dhycdSd4NYdPOYbP", "img": "icons/weapons/daggers/dagger-crooked-ice-blue.webp", "system": { - "description": "

    When the Shadow succeeds on a standard attack that has advantage, they deal 1d6+6 physical damage instead of their standard damage.

    ", + "description": "

    When the @Lookup[@name] succeeds on a standard attack that has advantage, they deal 1d6+6 physical damage instead of their standard damage.

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

    When the Shadow succeeds on a standard attack that has advantage, they deal 1d6+6 physical damage instead of their standard damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -329,14 +329,14 @@ "_id": "ILIogeKbYioPutRw", "img": "icons/magic/perception/silhouette-stealth-shadow.webp", "system": { - "description": "

    Become Hidden until after the Shadow’s next attack. Attacks made while Hidden from this feature have advantage.

    ", + "description": "

    Become Hidden until after the @Lookup[@name]’s next attack. Attacks made while Hidden from this feature have advantage.

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

    Become Hidden until after the Shadow’s next attack. Attacks made while Hidden from this feature have advantage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Jagged_Knife_Sniper_1zuyof1XuIfi3aMG.json b/src/packs/adversaries/adversary_Jagged_Knife_Sniper_1zuyof1XuIfi3aMG.json index 1ef7070c..166c521b 100644 --- a/src/packs/adversaries/adversary_Jagged_Knife_Sniper_1zuyof1XuIfi3aMG.json +++ b/src/packs/adversaries/adversary_Jagged_Knife_Sniper_1zuyof1XuIfi3aMG.json @@ -229,14 +229,14 @@ "_id": "adPXzpvLREjN3len", "img": "icons/skills/ranged/arrow-flying-spiral-blue.webp", "system": { - "description": "

    If the Sniper is Hidden when they make a successful standard attack against a target, they deal 1d10+4 physical damage instead of their standard damage.

    ", + "description": "

    If the @Lookup[@name] is Hidden when they make a successful standard attack against a target, they deal 1d10+4 physical damage instead of their standard damage.

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

    If the Sniper is Hidden when they make a successful standard attack against a target, they deal 1d10+4 physical damage instead of their standard damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json b/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json index 242bedcb..86d69c37 100644 --- a/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json +++ b/src/packs/adversaries/adversary_Juvenile_Flickerfly_MYXmTx2FHcIjdfYZ.json @@ -221,14 +221,14 @@ "name": "Relentless (3)", "type": "feature", "system": { - "description": "

    The Flickerfly can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "

    The @Lookup[@name] can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

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

    The Flickerfly can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -279,14 +279,14 @@ "name": "Peerless Accuracy", "type": "feature", "system": { - "description": "

    Before the Flickerfly makes an attack, roll a d6. On a result of 4 or higher, the target’s Evasion is halved against this attack.

    ", + "description": "

    Before the @Lookup[@name] makes an attack, roll a d6. On a result of 4 or higher, the target’s Evasion is halved against this attack.

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

    Before the Flickerfly makes an attack, roll a d6. On a result of 4 or higher, the target’s Evasion is halved against this attack.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -400,14 +400,14 @@ "name": "Mind Dance", "type": "feature", "system": { - "description": "

    Mark a Stress to create a magically dazzling display that grapples the minds of nearby foes. All targets within Close range must make an Instinct Reaction Roll. For each target who failed, you gain a Fear and the Flickerfl y learns one of the target’s fears.

    @Template[type:emanation|range:c]

    ", + "description": "

    Mark a Stress to create a magically dazzling display that grapples the minds of nearby foes. All targets within Close range must make an Instinct Reaction Roll. For each target who failed, you gain a Fear and the @Lookup[@name] learns one of the target’s fears.

    @Template[type:emanation|range:c]

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

    Mark a Stress to create a magically dazzling display that grapples the minds of nearby foes. All targets within Close range must make an Instinct Reaction Roll. For each target who failed, you gain a Fear and the Flickerfl y learns one of the target’s fears.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -473,14 +473,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 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]

    ", + "description": "

    Countdown (Loop 1d6). When the @Lookup[@name] takes damage for the first time, activate the countdown. When it triggers, the @Lookup[@name] 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 @Lookup[@name] 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": "

    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": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -577,7 +577,7 @@ "type": "countdown", "_id": "n8ZuLjwTf2FJ7V6n", "systemPath": "actions", - "description": "

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

    ", + "description": "

    Countdown (Loop 1d6). When the @Lookup[@name] takes damage for the first time, activate the countdown.

    ", "chatDisplay": true, "originItem": { "type": "itemCollection" diff --git a/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json b/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json index dca27ce3..71cb7a8d 100644 --- a/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json +++ b/src/packs/adversaries/adversary_Knight_of_the_Realm_7ai2opemrclQe3VF.json @@ -237,7 +237,7 @@ "name": "Chevalier", "type": "feature", "system": { - "description": "

    While the Knight is on a mount, they gain a +2 bonus to their Difficulty. When they take Severe damage, they’re knocked from their mount and lose this benefit until they’re next spotlighted.

    ", + "description": "

    While the @Lookup[@name] is on a mount, they gain a +2 bonus to their Difficulty. When they take Severe damage, they’re knocked from their mount and lose this benefit until they’re next spotlighted.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -306,7 +306,7 @@ "name": "Heavily Armored", "type": "feature", "system": { - "description": "

    When the Knight takes physical damage, reduce it by 3.

    ", + "description": "

    When the @Lookup[@name] takes physical damage, reduce it by 3.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -375,14 +375,14 @@ "name": "Cavalry Charge", "type": "feature", "system": { - "description": "

    If the Knight is mounted, move up to Far range and make a standard attack against a target. On a success, deal 2d8+4 physical damage and the target must mark a Stress.

    ", + "description": "

    If the @Lookup[@name] is mounted, move up to Far range and make a standard attack against a target. On a success, deal 2d8+4 physical damage and the target must mark a Stress.

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

    If the Knight is mounted, move up to Far range and make a standard attack against a target. On a success, deal 2d8+4 physical damage and the target must mark a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -505,7 +505,7 @@ "type": "effect", "_id": "V5fLHHdTOita6u9f", "systemPath": "actions", - "description": "

    Mark a Stress to spotlight [[/r 1d4+1]] allies. Attacks they make while spotlighted in this way deal half damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json b/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json index 58169e89..3b84774e 100644 --- a/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json +++ b/src/packs/adversaries/adversary_Kraken_4nqv3ZwJGjnmic8j.json @@ -227,14 +227,14 @@ "name": "Relentless (3)", "type": "feature", "system": { - "description": "

    The Kraken can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "

    The @Lookup[@name] can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

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

    The Kraken can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -285,7 +285,7 @@ "name": "Many Tentacles", "type": "feature", "system": { - "description": "

    While the Kraken has 7 or fewer marked HP, they can make their standard attack against two targets within range.

    ", + "description": "

    While the @Lookup[@name] has 7 or fewer marked HP, they can make their standard attack against two targets within range.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -310,7 +310,7 @@ "name": "Grapple and Drown", "type": "feature", "system": { - "description": "

    Make an attack roll against a target within Close range. On a success, mark a Stress to grab them with a tentacle and drag them beneath the water. The target is Restrained and Vulnerable until they break free with a successful Strength Roll or the Kraken takes Major or greater damage. While Restrained and Vulnerable in this way, a target must mark a Stress when they make an action roll.

    ", + "description": "

    Make an attack roll against a target within Close range. On a success, mark a Stress to grab them with a tentacle and drag them beneath the water. The target is Restrained and Vulnerable until they break free with a successful Strength Roll or the @Lookup[@name] takes Major or greater damage. While Restrained and Vulnerable in this way, a target must mark a Stress when they make an action roll.

    ", "resource": null, "actions": { "SX2Y4OapGEawl17j": { @@ -435,7 +435,7 @@ "type": "attack", "_id": "pHZUiZRSj4FuG0uK", "systemPath": "actions", - "description": "

    Spend a Fear to spew a line of boiling water at any number of targets in a line up to Far range. All targets must succeed on an Agility Reaction Roll or take 4d6+9 physical damage. If a target marks an Armor Slot to reduce the damage, they must also mark a Stress.

    @Template[type:ray|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -528,14 +528,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

    When the Kraken makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "hXQtIGmSaWKMOuFB": { "type": "healing", "_id": "hXQtIGmSaWKMOuFB", "systemPath": "actions", - "description": "

    When the Kraken makes a successful attack against a PC, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "reaction", "cost": [], diff --git a/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json b/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json index 500d1211..528df6a9 100644 --- a/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json +++ b/src/packs/adversaries/adversary_Masked_Thief_niBpVU7yeo5ccskE.json @@ -227,14 +227,14 @@ "name": "Quick Hands", "type": "feature", "system": { - "description": "

    Make an attack against a target within Melee range. On a success, deal 1d8+2 physical damage and the Thief steals one item or consumable from the target’s inventory.

    ", + "description": "

    Make an attack against a target within Melee range. On a success, deal 1d8+2 physical damage and the @Lookup[@name] steals one item or consumable from the target’s inventory.

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

    Make an attack against a target within Melee range. On a success, deal 1d8+2 physical damage and the Thief steals one item or consumable from the target’s inventory.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -325,14 +325,14 @@ "name": "Escape Plan", "type": "feature", "system": { - "description": "

    Mark a Stress to reveal a snare trap set anywhere on the battlefi eld by the Thief. All targets within Very Close range of the trap must succeed on an Agility Reaction Roll (13) or be pulled off their feet and suspended upside down. A target is Restrained and Vulnerable until they break free, ending both conditions, with a successful Finesse or Strength Roll (13).

    @Template[type:rect|range:c]

    ", + "description": "

    Mark a Stress to reveal a snare trap set anywhere on the battlefield by the @Lookup[@name]. All targets within Very Close range of the trap must succeed on an Agility Reaction Roll (13) or be pulled off their feet and suspended upside down. A target is Restrained and Vulnerable until they break free, ending both conditions, with a successful Finesse or Strength Roll (13).

    @Template[type:rect|range:c]

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

    Mark a Stress to reveal a snare trap set anywhere on the battlefi eld by the Thief. All targets within Very Close range of the trap must succeed on an Agility Reaction Roll (13) or be pulled off their feet and suspended upside down. A target is Restrained and Vulnerable until they break free, ending both conditions, with a successful Finesse or Strength Roll (13).

    @Template[type:rect|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json b/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json index f654773a..3cec6e0b 100644 --- a/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json +++ b/src/packs/adversaries/adversary_Master_Assassin_dNta0cUzr96xcFhf.json @@ -232,7 +232,7 @@ "name": "Won't See it Coming", "type": "feature", "system": { - "description": "

    The Assassin deals direct damage while they’re Hidden.

    ", + "description": "

    The @Lookup[@name] deals direct damage while they’re Hidden.

    ", "resource": null, "actions": { "xFBE0jLf96fbCY7K": { @@ -240,7 +240,7 @@ "_id": "xFBE0jLf96fbCY7K", "systemPath": "actions", "baseAction": false, - "description": "

    The Assassin deals direct damage while they’re Hidden.

    ", + "description": "", "chatDisplay": true, "originItem": { "type": "itemCollection" @@ -339,14 +339,14 @@ "name": "Strike as One", "type": "feature", "system": { - "description": "

    Mark a Stress to spotlight a number of other Assassins equal to the Assassin’s unmarked Stress.

    ", + "description": "

    Mark a Stress to spotlight a number of other Assassins equal to the @Lookup[@name]’s unmarked Stress.

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

    Mark a Stress to spotlight a number of other Assassins equal to the Assassin’s unmarked Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -395,14 +395,14 @@ "name": "The Subtle Blade", "type": "feature", "system": { - "description": "

    When the Assassin successfully makes a standard attack against a Vulnerable target, you can spend a Fear to deal Severe damage instead of their standard damage.

    ", + "description": "

    When the @Lookup[@name] successfully makes a standard attack against a Vulnerable target, you can spend a Fear to deal Severe damage instead of their standard damage.

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

    When the Assassin successfully makes a standard attack against a Vulnerable target, you can spend a Fear to deal Severe damage instead of their standard damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -451,14 +451,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

    When the Assassin makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "7EP5X5kodzMCBQZO": { "type": "healing", "_id": "7EP5X5kodzMCBQZO", "systemPath": "actions", - "description": "

    When the Assassin makes a successful attack against a PC, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "reaction", "cost": [], diff --git a/src/packs/adversaries/adversary_Merchant_Al3w2CgjfdT3p9ma.json b/src/packs/adversaries/adversary_Merchant_Al3w2CgjfdT3p9ma.json index 15197d52..880b1a6e 100644 --- a/src/packs/adversaries/adversary_Merchant_Al3w2CgjfdT3p9ma.json +++ b/src/packs/adversaries/adversary_Merchant_Al3w2CgjfdT3p9ma.json @@ -229,7 +229,7 @@ "_id": "3Fwj28UxUcdMifoi", "img": "icons/skills/social/diplomacy-handshake.webp", "system": { - "description": "

    A PC who succeeds on a Presence Roll against the Merchant gains a discount on purchases. A PC who fails on a Presence Roll against the Merchant must pay more and has disadvantage on future Presence Rolls against the Merchant.

    ", + "description": "

    A PC who succeeds on a Presence Roll against the @Lookup[@name] gains a discount on purchases. A PC who fails on a Presence Roll against the @Lookup[@name] must pay more and has disadvantage on future Presence Rolls against the @Lookup[@name].

    ", "resource": null, "actions": {}, "originItemType": null, @@ -255,14 +255,14 @@ "_id": "Ksdgov6mYg7Og2ys", "img": "icons/skills/social/trading-justice-scale-yellow.webp", "system": { - "description": "

    When a PC rolls a 14 or lower on a Presence Roll made against the Merchant, they must mark a Stress.

    ", + "description": "

    When a PC rolls a 14 or lower on a Presence Roll made against the @Lookup[@name], they must mark a Stress.

    ", "resource": null, "actions": { "sTHDvAggf1nUX4Ai": { "type": "damage", "_id": "sTHDvAggf1nUX4Ai", "systemPath": "actions", - "description": "

    When a PC rolls a 14 or lower on a Presence Roll made against the Merchant, they must mark a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json b/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json index 2d392f8c..15c0aeb9 100644 --- a/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json +++ b/src/packs/adversaries/adversary_Merchant_Baron_Vy02IhGhkJLuezu4.json @@ -239,7 +239,7 @@ "type": "attack", "_id": "T7N9rDCaB5VOm6AY", "systemPath": "actions", - "description": "

    Spend a Fear to offer a target a dangerous bargain for something they want or need. If used on a PC, they must make a Presence Reaction Roll (17). On a failure, they must mark 2 Stress or take the deal.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -331,14 +331,14 @@ "name": "The Best Muscle Money Can Buy", "type": "feature", "system": { - "description": "

    Once per scene, mark a Stress to summon 1d4+1 Tier 1 adversaries, who appear at Far range, to enforce the Baron’s will.

    ", + "description": "

    Once per scene, mark a Stress to summon 1d4+1 Tier 1 adversaries, who appear at Far range, to enforce the @Lookup[@name]’s will.

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

    Once per scene, mark a Stress to summon 1d4+1 Tier 1 adversaries, who appear at Far range, to enforce the Baron’s will.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json b/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json index 5a9cd4c1..b1732c71 100644 --- a/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json +++ b/src/packs/adversaries/adversary_Minor_Chaos_Elemental_sRn4bqerfARvhgSV.json @@ -223,7 +223,7 @@ "_id": "4Rw5KC5klRseiLvn", "img": "icons/magic/defensive/shield-barrier-flaming-diamond-blue.webp", "system": { - "description": "

    The Elemental is resistant to magic damage.

    ", + "description": "

    The @Lookup[@name] is resistant to magic damage.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -300,7 +300,7 @@ "type": "damage", "_id": "g4CVwjDeJgTJ2oCw", "systemPath": "actions", - "description": "

    Mark a HP to force all targets within Close range to mark a Stress and become Vulnerable until their next rest or they clear a HP.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -431,7 +431,7 @@ "type": "damage", "_id": "QzuQIAtSrgz9Zd5V", "systemPath": "actions", - "description": "

    Spend a Fear to transform the area within Very Close range into a different biome. All targets within this area take 2d6+3 direct magic damage.

    @Template[type:emanation|range:vc]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -512,7 +512,7 @@ "_id": "dnVB2DxbpYtwt0S0", "img": "icons/magic/light/beam-impact-deflect-teal.webp", "system": { - "description": "

    When the Elemental takes damage from an attack within Close range, deal an amount of damage to the attacker equal to half the damage they dealt.

    ", + "description": "

    When the @Lookup[@name] takes damage from an attack within Close range, deal an amount of damage to the attacker equal to half the damage they dealt.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -539,14 +539,14 @@ "_id": "JqRfb0IZ3aJrVazI", "img": "icons/skills/melee/strike-weapons-orange.webp", "system": { - "description": "

    When the Elemental makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "zpQIB9z9kK2BlfqZ": { "type": "healing", "_id": "zpQIB9z9kK2BlfqZ", "systemPath": "actions", - "description": "

    When the Elemental makes a successful attack against a PC, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json b/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json index 9f47ce8b..3a330fdf 100644 --- a/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json +++ b/src/packs/adversaries/adversary_Minor_Demon_3tqCjDwJAQ7JKqMb.json @@ -222,14 +222,14 @@ "_id": "4xoydX3YwsLujuaI", "img": "icons/magic/unholy/silhouette-evil-horned-giant.webp", "system": { - "description": "

    The Demon can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "

    The @Lookup[@name] can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

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

    The Demon can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -281,14 +281,14 @@ "_id": "kD9kO92V7t3IqZu8", "img": "icons/magic/unholy/strike-hand-glow-pink.webp", "system": { - "description": "

    When a PC rolls a failure with Fear while within Close range of the Demon, they lose a Hope.

    @Template[type:emanation|range:c]

    ", + "description": "

    When a PC rolls a failure with Fear while within Close range of the @Lookup[@name], they lose a Hope.

    @Template[type:emanation|range:c]

    ", "resource": null, "actions": { "XQ7QebA0iGvMti4A": { "type": "damage", "_id": "XQ7QebA0iGvMti4A", "systemPath": "actions", - "description": "

    When a PC rolls a failure with Fear while within Close range of the Demon, they lose a Hope.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -367,7 +367,7 @@ "type": "attack", "_id": "nOzLQ0NJzeB3vKiV", "systemPath": "actions", - "description": "

    Spend a Fear to rain down hellfire within Far range. All targets within the area must make an Agility Reaction Roll. Targets who fail take 1d20+3 magic damage. Targets who succeed take half damage.

    @Template[type:emanation|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -468,14 +468,14 @@ "_id": "bpLBGTW1DmXPgIcx", "img": "icons/magic/death/skull-energy-light-white.webp", "system": { - "description": "

    Before rolling damage for the Demon’s attack, you can mark a Stress to gain a bonus to the damage roll equal to the Demon’s current number of marked HP.

    ", + "description": "

    Before rolling damage for the @Lookup[@name]’s attack, you can mark a Stress to gain a bonus to the damage roll equal to the @Lookup[@name]’s current number of marked HP.

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

    Before rolling damage for the Demon’s attack, you can mark a Stress to gain a bonus to the damage roll equal to the Demon’s current number of marked HP.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -525,14 +525,14 @@ "_id": "w400aHTlADxDihpt", "img": "icons/skills/melee/strike-weapons-orange.webp", "system": { - "description": "

    When the Demon makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "Cmd4f2gfxgOZsN6f": { "type": "healing", "_id": "Cmd4f2gfxgOZsN6f", "systemPath": "actions", - "description": "

    When the Demon makes a successful attack against a PC, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json b/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json index 24f6da13..2980a141 100644 --- a/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json +++ b/src/packs/adversaries/adversary_Minor_Fire_Elemental_DscWkNVoHak6P4hh.json @@ -223,14 +223,14 @@ "_id": "c1jcZZD616J5Y4Mb", "img": "icons/magic/unholy/silhouette-evil-horned-giant.webp", "system": { - "description": "

    The Elemental can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "

    The @Lookup[@name] can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

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

    The Elemental can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "", "chatDisplay": true, "actionType": "passive", "cost": [], @@ -273,14 +273,14 @@ "_id": "7AXE86WNd68OySkD", "img": "icons/magic/fire/explosion-flame-lightning-strike.webp", "system": { - "description": "

    Mark a Stress to choose a point within Far range. The ground within Very Close range of that point immediately bursts into fl ames. All creatures within this area must make an Agility Reaction Roll. Targets who fail take 2d8 magic damage from the fl ames. Targets who succeed take half damage.

    @Template[type:circle|range:vc]

    ", + "description": "

    Mark a Stress to choose a point within Far range. The ground within Very Close range of that point immediately bursts into flames. All creatures within this area must make an Agility Reaction Roll. Targets who fail take 2d8 magic damage from the flames. Targets who succeed take half damage.

    @Template[type:circle|range:vc]

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

    Mark a Stress to choose a point within Far range. The ground within Very Close range of that point immediately bursts into fl ames. All creatures within this area must make an Agility Reaction Roll. Targets who fail take 2d8 magic damage from the fl ames. Targets who succeed take half damage.

    @Template[type:circle|range:vc]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -489,7 +489,7 @@ "_id": "3u6wvKPJAS2v5nWV", "img": "icons/magic/fire/elemental-fire-flying.webp", "system": { - "description": "

    Three times per scene, when the Elemental moves onto objects that are highly flammable, consume them to clear a HP or a Stress.

    ", + "description": "

    Three times per scene, when the @Lookup[@name] moves onto objects that are highly flammable, consume them to clear a HP or a Stress.

    ", "resource": { "type": "simple", "value": 0, @@ -501,7 +501,7 @@ "type": "healing", "_id": "CTWSVVisdgJgF7pd", "systemPath": "actions", - "description": "

    Three times per scene, when the Elemental moves onto objects that are highly flammable, consume them to clear a HP or a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -568,7 +568,7 @@ "type": "healing", "_id": "e0fG0xtj6hOUp66o", "systemPath": "actions", - "description": "

    Three times per scene, when the Elemental moves onto objects that are highly flammable, consume them to clear a HP or a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -656,14 +656,14 @@ "_id": "kssnXljBaV31iX58", "img": "icons/skills/melee/strike-weapons-orange.webp", "system": { - "description": "

    When the Elemental makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "rPj1Wf22Kai3eBCv": { "type": "healing", "_id": "rPj1Wf22Kai3eBCv", "systemPath": "actions", - "description": "

    When the Elemental makes a successful attack against a PC, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "reaction", "cost": [], diff --git a/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json b/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json index e1f388cf..0f1e7ded 100644 --- a/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json +++ b/src/packs/adversaries/adversary_Minor_Treant_G62k4oSkhkoXEs2D.json @@ -216,7 +216,7 @@ "_id": "gOgqATDRzPP7Jzbh", "img": "icons/magic/symbols/runes-carved-stone-yellow.webp", "system": { - "description": "

    The Treant is defeated when they take any damage. For every 5 damage a PC deals to the Treant, defeat an additional Minion within range the attack would succeed against.

    ", + "description": "

    The @Lookup[@name] is defeated when they take any damage. For every 5 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -242,14 +242,14 @@ "_id": "K08WlZwGqzEo4idT", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", "system": { - "description": "

    Spend a Fear to choose a target and spotlight all Minor Treants within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 4 physical damage each. Combine this damage.

    ", + "description": "

    Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 4 physical damage each. Combine this damage.

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

    Spend a Fear to choose a target and spotlight all Minor Treants within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 4 physical damage each. Combine this damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json b/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json index 15889935..85981374 100644 --- a/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json +++ b/src/packs/adversaries/adversary_Minotaur_Wrecker_rM9qCIYeWg9I0B4l.json @@ -221,14 +221,14 @@ "name": "Ramp Up", "type": "feature", "system": { - "description": "

    You must spend a Fear to spotlight the Minotaur. While spotlighted, they can make their standard attack against all targets within range.

    ", + "description": "

    You must spend a Fear to spotlight the @Lookup[@name]. While spotlighted, they can make their standard attack against all targets within range.

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

    You must spend a Fear to spotlight the Minotaur. While spotlighted, they can make their standard attack against all targets within range.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -276,14 +276,14 @@ "name": "Charging Bull", "type": "feature", "system": { - "description": "

    Mark a Stress to charge through a group within Close range and make an attack against all targets in the Minotaur’s path. Targets the Minotaur succeeds against take 2d6+8 physical damage and are knocked back to Very Far range. If a target is knocked into a solid object or another creature, they take an extra 1d6 damage (combine the damage).

    ", + "description": "

    Mark a Stress to charge through a group within Close range and make an attack against all targets in the @Lookup[@name]’s path. Targets the @Lookup[@name] succeeds against take 2d6+8 physical damage and are knocked back to Very Far range. If a target is knocked into a solid object or another creature, they take an extra 1d6 damage (combine the damage).

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

    Mark a Stress to charge through a group within Close range and make an attack against all targets in the Minotaur’s path. Targets the Minotaur succeeds against take 2d6+8 physical damage and are knocked back to Very Far range. If a target is knocked into a solid object or another creature, they take an extra 1d6 damage (combine the damage).

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json b/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json index a0d7a81c..5320a0ed 100644 --- a/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json +++ b/src/packs/adversaries/adversary_Monarch_yx0vK2yfNVZKWUUi.json @@ -258,14 +258,14 @@ "name": "Crownsguard", "type": "feature", "system": { - "description": "

    Once per scene, mark a Stress to summon six Tier 3 Minions, who appear at Close range to enforce the Monarch’s will.

    ", + "description": "

    Once per scene, mark a Stress to summon six Tier 3 Minions, who appear at Close range to enforce the @Lookup[@name]’s will.

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

    Once per scene, mark a Stress to summon six Tier 3 Minions, who appear at Close range to enforce the Monarch’s will.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -314,14 +314,14 @@ "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 @Lookup[@name]’s desire for war is first revealed. When it triggers, the @Lookup[@name] 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": { "CNEOOdPI4xVJ2JeP": { "type": "countdown", "_id": "CNEOOdPI4xVJ2JeP", "systemPath": "actions", - "description": "

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

    ", + "description": "

    Long-Term Countdown (8). Spend a Fear to activate after the @Lookup[@name]’s desire for war is first revealed.

    ", "chatDisplay": true, "originItem": { "type": "itemCollection" @@ -367,7 +367,7 @@ "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.

    ", + "description": "

    The @Lookup[@name] 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" diff --git a/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json b/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json index 5a7b3aac..8bc7fe10 100644 --- a/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json +++ b/src/packs/adversaries/adversary_Mortal_Hunter_mVV7a7KQAORoPMgZ.json @@ -227,14 +227,14 @@ "name": "Terrifying", "type": "feature", "system": { - "description": "

    When the Hunter makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

    @Template[type:emanation|range:f]

    ", + "description": "

    When the @Lookup[@name] makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

    @Template[type:emanation|range:f]

    ", "resource": null, "actions": { "9T1g3FH38cnCRG8k": { "type": "damage", "_id": "9T1g3FH38cnCRG8k", "systemPath": "actions", - "description": "

    When the Hunter makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

    @Template[type:emanation|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -305,14 +305,14 @@ "name": "Deathlock", "type": "feature", "system": { - "description": "

    Spend a Fear to curse a target within Very Close range with a necrotic Deathlock until the end of the scene. Attacks made by the Hunter against a Deathlocked target deal direct damage. The Hunter can only maintain one Deathlock at a time.

    ", + "description": "

    Spend a Fear to curse a target within Very Close range with a necrotic Deathlock until the end of the scene. Attacks made by the @Lookup[@name] against a Deathlocked target deal direct damage. The @Lookup[@name] can only maintain one Deathlock at a time.

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

    Spend a Fear to curse a target within Very Close range with a necrotic Deathlock until the end of the scene. Attacks made by the Hunter against a Deathlocked target deal direct damage. The Hunter can only maintain one Deathlock at a time.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -347,7 +347,7 @@ "_id": "zLKfwa8a2YBRLKAF", "systemPath": "actions", "baseAction": false, - "description": "

    Attacks made by the Hunter against a Deathlocked target deal direct damage.

    ", + "description": "

    Attacks made by the @Lookup[@name] against a Deathlocked target deal direct damage.

    ", "chatDisplay": true, "originItem": { "type": "itemCollection" @@ -491,7 +491,7 @@ "type": "attack", "_id": "wxOfNoEogH1EU0Jb", "systemPath": "actions", - "description": "

    Mark a Stress to spotlight 1d4 allies. Attacks they make while spotlighted in this way deal half damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -564,14 +564,14 @@ "name": "Rampage", "type": "feature", "system": { - "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]

    ", + "description": "

    Countdown (Loop 1d6). When the @Lookup[@name] is in the spotlight for the first time, activate the countdown. When it triggers, move the @Lookup[@name] in a straight line to a point within Far range and make an attack against all targets in their path. Targets the @Lookup[@name] succeeds against take 2d8+2 physical damage.

    @Template[type:ray|range:f]

    ", "resource": null, "actions": { "VjiFxuzfAaq5N1jy": { "type": "attack", "_id": "VjiFxuzfAaq5N1jy", "systemPath": "actions", - "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]

    ", + "description": "

    Move the @Lookup[@name] in a straight line to a point within Far range and make an attack against all targets in their path. Targets the @Lookup[@name] succeeds against take 2d8+2 physical damage.

    @Template[type:ray|range:f]

    ", "chatDisplay": true, "actionType": "action", "cost": [], @@ -644,7 +644,7 @@ "type": "countdown", "_id": "BhA3vxCuMs4UbbQU", "systemPath": "actions", - "description": "

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

    ", + "description": "

    Countdown (Loop 1d6). When the @Lookup[@name] is in the spotlight for the first time, activate the countdown.

    ", "chatDisplay": true, "originItem": { "type": "itemCollection" diff --git a/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json b/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json index d35547bd..c0999e70 100644 --- a/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json +++ b/src/packs/adversaries/adversary_Oak_Treant_XK78QUfY8c8Go8Uv.json @@ -221,7 +221,7 @@ "name": "Just a Tree", "type": "feature", "system": { - "description": "

    Before they make their first attack in a fight or after they become Hidden the Treant is indistinguishable from other trees until they next act or a PC succeeds on an Instinct Roll to identify them.

    ", + "description": "

    Before they make their first attack in a fight or after they become Hidden the @Lookup[@name] is indistinguishable from other trees until they next act or a PC succeeds on an Instinct Roll to identify them.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -246,14 +246,14 @@ "name": "Seed Barrage", "type": "feature", "system": { - "description": "

    Mark a Stress and make an attack against up to three targets within Close range pummeling them with giant acorns Targets the Treant succeeds against take 2d10+5 physical damage.

    ", + "description": "

    Mark a Stress and make an attack against up to three targets within Close range pummeling them with giant acorns. Targets the @Lookup[@name] succeeds against take 2d10+5 physical damage.

    ", "resource": null, "actions": { "cM5BBUSFxOHBsV2G": { "type": "damage", "_id": "cM5BBUSFxOHBsV2G", "systemPath": "actions", - "description": "

    Mark a Stress and make an attack against up to three targets within Close range pummeling them with giant acorns Targets the Treant succeeds against take 2d10+5 physical damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -338,7 +338,7 @@ "name": "Take Root", "type": "feature", "system": { - "description": "

    Mark a Stress to Root the Treant in place. The Treant is Restrained while Rooted and can end this effect instead of moving while they are spotlighted. While Rooted the Treant has resistance to physical damage.

    ", + "description": "

    Mark a Stress to Root the @Lookup[@name] in place. The @Lookup[@name] is Restrained while Rooted and can end this effect instead of moving while they are spotlighted. While Rooted the @Lookup[@name] has resistance to physical damage.

    ", "resource": null, "actions": { "008EelRlcs6CKGvM": { diff --git a/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json b/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json index b225cf7b..66fa5ba1 100644 --- a/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json +++ b/src/packs/adversaries/adversary_Oracle_of_Doom_befIqd5IYKg6eUz2.json @@ -227,14 +227,14 @@ "name": "Terrifying", "type": "feature", "system": { - "description": "

    When the Oracle makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

    @Template[type:emanation|range:f]

    ", + "description": "

    When the @Lookup[@name] makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

    @Template[type:emanation|range:f]

    ", "resource": null, "actions": { "VjdSO1lAdTIAlofM": { "type": "damage", "_id": "VjdSO1lAdTIAlofM", "systemPath": "actions", - "description": "

    When the Oracle makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

    @Template[type:emanation|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -305,14 +305,14 @@ "name": "Walls Closing In", "type": "feature", "system": { - "description": "

    When a creature rolls a failure while within Very Far range of the Oracle, they must mark a Stress.

    ", + "description": "

    When a creature rolls a failure while within Very Far range of the @Lookup[@name], they must mark a Stress.

    ", "resource": null, "actions": { "u9iEsvV5ktvOxNp5": { "type": "damage", "_id": "u9iEsvV5ktvOxNp5", "systemPath": "actions", - "description": "

    When a creature rolls a failure while within Very Far range of the Oracle, they must mark a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -390,7 +390,7 @@ "type": "attack", "_id": "IiSgpy6Axfqo9f9V", "systemPath": "actions", - "description": "

    Spend a Fear to present a target within Far range with a vision of their personal nightmare. The target must make a Knowledge Reaction Roll. On a failure, they lose all Hope and take 2d20+4 direct magic damage. On a success, they take half damage and lose a Hope.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -497,7 +497,7 @@ "type": "attack", "_id": "71UnFo3CBBPtbao3", "systemPath": "actions", - "description": "

    Once per day, spend 2 Fear to summon 2d4 Tier 2 or below Minions relevant to one of the PC’s personal nightmares. They appear at Close range relative to that PC.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -570,7 +570,7 @@ "name": "Ominous Knowledge", "type": "feature", "system": { - "description": "

    When the Oracle sees a mortal creature, they instantly know one of their personal nightmares.

    ", + "description": "

    When the @Lookup[@name] sees a mortal creature, they instantly know one of their personal nightmares.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -596,14 +596,14 @@ "name": "Vengeful Fate", "type": "feature", "system": { - "description": "

    When the Oracle marks HP from an attack within Very Close range, you can mark a Stress to knock the attacker back to Far range and deal 2d10+4 physical damage.

    ", + "description": "

    When the @Lookup[@name] marks HP from an attack within Very Close range, you can mark a Stress to knock the attacker back to Far range and deal 2d10+4 physical damage.

    ", "resource": null, "actions": { "vJ7kARKL5H87T1BY": { "type": "damage", "_id": "vJ7kARKL5H87T1BY", "systemPath": "actions", - "description": "

    When the Oracle marks HP from an attack within Very Close range, you can mark a Stress to knock the attacker back to Far range and deal 2d10+4 physical damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json b/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json index b10f611b..5b565b8c 100644 --- a/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json +++ b/src/packs/adversaries/adversary_Outer_Realms_Abomination_A0SeeDzwjvqOsyof.json @@ -221,7 +221,7 @@ "name": "Chaotic Form", "type": "feature", "system": { - "description": "

    When the Abomination attacks, roll 2d4 and use the result as their attack modifi er.

    ", + "description": "

    When the @Lookup[@name] attacks, roll 2d4 and use the result as their attack modifier.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -246,14 +246,14 @@ "name": "Disorienting Presence", "type": "feature", "system": { - "description": "

    When a target takes damage from the Abomination, they must make an Instinct Reaction Roll. On a failure, they gain disadvantage on their next action roll and you gain a Fear.

    ", + "description": "

    When a target takes damage from the @Lookup[@name], they must make an Instinct Reaction Roll. On a failure, they gain disadvantage on their next action roll and you gain a Fear.

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

    When a target takes damage from the Abomination, they must make an Instinct Reaction Roll. On a failure, they gain disadvantage on their next action roll and you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -367,14 +367,14 @@ "name": "Reality Quake", "type": "feature", "system": { - "description": "

    Spend a Fear to rattle the edges of reality within Far range of the Abomination. All targets within that area must succeed on a Knowledge Reaction Roll or become Unstuck from reality until the end of the scene. When an Unstuck target spends Hope or marks Armor Slots, HP, or Stress, they must double the amount spent or marked.

    @Template[type:emanation|range:f]

    ", + "description": "

    Spend a Fear to rattle the edges of reality within Far range of the @Lookup[@name]. All targets within that area must succeed on a Knowledge Reaction Roll or become Unstuck from reality until the end of the scene. When an Unstuck target spends Hope or marks Armor Slots, HP, or Stress, they must double the amount spent or marked.

    @Template[type:emanation|range:f]

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

    Spend a Fear to rattle the edges of reality within Far range of the Abomination. All targets within that area must succeed on a Knowledge Reaction Roll or become Unstuck from reality until the end of the scene. When an Unstuck target spends Hope or marks Armor Slots, HP, or Stress, they must double the amount spent or marked.

    @Template[type:emanation|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -482,14 +482,14 @@ "name": "Unreal Form", "type": "feature", "system": { - "description": "

    When the Abomination takes damage, reduce it by 1d20. If the Abomination marks 1 or fewer Hit Points from a successful attack against them, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] takes damage, reduce it by 1d20. If the @Lookup[@name] marks 1 or fewer Hit Points from a successful attack against them, you gain a Fear.

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

    When the Abomination takes damage, reduce it by 1d20. If the Abomination marks 1 or fewer Hit Points from a successful attack against them, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Outer_Realms_Corrupter_ms6nuOl3NFkhPj1k.json b/src/packs/adversaries/adversary_Outer_Realms_Corrupter_ms6nuOl3NFkhPj1k.json index 43d029ca..83fbf4fa 100644 --- a/src/packs/adversaries/adversary_Outer_Realms_Corrupter_ms6nuOl3NFkhPj1k.json +++ b/src/packs/adversaries/adversary_Outer_Realms_Corrupter_ms6nuOl3NFkhPj1k.json @@ -221,14 +221,14 @@ "name": "Will-Shattering Touch", "type": "feature", "system": { - "description": "

    When a PC takes damage from the Corrupter, they lose a Hope.

    ", + "description": "

    When a PC takes damage from the @Lookup[@name], they lose a Hope.

    ", "resource": null, "actions": { "q2PUiGoUQqsMghtW": { "type": "damage", "_id": "q2PUiGoUQqsMghtW", "systemPath": "actions", - "description": "

    When a PC takes damage from the Corrupter, they lose a Hope.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -306,7 +306,7 @@ "type": "attack", "_id": "6vX6VHpXX7OiGSWH", "systemPath": "actions", - "description": "

    Mark a Stress to spew partially digested portions of consumed realities at all targets within Close range. Targets must succeed on a Knowledge Reaction Roll or mark 2 Stress.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json b/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json index 387e4006..370182a5 100644 --- a/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json +++ b/src/packs/adversaries/adversary_Outer_Realms_Thrall_moJhHgKqTKPS2WYS.json @@ -214,7 +214,7 @@ "name": "Minion (13)", "type": "feature", "system": { - "description": "

    The Thrall is defeated when they take any damage. For every 13 damage a PC deals to the Thrall, defeat an additional Minion within range the attack would succeed against.

    ", + "description": "

    The @Lookup[@name] is defeated when they take any damage. For every 13 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -239,14 +239,14 @@ "name": "Group Attack", "type": "feature", "system": { - "description": "

    Spend a Fear to choose a target and spotlight all Outer Realm Thralls within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 11 physical damage each. Combine this damage.

    ", + "description": "

    Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 11 physical damage each. Combine this damage.

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

    Spend a Fear to choose a target and spotlight all Outer Realm Thralls within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 11 physical damage each. Combine this damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json b/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json index 4aca5200..b63e8cb7 100644 --- a/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json +++ b/src/packs/adversaries/adversary_Patchwork_Zombie_Hulk_EQTOAOUrkIvS2z88.json @@ -234,7 +234,7 @@ "_id": "rEJ1kAfhHQZWhrZj", "img": "icons/commodities/biological/hand-clawed-tan.webp", "system": { - "description": "

    When the Zombie takes Major or greater damage, they mark an additional HP.

    ", + "description": "

    When the @Lookup[@name] takes Major or greater damage, they mark an additional HP.

    ", "resource": null, "actions": { "Y8LQe5TzbdK2mOG9": { @@ -317,7 +317,7 @@ "_id": "0fn7rVLwBnyCyvTA", "img": "icons/skills/melee/strike-slashes-orange.webp", "system": { - "description": "

    When the Zombie makes a standard attack, they can attack all targets within Very Close range.

    @Template[type:emanation|range:vc]

    ", + "description": "

    When the @Lookup[@name] makes a standard attack, they can attack all targets within Very Close range.

    @Template[type:emanation|range:vc]

    ", "resource": null, "actions": {}, "originItemType": null, @@ -343,14 +343,14 @@ "_id": "gw1Z2VazlRXYCiCK", "img": "icons/magic/death/skull-trio-badge-purple.webp", "system": { - "description": "

    When the Zombie is within Very Close range of a corpse, they can incorporate it into themselves, clearing a HP and a Stress.

    ", + "description": "

    When the @Lookup[@name] is within Very Close range of a corpse, they can incorporate it into themselves, clearing a HP and a Stress.

    ", "resource": null, "actions": { "PfaFRZKFnHGg6mU4": { "type": "healing", "_id": "PfaFRZKFnHGg6mU4", "systemPath": "actions", - "description": "

    When the Zombie is within Very Close range of a corpse, they can incorporate it into themselves, clearing a HP and a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -470,7 +470,7 @@ "type": "attack", "_id": "2NYC0D7wkBNrUAKl", "systemPath": "actions", - "description": "

    Mark a Stress to cause all PCs within Far range to make a Presence Reaction Roll (13). Targets who fail lose a Hope and you gain a Fear for each. Targets who succeed must mark a Stress.

    @Template[type:emanation|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json b/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json index b7844a11..e3da56b6 100644 --- a/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json +++ b/src/packs/adversaries/adversary_Perfected_Zombie_CP6iRfHdyFWniTHY.json @@ -221,14 +221,14 @@ "name": "Terrifying", "type": "feature", "system": { - "description": "

    When the Zombie makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

    @Template[type:emanation|range:f]

    ", + "description": "

    When the @Lookup[@name] makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

    @Template[type:emanation|range:f]

    ", "resource": null, "actions": { "dquYnt5qiHZfnyD9": { "type": "damage", "_id": "dquYnt5qiHZfnyD9", "systemPath": "actions", - "description": "

    When the Zombie makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

    @Template[type:emanation|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -299,7 +299,7 @@ "name": "Fearsome Presence", "type": "feature", "system": { - "description": "

    PCs can’t spend Hope to use features against the Zombie.

    ", + "description": "

    PCs can’t spend Hope to use features against the @Lookup[@name].

    ", "resource": null, "actions": {}, "originItemType": null, @@ -324,14 +324,14 @@ "name": "Perfect Strike", "type": "feature", "system": { - "description": "

    Mark a Stress to make a standard attack against all targets within Very Close range. Targets the Zombie succeeds against are Vulnerable until their next rest.

    @Template[type:emanation|range:vc]

    ", + "description": "

    Mark a Stress to make a standard attack against all targets within Very Close range. Targets the @Lookup[@name] succeeds against are Vulnerable until their next rest.

    @Template[type:emanation|range:vc]

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

    Mark a Stress to make a standard attack against all targets within Very Close range. Targets the Zombie succeeds against are Vulnerable until their next rest.

    @Template[type:emanation|range:vc]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -446,7 +446,7 @@ "startRound": null, "startTurn": null }, - "description": "

    Vulnerable until yournext rest.

    ", + "description": "

    Vulnerable until your next rest.

    ", "tint": "#ffffff", "statuses": [ "vulnerable" @@ -475,14 +475,14 @@ "name": "Skilled Opportunist", "type": "feature", "system": { - "description": "

    When another adversary deals damage to a target within Very Close range of the Zombie, you can spend a Fear to add the Zombie’s standard attack damage to the damage roll.

    ", + "description": "

    When another adversary deals damage to a target within Very Close range of the @Lookup[@name], you can spend a Fear to add the @Lookup[@name]’s standard attack damage to the damage roll.

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

    When another adversary deals damage to a target within Very Close range of the Zombie, you can spend a Fear to add the Zombie’s standard attack damage to the damage roll.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json b/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json index 80235a50..4ac7e746 100644 --- a/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json +++ b/src/packs/adversaries/adversary_Petty_Noble_wycLpvebWdUqRhpP.json @@ -229,7 +229,7 @@ "_id": "Jbq36nElH6RDacLU", "img": "icons/skills/social/diplomacy-writing-letter.webp", "system": { - "description": "

    All social actions made against the Noble on their land have disadvantage.

    ", + "description": "

    All social actions made against the @Lookup[@name] on their land have disadvantage.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -255,7 +255,7 @@ "_id": "ebdAPBso5ROmdFNO", "img": "icons/environment/people/infantry-armored.webp", "system": { - "description": "

    Once per scene, mark a Stress to summon 1d4 @UUID[Compendium.daggerheart.adversaries.Actor.B4LZcGuBAHzyVdzy]{Bladed Guards}, who appear at Far range to enforce the Noble’s will.

    ", + "description": "

    Once per scene, mark a Stress to summon 1d4 @UUID[Compendium.daggerheart.adversaries.Actor.B4LZcGuBAHzyVdzy]{Bladed Guards}, who appear at Far range to enforce the @Lookup[@name]’s will.

    ", "resource": null, "actions": { "cUKwhq1imsTVru8D": { @@ -336,14 +336,14 @@ "_id": "xN09fSsg33nURqpk", "img": "icons/commodities/currency/coin-embossed-skull-gold.webp", "system": { - "description": "

    Spend a Fear and target a PC. The Noble proclaims that the target and their allies are exiled from the noble’s territory. While exiled, the target and their allies have disadvantage during social situations within the Noble’s domain.

    ", + "description": "

    Spend a Fear and target a PC. The @Lookup[@name] proclaims that the target and their allies are exiled from the @Lookup[@name]’s territory. While exiled, the target and their allies have disadvantage during social situations within the @Lookup[@name]’s domain.

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

    Spend a Fear and target a PC. The Noble proclaims that the target and their allies are exiled from the noble’s territory. While exiled, the target and their allies have disadvantage during social situations within the Noble’s domain.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json b/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json index ac414c0a..409d7698 100644 --- a/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json +++ b/src/packs/adversaries/adversary_Pirate_Captain_OROJbjsqagVh7ECV.json @@ -234,14 +234,14 @@ "_id": "PsMA3x6giL8tixbf", "img": "icons/magic/control/mouth-smile-deception-purple.webp", "system": { - "description": "

    When the Captain marks 2 or fewer HP from an attack within Melee range, the attacker must mark a Stress.

    ", + "description": "

    When the @Lookup[@name] marks 2 or fewer HP from an attack within Melee range, the attacker must mark a Stress.

    ", "resource": null, "actions": { "xYphrI8GtMHHuT9a": { "type": "damage", "_id": "xYphrI8GtMHHuT9a", "systemPath": "actions", - "description": "

    When the Captain marks 2 or fewer HP from an attack within Melee range, the attacker must mark a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -320,7 +320,7 @@ "type": "effect", "_id": "NlgIp0KrmZoS27Xy", "systemPath": "actions", - "description": "

    Once per scene, mark a Stress to summon a Pirate Raiders Horde, which appears at Far range.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -370,14 +370,14 @@ "_id": "brHnMc0TDiWVT4U6", "img": "icons/magic/death/skull-energy-light-purple.webp", "system": { - "description": "

    Spend a Fear to choose a target who has three or more Pirates within Melee range of them. The Captain leads the Pirates in hurling threats and promises of a watery grave. The target must make a Presence Reaction Roll. On a failure, the target marks 1d4+1 Stress. On a success, they must mark a Stress.

    ", + "description": "

    Spend a Fear to choose a target who has three or more Pirates within Melee range of them. The @Lookup[@name] leads the Pirates in hurling threats and promises of a watery grave. The target must make a Presence Reaction Roll. On a failure, the target marks 1d4+1 Stress. On a success, they must mark a Stress.

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

    Spend a Fear to choose a target who has three or more Pirates within Melee range of them. The Captain leads the Pirates in hurling threats and promises of a watery grave. The target must make a Presence Reaction Roll. On a failure, the target marks 1d4+1 Stress. On a success, they must mark a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -476,14 +476,14 @@ "_id": "V4EcsqMd70BTrDNu", "img": "icons/skills/melee/strike-weapons-orange.webp", "system": { - "description": "

    When the Captain makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "78Qphxjbs7cOYsNf": { "type": "healing", "_id": "78Qphxjbs7cOYsNf", "systemPath": "actions", - "description": "

    When the Captain makes a successful attack against a PC, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Pirate_Raiders_5YgEajn0wa4i85kC.json b/src/packs/adversaries/adversary_Pirate_Raiders_5YgEajn0wa4i85kC.json index baac89b1..7d3733ce 100644 --- a/src/packs/adversaries/adversary_Pirate_Raiders_5YgEajn0wa4i85kC.json +++ b/src/packs/adversaries/adversary_Pirate_Raiders_5YgEajn0wa4i85kC.json @@ -229,7 +229,7 @@ "_id": "Q7DRbWjHl64CNwag", "img": "icons/creatures/magical/humanoid-silhouette-aliens-green.webp", "system": { - "description": "

    When the Raiders have marked half or more of their HP, their standard attack deals 1d4+1 physical damage instead.

    ", + "description": "

    When the @Lookup[@name] have marked half or more of their HP, their standard attack deals 1d4+1 physical damage instead.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -255,14 +255,14 @@ "_id": "N401rF937fLXMuMA", "img": "icons/magic/control/mouth-smile-deception-purple.webp", "system": { - "description": "

    When the Raiders mark 2 or fewer HP from an attack within Melee range, the attacker must mark a Stress.

    ", + "description": "

    When the @Lookup[@name] mark 2 or fewer HP from an attack within Melee range, the attacker must mark a Stress.

    ", "resource": null, "actions": { "ejadA9jjMnVNVczS": { "type": "damage", "_id": "ejadA9jjMnVNVczS", "systemPath": "actions", - "description": "

    When the Raiders mark 2 or fewer HP from an attack within Melee range, the attacker must mark a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Pirate_Tough_mhcVkVFrzIJ18FDm.json b/src/packs/adversaries/adversary_Pirate_Tough_mhcVkVFrzIJ18FDm.json index db91bdc1..69b59211 100644 --- a/src/packs/adversaries/adversary_Pirate_Tough_mhcVkVFrzIJ18FDm.json +++ b/src/packs/adversaries/adversary_Pirate_Tough_mhcVkVFrzIJ18FDm.json @@ -252,14 +252,14 @@ "name": "Swashbuckler", "type": "feature", "system": { - "description": "

    When the Tough marks 2 or fewer HP from an attack within Melee range, the attacker must mark a Stress.

    ", + "description": "

    When the @Lookup[@name] marks 2 or fewer HP from an attack within Melee range, the attacker must mark a Stress.

    ", "resource": null, "actions": { "xg3K78wfOhg8oCd3": { "type": "damage", "_id": "xg3K78wfOhg8oCd3", "systemPath": "actions", - "description": "

    When the Tough marks 2 or fewer HP from an attack within Melee range, the attacker must mark a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -337,7 +337,7 @@ "type": "attack", "_id": "uJl1NJQ55yd9oCwz", "systemPath": "actions", - "description": "

    Make an attack against a target within Very Close range. On a success, mark a Stress to move into Melee range of the target, dealing 3d4 physical damage and knocking the target back to Close range.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json b/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json index 3535a53f..320b71af 100644 --- a/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json +++ b/src/packs/adversaries/adversary_Red_Ooze_9rVlbJVrDNn1x7PS.json @@ -229,7 +229,7 @@ "_id": "QGQTLWXIMMLUvm7c", "img": "icons/magic/fire/flame-burning-embers-yellow.webp", "system": { - "description": "

    The Ooze can only move within Very Close range as their normal movement. They light any flammable object they touch on fi re.

    ", + "description": "

    The @Lookup[@name] can only move within Very Close range as their normal movement. They light any flammable object they touch on fi re.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -262,7 +262,7 @@ "type": "attack", "_id": "b4g8XUIKLhxDlUPy", "systemPath": "actions", - "description": "

    Make an attack against a target within Very Close range. On a success, the target takes 1d8 magic damage and is Ignited until they’re extinguished with a successful Finesse Roll (14). While Ignited, the target takes 1d4 magic damage when they make an action roll.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -451,14 +451,14 @@ "_id": "M9gAcPrgKfSg9Tjb", "img": "icons/creatures/slimes/slime-movement-splashing-red.webp", "system": { - "description": "

    When the Ooze has 3 or more HP marked, you can spend a Fear to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.1fkLQXVtmILqfJ44]{Tiny Red Oozes} (with no marked HP or Stress). Immediately spotlight both of them.

    ", + "description": "

    When the @Lookup[@name] has 3 or more HP marked, you can spend a Fear to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.1fkLQXVtmILqfJ44]{Tiny Red Oozes} (with no marked HP or Stress). Immediately spotlight both of them.

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

    When the Ooze has 3 or more HP marked, you can spend a Fear to split them into two @UUID[Compendium.daggerheart.adversaries.Actor.1fkLQXVtmILqfJ44]{Tiny Red Oozes} (with no marked HP or Stress). Immediately spotlight both of them.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json b/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json index eb49897a..a9bf3a67 100644 --- a/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json +++ b/src/packs/adversaries/adversary_Rotted_Zombie_gP3fWTLzSFnpA8EJ.json @@ -216,7 +216,7 @@ "_id": "cwV1kNkNrrrHWEwX", "img": "icons/magic/symbols/runes-carved-stone-yellow.webp", "system": { - "description": "

    The Zombie is defeated when they take any damage. For every 3 damage a PC deals to the Zombie, defeat an additional Minion within range the attack would succeed against.

    ", + "description": "

    The @Lookup[@name] is defeated when they take any damage. For every 3 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -242,14 +242,14 @@ "_id": "R9vrwFNl5BD1YXJo", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", "system": { - "description": "

    Spend a Fear to choose a target and spotlight all Rotted Zombies within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 2 physical damage each. Combine this damage.

    ", + "description": "

    Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 2 physical damage each. Combine this damage.

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

    Spend a Fear to choose a target and spotlight all Rotted Zombies within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 2 physical damage each. Combine this damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json b/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json index 7d6c966d..8593ec01 100644 --- a/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json +++ b/src/packs/adversaries/adversary_Royal_Advisor_EtLJiTsilPPZvLUX.json @@ -232,14 +232,14 @@ "name": "Devastating Retort", "type": "feature", "system": { - "description": "

    A PC who rolls less than 17 on an action roll targeting the Advisor must mark a Stress.

    ", + "description": "

    A PC who rolls less than 17 on an action roll targeting the @Lookup[@name] must mark a Stress.

    ", "resource": null, "actions": { "gtM7UPq6xHgJHPPp": { "type": "damage", "_id": "gtM7UPq6xHgJHPPp", "systemPath": "actions", - "description": "

    A PC who rolls less than 17 on an action roll targeting the Advisor must mark a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -310,14 +310,14 @@ "name": "Bend Ears", "type": "feature", "system": { - "description": "

    Mark a Stress to influence an NPC within Melee range with whispered words. That target’s opinion on one matter shifts toward the Advisor’s preference unless it is in direct opposition to the target’s motives.

    ", + "description": "

    Mark a Stress to influence an NPC within Melee range with whispered words. That target’s opinion on one matter shifts toward the @Lookup[@name]’s preference unless it is in direct opposition to the target’s motives.

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

    Mark a Stress to influence an NPC within Melee range with whispered words. That target’s opinion on one matter shifts toward the Advisor’s preference unless it is in direct opposition to the target’s motives.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -373,7 +373,7 @@ "type": "effect", "_id": "6oaHwUVWTmF362vI", "systemPath": "actions", - "description": "

    Spend a Fear to convince a crowd or notable individual that one person or group is responsible for some problem facing the target. The target becomes hostile to the scapegoat until convinced of their innocence with a successful Presence Roll (17).

    [[/dr trait=presence difficulty=17]]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json b/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json index 064f2e9b..0c8757c5 100644 --- a/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json +++ b/src/packs/adversaries/adversary_Secret_Keeper_sLAccjvCWfeedbpI.json @@ -239,7 +239,7 @@ "type": "attack", "_id": "e6DmGF9vOv27BJ6f", "systemPath": "actions", - "description": "

    Spend 2 Fear to spotlight 1d4 allies. Attacks they make while spotlighted in this way deal half damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -319,7 +319,7 @@ "type": "healing", "_id": "MUdqLSRIpEEk1Ujc", "systemPath": "actions", - "description": "

    When you spotlight an ally within Far range, mark a Stress to gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -413,7 +413,7 @@ "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 @Lookup[@name] is in the spotlight for the first time, activate the countdown. When they mark HP, tick down this countdown by the number of HP marked. When it triggers, summon a @UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demon} who appears at Close range.

    ", "resource": null, "actions": { "0rixG6jLRynAYNqA": { @@ -442,7 +442,7 @@ "type": "countdown", "_id": "ZVXHY2fpomoKV7jG", "systemPath": "actions", - "description": "

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

    ", + "description": "

    Countdown (6). When the @Lookup[@name] is in the spotlight for the first time, activate the countdown.

    ", "chatDisplay": true, "originItem": { "type": "itemCollection" @@ -499,14 +499,14 @@ "name": "Fallen Hounds", "type": "feature", "system": { - "description": "

    Once per scene, when the SecretKeeper marks 2 or more HP, you can mark a Stress to summon a @UUID[Compendium.daggerheart.adversaries.Actor.NoRZ1PqB8N5wcIw0]{Demonic Hound Pack}, which appears at Close range and is immediately spotlighted.

    ", + "description": "

    Once per scene, when the @Lookup[@name] marks 2 or more HP, you can mark a Stress to summon a @UUID[Compendium.daggerheart.adversaries.Actor.NoRZ1PqB8N5wcIw0]{Demonic Hound Pack}, which appears at Close range and is immediately spotlighted.

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

    Once per scene, when the SecretKeeper marks 2 or more HP, you can mark a Stress to summon a @UUID[Compendium.daggerheart.adversaries.Actor.NoRZ1PqB8N5wcIw0]{Demonic Hound Pack}, which appears at Close range and is immediately spotlighted.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json b/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json index 5d6d92cc..e26b48eb 100644 --- a/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json +++ b/src/packs/adversaries/adversary_Sellsword_bgreCaQ6ap2DVpCr.json @@ -216,7 +216,7 @@ "_id": "nLlbuGTKAvsFRnUB", "img": "icons/magic/symbols/runes-carved-stone-yellow.webp", "system": { - "description": "

    The Sellsword is defeated when they take any damage. For every 4 damage a PC deals to the Sellsword, defeat an additional Minion within range the attack would succeed against.

    ", + "description": "

    The @Lookup[@name] is defeated when they take any damage. For every 4 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -242,14 +242,14 @@ "_id": "CQZQiEiRH70Br5Ge", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", "system": { - "description": "

    Spend a Fear to choose a target and spotlight all Sellswords within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 3 physical damage each. Combine this damage.

    ", + "description": "

    Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 3 physical damage each. Combine this damage.

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

    Spend a Fear to choose a target and spotlight all Sellswords within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 3 physical damage each. Combine this damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Shambling_Zombie_2nXz4ilAY4xuhKLm.json b/src/packs/adversaries/adversary_Shambling_Zombie_2nXz4ilAY4xuhKLm.json index 4c27ae4a..7c3925ac 100644 --- a/src/packs/adversaries/adversary_Shambling_Zombie_2nXz4ilAY4xuhKLm.json +++ b/src/packs/adversaries/adversary_Shambling_Zombie_2nXz4ilAY4xuhKLm.json @@ -223,7 +223,7 @@ "_id": "IpUWqXjwP2Lp5Zhs", "img": "icons/magic/death/undead-zombie-grave-green.webp", "system": { - "description": "

    When the Zombie is within Melee range of a creature and at least one other Zombie is within Close range, all attacks against that creature have advantage.

    ", + "description": "

    When the @Lookup[@name] is within Melee range of a creature and at least one other @Lookup[@name] is within Close range, all attacks against that creature have advantage.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -249,14 +249,14 @@ "_id": "iiOjamlZIuhpDC8W", "img": "icons/magic/death/skull-energy-light-purple.webp", "system": { - "description": "

    Targets who mark HP from the Zombie’s attacks must also mark a Stress.

    ", + "description": "

    Targets who mark HP from the @Lookup[@name]’s attacks must also mark a Stress.

    ", "resource": null, "actions": { "JUw16Jag9uTfBmKZ": { "type": "damage", "_id": "JUw16Jag9uTfBmKZ", "systemPath": "actions", - "description": "

    Targets who mark HP from the Zombie’s attacks must also mark a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json b/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json index aeb3c752..e385a6c5 100644 --- a/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json +++ b/src/packs/adversaries/adversary_Shark_YmVAkdNsyuXWTtYp.json @@ -221,14 +221,14 @@ "name": "Terrifying", "type": "feature", "system": { - "description": "

    When the Shark makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

    @Template[type:emanation|range:f]

    ", + "description": "

    When the @Lookup[@name] makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

    @Template[type:emanation|range:f]

    ", "resource": null, "actions": { "NoEb6qR3ktIu9kRJ": { "type": "damage", "_id": "NoEb6qR3ktIu9kRJ", "systemPath": "actions", - "description": "

    When the Shark makes a successful attack, all PCs within Far range lose a Hope and you gain a Fear.

    @Template[type:emanation|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -299,14 +299,14 @@ "name": "Rending Bite", "type": "feature", "system": { - "description": "

    When the Shark makes a successful attack, the target must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack, the target must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

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

    When the Shark makes a successful attack, the target must mark an Armor Slot without receiving its benefits (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -423,14 +423,14 @@ "name": "Blood in the Water", "type": "feature", "system": { - "description": "

    When a creature within Close range of the Shark marks HP from another creature’s attack, you can mark a Stress to immediately spotlight the Shark, moving them into Melee range of the target and making a standard attack.

    ", + "description": "

    When a creature within Close range of the @Lookup[@name] marks HP from another creature’s attack, you can mark a Stress to immediately spotlight the @Lookup[@name], moving them into Melee range of the target and making a standard attack.

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

    When a creature within Close range of the Shark marks HP from another creature’s attack, you can mark a Stress to immediately spotlight the Shark, moving them into Melee range of the target and making a standard attack.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json b/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json index 412fc519..a72c6d46 100644 --- a/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json +++ b/src/packs/adversaries/adversary_Siren_BK4jwyXSRx7IOQiO.json @@ -227,14 +227,14 @@ "name": "Captive Audience", "type": "feature", "system": { - "description": "

    If the Siren makes a standard attack against a target Entranced by their song, the attack deals 2d10+1 damage instead of their standard damage.

    ", + "description": "

    If the @Lookup[@name] makes a standard attack against a target Entranced by their song, the attack deals 2d10+1 damage instead of their standard damage.

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

    If the Siren makes a standard attack against a target Entranced by their song, the attack deals 2d10+1 damage instead of their standard damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -326,14 +326,14 @@ "name": "Enchanting Song", "type": "feature", "system": { - "description": "

    Spend a Fear to sing a song that affects all targets within Close range. Targets must succeed on an Instinct Reaction Roll or become Entranced until they mark 2 Stress. Other Sirens within Close range of the target can mark a Stress to each add a +1 bonus to the Difficulty of the reaction roll. While Entranced, a target can’t act and is Vulnerable.

    @Template[type:emanation|range:c]

    ", + "description": "

    Spend a Fear to sing a song that affects all targets within Close range. Targets must succeed on an Instinct Reaction Roll or become Entranced until they mark 2 Stress. Other @Lookup[@name]s within Close range of the target can mark a Stress to each add a +1 bonus to the Difficulty of the reaction roll. While Entranced, a target can’t act and is Vulnerable.

    @Template[type:emanation|range:c]

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

    Spend a Fear to sing a song that affects all targets within Close range. Targets must succeed on an Instinct Reaction Roll or become Entranced until they mark 2 Stress. Other Sirens within Close range of the target can mark a Stress to each add a +1 bonus to the Difficulty of the reaction roll. While Entranced, a target can’t act and is Vulnerable.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json b/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json index bd47f587..e5381f6f 100644 --- a/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json +++ b/src/packs/adversaries/adversary_Skeleton_Archer_7X5q7a6ueeHs5oA9.json @@ -223,7 +223,7 @@ "_id": "6mL2FQ9pQdfoDNzG", "img": "icons/skills/targeting/crosshair-triple-strike-orange.webp", "system": { - "description": "

    When two or more adversaries are within Very Close range of a creature, all damage the Archer deals to that creature is doubled.

    ", + "description": "

    When two or more adversaries are within Very Close range of a creature, all damage the @Lookup[@name] deals to that creature is doubled.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -256,7 +256,7 @@ "type": "attack", "_id": "nKmxl3D7g4p7Zcub", "systemPath": "actions", - "description": "

    Make an attack against a Vulnerable target within Far range. On a success, mark a Stress to deal 3d4+8 physical damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json b/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json index b1a83ac1..5a973b17 100644 --- a/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json +++ b/src/packs/adversaries/adversary_Skeleton_Dredge_6l1a3Fazq8BoKIcc.json @@ -216,7 +216,7 @@ "_id": "g9GQ9cMPNETxKXOz", "img": "icons/magic/symbols/runes-carved-stone-yellow.webp", "system": { - "description": "

    The Dredge is defeated when they take any damage. For every 4 damage a PC deals to the Dredge, defeat an additional Minion within range the attack would succeed against.

    ", + "description": "

    The @Lookup[@name] is defeated when they take any damage. For every 4 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -242,14 +242,14 @@ "_id": "wl9KKEpVWDBu62hU", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", "system": { - "description": "

    Spend a Fear to choose a target and spotlight all Dredges within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 1 physical damage each. Combine this damage.

    ", + "description": "

    Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 1 physical damage each. Combine this damage.

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

    Spend a Fear to choose a target and spotlight all Dredges within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 1 physical damage each. Combine this damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json b/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json index 769302b2..3c26dd28 100644 --- a/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json +++ b/src/packs/adversaries/adversary_Skeleton_Knight_Q9LaVTyXF9NF12C7.json @@ -223,14 +223,14 @@ "_id": "OZKEz4eK9h7zCbuf", "img": "icons/magic/death/skull-energy-light-purple.webp", "system": { - "description": "

    When the Knight makes a successful attack, all PCs within Close range lose a Hope and you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack, all PCs within Close range lose a Hope and you gain a Fear.

    ", "resource": null, "actions": { "9EiPNrGzwLtuf9g0": { "type": "damage", "_id": "9EiPNrGzwLtuf9g0", "systemPath": "actions", - "description": "

    When the Knight makes a successful attack, all PCs within Close range lose a Hope and you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -302,14 +302,14 @@ "_id": "WdVLwy9RNkVlZnCL", "img": "icons/skills/melee/strike-sword-steel-yellow.webp", "system": { - "description": "

    Mark a Stress to make an attack against all targets within Very Close range. Targets the Knight succeeds against take 1d8+2 physical damage and must mark a Stress.

    @Template[type:emanation|range:vc]

    ", + "description": "

    Mark a Stress to make an attack against all targets within Very Close range. Targets the @Lookup[@name] succeeds against take 1d8+2 physical damage and must mark a Stress.

    @Template[type:emanation|range:vc]

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

    Mark a Stress to make an attack against all targets within Very Close range. Targets the Knight succeeds against take 1d8+2 physical damage and must mark a Stress.

    @Template[type:emanation|range:vc]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -435,14 +435,14 @@ "_id": "STesKV2KB61PlwCh", "img": "icons/magic/death/hand-undead-skeleton-fire-pink.webp", "system": { - "description": "

    When the Knight is defeated, they make an attack against a target within Very Close range (prioritizing the creature who killed them). On a success, the target takes 1d4+8 physical damage and loses 1d4 Hope.

    ", + "description": "

    When the @Lookup[@name] is defeated, they make an attack against a target within Very Close range (prioritizing the creature who killed them). On a success, the target takes 1d4+8 physical damage and loses 1d4 Hope.

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

    When the Knight is defeated, they make an attack against a target within Very Close range (prioritizing the creature who killed them). On a success, the target takes 1d4+8 physical damage and loses 1d4 Hope.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json b/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json index e9a5d149..28003d5c 100644 --- a/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json +++ b/src/packs/adversaries/adversary_Skeleton_Warrior_10YIQl0lvCJXZLfX.json @@ -223,7 +223,7 @@ "_id": "ouvJweENF1kLYcOT", "img": "icons/magic/death/bones-crossed-orange.webp", "system": { - "description": "

    The Warrior is resistant to physical damage.

    ", + "description": "

    The @Lookup[@name] is resistant to physical damage.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -293,7 +293,7 @@ "_id": "hYl31ThCmZdc0MFa", "img": "icons/magic/death/hand-dirt-undead-zombie.webp", "system": { - "description": "

    When the Warrior is defeated, you can spotlight them and roll a d6. On a result of 6, if there are other adversaries on the battlefi eld, the Warrior re-forms with no marked HP.

    ", + "description": "

    When the @Lookup[@name] is defeated, you can spotlight them and roll a d6. On a result of 6, if there are other adversaries on the battlefield, the @Lookup[@name] re-forms with no marked HP.

    ", "resource": null, "actions": { "QnuFrptj8oARaA3i": { diff --git a/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json b/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json index 37398954..e6cc30f7 100644 --- a/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json +++ b/src/packs/adversaries/adversary_Spectral_Archer_5tCkhnBByUIN5UdG.json @@ -227,7 +227,7 @@ "name": "Ghost", "type": "feature", "system": { - "description": "

    The Archer has resistance to physical damage. Mark a Stress to move up to Close range through solid objects.

    ", + "description": "

    The @Lookup[@name] has resistance to physical damage. Mark a Stress to move up to Close range through solid objects.

    ", "resource": null, "actions": { "kkKfo1gwetxB3tFQ": { @@ -333,7 +333,7 @@ "type": "attack", "_id": "KahJnM94QQfy6oMK", "systemPath": "actions", - "description": "

    Spend a Fear to make an attack within Far range against a PC who is within Very Close range of at least two other PCs. On a success, the target takes 2d8+12 physical damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json b/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json index c4da2d97..b70a5d53 100644 --- a/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json +++ b/src/packs/adversaries/adversary_Spectral_Captain_65cSO3EQEh6ZH6Xk.json @@ -227,7 +227,7 @@ "name": "Ghost", "type": "feature", "system": { - "description": "

    The Captain has resistance to physical damage. Mark a Stress to move up to Close range through solid objects.

    ", + "description": "

    The @Lookup[@name] has resistance to physical damage. Mark a Stress to move up to Close range through solid objects.

    ", "resource": null, "actions": { "k7RuXErgCsEBmhmk": { @@ -333,7 +333,7 @@ "type": "effect", "_id": "eHmbN4aPLUuEoDQt", "systemPath": "actions", - "description": "

    Spend 2 Fear to return up to [[/r 1d4+1]] defeated Spectral allies to the battle at the points where they first appeared (with no marked HP or Stress).

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -382,14 +382,14 @@ "name": "Hold Fast", "type": "feature", "system": { - "description": "

    When the Captain’s Spectral allies are forced to make a reaction roll, you can mark a Stress to give those allies a +2 bonus to the roll.

    ", + "description": "

    When the @Lookup[@name]’s Spectral allies are forced to make a reaction roll, you can mark a Stress to give those allies a +2 bonus to the roll.

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

    When the Captain’s Spectral allies are forced to make a reaction roll, you can mark a Stress to give those allies a +2 bonus to the roll.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -438,14 +438,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

    When the Captain makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "tZKpqKdehnPxRsOc": { "type": "healing", "_id": "tZKpqKdehnPxRsOc", "systemPath": "actions", - "description": "

    When the Captain makes a successful attack against a PC, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "reaction", "cost": [], diff --git a/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json b/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json index b41573f4..577a7d25 100644 --- a/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json +++ b/src/packs/adversaries/adversary_Spectral_Guardian_UFVGl1osOsJTneLf.json @@ -227,7 +227,7 @@ "name": "Ghost", "type": "feature", "system": { - "description": "

    The Guardian has resistance to physical damage. Mark a Stress to move up to Close range through solid objects.

    ", + "description": "

    The @Lookup[@name] has resistance to physical damage. Mark a Stress to move up to Close range through solid objects.

    ", "resource": null, "actions": { "X1JlwWqyYHjahbpA": { @@ -333,7 +333,7 @@ "type": "attack", "_id": "AdfULyYsj9YPcCj6", "systemPath": "actions", - "description": "

    Spend a Fear to make an attack against a target within Very Close range. On a success, deal 2d10+6 physical damage and the target must mark a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json b/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json index 2d9f2374..13d6ed84 100644 --- a/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json +++ b/src/packs/adversaries/adversary_Spellblade_ldbWEL7uZs84vyrR.json @@ -230,7 +230,7 @@ "_id": "BwuoAv3EWT0m1apk", "img": "icons/weapons/swords/sword-runed-glowing.webp", "system": { - "description": "

    Damage dealt by the Spellblade’s standard attack is considered both physical and magic.

    ", + "description": "

    Damage dealt by the @Lookup[@name]’s standard attack is considered both physical and magic.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -263,7 +263,7 @@ "type": "attack", "_id": "K4VnxigKTiu7hhZx", "systemPath": "actions", - "description": "

    Mark a Stress and target a group within Far range. All targets must succeed on an Agility Reaction Roll or take 1d8+2 magic damage. You gain a Fear for each target who marked HP from this attack.

    @Template[type:emanation|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -364,14 +364,14 @@ "_id": "piyJhdHzztabmZ8I", "img": "icons/skills/movement/arrows-up-trio-red.webp", "system": { - "description": "

    Spend 2 Fear to spotlight up to fi ve allies within Far range.

    ", + "description": "

    Spend 2 Fear to spotlight up to five allies within Far range.

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

    Spend 2 Fear to spotlight up to fi ve allies within Far range.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -421,14 +421,14 @@ "_id": "P9nD5K2ztkZGo2I8", "img": "icons/skills/melee/strike-weapons-orange.webp", "system": { - "description": "

    When the Spellblade makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "f4AulN6MeMaEvqbk": { "type": "healing", "_id": "f4AulN6MeMaEvqbk", "systemPath": "actions", - "description": "

    When the Spellblade makes a successful attack against a PC, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "reaction", "cost": [], diff --git a/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json b/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json index 1ebe23ff..5affdc44 100644 --- a/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json +++ b/src/packs/adversaries/adversary_Spy_8zlynOhnVA59KpKT.json @@ -227,14 +227,14 @@ "name": "Gathering Secrets", "type": "feature", "system": { - "description": "

    Spend a Fear to describe how the Spy knows a secret about a PC in the scene.

    ", + "description": "

    Spend a Fear to describe how the @Lookup[@name] knows a secret about a PC in the scene.

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

    Spend a Fear to describe how the Spy knows a secret about a PC in the scene.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -283,14 +283,14 @@ "name": "Fly on the Wall", "type": "feature", "system": { - "description": "

    When a PC or group is discussing something sensitive, you can mark a Stress to reveal that the Spy is present in the scene, observing them. If the Spy escapes the scene to report their findings, you gain 1d4 Fear.

    ", + "description": "

    When a PC or group is discussing something sensitive, you can mark a Stress to reveal that the @Lookup[@name] is present in the scene, observing them. If the @Lookup[@name] escapes the scene to report their findings, you gain 1d4 Fear.

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

    When a PC or group is discussing something sensitive, you can mark a Stress to reveal that the Spy is present in the scene, observing them. If the Spy escapes the scene to report their findings, you gain 1d4 Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -319,7 +319,7 @@ "type": "healing", "_id": "qCA2hTMIYGW0FhGy", "systemPath": "actions", - "description": "

    If the Spy escapes the scene to report their findings, you gain 1d4 Fear.

    ", + "description": "

    If the @Lookup[@name] escapes the scene to report their findings, you gain 1d4 Fear.

    ", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json b/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json index 3785ea48..603182cc 100644 --- a/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json +++ b/src/packs/adversaries/adversary_Stag_Knight_KGVwnLq85ywP9xvB.json @@ -227,14 +227,14 @@ "name": "From Above", "type": "feature", "system": { - "description": "

    When the Knight succeeds on a standard attack from above a target, they deal 3d12+3 physical damage instead of their standard damage.

    ", + "description": "

    When the @Lookup[@name] succeeds on a standard attack from above a target, they deal 3d12+3 physical damage instead of their standard damage.

    ", "resource": null, "actions": { "PZNJgyomR7MK2xUP": { "type": "damage", "_id": "PZNJgyomR7MK2xUP", "systemPath": "actions", - "description": "

    When the Knight succeeds on a standard attack from above a target, they deal 3d12+3 physical damage instead of their standard damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -306,14 +306,14 @@ "name": "Blade of the Forest", "type": "feature", "system": { - "description": "

    Spend a Fear to make an attack against all targets within Very Close range. Targets the Knight succeeds against take physical damage equal to [[/r 3d4]] + the target’s Major threshold.

    @Template[type:emanation|range:vc]

    ", + "description": "

    Spend a Fear to make an attack against all targets within Very Close range. Targets the @Lookup[@name] succeeds against take physical damage equal to [[/r 3d4]] + the target’s Major threshold.

    @Template[type:emanation|range:vc]

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

    Spend a Fear to make an attack against all targets within Very Close range. Targets the Knight succeeds against take physical damage equal to [[/r 3d4]] + the target’s Major threshold.

    @Template[type:emanation|range:vc]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -386,14 +386,14 @@ "name": "Thorny Armor", "type": "feature", "system": { - "description": "

    When the Knight takes damage from an attack within Melee range, you can mark a Stress to deal 1d10+5 physical damage to the attacker.

    ", + "description": "

    When the @Lookup[@name] takes damage from an attack within Melee range, you can mark a Stress to deal 1d10+5 physical damage to the attacker.

    ", "resource": null, "actions": { "b5KO7xpWspZS0swK": { "type": "damage", "_id": "b5KO7xpWspZS0swK", "systemPath": "actions", - "description": "

    When the Knight takes damage from an attack within Melee range, you can mark a Stress to deal 1d10+5 physical damage to the attacker.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json b/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json index 1c4f6b11..de3ef9f2 100644 --- a/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json +++ b/src/packs/adversaries/adversary_Stonewraith_3aAS2Qm3R6cgaYfE.json @@ -227,7 +227,7 @@ "name": "Stonestrider", "type": "feature", "system": { - "description": "

    The Stonewraith can move through stone and earth as easily as air. While within stone or earth, they are Hidden and immune to all damage.

    ", + "description": "

    The @Lookup[@name] can move through stone and earth as easily as air. While within stone or earth, they are Hidden and immune to all damage.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -259,7 +259,7 @@ "type": "attack", "_id": "E8C2Nd4mwcGTXoXb", "systemPath": "actions", - "description": "

    While Hidden, mark a Stress to leap into Melee range with a target within Very Close range. The target must succeed on an Agility or Instinct Reaction Roll (15) or take 2d8 physical damage and become temporarily Restrained.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -408,7 +408,7 @@ "type": "attack", "_id": "4UGEEuK9XY8leCBV", "systemPath": "actions", - "description": "

    Spend a Fear to roar while within a cave and cause a cave-in. All targets within Close range must succeed on an Agility Reaction Roll (14) or take 2d10 physical damage. The rubble can be cleared with a Progress Countdown (8).

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -545,14 +545,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

    When the Stonewraith makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "IIZPctjF4MJkWs4b": { "type": "healing", "_id": "IIZPctjF4MJkWs4b", "systemPath": "actions", - "description": "

    When the Stonewraith makes a successful attack against a PC, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "reaction", "cost": [], diff --git a/src/packs/adversaries/adversary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json b/src/packs/adversaries/adversary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json index 500744e2..33fe06d7 100644 --- a/src/packs/adversaries/adversary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json +++ b/src/packs/adversaries/adversary_Swarm_of_Rats_qNgs3AbLyJrY19nt.json @@ -223,7 +223,7 @@ "_id": "9Zuu892SO5NmtI4w", "img": "icons/creatures/magical/humanoid-silhouette-aliens-green.webp", "system": { - "description": "

    When the Swarm has marked half or more of their HP, their standard attack deals 1d4+1 physical damage instead.

    ", + "description": "

    When the @Lookup[@name] has marked half or more of their HP, their standard attack deals 1d4+1 physical damage instead.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -249,7 +249,7 @@ "_id": "0O6ckwZE34RBnjpB", "img": "icons/creatures/mammals/rodent-rat-green.webp", "system": { - "description": "

    All targets within Melee range have disadvantage on attacks against targets other than the Swarm.

    ", + "description": "

    All targets within Melee range have disadvantage on attacks against targets other than the @Lookup[@name].

    ", "resource": null, "actions": {}, "originItemType": null, diff --git a/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json b/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json index 182afa6a..2ec5e924 100644 --- a/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json +++ b/src/packs/adversaries/adversary_Sylvan_Soldier_VtFBt9XBE0WrGGxP.json @@ -229,14 +229,14 @@ "_id": "uo5DbPuQQ018Pyfd", "img": "icons/creatures/abilities/wolf-howl-moon-purple.webp", "system": { - "description": "

    If the Soldier makes a standard attack and another Sylvan Soldier is within Melee range of the target, deal 1d8+5 physical damage instead of their standard damage.

    ", + "description": "

    If the @Lookup[@name] makes a standard attack and another @Lookup[@name] is within Melee range of the target, deal 1d8+5 physical damage instead of their standard damage.

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

    If the Soldier makes a standard attack and another Sylvan Soldier is within Melee range of the target, deal 1d8+5 physical damage instead of their standard damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -336,7 +336,7 @@ "type": "attack", "_id": "UyL02IaAO3m8LgWI", "systemPath": "actions", - "description": "

    Spend a Fear to pull down a tree within Close range. A creature hit by the tree must succeed on an Agility Reaction Roll (15) or take 1d10 physical damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -437,14 +437,14 @@ "_id": "1dmKoSnV82sLc8xZ", "img": "icons/magic/nature/root-vine-leaves-green.webp", "system": { - "description": "

    When the Soldier makes a successful attack, you can mark a Stress to become Hidden until the Soldier’s next attack or a PC succeeds on an Instinct Roll (14) to find them.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack, you can mark a Stress to become Hidden until the @Lookup[@name]’s next attack or a PC succeeds on an Instinct Roll (14) to find them.

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

    When the Soldier makes a successful attack, you can mark a Stress to become Hidden until the Soldier’s next attack or a PC succeeds on an Instinct Roll (14) to find them.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json b/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json index e914cba5..639fa956 100644 --- a/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json +++ b/src/packs/adversaries/adversary_Tangle_Bramble_Swarm_PKSXFuaIHUCoH63A.json @@ -259,7 +259,7 @@ "_id": "4dSzqtYvH385r9Ng", "img": "icons/creatures/magical/humanoid-silhouette-aliens-green.webp", "system": { - "description": "

    When the Swarm has marked half or more of their HP, their standard attack deals 1d4+2 physical damage instead.

    ", + "description": "

    When the @Lookup[@name] has marked half or more of their HP, their standard attack deals 1d4+2 physical damage instead.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -292,7 +292,7 @@ "type": "damage", "_id": "CiA4K6py0eW6eihU", "systemPath": "actions", - "description": "

    Mark a Stress to deal 2d6+8 direct physical damage to a target with 3 or more bramble tokens.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -376,14 +376,14 @@ "_id": "JRSGc3ozDnKCAvCj", "img": "icons/magic/nature/root-vine-entangled-hands.webp", "system": { - "description": "

    When the Swarm succeeds on an attack, give the target a bramble token. If a target has any bramble tokens, they are Restrained. If a target has 3 or more bramble tokens, they are also Vulnerable. All bramble tokens can be removed by succeeding on a Finesse Roll (12 + the number of bramble tokens) or dealing Major or greater damage to the Swarm. If bramble tokens are removed from a target using a Finesse Roll, a number of Tangle Bramble Minions spawn within Melee range equal to the number of tokens removed.

    ", + "description": "

    When the @Lookup[@name] succeeds on an attack, give the target a bramble token. If a target has any bramble tokens, they are Restrained. If a target has 3 or more bramble tokens, they are also Vulnerable. All bramble tokens can be removed by succeeding on a Finesse Roll (12 + the number of bramble tokens) or dealing Major or greater damage to the Swarm. If bramble tokens are removed from a target using a Finesse Roll, a number of @Lookup[@name] Minions spawn within Melee range equal to the number of tokens removed.

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

    When the Swarm succeeds on an attack, give the target a bramble token. If a target has any bramble tokens, they are Restrained. If a target has 3 or more bramble tokens, they are also Vulnerable. All bramble tokens can be removed by succeeding on a Finesse Roll (12 + the number of bramble tokens) or dealing Major or greater damage to the Swarm. If bramble tokens are removed from a target using a Finesse Roll, a number of Tangle Bramble Minions spawn within Melee range equal to the number of tokens removed.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json b/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json index 18baa82c..a6e5ca17 100644 --- a/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json +++ b/src/packs/adversaries/adversary_Tangle_Bramble_XcAGOSmtCFLT1unN.json @@ -255,7 +255,7 @@ "_id": "jH1VMpj4dCUhKVCJ", "img": "icons/magic/symbols/runes-carved-stone-yellow.webp", "system": { - "description": "

    The Bramble is defeated when they take any damage. For every 4 damage a PC deals to the Tangle Bramble, defeat an additional Minion within range the attack would succeed against.

    ", + "description": "

    The @Lookup[@name] is defeated when they take any damage. For every 4 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -281,14 +281,14 @@ "_id": "WiobzuyvJ46zfsOv", "img": "icons/creatures/abilities/tail-strike-bone-orange.webp", "system": { - "description": "

    Spend a Fear to choose a target and spotlight all Tangle Brambles within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 2 physical damage each. Combine this damage.

    ", + "description": "

    Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 2 physical damage each. Combine this damage.

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

    Spend a Fear to choose a target and spotlight all Tangle Brambles within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 2 physical damage each. Combine this damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -338,7 +338,7 @@ "_id": "KBMf7oBfFSHoafKN", "img": "icons/magic/nature/root-vines-knot-brown.webp", "system": { - "description": "

    When an attack from the Bramble causes a target to mark HP and there are three or more Tangle Bramble Minions within Close range, you can combine the Minions into a @UUID[Compendium.daggerheart.adversaries.Actor.PKSXFuaIHUCoH63A]{Tangle Bramble Swarm Horde}. The Horde’s HP is equal to the number of Minions combined.

    ", + "description": "

    When an attack from the @Lookup[@name] causes a target to mark HP and there are three or more @Lookup[@name] Minions within Close range, you can combine the Minions into a @UUID[Compendium.daggerheart.adversaries.Actor.PKSXFuaIHUCoH63A]{Tangle Bramble Swarm Horde}. The Horde’s HP is equal to the number of Minions combined.

    ", "resource": null, "actions": {}, "originItemType": null, diff --git a/src/packs/adversaries/adversary_Tiny_Green_Ooze_aLkLFuVoKz2NLoBK.json b/src/packs/adversaries/adversary_Tiny_Green_Ooze_aLkLFuVoKz2NLoBK.json index 5371aa70..6a984b3c 100644 --- a/src/packs/adversaries/adversary_Tiny_Green_Ooze_aLkLFuVoKz2NLoBK.json +++ b/src/packs/adversaries/adversary_Tiny_Green_Ooze_aLkLFuVoKz2NLoBK.json @@ -219,14 +219,14 @@ "_id": "WpOh5kHHx7lcTvEY", "img": "icons/magic/acid/dissolve-drip-droplet-smoke.webp", "system": { - "description": "

    When the Ooze makes a successful attack, the target must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack, the target must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

    ", "resource": null, "actions": { "HfK0u0c7NRppuF1Q": { "type": "damage", "_id": "HfK0u0c7NRppuF1Q", "systemPath": "actions", - "description": "

    When the Ooze makes a successful attack, the target must mark an Armor Slot without receiving its benefi ts (they can still use armor to reduce the damage). If they can’t mark an Armor Slot, they must mark an additional HP.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json b/src/packs/adversaries/adversary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json index a8d1efb7..116fffba 100644 --- a/src/packs/adversaries/adversary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json +++ b/src/packs/adversaries/adversary_Tiny_Red_Ooze_1fkLQXVtmILqfJ44.json @@ -219,7 +219,7 @@ "_id": "zsUMP2qNmNpVHwk0", "img": "icons/magic/fire/blast-jet-stream-splash.webp", "system": { - "description": "

    When a creature within Melee range deals damage to the Ooze, they take 1d6 direct magic damage.

    ", + "description": "

    When a creature within Melee range deals damage to the @Lookup[@name], they take 1d6 direct magic damage.

    ", "resource": null, "actions": { "cHaEnBwinVKmoS9s": { diff --git a/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json b/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json index 7c734bf2..8959f78a 100644 --- a/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json +++ b/src/packs/adversaries/adversary_Treant_Sapling_o63nS0k3wHu6EgKP.json @@ -214,7 +214,7 @@ "name": "Minion (6)", "type": "feature", "system": { - "description": "

    The Sapling is defeated when they take any damage. For every 6 damage a PC deals to the Sapling, defeat an additional Minion within range the attack would succeed against.

    ", + "description": "

    The @Lookup[@name] is defeated when they take any damage. For every 6 damage a PC deals to the @Lookup[@name], defeat an additional Minion within range the attack would succeed against.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -239,7 +239,7 @@ "name": "Group Attack", "type": "feature", "system": { - "description": "

    Spend a Fear to choose a target and spotlight all Treant Saplings within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 8 physical damage each. Combine this damage.

    ", + "description": "

    Spend a Fear to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 8 physical damage each. Combine this damage.

    ", "resource": null, "actions": { "euP8VA4wvfsCpwN1": { diff --git a/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json b/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json index 0ec631f1..4f51cd79 100644 --- a/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json +++ b/src/packs/adversaries/adversary_Vampire_WWyUp6Mxl1S3KYUG.json @@ -227,14 +227,14 @@ "name": "Draining Bite", "type": "feature", "system": { - "description": "

    Make an attack against a target within Melee range. On a success, deal 5d4 physical damage. A target who marks HP from this attack loses a Hope and must mark a Stress. The Vampire then clears a HP.

    ", + "description": "

    Make an attack against a target within Melee range. On a success, deal 5d4 physical damage. A target who marks HP from this attack loses a Hope and must mark a Stress. The @Lookup[@name] then clears a HP.

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

    Make an attack against a target within Melee range. On a success, deal 5d4 physical damage. A target who marks HP from this attack loses a Hope and must mark a Stress. The Vampire then clears a HP.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -375,14 +375,14 @@ "name": "Mistform", "type": "feature", "system": { - "description": "

    When the Vampire takes physical damage, you can spend a Fear to take half damage.

    ", + "description": "

    When the @Lookup[@name] takes physical damage, you can spend a Fear to take half damage.

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

    When the Vampire takes physical damage, you can spend a Fear to take half damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json b/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json index 248ff278..d1cca592 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Gaoler_JqYraOqNmmhHk4Yy.json @@ -221,7 +221,7 @@ "name": "Blocking Shield", "type": "feature", "system": { - "description": "

    Creatures within Melee range of the Gaoler have disadvantage on attack rolls against them. Creatures trapped inside the Gaoler are immune to this feature.

    ", + "description": "

    Creatures within Melee range of the @Lookup[@name] have disadvantage on attack rolls against them. Creatures trapped inside the @Lookup[@name] are immune to this feature.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -246,14 +246,14 @@ "name": "Lock Up", "type": "feature", "system": { - "description": "

    Mark a Stress to make an attack against a target within Very Close range. On a success, the target is Restrained within the Gaoler until freed with a successful Strength Roll (18). While Restrained, the target can only attack the Gaoler.

    ", + "description": "

    Mark a Stress to make an attack against a target within Very Close range. On a success, the target is Restrained within the @Lookup[@name] until freed with a successful Strength Roll (18). While Restrained, the target can only attack the @Lookup[@name].

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

    Mark a Stress to make an attack against a target within Very Close range. On a success, the target is Restrained within the Gaoler until freed with a successful Strength Roll (18). While Restrained, the target can only attack the Gaoler.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json b/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json index bf525d9e..67139669 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Sentinel_FVgYb28fhxlVcGwA.json @@ -221,7 +221,7 @@ "name": "Kinetic Slam", "type": "feature", "system": { - "description": "

    Targets who take damage from the Sentinel’s standard attack are knocked back to Very Close range.

    ", + "description": "

    Targets who take damage from the @Lookup[@name]’s standard attack are knocked back to Very Close range.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -246,14 +246,14 @@ "name": "Box In", "type": "feature", "system": { - "description": "

    Mark a Stress to choose a target within Very Close range to focus on. That target has disadvantage on attack rolls when they’re within Very Close range of the Sentinel. The Sentinel can only focus on one target at a time.

    ", + "description": "

    Mark a Stress to choose a target within Very Close range to focus on. That target has disadvantage on attack rolls when they’re within Very Close range of the @Lookup[@name]. The @Lookup[@name]Sentinel can only focus on one target at a time.

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

    Mark a Stress to choose a target within Very Close range to focus on. That target has disadvantage on attack rolls when they’re within Very Close range of the Sentinel. The Sentinel can only focus on one target at a time.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -358,7 +358,7 @@ "type": "attack", "_id": "mI9i9iwrM48NjzeE", "systemPath": "actions", - "description": "

    Spend a Fear to lob explosive magic at a point within Far range. All targets within Very Close range of that point must make an Agility Reaction Roll. Targets who fail take 2d8+20 magic damage and are knocked back to Close range. Targets who succeed take half damage and aren’t knocked back.

    @Template[type:circle|range:vc]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -458,14 +458,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

    When the Sentinel makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "AtXg38fItOgiYUee": { "type": "healing", "_id": "AtXg38fItOgiYUee", "systemPath": "actions", - "description": "

    When the Sentinel makes a successful attack against a PC, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "reaction", "cost": [], diff --git a/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json b/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json index cf259cdb..ab683607 100644 --- a/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json +++ b/src/packs/adversaries/adversary_Vault_Guardian_Turret_c5hGdvY5UnSjlHws.json @@ -221,7 +221,7 @@ "name": "Slow Firing", "type": "feature", "system": { - "description": "

    When you spotlight the Turret and they don’t have a token on their stat block, they can’t make a standard attack. Place a token on their stat block and describe what they’re preparing to do. When you spotlight the Turret and they have a token on their stat block, clear the token and they can attack.

    ", + "description": "

    When you spotlight the @Lookup[@name] and they don’t have a token on their stat block, they can’t make a standard attack. Place a token on their stat block and describe what they’re preparing to do. When you spotlight the @Lookup[@name] and they have a token on their stat block, clear the token and they can attack.

    ", "resource": { "type": "simple", "value": 0, @@ -251,14 +251,14 @@ "name": "Mark Target", "type": "feature", "system": { - "description": "

    Spend a Fear to Mark a target within Far range until the Turret is destroyed or the Marked target becomes Hidden. While the target is Marked, their Evasion is halved.

    ", + "description": "

    Spend a Fear to Mark a target within Far range until the @Lookup[@name] is destroyed or the Marked target becomes Hidden. While the target is Marked, their Evasion is halved.

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

    Spend a Fear to Mark a target within Far range until the Turret is destroyed or the Marked target becomes Hidden. While the target is Marked, their Evasion is halved.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -356,14 +356,14 @@ "name": "Concentrate Fire", "type": "feature", "system": { - "description": "

    When another adversary deals damage to a target within Far range of the Turret, you can mark a Stress to add the Turret’s standard attack damage to the damage roll.

    ", + "description": "

    When another adversary deals damage to a target within Far range of the @Lookup[@name], you can mark a Stress to add the @Lookup[@name]’s standard attack damage to the damage roll.

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

    When another adversary deals damage to a target within Far range of the Turret, you can mark a Stress to add the Turret’s standard attack damage to the damage roll.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -412,14 +412,14 @@ "name": "Detonation", "type": "feature", "system": { - "description": "

    When the Turret is destroyed, they explode. All targets within Close range must make an Agility Reaction Roll. Targets who fail take 3d20 physical damage. Targets who succeed take half damage.

    @Template[type:emanation|range:c]

    ", + "description": "

    When the @Lookup[@name] is destroyed, they explode. All targets within Close range must make an Agility Reaction Roll. Targets who fail take 3d20 physical damage. Targets who succeed take half damage.

    @Template[type:emanation|range:c]

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

    When the Turret is destroyed, they explode. All targets within Close range must make an Agility Reaction Roll. Targets who fail take 3d20 physical damage. Targets who succeed take half damage.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], 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 25bc361c..82bdd810 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Ashen_Tyrant_pMuXGCSOQaxpi5tb.json @@ -252,14 +252,14 @@ "name": "Relentless (4)", "type": "feature", "system": { - "description": "

    The Ashen Tyrant can be spotlighted up to four times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "

    The @Lookup[@name] can be spotlighted up to four times per GM turn. Spend Fear as usual to spotlight them.

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

    The Ashen Tyrant can be spotlighted up to four times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -310,7 +310,7 @@ "name": "Cornered", "type": "feature", "system": { - "description": "

    Mark a Stress instead of spending a Fear to spotlight the Ashen Tyrant.

    ", + "description": "

    Mark a Stress instead of spending a Fear to spotlight the @Lookup[@name].

    ", "resource": null, "actions": { "nIBoqkOFWx0vpbnj": { @@ -365,7 +365,7 @@ "name": "Injured Wings", "type": "feature", "system": { - "description": "

    While flying, the Ashen Tyrant gains a +1 bonus to their Difficulty.

    ", + "description": "

    While flying, the @Lookup[@name] gains a +1 bonus to their Difficulty.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -434,14 +434,14 @@ "name": "Ashes to Ashes", "type": "feature", "system": { - "description": "

    When a PC rolls a failure while within Close range of the Ashen Tyrant, they lose a Hope and you gain a Fear. If the PC can’t lose a Hope, they must mark a HP.

    ", + "description": "

    When a PC rolls a failure while within Close range of the @Lookup[@name], they lose a Hope and you gain a Fear. If the PC can’t lose a Hope, they must mark a HP.

    ", "resource": null, "actions": { "q6gbeIrGMII6IeiM": { "type": "damage", "_id": "q6gbeIrGMII6IeiM", "systemPath": "actions", - "description": "

    When a PC rolls a failure while within Close range of the Ashen Tyrant, they lose a Hope and you gain a Fear. If the PC can’t lose a Hope, they must mark a HP.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -512,14 +512,14 @@ "name": "Desperate Rampage", "type": "feature", "system": { - "description": "

    Mark a Stress to make an attack against all targets within Close range. Targets the Ashen Tyrant succeeds against take 2d20+2 physical damage, are knocked back to Close range of where they were, and must mark a Stress.

    @Template[type:emanation|range:c]

    ", + "description": "

    Mark a Stress to make an attack against all targets within Close range. Targets the @Lookup[@name] succeeds against take 2d20+2 physical damage, are knocked back to Close range of where they were, and must mark a Stress.

    @Template[type:emanation|range:c]

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

    Mark a Stress to make an attack against all targets within Close range. Targets the Ashen Tyrant succeeds against take 2d20+2 physical damage, are knocked back to Close range of where they were, and must mark a Stress.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -644,7 +644,7 @@ "type": "effect", "_id": "UrD4A68IBJgyfvvt", "systemPath": "actions", - "description": "

    Spend a Fear to smash the ground and kick up ash within Far range. While within the ash cloud, a target has disadvantage on action rolls. The ash cloud clears the next time an adversary is spotlighted.

    @Template[type:emanation|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -693,14 +693,14 @@ "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 @Lookup[@name] 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 @Lookup[@name] 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": { "OznXxmwiPwzuFPQZ": { "type": "attack", "_id": "OznXxmwiPwzuFPQZ", "systemPath": "actions", - "description": "

    When the countdown 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": "

    When the countdown triggers, the @Lookup[@name] 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 @Lookup[@name] is defeated while this countdown is active, trigger the countdown immediately as the destruction caused by their death throes.

    @Template[type:emanation|range:f]

    ", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json b/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json index befbca6e..b23da064 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Molten_Scourge_eArAPuB38CNR0ZIM.json @@ -252,14 +252,14 @@ "name": "Relentless (3)", "type": "feature", "system": { - "description": "

    The Molten Scourge can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "

    The @Lookup[@name] can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

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

    The Molten Scourge can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -310,7 +310,7 @@ "name": "Cracked Scales", "type": "feature", "system": { - "description": "

    When the Molten Scourge takes damage, roll a number of d6s equal to HP marked. For each result of 4 or higher, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] takes damage, roll a number of d6s equal to HP marked. For each result of 4 or higher, you gain a Fear.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -335,14 +335,14 @@ "name": "Shattering Might", "type": "feature", "system": { - "description": "

    Mark a Stress to make an attack against a target within Very Close range. On a success, the target takes 4d8+1 physical damage, loses a Hope, and is knocked back to Close range. The Molten Scourge clears a Stress.

    ", + "description": "

    Mark a Stress to make an attack against a target within Very Close range. On a success, the target takes 4d8+1 physical damage, loses a Hope, and is knocked back to Close range. The @Lookup[@name] clears a Stress.

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

    Mark a Stress to make an attack against a target within Very Close range. On a success, the target takes 4d8+1 physical damage, loses a Hope, and is knocked back to Close range. The Molten Scourge clears a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -442,14 +442,14 @@ "name": "Eruption", "type": "feature", "system": { - "description": "

    Spend a Fear to erupt lava from beneath the Molten Scourge’s scales, filling the area within Very Close range with molten lava. All targets in that area must succeed on an Agility Reaction Roll or take 4d6+6 physical damage and be knocked back to Close range. This area remains lava. When a creature other than the Molten Scourge enters that area or acts while inside of it, they must mark 6 HP.

    @Template[type:emanation|range:vc]

    ", + "description": "

    Spend a Fear to erupt lava from beneath the @Lookup[@name]’s scales, filling the area within Very Close range with molten lava. All targets in that area must succeed on an Agility Reaction Roll or take 4d6+6 physical damage and be knocked back to Close range. This area remains lava. When a creature other than the @Lookup[@name] enters that area or acts while inside of it, they must mark 6 HP.

    @Template[type:emanation|range:vc]

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

    Spend a Fear to erupt lava from beneath the Molten Scourge’s scales, filling the area within Very Close range with molten lava. All targets in that area must succeed on an Agility Reaction Roll or take 4d6+6 physical damage and be knocked back to Close range. This area remains lava. When a creature other than the Molten Scourge enters that area or acts while inside of it, they must mark 6 HP.

    @Template[type:emanation|range:vc]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -542,14 +542,14 @@ "name": "Volcanic Breath", "type": "feature", "system": { - "description": "

    When the Molten Scourge takes Major damage, roll a d10. On a result of 8 or higher, the Molten Scourge breathes a flow of lava in front of them within Far range. All targets in that area must make an Agility Reaction Roll. Targets who fail take 2d10+4 physical damage, mark 1d4 Stress, and are Vulnerable until they clear a Stress. Targets who succeed take half damage and must mark a Stress.

    @Template[type:inFront|range:f]

    ", + "description": "

    When the @Lookup[@name] takes Major damage, roll a d10. On a result of 8 or higher, the @Lookup[@name] breathes a flow of lava in front of them within Far range. All targets in that area must make an Agility Reaction Roll. Targets who fail take 2d10+4 physical damage, mark 1d4 Stress, and are Vulnerable until they clear a Stress. Targets who succeed take half damage and must mark a Stress.

    @Template[type:inFront|range:f]

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

    When the Molten Scourge takes Major damage, roll a d10. On a result of 8 or higher, the Molten Scourge breathes a flow of lava in front of them within Far range.

    ", + "description": "

    When the @Lookup[@name] takes Major damage, roll a d10. On a result of 8 or higher, the @Lookup[@name] breathes a flow of lava in front of them within Far range.

    ", "chatDisplay": true, "actionType": "action", "cost": [ @@ -602,7 +602,7 @@ "type": "attack", "_id": "LBNvfABGWcrygpQM", "systemPath": "actions", - "description": "

    The Molten Scourge breathes a flow of lava in front of them within Far range. All targets in that area must make an Agility Reaction Roll. Targets who fail take 2d10+4 physical damage, mark 1d4 Stress, and are Vulnerable until they clear a Stress. Targets who succeed take half damage and must mark a Stress.

    @Template[type:inFront|range:f]

    ", + "description": "

    The @Lookup[@name] breathes a flow of lava in front of them within Far range. All targets in that area must make an Agility Reaction Roll. Targets who fail take 2d10+4 physical damage, mark 1d4 Stress, and are Vulnerable until they clear a Stress. Targets who succeed take half damage and must mark a Stress.

    @Template[type:inFront|range:f]

    ", "chatDisplay": true, "actionType": "action", "cost": [], @@ -763,14 +763,14 @@ "name": "Lava Splash", "type": "feature", "system": { - "description": "

    When the Molten Scourge takes Severe damage from an attack within Very Close range, molten blood gushes from the wound and deals 2d10+4 direct physical damage to the attacker.

    ", + "description": "

    When the @Lookup[@name] takes Severe damage from an attack within Very Close range, molten blood gushes from the wound and deals 2d10+4 direct physical damage to the attacker.

    ", "resource": null, "actions": { "WtrAv8peQ71OBoO1": { "type": "damage", "_id": "WtrAv8peQ71OBoO1", "systemPath": "actions", - "description": "

    When the Molten Scourge takes Severe damage from an attack within Very Close range, molten blood gushes from the wound and deals 2d10+4 direct physical damage to the attacker.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -844,7 +844,7 @@ "name": "Ashen Vengeance", "type": "feature", "system": { - "description": "

    When the Molten Scourge marks their last HP, replace them with the @UUID[Compendium.daggerheart.adversaries.Actor.pMuXGCSOQaxpi5tb]{Ashen Tyrant} and immediately spotlight them.

    ", + "description": "

    When the @Lookup[@name] marks their last HP, replace them with the @UUID[Compendium.daggerheart.adversaries.Actor.pMuXGCSOQaxpi5tb]{Ashen Tyrant} and immediately spotlight them.

    ", "resource": null, "actions": {}, "originItemType": null, diff --git a/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json b/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json index be007f4e..2e2adbdd 100644 --- a/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json +++ b/src/packs/adversaries/adversary_Volcanic_Dragon__Obsidian_Predator_ladm7wykhZczYzrQ.json @@ -252,14 +252,14 @@ "name": "Relentless (2)", "type": "feature", "system": { - "description": "

    The Obsidian Predator can be spotlighted up to two times per GM turn Spend Fear as usual to spotlight them

    ", + "description": "

    The @Lookup[@name] can be spotlighted up to two times per GM turn Spend Fear as usual to spotlight them

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

    The Obsidian Predator can be spotlighted up to two times per GM turn Spend Fear as usual to spotlight them.

    ", + "description": "", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -310,7 +310,7 @@ "name": "Flying", "type": "feature", "system": { - "description": "

    While flying, the Obsidian Predator gains a +3 bonus to their Difficulty.

    ", + "description": "

    While flying, the @Lookup[@name] gains a +3 bonus to their Difficulty.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -379,7 +379,7 @@ "name": "Obsidian Scales", "type": "feature", "system": { - "description": "

    The Obsidian Predator is resistant to physical damage.

    ", + "description": "

    The @Lookup[@name] is resistant to physical damage.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -448,14 +448,14 @@ "name": "Avalanche Tail", "type": "feature", "system": { - "description": "

    Mark a Stress to make an attack against all targets within Close range. Targets the Obsidian Predator succeeds against take 4d6+4 physical damage and are knocked.

    @Template[type:emanation|range:c]

    ", + "description": "

    Mark a Stress to make an attack against all targets within Close range. Targets the @Lookup[@name] succeeds against take 4d6+4 physical damage and are knocked.

    @Template[type:emanation|range:c]

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

    Mark a Stress to make an attack against all targets within Close range. Targets the Obsidian Predator succeeds against take 4d6+4 physical damage and are knocked.

    @Template[type:emanation|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -590,14 +590,14 @@ "name": "Dive-Bomb", "type": "feature", "system": { - "description": "

    If the Obsidian Predator is flying, mark a Stress to choose a point within Far range. Move to that point and make an attack against all targets within Very Close range. Targets the Obsidian Predator succeeds against take 2d10+6 physical damage and must mark a Stress and lose a Hope.

    @Template[type:emanation|range:vc]

    ", + "description": "

    If the @Lookup[@name] is flying, mark a Stress to choose a point within Far range. Move to that point and make an attack against all targets within Very Close range. Targets the @Lookup[@name] succeeds against take 2d10+6 physical damage and must mark a Stress and lose a Hope.

    @Template[type:emanation|range:vc]

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

    If the Obsidian Predator is flying, mark a Stress to choose a point within Far range. Move to that point and make an attack against all targets within Very Close range. Targets the Obsidian Predator succeeds against take 2d10+6 physical damage and must mark a Stress and lose a Hope.

    @Template[type:emanation|range:vc]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -740,7 +740,7 @@ "name": "Erupting Rage", "type": "feature", "system": { - "description": "

    When the Obsidian Predator marks their last HP, replace them with the @UUID[Compendium.daggerheart.adversaries.Actor.eArAPuB38CNR0ZIM]{Molten Scourge} and immediately spotlight them.

    ", + "description": "

    When the @Lookup[@name] marks their last HP, replace them with the @UUID[Compendium.daggerheart.adversaries.Actor.eArAPuB38CNR0ZIM]{Molten Scourge} and immediately spotlight them.

    ", "resource": null, "actions": {}, "originItemType": null, diff --git a/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json b/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json index 0bcb8e25..f087c63d 100644 --- a/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json +++ b/src/packs/adversaries/adversary_War_Wizard_noDdT0tsN6FXSmC8.json @@ -239,7 +239,7 @@ "type": "effect", "_id": "39zC1I5DYozI47lP", "systemPath": "actions", - "description": "

    Before or after making a standard attack, you can mark a Stress to teleport to a location within Far range.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -287,14 +287,14 @@ "name": "Refresh Warding Sphere", "type": "feature", "system": { - "description": "

    Mark a Stress to refresh the Wizard’s “Warding Sphere” reaction.

    ", + "description": "

    Mark a Stress to refresh the @Lookup[@name]’s “Warding Sphere” reaction.

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

    Mark a Stress to refresh the Wizard’s “Warding Sphere” reaction.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -350,7 +350,7 @@ "type": "attack", "_id": "vnMq4NuQO6GYxWhM", "systemPath": "actions", - "description": "

    Spend a Fear and choose a point within Far range. A Very Close area around that point erupts into impassable terrain. All targets within that area must make an Agility Reaction Roll (14). Targets who fail take 2d10 physical damage and are thrown out of the area. Targets who succeed take half damage and aren’t moved.

    @Template[type:circle|range:vc]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -457,7 +457,7 @@ "type": "attack", "_id": "DFHR8LtvjZjHP6BL", "systemPath": "actions", - "description": "

    Spend a Fear to unleash a precise hail of magical blasts. All targets in the scene must make an Agility Reaction Roll. Targets who fail take 2d12 magic damage. Targets who succeed take half damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -557,14 +557,14 @@ "name": "Warding Sphere", "type": "feature", "system": { - "description": "

    When the Wizard takes damage from an attack within Close range, deal 2d6 magic damage to the attacker. This reaction can’t be used again until the Wizard refreshes it with their “Refresh Warding Sphere” action.

    ", + "description": "

    When the @Lookup[@name] takes damage from an attack within Close range, deal 2d6 magic damage to the attacker. This reaction can’t be used again until the @Lookup[@name] refreshes it with their “Refresh Warding Sphere” action.

    ", "resource": null, "actions": { "2fHrpaZW9toi6nin": { "type": "damage", "_id": "2fHrpaZW9toi6nin", "systemPath": "actions", - "description": "

    When the Wizard takes damage from an attack within Close range, deal 2d6 magic damage to the attacker. This reaction can’t be used again until the Wizard refreshes it with their “Refresh Warding Sphere” action.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], diff --git a/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json b/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json index 01d1758b..2989468b 100644 --- a/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json +++ b/src/packs/adversaries/adversary_Weaponmaster_ZNbQ2jg35LG4t9eH.json @@ -223,14 +223,14 @@ "_id": "tyGgOqQzDSIypoMz", "img": "icons/skills/melee/strike-sword-dagger-runes-gold.webp", "system": { - "description": "

    Make a standard attack against a target. On a success, mark a Stress to Taunt the target until their next successful attack. The next time the Taunted target attacks, they have disadvantage against targets other than the Weaponmaster.

    ", + "description": "

    Make a standard attack against a target. On a success, mark a Stress to Taunt the target until their next successful attack. The next time the Taunted target attacks, they have disadvantage against targets other than the @Lookup[@name].

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

    Make a standard attack against a target. On a success, mark a Stress to Taunt the target until their next successful attack. The next time the Taunted target attacks, they have disadvantage against targets other than the Weaponmaster.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -378,7 +378,7 @@ "type": "healing", "_id": "WQ067ZFiG2QMBo2n", "systemPath": "actions", - "description": "

    Once per scene, spend a Fear to clear 2 HP and 2 Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -508,14 +508,14 @@ "_id": "oYNVPQOy5oQli5Il", "img": "icons/skills/melee/strike-weapons-orange.webp", "system": { - "description": "

    When the Weaponmaster makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "jeKcXbdw8gPF4OQA": { "type": "healing", "_id": "jeKcXbdw8gPF4OQA", "systemPath": "actions", - "description": "

    When the Weaponmaster makes a successful attack against a PC, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "reaction", "cost": [], diff --git a/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json b/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json index fd978c58..446a4af3 100644 --- a/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json +++ b/src/packs/adversaries/adversary_Young_Dryad_8yUj2Mzvnifhxegm.json @@ -236,7 +236,7 @@ "type": "attack", "_id": "0VOUNQKNjwlLhnRW", "systemPath": "actions", - "description": "

    Mark a Stress to spotlight 1d4 allies within range of a target they can attack without moving. On a success, their attacks deal half damage.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -317,7 +317,7 @@ "type": "effect", "_id": "cXOjhfMgKh2yD1mc", "systemPath": "actions", - "description": "

    Spend a Fear to form a cage around a target within Very Close range and Restrain them until they’re freed with a successful Strength Roll. When a creature makes an action roll against the cage, they must mark a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -411,14 +411,14 @@ "_id": "4f79icB7Dd1xLEZQ", "img": "icons/skills/melee/strike-weapons-orange.webp", "system": { - "description": "

    When the Dryad makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "9MGyAjWtLbDz8Znu": { "type": "healing", "_id": "9MGyAjWtLbDz8Znu", "systemPath": "actions", - "description": "

    When the Dryad makes a successful attack against a PC, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "reaction", "cost": [], diff --git a/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json b/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json index d42bda4e..b0a3bded 100644 --- a/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json +++ b/src/packs/adversaries/adversary_Young_Ice_Dragon_UGPiPLJsPvMTSKEF.json @@ -227,14 +227,14 @@ "name": "Relentless (3)", "type": "feature", "system": { - "description": "

    The Dragon can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "

    The @Lookup[@name] can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

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

    The Dragon can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -285,14 +285,14 @@ "name": "Rend and Crush", "type": "feature", "system": { - "description": "

    If a target damaged by the Dragon doesn’t mark an Armor Slot to reduce the damage, they must mark a Stress.

    ", + "description": "

    If a target damaged by the @Lookup[@name] doesn’t mark an Armor Slot to reduce the damage, they must mark a Stress.

    ", "resource": null, "actions": { "dHoMdLfAl6UKjXRP": { "type": "damage", "_id": "dHoMdLfAl6UKjXRP", "systemPath": "actions", - "description": "

    If a target damaged by the Dragon doesn’t mark an Armor Slot to reduce the damage, they must mark a Stress.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [], @@ -363,7 +363,7 @@ "name": "No Hope", "type": "feature", "system": { - "description": "

    When a PC rolls with Fear while within Far range of the Dragon, they lose a Hope.

    ", + "description": "

    When a PC rolls with Fear while within Far range of the @Lookup[@name], they lose a Hope.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -388,14 +388,14 @@ "name": "Blizzard Breath", "type": "feature", "system": { - "description": "

    Spend 2 Fear to release an icy whorl in front of the Dragon within Close range. All targets in this area must make an Agility Reaction Roll. Targets who fail take 4d6+5 magic damage and are Restrained by ice until they break free with a successful Strength Roll. Targets who succeed must mark 2 Stress or take half damage.

    @Template[type:inFront|range:c]

    ", + "description": "

    Spend 2 Fear to release an icy whorl in front of the @Lookup[@name] within Close range. All targets in this area must make an Agility Reaction Roll. Targets who fail take 4d6+5 magic damage and are Restrained by ice until they break free with a successful Strength Roll. Targets who succeed must mark 2 Stress or take half damage.

    @Template[type:inFront|range:c]

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

    Spend 2 Fear to release an icy whorl in front of the Dragon within Close range. All targets in this area must make an Agility Reaction Roll. Targets who fail take 4d6+5 magic damage and are Restrained by ice until they break free with a successful Strength Roll. Targets who succeed must mark 2 Stress or take half damage.

    @Template[type:inFront|range:c]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -539,14 +539,14 @@ "name": "Avalanche", "type": "feature", "system": { - "description": "

    Spend a Fear to have the Dragon unleash a huge downfall of snow and ice, covering all other creatures within Far range. All targets within this area must succeed on an Instinct Reaction Roll or be buried in snow and rocks, becoming Vulnerable until they dig themselves out from the debris. For each PC that fails the reaction roll, you gain a Fear.

    @Template[type:emanation|range:f]

    ", + "description": "

    Spend a Fear to have the @Lookup[@name] unleash a huge downfall of snow and ice, covering all other creatures within Far range. All targets within this area must succeed on an Instinct Reaction Roll or be buried in snow and rocks, becoming Vulnerable until they dig themselves out from the debris. For each PC that fails the reaction roll, you gain a Fear.

    @Template[type:emanation|range:f]

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

    Spend a Fear to have the Dragon unleash a huge downfall of snow and ice, covering all other creatures within Far range. All targets within this area must succeed on an Instinct Reaction Roll or be buried in snow and rocks, becoming Vulnerable until they dig themselves out from the debris. For each PC that fails the reaction roll, you gain a Fear.

    @Template[type:emanation|range:f]

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ @@ -663,7 +663,7 @@ "name": "Frozen Scales", "type": "feature", "system": { - "description": "

    When a creature makes a successful attack against the Dragon from within Very Close range, they must mark a Stress and become Chilled until their next rest or they clear a Stress. While they are Chilled, they have disadvantage on attack rolls.

    ", + "description": "

    When a creature makes a successful attack against the @Lookup[@name] from within Very Close range, they must mark a Stress and become Chilled until their next rest or they clear a Stress. While they are Chilled, they have disadvantage on attack rolls.

    ", "resource": null, "actions": { "QZMpj1qEWI6Er7q2": { @@ -791,14 +791,14 @@ "name": "Momentum", "type": "feature", "system": { - "description": "

    When the Dragon makes a successful attack against a PC, you gain a Fear.

    ", + "description": "

    When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.

    ", "resource": null, "actions": { "5V5SDnUBg9dQOkLW": { "type": "healing", "_id": "5V5SDnUBg9dQOkLW", "systemPath": "actions", - "description": "

    When the Dragon makes a successful attack against a PC, you gain a Fear.

    ", + "description": "", "chatDisplay": true, "actionType": "reaction", "cost": [], diff --git a/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json b/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json index f93a0993..1b2cce2a 100644 --- a/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json +++ b/src/packs/adversaries/adversary_Zombie_Legion_YhJrP7rTBiRdX5Fp.json @@ -221,7 +221,7 @@ "name": "Horde (2d6+5)", "type": "feature", "system": { - "description": "

    When the Legion has marked half or more of their HP, their standard attack deals 2d6+5 physical damage instead.

    ", + "description": "

    When the @Lookup[@name] has marked half or more of their HP, their standard attack deals 2d6+5 physical damage instead.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -246,7 +246,7 @@ "name": "Unyielding", "type": "feature", "system": { - "description": "

    The Legion has resistance to physical damage.

    ", + "description": "

    The @Lookup[@name] has resistance to physical damage.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -315,14 +315,14 @@ "name": "Relentless (2)", "type": "feature", "system": { - "description": "

    The Legion can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "

    The @Lookup[@name] can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

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

    The Legion can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.

    ", + "description": "", "chatDisplay": true, "actionType": "passive", "cost": [ @@ -373,14 +373,14 @@ "name": "Overwhelm", "type": "feature", "system": { - "description": "

    When the Legion takes Minor damage from an attack within Melee range, you can mark a Stress to make a standard attack with advantage against the attacker.

    ", + "description": "

    When the @Lookup[@name] takes Minor damage from an attack within Melee range, you can mark a Stress to make a standard attack with advantage against the attacker.

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

    When the Legion takes Minor damage from an attack within Melee range, you can mark a Stress to make a standard attack with advantage against the attacker.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json b/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json index cf5520d6..32519ac6 100644 --- a/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json +++ b/src/packs/adversaries/adversary_Zombie_Pack_Nf0v43rtflV56V2T.json @@ -223,7 +223,7 @@ "_id": "nNJGAhWu0IuS2ybn", "img": "icons/creatures/magical/humanoid-silhouette-aliens-green.webp", "system": { - "description": "

    When the Zombies have marked half or more of their HP, their standard attack deals 1d4+2 physical damage instead.

    ", + "description": "

    When the @Lookup[@name] have marked half or more of their HP, their standard attack deals 1d4+2 physical damage instead.

    ", "resource": null, "actions": {}, "originItemType": null, @@ -249,14 +249,14 @@ "_id": "jQmltra0ovHE33Nx", "img": "icons/magic/death/blood-corruption-vomit-red.webp", "system": { - "description": "

    When the Zombies mark HP from an attack within Melee range, you can mark a Stress to make a standard attack against the attacker.

    ", + "description": "

    When the @Lookup[@name]s mark HP from an attack within Melee range, you can mark a Stress to make a standard attack against the attacker.

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

    When the Zombies mark HP from an attack within Melee range, you can mark a Stress to make a standard attack against the attacker.

    ", + "description": "", "chatDisplay": true, "actionType": "action", "cost": [ diff --git a/templates/sheets-settings/adversary-settings/features.hbs b/templates/sheets-settings/adversary-settings/features.hbs index ec6a9e54..bc6a1ddf 100644 --- a/templates/sheets-settings/adversary-settings/features.hbs +++ b/templates/sheets-settings/adversary-settings/features.hbs @@ -16,7 +16,7 @@ {{feature.name}}
    - +