Fix conflicts

This commit is contained in:
Dapoolp 2025-08-25 13:42:23 +02:00
commit 92a0883806
121 changed files with 1526 additions and 1107 deletions

View file

@ -1,6 +1,6 @@
---
name: Feature report
about: Create a feature report for suggestions on improving the system
name: Feature request
about: Create a feature request for suggestions on improving the system
title: "[Feature] <Insert Title here> "
labels: enhancement, discussion, maybe
type: feature

View file

@ -72,6 +72,14 @@
"exactHint": "The Character's Tier is used if empty",
"label": "Beastform"
},
"damage": {
"multiplier": "Multiplier",
"flatMultiplier": "Flat Multiplier"
},
"general": {
"customFormula": "Custom Formula",
"formula": "Formula"
},
"displayInChat": "Display in chat"
},
"RollField": {
@ -1902,7 +1910,8 @@
"domains": "Domains",
"downtime": "Downtime",
"roll": "Roll",
"rules": "Rules"
"rules": "Rules",
"types": "Types"
},
"Tiers": {
"singular": "Tier",
@ -1919,6 +1928,7 @@
"amount": "Amount",
"any": "Any",
"armor": "Armor",
"armors": "Armors",
"armorScore": "Armor Score",
"activeEffects": "Active Effects",
"armorSlots": "Armor Slots",
@ -1930,6 +1940,7 @@
"continue": "Continue",
"criticalSuccess": "Critical Success",
"criticalShort": "Critical",
"custom": "Custom",
"d20Roll": "D20 Roll",
"damage": "Damage",
"damageRoll": "Damage Roll",
@ -1971,6 +1982,7 @@
"inactiveEffects": "Inactive Effects",
"inventory": "Inventory",
"itemResource": "Item Resource",
"items": "Items",
"label": "Label",
"level": "Level",
"levelShort": "Lv",
@ -1982,6 +1994,7 @@
"plural": "Miss"
},
"maxWithThing": "Max {thing}",
"missingDragDropThing": "Drop {thing} here",
"multiclass": "Multiclass",
"newCategory": "New Category",
"none": "None",
@ -2007,6 +2020,7 @@
"scalable": "Scalable",
"situationalBonus": "Situational Bonus",
"stress": "Stress",
"subclasses": "Subclasses",
"success": "Success",
"take": "Take",
"Target": {
@ -2025,6 +2039,7 @@
"used": "Used",
"uses": "Uses",
"value": "Value",
"weapons": "Weapons",
"withThing": "With {thing}"
},
"ITEMS": {
@ -2263,6 +2278,10 @@
"deleteDomain": "Delete Domain",
"deleteDomainText": "Are you sure you want to delete the {name} domain? It will be immediately removed from all Actors in this world where it's currently used. Compendiums are not cleared.",
"duplicateDomain": "There is already a domain with this identification."
},
"adversaryType": {
"title": "Custom Adversary Types",
"newType": "Adversary Type"
}
},
"Menu": {
@ -2480,7 +2499,8 @@
"actionNoUsesRemaining": "That action doesn't have remaining uses.",
"multiclassAlreadyPresent": "You already have a class and multiclass",
"subclassesAlreadyPresent": "You already have a class and multiclass subclass",
"noDiceSystem": "Your selected dice {system} does not have a {faces} dice"
"noDiceSystem": "Your selected dice {system} does not have a {faces} dice",
"subclassAlreadyLinked": "{name} is already a subclass in the class {class}. Remove it from there if you want it to be a subclass to this class."
},
"Tooltip": {
"disableEffect": "Disable Effect",

View file

@ -432,12 +432,17 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl
}
};
if (type == 'domains')
if (type === 'domains')
presets.filter = {
'level.max': { key: 'level.max', value: 1 },
'system.domain': { key: 'system.domain', value: this.setup.class?.system.domains ?? null }
};
if (type === 'subclasses')
presets.filter = {
'system.linkedClass.uuid': { key: 'system.linkedClass.uuid', value: this.setup.class?.uuid }
};
if (equipment.includes(type))
presets.filter = {
'system.tier': { key: 'system.tier', value: 1 },

View file

@ -1,6 +1,9 @@
export default class DHTokenHUD extends foundry.applications.hud.TokenHUD {
static DEFAULT_OPTIONS = {
classes: ['daggerheart']
classes: ['daggerheart'],
actions: {
combat: DHTokenHUD.#onToggleCombat
}
};
/** @override */
@ -11,8 +14,14 @@ export default class DHTokenHUD extends foundry.applications.hud.TokenHUD {
}
};
static #nonCombatTypes = ['environment', 'companion'];
async _prepareContext(options) {
const context = await super._prepareContext(options);
context.canToggleCombat = DHTokenHUD.#nonCombatTypes.includes(this.actor.type)
? false
: context.canToggleCombat;
context.systemStatusEffects = Object.keys(context.statusEffects).reduce((acc, key) => {
const effect = context.statusEffects[key];
if (effect.systemEffect) acc[key] = effect;
@ -36,6 +45,20 @@ export default class DHTokenHUD extends foundry.applications.hud.TokenHUD {
return context;
}
static async #onToggleCombat() {
const tokens = canvas.tokens.controlled
.filter(t => !t.actor || !DHTokenHUD.#nonCombatTypes.includes(t.actor.type))
.map(t => t.document);
if (!this.object.controlled) tokens.push(this.document);
try {
if (this.document.inCombat) await TokenDocument.implementation.deleteCombatants(tokens);
else await TokenDocument.implementation.createCombatants(tokens);
} catch (err) {
ui.notifications.warn(err.message);
}
}
_getStatusEffectChoices() {
// Include all HUD-enabled status effects
const choices = {};

View file

@ -1,5 +1,6 @@
import { DhHomebrew } from '../../data/settings/_module.mjs';
import { slugify } from '../../helpers/utils.mjs';
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
export default class DhHomebrewSettings extends HandlebarsApplicationMixin(ApplicationV2) {
@ -10,11 +11,14 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli
game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).toObject()
);
this.selected = {
domain: null
};
this.selected = this.#getDefaultAdversaryType();
}
#getDefaultAdversaryType = () => ({
domain: null,
adversaryType: null
});
get title() {
return game.i18n.localize('DAGGERHEART.SETTINGS.Menu.title');
}
@ -35,6 +39,9 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli
addDomain: this.addDomain,
toggleSelectedDomain: this.toggleSelectedDomain,
deleteDomain: this.deleteDomain,
addAdversaryType: this.addAdversaryType,
deleteAdversaryType: this.deleteAdversaryType,
selectAdversaryType: this.selectAdversaryType,
save: this.save,
reset: this.reset
},
@ -45,6 +52,7 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli
tabs: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs' },
settings: { template: 'systems/daggerheart/templates/settings/homebrew-settings/settings.hbs' },
domains: { template: 'systems/daggerheart/templates/settings/homebrew-settings/domains.hbs' },
types: { template: 'systems/daggerheart/templates/settings/homebrew-settings/types.hbs' },
downtime: { template: 'systems/daggerheart/templates/settings/homebrew-settings/downtime.hbs' },
footer: { template: 'systems/daggerheart/templates/settings/homebrew-settings/footer.hbs' }
};
@ -52,12 +60,19 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli
/** @inheritdoc */
static TABS = {
main: {
tabs: [{ id: 'settings' }, { id: 'domains' }, { id: 'downtime' }],
tabs: [{ id: 'settings' }, { id: 'domains' }, { id: 'types' }, { id: 'downtime' }],
initial: 'settings',
labelPrefix: 'DAGGERHEART.GENERAL.Tabs'
}
};
changeTab(tab, group, options) {
super.changeTab(tab, group, options);
this.selected = this.#getDefaultAdversaryType();
this.render();
}
async _prepareContext(_options) {
const context = await super._prepareContext(_options);
context.settingFields = this.settings;
@ -79,6 +94,11 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli
context.configDomains = CONFIG.DH.DOMAIN.domains;
context.homebrewDomains = this.settings.domains;
break;
case 'types':
context.selectedAdversaryType = this.selected.adversaryType
? { id: this.selected.adversaryType, ...this.settings.adversaryTypes[this.selected.adversaryType] }
: null;
break;
}
return context;
@ -301,6 +321,32 @@ export default class DhHomebrewSettings extends HandlebarsApplicationMixin(Appli
this.render();
}
static async addAdversaryType(_, target) {
const newId = foundry.utils.randomID();
await this.settings.updateSource({
[`adversaryTypes.${newId}`]: {
id: newId,
label: game.i18n.localize('DAGGERHEART.SETTINGS.Homebrew.adversaryType.newType')
}
});
this.selected.adversaryType = newId;
this.render();
}
static async deleteAdversaryType(_, target) {
const { key } = target.dataset;
await this.settings.updateSource({ [`adversaryTypes.-=${key}`]: null });
this.selected.adversaryType = this.selected.adversaryType === key ? null : this.selected.adversaryType;
this.render();
}
static async selectAdversaryType(_, target) {
this.selected.adversaryType = this.selected.adversaryType === target.dataset.type ? null : target.dataset.type;
this.render();
}
static async save() {
await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew, this.settings.toObject());
this.close();

View file

@ -56,6 +56,7 @@ export default class AdversarySheet extends DHBaseActorSheet {
async _prepareContext(options) {
const context = await super._prepareContext(options);
context.systemFields.attack.fields = this.document.system.attack.schema.fields;
return context;
}
@ -65,6 +66,9 @@ export default class AdversarySheet extends DHBaseActorSheet {
switch (partId) {
case 'header':
await this._prepareHeaderContext(context, options);
const adversaryTypes = CONFIG.DH.ACTOR.allAdversaryTypes();
context.adversaryType = game.i18n.localize(adversaryTypes[this.document.system.type].label);
break;
case 'notes':
await this._prepareNotesContext(context, options);

View file

@ -15,6 +15,8 @@ export default class CharacterSheet extends DHBaseActorSheet {
static DEFAULT_OPTIONS = {
classes: ['character'],
position: { width: 850, height: 800 },
/* Foundry adds disabled to all buttons and inputs if editPermission is missing. This is not desired. */
editPermission: CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER,
actions: {
toggleVault: CharacterSheet.#toggleVault,
rollAttribute: CharacterSheet.#rollAttribute,
@ -148,6 +150,13 @@ export default class CharacterSheet extends DHBaseActorSheet {
.querySelector('.level-value')
?.addEventListener('change', event => this.document.updateLevel(Number(event.currentTarget.value)));
const observer = this.document.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER, {
exact: true
});
if (observer) {
this.element.querySelector('.window-content').classList.add('viewMode');
}
this._createFilterMenus();
this._createSearchFilter();
}

View file

@ -8,6 +8,7 @@ export default class DhCompanionSheet extends DHBaseActorSheet {
classes: ['actor', 'companion'],
position: { width: 340 },
actions: {
actionRoll: DhCompanionSheet.#actionRoll,
levelManagement: DhCompanionSheet.#levelManagement
}
};
@ -45,6 +46,52 @@ export default class DhCompanionSheet extends DHBaseActorSheet {
/* Application Clicks Actions */
/* -------------------------------------------- */
/**
*
*/
static async #actionRoll(event) {
const partner = this.actor.system.partner;
const config = {
event,
title: `${game.i18n.localize('DAGGERHEART.GENERAL.Roll.action')}: ${this.actor.name}`,
headerTitle: `Companion ${game.i18n.localize('DAGGERHEART.GENERAL.Roll.action')}`,
roll: {
trait: partner.system.spellcastModifierTrait?.key
},
hasRoll: true,
data: partner.getRollData()
};
const result = await partner.diceRoll(config);
this.consumeResource(result?.costs);
}
// Remove when Action Refactor part #2 done
async consumeResource(costs) {
if (!costs?.length) return;
const partner = this.actor.system.partner;
const usefulResources = {
...foundry.utils.deepClone(partner.system.resources),
fear: {
value: game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Resources.Fear),
max: game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).maxFear,
reversed: false
}
};
const resources = game.system.api.fields.ActionFields.CostField.getRealCosts(costs).map(c => {
const resource = usefulResources[c.key];
return {
key: c.key,
value: (c.total ?? c.value) * (resource.isReversed ? 1 : -1),
target: resource.target,
keyIsID: resource.keyIsID
};
});
await partner.modifyResource(resources);
}
/**
* Opens the companions level management window.
* @type {ApplicationClickAction}

View file

@ -119,6 +119,15 @@ export default class ClassSheet extends DHBaseItemSheet {
const itemType = data.data ? data.type : item.type;
const target = event.target.closest('fieldset.drop-section');
if (itemType === 'subclass') {
if (item.system.linkedClass) {
return ui.notifications.warn(
game.i18n.format('DAGGERHEART.UI.Notifications.subclassAlreadyLinked', {
name: item.name,
class: this.document.name
})
);
}
await item.update({ 'system.linkedClass': this.document.uuid });
await this.document.update({
'system.subclasses': [...this.document.system.subclasses.map(x => x.uuid), item.uuid]
});
@ -181,6 +190,12 @@ export default class ClassSheet extends DHBaseItemSheet {
static async #removeItemFromCollection(_event, element) {
const { uuid, target } = element.dataset;
const prop = foundry.utils.getProperty(this.document.system, target);
if (target === 'subclasses') {
const subclass = await foundry.utils.fromUuid(uuid);
await subclass.update({ 'system.linkedClass': null });
}
await this.document.update({ [`system.${target}`]: prop.filter(i => i.uuid !== uuid).map(x => x.uuid) });
}

View file

@ -124,11 +124,11 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
_attachPartListeners(partId, htmlElement, options) {
super._attachPartListeners(partId, htmlElement, options);
htmlElement
.querySelectorAll('[data-action="selectFolder"]')
.forEach(element => element.addEventListener("contextmenu", (event) => {
htmlElement.querySelectorAll('[data-action="selectFolder"]').forEach(element =>
element.addEventListener('contextmenu', event => {
event.target.classList.toggle('expanded');
}))
})
);
}
/* -------------------------------------------- */
@ -196,7 +196,10 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
this.items = ItemBrowser.sortBy(items, 'name');
if (target) {
target.closest('.compendium-sidebar').querySelectorAll('[data-action="selectFolder"]').forEach(element => element.classList.remove("is-selected"))
target
.closest('.compendium-sidebar')
.querySelectorAll('[data-action="selectFolder"]')
.forEach(element => element.classList.remove('is-selected'));
target.classList.add('is-selected');
}
@ -240,7 +243,7 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
filters.forEach(f => {
if (typeof f.field === 'string') f.field = foundry.utils.getProperty(game, f.field);
else if (typeof f.choices === 'function') {
f.choices = f.choices();
f.choices = f.choices(this.items);
}
// Clear field label so template uses our custom label parameter
@ -259,11 +262,8 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) {
/* -------------------------------------------- */
/**
* Create and initialize search filter instances for the inventory and loadout sections.
* Create and initialize search filter instance.
*
* Sets up two {@link foundry.applications.ux.SearchFilter} instances:
* - One for the inventory, which filters items in the inventory grid.
* - One for the loadout, which filters items in the loadout/card grid.
* @private
*/
_createSearchFilter() {

View file

@ -10,38 +10,38 @@ export default class DhMeasuredTemplate extends foundry.canvas.placeables.Measur
const splitRulerText = this.ruler.text.split(' ');
if (splitRulerText.length > 0) {
const rulerValue = Number(splitRulerText[0]);
const result = this.constructor.getRangeLabels(rulerValue, rangeMeasurementSettings);
this.ruler.text = result.distance + result.units ? (' ' + result.units) : '';
const result = DhMeasuredTemplate.getRangeLabels(rulerValue, rangeMeasurementSettings);
this.ruler.text = result.distance + (result.units ? ' ' + result.units : '');
}
}
}
static getRangeLabels(distance, settings) {
let result = { distance: '', units: null }
static getRangeLabels(distanceValue, settings) {
let result = { distance: distanceValue, units: '' };
const rangeMeasurementOverride = canvas.scene.flags.daggerheart?.rangeMeasurementOverride;
if (rangeMeasurementOverride === true) {
result.distance = distance;
result.distance = distanceValue;
result.units = canvas.scene?.grid?.units;
return result
return result;
}
if (distance <= settings.melee) {
if (distanceValue <= settings.melee) {
result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.melee.name');
return result;
}
if (distance <= settings.veryClose) {
if (distanceValue <= settings.veryClose) {
result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.veryClose.name');
return result;
}
if (distance <= settings.close) {
if (distanceValue <= settings.close) {
result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.close.name');
return result;
}
if (distance <= settings.far) {
if (distanceValue <= settings.far) {
result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.far.name');
return result;
}
if (distance > settings.far) {
if (distanceValue > settings.far) {
result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.veryFar.name');
}

View file

@ -157,6 +157,11 @@ export const adversaryTypes = {
}
};
export const allAdversaryTypes = () => ({
...adversaryTypes,
...game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).adversaryTypes
});
export const environmentTypes = {
exploration: {
label: 'DAGGERHEART.CONFIG.EnvironmentType.exploration.label',

View file

@ -2,270 +2,278 @@ export const typeConfig = {
adversaries: {
columns: [
{
key: "system.tier",
label: "DAGGERHEART.GENERAL.Tiers.singular"
key: 'system.tier',
label: 'DAGGERHEART.GENERAL.Tiers.singular'
},
{
key: "system.type",
label: "DAGGERHEART.GENERAL.type"
key: 'system.type',
label: 'DAGGERHEART.GENERAL.type'
}
],
filters: [
{
key: "system.tier",
label: "DAGGERHEART.GENERAL.Tiers.singular",
key: 'system.tier',
label: 'DAGGERHEART.GENERAL.Tiers.singular',
field: 'system.api.models.actors.DhAdversary.schema.fields.tier'
},
{
key: "system.type",
label: "DAGGERHEART.GENERAL.type",
key: 'system.type',
label: 'DAGGERHEART.GENERAL.type',
field: 'system.api.models.actors.DhAdversary.schema.fields.type'
},
{
key: "system.difficulty",
name: "difficulty.min",
label: "DAGGERHEART.UI.ItemBrowser.difficultyMin",
key: 'system.difficulty',
name: 'difficulty.min',
label: 'DAGGERHEART.UI.ItemBrowser.difficultyMin',
field: 'system.api.models.actors.DhAdversary.schema.fields.difficulty',
operator: "gte"
operator: 'gte'
},
{
key: "system.difficulty",
name: "difficulty.max",
label: "DAGGERHEART.UI.ItemBrowser.difficultyMax",
key: 'system.difficulty',
name: 'difficulty.max',
label: 'DAGGERHEART.UI.ItemBrowser.difficultyMax',
field: 'system.api.models.actors.DhAdversary.schema.fields.difficulty',
operator: "lte"
operator: 'lte'
},
{
key: "system.resources.hitPoints.max",
name: "hp.min",
label: "DAGGERHEART.UI.ItemBrowser.hitPointsMin",
key: 'system.resources.hitPoints.max',
name: 'hp.min',
label: 'DAGGERHEART.UI.ItemBrowser.hitPointsMin',
field: 'system.api.models.actors.DhAdversary.schema.fields.resources.fields.hitPoints.fields.max',
operator: "gte"
operator: 'gte'
},
{
key: "system.resources.hitPoints.max",
name: "hp.max",
label: "DAGGERHEART.UI.ItemBrowser.hitPointsMax",
key: 'system.resources.hitPoints.max',
name: 'hp.max',
label: 'DAGGERHEART.UI.ItemBrowser.hitPointsMax',
field: 'system.api.models.actors.DhAdversary.schema.fields.resources.fields.hitPoints.fields.max',
operator: "lte"
operator: 'lte'
},
{
key: "system.resources.stress.max",
name: "stress.min",
label: "DAGGERHEART.UI.ItemBrowser.stressMin",
key: 'system.resources.stress.max',
name: 'stress.min',
label: 'DAGGERHEART.UI.ItemBrowser.stressMin',
field: 'system.api.models.actors.DhAdversary.schema.fields.resources.fields.stress.fields.max',
operator: "gte"
operator: 'gte'
},
{
key: "system.resources.stress.max",
name: "stress.max",
label: "DAGGERHEART.UI.ItemBrowser.stressMax",
key: 'system.resources.stress.max',
name: 'stress.max',
label: 'DAGGERHEART.UI.ItemBrowser.stressMax',
field: 'system.api.models.actors.DhAdversary.schema.fields.resources.fields.stress.fields.max',
operator: "lte"
},
operator: 'lte'
}
]
},
items: {
columns: [
{
key: "type",
label: "DAGGERHEART.GENERAL.type"
key: 'type',
label: 'DAGGERHEART.GENERAL.type'
},
{
key: "system.secondary",
label: "DAGGERHEART.UI.ItemBrowser.subtype",
format: (isSecondary) => isSecondary ? "secondary" : (isSecondary === false ? "primary" : '-')
key: 'system.secondary',
label: 'DAGGERHEART.UI.ItemBrowser.subtype',
format: isSecondary => (isSecondary ? 'secondary' : isSecondary === false ? 'primary' : '-')
},
{
key: "system.tier",
label: "DAGGERHEART.GENERAL.Tiers.singular"
key: 'system.tier',
label: 'DAGGERHEART.GENERAL.Tiers.singular'
}
],
filters: [
{
key: "type",
label: "DAGGERHEART.GENERAL.type",
choices: () => CONFIG.Item.documentClass.TYPES.filter(t => ["armor", "weapon", "consumable", "loot"].includes(t)).map(t => ({ value: t, label: t }))
key: 'type',
label: 'DAGGERHEART.GENERAL.type',
choices: () =>
CONFIG.Item.documentClass.TYPES.filter(t =>
['armor', 'weapon', 'consumable', 'loot'].includes(t)
).map(t => ({ value: t, label: t }))
},
{
key: "system.secondary",
label: "DAGGERHEART.UI.ItemBrowser.subtype",
key: 'system.secondary',
label: 'DAGGERHEART.UI.ItemBrowser.subtype',
choices: [
{ value: false, label: "DAGGERHEART.ITEMS.Weapon.primaryWeapon" },
{ value: true, label: "DAGGERHEART.ITEMS.Weapon.secondaryWeapon" }
{ value: false, label: 'DAGGERHEART.ITEMS.Weapon.primaryWeapon' },
{ value: true, label: 'DAGGERHEART.ITEMS.Weapon.secondaryWeapon' }
]
},
{
key: "system.tier",
label: "DAGGERHEART.GENERAL.Tiers.singular",
choices: [{ value: "1", label: "1" }, { value: "2", label: "2" }, { value: "3", label: "3" }, { value: "4", label: "4" }]
key: 'system.tier',
label: 'DAGGERHEART.GENERAL.Tiers.singular',
choices: [
{ value: '1', label: '1' },
{ value: '2', label: '2' },
{ value: '3', label: '3' },
{ value: '4', label: '4' }
]
},
{
key: "system.burden",
label: "DAGGERHEART.GENERAL.burden",
key: 'system.burden',
label: 'DAGGERHEART.GENERAL.burden',
field: 'system.api.models.items.DHWeapon.schema.fields.burden'
},
{
key: "system.attack.roll.trait",
label: "DAGGERHEART.GENERAL.Trait.single",
key: 'system.attack.roll.trait',
label: 'DAGGERHEART.GENERAL.Trait.single',
field: 'system.api.models.actions.actionsTypes.attack.schema.fields.roll.fields.trait'
},
{
key: "system.attack.range",
label: "DAGGERHEART.GENERAL.range",
key: 'system.attack.range',
label: 'DAGGERHEART.GENERAL.range',
field: 'system.api.models.actions.actionsTypes.attack.schema.fields.range'
},
{
key: "system.baseScore",
name: "armor.min",
label: "DAGGERHEART.UI.ItemBrowser.armorScoreMin",
key: 'system.baseScore',
name: 'armor.min',
label: 'DAGGERHEART.UI.ItemBrowser.armorScoreMin',
field: 'system.api.models.items.DHArmor.schema.fields.baseScore',
operator: "gte"
operator: 'gte'
},
{
key: "system.baseScore",
name: "armor.max",
label: "DAGGERHEART.UI.ItemBrowser.armorScoreMax",
key: 'system.baseScore',
name: 'armor.max',
label: 'DAGGERHEART.UI.ItemBrowser.armorScoreMax',
field: 'system.api.models.items.DHArmor.schema.fields.baseScore',
operator: "lte"
operator: 'lte'
},
{
key: "system.itemFeatures",
label: "DAGGERHEART.GENERAL.features",
choices: () => [...Object.entries(CONFIG.DH.ITEM.weaponFeatures), ...Object.entries(CONFIG.DH.ITEM.armorFeatures)].map(([k, v]) => ({ value: k, label: v.label })),
operator: "contains3"
key: 'system.itemFeatures',
label: 'DAGGERHEART.GENERAL.features',
choices: () =>
[
...Object.entries(CONFIG.DH.ITEM.weaponFeatures),
...Object.entries(CONFIG.DH.ITEM.armorFeatures)
].map(([k, v]) => ({ value: k, label: v.label })),
operator: 'contains3'
}
]
},
features: {
columns: [
],
filters: [
]
columns: [],
filters: []
},
cards: {
columns: [
{
key: "system.type",
label: "DAGGERHEART.GENERAL.type"
key: 'system.type',
label: 'DAGGERHEART.GENERAL.type'
},
{
key: "system.domain",
label: "DAGGERHEART.GENERAL.Domain.single"
key: 'system.domain',
label: 'DAGGERHEART.GENERAL.Domain.single'
},
{
key: "system.level",
label: "DAGGERHEART.GENERAL.level"
key: 'system.level',
label: 'DAGGERHEART.GENERAL.level'
}
],
filters: [
{
key: "system.type",
label: "DAGGERHEART.GENERAL.type",
key: 'system.type',
label: 'DAGGERHEART.GENERAL.type',
field: 'system.api.models.items.DHDomainCard.schema.fields.type'
},
{
key: "system.domain",
label: "DAGGERHEART.GENERAL.Domain.single",
key: 'system.domain',
label: 'DAGGERHEART.GENERAL.Domain.single',
field: 'system.api.models.items.DHDomainCard.schema.fields.domain',
operator: "contains2"
operator: 'contains2'
},
{
key: "system.level",
name: "level.min",
label: "DAGGERHEART.UI.ItemBrowser.levelMin",
key: 'system.level',
name: 'level.min',
label: 'DAGGERHEART.UI.ItemBrowser.levelMin',
field: 'system.api.models.items.DHDomainCard.schema.fields.level',
operator: "gte"
operator: 'gte'
},
{
key: "system.level",
name: "level.max",
label: "DAGGERHEART.UI.ItemBrowser.levelMax",
key: 'system.level',
name: 'level.max',
label: 'DAGGERHEART.UI.ItemBrowser.levelMax',
field: 'system.api.models.items.DHDomainCard.schema.fields.level',
operator: "lte"
operator: 'lte'
},
{
key: "system.recallCost",
name: "recall.min",
label: "DAGGERHEART.UI.ItemBrowser.recallCostMin",
key: 'system.recallCost',
name: 'recall.min',
label: 'DAGGERHEART.UI.ItemBrowser.recallCostMin',
field: 'system.api.models.items.DHDomainCard.schema.fields.recallCost',
operator: "gte"
operator: 'gte'
},
{
key: "system.recallCost",
name: "recall.max",
label: "DAGGERHEART.UI.ItemBrowser.recallCostMax",
key: 'system.recallCost',
name: 'recall.max',
label: 'DAGGERHEART.UI.ItemBrowser.recallCostMax',
field: 'system.api.models.items.DHDomainCard.schema.fields.recallCost',
operator: "lte"
operator: 'lte'
}
]
},
classes: {
columns: [
{
key: "system.evasion",
label: "DAGGERHEART.GENERAL.evasion"
key: 'system.evasion',
label: 'DAGGERHEART.GENERAL.evasion'
},
{
key: "system.hitPoints",
label: "DAGGERHEART.GENERAL.HitPoints.plural"
key: 'system.hitPoints',
label: 'DAGGERHEART.GENERAL.HitPoints.plural'
},
{
key: "system.domains",
label: "DAGGERHEART.GENERAL.Domain.plural"
key: 'system.domains',
label: 'DAGGERHEART.GENERAL.Domain.plural'
}
],
filters: [
{
key: "system.evasion",
name: "evasion.min",
label: "DAGGERHEART.UI.ItemBrowser.evasionMin",
key: 'system.evasion',
name: 'evasion.min',
label: 'DAGGERHEART.UI.ItemBrowser.evasionMin',
field: 'system.api.models.items.DHClass.schema.fields.evasion',
operator: "gte"
operator: 'gte'
},
{
key: "system.evasion",
name: "evasion.max",
label: "DAGGERHEART.UI.ItemBrowser.evasionMax",
key: 'system.evasion',
name: 'evasion.max',
label: 'DAGGERHEART.UI.ItemBrowser.evasionMax',
field: 'system.api.models.items.DHClass.schema.fields.evasion',
operator: "lte"
operator: 'lte'
},
{
key: "system.hitPoints",
name: "hp.min",
label: "DAGGERHEART.UI.ItemBrowser.hitPointsMin",
key: 'system.hitPoints',
name: 'hp.min',
label: 'DAGGERHEART.UI.ItemBrowser.hitPointsMin',
field: 'system.api.models.items.DHClass.schema.fields.hitPoints',
operator: "gte"
operator: 'gte'
},
{
key: "system.hitPoints",
name: "hp.max",
label: "DAGGERHEART.UI.ItemBrowser.hitPointsMax",
key: 'system.hitPoints',
name: 'hp.max',
label: 'DAGGERHEART.UI.ItemBrowser.hitPointsMax',
field: 'system.api.models.items.DHClass.schema.fields.hitPoints',
operator: "lte"
operator: 'lte'
},
{
key: "system.domains",
label: "DAGGERHEART.GENERAL.Domain.plural",
key: 'system.domains',
label: 'DAGGERHEART.GENERAL.Domain.plural',
choices: () => Object.values(CONFIG.DH.DOMAIN.domains).map(d => ({ value: d.id, label: d.label })),
operator: "contains2"
operator: 'contains2'
}
]
},
subclasses: {
columns: [
{
key: "id",
label: "TYPES.Item.class",
format: (id) => {
return "";
key: 'id',
label: 'TYPES.Item.class',
format: id => {
return '';
}
},
{
key: "system.spellcastingTrait",
label: "DAGGERHEART.ITEMS.Subclass.spellcastingTrait"
key: 'system.spellcastingTrait',
label: 'DAGGERHEART.ITEMS.Subclass.spellcastingTrait'
}
],
filters: []
@ -273,133 +281,133 @@ export const typeConfig = {
beastforms: {
columns: [
{
key: "system.tier",
label: "DAGGERHEART.GENERAL.Tiers.singular"
key: 'system.tier',
label: 'DAGGERHEART.GENERAL.Tiers.singular'
},
{
key: "system.mainTrait",
label: "DAGGERHEART.GENERAL.Trait.single"
key: 'system.mainTrait',
label: 'DAGGERHEART.GENERAL.Trait.single'
}
],
filters: [
{
key: "system.tier",
label: "DAGGERHEART.GENERAL.Tiers.singular",
key: 'system.tier',
label: 'DAGGERHEART.GENERAL.Tiers.singular',
field: 'system.api.models.items.DHBeastform.schema.fields.tier'
},
{
key: "system.mainTrait",
label: "DAGGERHEART.GENERAL.Trait.single",
key: 'system.mainTrait',
label: 'DAGGERHEART.GENERAL.Trait.single',
field: 'system.api.models.items.DHBeastform.schema.fields.mainTrait'
}
]
}
}
};
export const compendiumConfig = {
"daggerheart": {
id: "daggerheart",
label: "DAGGERHEART",
daggerheart: {
id: 'daggerheart',
label: 'DAGGERHEART',
folders: {
"adversaries": {
id: "adversaries",
keys: ["adversaries"],
label: "DAGGERHEART.UI.ItemBrowser.folders.adversaries",
type: ["adversary"],
listType: "adversaries"
adversaries: {
id: 'adversaries',
keys: ['adversaries'],
label: 'DAGGERHEART.UI.ItemBrowser.folders.adversaries',
type: ['adversary'],
listType: 'adversaries'
},
"ancestries": {
id: "ancestries",
keys: ["ancestries"],
label: "DAGGERHEART.UI.ItemBrowser.folders.ancestries",
type: ["ancestry"],
ancestries: {
id: 'ancestries',
keys: ['ancestries'],
label: 'DAGGERHEART.UI.ItemBrowser.folders.ancestries',
type: ['ancestry'],
folders: {
"features": {
id: "features",
keys: ["ancestries"],
label: "DAGGERHEART.UI.ItemBrowser.folders.features",
type: ["feature"]
features: {
id: 'features',
keys: ['ancestries'],
label: 'DAGGERHEART.UI.ItemBrowser.folders.features',
type: ['feature']
}
}
},
"equipments": {
id: "equipments",
keys: ["armors", "weapons", "consumables", "loot"],
label: "DAGGERHEART.UI.ItemBrowser.folders.equipment",
type: ["armor", "weapon", "consumable", "loot"],
listType: "items"
equipments: {
id: 'equipments',
keys: ['armors', 'weapons', 'consumables', 'loot'],
label: 'DAGGERHEART.UI.ItemBrowser.folders.equipment',
type: ['armor', 'weapon', 'consumable', 'loot'],
listType: 'items'
},
"classes": {
id: "classes",
keys: ["classes"],
label: "DAGGERHEART.UI.ItemBrowser.folders.classes",
type: ["class"],
classes: {
id: 'classes',
keys: ['classes'],
label: 'DAGGERHEART.UI.ItemBrowser.folders.classes',
type: ['class'],
folders: {
"features": {
id: "features",
keys: ["classes"],
label: "DAGGERHEART.UI.ItemBrowser.folders.features",
type: ["feature"]
features: {
id: 'features',
keys: ['classes'],
label: 'DAGGERHEART.UI.ItemBrowser.folders.features',
type: ['feature']
},
"items": {
id: "items",
keys: ["classes"],
label: "DAGGERHEART.UI.ItemBrowser.folders.items",
type: ["armor", "weapon", "consumable", "loot"],
listType: "items"
items: {
id: 'items',
keys: ['classes'],
label: 'DAGGERHEART.UI.ItemBrowser.folders.items',
type: ['armor', 'weapon', 'consumable', 'loot'],
listType: 'items'
}
},
listType: "classes"
listType: 'classes'
},
"subclasses": {
id: "subclasses",
keys: ["subclasses"],
label: "DAGGERHEART.UI.ItemBrowser.folders.subclasses",
type: ["subclass"],
listType: "subclasses"
subclasses: {
id: 'subclasses',
keys: ['subclasses'],
label: 'DAGGERHEART.UI.ItemBrowser.folders.subclasses',
type: ['subclass'],
listType: 'subclasses'
},
"domains": {
id: "domains",
keys: ["domains"],
label: "DAGGERHEART.UI.ItemBrowser.folders.domainCards",
type: ["domainCard"],
listType: "cards"
domains: {
id: 'domains',
keys: ['domains'],
label: 'DAGGERHEART.UI.ItemBrowser.folders.domainCards',
type: ['domainCard'],
listType: 'cards'
},
"communities": {
id: "communities",
keys: ["communities"],
label: "DAGGERHEART.UI.ItemBrowser.folders.communities",
type: ["community"],
communities: {
id: 'communities',
keys: ['communities'],
label: 'DAGGERHEART.UI.ItemBrowser.folders.communities',
type: ['community'],
folders: {
"features": {
id: "features",
keys: ["communities"],
label: "DAGGERHEART.UI.ItemBrowser.folders.features",
type: ["feature"]
features: {
id: 'features',
keys: ['communities'],
label: 'DAGGERHEART.UI.ItemBrowser.folders.features',
type: ['feature']
}
}
},
"environments": {
id: "environments",
keys: ["environments"],
label: "DAGGERHEART.UI.ItemBrowser.folders.environments",
type: ["environment"]
environments: {
id: 'environments',
keys: ['environments'],
label: 'DAGGERHEART.UI.ItemBrowser.folders.environments',
type: ['environment']
},
"beastforms": {
id: "beastforms",
keys: ["beastforms"],
label: "DAGGERHEART.UI.ItemBrowser.folders.beastforms",
type: ["beastform"],
listType: "beastforms",
beastforms: {
id: 'beastforms',
keys: ['beastforms'],
label: 'DAGGERHEART.UI.ItemBrowser.folders.beastforms',
type: ['beastform'],
listType: 'beastforms',
folders: {
"features": {
id: "features",
keys: ["beastforms"],
label: "DAGGERHEART.UI.ItemBrowser.folders.features",
type: ["feature"]
}
features: {
id: 'features',
keys: ['beastforms'],
label: 'DAGGERHEART.UI.ItemBrowser.folders.features',
type: ['feature']
}
}
}
}
}
};

View file

@ -51,11 +51,13 @@ export default class DHAttackAction extends DHDamageAction {
const labels = [];
const { roll, range, damage } = this;
if (roll.trait) labels.push(game.i18n.localize(`DAGGERHEART.CONFIG.Traits.${roll.trait}.short`))
if (roll.trait) labels.push(game.i18n.localize(`DAGGERHEART.CONFIG.Traits.${roll.trait}.short`));
if (range) labels.push(game.i18n.localize(`DAGGERHEART.CONFIG.Range.${range}.short`));
for (const { value, type } of damage.parts) {
const str = Roll.replaceFormulaData(value.getFormula(), this.actor?.getRollData() ?? {});
const useAltDamage = this.actor?.effects?.find(x => x.type === 'horde')?.active;
for (const { value, valueAlt, type } of damage.parts) {
const usedValue = useAltDamage ? valueAlt : value;
const str = Roll.replaceFormulaData(usedValue.getFormula(), this.actor?.getRollData() ?? {});
const icons = Array.from(type)
.map(t => CONFIG.DH.GENERAL.damageTypes[t]?.icon)

View file

@ -27,7 +27,7 @@ export default class DhpAdversary extends BaseDataActor {
}),
type: new fields.StringField({
required: true,
choices: CONFIG.DH.ACTOR.adversaryTypes,
choices: CONFIG.DH.ACTOR.allAdversaryTypes,
initial: CONFIG.DH.ACTOR.adversaryTypes.standard.id
}),
motivesAndTactics: new fields.StringField(),
@ -130,7 +130,7 @@ export default class DhpAdversary extends BaseDataActor {
CONFIG.DH.id,
CONFIG.DH.SETTINGS.gameSettings.Automation
).hordeDamage;
if (autoHordeDamage && changes.system?.resources?.hitPoints?.value) {
if (autoHordeDamage && changes.system?.resources?.hitPoints?.value !== undefined) {
const hordeActiveEffect = this.parent.effects.find(x => x.type === 'horde');
if (hordeActiveEffect) {
const halfHP = Math.ceil(this.resources.hitPoints.max / 2);

View file

@ -130,11 +130,16 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel {
const typeForDefeated = ['character', 'adversary', 'companion'].find(x => x === this.parent.type);
if (defeatedSettings.enabled && typeForDefeated) {
const resource = typeForDefeated === 'companion' ? 'stress' : 'hitPoints';
if (changes.system.resources[resource]) {
const becameMax = changes.system.resources[resource].value === this.resources[resource].max;
const resourceValue = changes.system.resources[resource];
if (
resourceValue &&
this.resources[resource].max &&
resourceValue.value !== this.resources[resource].value
) {
const becameMax = resourceValue.value === this.resources[resource].max;
const wasMax =
this.resources[resource].value === this.resources[resource].max &&
this.resources[resource].value !== changes.system.resources[resource].value;
this.resources[resource].value !== resourceValue.value;
if (becameMax) {
this.parent.toggleDefeated(true);
} else if (wasMax) {

View file

@ -317,7 +317,7 @@ export default class DhCharacter extends BaseDataActor {
}
get multiclass() {
const value = this.parent.items.find(x => x.type === 'Class' && x.system.isMulticlass);
const value = this.parent.items.find(x => x.type === 'class' && x.system.isMulticlass);
const subclass = this.parent.items.find(x => x.type === 'subclass' && x.system.isMulticlass);
return {
@ -443,7 +443,9 @@ export default class DhCharacter extends BaseDataActor {
classFeatures.push(item);
} else if (item.system.originItemType === CONFIG.DH.ITEM.featureTypes.subclass.id) {
if (this.class.subclass) {
const subclassState = this.class.subclass.system.featureState;
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 ||

View file

@ -127,8 +127,8 @@ export default class DHActorRoll extends foundry.abstract.TypeDataModel {
}
this.canViewSecret = this.parent.speakerActor?.testUserPermission(game.user, 'OBSERVER');
this.canButtonApply = game.user.isGM;
this.isGM = game.user.isGM;
this.canButtonApply = game.user.isGM; //temp
this.isGM = game.user.isGM; //temp
}
getTargetList() {

View file

@ -163,14 +163,22 @@ export class DHActionDiceData extends foundry.abstract.DataModel {
multiplier: new fields.StringField({
choices: CONFIG.DH.GENERAL.multiplierTypes,
initial: 'prof',
label: 'Multiplier'
label: 'DAGGERHEART.ACTIONS.Config.damage.multiplier'
}),
flatMultiplier: new fields.NumberField({ nullable: true, initial: 1, label: 'Flat Multiplier' }),
dice: new fields.StringField({ choices: CONFIG.DH.GENERAL.diceTypes, initial: 'd6', label: 'Dice' }),
bonus: new fields.NumberField({ nullable: true, initial: null, label: 'Bonus' }),
flatMultiplier: new fields.NumberField({
nullable: true,
initial: 1,
label: 'DAGGERHEART.ACTIONS.Config.damage.flatMultiplier'
}),
dice: new fields.StringField({
choices: CONFIG.DH.GENERAL.diceTypes,
initial: 'd6',
label: 'DAGGERHEART.GENERAL.Dice.single'
}),
bonus: new fields.NumberField({ nullable: true, initial: null, label: 'DAGGERHEART.GENERAL.bonus' }),
custom: new fields.SchemaField({
enabled: new fields.BooleanField({ label: 'Custom Formula' }),
formula: new FormulaField({ label: 'Formula', initial: '' })
enabled: new fields.BooleanField({ label: 'DAGGERHEART.ACTIONS.Config.general.customFormula' }),
formula: new FormulaField({ label: 'DAGGERHEART.ACTIONS.Config.general.formula', initial: '' })
})
};
}

View file

@ -162,7 +162,6 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel {
for (let f of this.features) {
const fBase = f.item ?? f;
const feature = fBase.system ? fBase : await foundry.utils.fromUuid(fBase.uuid);
const multiclass = this.isMulticlass ? 'multiclass' : null;
features.push(
foundry.utils.mergeObject(
feature.toObject(),
@ -170,7 +169,8 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel {
_stats: { compendiumSource: fBase.uuid },
system: {
originItemType: this.parent.type,
identifier: multiclass ?? (f.item ? f.type : null)
identifier: f.item ? f.type : null,
multiclassOrigin: this.isMulticlass
}
},
{ inplace: false }

View file

@ -29,6 +29,7 @@ export default class DHFeature extends BaseDataItem {
nullable: true,
initial: null
}),
multiclassOrigin: new fields.BooleanField({ initial: false }),
identifier: new fields.StringField()
};
}

View file

@ -1,3 +1,4 @@
import ForeignDocumentUUIDField from '../fields/foreignDocumentUUIDField.mjs';
import ItemLinkFields from '../fields/itemLinkFields.mjs';
import BaseDataItem from './base.mjs';
@ -25,7 +26,8 @@ export default class DHSubclass extends BaseDataItem {
}),
features: new ItemLinkFields(),
featureState: new fields.NumberField({ required: true, initial: 1, min: 1 }),
isMulticlass: new fields.BooleanField({ initial: false })
isMulticlass: new fields.BooleanField({ initial: false }),
linkedClass: new ForeignDocumentUUIDField({ type: 'Item', nullable: true, initial: null })
};
}

View file

@ -199,8 +199,8 @@ export default class DHWeapon extends AttachableItem {
];
for (const { value, type } of attack.damage.parts) {
const parts = [value.dice];
if (value.bonus) parts.push(value.bonus.signedString());
const parts = value.custom.enabled ? [game.i18n.localize('DAGGERHEART.GENERAL.custom')] : [value.dice];
if (!value.custom.enabled && value.bonus) parts.push(value.bonus.signedString());
if (type.size > 0) {
const typeTags = Array.from(type)

View file

@ -108,6 +108,13 @@ export default class DhHomebrew extends foundry.abstract.DataModel {
}),
description: new fields.HTMLField()
})
),
adversaryTypes: new fields.TypedObjectField(
new fields.SchemaField({
id: new fields.StringField({ required: true }),
label: new fields.StringField({ required: true, label: 'DAGGERHEART.GENERAL.label' }),
description: new fields.StringField()
})
)
};
}

View file

@ -167,13 +167,11 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect {
if (subclass) {
const featureState = subclass.system.featureState;
const featureType = subclass
? (subclass.system.features.find(x => x.item?.uuid === this.parent.uuid)?.type ?? null)
: null;
if (
(featureType === CONFIG.DH.ITEM.featureSubTypes.specialization && featureState < 2) ||
(featureType === CONFIG.DH.ITEM.featureSubTypes.mastery && featureState < 3)
(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;
}

View file

@ -1,7 +1,7 @@
import { emitAsGM, GMUpdateEvent } from '../systemRegistration/socket.mjs';
import { LevelOptionType } from '../data/levelTier.mjs';
import DHFeature from '../data/item/feature.mjs';
import { createScrollText, damageKeyToNumber, versionCompare } from '../helpers/utils.mjs';
import { createScrollText, damageKeyToNumber } from '../helpers/utils.mjs';
import DhCompanionLevelUp from '../applications/levelup/companionLevelup.mjs';
export default class DhpActor extends Actor {
@ -167,10 +167,10 @@ export default class DhpActor extends Actor {
if (multiclass) {
const multiclassItem = this.items.find(x => x.uuid === multiclass.itemUuid);
const multiclassFeatures = this.items.filter(
x => x.system.originItemType === 'class' && x.system.identifier === 'multiclass'
x => x.system.originItemType === 'class' && x.system.multiclassOrigin
);
const subclassFeatures = this.items.filter(
x => x.system.originItemType === 'subclass' && x.system.identifier === 'multiclass'
x => x.system.originItemType === 'subclass' && x.system.multiclassOrigin
);
this.deleteEmbeddedDocuments(
@ -782,7 +782,7 @@ export default class DhpActor extends Actor {
}
const parsedJSON = JSON.parse(json);
if (versionCompare(parsedJSON._stats.systemVersion, '1.1.0')) {
if (foundry.utils.isNewerVersion('1.1.0', parsedJSON._stats.systemVersion)) {
const confirmed = await foundry.applications.api.DialogV2.confirm({
window: {
title: game.i18n.localize('DAGGERHEART.ACTORS.Character.InvalidOldCharacterImportTitle')

View file

@ -2,7 +2,8 @@ export default function DhDamageEnricher(match, _options) {
const parts = match[1].split('|').map(x => x.trim());
let value = null,
type = null;
type = null,
inline = false;
parts.forEach(part => {
const split = part.split(':').map(x => x.toLowerCase().trim());
@ -14,16 +15,19 @@ export default function DhDamageEnricher(match, _options) {
case 'type':
type = split[1];
break;
case 'inline':
inline = true;
break;
}
}
});
if (!value || !value) return match[0];
return getDamageMessage(value, type, match[0]);
return getDamageMessage(value, type, inline, match[0]);
}
function getDamageMessage(damage, type, defaultElement) {
function getDamageMessage(damage, type, inline, defaultElement) {
const typeIcons = type
.replace('[', '')
.replace(']', '')
@ -40,7 +44,7 @@ function getDamageMessage(damage, type, defaultElement) {
const dualityElement = document.createElement('span');
dualityElement.innerHTML = `
<button class="enriched-damage-button"
<button class="enriched-damage-button${inline ? ' inline' : ''}"
data-value="${damage}"
data-type="${type}"
data-tooltip="${game.i18n.localize('DAGGERHEART.GENERAL.damage')}"

View file

@ -36,7 +36,7 @@ function getDualityMessage(roll, flavor) {
const dualityElement = document.createElement('span');
dualityElement.innerHTML = `
<button class="duality-roll-button"
<button class="duality-roll-button${roll.inline ? ' inline' : ''}"
data-title="${label}"
data-label="${dataLabel}"
data-reaction="${roll.reaction ? 'true' : 'false'}"

View file

@ -2,7 +2,8 @@ export default function DhTemplateEnricher(match, _options) {
const parts = match[1].split('|').map(x => x.trim());
let type = null,
range = null;
range = null,
inline = false;
parts.forEach(part => {
const split = part.split(':').map(x => x.toLowerCase().trim());
@ -20,6 +21,9 @@ export default function DhTemplateEnricher(match, _options) {
);
range = matchedRange?.id;
break;
case 'inline':
inline = true;
break;
}
}
});
@ -30,7 +34,7 @@ export default function DhTemplateEnricher(match, _options) {
const templateElement = document.createElement('span');
templateElement.innerHTML = `
<button class="measured-template-button" data-type="${type}" data-range="${range}">
<button class="measured-template-button${inline ? ' inline' : ''}" data-type="${type}" data-range="${range}">
${label} - ${game.i18n.localize(`DAGGERHEART.CONFIG.Range.${range}.name`)}
</button>
`;

View file

@ -418,14 +418,3 @@ export async function createEmbeddedItemsWithEffects(actor, baseData) {
export const slugify = name => {
return name.toLowerCase().replaceAll(' ', '-').replaceAll('.', '');
};
export const versionCompare = (current, target) => {
const currentSplit = current.split('.').map(x => Number.parseInt(x));
const targetSplit = target.split('.').map(x => Number.parseInt(x));
for (var i = 0; i < currentSplit.length; i++) {
if (currentSplit[i] < targetSplit[i]) return true;
if (currentSplit[i] > targetSplit[i]) return false;
}
return false;
};

View file

@ -1,12 +1,15 @@
import { versionCompare } from '../helpers/utils.mjs';
export async function runMigrations() {
let lastMigrationVersion = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.LastMigrationVersion);
if (!lastMigrationVersion) lastMigrationVersion = '1.0.6';
if (versionCompare(lastMigrationVersion, '1.1.0')) {
if (foundry.utils.isNewerVersion('1.1.0', lastMigrationVersion)) {
const lockedPacks = [];
const compendiumActors = [];
for (let pack of game.packs) {
if (pack.locked) {
lockedPacks.push(pack.collection);
await pack.configure({ locked: false });
}
const documents = await pack.getDocuments();
compendiumActors.push(...documents.filter(x => x.type === 'character'));
}
@ -34,8 +37,64 @@ export async function runMigrations() {
actor.updateEmbeddedDocuments('Item', items);
});
for (let packId of lockedPacks) {
const pack = game.packs.get(packId);
await pack.configure({ locked: true });
}
lastMigrationVersion = '1.1.0';
}
if (foundry.utils.isNewerVersion('1.1.1', lastMigrationVersion)) {
const lockedPacks = [];
const compendiumClasses = [];
const compendiumActors = [];
for (let pack of game.packs) {
if (pack.locked) {
lockedPacks.push(pack.collection);
await pack.configure({ locked: false });
}
const documents = await pack.getDocuments();
compendiumClasses.push(...documents.filter(x => x.type === 'class'));
compendiumActors.push(...documents.filter(x => x.type === 'character'));
}
[...compendiumActors, ...game.actors.filter(x => x.type === 'character')].forEach(char => {
const multiclass = char.items.find(x => x.type === 'class' && x.system.isMulticlass);
const multiclassSubclass =
multiclass?.system?.subclasses?.length > 0 ? multiclass.system.subclasses[0] : null;
char.items.forEach(item => {
if (item.type === 'feature' && item.system.identifier === 'multiclass') {
const base = item.system.originItemType === 'class' ? multiclass : multiclassSubclass;
if (base) {
const baseFeature = base.system.features.find(x => x.item.name === item.name);
if (baseFeature) {
item.update({
system: {
multiclassOrigin: true,
identifier: baseFeature.type
}
});
}
}
}
});
});
const worldClasses = game.items.filter(x => x.type === 'class');
for (let classVal of [...compendiumClasses, ...worldClasses]) {
for (let subclass of classVal.system.subclasses) {
await subclass.update({ 'system.linkedClass': classVal.uuid });
}
}
for (let packId of lockedPacks) {
const pack = game.packs.get(packId);
await pack.configure({ locked: true });
}
lastMigrationVersion = '1.1.1';
}
await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.LastMigrationVersion, lastMigrationVersion);
}

View file

@ -270,7 +270,7 @@
"cost": [
{
"scalable": false,
"key": "stress",
"key": "fear",
"value": 1,
"keyIsID": false,
"step": null
@ -286,7 +286,7 @@
"type": "self",
"amount": null
},
"name": "Mark Stress",
"name": "Spend Fear",
"img": "icons/creatures/abilities/tail-strike-bone-orange.webp",
"range": ""
}

View file

@ -12,7 +12,7 @@
"type": "attack",
"_id": "a6WROv0OKx0lbYVa",
"systemPath": "actions",
"description": "",
"description": "<p>Choose an element for your breath (such as electricity, fire, or ice). You can use this breath against a target or group of targets within Very Close range, treating it as an Instinct weapon that deals <strong>d8</strong> magic damage using your Proficiency.</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
@ -102,10 +102,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1753994055921,
"modifiedTime": 1755394293348,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755938895948,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!sRaE3CgkgjBF1UpV"
}

View file

@ -77,10 +77,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754174600538,
"modifiedTime": 1755390999058,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943467705,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_id": "vegl3bFOq3pcFTWT",
"sort": 300000,

View file

@ -79,10 +79,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754222247012,
"modifiedTime": 1755391012909,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943479440,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!ZNwUTCyGCEcidZFv"
}

View file

@ -75,10 +75,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754246931974,
"modifiedTime": 1755391032291,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943488697,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!nRAyoC0fOzXPDa4z"
}

View file

@ -75,10 +75,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754268869310,
"modifiedTime": 1755391043325,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943505024,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!BTyfve69LKqoOi9S"
}

View file

@ -79,10 +79,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754325275832,
"modifiedTime": 1755391064025,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943515533,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!CvHlkHZfpMiCz5uT"
}

View file

@ -75,10 +75,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754351482530,
"modifiedTime": 1755391077728,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943523935,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!5ZnlJ5bEoyOTkUJv"
}

View file

@ -83,10 +83,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754349743129,
"modifiedTime": 1755391092028,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943536635,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!DchOzHcWIJE9FKcR"
}

View file

@ -79,10 +79,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754255776706,
"modifiedTime": 1755391103528,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943545980,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!xCUWwJz4WSthvLfy"
}

View file

@ -79,10 +79,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754253505323,
"modifiedTime": 1755391118180,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943555087,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!5LwX4m8ziY3F1ZGC"
}

View file

@ -12,7 +12,7 @@
"type": "effect",
"_id": "ZBVqSlsDUKf8uGrI",
"systemPath": "actions",
"description": "",
"description": "<p>Record three sayings or values your upbringing instilled in you. Once per rest, when you describe how youre embodying one of these principles through your current action, you can roll a d20 as your Hope Die</p>",
"chatDisplay": true,
"actionType": "action",
"cost": [],
@ -48,10 +48,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754010247432,
"modifiedTime": 1755394895431,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755938935013,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"sort": 0,
"ownership": {

View file

@ -35,7 +35,8 @@
"source": "Daggerheart SRD",
"page": 17,
"artist": ""
}
},
"linkedClass": "Compendium.daggerheart.classes.Item.BTyfve69LKqoOi9S"
},
"effects": [],
"sort": 0,
@ -50,10 +51,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754268237448,
"modifiedTime": 1755391910037,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943503629,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!TIUsIlTS1WkK5vr2"
}

View file

@ -31,7 +31,8 @@
"source": "Daggerheart SRD",
"page": 24,
"artist": ""
}
},
"linkedClass": "Compendium.daggerheart.classes.Item.xCUWwJz4WSthvLfy"
},
"effects": [],
"sort": 0,
@ -46,10 +47,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754256077777,
"modifiedTime": 1755392366229,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943544886,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!NAFU9roaVG7f3RNJ"
}

View file

@ -27,7 +27,8 @@
"source": "Daggerheart SRD",
"page": 24,
"artist": ""
}
},
"linkedClass": "Compendium.daggerheart.classes.Item.xCUWwJz4WSthvLfy"
},
"effects": [],
"sort": 0,
@ -42,10 +43,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754256112978,
"modifiedTime": 1755392375946,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943545973,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!bcNe5qP3o6CKadhK"
}

View file

@ -31,7 +31,8 @@
"source": "Daggerheart SRD",
"page": 21,
"artist": ""
}
},
"linkedClass": "Compendium.daggerheart.classes.Item.5ZnlJ5bEoyOTkUJv"
},
"effects": [],
"sort": 0,
@ -46,10 +47,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754352806098,
"modifiedTime": 1755392139199,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943522722,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!M5mpGoAj8LRkylrY"
}

View file

@ -27,7 +27,8 @@
"source": "Daggerheart SRD",
"page": 22,
"artist": ""
}
},
"linkedClass": "Compendium.daggerheart.classes.Item.DchOzHcWIJE9FKcR"
},
"effects": [],
"sort": 0,
@ -42,10 +43,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754349604941,
"modifiedTime": 1755392260989,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943535524,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!wg1H0hROc2acHwZh"
}

View file

@ -35,7 +35,8 @@
"source": "Daggerheart SRD",
"page": 19,
"artist": ""
}
},
"linkedClass": "Compendium.daggerheart.classes.Item.CvHlkHZfpMiCz5uT"
},
"effects": [],
"sort": 0,
@ -50,10 +51,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754322815758,
"modifiedTime": 1755392009996,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943514465,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!h161OSIK24Up4qNd"
}

View file

@ -27,7 +27,8 @@
"source": "Daggerheart SRD",
"page": 22,
"artist": ""
}
},
"linkedClass": "Compendium.daggerheart.classes.Item.DchOzHcWIJE9FKcR"
},
"effects": [],
"sort": 0,
@ -42,10 +43,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754349604941,
"modifiedTime": 1755392267640,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943536628,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!GLpRVxnY5E82khxH"
}

View file

@ -39,7 +39,8 @@
"source": "Daggerheart SRD",
"page": 25,
"artist": ""
}
},
"linkedClass": "Compendium.daggerheart.classes.Item.5LwX4m8ziY3F1ZGC"
},
"effects": [],
"sort": 0,
@ -54,10 +55,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754253538384,
"modifiedTime": 1755392466418,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943553625,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!qqQlgCqhOivUFoQn"
}

View file

@ -39,7 +39,8 @@
"source": "Daggerheart SRD",
"page": 25,
"artist": ""
}
},
"linkedClass": "Compendium.daggerheart.classes.Item.5LwX4m8ziY3F1ZGC"
},
"effects": [],
"sort": 0,
@ -54,10 +55,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754253587683,
"modifiedTime": 1755392474218,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943555081,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!4y9Ph7RsCIAbkwTk"
}

View file

@ -39,7 +39,8 @@
"source": "Daggerheart SRD",
"page": 16,
"artist": ""
}
},
"linkedClass": "Compendium.daggerheart.classes.Item.nRAyoC0fOzXPDa4z"
},
"effects": [],
"sort": 0,
@ -54,10 +55,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754245881893,
"modifiedTime": 1755391787981,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943487549,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!rKRxFBlkbh9cDK8K"
}

View file

@ -27,7 +27,8 @@
"source": "Daggerheart SRD",
"page": 20,
"artist": ""
}
},
"linkedClass": "Compendium.daggerheart.classes.Item.CvHlkHZfpMiCz5uT"
},
"effects": [],
"sort": 0,
@ -42,10 +43,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754323643089,
"modifiedTime": 1755392018277,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943515526,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!95QxNZwgyEm1LqdG"
}

View file

@ -26,7 +26,8 @@
"source": "Daggerheart SRD",
"page": 9,
"artist": ""
}
},
"linkedClass": "Compendium.daggerheart.classes.Item.vegl3bFOq3pcFTWT"
},
"effects": [],
"ownership": {
@ -40,10 +41,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754174653653,
"modifiedTime": 1755391532634,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943465827,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_id": "ld8MIvk0xVJydSBz",
"sort": 100000,

View file

@ -31,7 +31,8 @@
"source": "Daggerheart SRD",
"page": 16,
"artist": ""
}
},
"linkedClass": "Compendium.daggerheart.classes.Item.nRAyoC0fOzXPDa4z"
},
"effects": [],
"sort": 0,
@ -46,10 +47,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754246011733,
"modifiedTime": 1755391794966,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943488691,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!SUo8NPBPO8aN193u"
}

View file

@ -34,7 +34,8 @@
"source": "Daggerheart SRD",
"page": 11,
"artist": ""
}
},
"linkedClass": "Compendium.daggerheart.classes.Item.ZNwUTCyGCEcidZFv"
},
"effects": [],
"folder": "AZWrSJzGXltzQhAJ",
@ -50,10 +51,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754221346981,
"modifiedTime": 1755391677508,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943479431,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!xp0XMjYT85Q7E90o"
}

View file

@ -26,7 +26,8 @@
"source": "Daggerheart SRD",
"page": 11,
"artist": ""
}
},
"linkedClass": "Compendium.daggerheart.classes.Item.ZNwUTCyGCEcidZFv"
},
"effects": [],
"folder": "AZWrSJzGXltzQhAJ",
@ -42,10 +43,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754221102716,
"modifiedTime": 1755391669341,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943478132,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!W9hs5kxOWeY7eA4Q"
}

View file

@ -31,7 +31,8 @@
"source": "Daggerheart SRD",
"page": 17,
"artist": ""
}
},
"linkedClass": "Compendium.daggerheart.classes.Item.BTyfve69LKqoOi9S"
},
"effects": [],
"sort": 0,
@ -46,10 +47,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754268318903,
"modifiedTime": 1755391902003,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943505016,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!zsUglcU4NgZ8tNgZ"
}

View file

@ -31,7 +31,8 @@
"source": "Daggerheart SRD",
"page": 21,
"artist": ""
}
},
"linkedClass": "Compendium.daggerheart.classes.Item.5ZnlJ5bEoyOTkUJv"
},
"effects": [],
"sort": 0,
@ -46,10 +47,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754354451615,
"modifiedTime": 1755392149951,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943523928,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_key": "!items!y7ERWRIpJsdP9Re4"
}

View file

@ -30,7 +30,8 @@
"source": "Daggerheart SRD",
"page": 9,
"artist": ""
}
},
"linkedClass": "Compendium.daggerheart.classes.Item.vegl3bFOq3pcFTWT"
},
"effects": [],
"ownership": {
@ -44,10 +45,10 @@
"exportSource": null,
"coreVersion": "13.347",
"systemId": "daggerheart",
"systemVersion": "1.0.5",
"systemVersion": "1.1.0",
"createdTime": 1754174655078,
"modifiedTime": 1755391551654,
"lastModifiedBy": "VZIeX2YDvX338Zvr"
"modifiedTime": 1755943467695,
"lastModifiedBy": "tt3PwMBXcTLCtIQU"
},
"_id": "XTSODVM8st75Os8M",
"sort": 200000,

View file

@ -41,7 +41,7 @@
display: flex;
flex-wrap: wrap;
text-align: center;
font-size: 16px;
font-size: var(--font-size-16);
margin: 0 4px;
border: 1px solid light-dark(@dark-blue, @golden);
border-radius: 6px;
@ -135,7 +135,7 @@
align-items: center;
i {
font-size: 24px;
font-size: var(--font-size-24);
}
}

View file

@ -75,7 +75,7 @@
label {
position: absolute;
font-size: 18px;
font-size: var(--font-size-18);
font-weight: bold;
padding: 0 2px;
background-image: url(../assets/parchments/dh-parchment-light.png);
@ -141,7 +141,7 @@
.ancestry-preview-feature {
flex: 1;
font-size: 14px;
font-size: var(--font-size-14);
white-space: wrap;
padding: 0 2px;
border: 1px solid light-dark(@golden, @dark-blue);
@ -178,7 +178,7 @@
legend {
margin-left: auto;
margin-right: auto;
font-size: 28px;
font-size: var(--font-size-28);
font-weight: bold;
padding: 0 8px;
}
@ -191,7 +191,7 @@
justify-content: center;
legend {
font-size: 20px;
font-size: var(--font-size-20);
white-space: nowrap;
}
@ -343,7 +343,7 @@
border-radius: 50%;
height: 20px;
width: 20px;
font-size: 14px;
font-size: var(--font-size-14);
display: flex;
align-items: center;
justify-content: center;
@ -358,7 +358,7 @@
.descriptor {
position: absolute;
bottom: -8px;
font-size: 12px;
font-size: var(--font-size-12);
border-radius: 8px;
width: 56px;
text-align: center;
@ -400,7 +400,7 @@
legend {
margin-left: auto;
margin-right: auto;
font-size: 28px;
font-size: var(--font-size-28);
font-weight: bold;
padding: 0 8px;
white-space: nowrap;
@ -444,7 +444,7 @@
label {
position: absolute;
top: -8px;
font-size: 12px;
font-size: var(--font-size-12);
white-space: nowrap;
border: 1px solid light-dark(@dark-blue, @golden);
border-radius: 6px;
@ -472,7 +472,7 @@
legend {
margin-left: auto;
margin-right: auto;
font-size: 12px;
font-size: var(--font-size-12);
}
.suggestion-inner-container {
@ -490,7 +490,7 @@
label {
position: absolute;
top: -2px;
font-size: 12px;
font-size: var(--font-size-12);
}
img {

View file

@ -76,7 +76,7 @@
border-radius: 6px;
height: 26px;
padding: 0 1px;
font-size: 18px;
font-size: var(--font-size-18);
display: flex;
align-items: center;
justify-content: center;
@ -108,7 +108,7 @@
border-radius: 6px;
height: 26px;
padding: 0 4px;
font-size: 18px;
font-size: var(--font-size-18);
display: flex;
align-items: center;
justify-content: center;

View file

@ -23,7 +23,7 @@
width: auto;
opacity: 0.3;
border-radius: 50%;
font-size: 18px;
font-size: var(--font-size-18);
font-weight: bold;
&:hover {
@ -74,7 +74,7 @@
font-family: @font-subtitle;
font-style: normal;
font-weight: 700;
font-size: 16px;
font-size: var(--font-size-16);
line-height: 19px;
color: light-dark(@dark, @beige);
@ -102,7 +102,7 @@
.label {
font-style: normal;
font-weight: 400;
font-size: 14px;
font-size: var(--font-size-14);
line-height: 17px;
}
@ -127,7 +127,7 @@
.label {
font-style: normal;
font-weight: 400;
font-size: 14px;
font-size: var(--font-size-14);
line-height: 17px;
}

View file

@ -35,7 +35,7 @@
gap: 4px;
.activity-marker {
font-size: 8px;
font-size: 0.5rem;
flex: none;
color: light-dark(@dark-blue, @golden);
margin-right: 4px;
@ -54,7 +54,7 @@
}
.activity-selected-marker {
font-size: 14px;
font-size: var(--font-size-14);
border: 1px solid light-dark(@dark-blue, @golden);
border-radius: 6px;
color: light-dark(@dark, @beige);
@ -71,7 +71,7 @@
display: grid;
grid-template-columns: 1fr 1fr;
gap: 4px;
font-size: 12px;
font-size: var(--font-size-12);
&.wide {
grid-template-columns: 1fr 1fr 1fr 1fr;

View file

@ -21,7 +21,7 @@
background: light-dark(@dark-blue-40, @golden-40);
border-radius: 3px;
padding: 5px;
font-size: 16px;
font-size: var(--font-size-16);
gap: 4px;
width: 100%;
@ -38,7 +38,7 @@
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
font-size: var(--font-size-12);
}
}
}
@ -96,7 +96,7 @@
width: 54px;
border-radius: 50%;
border: 2px solid;
font-size: 48px;
font-size: var(--font-size-48);
display: flex;
align-items: center;
justify-content: center;
@ -133,7 +133,7 @@
.levelup-selections-title {
margin-left: auto;
margin-right: auto;
font-size: 22px;
font-size: 1.375rem;
font-weight: bold;
padding: 0 12px;
}

View file

@ -41,7 +41,7 @@
display: flex;
align-items: center;
gap: 4px;
font-size: 14px;
font-size: var(--font-size-14);
color: light-dark(@dark, @beige);
}
@ -49,7 +49,7 @@
display: flex;
align-items: center;
gap: 4px;
font-size: 16px;
font-size: var(--font-size-16);
color: light-dark(@dark, @beige);
margin-bottom: 5px;
}
@ -62,7 +62,7 @@
border: 2px solid;
border-radius: 3px;
padding: 0 4px;
font-size: 14px;
font-size: var(--font-size-14);
color: light-dark(@dark, @beige);
}
}

View file

@ -21,7 +21,7 @@
legend {
margin-left: auto;
margin-right: auto;
font-size: 22px;
font-size: 1.375rem;
font-weight: bold;
padding: 0 12px;
}
@ -60,7 +60,7 @@
}
.checkbox-group-label {
font-size: 12px;
font-size: var(--font-size-12);
font-style: italic;
}
}

View file

@ -37,7 +37,7 @@
display: flex;
align-items: center;
justify-content: center;
font-size: 22px;
font-size: 1.375rem;
opacity: 0.8;
&.selected {
@ -99,12 +99,12 @@
&:before,
&:after {
line-height: 12px;
font-size: 12px;
font-size: var(--font-size-12);
}
}
i {
font-size: 10px;
font-size: var(--font-size-10);
}
}
}

View file

@ -71,7 +71,7 @@
color: @beige;
h4 {
font-size: 16px;
font-size: var(--font-size-16);
font-weight: bold;
margin-bottom: 0;
font-family: @font-subtitle;
@ -86,7 +86,7 @@
.flavor-text {
font-size: var(--font-size-12);
line-height: 20px;
color: var(--color-dark-4);
color: light-dark(@dark, @beige);
text-align: center;
display: block;
}

View file

@ -50,7 +50,7 @@
.formula-label {
font-style: normal;
font-weight: 500;
font-size: 14px;
font-size: var(--font-size-14);
line-height: 17px;
white-space: nowrap;
color: light-dark(@dark, @beige);

View file

@ -165,7 +165,7 @@
z-index: 1;
.remove {
font-size: 10px;
font-size: var(--font-size-10);
}
}
}
@ -400,7 +400,7 @@
display: flex;
flex-direction: column;
white-space: nowrap;
font-size: 14px;
font-size: var(--font-size-14);
font-weight: 400;
&.modifier-label {
@ -527,7 +527,7 @@
font-family: @font-body;
margin-top: 4px;
color: light-dark(#14142599, #efe6d850);
font-size: 12px;
font-size: var(--font-size-12);
padding-left: 3px;
}
}
@ -541,7 +541,7 @@
text-align: center;
}
.title-hint {
font-size: 12px;
font-size: var(--font-size-12);
font-variant: small-caps;
text-align: center;
}
@ -605,7 +605,7 @@
align-items: center;
label {
font-size: 16px;
font-size: var(--font-size-16);
}
.form-fields {
@ -776,7 +776,7 @@
.preview-text-container {
padding: 10px 0;
text-align: center;
font-size: 16px;
font-size: var(--font-size-16);
color: light-dark(@beige, @dark);
background-image: url(../assets/parchments/dh-parchment-light.png);
border-radius: 0 0 4px 4px;
@ -799,14 +799,14 @@
justify-content: center;
.preview-add-icon {
font-size: 40px;
font-size: var(--font-size-40);
color: light-dark(@dark-blue-50, @beige-50);
}
.preview-empty-subtext {
position: absolute;
bottom: 5%;
font-size: 10px;
font-size: var(--font-size-10);
font-variant: small-caps;
text-align: center;
font-style: italic;
@ -821,7 +821,7 @@
width: 54px;
border-radius: 50%;
border: 2px solid;
font-size: 48px;
font-size: var(--font-size-48);
display: flex;
align-items: center;
justify-content: center;

View file

@ -0,0 +1,14 @@
.measured-template-button,
.enriched-damage-button,
.duality-roll-button {
display: inline;
&.inline {
min-height: unset;
height: 18px;
}
i {
font-size: 12px;
}
}

View file

@ -0,0 +1,12 @@
.drag-area {
display: flex;
align-items: center;
justify-content: center;
box-sizing: border-box;
width: 100%;
height: 40px;
border: 1px dashed light-dark(@dark-blue-50, @beige-50);
border-radius: 3px;
color: light-dark(@dark-blue-50, @beige-50);
font-family: @font-body;
}

View file

@ -2,6 +2,8 @@
@import './dialog.less';
@import './chat.less';
@import './elements.less';
@import './enrichment.less';
@import './global.less';
@import './tab-navigation.less';
@import './tab-form-footer.less';
@import './tab-actions.less';

View file

@ -105,7 +105,7 @@
align-self: center;
.item-name {
font-size: 14px;
font-size: var(--font-size-14);
.expanded-icon {
display: none;
@ -121,9 +121,10 @@
.label {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
font-size: 12px;
font-size: var(--font-size-12);
flex-wrap: wrap;
justify-content: start;
}
.tag {
@ -179,18 +180,18 @@
overflow: hidden;
h1 {
font-size: 32px;
font-size: var(--font-size-32);
}
h2 {
font-size: 28px;
font-size: var(--font-size-28);
font-weight: 600;
}
h3 {
font-size: 20px;
font-size: var(--font-size-20);
font-weight: 600;
}
h4 {
font-size: 16px;
font-size: var(--font-size-16);
color: @beige;
font-weight: 600;
}
@ -231,7 +232,7 @@
label {
color: light-dark(white, black);
filter: drop-shadow(0 0 1px light-dark(@dark-blue, @golden));
font-size: 18px;
font-size: var(--font-size-18);
}
img {
@ -243,7 +244,7 @@
text-shadow: 0 0 3px white;
filter: drop-shadow(0 1px white);
color: black;
font-size: 26px;
font-size: 1.625rem;
}
}
}
@ -310,7 +311,7 @@
.card-name {
font-style: normal;
font-weight: 400;
font-size: 12px;
font-size: var(--font-size-12);
line-height: 15px;
color: @beige;
@ -351,7 +352,7 @@
gap: 4px;
.resource-edit {
font-size: 14px;
font-size: var(--font-size-14);
}
}
@ -363,7 +364,7 @@
i {
flex: none;
font-size: 14px;
font-size: var(--font-size-14);
}
input {
@ -383,7 +384,7 @@
color: light-dark(white, black);
filter: drop-shadow(0 0 1px light-dark(@dark-blue, @golden));
z-index: 2;
font-size: 18px;
font-size: var(--font-size-18);
cursor: pointer;
}
@ -397,7 +398,7 @@
text-shadow: 0 0 3px white;
filter: drop-shadow(0 1px white);
color: black;
font-size: 26px;
font-size: 1.625rem;
}
}
}

View file

@ -35,7 +35,7 @@
width: 80%;
.item-name input[type='text'] {
font-size: 32px;
font-size: var(--font-size-32);
height: 42px;
text-align: center;
width: 90%;
@ -103,7 +103,7 @@
transition: all 0.3s ease;
.recall-label {
font-size: 14px;
font-size: var(--font-size-14);
opacity: 0;
margin-right: 0.3rem;
transition: all 0.3s ease;
@ -141,7 +141,7 @@
.item-name {
input[type='text'] {
font-size: 32px;
font-size: var(--font-size-32);
height: 42px;
text-align: center;
width: 90%;

View file

@ -12,18 +12,18 @@
scrollbar-width: thin;
scrollbar-color: light-dark(@dark-blue, @golden) transparent;
h1 {
font-size: 32px;
font-size: var(--font-size-32);
}
h2 {
font-size: 28px;
font-size: var(--font-size-28);
font-weight: 600;
}
h3 {
font-size: 20px;
font-size: var(--font-size-20);
font-weight: 600;
}
h4 {
font-size: 16px;
font-size: var(--font-size-16);
color: @beige;
font-weight: 600;
}

View file

@ -33,7 +33,7 @@
div {
filter: drop-shadow(0 0 3px black);
text-shadow: 0 0 3px black;
font-size: 12px;
font-size: var(--font-size-12);
}
input {

View file

@ -34,17 +34,5 @@
width: 100%;
}
}
.adversaries-dragger {
display: flex;
align-items: center;
justify-content: center;
box-sizing: border-box;
width: 100%;
height: 40px;
border: 1px dashed light-dark(@dark-blue-50, @beige-50);
border-radius: 3px;
color: light-dark(@dark-blue-50, @beige-50);
}
}
}

View file

@ -10,7 +10,7 @@
font-family: @font-subtitle;
font-style: normal;
font-weight: 700;
font-size: 24px;
font-size: var(--font-size-24);
margin: 0;
text-align: center;
color: light-dark(@dark-blue, @golden);

View file

@ -18,7 +18,7 @@
flex: 1;
input[type='text'] {
font-size: 32px;
font-size: var(--font-size-32);
height: 42px;
text-align: start;
border: 1px solid transparent;
@ -42,7 +42,7 @@
justify-content: center;
align-items: center;
padding: 3px 5px;
font-size: 12px;
font-size: var(--font-size-12);
font: @font-body;
background: light-dark(@dark-15, @beige-15);
@ -55,7 +55,7 @@
flex-direction: row;
justify-content: center;
align-items: center;
font-size: 12px;
font-size: var(--font-size-12);
}
}

View file

@ -74,7 +74,7 @@
height: 30px;
h4 {
font-size: 14px;
font-size: var(--font-size-14);
font-weight: bold;
text-transform: uppercase;
color: light-dark(@dark-blue, @golden);
@ -255,7 +255,7 @@
font-weight: bold;
text-align: center;
line-height: 18px;
font-size: 12px;
font-size: var(--font-size-12);
color: light-dark(@beige, @dark-blue);
}
}
@ -295,7 +295,7 @@
align-items: center;
h3 {
font-size: 20px;
font-size: var(--font-size-20);
}
}
.items-list {
@ -315,7 +315,7 @@
align-items: center;
h3 {
font-size: 20px;
font-size: var(--font-size-20);
}
}
@ -337,7 +337,7 @@
.experience-name {
width: 180px;
text-align: start;
font-size: 14px;
font-size: var(--font-size-14);
color: light-dark(@dark, @beige);
}
}
@ -345,7 +345,7 @@
.experience-value {
height: 25px;
width: 35px;
font-size: 14px;
font-size: var(--font-size-14);
color: light-dark(@dark, @beige);
align-content: center;
text-align: center;

View file

@ -41,7 +41,7 @@
flex: 1;
input[type='text'] {
font-size: 32px;
font-size: var(--font-size-32);
height: 42px;
text-align: start;
border: 1px solid transparent;
@ -72,7 +72,7 @@
.level-button {
color: light-dark(@dark, @beige);
font-size: 18px;
font-size: var(--font-size-18);
line-height: 1;
min-height: unset;
height: min-content;
@ -97,7 +97,7 @@
justify-content: space-between;
padding: 5px 0;
margin-bottom: 10px;
font-size: 12px;
font-size: var(--font-size-12);
color: light-dark(@dark-blue, @golden);
.missing-header-feature {
@ -158,7 +158,7 @@
height: 30px;
h4 {
font-size: 14px;
font-size: var(--font-size-14);
font-weight: bold;
text-transform: uppercase;
color: light-dark(@dark-blue, @golden);
@ -170,7 +170,7 @@
gap: 5px;
.label {
font-size: 14px;
font-size: var(--font-size-14);
font-weight: bold;
text-transform: uppercase;
color: light-dark(@dark-blue, @golden);
@ -205,7 +205,7 @@
align-items: center;
padding-top: 5px;
color: light-dark(@dark-blue, @golden);
font-size: 14px;
font-size: var(--font-size-14);
font-weight: 600;
align-items: center;
justify-content: center;
@ -213,14 +213,14 @@
i {
line-height: 17px;
font-size: 10px;
font-size: var(--font-size-10);
}
}
.trait-value {
font-style: normal;
font-weight: 400;
font-size: 20px;
font-size: var(--font-size-20);
text-align: center;
}
}

View file

@ -26,10 +26,6 @@
outline: 2px solid light-dark(@dark, @golden);
}
&:placeholder {
color: light-dark(@dark-blue-50, @beige-50);
}
&::-webkit-search-cancel-button {
-webkit-appearance: none;
display: none;
@ -41,7 +37,7 @@
height: 32px;
position: absolute;
right: 20px;
font-size: 16px;
font-size: var(--font-size-16);
z-index: 1;
color: light-dark(@dark-blue-50, @beige-50);
}

View file

@ -26,10 +26,6 @@
outline: 2px solid light-dark(@dark, @golden);
}
&:placeholder {
color: light-dark(@dark-blue-50, @beige-50);
}
&::-webkit-search-cancel-button {
-webkit-appearance: none;
display: none;
@ -41,7 +37,7 @@
height: 32px;
position: absolute;
right: 20px;
font-size: 16px;
font-size: var(--font-size-16);
z-index: 1;
color: light-dark(@dark-blue-50, @beige-50);
}

View file

@ -11,6 +11,21 @@
padding-bottom: 0;
overflow-x: auto;
&.viewMode {
button:not(.btn-toggle-view),
input:not(.search),
.controls,
.character-sidebar-sheet,
.img-portait,
.name-row,
.hope-section,
.downtime-section,
.character-traits,
.card-list {
pointer-events: none;
}
}
.character-sidebar-sheet {
grid-row: 1 / span 2;
grid-column: 1;

View file

@ -89,7 +89,7 @@
transition: all 0.3s ease;
.spellcast-label {
font-size: 14px;
font-size: var(--font-size-14);
opacity: 0;
margin-right: 0.3rem;
transition: all 0.3s ease;
@ -258,7 +258,7 @@
text-align: center;
line-height: 18px;
color: light-dark(@beige, @dark-blue);
font-size: 12px;
font-size: var(--font-size-12);
}
}
.status-value {
@ -402,7 +402,7 @@
font-weight: bold;
text-align: center;
line-height: 18px;
font-size: 12px;
font-size: var(--font-size-12);
color: light-dark(@beige, @dark-blue);
}
}
@ -424,7 +424,7 @@
height: 30px;
h4 {
font-size: 14px;
font-size: var(--font-size-14);
font-weight: bold;
text-transform: uppercase;
color: light-dark(@dark-blue, @golden);
@ -490,7 +490,7 @@
.experience-value {
height: 25px;
width: 35px;
font-size: 14px;
font-size: var(--font-size-14);
color: light-dark(@dark, @beige);
align-content: center;
text-align: center;

View file

@ -16,7 +16,7 @@
width: 100%;
h3 {
font-size: 20px;
font-size: var(--font-size-20);
}
}
.items-list {
@ -58,7 +58,7 @@
.experience-name {
width: 180px;
text-align: start;
font-size: 14px;
font-size: var(--font-size-14);
color: light-dark(@dark, @beige);
}
}
@ -66,7 +66,7 @@
.experience-value {
height: 25px;
width: 35px;
font-size: 14px;
font-size: var(--font-size-14);
color: light-dark(@dark, @beige);
align-content: center;
text-align: center;
@ -77,4 +77,17 @@
}
}
}
.action-section {
display: flex;
padding: 0 10px;
margin-top: 20px;
width: 100%;
button {
height: 40px;
width: 100%;
font-weight: 600;
}
}
}

View file

@ -24,7 +24,7 @@
margin-bottom: -30px;
input[type='text'] {
font-size: 24px;
font-size: var(--font-size-24);
height: 32px;
text-align: center;
border: 1px solid transparent;
@ -78,7 +78,7 @@
font-weight: bold;
text-align: center;
line-height: 18px;
font-size: 12px;
font-size: var(--font-size-12);
color: light-dark(@beige, @dark-blue);
}
}
@ -209,7 +209,7 @@
.level-button {
color: light-dark(@dark, @beige);
font-size: 18px;
font-size: var(--font-size-18);
line-height: 1;
min-height: unset;
height: min-content;

View file

@ -39,7 +39,7 @@
justify-content: center;
align-items: center;
padding: 3px 5px;
font-size: 12px;
font-size: var(--font-size-12);
font: @font-body;
background: light-dark(@dark-15, @beige-15);
@ -52,7 +52,7 @@
flex-direction: row;
justify-content: center;
align-items: center;
font-size: 12px;
font-size: var(--font-size-12);
}
}
@ -100,7 +100,7 @@
font-weight: bold;
text-align: center;
line-height: 18px;
font-size: 12px;
font-size: var(--font-size-12);
color: light-dark(@beige, @dark-blue);
}
}
@ -108,7 +108,7 @@
.item-name {
input[type='text'] {
font-size: 32px;
font-size: var(--font-size-32);
height: 42px;
text-align: start;
transition: all 0.3s ease;

View file

@ -2,7 +2,7 @@
@import '../../utils/fonts.less';
@import '../../utils/spacing.less';
.theme-light {
#interface.theme-light {
.daggerheart.chat.domain-card {
.domain-card-move .domain-card-header {
border-bottom: 1px solid @dark-blue;
@ -87,7 +87,7 @@
gap: 5px;
.title {
font-size: 20px;
font-size: var(--font-size-20);
color: @golden;
font-weight: 700;
}
@ -103,7 +103,7 @@
justify-content: center;
align-items: center;
padding: 3px 5px;
font-size: 12px;
font-size: var(--font-size-12);
background: @beige-15;
border: 1px solid @beige;

View file

@ -2,7 +2,7 @@
@import '../../utils/fonts.less';
@import '../../utils/spacing.less';
.theme-light {
#interface.theme-light {
.daggerheart.chat.action {
.action-move .action-section {
border-bottom: 1px solid @dark-blue;
@ -79,15 +79,16 @@
display: flex;
flex-direction: column;
gap: 5px;
color: @beige;
.title {
font-size: 20px;
font-size: var(--font-size-20);
color: @golden;
font-weight: 700;
}
.label {
font-size: 12px;
font-size: var(--font-size-12);
color: @beige;
margin: 0;
}

View file

@ -2,54 +2,139 @@
@import '../../utils/fonts.less';
@import '../../utils/spacing.less';
.theme-light {
.daggerheart,
#chat-notifications {
#interface.theme-light {
.daggerheart.chat-sidebar .chat-log,
#chat-notifications .chat-log {
--text-color: @dark-blue;
--bg-color: @dark-blue-40;
.message-content .chat-roll {
.roll-part-header {
span,
span:before,
span:after {
color: @dark-blue;
}
&:before {
background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, @dark-blue 100%);
color: @dark-blue;
.chat-message {
.roll-formula {
background: @dark-15;
color: @dark;
}
&:after {
background: linear-gradient(90deg, @dark-blue 0%, rgba(0, 0, 0, 0) 100%);
color: @dark-blue;
}
}
.roll-section {
.roll-part-content {
.roll-result-value {
color: @dark-blue;
&.duality {
background-image: url(../assets/parchments/dh-parchment-dark.png);
.message-content {
color: @beige;
}
.dice-tooltip .wrapper .roll-die {
.roll-formula {
background: @dark-15;
color: @dark;
}
.message-header {
.message-sub-header-container {
color: @beige;
h4 {
color: @golden;
}
}
.message-header-metadata {
.message-metadata {
color: @beige;
}
}
}
&.hope {
--text-color: @golden;
--bg-color: @golden-40;
.message-header,
.message-content {
background-color: @golden-bg;
}
.roll-formula {
background: var(--bg-color);
color: var(--text-color);
}
}
.chat-message .roll-formula {
background: @dark-15;
&.fear {
--text-color: @chat-blue;
--bg-color: @chat-blue-40;
.message-header,
.message-content {
background-color: @chat-blue-bg;
}
.roll-formula {
background: var(--bg-color);
color: var(--text-color);
}
}
&.critical {
--text-color: @chat-purple;
--bg-color: @chat-purple-40;
.message-header,
.message-content {
background-color: @chat-purple-bg;
}
.roll-formula {
background: var(--bg-color);
color: var(--text-color);
}
}
}
&:not(.duality) {
.font-20 {
color: @dark;
}
.roll-die {
color: @beige;
}
fieldset {
color: @dark-blue;
border-color: @dark-blue;
legend {
color: @dark-blue;
}
}
.chat-roll {
.roll-part-header {
color: @dark-blue;
span::before,
span::after {
color: @dark-blue;
}
&:before {
background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, @dark-blue 100%);
}
&:after {
background: linear-gradient(90deg, @dark-blue 0%, rgba(0, 0, 0, 0) 100%);
}
}
.roll-part-content {
&.dice-result {
color: @dark;
}
.roll-result-container {
color: @dark-blue;
}
}
}
}
}
}
}
.daggerheart.chat {
&.resource-roll {
.reroll-message {
color: @beige;
text-align: center;
font-size: 18px;
font-size: var(--font-size-18);
margin-bottom: 0;
}
}
@ -191,7 +276,7 @@
position: absolute;
top: 0;
right: 0;
font-size: 10px;
font-size: var(--font-size-10);
z-index: 2;
filter: drop-shadow(0 0 3px black);
}

View file

@ -2,7 +2,7 @@
@import '../../utils/fonts.less';
@import '../../utils/spacing.less';
.theme-light {
#interface.theme-light {
.daggerheart.chat.downtime {
.downtime-moves-list .downtime-move {
&:hover {
@ -82,12 +82,12 @@
.header-label {
padding: 8px;
.title {
font-size: 16px;
font-size: var(--font-size-16);
color: @golden;
font-weight: 700;
}
.label {
font-size: 12px;
font-size: var(--font-size-12);
color: @beige;
margin: 0;
}

View file

@ -1,8 +1,8 @@
@import '../../utils/colors.less';
@import '../../utils/fonts.less';
.theme-light {
.chat-message .message-content {
#interface.theme-light {
.chat-message:not(.duality) .message-content {
color: @dark;
blockquote {
@ -58,6 +58,12 @@
font-family: @font-body;
font-weight: bold;
}
.dice-roll .dice-formula,
.dice-roll .dice-total {
background: @dark-blue-40;
color: @dark-blue;
}
}
}
@ -158,8 +164,8 @@
.dice-roll .dice-total {
box-shadow: none;
border: none;
background: light-dark(@dark-blue-40, @golden-40);
color: light-dark(@dark-blue, @golden);
background: @golden-10;
color: @golden;
font-weight: 600;
align-content: center;
}

View file

@ -17,7 +17,7 @@
display: flex;
align-items: center;
justify-content: center;
font-size: 10px;
font-size: var(--font-size-10);
padding: 8px;
--button-size: 0;

View file

@ -47,7 +47,7 @@
position: absolute;
top: 8px;
right: 8px;
font-size: 18px;
font-size: var(--font-size-18);
}
.countdown-container {

View file

@ -21,3 +21,4 @@
@import './settings/settings.less';
@import './settings/homebrew-settings/domains.less';
@import './settings/homebrew-settings/types.less';

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