mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-01-11 19:25:21 +01:00
Merge branch 'main' into release
This commit is contained in:
commit
244dbd4902
271 changed files with 3769 additions and 1910 deletions
190
daggerheart.mjs
190
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';
|
||||
|
||||
|
|
@ -54,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;
|
||||
|
|
@ -89,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(
|
||||
|
|
@ -129,7 +190,8 @@ Hooks.once('init', () => {
|
|||
SYSTEM.id,
|
||||
applications.sheetConfigs.ActiveEffectConfig,
|
||||
{
|
||||
makeDefault: true
|
||||
makeDefault: true,
|
||||
label: sheetLabel('DOCUMENT.ActiveEffect')
|
||||
}
|
||||
);
|
||||
|
||||
|
|
@ -138,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();
|
||||
|
|
@ -177,7 +240,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)) {
|
||||
|
|
@ -193,9 +255,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));
|
||||
});
|
||||
|
||||
|
|
@ -248,52 +310,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));
|
||||
|
|
|
|||
40
lang/en.json
40
lang/en.json
|
|
@ -36,6 +36,7 @@
|
|||
},
|
||||
|
||||
"DAGGERHEART": {
|
||||
"CharacterSheet": "Character Sheet",
|
||||
"ACTIONS": {
|
||||
"TYPES": {
|
||||
"attack": {
|
||||
|
|
@ -585,6 +586,7 @@
|
|||
},
|
||||
"OwnershipSelection": {
|
||||
"title": "Ownership Selection - {name}",
|
||||
"noPlayers": "No players to assign ownership to",
|
||||
"default": "Default Ownership"
|
||||
},
|
||||
"ReactionRoll": {
|
||||
|
|
@ -611,6 +613,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": {
|
||||
|
|
@ -620,11 +625,6 @@
|
|||
}
|
||||
},
|
||||
"CONFIG": {
|
||||
"ActionType": {
|
||||
"passive": "Passive",
|
||||
"action": "Action",
|
||||
"reaction": "Reaction"
|
||||
},
|
||||
"AdversaryTrait": {
|
||||
"relentless": {
|
||||
"name": "Relentless",
|
||||
|
|
@ -1033,6 +1033,12 @@
|
|||
"description": ""
|
||||
}
|
||||
},
|
||||
"FeatureForm": {
|
||||
"label": "Feature Form",
|
||||
"passive": "Passive",
|
||||
"action": "Action",
|
||||
"reaction": "Reaction"
|
||||
},
|
||||
"Gold": {
|
||||
"title": "Gold",
|
||||
"coins": "Coins",
|
||||
|
|
@ -1146,6 +1152,14 @@
|
|||
"rect": "Rectangle",
|
||||
"ray": "Ray"
|
||||
},
|
||||
"TokenSize": {
|
||||
"tiny": "Tiny",
|
||||
"small": "Small",
|
||||
"medium": "Medium",
|
||||
"large": "Large",
|
||||
"huge": "Huge",
|
||||
"gargantuan": "Gargantuan"
|
||||
},
|
||||
"Traits": {
|
||||
"agility": {
|
||||
"name": "Agility",
|
||||
|
|
@ -2094,6 +2108,7 @@
|
|||
"fear": "Fear",
|
||||
"features": "Features",
|
||||
"formula": "Formula",
|
||||
"general": "General",
|
||||
"gm": "GM",
|
||||
"healing": "Healing",
|
||||
"healingRoll": "Healing Roll",
|
||||
|
|
@ -2166,10 +2181,12 @@
|
|||
"plural": "Targets"
|
||||
},
|
||||
"title": "Title",
|
||||
"tokenSize": "Token Size",
|
||||
"total": "Total",
|
||||
"traitModifier": "Trait Modifier",
|
||||
"true": "True",
|
||||
"type": "Type",
|
||||
"typeSheet": "System {type} Sheet",
|
||||
"unarmed": "Unarmed",
|
||||
"unarmedAttack": "Unarmed Attack",
|
||||
"unarmored": "Unarmored",
|
||||
|
|
@ -2222,6 +2239,7 @@
|
|||
"tokenRingImg": { "label": "Subject Texture" },
|
||||
"tokenSize": {
|
||||
"placeholder": "Using character dimensions",
|
||||
"disabledPlaceholder": "Set by character size",
|
||||
"height": { "label": "Height" },
|
||||
"width": { "label": "Width" }
|
||||
},
|
||||
|
|
@ -2247,7 +2265,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",
|
||||
|
|
@ -2527,8 +2547,8 @@
|
|||
"enabled": { "label": "Enabled" },
|
||||
"tokens": { "label": "Tokens" }
|
||||
},
|
||||
"massiveDamage":{
|
||||
"title":"Massive Damage",
|
||||
"massiveDamage": {
|
||||
"title": "Massive Damage",
|
||||
"enabled": { "label": "Enabled" }
|
||||
}
|
||||
}
|
||||
|
|
@ -2800,7 +2820,9 @@
|
|||
"companionPartnerLevelBlock": "The companion needs an assigned partner to level up.",
|
||||
"configureAttribution": "Configure Attribution",
|
||||
"deleteItem": "Delete Item",
|
||||
"immune": "Immune"
|
||||
"immune": "Immune",
|
||||
"middleClick": "[Middle Click] Keep tooltip view",
|
||||
"tokenSize": "The token size used on the canvas"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)) {
|
||||
|
|
|
|||
|
|
@ -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 });
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}, []),
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 = {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
],
|
||||
|
|
@ -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
|
||||
|
|
@ -863,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);
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -179,10 +179,10 @@ 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';
|
||||
deltaInput.pattern = '^[+=\\-]?\d*';
|
||||
|
||||
const handleUpdate = (delta = 0) => {
|
||||
const min = Number(deltaInput.min) || 0;
|
||||
|
|
@ -232,6 +232,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 <br>, which aren't a problem for the value but are for the placeholder
|
||||
input.addEventListener("input", () => input.querySelectorAll("br").forEach((i) => i.remove()));
|
||||
}
|
||||
}
|
||||
|
||||
/**@inheritdoc */
|
||||
|
|
|
|||
|
|
@ -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 = {
|
||||
|
|
|
|||
|
|
@ -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 => {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -193,8 +196,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;
|
||||
|
||||
|
|
@ -208,9 +209,12 @@ 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;
|
||||
|
||||
if (this.chatDisplay) await this.toChat();
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
|
|
@ -239,8 +243,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,11 +328,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`),
|
||||
game.i18n.localize(`DAGGERHEART.CONFIG.ActionType.${this.actionType}`)
|
||||
];
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,8 @@ export default class DhpAdversary extends BaseDataActor {
|
|||
label: 'TYPES.Actor.adversary',
|
||||
type: 'adversary',
|
||||
settingSheet: DHAdversarySettings,
|
||||
hasAttribution: true
|
||||
hasAttribution: true,
|
||||
usesSize: true
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -59,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({
|
||||
|
|
@ -142,7 +141,7 @@ export default class DhpAdversary extends BaseDataActor {
|
|||
}
|
||||
|
||||
isItemValid(source) {
|
||||
return source.type === "feature";
|
||||
return source.type === 'feature';
|
||||
}
|
||||
|
||||
async _preUpdate(changes, options, user) {
|
||||
|
|
|
|||
|
|
@ -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) =>
|
||||
|
|
@ -41,7 +42,8 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel {
|
|||
settingSheet: null,
|
||||
hasResistances: true,
|
||||
hasAttribution: false,
|
||||
hasLimitedView: true
|
||||
hasLimitedView: true,
|
||||
usesSize: false
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -76,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;
|
||||
}
|
||||
|
||||
|
|
@ -106,6 +115,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 */
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ export default class CostField extends fields.ArrayField {
|
|||
}
|
||||
}, []);
|
||||
|
||||
await actor.modifyResource(resources);
|
||||
config.resourceUpdates.addResources(resources);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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}`;
|
||||
}
|
||||
|
|
@ -256,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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
})
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -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 !== CONFIG.DH.ITEM.actionTypes.reaction.id &&
|
||||
!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);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
@ -19,7 +20,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'}`
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -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 };
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
@ -73,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) {
|
||||
|
|
@ -477,6 +489,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);
|
||||
}
|
||||
|
|
@ -526,7 +539,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;
|
||||
|
|
@ -765,9 +778,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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
40
module/documents/scene.mjs
Normal file
40
module/documents/scene.mjs
Normal file
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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<string, DeepReadonly<TokenHexagonalShapeData>>}
|
||||
*/
|
||||
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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,8 +21,8 @@ export const registerDHSettings = () => {
|
|||
scope: 'world',
|
||||
config: true,
|
||||
type: Boolean,
|
||||
onChange: () => ui.combat.render(),
|
||||
})
|
||||
onChange: () => ui.combat.render()
|
||||
});
|
||||
};
|
||||
|
||||
const registerMenuSettings = () => {
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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": {
|
||||
|
|
@ -258,14 +260,14 @@
|
|||
"_id": "MFmGN6Tbf5GYxrQ9",
|
||||
"img": "icons/magic/unholy/silhouette-evil-horned-giant.webp",
|
||||
"system": {
|
||||
"description": "<p>The Burrower can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"description": "<p>The @Lookup[@name] can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"3lGGgkxnzgUwHGIp": {
|
||||
"type": "effect",
|
||||
"_id": "3lGGgkxnzgUwHGIp",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>The Burrower can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": false,
|
||||
"actionType": "passive",
|
||||
"cost": [
|
||||
|
|
@ -317,14 +319,14 @@
|
|||
"_id": "ctXYwil2D1zfsekT",
|
||||
"img": "icons/magic/earth/barrier-stone-explosion-red.webp",
|
||||
"system": {
|
||||
"description": "<p><strong>Mark a Stress</strong> 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.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"4ppSeiTdbqnMzWAs": {
|
||||
"type": "attack",
|
||||
"_id": "4ppSeiTdbqnMzWAs",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -381,7 +383,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"effects": [
|
||||
{
|
||||
|
|
@ -441,14 +444,14 @@
|
|||
"_id": "UpFsnlbZkyvM2Ftv",
|
||||
"img": "icons/magic/acid/projectile-smoke-glowing.webp",
|
||||
"system": {
|
||||
"description": "<p>Make an attack against all targets in front of the Burrower within Close range. Targets the Burrower succeeds against take <strong>2d6</strong> 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.</p><p>@Template[type:inFront|range:c]</p>",
|
||||
"description": "<p>Make an attack against all targets in front of the @Lookup[@name] within Close range. Targets the @Lookup[@name] succeeds against take <strong>2d6</strong> 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.</p><p>@Template[type:inFront|range:c]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"yd10HwK6Wa3OEvv2": {
|
||||
"type": "attack",
|
||||
"_id": "yd10HwK6Wa3OEvv2",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>Make an attack against all targets in front of the Burrower within Close range. Targets the Burrower succeeds against take <strong>2d6</strong> 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.</p><p>@Template[type:inFront|range:c]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -546,7 +549,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
|
|
@ -567,14 +571,14 @@
|
|||
"_id": "aNIVT5LKhwLyjKpI",
|
||||
"img": "icons/magic/acid/dissolve-drip-droplet-smoke.webp",
|
||||
"system": {
|
||||
"description": "<p>When the Burrower takes Severe damage, all creatures within Close range are bathed in their acidic blood, taking <strong>1d10</strong> 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 <strong>1d6</strong> physical damage.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "<p>When the @Lookup[@name] takes Severe damage, all creatures within Close range are bathed in their acidic blood, taking <strong>1d10</strong> 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 <strong>1d6</strong> physical damage.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"XbtTzOBvlTaxOKTy": {
|
||||
"type": "damage",
|
||||
"_id": "XbtTzOBvlTaxOKTy",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When the Burrower takes Severe damage, all creatures within Close range are bathed in their acidic blood, taking <strong>1d10</strong> 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 <strong>1d6</strong> physical damage.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -628,7 +632,7 @@
|
|||
"type": "damage",
|
||||
"_id": "xpcp1ECTWF20kxve",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>This splash covers the ground within Very Close range with blood, and all creatures other than the Burrower who move through it take <strong>1d6</strong> physical damage.</p>",
|
||||
"description": "<p>This splash covers the ground within Very Close range with blood, and all creatures other than the @Lookup[@name] who move through it take <strong>1d6</strong> physical damage.</p>",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -681,7 +685,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
|
|
|
|||
|
|
@ -111,7 +111,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 91,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "gargantuan"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "G7jiltRjgvVhZewm",
|
||||
|
|
@ -220,14 +221,14 @@
|
|||
"name": "Relentless (4)",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>The Flickerfly can be spotlighted up to four times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"description": "<p>The @Lookup[@name] can be spotlighted up to four times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"poUhJdSkhjiVL2Vp": {
|
||||
"type": "effect",
|
||||
"_id": "poUhJdSkhjiVL2Vp",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>The Flickerfly can be spotlighted up to four times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "passive",
|
||||
"cost": [
|
||||
|
|
@ -263,7 +264,7 @@
|
|||
"img": "icons/magic/unholy/silhouette-evil-horned-giant.webp",
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
"sort": 0,
|
||||
"sort": 100000,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"MQSznptE5yLT7kj8": 3
|
||||
|
|
@ -278,14 +279,14 @@
|
|||
"name": "Never Misses",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Flickerfly makes an attack, the target’s Evasion is halved against the attack.</p>",
|
||||
"description": "<p>When the @Lookup[@name] makes an attack, the target’s Evasion is halved against the attack.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"VRGPnDhDpReXUZZF": {
|
||||
"type": "effect",
|
||||
"_id": "VRGPnDhDpReXUZZF",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When the Flickerfly makes an attack, the target’s Evasion is halved against the attack.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "passive",
|
||||
"cost": [],
|
||||
|
|
@ -360,7 +361,7 @@
|
|||
}
|
||||
],
|
||||
"folder": null,
|
||||
"sort": 0,
|
||||
"sort": 200000,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"MQSznptE5yLT7kj8": 3
|
||||
|
|
@ -375,14 +376,14 @@
|
|||
"name": "Whirlwind",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Spend a Fear</strong> to whirl, making an attack against all targets within Very Close range. Targets the Flickerfly succeeds against take <strong>3d8</strong> direct physical damage.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||
"description": "<p><strong>Spend a Fear</strong> to whirl, making an attack against all targets within Very Close range. Targets the @Lookup[@name] succeeds against take <strong>3d8</strong> direct physical damage.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"RV1wKufKrMPN6MOo": {
|
||||
"type": "attack",
|
||||
"_id": "RV1wKufKrMPN6MOo",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend a Fear</strong> to whirl, making an attack against all targets within Very Close range. Targets the Flickerfly succeeds against take <strong>3d8</strong> direct physical damage.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -461,13 +462,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
|
||||
|
|
@ -482,14 +484,14 @@
|
|||
"name": "Mind Dance",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Mark a Stress</strong> 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.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"GNwsDlCabx3fiG4g": {
|
||||
"type": "attack",
|
||||
"_id": "GNwsDlCabx3fiG4g",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -540,13 +542,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
|
||||
|
|
@ -561,14 +564,14 @@
|
|||
"name": "Hallucinatory Breath",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><em>Countdown (Loop 1d6)</em>. When the Flickerfly takes damage for the first time, activate the countdown. When it triggers, the Flickerfly breathes hallucinatory gas on all targets in front of them up to Far range. Targets must make an Instinct Reaction Roll or be tormented by fearful hallucinations. Targets whose fears are known to the Flickerfl y have disadvantage on this roll. Targets who fail lose 2 Hope and take <strong>3d8+3</strong> direct magic damage.</p><p>@Template[type:inFront|range:f]</p>",
|
||||
"description": "<p><em>Countdown (Loop 1d6)</em>. 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 <strong>3d8+3</strong> direct magic damage.</p><p>@Template[type:inFront|range:f]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"YOyKyKGTUEWkMmJe": {
|
||||
"type": "attack",
|
||||
"_id": "YOyKyKGTUEWkMmJe",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>The Flickerfly breathes hallucinatory gas on all targets in front of them up to Far range. Targets must make an Instinct Reaction Roll or be tormented by fearful hallucinations. Targets whose fears are known to the Flickerfly have disadvantage on this roll. Targets who fail lose 2 Hope and take <strong>3d8+3</strong> direct magic damage.</p><p>@Template[type:inFront|range:f]</p>",
|
||||
"description": "<p>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 <strong>3d8+3</strong> direct magic damage.</p><p>@Template[type:inFront|range:f]</p>",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -666,7 +669,7 @@
|
|||
"type": "countdown",
|
||||
"_id": "lBhmLc33pcXzJHT3",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><em>Countdown (Loop 1d6)</em>. When the Flickerfly takes damage for the first time, activate the countdown.</p>",
|
||||
"description": "<p><em>Countdown (Loop 1d6)</em>. When the @Lookup[@name] takes damage for the first time, activate the countdown.</p>",
|
||||
"chatDisplay": true,
|
||||
"originItem": {
|
||||
"type": "itemCollection"
|
||||
|
|
@ -701,13 +704,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
|
||||
|
|
@ -722,14 +726,14 @@
|
|||
"name": "Uncanny Reflexes",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Flickerfly takes damage from an attack within Close range, you can mark a Stress to take half damage.</p>",
|
||||
"description": "<p>When the @Lookup[@name] takes damage from an attack within Close range, you can mark a Stress to take half damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"FocbilGTpvUjlb7m": {
|
||||
"type": "effect",
|
||||
"_id": "FocbilGTpvUjlb7m",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When the Flickerfly takes damage from an attack within Close range, you can mark a Stress to take half damage.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "reaction",
|
||||
"cost": [
|
||||
|
|
@ -756,13 +760,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
|
||||
|
|
@ -777,7 +782,7 @@
|
|||
"name": "Deadly Flight",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>While flying the Flickerfly can move up to Far range instead of Close range before taking an action.</p>",
|
||||
"description": "<p>While flying the @Lookup[@name] can move up to Far range instead of Close range before taking an action.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -787,7 +792,7 @@
|
|||
"img": "icons/skills/movement/feet-winged-boots-blue.webp",
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
"sort": 0,
|
||||
"sort": 700000,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"fBcTgyTzoARBvohY": 3
|
||||
|
|
|
|||
|
|
@ -110,7 +110,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 84,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "vNIbYQ4YSzNf0WPE",
|
||||
|
|
@ -219,11 +220,12 @@
|
|||
"name": "Minion (6)",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>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.</p>",
|
||||
"description": "<p>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.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "passive"
|
||||
},
|
||||
"_id": "2yREz60uPY80tAa4",
|
||||
"img": "icons/magic/symbols/runes-carved-stone-yellow.webp",
|
||||
|
|
@ -244,14 +246,14 @@
|
|||
"name": "Group Attack",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Spend a Fear</strong> 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.</p>",
|
||||
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 4 physical damage each. Combine this damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"vgguNWz8vG8aoLXR": {
|
||||
"type": "effect",
|
||||
"_id": "vgguNWz8vG8aoLXR",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend a Fear</strong> 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.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -278,7 +280,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "4wT7CmM1DJEPcraF",
|
||||
"img": "icons/creatures/abilities/tail-strike-bone-orange.webp",
|
||||
|
|
|
|||
|
|
@ -122,7 +122,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 97,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "WPEOIGfclNJxWb87",
|
||||
|
|
@ -238,7 +239,7 @@
|
|||
"type": "attack",
|
||||
"_id": "wi2DDvBhlg6sxQoc",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> to spotlight <strong>1d4</strong> allies. Attacks they make while spotlighted in this way deal half damage, or full damage if you spend a Fear.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -289,7 +290,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "jNmMyq5QI2HNgffy",
|
||||
"img": "icons/magic/death/skull-weapon-staff-glow-pink.webp",
|
||||
|
|
@ -317,7 +319,7 @@
|
|||
"type": "attack",
|
||||
"_id": "vaXLESD4sRkQ3Ahn",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark 2 Stress</strong> to cause all targets within Far range to make a Strength Reaction Roll. Targets who fail take <strong>2d20+12</strong> magic damage and you gain a Fear. Targets who succeed take half damage. A target who marks 2 or more HP must also <strong>mark 2 Stress</strong> and becomes <em>Vulnerable</em> until they roll with Hope.</p><p>@Template[type:emanation|range:f]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -467,7 +469,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "4EECsXzHFG0RoIg0",
|
||||
"img": "icons/magic/unholy/projectile-missile-green.webp",
|
||||
|
|
@ -534,7 +537,7 @@
|
|||
"type": "effect",
|
||||
"_id": "gZg3AkzCYUTExjE6",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend a Fear</strong> to summon a @UUID[Compendium.daggerheart.adversaries.Actor.YhJrP7rTBiRdX5Fp]{Zombie Legion}, which appears at Close range and immediately takes the spotlight.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -561,7 +564,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "XxXOrFovbCz9zFxR",
|
||||
"img": "icons/magic/death/undead-zombie-grave-green.webp",
|
||||
|
|
@ -582,14 +586,14 @@
|
|||
"name": "Not Today, My Dears",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Necromancer has marked 7 or more of their HP, you can <strong>spend a Fear</strong> 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.</p>",
|
||||
"description": "<p>When the @Lookup[@name] has marked 7 or more of their HP, you can <strong>spend a Fear</strong> 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.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"DX8WPeLVrRBB2CdM": {
|
||||
"type": "attack",
|
||||
"_id": "DX8WPeLVrRBB2CdM",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When the Necromancer has marked 7 or more of their HP, you can <strong>spend a Fear</strong> 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.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -640,7 +644,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "k4MSykLRoW3qp7Lk",
|
||||
"img": "icons/magic/death/skull-horned-worn-fire-blue.webp",
|
||||
|
|
@ -661,14 +666,14 @@
|
|||
"name": "Your Life Is Mine",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><em>Countdown (Loop 2d6)</em>. When the Necromancer has marked 6 or more of their HP, activate the countdown. When it triggers, deal <strong>2d10+6</strong> direct magic damage to a target within Close range. The Necromancer then <strong>clears a number of Stress or HP</strong> equal to the number of HP marked by the target from this attack.</p>",
|
||||
"description": "<p><em>Countdown (Loop 2d6)</em>. When the @Lookup[@name] has marked 6 or more of their HP, activate the countdown. When it triggers, deal <strong>2d10+6</strong> direct magic damage to a target within Close range. The @Lookup[@name] then <strong>clears a number of Stress or HP</strong> equal to the number of HP marked by the target from this attack.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"YzepYov9vEMcBPU1": {
|
||||
"type": "damage",
|
||||
"_id": "YzepYov9vEMcBPU1",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>Deal <strong>2d10+6</strong> direct magic damage to a target within Close range. The Necromancer then <strong>clears a number of Stress or HP</strong> equal to the number of HP marked by the target from this attack.</p>",
|
||||
"description": "<p>Deal <strong>2d10+6</strong> direct magic damage to a target within Close range. The @Lookup[@name] then <strong>clears a number of Stress or HP</strong> equal to the number of HP marked by the target from this attack.</p>",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -721,7 +726,7 @@
|
|||
"type": "countdown",
|
||||
"_id": "LXhwkNCDFeUric8D",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><em>Countdown (Loop 2d6)</em>. When the Necromancer has marked 6 or more of their HP, activate the countdown.</p>",
|
||||
"description": "<p><em>Countdown (Loop 2d6)</em>. When the @Lookup[@name] has marked 6 or more of their HP, activate the countdown.</p>",
|
||||
"chatDisplay": true,
|
||||
"originItem": {
|
||||
"type": "itemCollection"
|
||||
|
|
@ -756,7 +761,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "FKcuCo0v2U7fVkqq",
|
||||
"img": "icons/magic/unholy/hand-claw-fire-green.webp",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
@ -234,7 +236,7 @@
|
|||
"type": "attack",
|
||||
"_id": "84rwldOFvTPrrHJJ",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>Make an attack against a target within Far range. On a success, <strong>mark a Stress</strong> to deal <strong>1d12+3</strong> physical damage. If the target marks HP from this attack, they have disadvantage on Agility Rolls until they clear at least 1 HP.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -311,7 +313,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"effects": [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -111,7 +111,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 84,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "0ts6CGd93lLqGZI5",
|
||||
|
|
@ -220,7 +221,7 @@
|
|||
"name": "Horde (1d6+3)",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Squadron has marked half or more of their HP, their standard attack deals <strong>1d6+3</strong> physical damage instead.</p>",
|
||||
"description": "<p>When the @Lookup[@name] has marked half or more of their HP, their standard attack deals <strong>1d6+3</strong> physical damage instead.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -245,14 +246,14 @@
|
|||
"name": "Focused Volley",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Spend a Fear</strong> 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 <strong>1d10+4</strong> physical damage.</p><p>@Template[type:circle|range:c]</p>",
|
||||
"description": "<p><strong>Spend a Fear</strong> 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 <strong>1d10+4</strong> physical damage.</p><p>@Template[type:circle|range:c]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"uG7Hl2DqaT69aNs1": {
|
||||
"type": "attack",
|
||||
"_id": "uG7Hl2DqaT69aNs1",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend a Fear</strong> 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 <strong>1d10+4</strong> physical damage.</p><p>@Template[type:circle|range:c]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -328,7 +329,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "Wuf5y9tJ88BwzLv2",
|
||||
"img": "icons/skills/ranged/arrows-flying-triple-brown.webp",
|
||||
|
|
@ -356,7 +358,7 @@
|
|||
"type": "attack",
|
||||
"_id": "mH6mmJIMM1fwzePt",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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 <strong>2d6+3</strong> physical damage. On a success, they take half damage.</p><p>@Template[type:circle|range:c]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -425,7 +427,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "ayGHTtyjSuIR4BrV",
|
||||
"img": "icons/skills/ranged/arrows-flying-salvo-blue.webp",
|
||||
|
|
|
|||
|
|
@ -117,7 +117,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 84,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "h5RuhzGL17dW5FBT",
|
||||
|
|
@ -226,14 +227,14 @@
|
|||
"name": "Grindletooth Venom",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>Targets who mark HP from the Assassin’s attacks are Vulnerable until they clear a HP.</p>",
|
||||
"description": "<p>Targets who mark HP from the @Lookup[@name]’s attacks are Vulnerable until they clear a HP.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"L83tU1TgmqoH9SSn": {
|
||||
"type": "effect",
|
||||
"_id": "L83tU1TgmqoH9SSn",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>Targets who mark HP from the Assassin’s attacks are Vulnerable until they clear a HP.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -318,7 +319,7 @@
|
|||
"name": "Assassin Poisoner",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>The Assassin has advantage on attacks if they are <em>Hidden</em>.</p>",
|
||||
"description": "<p>The @Lookup[@name] has advantage on attacks if they are <em>Hidden</em>.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -394,7 +395,7 @@
|
|||
"type": "effect",
|
||||
"_id": "sp7RfJRQJsEUm09m",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>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.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -419,7 +420,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "lAmiK8wVxjyHwKlp",
|
||||
"img": "icons/magic/air/fog-gas-smoke-green.webp",
|
||||
|
|
|
|||
|
|
@ -117,7 +117,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 85,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "large"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "dgH3fW9FTYLaIDvS",
|
||||
|
|
@ -226,14 +227,14 @@
|
|||
"name": "Relentless (2)",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>The Box can be spotlighted up to two times times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"description": "<p>The @Lookup[@name] can be spotlighted up to two times times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"2JfPSV3pw6pv0BXd": {
|
||||
"type": "effect",
|
||||
"_id": "2JfPSV3pw6pv0BXd",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>The Box can be spotlighted up to two times times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "passive",
|
||||
"cost": [
|
||||
|
|
@ -284,14 +285,14 @@
|
|||
"name": "Randomized Tactics",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>Mark a Stress and roll a <strong>d6</strong>. The Box uses the corresponding move:</p><ol><li><p><strong>Mana Beam</strong></p></li><li><p><strong>Fire Jets</strong></p></li><li><p><strong>Trample</strong></p></li><li><p><strong>Shocking Gas</strong></p></li><li><p><strong>Stunning Clap</strong></p></li><li><p><strong>Psionic Whine</strong></p></li></ol>",
|
||||
"description": "<p>Mark a Stress and roll a <strong>d6</strong>. The @Lookup[@name] uses the corresponding move:</p><ol><li><p><strong>Mana Beam</strong></p></li><li><p><strong>Fire Jets</strong></p></li><li><p><strong>Trample</strong></p></li><li><p><strong>Shocking Gas</strong></p></li><li><p><strong>Stunning Clap</strong></p></li><li><p><strong>Psionic Whine</strong></p></li></ol>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"FX9jwg5ZNjAWnti3": {
|
||||
"type": "attack",
|
||||
"_id": "FX9jwg5ZNjAWnti3",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>Mark a Stress and roll a <strong>d6</strong>. The Box uses the corresponding move:</p><ol><li><p><strong>Mana Beam</strong></p></li><li><p><strong>Fire Jets</strong></p></li><li><p><strong>Trample</strong></p></li><li><p><strong>Shocking Gas</strong></p></li><li><p><strong>Stunning Clap</strong></p></li><li><p><strong>Psionic Whine</strong></p></li></ol>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -342,7 +343,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "ZqfLMjVkbUwDw4p6",
|
||||
"img": "icons/commodities/tech/transmission.webp",
|
||||
|
|
@ -363,14 +365,14 @@
|
|||
"name": "Mana Beam",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>The Box fires a searing beam. Make an attack against a target within Far range. On a success, deal <strong>2d10+2</strong> magic damage. </p>",
|
||||
"description": "<p>The @Lookup[@name] fires a searing beam. Make an attack against a target within Far range. On a success, deal <strong>2d10+2</strong> magic damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"Co09oXMw0yBjGaws": {
|
||||
"type": "attack",
|
||||
"_id": "Co09oXMw0yBjGaws",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>The Box fires a searing beam. Make an attack against a target within Far range. On a success, deal <strong>2d10+2</strong> magic damage.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -441,7 +443,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "lqyN4CQop53BzarW",
|
||||
"img": "icons/magic/light/beam-rays-blue.webp",
|
||||
|
|
@ -462,14 +465,14 @@
|
|||
"name": "Fire Jets",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>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 <strong>2d8</strong> physical damage.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "<p>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 <strong>2d8</strong> physical damage.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"hRAKaOdzQXLYBNVV": {
|
||||
"type": "attack",
|
||||
"_id": "hRAKaOdzQXLYBNVV",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>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 <strong>2d8</strong> physical damage.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -540,7 +543,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "IHQoqt39T772FVMs",
|
||||
"img": "icons/magic/fire/explosion-embers-orange.webp",
|
||||
|
|
@ -561,14 +565,14 @@
|
|||
"name": "Trample",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>The Box rockets around erratically. Make an attack against all PCs within Close range. Targets the Box succeeds against take <strong>1d6+5</strong> physical damage and are Vulnerable until their next roll with Hope. </p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "<p>The @Lookup[@name] rockets around erratically. Make an attack against all PCs within Close range. Targets the @Lookup[@name] succeeds against take <strong>1d6+5</strong> physical damage and are Vulnerable until their next roll with Hope.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"IOgPMu12Xnn33TfG": {
|
||||
"type": "attack",
|
||||
"_id": "IOgPMu12Xnn33TfG",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>The Box rockets around erratically. Make an attack against all PCs within Close range. Targets the Box succeeds against take <strong>1d6+5</strong> physical damage and are Vulnerable until their next roll with Hope.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -644,7 +648,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "XtnByqUr9AuYU9Ip",
|
||||
"img": "icons/skills/movement/arrow-upward-yellow.webp",
|
||||
|
|
@ -704,14 +709,14 @@
|
|||
"name": "Shocking Gas",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>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. </p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "<p>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.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"ky4OMl558J5wCbDp": {
|
||||
"type": "attack",
|
||||
"_id": "ky4OMl558J5wCbDp",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>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.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -781,7 +786,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "3bPURmuwQs06fThQ",
|
||||
"img": "icons/magic/lightning/bolt-strike-embers-teal.webp",
|
||||
|
|
@ -802,14 +808,14 @@
|
|||
"name": "Stunning Clap",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>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 <em>Vulnerable</em> until the cube is defeated.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||
"description": "<p>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 <em>Vulnerable</em> until the cube is defeated.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"LQtopkrtSlCQ5MAr": {
|
||||
"type": "attack",
|
||||
"_id": "LQtopkrtSlCQ5MAr",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>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 <em>Vulnerable</em> until the cube is defeated.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -858,7 +864,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "ijIaKjroxq3xZd9Z",
|
||||
"img": "icons/magic/sonic/explosion-impact-shock-wave.webp",
|
||||
|
|
@ -918,14 +925,14 @@
|
|||
"name": "Psionic Whine",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>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 <strong>2d4+9</strong> direct magic damage.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "<p>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 <strong>2d4+9</strong> direct magic damage.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"3R3pGOUj4rHaUzPK": {
|
||||
"type": "attack",
|
||||
"_id": "3R3pGOUj4rHaUzPK",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>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 <strong>2d4+9</strong> direct magic damage.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -996,7 +1003,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "JCue4ko61bjhedXv",
|
||||
"img": "icons/creatures/invertebrates/wasp-swarm-tan.webp",
|
||||
|
|
@ -1017,14 +1025,14 @@
|
|||
"name": "Overcharge",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>Before rolling damage for the Box’s attack, you can <strong>mark a Stress</strong> to add a <strong>d6</strong> to the damage roll. Additionally, you gain a Fear.</p>",
|
||||
"description": "<p>Before rolling damage for the @Lookup[@name]’s attack, you can <strong>mark a Stress</strong> to add a <strong>d6</strong> to the damage roll. Additionally, you gain a Fear.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"3XOvKoYz4CqMNrU9": {
|
||||
"type": "healing",
|
||||
"_id": "3XOvKoYz4CqMNrU9",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>Before rolling damage for the Box’s attack, you can <strong>mark a Stress</strong> to add a <strong>d6</strong> to the damage roll. Additionally, you gain a Fear.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -1096,7 +1104,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "ITzpRJr2jWK0Ksmp",
|
||||
"img": "icons/creatures/magical/construct-golem-stone-blue.webp",
|
||||
|
|
@ -1117,14 +1126,14 @@
|
|||
"name": "Death Quake",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>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 <strong>2d8+1</strong> magic damage</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "<p>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 <strong>2d8+1</strong> magic damage</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"oCpv4zi9jtEpo0K1": {
|
||||
"type": "attack",
|
||||
"_id": "oCpv4zi9jtEpo0K1",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>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 <strong>2d8+1</strong> magic damage</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -1195,7 +1204,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "YvfzPyJbbv2ia6Yp",
|
||||
"img": "icons/magic/sonic/explosion-shock-wave-teal.webp",
|
||||
|
|
|
|||
|
|
@ -122,7 +122,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 75,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "large"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "71qKDLKO3CsrNkdy",
|
||||
|
|
@ -233,7 +234,7 @@
|
|||
"_id": "2fXzhh2qil8dw3vw",
|
||||
"img": "icons/skills/melee/strike-slashes-orange.webp",
|
||||
"system": {
|
||||
"description": "<p>Targets who mark HP from the Bear’s standard attack are knocked back to Very Close range.</p>",
|
||||
"description": "<p>Targets who mark HP from the @Lookup[@name]’s standard attack are knocked back to Very Close range.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -266,7 +267,7 @@
|
|||
"type": "attack",
|
||||
"_id": "PXL3e51eBYZ4O2lb",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> to make an attack against a target within Melee range. On a success, deal <strong>3d4+10</strong> physical damage and the target is <em>Restrained</em> until they break free with a successful Strength Roll.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -350,7 +351,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"effects": [
|
||||
{
|
||||
|
|
@ -485,7 +487,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
|
|
|
|||
|
|
@ -117,7 +117,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 77,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "B4LZcGuBAHzyVdzy",
|
||||
|
|
@ -228,14 +229,14 @@
|
|||
"_id": "qEn4baWgkjKtmILp",
|
||||
"img": "icons/equipment/shield/shield-round-boss-wood-brown.webp",
|
||||
"system": {
|
||||
"description": "<p>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.</p>",
|
||||
"description": "<p>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.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"3lbeEeJdjzPn0MoG": {
|
||||
"type": "attack",
|
||||
"_id": "3lbeEeJdjzPn0MoG",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>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.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "passive",
|
||||
"cost": [],
|
||||
|
|
@ -308,7 +309,7 @@
|
|||
"type": "attack",
|
||||
"_id": "TK5R00afB1RIA6gp",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>Make an attack against a target within Very Close range. On a success, <strong>mark a Stress</strong> to Restrain the target until they break free with a successful attack, Finesse Roll, or Strength Roll.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -358,7 +359,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"effects": [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -120,7 +120,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 83,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "2UeZ0tEe7AzgSJNd",
|
||||
|
|
@ -231,7 +232,7 @@
|
|||
"_id": "yBaLF9DwPH2GSRKf",
|
||||
"img": "icons/magic/time/hourglass-brown-orange.webp",
|
||||
"system": {
|
||||
"description": "<p>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.</p>",
|
||||
"description": "<p>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.</p>",
|
||||
"resource": {
|
||||
"type": "simple",
|
||||
"value": 0,
|
||||
|
|
@ -262,14 +263,14 @@
|
|||
"_id": "LP7xVLMTkJsmiIvl",
|
||||
"img": "icons/skills/melee/strike-slashes-red.webp",
|
||||
"system": {
|
||||
"description": "<p>Make a standard attack with advantage against a target the Zombie has <em>Restrained</em>. On a success, the attack deals direct damage.</p>",
|
||||
"description": "<p>Make a standard attack with advantage against a target the @Lookup[@name] has <em>Restrained</em>. On a success, the attack deals direct damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"qCcWw60cPZnEWbpG": {
|
||||
"type": "attack",
|
||||
"_id": "qCcWw60cPZnEWbpG",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>Make a standard attack with advantage against a target the Zombie has <em>Restrained</em>. On a success, the attack deals direct damage.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -342,7 +343,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
|
|
@ -363,14 +365,14 @@
|
|||
"_id": "69reUZ5tv3splqyO",
|
||||
"img": "icons/creatures/abilities/mouth-teeth-lamprey-red.webp",
|
||||
"system": {
|
||||
"description": "<p>When the Zombies makes a successful standard attack, you can <strong>mark a Stress</strong> to temporarily Restrain the target and force them to mark 2 Stress.</p>",
|
||||
"description": "<p>When the @Lookup[@name] makes a successful standard attack, you can <strong>mark a Stress</strong> to temporarily Restrain the target and force them to mark 2 Stress.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"xV1z3dk9c7jIkk7v": {
|
||||
"type": "damage",
|
||||
"_id": "xV1z3dk9c7jIkk7v",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When the Zombies makes a successful standard attack, you can <strong>mark a Stress</strong> to temporarily Restrain the target and force them to mark 2 Stress.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -433,7 +435,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"effects": [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -118,7 +118,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 75,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "large"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "8Zkqk1jU09nKL2fy",
|
||||
|
|
@ -229,14 +230,14 @@
|
|||
"_id": "ynuyMl1sMQYINfcQ",
|
||||
"img": "icons/weapons/clubs/club-spiked-glowing.webp",
|
||||
"system": {
|
||||
"description": "<p>You must <strong>spend a Fear</strong> to spotlight the Ogre. While spotlighted, they can make their standard attack against all targets within range.</p>",
|
||||
"description": "<p>You must <strong>spend a Fear</strong> to spotlight the @Lookup[@name]. While spotlighted, they can make their standard attack against all targets within range.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"UoZ6vXRXvWYjpJpZ": {
|
||||
"type": "effect",
|
||||
"_id": "UoZ6vXRXvWYjpJpZ",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>You must <strong>spend a Fear</strong> to spotlight the Ogre. While spotlighted, they can make their standard attack against all targets within range.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -285,7 +286,7 @@
|
|||
"_id": "szu5YYQ6klkDbqAT",
|
||||
"img": "icons/skills/wounds/bone-broken-marrow-red.webp",
|
||||
"system": {
|
||||
"description": "<p>The Ogre’s attacks deal direct damage.</p>",
|
||||
"description": "<p>The @Lookup[@name]’s attacks deal direct damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -311,14 +312,14 @@
|
|||
"_id": "zGvaBYJPOOnQVQEn",
|
||||
"img": "icons/magic/earth/projectile-stone-boulder-orange.webp",
|
||||
"system": {
|
||||
"description": "<p><strong>Mark a Stress</strong> 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 <strong>1d10+2</strong> physical damage. If they succeed against more than one target, you gain a Fear.</p><p>@Template[type:inFront|range:f]</p>",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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 <strong>1d10+2</strong> physical damage. If they succeed against more than one target, you gain a Fear.</p><p>@Template[type:inFront|range:f]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"3p1qfHy5uHe4H2hB": {
|
||||
"type": "attack",
|
||||
"_id": "3p1qfHy5uHe4H2hB",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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 <strong>1d10+2</strong> physical damage. If they succeed against more than one target, you gain a Fear.</p><p>@Template[type:inFront|range:f]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -467,7 +468,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
|
|
@ -488,14 +490,14 @@
|
|||
"_id": "Qxkddj6nQc4RDExW",
|
||||
"img": "icons/skills/melee/strike-flail-destructive-yellow.webp",
|
||||
"system": {
|
||||
"description": "<p>When the Ogre marks 2 or more HP, they can rampage. Move the Ogre to a point within Close range and deal <strong>2d6+3</strong> direct physical damage to all targets in their path.</p>",
|
||||
"description": "<p>When the @Lookup[@name] marks 2 or more HP, they can rampage. Move the @Lookup[@name] to a point within Close range and deal <strong>2d6+3</strong> direct physical damage to all targets in their path.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"PtTu9bnCJKMySBSV": {
|
||||
"type": "damage",
|
||||
"_id": "PtTu9bnCJKMySBSV",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When the Ogre marks 2 or more HP, they can rampage. Move the Ogre to a point within Close range and deal <strong>2d6+3</strong> direct physical damage to all targets in their path.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -548,7 +550,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
|
|
|
|||
|
|
@ -111,7 +111,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 85,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "tiny"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "jDmHqGvzg5wjgmxE",
|
||||
|
|
@ -220,7 +221,7 @@
|
|||
"name": "Levitation",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>The Skull levitates several feet off the ground and can’t be <em>Restrained</em>.</p>",
|
||||
"description": "<p>The @Lookup[@name] levitates several feet off the ground and can’t be <em>Restrained</em>.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -289,7 +290,7 @@
|
|||
"name": "Wards",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p> The Skull is resistant to magic damage.</p>",
|
||||
"description": "<p>The @Lookup[@name] is resistant to magic damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -358,14 +359,14 @@
|
|||
"name": "Magic Burst",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Mark a Stress</strong> to make an attack against all targets within Close range. Targets the Skull succeeds against take <strong>2d6+4</strong> magic damage.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "<p><strong>Mark a Stress</strong> to make an attack against all targets within Close range. Targets the @Lookup[@name] succeeds against take <strong>2d6+4</strong> magic damage.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"iF0PD1t3yovKMTfy": {
|
||||
"type": "attack",
|
||||
"_id": "iF0PD1t3yovKMTfy",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> to make an attack against all targets within Close range. Targets the Skull succeeds against take <strong>2d6+4</strong> magic damage.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -443,7 +444,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "Zn25zBr96y1hrmnr",
|
||||
"img": "icons/magic/lightning/bolt-strike-purple.webp",
|
||||
|
|
@ -464,14 +466,14 @@
|
|||
"name": "Siphon Magic",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Spend a Fear</strong> to make an attack against a PC with a Spellcast trait within Very Close range. On a success, the target marks <strong>1d4</strong> Stress and the Skull clears that many Stress. Additionally, on a success, the Skull can immediately be spotlighted again.</p>",
|
||||
"description": "<p><strong>Spend a Fear</strong> to make an attack against a PC with a Spellcast trait within Very Close range. On a success, the target marks <strong>1d4</strong> Stress and the @Lookup[@name] clears that many Stress. Additionally, on a success, the @Lookup[@name] can immediately be spotlighted again.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"872Fq88Hitwc6f3W": {
|
||||
"type": "attack",
|
||||
"_id": "872Fq88Hitwc6f3W",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend a Fear</strong> to make an attack against a PC with a Spellcast trait within Very Close range. On a success, the target marks <strong>1d4</strong> Stress and the Skull clears that many Stress. Additionally, on a success, the Skull can immediately be spotlighted again.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -540,7 +542,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "urXRi4bdBfvl8U6K",
|
||||
"img": "icons/magic/control/sihouette-hold-beam-green.webp",
|
||||
|
|
|
|||
|
|
@ -104,7 +104,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 85,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "99TqczuQipBmaB8i",
|
||||
|
|
@ -213,7 +214,7 @@
|
|||
"name": "Minion (6)",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>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.</p>",
|
||||
"description": "<p>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.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -238,14 +239,14 @@
|
|||
"name": "Group Attack",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Spend a Fear</strong> 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.</p>",
|
||||
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 6 physical damage each. Combine this damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"cbAvPSIhwBMBTI3D": {
|
||||
"type": "effect",
|
||||
"_id": "cbAvPSIhwBMBTI3D",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend a Fear</strong> 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.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -272,7 +273,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "MWfKUGzT1YBmLvpn",
|
||||
"img": "icons/creatures/abilities/tail-strike-bone-orange.webp",
|
||||
|
|
|
|||
|
|
@ -111,7 +111,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 75,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "uOP5oT9QzXPlnf3p",
|
||||
|
|
@ -222,14 +223,14 @@
|
|||
"_id": "y3oUmDLGkcSjOO5Q",
|
||||
"img": "icons/magic/unholy/silhouette-evil-horned-giant.webp",
|
||||
"system": {
|
||||
"description": "<p>The Construct can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"description": "<p>The @Lookup[@name] can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"bay0pyPsCyDEZKuk": {
|
||||
"type": "effect",
|
||||
"_id": "bay0pyPsCyDEZKuk",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>The Construct can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "passive",
|
||||
"cost": [
|
||||
|
|
@ -281,7 +282,7 @@
|
|||
"_id": "p4HLIkiM3HsglRoA",
|
||||
"img": "icons/commodities/metal/barstock-broken-steel.webp",
|
||||
"system": {
|
||||
"description": "<p>When the Construct marks HP from physical damage, they must mark an additional HP.</p>",
|
||||
"description": "<p>When the @Lookup[@name] marks HP from physical damage, they must mark an additional HP.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -307,14 +308,14 @@
|
|||
"_id": "93m085bEaKFzvEWT",
|
||||
"img": "icons/skills/movement/arrow-upward-blue.webp",
|
||||
"system": {
|
||||
"description": "<p><strong>Mark a Stress</strong> to make an attack against all targets in the Construct’s path when they move. Targets the Construct succeeds against take <strong>1d8</strong> physical damage.</p>",
|
||||
"description": "<p><strong>Mark a Stress</strong> to make an attack against all targets in the @Lookup[@name]’s path when they move. Targets the @Lookup[@name] succeeds against take <strong>1d8</strong> physical damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"OswphW4Z1B5oa4ts": {
|
||||
"type": "attack",
|
||||
"_id": "OswphW4Z1B5oa4ts",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> to make an attack against all targets in the Construct’s path when they move. Targets the Construct succeeds against take <strong>1d8</strong> physical damage.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -393,7 +394,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
|
|
@ -414,14 +416,14 @@
|
|||
"_id": "EF6YIDjQ0liFubGA",
|
||||
"img": "icons/creatures/magical/construct-golem-stone-blue.webp",
|
||||
"system": {
|
||||
"description": "<p>Before rolling damage for the Construct’s attack, you can <strong>mark a Stress</strong> to gain a +10 bonus to the damage roll. The Construct can then take the spotlight again.</p>",
|
||||
"description": "<p>Before rolling damage for the @Lookup[@name]’s attack, you can <strong>mark a Stress</strong> to gain a +10 bonus to the damage roll. The @Lookup[@name] can then take the spotlight again.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"xYACTiZzApmCXXmf": {
|
||||
"type": "effect",
|
||||
"_id": "xYACTiZzApmCXXmf",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>Before rolling damage for the Construct’s attack, you can <strong>mark a Stress</strong> to gain a +10 bonus to the damage roll. The Construct can then take the spotlight again.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -449,7 +451,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"effects": [
|
||||
{
|
||||
|
|
@ -514,14 +517,14 @@
|
|||
"_id": "UlGLuV1L33tDWkli",
|
||||
"img": "icons/magic/sonic/explosion-shock-wave-teal.webp",
|
||||
"system": {
|
||||
"description": "<p>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 <strong>1d12+2</strong> magic damage.</p>",
|
||||
"description": "<p>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 <strong>1d12+2</strong> magic damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"fkIWRdcGPgHgm6VC": {
|
||||
"type": "attack",
|
||||
"_id": "fkIWRdcGPgHgm6VC",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>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 <strong>1d12+2</strong> magic damage.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -593,7 +596,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
|
|
|
|||
|
|
@ -122,7 +122,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 85,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "ZxWaWPdzFIUPNC62",
|
||||
|
|
@ -231,14 +232,14 @@
|
|||
"name": "Searing Glance",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When a PC within Close range makes a Presence Roll, you can <strong>mark a Stress</strong> to cast a gaze toward the aftermath. On the target’s failure, they must mark 2 Stress and are <em>Vulnerable</em> until the scene ends or they succeed on a social action against the Courtesan. On the target’s success, they must mark a Stress.</p>",
|
||||
"description": "<p>When a PC within Close range makes a Presence Roll, you can <strong>mark a Stress</strong> to cast a gaze toward the aftermath. On the target’s failure, they must mark 2 Stress and are <em>Vulnerable</em> 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.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"dRtDCrAPLc1GYqBs": {
|
||||
"type": "damage",
|
||||
"_id": "dRtDCrAPLc1GYqBs",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When a PC within Close range makes a Presence Roll, you can <strong>mark a Stress</strong> to cast a gaze toward the aftermath. On the target’s failure, they must mark 2 Stress and are <em>Vulnerable</em> until the scene ends or they succeed on a social action against the Courtesan. On the target’s success, they must mark a Stress.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -300,7 +301,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "rSMUPC5GhR982ifg",
|
||||
"img": "icons/magic/perception/eye-slit-orange.webp",
|
||||
|
|
|
|||
|
|
@ -117,7 +117,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 76,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "CBBuEXAlLKFMJdjg",
|
||||
|
|
@ -235,7 +236,7 @@
|
|||
"type": "attack",
|
||||
"_id": "Yi3rvjj0Umqt5Z8j",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -318,7 +319,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"effects": [
|
||||
{
|
||||
|
|
@ -378,14 +380,14 @@
|
|||
"_id": "Ux42ELBBuSYwm4yW",
|
||||
"img": "icons/skills/social/diplomacy-unity-alliance.webp",
|
||||
"system": {
|
||||
"description": "<p><strong>Spend a Fear</strong> and target a PC. The Courtier convinces a crowd or prominent individual that the target is the cause of their current conflict or misfortune.</p>",
|
||||
"description": "<p><strong>Spend a Fear</strong> 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.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"IwuFowlcXyjvfOxp": {
|
||||
"type": "effect",
|
||||
"_id": "IwuFowlcXyjvfOxp",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend a Fear</strong> and target a PC. The Courtier convinces a crowd or prominent individual that the target is the cause of their current conflict or misfortune.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -413,7 +415,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
|
|
|
|||
|
|
@ -122,7 +122,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 85,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "0NxCSugvKQ4W8OYZ",
|
||||
|
|
@ -238,7 +239,7 @@
|
|||
"type": "attack",
|
||||
"_id": "TQv3o9sRnlDNbPyu",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend a Fear</strong> to make a standard attack against a target within range. On a success, the target must mark a Stress.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -341,7 +342,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "kCffzM8rX8NEr9d2",
|
||||
"img": "icons/magic/unholy/beam-ringed-impact-purple.webp",
|
||||
|
|
@ -362,14 +364,14 @@
|
|||
"name": "Shroud of the Fallen",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Mark a Stress</strong> 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.</p>",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"8yRj7EpEI4PlKNhl": {
|
||||
"type": "effect",
|
||||
"_id": "8yRj7EpEI4PlKNhl",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -401,7 +403,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "IHWDn097sRgjlZXO",
|
||||
"img": "icons/magic/unholy/orb-contained-pink.webp",
|
||||
|
|
@ -479,7 +482,7 @@
|
|||
"type": "effect",
|
||||
"_id": "g4RDHrY0AEYXjH52",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend a Fear</strong> and choose a point within Far range. All targets within Close range of that point are <em>Restrained</em> 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.</p><p>@Template[type:circle|range:c]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -511,7 +514,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "JpSrduK3vjd9h098",
|
||||
"img": "icons/magic/air/fog-gas-smoke-dense-pink.webp",
|
||||
|
|
@ -578,7 +582,7 @@
|
|||
"type": "healing",
|
||||
"_id": "3tibqB97ooJesxf0",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>Twice per scene, when a PC rolls a failure with Fear, clear a Stress.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -643,7 +647,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "x6FbcrfOscb3er6P",
|
||||
"img": "icons/magic/unholy/silhouette-robe-evil-glow.webp",
|
||||
|
|
|
|||
|
|
@ -111,7 +111,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 86,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "tyBOpLfigAhI9bU3",
|
||||
|
|
@ -220,14 +221,14 @@
|
|||
"name": "Shadow's Embrace",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>The Fang can climb and walk on vertical surfaces. <strong>Mark a Stress</strong> to move from one shadow to another within Far range.</p>",
|
||||
"description": "<p>The @Lookup[@name] can climb and walk on vertical surfaces. <strong>Mark a Stress</strong> to move from one shadow to another within Far range.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"hjuqvsMB7KNLNvjg": {
|
||||
"type": "effect",
|
||||
"_id": "hjuqvsMB7KNLNvjg",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>The Fang can climb and walk on vertical surfaces. <strong>Mark a Stress</strong> to move from one shadow to another within Far range.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -275,14 +276,14 @@
|
|||
"name": "Pick Off the Straggler",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Mark a Stress</strong> 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.</p>",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"QjQ04SAwfjrxliNI": {
|
||||
"type": "attack",
|
||||
"_id": "QjQ04SAwfjrxliNI",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -364,7 +365,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "ohASSruBxcvuItIK",
|
||||
"img": "icons/magic/unholy/barrier-fire-pink.webp",
|
||||
|
|
|
|||
|
|
@ -104,7 +104,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 86,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "zx99sOGTXicP4SSD",
|
||||
|
|
@ -213,7 +214,7 @@
|
|||
"name": "Minion (6)",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>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.</p>",
|
||||
"description": "<p>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.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -238,14 +239,14 @@
|
|||
"name": "Group Attack",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Spend a Fear</strong> 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.</p>",
|
||||
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all Cult @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 5 physical damage each. Combine this damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"EH1preaTWBD4rOvx": {
|
||||
"type": "effect",
|
||||
"_id": "EH1preaTWBD4rOvx",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend a Fear</strong> 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.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -272,7 +273,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "WP6xQtYzouPEFr82",
|
||||
"img": "icons/creatures/abilities/tail-strike-bone-orange.webp",
|
||||
|
|
|
|||
|
|
@ -116,7 +116,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 76,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "9x2xY9zwc3xzbXo5",
|
||||
|
|
@ -234,7 +235,7 @@
|
|||
"type": "damage",
|
||||
"_id": "55hCZsJQhJNcZ0lX",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>Slam the ground, knocking all targets within Very Close range back to Far range. Each target knocked back this way must mark a Stress.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -285,7 +286,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
|
|
@ -306,14 +308,14 @@
|
|||
"_id": "rreGFW5TbhUoZf2T",
|
||||
"img": "icons/magic/nature/root-vine-entangled-hand.webp",
|
||||
"system": {
|
||||
"description": "<p>Make an attack against a target within Close range. On a success, <strong>spend a Fear</strong> to pull them into Melee range, deal <strong>1d6+2</strong> physical damage, and <em>Restrain</em> them until the Defender takes Severe damage.</p>",
|
||||
"description": "<p>Make an attack against a target within Close range. On a success, <strong>spend a Fear</strong> to pull them into Melee range, deal <strong>1d6+2</strong> physical damage, and <em>Restrain</em> them until the @Lookup[@name] takes Severe damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"nQ3vXrrKBizZoaDt": {
|
||||
"type": "attack",
|
||||
"_id": "nQ3vXrrKBizZoaDt",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>Make an attack against a target within Close range. On a success, <strong>spend a Fear</strong> to pull them into Melee range, deal <strong>1d6+2</strong> physical damage, and <em>Restrain</em> them until the Defender takes Severe damage.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -388,7 +390,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"effects": [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -117,7 +117,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 91,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "pnyjIGxxvurcWmTv",
|
||||
|
|
@ -226,7 +227,7 @@
|
|||
"name": "Money Talks",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>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.</p>",
|
||||
"description": "<p>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.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -251,7 +252,7 @@
|
|||
"name": "Number Must Go Up",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>Add a bonus to the Demon’s attack rolls equal to the number of handfuls of gold they have.</p>",
|
||||
"description": "<p>Add a bonus to the @Lookup[@name]’s attack rolls equal to the number of handfuls of gold they have.</p>",
|
||||
"resource": {
|
||||
"type": "simple",
|
||||
"value": 0,
|
||||
|
|
@ -329,7 +330,8 @@
|
|||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "BKgv2D1IdI813R8k",
|
||||
"img": "icons/skills/movement/arrows-up-trio-red.webp",
|
||||
|
|
|
|||
|
|
@ -117,7 +117,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 92,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "kE4dfhqmIQpNd44e",
|
||||
|
|
@ -226,7 +227,7 @@
|
|||
"name": "Depths of Despair",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>The Demon deals double damage to PCs with 0 Hope.</p>",
|
||||
"description": "<p>The @Lookup[@name] deals double damage to PCs with 0 Hope.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -258,7 +259,7 @@
|
|||
"type": "effect",
|
||||
"_id": "n0RYO05pROFU6ov3",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend a Fear</strong> to weigh down the spirits of all PCs within Far range. All targets affected replace their Hope Die with a <strong>d8</strong> until they roll a success with Hope or their next rest.</p><p>@Template[type:emanation|range:f]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -290,7 +291,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "FC8PIf4BVkhmoJX8",
|
||||
"img": "icons/magic/death/skull-flames-white-blue.webp",
|
||||
|
|
@ -355,7 +357,7 @@
|
|||
"type": "damage",
|
||||
"_id": "urrp8SCFgqbmSTvm",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When a PC fails with Fear, you can <strong>mark a Stress</strong> to cause all other PCs within Close range to lose a Hope.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -412,7 +414,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "dlMdfUjy2GaqgeOJ",
|
||||
"img": "icons/creatures/unholy/demon-fire-horned-mask.webp",
|
||||
|
|
@ -433,14 +436,14 @@
|
|||
"name": "Momentum",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Demon makes a successful attack against a PC, you gain a Fear.</p>",
|
||||
"description": "<p>When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"N0Xx6GnijLXIMGBw": {
|
||||
"type": "healing",
|
||||
"_id": "N0Xx6GnijLXIMGBw",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When the Demon makes a successful attack against a PC, you gain a Fear.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -507,7 +510,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "7qjx1c4C1fUfvXnu",
|
||||
"img": "icons/skills/melee/strike-weapons-orange.webp",
|
||||
|
|
|
|||
|
|
@ -117,7 +117,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 92,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "2VN3BftageoTTIzu",
|
||||
|
|
@ -226,14 +227,14 @@
|
|||
"name": "Terrifying",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Demon makes a successful attack, all PCs within Far range must lose a Hope and you gain a Fear.</p><p>@Template[type:emanation|range:f]</p>",
|
||||
"description": "<p>When the @Lookup[@name] makes a successful attack, all PCs within Far range must lose a Hope and you gain a Fear.</p><p>@Template[type:emanation|range:f]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"v3XbljQeHEyfuSXz": {
|
||||
"type": "damage",
|
||||
"_id": "v3XbljQeHEyfuSXz",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When the Demon makes a successful attack, all PCs within Far range must lose a Hope and you gain a Fear.</p><p>@Template[type:emanation|range:f]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -318,7 +319,7 @@
|
|||
"type": "damage",
|
||||
"_id": "nNfWqBgysVPtFh4w",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>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.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -389,14 +390,14 @@
|
|||
"name": "Unparalleled Skill",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Mark a Stress</strong> to deal the Demon’s standard attack damage to a target within Close range.</p>",
|
||||
"description": "<p><strong>Mark a Stress</strong> to deal the @Lookup[@name]’s standard attack damage to a target within Close range.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"MYOD2VAfdVC6hMCs": {
|
||||
"type": "damage",
|
||||
"_id": "MYOD2VAfdVC6hMCs",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> to deal the Demon’s standard attack damage to a target within Close range.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -454,7 +455,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "Y3W44ifKIcoYpONN",
|
||||
"img": "icons/skills/melee/spear-tips-quintuple-orange.webp",
|
||||
|
|
@ -482,7 +484,7 @@
|
|||
"type": "effect",
|
||||
"_id": "ozGST8UY2MJnrd3w",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend a Fear</strong> to spotlight two other Demons within Far range.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -509,7 +511,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "6BKWOTuxQWJd5RP5",
|
||||
"img": "icons/creatures/unholy/demon-fire-horned-winged-roar.webp",
|
||||
|
|
@ -530,14 +533,14 @@
|
|||
"name": "You Pale in Comparison",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When a PC fails a roll within Close range of the Demon, they must mark a Stress.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "<p>When a PC fails a roll within Close range of the @Lookup[@name], they must mark a Stress.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"kuCPWb9cu3pZdAhh": {
|
||||
"type": "damage",
|
||||
"_id": "kuCPWb9cu3pZdAhh",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When a PC fails a roll within Close range of the Demon, they must mark a Stress.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -587,7 +590,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "FLp1dPSJz1ezY0gD",
|
||||
"img": "icons/magic/control/fear-fright-shadow-monster-red.webp",
|
||||
|
|
|
|||
|
|
@ -118,7 +118,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 92,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "SxSOkM4bcVOFyjbo",
|
||||
|
|
@ -227,7 +228,7 @@
|
|||
"name": "Unprotected Mind",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p> The Demon’s standard attack deals direct damage.</p>",
|
||||
"description": "<p>The @Lookup[@name]’s standard attack deals direct damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -252,11 +253,12 @@
|
|||
"name": "My Turn",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Demon marks HP from an attack, <strong>spend a number of Fear equal to the HP marked by the Demon</strong> to cause the attacker to mark the same number of HP.</p>",
|
||||
"description": "<p>When the @Lookup[@name] marks HP from an attack, <strong>spend a number of Fear equal to the HP marked by the @Lookup[@name]</strong> to cause the attacker to mark the same number of HP.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "KVyhgMJSSHTwRISA",
|
||||
"img": "icons/magic/control/fear-fright-monster-grin-purple-blue.webp",
|
||||
|
|
@ -284,7 +286,7 @@
|
|||
"type": "effect",
|
||||
"_id": "UU3H5aPQejOSoFZw",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When a creature within Close range takes damage from a different adversary, you can <strong>mark a Stress</strong> to add a <strong>d4</strong> to the damage roll.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -311,7 +313,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "pSAupMWw1eYqm84z",
|
||||
"img": "icons/magic/perception/eye-ringed-glow-angry-small-teal.webp",
|
||||
|
|
@ -332,14 +335,14 @@
|
|||
"name": "What's Yours Is Mine",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When a PC takes Severe damage within Very Close range of the Demon, you can <strong>spend a Fear</strong> 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.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||
"description": "<p>When a PC takes Severe damage within Very Close range of the @Lookup[@name], you can <strong>spend a Fear</strong> 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.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"3cGZ2CofM9HUlELH": {
|
||||
"type": "attack",
|
||||
"_id": "3cGZ2CofM9HUlELH",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When a PC takes Severe damage within Very Close range of the Demon, you can <strong>spend a Fear</strong> 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.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -383,7 +386,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "589tCxFc8KZ3rdzP",
|
||||
"img": "icons/magic/perception/hand-eye-black.webp",
|
||||
|
|
|
|||
|
|
@ -118,7 +118,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 92,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "large"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "5lphJAgzoqZI3VoG",
|
||||
|
|
@ -227,7 +228,7 @@
|
|||
"name": "Anger Unrelenting",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>The Demon’s attacks deal direct damage.</p>",
|
||||
"description": "<p>The @Lookup[@name]’s attacks deal direct damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -259,7 +260,7 @@
|
|||
"type": "effect",
|
||||
"_id": "V142qYppCGJn8OiN",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend a Fear</strong> to boil the blood of all PCs within Far range. They use a d20 as their Fear Die until the end of the scene.</p><p>@Template[type:emanation|range:f]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -286,7 +287,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "a33PW8UkziliowlR",
|
||||
"img": "icons/skills/melee/maneuver-greatsword-yellow.webp",
|
||||
|
|
@ -307,14 +309,14 @@
|
|||
"name": "Retalliation",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Demon takes damage from an attack within Close range, you can <strong>mark a Stress</strong> to make a standard attack against the attacker.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "<p>When the @Lookup[@name] takes damage from an attack within Close range, you can <strong>mark a Stress</strong> to make a standard attack against the attacker.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"hxrdtBm4dYN7KGZm": {
|
||||
"type": "attack",
|
||||
"_id": "hxrdtBm4dYN7KGZm",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When the Demon takes damage from an attack within Close range, you can <strong>mark a Stress</strong> to make a standard attack against the attacker.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -393,7 +395,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "DjGydqLXT4rDa7Av",
|
||||
"img": "icons/skills/melee/blood-slash-foam-red.webp",
|
||||
|
|
@ -414,14 +417,14 @@
|
|||
"name": "Blood and Souls",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><em>Countdown (Loop 6)</em>. Activate the first time an attack is made within sight of the Demon. It ticks down when a PC takes a violent action. When it triggers, summon [[/r 1d4]]@UUID[Compendium.daggerheart.adversaries.Actor.3tqCjDwJAQ7JKqMb]{Minor Demons}, who appear at Close range.</p>",
|
||||
"description": "<p><em>Countdown (Loop 6)</em>. 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.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"szg3qA09aJUt9WKS": {
|
||||
"type": "countdown",
|
||||
"_id": "szg3qA09aJUt9WKS",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><em>Countdown (Loop 6)</em>. Activate the first time an attack is made within sight of the Demon. It ticks down when a PC takes a violent action.</p>",
|
||||
"description": "<p><em>Countdown (Loop 6)</em>. Activate the first time an attack is made within sight of the @Lookup[@name]. It ticks down when a PC takes a violent action.</p>",
|
||||
"chatDisplay": true,
|
||||
"originItem": {
|
||||
"type": "itemCollection"
|
||||
|
|
@ -482,7 +485,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "2F75BO0xEU8Zlj7T",
|
||||
"img": "icons/creatures/unholy/demon-fire-horned-clawed.webp",
|
||||
|
|
|
|||
|
|
@ -117,7 +117,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 86,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "large"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "NoRZ1PqB8N5wcIw0",
|
||||
|
|
@ -226,7 +227,7 @@
|
|||
"name": "Horde (2d4+1)",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Pack has marked half or more of their HP, their standard attack deals <strong>2d4+1</strong> physical damage instead.</p>",
|
||||
"description": "<p>When the @Lookup[@name] has marked half or more of their HP, their standard attack deals <strong>2d4+1</strong> physical damage instead.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -258,7 +259,7 @@
|
|||
"type": "damage",
|
||||
"_id": "XyLlX9RWSxciZ7oV",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -308,7 +309,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "WEbHwamS5ZBphiKq",
|
||||
"img": "icons/creatures/unholy/demons-horned-glowing-pink.webp",
|
||||
|
|
@ -329,14 +331,14 @@
|
|||
"name": "Momentum",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Pack makes a successful attack against a PC, you gain a Fear.</p>",
|
||||
"description": "<p>When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"BApDkAKPfyBkqrKY": {
|
||||
"type": "healing",
|
||||
"_id": "BApDkAKPfyBkqrKY",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When the Pack makes a successful attack against a PC, you gain a Fear.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "reaction",
|
||||
"cost": [],
|
||||
|
|
@ -403,7 +405,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "3mOBJE5c3cP2cGP1",
|
||||
"img": "icons/skills/melee/strike-weapons-orange.webp",
|
||||
|
|
|
|||
|
|
@ -116,7 +116,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 93,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "tBWHW00epmMnkawe",
|
||||
|
|
@ -225,7 +226,7 @@
|
|||
"name": "Flying",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>While flying, the Bat gains a +3 bonus to their Difficulty.</p>",
|
||||
"description": "<p>While flying, the @Lookup[@name] gains a +3 bonus to their Difficulty.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -294,14 +295,14 @@
|
|||
"name": "Screech",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Mark a Stress</strong> to send a high-pitch screech out toward all targets in front of the Bat within Far range. Those targets must mark <strong>1d4</strong> Stress.</p><p>@Template[type:inFront|range:f]</p>",
|
||||
"description": "<p><strong>Mark a Stress</strong> to send a high-pitch screech out toward all targets in front of the @Lookup[@name] within Far range. Those targets must mark <strong>1d4</strong> Stress.</p><p>@Template[type:inFront|range:f]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"2ILfoiBoMyBCtBsL": {
|
||||
"type": "damage",
|
||||
"_id": "2ILfoiBoMyBCtBsL",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> to send a high-pitch screech out toward all targets in front of the Bat within Far range. Those targets must mark <strong>1d4</strong> Stress.</p><p>@Template[type:inFront|range:f]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -350,7 +351,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "o69lipskvBwGVhe4",
|
||||
"img": "icons/magic/sonic/projectile-sound-rings-wave.webp",
|
||||
|
|
@ -378,7 +380,7 @@
|
|||
"type": "attack",
|
||||
"_id": "wW7WGisUBzyxjsH2",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When an allied Vampire marks HP, you can <strong>mark a Stress</strong> to fl y into Melee range of the attacker and make an attack with advantage against them. On a success, deal <strong>2d6+2</strong> physical damage.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -456,7 +458,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "BQPGgbNzKbNkGDJb",
|
||||
"img": "icons/skills/melee/strike-slashes-red.webp",
|
||||
|
|
|
|||
|
|
@ -117,7 +117,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 76,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "wNzeuQLfLUMvgHlQ",
|
||||
|
|
@ -228,14 +229,14 @@
|
|||
"_id": "wQXEnMqrl2jo91oy",
|
||||
"img": "icons/creatures/abilities/wolf-howl-moon-purple.webp",
|
||||
"system": {
|
||||
"description": "<p>If the Wolf makes a successful standard attack and another Dire Wolf is within Melee range of the target, deal <strong>1d6+5</strong> physical damage instead of their standard damage and you gain a Fear.</p>",
|
||||
"description": "<p>If the @Lookup[@name] makes a successful standard attack and another @Lookup[@name] is within Melee range of the target, deal <strong>1d6+5</strong> physical damage instead of their standard damage and you gain a Fear.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"FFQvt3sMfuwXxIrf": {
|
||||
"type": "attack",
|
||||
"_id": "FFQvt3sMfuwXxIrf",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>If the Wolf makes a successful standard attack and another Dire Wolf is within Melee range of the target, deal <strong>1d6+5</strong> physical damage instead of their standard damage and you gain a Fear.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "passive",
|
||||
"cost": [],
|
||||
|
|
@ -334,7 +335,7 @@
|
|||
"type": "attack",
|
||||
"_id": "Tvizq1jEfG8FyfNc",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> to make an attack against a target within Melee range. On a success, deal <strong>3d4+10</strong> direct physical damage and make them <em>Vulnerable</em> until they clear at least 1 HP.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -417,7 +418,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"effects": [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -117,7 +117,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 93,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "wR7cFKrHvRzbzhBT",
|
||||
|
|
@ -226,14 +227,14 @@
|
|||
"name": "Bramble Patch",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Mark a Stress</strong> 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 <strong>2d6+2</strong> 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.</p><p>@Template[type:circle|range:c]</p>",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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 <strong>2d6+2</strong> 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.</p><p>@Template[type:circle|range:c]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"iCJdIs57hfh5Cb0u": {
|
||||
"type": "attack",
|
||||
"_id": "iCJdIs57hfh5Cb0u",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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 <strong>2d6+2</strong> 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.</p><p>@Template[type:circle|range:c]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -337,7 +338,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "i9HbArl09dX2BvzY",
|
||||
"img": "icons/magic/nature/root-vines-grow-brown.webp",
|
||||
|
|
@ -365,7 +367,7 @@
|
|||
"type": "effect",
|
||||
"_id": "84Q2b0zIY9c7Yhho",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend a Fear</strong> to grow three @UUID[Compendium.daggerheart.adversaries.Actor.o63nS0k3wHu6EgKP]{Treant Sapling Minions}, who appear at Close range and immediately take the spotlight.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -392,7 +394,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "yKWQLL3qsEZlQjyb",
|
||||
"img": "icons/magic/nature/tree-animated-stump-mushrooms-teal.webp",
|
||||
|
|
@ -517,7 +520,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "z4JbqiHuxrWy6Cpu",
|
||||
"img": "icons/magic/nature/vines-thorned-curled-glow-teal-purple.webp",
|
||||
|
|
|
|||
|
|
@ -111,7 +111,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 86,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "TLzY1nDw0Bu9Ud40",
|
||||
|
|
@ -220,7 +221,7 @@
|
|||
"name": "Horde (2d4+1)",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Eels have marked half or more of their HP, their standard attack deals <strong>2d4+1</strong> physical damage instead.</p>",
|
||||
"description": "<p>When the @Lookup[@name] have marked half or more of their HP, their standard attack deals <strong>2d4+1</strong> physical damage instead.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -252,7 +253,7 @@
|
|||
"type": "attack",
|
||||
"_id": "L4Rpg7fnFuxpD3im",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> to make a standard attack against all targets within Very Close range. You gain a Fear for each target that marks HP.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -330,7 +331,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "u5NL1eUJeAkIEpgt",
|
||||
"img": "icons/magic/lightning/bolt-strike-sparks-teal.webp",
|
||||
|
|
|
|||
|
|
@ -104,7 +104,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 93,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "tiny"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "P7h54ZePFPHpYwvB",
|
||||
|
|
@ -213,7 +214,7 @@
|
|||
"name": "Minion (9)",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>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.</p>",
|
||||
"description": "<p>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.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -238,7 +239,7 @@
|
|||
"name": "Group Attack",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Spend a Fear</strong> 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.</p>",
|
||||
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 5 physical damage each. Combine this damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"vXHZVb0Y7Hqu3uso": {
|
||||
|
|
@ -272,7 +273,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "13OraSLq2YjpZqbm",
|
||||
"img": "icons/creatures/abilities/tail-strike-bone-orange.webp",
|
||||
|
|
|
|||
|
|
@ -143,7 +143,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 86,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"ownership": {
|
||||
|
|
@ -258,7 +259,7 @@
|
|||
"type": "attack",
|
||||
"_id": "XquYMA2xJZUKSmXQ",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> to move into Melee range of an ally and make a standard attack against a target within Very Close range. On a success, deal <strong>2d10+2</strong> physical damage and the ally can clear a Stress.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -336,7 +337,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "ojiIZHBd0sMLxSUE",
|
||||
"img": "icons/skills/melee/hand-grip-sword-orange.webp",
|
||||
|
|
@ -357,14 +359,14 @@
|
|||
"name": "Vassal's Loyalty",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>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.</p>",
|
||||
"description": "<p>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.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"dwpQNx63V6hL1mXZ": {
|
||||
"type": "effect",
|
||||
"_id": "dwpQNx63V6hL1mXZ",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>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.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -391,7 +393,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "zcfyEY29yWqJtZbl",
|
||||
"img": "icons/magic/defensive/shield-barrier-blue.webp",
|
||||
|
|
|
|||
|
|
@ -117,7 +117,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 86,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "ChwwVqowFw8hJQwT",
|
||||
|
|
@ -226,7 +227,7 @@
|
|||
"name": "Warped Fortitude",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>The Experiment is resistant to physical damage.</p>",
|
||||
"description": "<p>The @Lookup[@name] is resistant to physical damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -295,7 +296,7 @@
|
|||
"name": "Overwhelm",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When a target the Experiment attacks has other adversaries within Very Close range, the Experiment deals double damage.</p>",
|
||||
"description": "<p>When a target the @Lookup[@name] attacks has other adversaries within Very Close range, the @Lookup[@name] deals double damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -320,14 +321,14 @@
|
|||
"name": "Lurching Lunge",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Mark a Stress</strong> to spotlight the Experiment as an additional GM move instead of spending Fear.</p>",
|
||||
"description": "<p><strong>Mark a Stress</strong> to spotlight the @Lookup[@name] as an additional GM move instead of spending Fear.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"i3FANnO1t9AzJdTp": {
|
||||
"type": "effect",
|
||||
"_id": "i3FANnO1t9AzJdTp",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> to spotlight the Experiment as an additional GM move instead of spending Fear.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -354,7 +355,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "g0h3Zo6xqgfSlyxi",
|
||||
"img": "icons/skills/melee/strike-slashes-red.webp",
|
||||
|
|
|
|||
|
|
@ -104,7 +104,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 97,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "OsLG2BjaEdTZUJU9",
|
||||
|
|
@ -213,7 +214,7 @@
|
|||
"name": "Minion (12)",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>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.</p>",
|
||||
"description": "<p>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.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -238,7 +239,7 @@
|
|||
"name": "Aura of Doom",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When a PC marks HP from an attack by the Shock Troop, they lose a Hope.</p>",
|
||||
"description": "<p>When a PC marks HP from an attack by the @Lookup[@name], they lose a Hope.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"HcGa2nD0WziA0lFP": {
|
||||
|
|
@ -316,14 +317,14 @@
|
|||
"name": "Group Attack",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Spend a Fear</strong> 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.</p>",
|
||||
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 12 physical damage each. Combine this damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"QHNRSEQmqOcaoXq4": {
|
||||
"type": "effect",
|
||||
"_id": "QHNRSEQmqOcaoXq4",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend a Fear</strong> 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.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -350,7 +351,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "gC4whvt2r9Tfso9Y",
|
||||
"img": "icons/creatures/abilities/tail-strike-bone-orange.webp",
|
||||
|
|
|
|||
|
|
@ -117,7 +117,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 97,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "PELRry1vqjBzSAlr",
|
||||
|
|
@ -226,14 +227,14 @@
|
|||
"name": "Conflagration",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Spend a Fear</strong> to unleash an all-consuming f i restorm and make an attack against all targets within Close range. Targets the Sorcerer succeeds against take <strong>2d10+6</strong> direct magic damage.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "<p><strong>Spend a Fear</strong> to unleash an all-consuming firestorm and make an attack against all targets within Close range. Targets the @Lookup[@name] succeeds against take <strong>2d10+6</strong> direct magic damage.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"v7zZo52Dnj1e1i2G": {
|
||||
"type": "attack",
|
||||
"_id": "v7zZo52Dnj1e1i2G",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend a Fear</strong> to unleash an all-consuming f i restorm and make an attack against all targets within Close range. Targets the Sorcerer succeeds against take <strong>2d10+6</strong> direct magic damage.</p><p>@Template[type:emanation|range:c]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -311,7 +312,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "s15sNyb3JYMzBLIU",
|
||||
"img": "icons/magic/fire/projectile-beams-salvo-red.webp",
|
||||
|
|
@ -339,7 +341,7 @@
|
|||
"type": "effect",
|
||||
"_id": "mXWOpXcYALYqicTw",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> to trap a target within Far range in a powerful illusion of their worst fears. While trapped, the target is <em>Restrained</em> and <em>Vulnerable</em> until they break free, ending both conditions, with a successful Instinct Roll.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -364,7 +366,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "ecp9o8t1dQFXGsse",
|
||||
"img": "icons/magic/death/skull-energy-light-white.webp",
|
||||
|
|
@ -425,11 +428,12 @@
|
|||
"name": "Slippery",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Sorcerer takes damage from an attack, they can teleport up to Far range.</p>",
|
||||
"description": "<p>When the @Lookup[@name] takes damage from an attack, they can teleport up to Far range.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "C74czwNeWF5vS1DZ",
|
||||
"img": "icons/magic/symbols/ring-circle-smoke-blue.webp",
|
||||
|
|
@ -450,7 +454,7 @@
|
|||
"name": "Shackles of Guilt",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><em>Countdown (Loop 2d6)</em>. When the Sorcerer is in the spotlight for the first time, activate the countdown. When it triggers, all targets within Far range become Vulnerable and must mark a Stress as they relive their greatest regrets. A target can break free from their regret with a successful Presence or Strength Roll. When a PC fails to break free, they lose a Hope.</p><p>@Template[type:emanation|range:f]</p>",
|
||||
"description": "<p><em>Countdown (Loop 2d6)</em>. 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.</p><p>@Template[type:emanation|range:f]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"7b0FkpAnWz9a5EWx": {
|
||||
|
|
@ -514,7 +518,7 @@
|
|||
"type": "countdown",
|
||||
"_id": "11PtfoxbgOXxNlkG",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><em>Countdown (Loop 2d6)</em>. When the Sorcerer is in the spotlight for the first time, activate the countdown.</p>",
|
||||
"description": "<p><em>Countdown (Loop 2d6)</em>. When the @Lookup[@name] is in the spotlight for the first time, activate the countdown.</p>",
|
||||
"chatDisplay": true,
|
||||
"originItem": {
|
||||
"type": "itemCollection"
|
||||
|
|
@ -549,7 +553,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "gwSgBhkcekCGvXxz",
|
||||
"img": "icons/magic/unholy/strike-hand-glow-pink.webp",
|
||||
|
|
|
|||
|
|
@ -160,7 +160,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 97,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"prototypeToken": {
|
||||
"name": "Fallen Warlord: Realm Breaker",
|
||||
|
|
@ -261,14 +262,14 @@
|
|||
"name": "Relentless (2)",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>The Realm-Breaker can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"description": "<p>The @Lookup[@name] can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"9IHzeKjP35M5jj3b": {
|
||||
"type": "effect",
|
||||
"_id": "9IHzeKjP35M5jj3b",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>The Realm-Breaker can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "passive",
|
||||
"cost": [
|
||||
|
|
@ -319,14 +320,14 @@
|
|||
"name": "Firespite Plate Armor",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Realm-Breaker takes damage, reduce it by <strong>2d10</strong>.</p>",
|
||||
"description": "<p>When the @Lookup[@name] takes damage, reduce it by <strong>2d10</strong>.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"djEIhnCsuCUdwC0m": {
|
||||
"type": "attack",
|
||||
"_id": "djEIhnCsuCUdwC0m",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When the Realm-Breaker takes damage, reduce it by <strong>2d10</strong>.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -398,7 +399,7 @@
|
|||
"type": "attack",
|
||||
"_id": "zMVhUekP8pcyQGFR",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -476,7 +477,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "PVLjJaQLH3LK3svk",
|
||||
"img": "icons/skills/melee/blood-slash-foam-red.webp",
|
||||
|
|
@ -497,14 +499,14 @@
|
|||
"name": "All-Consuming Rage",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><em>Countdown (Decreasing 8)</em>. When the Realm-Breaker is in the spotlight for the first time, activate the countdown. When it triggers, create a torrent of incarnate rage that rends flesh from bone. All targets within Far range must make a Presence Reaction Roll. Targets who fail take <strong>2d6+10</strong> direct magic damage. Targets who succeed take half damage. For each HP marked from this damage, summon a @UUID[Compendium.daggerheart.adversaries.Actor.OsLG2BjaEdTZUJU9]{Fallen Shock Troop} within Very Close range of the target who marked that HP. If the countdown ever decreases its maximum value to 0, the Realm-Breaker marks their remaining HP and all targets within Far range must mark all remaining HP and make a death move.</p><p>@Template[type:emanation|range:f]</p>",
|
||||
"description": "<p><em>Countdown (Decreasing 8)</em>. 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 <strong>2d6+10</strong> direct magic damage. Targets who succeed take half damage. For each HP marked from this damage, summon a @UUID[Compendium.daggerheart.adversaries.Actor.OsLG2BjaEdTZUJU9]{Fallen Shock Troop} within Very Close range of the target who marked that HP. If the countdown ever decreases its maximum value to 0, the @Lookup[@name] marks their remaining HP and all targets within Far range must mark all remaining HP and make a death move.</p><p>@Template[type:emanation|range:f]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"rgy5wXyXJWh6uWxC": {
|
||||
"type": "attack",
|
||||
"_id": "rgy5wXyXJWh6uWxC",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When it triggers, create a torrent of incarnate rage that rends flesh from bone. All targets within Far range must make a Presence Reaction Roll. Targets who fail take <strong>2d6+10</strong> direct magic damage. Targets who succeed take half damage. For each HP marked from this damage, summon a @UUID[Compendium.daggerheart.adversaries.Actor.OsLG2BjaEdTZUJU9]{Fallen Shock Troop} within Very Close range of the target who marked that HP. If the countdown ever decreases its maximum value to 0, the Realm-Breaker marks their remaining HP and all targets within Far range must mark all remaining HP and make a death move.</p><p>@Template[type:emanation|range:f]</p>",
|
||||
"description": "<p>When it triggers, create a torrent of incarnate rage that rends flesh from bone. All targets within Far range must make a Presence Reaction Roll. Targets who fail take <strong>2d6+10</strong> direct magic damage. Targets who succeed take half damage. For each HP marked from this damage, summon a @UUID[Compendium.daggerheart.adversaries.Actor.OsLG2BjaEdTZUJU9]{Fallen Shock Troop} within Very Close range of the target who marked that HP. If the countdown ever decreases its maximum value to 0, the @Lookup[@name] marks their remaining HP and all targets within Far range must mark all remaining HP and make a death move.</p><p>@Template[type:emanation|range:f]</p>",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -577,7 +579,7 @@
|
|||
"type": "countdown",
|
||||
"_id": "8e3BHmOFLvRwPbTW",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><em>Countdown (Decreasing 8)</em>. When the Realm-Breaker is in the spotlight for the first time, activate the countdown.</p>",
|
||||
"description": "<p><em>Countdown (Decreasing 8)</em>. When the @Lookup[@name] is in the spotlight for the first time, activate the countdown.</p>",
|
||||
"chatDisplay": true,
|
||||
"originItem": {
|
||||
"type": "itemCollection"
|
||||
|
|
@ -612,7 +614,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "48tIwFQr64IQ5LaY",
|
||||
"img": "icons/magic/control/fear-fright-monster-grin-red-orange.webp",
|
||||
|
|
@ -633,14 +636,14 @@
|
|||
"name": "Doombringer",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When a target marks HP from an attack by the Realm-Breaker, all PCs within Far range of the target must lose a Hope.</p><p>@Template[type:emanation|range:f]</p>",
|
||||
"description": "<p>When a target marks HP from an attack by the @Lookup[@name], all PCs within Far range of the target must lose a Hope.</p><p>@Template[type:emanation|range:f]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"WEBPJCbXfBeyHFJ4": {
|
||||
"type": "damage",
|
||||
"_id": "WEBPJCbXfBeyHFJ4",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When a target marks HP from an attack by the Realm-Breaker, all PCs within Far range of the target must lose a Hope.</p><p>@Template[type:emanation|range:f]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -690,7 +693,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "v74W0MUqVi9vPUEw",
|
||||
"img": "icons/magic/death/skull-energy-light-purple.webp",
|
||||
|
|
@ -711,11 +715,12 @@
|
|||
"name": "I Have Never Known Defeat",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>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.</p>",
|
||||
"description": "<p>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.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "RscRTl8U8u6WcwAB",
|
||||
"img": "icons/magic/unholy/silhouette-evil-horned-giant.webp",
|
||||
|
|
|
|||
|
|
@ -161,7 +161,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 98,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"prototypeToken": {
|
||||
"name": "Fallen Warlord: Undefeated Champion",
|
||||
|
|
@ -262,14 +263,14 @@
|
|||
"name": "Relentless (3)",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>The Undefeated Champion can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"description": "<p>The @Lookup[@name] can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"BoDTEH8Y6i9G1d4R": {
|
||||
"type": "effect",
|
||||
"_id": "BoDTEH8Y6i9G1d4R",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>The Undefeated Champion can be spotlighted up to three times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "passive",
|
||||
"cost": [
|
||||
|
|
@ -320,14 +321,14 @@
|
|||
"name": "Faltering Armor",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Undefeated Champion takes damage, reduce it by <strong>1d10</strong>.</p>",
|
||||
"description": "<p>When the @Lookup[@name] takes damage, reduce it by <strong>1d10</strong>.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"REOzNvunSAU3UcEx": {
|
||||
"type": "attack",
|
||||
"_id": "REOzNvunSAU3UcEx",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When the Undefeated Champion takes damage, reduce it by <strong>1d10</strong>.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -392,14 +393,14 @@
|
|||
"name": "Shattering Strike",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Mark a Stress</strong> 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.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"t1GhGnEhNYyJ7p2U": {
|
||||
"type": "attack",
|
||||
"_id": "t1GhGnEhNYyJ7p2U",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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.</p><p>@Template[type:emanation|range:vc]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -470,7 +471,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "t8yOkGWmPgQ6EbIr",
|
||||
"img": "icons/skills/melee/sword-stuck-glowing-pink.webp",
|
||||
|
|
@ -498,7 +500,7 @@
|
|||
"type": "effect",
|
||||
"_id": "hGMzqw00JTlYfHYy",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend a Fear</strong> 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.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -525,7 +527,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "AP7W9ruUCdTHO69S",
|
||||
"img": "icons/magic/death/undead-skeleton-worn-blue.webp",
|
||||
|
|
@ -546,14 +549,14 @@
|
|||
"name": "Circle of Defilement",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><em>Countdown (1d8)</em>. When the Undefeated Champion is in the spotlight for the first time, activate the countdown. When it triggers, activate a magical circle covering an area within Far range of the Champion. A target within that area is Vulnerable until they leave the circle. The circle can be removed by dealing Severe damage to the Undefeated Champion.</p>",
|
||||
"description": "<p><em>Countdown (1d8)</em>. 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].</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"mHeYZ8e8MbkGz22d": {
|
||||
"type": "effect",
|
||||
"_id": "mHeYZ8e8MbkGz22d",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>Activate a magical circle covering an area within Far range of the Champion. A target within that area is Vulnerable until they leave the circle. The circle can be removed by dealing Severe damage to the Undefeated Champion.</p>",
|
||||
"description": "<p>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].</p>",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -580,7 +583,7 @@
|
|||
"type": "countdown",
|
||||
"_id": "4x13WyksHU0u0j20",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><em>Countdown (1d8)</em>. When the Undefeated Champion is in the spotlight for the first time, activate the countdown.</p>",
|
||||
"description": "<p><em>Countdown (1d8)</em>. When the @Lookup[@name] is in the spotlight for the first time, activate the countdown.</p>",
|
||||
"chatDisplay": true,
|
||||
"originItem": {
|
||||
"type": "itemCollection"
|
||||
|
|
@ -615,7 +618,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "55P7ZijSbQeVHCw4",
|
||||
"img": "icons/magic/unholy/barrier-fire-pink.webp",
|
||||
|
|
@ -675,14 +679,14 @@
|
|||
"name": "Momentum",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Undefeated Champion makes a successful attack against a PC, you gain a Fear.</p>",
|
||||
"description": "<p>When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"i1Wmh6Mok4Qsur00": {
|
||||
"type": "healing",
|
||||
"_id": "i1Wmh6Mok4Qsur00",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When the Undefeated Champion makes a successful attack against a PC, you gain a Fear.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "reaction",
|
||||
"cost": [],
|
||||
|
|
@ -749,7 +753,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "ReWtcLE5akrSauI1",
|
||||
"img": "icons/skills/melee/strike-weapons-orange.webp",
|
||||
|
|
@ -770,14 +775,14 @@
|
|||
"name": "Doombringer",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When a target marks HP from an attack by the Undefeated Champion, all PCs within Far range of the target lose a Hope.</p><p>@Template[type:emanation|range:f]</p>",
|
||||
"description": "<p>When a target marks HP from an attack by the @Lookup[@name], all PCs within Far range of the target lose a Hope.</p><p>@Template[type:emanation|range:f]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"liwKSCTmQqZasAf6": {
|
||||
"type": "damage",
|
||||
"_id": "liwKSCTmQqZasAf6",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When a target marks HP from an attack by the Undefeated Champion, all PCs within Far range of the target lose a Hope.</p><p>@Template[type:emanation|range:f]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -827,7 +832,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "tQRotPLi3eokgUdM",
|
||||
"img": "icons/magic/death/skull-energy-light-purple.webp",
|
||||
|
|
|
|||
|
|
@ -117,7 +117,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 87,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "large"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "8VZIgU12cB3cvlyH",
|
||||
|
|
@ -226,7 +227,7 @@
|
|||
"name": "Two as One",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Beastmaster is spotlighted, you can also spotlight a Tier 1 animal adversary currently under their control.</p>",
|
||||
"description": "<p>When the @Lookup[@name] is spotlighted, you can also spotlight a Tier 1 animal adversary currently under their control.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -258,7 +259,7 @@
|
|||
"type": "attack",
|
||||
"_id": "ErwQgU4dwBcmZIBX",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>Make a standard attack against a target. On a success, you can <strong>mark a Stress</strong> to pin them to a nearby surface. The pinned target is <em>Restrained</em> until they break free with a successful Finesse or Strength Roll.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -332,7 +333,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "6ZrDjgnWufJohkp1",
|
||||
"img": "icons/skills/ranged/arrow-flying-broadhead-metal.webp",
|
||||
|
|
@ -392,14 +394,14 @@
|
|||
"name": "Deadly Companion",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>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.</p>",
|
||||
"description": "<p>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.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"eSRUMqpQDPRG9leg": {
|
||||
"type": "effect",
|
||||
"_id": "eSRUMqpQDPRG9leg",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>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.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -420,7 +422,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "w1oHm0NoEavQgUzl",
|
||||
"img": "icons/creatures/mammals/ox-bull-horned-glowing-orange.webp",
|
||||
|
|
|
|||
|
|
@ -117,7 +117,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 87,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "large"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "YnObCleGjPT7yqEc",
|
||||
|
|
@ -226,14 +227,14 @@
|
|||
"name": "Battering Ram",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Mark a Stress</strong> 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 <strong>2d4+3</strong> physical damage from the shrapnel.</p><p>@Template[type:circle|range:vc]</p>",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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 <strong>2d4+3</strong> physical damage from the shrapnel.</p><p>@Template[type:circle|range:vc]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"zns57MqnZ6M1d4r0": {
|
||||
"type": "attack",
|
||||
"_id": "zns57MqnZ6M1d4r0",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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 <strong>2d4+3</strong> physical damage from the shrapnel.</p><p>@Template[type:circle|range:vc]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -311,7 +312,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "ro8AtBdgklyyuydK",
|
||||
"img": "icons/skills/melee/shield-damaged-broken-orange.webp",
|
||||
|
|
@ -332,14 +334,14 @@
|
|||
"name": "Bloody Reprisal",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>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 <strong>2d6+15</strong> physical damage instead of their standard damage.</p>",
|
||||
"description": "<p>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 <strong>2d6+15</strong> physical damage instead of their standard damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"D53yjFXoP5uFXe9M": {
|
||||
"type": "attack",
|
||||
"_id": "D53yjFXoP5uFXe9M",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>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 <strong>2d6+15</strong> physical damage instead of their standard damage.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -410,7 +412,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "kKBbEAffbHxmHo15",
|
||||
"img": "icons/skills/melee/strike-flail-spiked-pink.webp",
|
||||
|
|
@ -431,14 +434,14 @@
|
|||
"name": "Momentum",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Brawler makes a successful attack against a PC, you gain a Fear.</p>",
|
||||
"description": "<p>When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"U2AfyadkJluHXA4r": {
|
||||
"type": "healing",
|
||||
"_id": "U2AfyadkJluHXA4r",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When the Brawler makes a successful attack against a PC you gain a Fear.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "reaction",
|
||||
"cost": [],
|
||||
|
|
@ -505,7 +508,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "B0EniYxyLvjJSqYb",
|
||||
"img": "icons/skills/melee/strike-weapons-orange.webp",
|
||||
|
|
|
|||
|
|
@ -143,7 +143,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 87,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "large"
|
||||
},
|
||||
"flags": {},
|
||||
"ownership": {
|
||||
|
|
@ -251,7 +252,7 @@
|
|||
"name": "Flight",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>While flying, the Eagle gains a +3 bonus to their Difficulty.</p>",
|
||||
"description": "<p>While flying, the @Lookup[@name] gains a +3 bonus to their Difficulty.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -327,7 +328,7 @@
|
|||
"type": "attack",
|
||||
"_id": "KwsxjI3jBzmxgkPu",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> to attack a target within Far range. On a success, deal <strong>2d10+2</strong> physical damage and knock the target over, making them <em>Vulnerable</em> until they next act.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -410,7 +411,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "MabIQE1Kjn60j08J",
|
||||
"img": "icons/skills/melee/strike-slashes-orange.webp",
|
||||
|
|
@ -470,14 +472,14 @@
|
|||
"name": "Take Off",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>Make an attack against a target within Very Close range. On a success, deal <strong>2d4+3</strong> 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. </p>",
|
||||
"description": "<p>Make an attack against a target within Very Close range. On a success, deal <strong>2d4+3</strong> 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.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"NtgA9EQPF2Rdb9KK": {
|
||||
"type": "attack",
|
||||
"_id": "NtgA9EQPF2Rdb9KK",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>Make an attack against a target within Very Close range. On a success, deal <strong>2d4+3</strong> 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.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -553,7 +555,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "NEOQ0E9AGSSIDm4v",
|
||||
"img": "icons/skills/movement/arrow-upward-yellow.webp",
|
||||
|
|
@ -613,14 +616,14 @@
|
|||
"name": "Deadly Drop",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>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 <strong>2d20</strong> physical damage when they land.</p>",
|
||||
"description": "<p>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 <strong>2d20</strong> physical damage when they land.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"1tO018UgL0VG51ti": {
|
||||
"type": "damage",
|
||||
"_id": "1tO018UgL0VG51ti",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>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 <strong>2d20</strong> physical damage when they land.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -671,7 +674,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "jY0ynjYvbS6E3NgJ",
|
||||
"img": "icons/skills/movement/arrow-down-pink.webp",
|
||||
|
|
|
|||
|
|
@ -117,7 +117,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 76,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "IIWV4ysJPFPnTP7W",
|
||||
|
|
@ -228,7 +229,7 @@
|
|||
"_id": "9RduwBLYcBaiouYk",
|
||||
"img": "icons/creatures/magical/humanoid-silhouette-aliens-green.webp",
|
||||
"system": {
|
||||
"description": "<p>When the Mosquitoes have marked half or more of their HP, their standard attack deals <strong>1d4+1</strong> physical damage instead.</p>",
|
||||
"description": "<p>When the @Lookup[@name] have marked half or more of their HP, their standard attack deals <strong>1d4+1</strong> physical damage instead.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -254,7 +255,7 @@
|
|||
"_id": "gxYV6iTMM1S9Vv5v",
|
||||
"img": "icons/commodities/biological/wing-insect-green.webp",
|
||||
"system": {
|
||||
"description": "<p>While flying, the Mosquitoes have a +2 bonus to their Difficulty.</p>",
|
||||
"description": "<p>While flying, the @Lookup[@name] have a +2 bonus to their Difficulty.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -324,14 +325,14 @@
|
|||
"_id": "BTlMLjG65KQs0Jk2",
|
||||
"img": "icons/skills/wounds/blood-drip-droplet-red.webp",
|
||||
"system": {
|
||||
"description": "<p>When the Mosquitoes’ attack causes a target to mark HP, you can <strong>mark a Stress</strong> to force the target to mark an additional HP.</p>",
|
||||
"description": "<p>When the @Lookup[@name]’s attack causes a target to mark HP, you can <strong>mark a Stress</strong> to force the target to mark an additional HP.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"7ee6IhkKYDehjLmg": {
|
||||
"type": "effect",
|
||||
"_id": "7ee6IhkKYDehjLmg",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When the Mosquitoes’ attack causes a target to mark HP, you can <strong>mark a Stress</strong> to force the target to mark an additional HP.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -359,7 +360,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
|
|
|
|||
|
|
@ -110,7 +110,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 76,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "small"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "4PfLnaCrOcMdb4dK",
|
||||
|
|
@ -221,7 +222,7 @@
|
|||
"_id": "v3AcLcWrXy2rtW4Z",
|
||||
"img": "icons/magic/symbols/runes-carved-stone-yellow.webp",
|
||||
"system": {
|
||||
"description": "<p>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.</p>",
|
||||
"description": "<p>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.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -247,14 +248,14 @@
|
|||
"_id": "fsaBlCjTdq1jM23G",
|
||||
"img": "icons/creatures/abilities/tail-strike-bone-orange.webp",
|
||||
"system": {
|
||||
"description": "<p><strong>Spend a Fear</strong> 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.</p>",
|
||||
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 1 physical damage each. Combine this damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"q8chow47nQLR9qeF": {
|
||||
"type": "attack",
|
||||
"_id": "q8chow47nQLR9qeF",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend a Fear</strong> 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.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -306,7 +307,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
|
|
|
|||
|
|
@ -104,7 +104,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 87,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "large"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "5s8wSvpyC5rxY5aD",
|
||||
|
|
@ -213,7 +214,7 @@
|
|||
"name": "Minion (7)",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>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.</p>",
|
||||
"description": "<p>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.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -238,14 +239,14 @@
|
|||
"name": "Group Attack",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Spend a Fear</strong> 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.</p>",
|
||||
"description": "<p><strong>Spend a Fear</strong> to choose a target and spotlight all @Lookup[@name]s within Close range of them. Those Minions move into Melee range of the target and make one shared attack roll. On a success, they deal 5 physical damage each. Combine this damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"DjbPQowW1OdBD9Zn": {
|
||||
"type": "effect",
|
||||
"_id": "DjbPQowW1OdBD9Zn",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend a Fear</strong> 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.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -274,7 +275,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "FMgB28X1LammRInU",
|
||||
"img": "icons/creatures/abilities/tail-strike-bone-orange.webp",
|
||||
|
|
|
|||
|
|
@ -117,7 +117,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 76,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "fmfntuJ8mHRCAktP",
|
||||
|
|
@ -235,7 +236,7 @@
|
|||
"type": "attack",
|
||||
"_id": "PJbZ4ibLPle9BBRv",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> to make a standard attack against two targets within Melee range.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -314,7 +315,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
|
|
@ -342,7 +344,7 @@
|
|||
"type": "attack",
|
||||
"_id": "ZkcplnqoMP7dH9F4",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>Make an attack against a target within Very Close range. On a success, <strong>spend a Fear</strong> to deal <strong>1d4+4</strong> physical damage and Poison them until their next rest or they succeed on a Knowledge Roll (16). While Poisoned, the target must roll a <strong>d6</strong> before they make an action roll. On a result of 4 or lower, they must mark a Stress.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -419,7 +421,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"effects": [
|
||||
{
|
||||
|
|
@ -477,7 +480,7 @@
|
|||
"_id": "TmDpAY5t3PjhEv9K",
|
||||
"img": "icons/skills/melee/strike-weapons-orange.webp",
|
||||
"system": {
|
||||
"description": "<p>When the Scorpion makes a successful attack against a PC, you gain a Fear.</p>",
|
||||
"description": "<p>When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"1Fn4rvhueQoMXqFc": {
|
||||
|
|
@ -552,7 +555,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
|
|
|
|||
|
|
@ -111,7 +111,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 77,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "large"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "8KWVLWXFhlY2kYx0",
|
||||
|
|
@ -222,14 +223,14 @@
|
|||
"_id": "Efa6t9Ow8b1DRyZV",
|
||||
"img": "icons/skills/melee/shield-damaged-broken-gold.webp",
|
||||
"system": {
|
||||
"description": "<p>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.</p>",
|
||||
"description": "<p>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.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"H1nUSOudbtha1lnC": {
|
||||
"type": "damage",
|
||||
"_id": "H1nUSOudbtha1lnC",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>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.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -301,14 +302,14 @@
|
|||
"_id": "Ro9XCeXsTOT9SXyo",
|
||||
"img": "icons/skills/melee/blood-slash-foam-red.webp",
|
||||
"system": {
|
||||
"description": "<p><strong>Mark a Stress</strong> to make an attack against all targets within Very Close range. Targets the Snake succeeds against take <strong>1d6+1</strong> physical damage.</p>",
|
||||
"description": "<p><strong>Mark a Stress</strong> to make an attack against all targets within Very Close range. Targets the @Lookup[@name] succeeds against take <strong>1d6+1</strong> physical damage.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"2UzeQYL5HeyF3zwh": {
|
||||
"type": "attack",
|
||||
"_id": "2UzeQYL5HeyF3zwh",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> to make an attack against all targets within Very Close range. Targets the Snake succeeds against take <strong>1d6+1</strong> physical damage.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -385,7 +386,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
|
|
@ -406,7 +408,7 @@
|
|||
"_id": "LR5XHauNtWcl18CY",
|
||||
"img": "icons/magic/acid/projectile-needles-salvo-green.webp",
|
||||
"system": {
|
||||
"description": "<p><strong>Spend a Fear</strong> to introduce a <strong>d6</strong> 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 <strong>1d4</strong> physical damage. The Snake can take the spotlight a second time this GM turn.</p><p>@Template[type:inFront|range:f]</p>",
|
||||
"description": "<p><strong>Spend a Fear</strong> to introduce a <strong>d6</strong> 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 <strong>1d4</strong> physical damage. The @Lookup[@name] can take the spotlight a second time this GM turn.</p><p>@Template[type:inFront|range:f]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"yx5fjMLLwSnvSbqs": {
|
||||
|
|
@ -447,7 +449,7 @@
|
|||
"type": "attack",
|
||||
"_id": "Ds6KlQKZCOhh5OMT",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>All targets in front of the Snake within Far range must succeed on an Agility Reaction Roll or take <strong>1d4</strong> physical damage.</p><p>@Template[type:inFront|range:f]</p>",
|
||||
"description": "<p>All targets in front of the @Lookup[@name] within Far range must succeed on an Agility Reaction Roll or take <strong>1d4</strong> physical damage.</p><p>@Template[type:inFront|range:f]</p>",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -520,7 +522,7 @@
|
|||
"type": "attack",
|
||||
"_id": "xccwknU2xHUwQSdn",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When the Snake is in the spotlight, roll the spitter die. On a result of 5 or higher, do a spit Attack.</p>",
|
||||
"description": "<p>When the @Lookup[@name] is in the spotlight, roll the spitter die. On a result of 5 or higher, do a spit Attack.</p>",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -565,7 +567,8 @@
|
|||
},
|
||||
"originItemType": null,
|
||||
"subType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"effects": [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -117,7 +117,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 88,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "medium"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "8mJYMpbLTb8qIOrr",
|
||||
|
|
@ -226,14 +227,14 @@
|
|||
"name": "Relentless (2)",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>The Gorgon can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"description": "<p>The @Lookup[@name] can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"GSYD7y0ywAqyKUfm": {
|
||||
"type": "effect",
|
||||
"_id": "GSYD7y0ywAqyKUfm",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>The Gorgon can be spotlighted up to two times per GM turn. Spend Fear as usual to spotlight them.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "passive",
|
||||
"cost": [
|
||||
|
|
@ -284,14 +285,14 @@
|
|||
"name": "Sunsear Arrows",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Gorgon makes a successful standard attack, the target Glows until the end of the scene and can’t become <em>Hidden</em>. Attack rolls made against a Glowing target have advantage.</p>",
|
||||
"description": "<p>When the @Lookup[@name] makes a successful standard attack, the target Glows until the end of the scene and can’t become <em>Hidden</em>. Attack rolls made against a Glowing target have advantage.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"fnTd5BjBAK46vRRk": {
|
||||
"type": "effect",
|
||||
"_id": "fnTd5BjBAK46vRRk",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When the Gorgon makes a successful standard attack, the target Glows until the end of the scene and can’t become <em>Hidden</em>. Attack rolls made against a Glowing target have advantage.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -381,14 +382,14 @@
|
|||
"name": "Crown of Serpents",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>Make an attack roll against a target within Melee range using the Gorgon’s protective snakes. On a success, mark a Stress to deal <strong>2d10+4</strong> physical damage and the target must mark a Stress.</p>",
|
||||
"description": "<p>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 <strong>2d10+4</strong> physical damage and the target must mark a Stress.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"ryfj8eiYYNGJPtBg": {
|
||||
"type": "attack",
|
||||
"_id": "ryfj8eiYYNGJPtBg",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>Make an attack roll against a target within Melee range using the Gorgon’s protective snakes. On a success, mark a Stress to deal <strong>2d10+4</strong> physical damage and the target must mark a Stress.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -484,7 +485,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "9SO2ov36lFH2YV0S",
|
||||
"img": "icons/creatures/reptiles/snake-fangs-bite-green.webp",
|
||||
|
|
@ -505,14 +507,14 @@
|
|||
"name": "Petrifying Gaze",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Gorgon takes damage from an attack within Close range, you can <strong>spend a Fear</strong> 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.</p>",
|
||||
"description": "<p>When the @Lookup[@name] takes damage from an attack within Close range, you can <strong>spend a Fear</strong> 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.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"ySkX0wOpEFqtgeD9": {
|
||||
"type": "attack",
|
||||
"_id": "ySkX0wOpEFqtgeD9",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When the Gorgon takes damage from an attack within Close range, you can <strong>spend a Fear</strong> 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.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -565,7 +567,7 @@
|
|||
"type": "countdown",
|
||||
"_id": "ywZTs3D8ClT7tAsa",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>On a failure, they begin to turn to stone, marking a HP and starting a Petrification Countdown (4). This countdown ticks down when the Gorgon is attacked. When it triggers, the target must make a death move. If the Gorgon is defeated, all petrification countdowns end.</p>",
|
||||
"description": "<p>On a failure, they begin to turn to stone, marking a HP and starting a Petrification Countdown (4). This countdown ticks down when the @Lookup[@name] is attacked. When it triggers, the target must make a death move. If the @Lookup[@name] is defeated, all petrification countdowns end.</p>",
|
||||
"chatDisplay": false,
|
||||
"originItem": {
|
||||
"type": "itemCollection"
|
||||
|
|
@ -600,7 +602,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "047o6OtNlUwLG1H1",
|
||||
"img": "icons/magic/earth/strike-body-stone-crumble.webp",
|
||||
|
|
@ -621,14 +624,14 @@
|
|||
"name": "Momentum",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Gorgon makes a successful attack against a PC, you gain a Fear.</p>",
|
||||
"description": "<p>When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"V6tkBYSjOt1LZCkp": {
|
||||
"type": "healing",
|
||||
"_id": "V6tkBYSjOt1LZCkp",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When the Gorgon makes a successful attack against a PC, you gain a Fear.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "reaction",
|
||||
"cost": [],
|
||||
|
|
@ -695,7 +698,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "IRIaFxFughjXVu0Y",
|
||||
"img": "icons/skills/melee/strike-weapons-orange.webp",
|
||||
|
|
|
|||
|
|
@ -111,7 +111,8 @@
|
|||
"source": "Daggerheart SRD",
|
||||
"page": 93,
|
||||
"artist": ""
|
||||
}
|
||||
},
|
||||
"size": "gargantuan"
|
||||
},
|
||||
"flags": {},
|
||||
"_id": "dsfB3YhoL5SudvS2",
|
||||
|
|
@ -220,7 +221,7 @@
|
|||
"name": "Slow",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>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.</p>",
|
||||
"description": "<p>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.</p>",
|
||||
"resource": {
|
||||
"type": "simple",
|
||||
"value": 0,
|
||||
|
|
@ -250,14 +251,14 @@
|
|||
"name": "Crushing Blows",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>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.</p>",
|
||||
"description": "<p>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.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"0sXciTiPc30v8czv": {
|
||||
"type": "damage",
|
||||
"_id": "0sXciTiPc30v8czv",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>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.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -328,7 +329,7 @@
|
|||
"name": "Immovable Object",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>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.</p>",
|
||||
"description": "<p>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.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
|
|
@ -397,14 +398,14 @@
|
|||
"name": "Rockslide",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p><strong>Mark a Stress</strong> 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 <strong>2d12+5</strong> physical damage and become Vulnerable until their next roll with Hope. Targets who succeed take half damage.</p><p>@Template[type:inFront|range:c]</p>",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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 <strong>2d12+5</strong> physical damage and become Vulnerable until their next roll with Hope. Targets who succeed take half damage.</p><p>@Template[type:inFront|range:c]</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"eLGIC3kVjLo8FEvy": {
|
||||
"type": "attack",
|
||||
"_id": "eLGIC3kVjLo8FEvy",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Mark a Stress</strong> 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 <strong>2d12+5</strong> physical damage and become Vulnerable until their next roll with Hope. Targets who succeed take half damage.</p><p>@Template[type:inFront|range:c]</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
|
|
@ -487,7 +488,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "action"
|
||||
},
|
||||
"_id": "q45DiEFlXqcXZ5hv",
|
||||
"img": "icons/magic/earth/barrier-stone-brown-green.webp",
|
||||
|
|
@ -547,14 +549,14 @@
|
|||
"name": "Momentum",
|
||||
"type": "feature",
|
||||
"system": {
|
||||
"description": "<p>When the Elemental makes a successful attack against a PC, you gain a Fear.</p>",
|
||||
"description": "<p>When the @Lookup[@name] makes a successful attack against a PC, you gain a Fear.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"FPIpslusIeVQGdnb": {
|
||||
"type": "healing",
|
||||
"_id": "FPIpslusIeVQGdnb",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When the Elemental makes a successful attack against a PC, you gain a Fear.</p>",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "reaction",
|
||||
"cost": [],
|
||||
|
|
@ -621,7 +623,8 @@
|
|||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
"originId": null,
|
||||
"featureForm": "reaction"
|
||||
},
|
||||
"_id": "ag7t5EW358M0qiSL",
|
||||
"img": "icons/skills/melee/strike-weapons-orange.webp",
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue