Merge branch 'development' into feature/628-allow-override-range-measurement-settings

This commit is contained in:
Chris Ryan 2025-08-18 14:31:24 +10:00
commit fcf35ac17e
1080 changed files with 9771 additions and 4326 deletions

2
.env.example Normal file
View file

@ -0,0 +1,2 @@
FOUNDRY_MAIN_PATH=/path/to/foundry/resources/app/main.js
FOUNDRY_DATA_PATH=/path/to/foundry/data

View file

@ -1,10 +1,10 @@
---
name: Bug report
about: Create a report to help us improve
title: "[BUG] - "
about: Create a bug report to help us identify issues and resolve them
title: "[Bug] <Insert Title here> "
labels: bug
type: bug
assignees: ''
---
**Describe the bug**
@ -24,11 +24,11 @@ A clear and concise description of what you expected to happen.
If applicable, add screenshots to help explain your problem.
**Setup Information:**
- OS: [e.g. iOS]
- OS: [e.g. iOS, Windows]
- Browser [e.g. chrome, safari]
- Foundry Version [e.g. v13 b342]
- System Version [e.g. main-3593f44]
- System Version [e.g. v.1.0, v.1.0.1]
**Additional context**
Add any other context about the problem here.
Add any other context about the problem here.

View file

@ -0,0 +1,14 @@
---
name: Feature report
about: Create a feature report for suggestions on improving the system
title: "[Feature] <Insert Title here> "
labels: enhancement, discussion, maybe
type: feature
assignees: ''
---
**Description**
A clear and concise description of what feature needs to be implemented.
**Screenshots**
If applicable, add screenshots to help explain the feature that needs to be implemented.

9
.github/ISSUE_TEMPLATE/typo_report.md vendored Normal file
View file

@ -0,0 +1,9 @@
---
name: Typo report
about: Create a new issue to report a compendium typo
title: "[TYPO] - "
labels: compendium, typo
type: bug
assignees: ''
---

View file

@ -0,0 +1,55 @@
---
name: Pull Request
about: Create a new pull request
title: "[Community PR] <Insert Title here>"
labels: community pr
assignees: ''
---
## Description
Please include a summary of the change and which issue is fixed (if applicable). Also include relevant context or motivation for the change.
- Fixes #(issue)
- Closes #(issue)
## Type of Change
Please check the relevant options:
- [ ] Bug fix
- [ ] New feature
- [ ] Code cleanup/refactor
- [ ] Documentation update
- [ ] Test coverage
- [ ] Dependency update
- [ ] Configuration change
- [ ] Other (please describe):
## How Has This Been Tested?
Please describe the tests you ran to verify your changes:
- [ ] Manual testing
- [ ] Other:
## Screenshots (if applicable)
Include screenshots or GIFs to help explain your changes visually.
## Checklist
- [ ] My code follows the project style guidelines
- [ ] I have performed a self-review of my code
- [ ] I have commented my code where necessary
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings or errors
- [ ] I have added tests that prove my fix or feature works
- [ ] New and existing tests pass locally with my changes
## Additional Comments
Add any other context or questions here.
---
> Thank you for your contribution! 🎉

1
.gitignore vendored
View file

@ -1,4 +1,5 @@
.vscode
.env
node_modules
/packs
Build

View file

@ -24,24 +24,41 @@ You can find the documentation here: https://github.com/Foundryborne/daggerheart
## Development Setup
- Open a terminal in the directory with the repo `cd <path>/<to>/<repo>`
- NOTE: The repo should be placed in the system files are or somewhere else and a link (if on linux) is placed in the system directory
- NOTE: Linux link can be made using `ln -snf <path to development folder> daggerheart` inside the system folder
- Install npm `npm install`
- Update package.json to match your profile
1. **Navigate to the repo directory:**
```
"start": "concurrently \"rollup -c --watch\" \"node C:/FoundryDev/resources/app/main.js --dataPath=C:/FoundryDevFiles --noupnp\" \"gulp\"",
"start-test": "node C:/FoundryDev/resources/app/main.js --dataPath=C:/FoundryDevFiles && rollup -c --watch && gulp",
```bash
cd <path>/<to>/<repo>
```
```
2. **Install dependencies:**
- Replace `C:/FoundryDev/resources/app/main.js` with `<your>/<path>/<to>/<foundry>/<main.js>`
- The main is likely in `<Foundry Install Location>/resouces/app/main.js`
- Replace `--dataPath=C:/FoundryDevFiles` with `<your>/<path>/<to>/<foundry>/<data>`
```bash
npm install
```
Now you should be able to build the app using `npm start`
[Foundry VTT Website][1]
3. **Configure your Foundry paths:**
```bash
npm run setup:dev -- --foundry-path="/path/to/foundry/main.js" --data-path="/path/to/data"
```
4. **Start developing:**
```bash
npm start
```
### Available Scripts
- `npm start` - Start development with file watching and Foundry launching
- `npm run build` - One-time build
- `npm run setup:dev -- --foundry-path="<path>" --data-path="<path>"` - Configure development environment
### Notes
- The repo should be placed in your Foundry `Data/systems/` directory or symlinked there
- Linux symlink can be made using `ln -snf <path to development folder> daggerheart` inside the systems folder
- Your `.env` file is ignored by git, so each developer can have their own configuration
[Foundry VTT Website][1]
[1]: https://foundryvtt.com/

View file

@ -193,7 +193,8 @@
"companionLevelup": {
"confirmTitle": "Companion Levelup",
"confirmText": "Would you like to level up your companion {name} by {levelChange} levels at this time? (You can do it manually later)"
}
},
"viewLevelups": "View Levelups"
},
"Companion": {
"FIELDS": {
@ -236,6 +237,9 @@
}
},
"APPLICATIONS": {
"Attribution": {
"title": "Attribution"
},
"CharacterCreation": {
"tabs": {
"ancestry": "Ancestry",
@ -490,7 +494,8 @@
"pretext": "When you level up, record it on your character sheet, then choose two from the list below or any unmarked from the previous tier.",
"posttext": "Take an additional domain card of your level or lower from a domain you have access to."
},
"title": "{actor} Level Up"
"title": "{actor} Level Up",
"viewModeTitle": "{actor} Level Up (View Mode)"
},
"MulticlassChoice": {
"title": "Multiclassing - {actor}",
@ -1905,6 +1910,7 @@
"armorScore": "Armor Score",
"activeEffects": "Active Effects",
"armorSlots": "Armor Slots",
"artistAttribution": "Artwork By: {artist}",
"attack": "Attack",
"basics": "Basics",
"bonus": "Bonus",
@ -1995,7 +2001,7 @@
"true": "True",
"type": "Type",
"unarmed": "Unarmed",
"unarmedStrike": "Unarmed Strike",
"unarmedAttack": "Unarmed Attack",
"unarmored": "Unarmored",
"use": "Use",
"used": "Used",
@ -2005,6 +2011,11 @@
},
"ITEMS": {
"FIELDS": {
"attribution": {
"source": { "label": "Source" },
"page": { "label": "Page" },
"artist": { "label": "Artist" }
},
"resource": {
"amount": { "label": "Amount" },
"dieFaces": { "label": "Die Faces" },
@ -2102,12 +2113,18 @@
"FIELDS": {
"displayFear": { "label": "Fear Display" },
"dualityColorScheme": { "label": "Chat Style" },
"showGenericStatusEffects": { "label": "Show Foundry Status Effects" },
"hideAttribution": { "label": "Hide Attribution" },
"expandedTitle": "Auto-expand Descriptions",
"extendCharacterDescriptions": { "label": "Characters" },
"extendAdversaryDescriptions": { "label": "Adversaries" },
"extendEnvironmentDescriptions": { "label": "Environments" },
"extendItemDescriptions": { "label": "Items" }
"extendItemDescriptions": { "label": "Items" },
"expandRollMessage": "Auto-expand Message Sections",
"expandRollMessageDesc": { "label": "Description" },
"expandRollMessageRoll": { "label": "Formula" },
"expandRollMessageDamage": { "label": "Damage/Healing" },
"expandRollMessageTarget": { "label": "Target" },
"showGenericStatusEffects": { "label": "Show Foundry Status Effects" }
},
"fearDisplay": {
"token": "Tokens",
@ -2406,7 +2423,8 @@
"rulesOff": "Rules Off",
"remainingUses": "Uses refresh on {type}",
"rightClickExtand": "Right-Click to extand",
"companionPartnerLevelBlock": "The companion needs an assigned partner to level up."
"companionPartnerLevelBlock": "The companion needs an assigned partner to level up.",
"configureAttribution": "Configure Attribution"
}
}
}

View file

@ -1,3 +1,4 @@
export { default as AttributionDialog } from './attributionDialog.mjs';
export { default as BeastformDialog } from './beastformDialog.mjs';
export { default as d20RollDialog } from './d20RollDialog.mjs';
export { default as DamageDialog } from './damageDialog.mjs';

View file

@ -0,0 +1,93 @@
import autocomplete from 'autocompleter';
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
export default class AttriubtionDialog extends HandlebarsApplicationMixin(ApplicationV2) {
constructor(item) {
super({});
this.item = item;
this.sources = Object.keys(CONFIG.DH.GENERAL.attributionSources).flatMap(groupKey => {
const group = CONFIG.DH.GENERAL.attributionSources[groupKey];
return group.values.map(x => ({ group: group.label, ...x }));
});
}
get title() {
return game.i18n.localize('DAGGERHEART.APPLICATIONS.Attribution.title');
}
static DEFAULT_OPTIONS = {
tag: 'form',
classes: ['daggerheart', 'dh-style', 'dialog', 'views', 'attribution'],
position: { width: 'auto', height: 'auto' },
window: { icon: 'fa-solid fa-signature' },
form: { handler: this.updateData, submitOnChange: false, closeOnSubmit: true }
};
static PARTS = {
main: { template: 'systems/daggerheart/templates/dialogs/attribution.hbs' }
};
_attachPartListeners(partId, htmlElement, options) {
super._attachPartListeners(partId, htmlElement, options);
const sources = this.sources;
htmlElement.querySelectorAll('.attribution-input').forEach(element => {
autocomplete({
input: element,
fetch: function (text, update) {
if (!text) {
update(sources);
} else {
text = text.toLowerCase();
var suggestions = sources.filter(n => n.label.toLowerCase().includes(text));
update(suggestions);
}
},
render: function (item, search) {
const label = game.i18n.localize(item.label);
const matchIndex = label.toLowerCase().indexOf(search);
const beforeText = label.slice(0, matchIndex);
const matchText = label.slice(matchIndex, matchIndex + search.length);
const after = label.slice(matchIndex + search.length, label.length);
const element = document.createElement('li');
element.innerHTML = `${beforeText}${matchText ? `<strong>${matchText}</strong>` : ''}${after}`;
if (item.hint) {
element.dataset.tooltip = game.i18n.localize(item.hint);
}
return element;
},
renderGroup: function (label) {
const itemElement = document.createElement('div');
itemElement.textContent = game.i18n.localize(label);
return itemElement;
},
onSelect: function (item) {
element.value = item.label;
},
click: e => e.fetch(),
customize: function (_input, _inputRect, container) {
container.style.zIndex = foundry.applications.api.ApplicationV2._maxZ;
},
minLength: 0
});
});
}
async _prepareContext(_options) {
const context = await super._prepareContext(_options);
context.item = this.item;
context.data = this.item.system.attribution;
return context;
}
static async updateData(_event, _element, formData) {
await this.item.update({ 'system.attribution': formData.object });
this.item.sheet.refreshFrame();
}
}

View file

@ -1,3 +1,4 @@
export { default as CharacterLevelup } from './characterLevelup.mjs';
export { default as CompanionLevelup } from './companionLevelup.mjs';
export { default as Levelup } from './levelup.mjs';
export { default as LevelupViewMode } from './levelupViewMode.mjs';

View file

@ -0,0 +1,95 @@
import { chunkify } from '../../helpers/utils.mjs';
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
export default class DhlevelUpViewMode extends HandlebarsApplicationMixin(ApplicationV2) {
constructor(actor) {
super({});
this.actor = actor;
}
get title() {
return game.i18n.format('DAGGERHEART.APPLICATIONS.Levelup.viewModeTitle', { actor: this.actor.name });
}
static DEFAULT_OPTIONS = {
classes: ['daggerheart', 'dialog', 'dh-style', 'levelup'],
position: { width: 1000, height: 'auto' },
window: {
resizable: true,
icon: 'fa-solid fa-arrow-turn-up'
}
};
static PARTS = {
main: { template: 'systems/daggerheart/templates/levelup/tabs/viewMode.hbs' }
};
async _prepareContext(_options) {
const context = await super._prepareContext(_options);
const { tiers } = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.LevelTiers);
const tierKeys = Object.keys(tiers);
const selections = Object.keys(this.actor.system.levelData.levelups).reduce(
(acc, key) => {
const level = this.actor.system.levelData.levelups[key];
Object.keys(level.selections).forEach(optionKey => {
const choice = level.selections[optionKey];
if (!acc[choice.tier][choice.optionKey]) acc[choice.tier][choice.optionKey] = {};
acc[choice.tier][choice.optionKey][choice.checkboxNr] = choice;
});
return acc;
},
tierKeys.reduce((acc, key) => {
acc[key] = {};
return acc;
}, {})
);
context.tiers = tierKeys.map((tierKey, tierIndex) => {
const tier = tiers[tierKey];
return {
name: tier.name,
active: true,
groups: Object.keys(tier.options).map(optionKey => {
const option = tier.options[optionKey];
const checkboxes = [...Array(option.checkboxSelections).keys()].flatMap(index => {
const checkboxNr = index + 1;
const checkboxData = selections[tierKey]?.[optionKey]?.[checkboxNr];
const checkbox = { ...option, checkboxNr, tier: tierKey, disabled: true };
if (checkboxData) {
checkbox.level = checkboxData.level;
checkbox.selected = true;
}
return checkbox;
});
let label = game.i18n.localize(option.label);
return {
label: label,
checkboxGroups: chunkify(checkboxes, option.minCost, chunkedBoxes => {
const anySelected = chunkedBoxes.some(x => x.selected);
const anyDisabled = chunkedBoxes.some(x => x.disabled);
return {
multi: option.minCost > 1,
checkboxes: chunkedBoxes.map(x => ({
...x,
selected: anySelected,
disabled: anyDisabled
}))
};
})
};
})
};
});
return context;
}
}

View file

@ -4,6 +4,7 @@ import DHBaseActorSheet from '../api/base-actor.mjs';
/**@typedef {import('@client/applications/_types.mjs').ApplicationClickAction} ApplicationClickAction */
export default class AdversarySheet extends DHBaseActorSheet {
/** @inheritDoc */
static DEFAULT_OPTIONS = {
classes: ['adversary'],
position: { width: 660, height: 766 },
@ -12,7 +13,14 @@ export default class AdversarySheet extends DHBaseActorSheet {
reactionRoll: AdversarySheet.#reactionRoll
},
window: {
resizable: true
resizable: true,
controls: [
{
icon: 'fa-solid fa-signature',
label: 'DAGGERHEART.UI.Tooltip.configureAttribution',
action: 'editAttribution'
}
]
}
};

View file

@ -1,7 +1,7 @@
import DHBaseActorSheet from '../api/base-actor.mjs';
import DhpDeathMove from '../../dialogs/deathMove.mjs';
import { abilities } from '../../../config/actorConfig.mjs';
import DhCharacterlevelUp from '../../levelup/characterLevelup.mjs';
import { CharacterLevelup, LevelupViewMode } from '../../levelup/_module.mjs';
import DhCharacterCreation from '../../characterCreation/characterCreation.mjs';
import FilterMenu from '../../ux/filter-menu.mjs';
import { getDocFromElement, getDocFromElementSync } from '../../../helpers/utils.mjs';
@ -23,6 +23,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
openPack: CharacterSheet.#openPack,
makeDeathMove: CharacterSheet.#makeDeathMove,
levelManagement: CharacterSheet.#levelManagement,
viewLevelups: CharacterSheet.#viewLevelups,
toggleEquipItem: CharacterSheet.#toggleEquipItem,
toggleResourceDice: CharacterSheet.#toggleResourceDice,
handleResourceDice: CharacterSheet.#handleResourceDice,
@ -30,7 +31,14 @@ export default class CharacterSheet extends DHBaseActorSheet {
tempBrowser: CharacterSheet.#tempBrowser
},
window: {
resizable: true
resizable: true,
controls: [
{
icon: 'fa-solid fa-angles-up',
label: 'DAGGERHEART.ACTORS.Character.viewLevelups',
action: 'viewLevelups'
}
]
},
dragDrop: [
{
@ -585,7 +593,14 @@ export default class CharacterSheet extends DHBaseActorSheet {
if (!value || !subclass)
return ui.notifications.error(game.i18n.localize('DAGGERHEART.UI.Notifications.missingClassOrSubclass'));
new DhCharacterlevelUp(this.document).render({ force: true });
new CharacterLevelup(this.document).render({ force: true });
}
/**
* Opens the charater level management window in viewMode.
*/
static #viewLevelups() {
new LevelupViewMode(this.document).render({ force: true });
}
/**
@ -638,7 +653,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
ability: abilityLabel
})
});
this.consumeResource(result?.costs);
}

View file

@ -8,10 +8,17 @@ export default class DhpEnvironment extends DHBaseActorSheet {
classes: ['environment'],
position: {
width: 500,
height: 725
height: 740
},
window: {
resizable: true
resizable: true,
controls: [
{
icon: 'fa-solid fa-signature',
label: 'DAGGERHEART.UI.Tooltip.configureAttribution',
action: 'editAttribution'
}
]
},
actions: {},
dragDrop: [{ dragSelector: '.action-section .inventory-item', dropSelector: null }]
@ -42,6 +49,7 @@ export default class DhpEnvironment extends DHBaseActorSheet {
switch (partId) {
case 'header':
await this._prepareHeaderContext(context, options);
break;
case 'notes':
await this._prepareNotesContext(context, options);

View file

@ -44,9 +44,8 @@ export default class DHBaseActorSettings extends DHApplicationMixin(DocumentShee
const context = await super._prepareContext(options);
context.isNPC = this.actor.isNPC;
if (context.systemFields.attack) {
if (context.systemFields.attack)
context.systemFields.attack.fields = this.actor.system.attack.schema.fields;
}
return context;
}

View file

@ -85,6 +85,8 @@ export default function DHApplicationMixin(Base) {
this._dragDrop = this._createDragDropHandlers();
}
#nonHeaderAttribution = ['environment', 'ancestry', 'community', 'domainCard'];
/**
* The default options for the sheet.
* @type {DHSheetV2Configuration}
@ -101,7 +103,8 @@ export default function DHApplicationMixin(Base) {
toggleEffect: DHSheetV2.#toggleEffect,
toggleExtended: DHSheetV2.#toggleExtended,
addNewItem: DHSheetV2.#addNewItem,
browseItem: DHSheetV2.#browseItem
browseItem: DHSheetV2.#browseItem,
editAttribution: DHSheetV2.#editAttribution
},
contextMenus: [
{
@ -125,6 +128,43 @@ export default function DHApplicationMixin(Base) {
tagifyConfigs: []
};
/**@inheritdoc */
async _renderFrame(options) {
const frame = await super._renderFrame(options);
const hideAttribution = game.settings.get(
CONFIG.DH.id,
CONFIG.DH.SETTINGS.gameSettings.appearance
).hideAttribution;
const headerAttribution = !this.#nonHeaderAttribution.includes(this.document.type);
if (!hideAttribution && this.document.system.metadata.hasAttribution && headerAttribution) {
const { source, page } = this.document.system.attribution;
const attribution = [source, page ? `pg ${page}.` : null].filter(x => x).join('. ');
const element = `<label class="attribution-header-label">${attribution}</label>`;
this.window.controls.insertAdjacentHTML('beforebegin', element);
}
return frame;
}
/**
* Refresh the custom parts of the application frame
*/
refreshFrame() {
const hideAttribution = game.settings.get(
CONFIG.DH.id,
CONFIG.DH.SETTINGS.gameSettings.appearance
).hideAttribution;
const headerAttribution = !this.#nonHeaderAttribution.includes(this.document.type);
if (!hideAttribution && this.document.system.metadata.hasAttribution && headerAttribution) {
const { source, page } = this.document.system.attribution;
const attribution = [source, page ? `pg ${page}.` : null].filter(x => x).join('. ');
const label = this.window.header.querySelector('.attribution-header-label');
label.innerHTML = attribution;
}
}
/**
* Related documents that should cause a rerender of this application when updated.
*/
@ -548,6 +588,14 @@ export default function DHApplicationMixin(Base) {
return new ItemBrowser({ presets }).render({ force: true });
}
/**
* Open the attribution dialog
* @type {ApplicationClickAction}
*/
static async #editAttribution() {
new game.system.api.applications.dialogs.AttributionDialog(this.document).render({ force: true });
}
/**
* Create an embedded document.
* @type {ApplicationClickAction}

View file

@ -55,6 +55,9 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) {
async _prepareContext(_options) {
const context = await super._prepareContext(_options);
context.isNPC = this.document.isNPC;
context.showAttribution = !game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance)
.hideAttribution;
return context;
}

View file

@ -13,7 +13,16 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) {
static DEFAULT_OPTIONS = {
classes: ['item'],
position: { width: 600 },
window: { resizable: true },
window: {
resizable: true,
controls: [
{
icon: 'fa-solid fa-signature',
label: 'DAGGERHEART.UI.Tooltip.configureAttribution',
action: 'editAttribution'
}
]
},
form: {
submitOnChange: true
},
@ -55,6 +64,15 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) {
/* Prepare Context */
/* -------------------------------------------- */
/**@inheritdoc */
async _prepareContext(options) {
const context = super._prepareContext(options);
context.showAttribution = !game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance)
.hideAttribution;
return context;
}
/**@inheritdoc */
async _preparePartContext(partId, context, options) {
await super._preparePartContext(partId, context, options);

View file

@ -108,7 +108,7 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo
async onRollDamage(event, message) {
event.stopPropagation();
const actor = await this.getActor(message.system.source.actor);
if (game.user.character?.id !== actor.id && !game.user.isGM) return true;
if(!actor.isOwner) return true;
if (message.system.source.item && message.system.source.action) {
const action = this.getAction(actor, message.system.source.item, message.system.source.action);
if (!action || !action?.rollDamage) return;

View file

@ -624,6 +624,13 @@ export const rollTypes = {
}
};
export const attributionSources = {
daggerheart: {
label: 'Daggerheart',
values: [{ label: 'Daggerheart SRD' }]
}
};
export const fearDisplay = {
token: { value: 'token', label: 'DAGGERHEART.SETTINGS.Appearance.fearDisplay.token' },
bar: { value: 'bar', label: 'DAGGERHEART.SETTINGS.Appearance.fearDisplay.bar' },

View file

@ -10,7 +10,8 @@ export default class DhpAdversary extends BaseDataActor {
return foundry.utils.mergeObject(super.metadata, {
label: 'TYPES.Actor.adversary',
type: 'adversary',
settingSheet: DHAdversarySettings
settingSheet: DHAdversarySettings,
hasAttribution: true
});
}

View file

@ -1,5 +1,5 @@
import DHBaseActorSettings from '../../applications/sheets/api/actor-setting.mjs';
import { createScrollText, getScrollTextData } from '../../helpers/utils.mjs';
import { getScrollTextData } from '../../helpers/utils.mjs';
const resistanceField = (resistanceLabel, immunityLabel, reductionLabel) =>
new foundry.data.fields.SchemaField({
@ -39,7 +39,8 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel {
type: 'base',
isNPC: true,
settingSheet: null,
hasResistances: true
hasResistances: true,
hasAttribution: false
};
}
@ -53,6 +54,13 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel {
const fields = foundry.data.fields;
const schema = {};
if (this.metadata.hasAttribution) {
schema.attribution = new fields.SchemaField({
source: new fields.StringField(),
page: new fields.NumberField(),
artist: new fields.StringField()
});
}
if (this.metadata.isNPC) schema.description = new fields.HTMLField({ required: true, nullable: true });
if (this.metadata.hasResistances)
schema.resistance = new fields.SchemaField({
@ -78,6 +86,13 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel {
*/
static DEFAULT_ICON = null;
get attributionLabel() {
if (!this.attribution) return;
const { source, page } = this.attribution;
return [source, page ? `pg ${page}.` : null].filter(x => x).join('. ');
}
/* -------------------------------------------- */
/**
@ -133,6 +148,6 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel {
_onUpdate(changes, options, userId) {
super._onUpdate(changes, options, userId);
createScrollText(this.parent, options.scrollingTextData);
if (options.scrollingTextData) this.parent.queueScrollText(options.scrollingTextData);
}
}

View file

@ -95,7 +95,7 @@ export default class DhCharacter extends BaseDataActor {
}),
attack: new ActionField({
initial: {
name: 'Unarmed Attack',
name: 'DAGGERHEART.GENERAL.unarmedAttack',
img: 'icons/skills/melee/unarmed-punch-fist-yellow-red.webp',
_id: foundry.utils.randomID(),
systemPath: 'attack',

View file

@ -12,7 +12,8 @@ export default class DhEnvironment extends BaseDataActor {
label: 'TYPES.Actor.environment',
type: 'environment',
settingSheet: DHEnvironmentSettings,
hasResistances: false
hasResistances: false,
hasAttribution: true
});
}

View file

@ -38,4 +38,13 @@ export default class ForeignDocumentUUIDField extends foundry.data.fields.Docume
toObject(value) {
return value?.uuid ?? value;
}
/** @override */
_cast(value) {
if (typeof value === 'string') return value;
if (value instanceof foundry.abstract.Document) return value.uuid;
throw new Error(
`The value provided to a ForeignDocumentUUIDField must be a ${foundry.abstract.Document.name} instance or a UUID string.`
);
}
}

View file

@ -26,7 +26,8 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel {
hasResource: false,
isQuantifiable: false,
isInventoryItem: false,
hasActions: false
hasActions: false,
hasAttribution: true
};
}
@ -37,7 +38,13 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel {
/** @inheritDoc */
static defineSchema() {
const schema = {};
const schema = {
attribution: new fields.SchemaField({
source: new fields.StringField(),
page: new fields.NumberField(),
artist: new fields.StringField()
})
};
if (this.metadata.hasDescription) schema.description = new fields.HTMLField({ required: true, nullable: true });
@ -110,6 +117,13 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel {
return [];
}
get attributionLabel() {
if (!this.attribution) return;
const { source, page } = this.attribution;
return [source, page ? `pg ${page}.` : null].filter(x => x).join('. ');
}
/**
* Obtain a data object used to evaluate any dice rolls associated with this Item Type
* @param {object} [options] - Options which modify the getRollData method.
@ -207,6 +221,8 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel {
super._onUpdate(changed, options, userId);
updateLinkedItemApps(options, this.parent.sheet);
createScrollText(this.parent?.parent, options.scrollingTextData);
if (this.parent?.parent && options.scrollingTextData)
this.parent.parent.queueScrollText(options.scrollingTextData);
}
}

View file

@ -71,6 +71,29 @@ export default class DhAppearance extends foundry.abstract.DataModel {
extendItemDescriptions: new fields.BooleanField({
initial: false,
label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.extendItemDescriptions.label'
}),
expandRollMessage: new fields.SchemaField({
desc: new fields.BooleanField({
initial: false,
label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.expandRollMessageDesc.label'
}),
roll: new fields.BooleanField({
initial: false,
label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.expandRollMessageRoll.label'
}),
damage: new fields.BooleanField({
initial: false,
label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.expandRollMessageDamage.label'
}),
target: new fields.BooleanField({
initial: false,
label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.expandRollMessageTarget.label'
})
}),
hideAttribution: new fields.BooleanField({
required: true,
initial: false,
label: 'DAGGERHEART.SETTINGS.Appearance.FIELDS.hideAttribution.label'
})
};
}

View file

@ -1,10 +1,13 @@
import { emitAsGM, GMUpdateEvent } from '../systemRegistration/socket.mjs';
import { LevelOptionType } from '../data/levelTier.mjs';
import DHFeature from '../data/item/feature.mjs';
import { damageKeyToNumber } from '../helpers/utils.mjs';
import { createScrollText, damageKeyToNumber } from '../helpers/utils.mjs';
import DhCompanionLevelUp from '../applications/levelup/companionLevelup.mjs';
export default class DhpActor extends Actor {
#scrollTextQueue = [];
#scrollTextInterval;
/**
* Return the first Actor active owner.
*/
@ -27,7 +30,7 @@ export default class DhpActor extends Actor {
/** @inheritDoc */
static migrateData(source) {
if(source.system?.attack && !source.system.attack.type) source.system.attack.type = "attack";
if (source.system?.attack && !source.system.attack.type) source.system.attack.type = 'attack';
return super.migrateData(source);
}
@ -572,19 +575,15 @@ export default class DhpActor extends Actor {
if (armorSlotResult) {
const { modifiedDamage, armorSpent, stressSpent } = armorSlotResult;
updates.find(u => u.key === 'hitPoints').value = modifiedDamage;
if(armorSpent) {
if (armorSpent) {
const armorUpdate = updates.find(u => u.key === 'armor');
if(armorUpdate)
armorUpdate.value += armorSpent;
else
updates.push({ value: armorSpent, key: 'armor' });
if (armorUpdate) armorUpdate.value += armorSpent;
else updates.push({ value: armorSpent, key: 'armor' });
}
if(stressSpent) {
if (stressSpent) {
const stressUpdate = updates.find(u => u.key === 'stress');
if(stressUpdate)
stressUpdate.value += stressSpent;
else
updates.push({ value: stressSpent, key: 'stress' });
if (stressUpdate) stressUpdate.value += stressSpent;
else updates.push({ value: stressSpent, key: 'stress' });
}
}
}
@ -754,4 +753,23 @@ export default class DhpActor extends Actor {
}
}
}
queueScrollText(scrollingTextData) {
this.#scrollTextQueue.push(...scrollingTextData.map(data => () => createScrollText(this, data)));
if (!this.#scrollTextInterval) {
const scrollFunc = this.#scrollTextQueue.pop();
scrollFunc?.();
const intervalFunc = () => {
const scrollFunc = this.#scrollTextQueue.pop();
scrollFunc?.();
if (this.#scrollTextQueue.length === 0) {
clearInterval(this.#scrollTextInterval);
this.#scrollTextInterval = null;
}
};
this.#scrollTextInterval = setInterval(intervalFunc.bind(this), 600);
}
}
}

View file

@ -54,19 +54,36 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage {
e.setAttribute('data-use-perm', document.testUserPermission(game.user, 'OWNER'));
});
if (this.isContentVisible && this.type === 'dualityRoll') {
html.classList.add('duality');
switch (this.system.roll?.result?.duality) {
case 1:
html.classList.add('hope');
break;
case -1:
html.classList.add('fear');
break;
default:
html.classList.add('critical');
break;
if (this.isContentVisible) {
if(this.type === 'dualityRoll') {
html.classList.add('duality');
switch (this.system.roll?.result?.duality) {
case 1:
html.classList.add('hope');
break;
case -1:
html.classList.add('fear');
break;
default:
html.classList.add('critical');
break;
}
}
const autoExpandRoll = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance).expandRollMessage,
rollSections = html.querySelectorAll(".roll-part"),
itemDesc = html.querySelector(".domain-card-move");
rollSections.forEach(s => {
if(s.classList.contains("roll-section")) {
const toExpand = s.querySelector('[data-action="expandRoll"]');
toExpand.classList.toggle("expanded", autoExpandRoll.roll);
} else if(s.classList.contains("damage-section"))
s.classList.toggle("expanded", autoExpandRoll.damage);
else if(s.classList.contains("target-section"))
s.classList.toggle("expanded", autoExpandRoll.target);
});
if(itemDesc && autoExpandRoll.desc)
itemDesc.setAttribute("open", "");
}
if(!game.user.isGM) {

View file

@ -28,6 +28,14 @@ export default class DHItem extends foundry.documents.Item {
return doc;
}
/* -------------------------------------------- */
/** @inheritDoc */
static migrateData(source) {
if(source.system?.attack && !source.system.attack.type) source.system.attack.type = "attack";
return super.migrateData(source);
}
/**
* @inheritdoc
* @param {object} options - Options which modify the getRollData method.

View file

@ -177,7 +177,7 @@ Roll.replaceFormulaData = function (formula, data = {}, { missing, warn = false
return nativeReplaceFormulaData(formula, data, { missing, warn });
};
foundry.dice.terms.Die.MODIFIERS.sc = 'selfCorrecting';
foundry.utils.setProperty(foundry, 'dice.terms.Die.MODIFIERS.sc', 'selfCorrecting');
/**
* Return the configured value as result if 1 is rolled
@ -371,17 +371,15 @@ export function getScrollTextData(resources, resource, key) {
return { text, stroke, fill, direction };
}
export function createScrollText(actor, optionsData) {
if (actor && optionsData?.length) {
export function createScrollText(actor, data) {
if (actor) {
actor.getActiveTokens().forEach(token => {
optionsData.forEach(data => {
const { text, ...options } = data;
canvas.interface.createScrollingText(token.getCenterPoint(), data.text, {
duration: 2000,
distance: token.h,
jitter: 0,
...options
});
const { text, ...options } = data;
canvas.interface.createScrollingText(token.getCenterPoint(), data.text, {
duration: 2000,
distance: token.h,
jitter: 0,
...options
});
});
}

View file

@ -7,7 +7,7 @@
"rollup": "^4.40.0"
},
"scripts": {
"start": "concurrently \"rollup -c --watch\" \"node ../../../../FoundryDev/main.js --dataPath=../../../ --noupnp\" \"gulp\"",
"start": "node ./tools/run-start.mjs",
"start-test": "node ./resources/app/main.js --dataPath=./ && rollup -c --watch && gulp",
"build": "npm run rollup && npm run gulp",
"rollup": "rollup -c",
@ -16,7 +16,8 @@
"pushLDBtoYML": "node ./tools/pushLDBtoYML.mjs",
"pullYMLtoLDB": "node ./tools/pullYMLtoLDB.mjs",
"pullYMLtoLDBBuild": "node ./tools/pullYMLtoLDBBuild.mjs",
"createSymlink": "node ./tools/create-symlink.mjs"
"createSymlink": "node ./tools/create-symlink.mjs",
"setup:dev": "node ./tools/dev-setup.mjs"
},
"devDependencies": {
"@foundryvtt/foundryvtt-cli": "^1.0.2",

View file

@ -1,3 +1,12 @@
---
name: Pull Request
about: Create a new pull request
title: "[PR] <Insert Title here>"
labels: pr
assignees: ''
---
Is this a community PR? Please go to preview tab and click [here](?expand=1&template=community_pull_request_template.md). If not, delete this line.
## Description
Please include a summary of the change and which issue is fixed (if applicable). Also include relevant context or motivation for the change.

View file

@ -143,6 +143,11 @@
"difficulty": null,
"damageMod": "none"
}
},
"attribution": {
"source": "Daggerheart SRD",
"page": 75,
"artist": ""
}
},
"flags": {},
@ -152,9 +157,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1754010222829,
"modifiedTime": 1755259462470,
"modifiedTime": 1755384241210,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"ownership": {

View file

@ -106,6 +106,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 91,
"artist": ""
}
},
"flags": {},
@ -115,9 +120,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784219,
"modifiedTime": 1755259462665,
"modifiedTime": 1755385356620,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "G7jiltRjgvVhZewm",

View file

@ -105,6 +105,11 @@
"img": "icons/weapons/daggers/dagger-bone-black.webp",
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 84,
"artist": ""
}
},
"flags": {},
@ -114,9 +119,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784220,
"modifiedTime": 1755259462932,
"modifiedTime": 1755384980487,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "vNIbYQ4YSzNf0WPE",

View file

@ -117,6 +117,11 @@
"img": "icons/magic/unholy/beam-ringed-impact-purple.webp",
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 97,
"artist": ""
}
},
"flags": {},
@ -126,9 +131,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784221,
"modifiedTime": 1755259462752,
"modifiedTime": 1755385620034,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "WPEOIGfclNJxWb87",

View file

@ -111,6 +111,11 @@
"img": "icons/weapons/bows/longbow-recurve-leather-brown.webp",
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 77,
"artist": ""
}
},
"flags": {},
@ -120,9 +125,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784222,
"modifiedTime": 1755259462476,
"modifiedTime": 1755384306205,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "JRhrrEg5UroURiAD",

View file

@ -106,6 +106,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 84,
"artist": ""
}
},
"flags": {},
@ -115,9 +120,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784223,
"modifiedTime": 1755259462516,
"modifiedTime": 1755384973132,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "0ts6CGd93lLqGZI5",

View file

@ -112,6 +112,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 84,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784224,
"modifiedTime": 1755259462844,
"modifiedTime": 1755384989183,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "h5RuhzGL17dW5FBT",

View file

@ -112,6 +112,11 @@
"range": "melee",
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 85,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784224,
"modifiedTime": 1755264708230,
"modifiedTime": 1755385012352,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "dgH3fW9FTYLaIDvS",

View file

@ -117,6 +117,11 @@
"type": "attack",
"range": "melee",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 75,
"artist": ""
}
},
"flags": {},
@ -126,9 +131,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784226,
"modifiedTime": 1755259462479,
"modifiedTime": 1755384265295,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "71qKDLKO3CsrNkdy",

View file

@ -112,6 +112,11 @@
"type": "attack",
"range": "melee",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 77,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784226,
"modifiedTime": 1755259462481,
"modifiedTime": 1755384320981,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "B4LZcGuBAHzyVdzy",

View file

@ -115,6 +115,11 @@
"img": "icons/skills/melee/unarmed-punch-fist-yellow-red.webp",
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 83,
"artist": ""
}
},
"flags": {},
@ -124,9 +129,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784231,
"modifiedTime": 1755259462487,
"modifiedTime": 1755384340788,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "2UeZ0tEe7AzgSJNd",

View file

@ -111,6 +111,11 @@
"img": "icons/weapons/clubs/club-banded-barbed-black.webp",
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 75,
"artist": ""
}
},
"flags": {},
@ -120,9 +125,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784233,
"modifiedTime": 1755259462491,
"modifiedTime": 1755384280132,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "8Zkqk1jU09nKL2fy",

View file

@ -106,6 +106,11 @@
"img": "icons/magic/light/beam-rays-magenta.webp",
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 85,
"artist": ""
}
},
"flags": {},
@ -115,9 +120,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784233,
"modifiedTime": 1755259462855,
"modifiedTime": 1755385025439,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "jDmHqGvzg5wjgmxE",

View file

@ -99,6 +99,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 85,
"artist": ""
}
},
"flags": {},
@ -108,9 +113,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784234,
"modifiedTime": 1755259462618,
"modifiedTime": 1755385032835,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "99TqczuQipBmaB8i",

View file

@ -106,6 +106,11 @@
"type": "attack",
"range": "melee",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 75,
"artist": ""
}
},
"flags": {},
@ -115,9 +120,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784236,
"modifiedTime": 1755259462495,
"modifiedTime": 1755384289735,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "uOP5oT9QzXPlnf3p",

View file

@ -117,6 +117,11 @@
"type": "attack",
"range": "melee",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 85,
"artist": ""
}
},
"flags": {},
@ -126,9 +131,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784237,
"modifiedTime": 1755264799637,
"modifiedTime": 1755385040425,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "ZxWaWPdzFIUPNC62",

View file

@ -112,6 +112,11 @@
"type": "attack",
"range": "melee",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 76,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784237,
"modifiedTime": 1755259462499,
"modifiedTime": 1755384362436,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "CBBuEXAlLKFMJdjg",

View file

@ -117,6 +117,11 @@
"img": "icons/weapons/staves/staff-ornate-purple.webp",
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 85,
"artist": ""
}
},
"flags": {},
@ -126,9 +131,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784239,
"modifiedTime": 1755259462512,
"modifiedTime": 1755385049086,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "0NxCSugvKQ4W8OYZ",

View file

@ -106,6 +106,11 @@
"range": "melee",
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 86,
"artist": ""
}
},
"flags": {},
@ -115,9 +120,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784239,
"modifiedTime": 1755264898243,
"modifiedTime": 1755385067530,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "tyBOpLfigAhI9bU3",

View file

@ -99,6 +99,11 @@
"type": "attack",
"range": "melee",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 86,
"artist": ""
}
},
"flags": {},
@ -108,9 +113,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784240,
"modifiedTime": 1755264925295,
"modifiedTime": 1755385079522,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "zx99sOGTXicP4SSD",

View file

@ -111,6 +111,11 @@
"img": "icons/magic/nature/root-vines-grow-brown.webp",
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 76,
"artist": ""
}
},
"flags": {},
@ -120,9 +125,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784246,
"modifiedTime": 1755259462506,
"modifiedTime": 1755384371297,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "9x2xY9zwc3xzbXo5",

View file

@ -112,6 +112,11 @@
"type": "attack",
"range": "melee",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 91,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784247,
"modifiedTime": 1755265775161,
"modifiedTime": 1755385363507,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "pnyjIGxxvurcWmTv",

View file

@ -112,6 +112,11 @@
"type": "attack",
"range": "far",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 92,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784248,
"modifiedTime": 1755266281854,
"modifiedTime": 1755385375748,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "kE4dfhqmIQpNd44e",

View file

@ -112,6 +112,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 92,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784249,
"modifiedTime": 1755259462532,
"modifiedTime": 1755385382792,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "2VN3BftageoTTIzu",

View file

@ -112,6 +112,11 @@
"img": "icons/magic/symbols/rune-sigil-rough-white-teal.webp",
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 92,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784249,
"modifiedTime": 1755259462726,
"modifiedTime": 1755385392005,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "SxSOkM4bcVOFyjbo",

View file

@ -112,6 +112,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 92,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784252,
"modifiedTime": 1755259462568,
"modifiedTime": 1755385398938,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "5lphJAgzoqZI3VoG",

View file

@ -112,6 +112,11 @@
"range": "melee",
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 86,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784253,
"modifiedTime": 1755264935543,
"modifiedTime": 1755385087255,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "NoRZ1PqB8N5wcIw0",

View file

@ -111,6 +111,11 @@
"type": "attack",
"range": "melee",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 93,
"artist": ""
}
},
"flags": {},
@ -120,9 +125,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784253,
"modifiedTime": 1755266383523,
"modifiedTime": 1755385409189,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "tBWHW00epmMnkawe",

View file

@ -112,6 +112,11 @@
"type": "attack",
"range": "melee",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 76,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784257,
"modifiedTime": 1755259591554,
"modifiedTime": 1755384380804,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "wNzeuQLfLUMvgHlQ",

View file

@ -112,6 +112,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 93,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784258,
"modifiedTime": 1755259462937,
"modifiedTime": 1755385415645,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "wR7cFKrHvRzbzhBT",

View file

@ -106,6 +106,11 @@
"range": "melee",
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 86,
"artist": ""
}
},
"flags": {},
@ -115,9 +120,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784258,
"modifiedTime": 1755264962798,
"modifiedTime": 1755385098856,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "TLzY1nDw0Bu9Ud40",

View file

@ -99,6 +99,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 93,
"artist": ""
}
},
"flags": {},
@ -108,9 +113,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784259,
"modifiedTime": 1755259462705,
"modifiedTime": 1755385425940,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "P7h54ZePFPHpYwvB",

View file

@ -138,6 +138,11 @@
"difficulty": null,
"damageMod": "none"
}
},
"attribution": {
"source": "Daggerheart SRD",
"page": 86,
"artist": ""
}
},
"flags": {},
@ -147,9 +152,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1754090776362,
"modifiedTime": 1755259462811,
"modifiedTime": 1755385106827,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"ownership": {

View file

@ -112,6 +112,11 @@
"range": "melee",
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 86,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784262,
"modifiedTime": 1755265009751,
"modifiedTime": 1755385114729,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "ChwwVqowFw8hJQwT",

View file

@ -99,6 +99,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 97,
"artist": ""
}
},
"flags": {},
@ -108,9 +113,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784264,
"modifiedTime": 1755259462703,
"modifiedTime": 1755385629418,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "OsLG2BjaEdTZUJU9",

View file

@ -112,6 +112,11 @@
"img": "icons/weapons/staves/staff-animal-skull-bull.webp",
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 97,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784265,
"modifiedTime": 1755259462708,
"modifiedTime": 1755385635754,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "PELRry1vqjBzSAlr",

View file

@ -155,7 +155,12 @@
}
}
},
"motivesAndTactics": "Corrupt, dominate, punish, break the weak"
"motivesAndTactics": "Corrupt, dominate, punish, break the weak",
"attribution": {
"source": "Daggerheart SRD",
"page": 97,
"artist": ""
}
},
"prototypeToken": {
"name": "Fallen Warlord: Realm Breaker",
@ -742,9 +747,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753929378070,
"modifiedTime": 1755259462847,
"modifiedTime": 1755385644142,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_key": "!actors!hxZ0sgoFJubh5aj6"

View file

@ -156,7 +156,12 @@
},
"chatDisplay": false
},
"motivesAndTactics": "Dispatch merciless death, punish the defi ant, secure victory at any cost"
"motivesAndTactics": "Dispatch merciless death, punish the defi ant, secure victory at any cost",
"attribution": {
"source": "Daggerheart SRD",
"page": 98,
"artist": ""
}
},
"prototypeToken": {
"name": "Fallen Warlord: Undefeated Champion",
@ -800,9 +805,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753929476879,
"modifiedTime": 1755259462720,
"modifiedTime": 1755385652290,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_key": "!actors!RXkZTwBRi4dJ3JE5"

View file

@ -112,6 +112,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 87,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784268,
"modifiedTime": 1755259462604,
"modifiedTime": 1755385128275,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "8VZIgU12cB3cvlyH",

View file

@ -112,6 +112,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 87,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784268,
"modifiedTime": 1755259462794,
"modifiedTime": 1755385135374,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "YnObCleGjPT7yqEc",

View file

@ -138,6 +138,11 @@
"difficulty": null,
"damageMod": "none"
}
},
"attribution": {
"source": "Daggerheart SRD",
"page": 87,
"artist": ""
}
},
"flags": {},
@ -147,9 +152,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1754090770908,
"modifiedTime": 1755265221515,
"modifiedTime": 1755385144098,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"ownership": {

View file

@ -112,6 +112,11 @@
"range": "melee",
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 76,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784269,
"modifiedTime": 1755259619874,
"modifiedTime": 1755384391635,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "IIWV4ysJPFPnTP7W",

View file

@ -105,6 +105,11 @@
"type": "attack",
"range": "melee",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 76,
"artist": ""
}
},
"flags": {},
@ -114,9 +119,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784270,
"modifiedTime": 1755259636506,
"modifiedTime": 1755384399993,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "4PfLnaCrOcMdb4dK",

View file

@ -99,6 +99,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 87,
"artist": ""
}
},
"flags": {},
@ -108,9 +113,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784271,
"modifiedTime": 1755259462570,
"modifiedTime": 1755385156358,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "5s8wSvpyC5rxY5aD",

View file

@ -112,6 +112,11 @@
"type": "attack",
"range": "melee",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 76,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784272,
"modifiedTime": 1755259666128,
"modifiedTime": 1755384410923,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "fmfntuJ8mHRCAktP",

View file

@ -106,6 +106,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 77,
"artist": ""
}
},
"flags": {},
@ -115,9 +120,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784273,
"modifiedTime": 1755259462600,
"modifiedTime": 1755384427339,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "8KWVLWXFhlY2kYx0",

View file

@ -112,6 +112,11 @@
"img": "icons/weapons/bows/shortbow-recurve-yellow.webp",
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 88,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784274,
"modifiedTime": 1755259462608,
"modifiedTime": 1755385192601,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "8mJYMpbLTb8qIOrr",

View file

@ -106,6 +106,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 93,
"artist": ""
}
},
"flags": {},
@ -115,9 +120,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784275,
"modifiedTime": 1755259462829,
"modifiedTime": 1755385432586,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "dsfB3YhoL5SudvS2",

View file

@ -106,6 +106,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 93,
"artist": ""
}
},
"flags": {},
@ -115,9 +120,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784278,
"modifiedTime": 1755259462945,
"modifiedTime": 1755385438845,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "xIICT6tEdnA7dKDV",

View file

@ -112,6 +112,11 @@
"type": "attack",
"range": "melee",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 80,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784278,
"modifiedTime": 1755259726565,
"modifiedTime": 1755384442882,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "SHXedd9zZPVfUgUa",

View file

@ -106,6 +106,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 98,
"artist": ""
}
},
"flags": {},
@ -115,9 +120,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784279,
"modifiedTime": 1755259462863,
"modifiedTime": 1755385664307,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "kabueAo6BALApWqp",

View file

@ -99,6 +99,11 @@
"type": "attack",
"range": "melee",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 98,
"artist": ""
}
},
"flags": {},
@ -108,9 +113,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784279,
"modifiedTime": 1755266855456,
"modifiedTime": 1755385672764,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "VENwg7xEFcYObjmT",

View file

@ -111,6 +111,11 @@
"img": "icons/weapons/polearms/spear-hooked-rounded.webp",
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 77,
"artist": ""
}
},
"flags": {},
@ -120,9 +125,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784281,
"modifiedTime": 1755259462930,
"modifiedTime": 1755384460991,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "uRtghKE9mHlII4rs",

View file

@ -117,6 +117,11 @@
"type": "attack",
"range": "melee",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 77,
"artist": ""
}
},
"flags": {},
@ -126,9 +131,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784282,
"modifiedTime": 1755259874457,
"modifiedTime": 1755384472544,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "mK3A5FTx6k8iPU3F",

View file

@ -112,6 +112,11 @@
"type": "attack",
"range": "melee",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 95,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784283,
"modifiedTime": 1755266472641,
"modifiedTime": 1755385468446,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "i2UNbRvgyoSs07M6",

View file

@ -112,6 +112,11 @@
"img": "icons/skills/melee/strike-blade-hooked-orange-blue.webp",
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 98,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784283,
"modifiedTime": 1755259462909,
"modifiedTime": 1755385681541,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "r1mbfSSwKWdcFdAU",

View file

@ -112,6 +112,11 @@
"type": "attack",
"range": "melee",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 94,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784284,
"modifiedTime": 1755266545039,
"modifiedTime": 1755385452708,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "6hbqmxDXFOzZJDk4",

View file

@ -106,6 +106,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 94,
"artist": ""
}
},
"flags": {},
@ -115,9 +120,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784285,
"modifiedTime": 1755259462679,
"modifiedTime": 1755385485548,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "MI126iMOOobQ1Obn",

View file

@ -112,6 +112,11 @@
"type": "attack",
"range": "melee",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 77,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784290,
"modifiedTime": 1755259904640,
"modifiedTime": 1755384483511,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "5Lh1T0zaT8Pkr2U2",

View file

@ -111,6 +111,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 78,
"artist": ""
}
},
"flags": {},
@ -120,9 +125,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784291,
"modifiedTime": 1755259462688,
"modifiedTime": 1755384496776,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "MbBPIOxaxXYNApXz",

View file

@ -117,6 +117,11 @@
"type": "attack",
"range": "melee",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 78,
"artist": ""
}
},
"flags": {},
@ -126,9 +131,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784292,
"modifiedTime": 1755259941370,
"modifiedTime": 1755384505324,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "CBKixLH3yhivZZuL",

View file

@ -105,6 +105,11 @@
"stress": {
"max": 1
}
},
"attribution": {
"source": "Daggerheart SRD",
"page": 78,
"artist": ""
}
},
"flags": {},
@ -114,9 +119,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784293,
"modifiedTime": 1755259961931,
"modifiedTime": 1755384512770,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "C0OMQqV7pN6t7ouR",

View file

@ -111,6 +111,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 78,
"artist": ""
}
},
"flags": {},
@ -120,9 +125,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784294,
"modifiedTime": 1755259462803,
"modifiedTime": 1755384520025,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "aTljstqteGoLpCBq",

View file

@ -112,6 +112,11 @@
"type": "attack",
"range": "melee",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 78,
"artist": ""
}
},
"flags": {},
@ -121,9 +126,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.4",
"systemVersion": "1.0.5",
"createdTime": 1753922784295,
"modifiedTime": 1755260040062,
"modifiedTime": 1755384529543,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "XF4tYTq9nPJAy2ox",

View file

@ -111,6 +111,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 78,
"artist": ""
}
},
"flags": {},
@ -120,9 +125,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784296,
"modifiedTime": 1755259462527,
"modifiedTime": 1755384539312,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "1zuyof1XuIfi3aMG",

View file

@ -106,6 +106,11 @@
},
"type": "attack",
"chatDisplay": false
},
"attribution": {
"source": "Daggerheart SRD",
"page": 88,
"artist": ""
}
},
"flags": {},
@ -115,9 +120,9 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "0.0.1",
"systemVersion": "1.0.5",
"createdTime": 1753922784297,
"modifiedTime": 1755259462684,
"modifiedTime": 1755385201114,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
},
"_id": "MYXmTx2FHcIjdfYZ",

Some files were not shown because too many files have changed in this diff Show more