mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-07-21 18:09:54 +02:00
Merge branch 'main' into feature/reload-check
This commit is contained in:
commit
8158c1f9ff
66 changed files with 1623 additions and 1723 deletions
18
README.md
18
README.md
|
|
@ -2,11 +2,17 @@
|
|||
|
||||
## Table of Contents
|
||||
|
||||
- [Overview](#overview)
|
||||
- [User Install Guide](#user-install)
|
||||
- [Documentation](#documentation)
|
||||
- [Developer Setup](#development-setup)
|
||||
- [Contribution Info](#contributing)
|
||||
- [Foundryborne Daggerheart](#foundryborne-daggerheart)
|
||||
- [Table of Contents](#table-of-contents)
|
||||
- [Overview](#overview)
|
||||
- [User Install](#user-install)
|
||||
- [Documentation](#documentation)
|
||||
- [Development Setup](#development-setup)
|
||||
- [Available Scripts](#available-scripts)
|
||||
- [Notes](#notes)
|
||||
- [Contributing](#contributing)
|
||||
- [AI Policy](#ai-policy)
|
||||
- [Disclaimer](#disclaimer)
|
||||
|
||||
## Overview
|
||||
|
||||
|
|
@ -72,7 +78,7 @@ Looking to contribute to the project? Look no further, check out our [contributi
|
|||
|
||||
The Foundryborne Daggerheart system does not make use of AI (generative or otherwise) for any area of its implementation. We expect all contributors to follow this same policy when contributing with a pull request; contributions made using AI will be rejected outright.
|
||||
|
||||
## Disclaimer:
|
||||
## Disclaimer
|
||||
|
||||
**Daggerheart System**
|
||||
Daggerheart is a trademark of Darrington Press LLC. All original content, mechanics, and intellectual property related to the Daggerheart roleplaying game are © Darrington Press LLC.
|
||||
|
|
|
|||
23
daggerheart.d.ts
vendored
23
daggerheart.d.ts
vendored
|
|
@ -4,6 +4,15 @@ import '@common/primitives/global.mjs';
|
|||
import Canvas from '@client/canvas/board.mjs';
|
||||
import { ResourceUpdateMap } from './module/data/action/baseAction.mjs';
|
||||
|
||||
import * as applications from './module/applications/_module.mjs';
|
||||
import * as data from './module/data/_module.mjs';
|
||||
import * as models from './module/data/_module.mjs';
|
||||
import * as documents from './module/documents/_module.mjs';
|
||||
import { macros } from './module/_module.mjs';
|
||||
import * as dice from './module/dice/_module.mjs';
|
||||
import * as fields from './module/data/fields/_module.mjs';
|
||||
|
||||
|
||||
// Foundry's use of `Object.assign(globalThis) means many globally available objects are not read as such
|
||||
// This declare global hopefully fixes that
|
||||
// Note: eslint is not aware of these, whatever is added here should go in the eslint's globals list
|
||||
|
|
@ -80,3 +89,17 @@ declare global {
|
|||
damageOptions: object;
|
||||
}
|
||||
}
|
||||
|
||||
declare module '@client/packages/system.mjs' {
|
||||
export default interface System {
|
||||
api: {
|
||||
applications: typeof applications,
|
||||
data: typeof data,
|
||||
models: typeof models,
|
||||
documents: typeof documents,
|
||||
macros: typeof macros,
|
||||
dice: typeof dice,
|
||||
fields: typeof fields
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -84,6 +84,7 @@
|
|||
"transformActorMissing": "The assigned actor to transform into does not exist. It was probably deleted or moved in/out of a compendium",
|
||||
"canvasError": "There is no active scene.",
|
||||
"prototypeError": "You can only use a transform action from a Token",
|
||||
"linkedSelectedError": "To transform a linked actor there either needs to be only a single token of it on the canvas, or you need to left-click select only one of them.",
|
||||
"actorLinkError": "You cannot transform a token with Actor Link set to true"
|
||||
}
|
||||
},
|
||||
|
|
@ -113,7 +114,8 @@
|
|||
"area": {
|
||||
"sectionTitle": "Areas",
|
||||
"shape": "Shape",
|
||||
"size": "Size"
|
||||
"size": "Size",
|
||||
"hasHole": "Area Hole"
|
||||
},
|
||||
"displayInChat": "Display in chat",
|
||||
"deleteTriggerTitle": "Delete Trigger",
|
||||
|
|
@ -874,6 +876,10 @@
|
|||
"bruiser": "for each Bruiser adversary.",
|
||||
"solo": "for each Solo adversary."
|
||||
},
|
||||
"AreaTypes": {
|
||||
"attached": { "label": "Attached To Token" },
|
||||
"placed": { "label": "Placed In Scene" }
|
||||
},
|
||||
"ArmorInteraction": {
|
||||
"none": { "label": "Ignores Armor" },
|
||||
"active": { "label": "Active w/ Armor" },
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ export default class AdversarySheet extends DHBaseActorSheet {
|
|||
/** @inheritDoc */
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: ['adversary'],
|
||||
position: { width: 660, height: 766 },
|
||||
position: { width: 645, height: 750 },
|
||||
window: { resizable: true },
|
||||
actions: {
|
||||
toggleHitPoints: AdversarySheet.#toggleHitPoints,
|
||||
|
|
@ -58,12 +58,13 @@ export default class AdversarySheet extends DHBaseActorSheet {
|
|||
template: 'systems/daggerheart/templates/sheets/actors/adversary/features.hbs',
|
||||
scrollable: ['.feature-section']
|
||||
},
|
||||
notes: {
|
||||
template: 'systems/daggerheart/templates/sheets/actors/adversary/notes.hbs'
|
||||
},
|
||||
effects: {
|
||||
template: 'systems/daggerheart/templates/sheets/actors/adversary/effects.hbs',
|
||||
scrollable: ['.effects-sections']
|
||||
},
|
||||
notes: {
|
||||
template: 'systems/daggerheart/templates/sheets/actors/adversary/notes.hbs',
|
||||
scrollable: ['.editor-content']
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1057,7 +1057,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
|
|||
direction: 'DOWN'
|
||||
});
|
||||
|
||||
html.querySelectorAll('.armor-slot').forEach(element => {
|
||||
html.querySelectorAll('.armor .slot').forEach(element => {
|
||||
element.addEventListener('click', CharacterSheet.armorSourcePipUpdate);
|
||||
});
|
||||
}
|
||||
|
|
@ -1072,7 +1072,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
|
|||
|
||||
/** Update specific armor source */
|
||||
static async armorSourcePipUpdate(event) {
|
||||
const target = event.target.closest('.armor-slot');
|
||||
const target = event.target.closest('.slot');
|
||||
const { uuid, value } = target.dataset;
|
||||
const document = await foundry.utils.fromUuid(uuid);
|
||||
|
||||
|
|
@ -1100,7 +1100,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
|
|||
}
|
||||
|
||||
const container = target.closest('.slot-bar');
|
||||
for (const armorSlot of container.querySelectorAll('.armor-slot i')) {
|
||||
for (const armorSlot of container.querySelectorAll('.armor .slot i')) {
|
||||
const index = Number.parseInt(armorSlot.dataset.index);
|
||||
if (decreasing && index >= newCurrent) {
|
||||
armorSlot.classList.remove('fa-shield');
|
||||
|
|
|
|||
|
|
@ -305,7 +305,7 @@ export default function DHApplicationMixin(Base) {
|
|||
_preSyncPartState(partId, newElement, priorElement, state) {
|
||||
super._preSyncPartState(partId, newElement, priorElement, state);
|
||||
for (const el of priorElement.querySelectorAll('.extensible.extended')) {
|
||||
const { actionId, itemUuid } = el.parentElement.dataset;
|
||||
const { actionId, itemUuid } = el.closest('[data-item-uuid], [data-action-id]').dataset;
|
||||
const selector = `${actionId ? `[data-action-id="${actionId}"]` : `[data-item-uuid="${itemUuid}"]`} .extensible`;
|
||||
const newExtensible = newElement.querySelector(selector);
|
||||
newExtensible?.classList.add('extended');
|
||||
|
|
|
|||
|
|
@ -39,6 +39,12 @@ export default class DhEffectsDisplay extends HandlebarsApplicationMixin(Applica
|
|||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Debounce and slightly delayed request to re-render this panel. Necessary for situations where it is not possible
|
||||
* to properly wait for promises to resolve before refreshing the UI.
|
||||
*/
|
||||
refresh = foundry.utils.debounce(this.render.bind(this), 50);
|
||||
|
||||
get element() {
|
||||
return document.body.querySelector('.daggerheart.dh-style.effects-display');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@ export default class DhRegionLayer extends foundry.canvas.layers.RegionLayer {
|
|||
return inBounds.length === 1 ? inBounds[0] : null;
|
||||
}
|
||||
|
||||
static getTemplateShape({ type, angle, range, direction } = {}) {
|
||||
static getTemplateShape({ shapeType, angle, range, direction, hasHole } = {}) {
|
||||
const { line, rectangle, inFront, cone, circle, emanation } = CONFIG.DH.GENERAL.templateTypes;
|
||||
|
||||
/* Length calculation */
|
||||
|
|
@ -112,11 +112,11 @@ export default class DhRegionLayer extends foundry.canvas.layers.RegionLayer {
|
|||
|
||||
const shapeData = {
|
||||
...canvas.mousePosition,
|
||||
type: type,
|
||||
type: shapeType,
|
||||
direction: direction ?? 0
|
||||
};
|
||||
|
||||
switch (type) {
|
||||
switch (shapeType) {
|
||||
case rectangle.id:
|
||||
shapeData.width = length;
|
||||
shapeData.height = length;
|
||||
|
|
@ -145,7 +145,8 @@ export default class DhRegionLayer extends foundry.canvas.layers.RegionLayer {
|
|||
y: 0,
|
||||
width: 1,
|
||||
height: 1,
|
||||
shape: game.canvas.grid.isHexagonal ? CONST.TOKEN_SHAPES.ELLIPSE_1 : CONST.TOKEN_SHAPES.RECTANGLE_1
|
||||
shape: game.canvas.grid.isHexagonal ? CONST.TOKEN_SHAPES.ELLIPSE_1 : CONST.TOKEN_SHAPES.RECTANGLE_1,
|
||||
hole: hasHole
|
||||
};
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -119,6 +119,10 @@ export const advantageState = {
|
|||
export const areaTypes = {
|
||||
placed: {
|
||||
id: 'placed',
|
||||
label: 'Placed Area'
|
||||
label: 'DAGGERHEART.CONFIG.AreaTypes.placed.label'
|
||||
},
|
||||
attached: {
|
||||
id: 'attached',
|
||||
label: 'DAGGERHEART.CONFIG.AreaTypes.attached.label'
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -114,7 +114,10 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
|
|||
return this._id;
|
||||
}
|
||||
|
||||
/** Returns true if the current user is the owner of the containing item */
|
||||
/**
|
||||
* Returns true if the current user is the owner of the containing item.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
get isOwner() {
|
||||
return this.item?.isOwner ?? true;
|
||||
}
|
||||
|
|
@ -143,6 +146,7 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
|
|||
|
||||
/**
|
||||
* Return the first Actor parent found.
|
||||
* @returns {DhpActor | null}
|
||||
*/
|
||||
get actor() {
|
||||
return this.item instanceof DhpActor
|
||||
|
|
@ -155,6 +159,7 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
|
|||
/**
|
||||
* Returns true if the action is usable.
|
||||
* An action is usable on any actor type. For example, an adversary might have a base attack action.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
get usable() {
|
||||
const actor = this.actor;
|
||||
|
|
|
|||
|
|
@ -2,8 +2,14 @@ import { calculateExpectedValue, parseTermsFromSimpleFormula } from '../../helpe
|
|||
import { adversaryExpectedDamage, adversaryScalingData } from '../../config/actorConfig.mjs';
|
||||
import { parseInlineParams } from '../../enrichers/parser.mjs';
|
||||
|
||||
/**
|
||||
* Accepts source data for an adversary and a target tier, and returns new source data
|
||||
* @type {object} source
|
||||
* @type {number} tier
|
||||
* @returns {object} adjusted source data
|
||||
*/
|
||||
export function getTierAdjustedAdversary(source, tier) {
|
||||
const currentTier = source.tier ?? 1;
|
||||
const currentTier = source.system.tier ?? 1;
|
||||
|
||||
/** @type {(2 | 3 | 4)[]} */
|
||||
const tiers = new Array(Math.abs(tier - currentTier))
|
||||
|
|
@ -35,7 +41,7 @@ export function getTierAdjustedAdversary(source, tier) {
|
|||
// Store initial attack damage for abilities that have you deal a "standard attack"
|
||||
const initialAttack = {
|
||||
type: source.system.attack.damage?.parts.hitPoints?.type?.toSorted(),
|
||||
value: getDamagePartsFormula(source.system.attack.damage?.parts.hitPoints?.value)
|
||||
value: getFormula(source.system.attack.damage?.parts.hitPoints?.value)
|
||||
};
|
||||
|
||||
// Update damage of base attack.
|
||||
|
|
@ -45,9 +51,9 @@ export function getTierAdjustedAdversary(source, tier) {
|
|||
|
||||
for (const property of ['value', 'valueAlt']) {
|
||||
const data = damage.parts.hitPoints[property];
|
||||
const previousFormula = getDamagePartsFormula(data);
|
||||
const { value, formula } = calculateAdjustedDamage(previousFormula, 'attack', damageMeta);
|
||||
applyAdjustedDamage(data, value, formula);
|
||||
const previousFormula = getFormula(data);
|
||||
const value = calculateAdjustedDamage(previousFormula, 'attack', damageMeta);
|
||||
applyAdjustedDamage(data, value);
|
||||
}
|
||||
} catch (err) {
|
||||
ui.notifications.warn('Failed to convert attack damage of adversary');
|
||||
|
|
@ -65,7 +71,7 @@ export function getTierAdjustedAdversary(source, tier) {
|
|||
if (!formula) return match;
|
||||
|
||||
try {
|
||||
const newFormula = calculateAdjustedDamage(formula, 'action', damageMeta)?.formula;
|
||||
const newFormula = getFormula(calculateAdjustedDamage(formula, 'action', damageMeta));
|
||||
descriptionFormulas.push(formula);
|
||||
return match.replace(formula, newFormula);
|
||||
} catch {
|
||||
|
|
@ -82,15 +88,15 @@ export function getTierAdjustedAdversary(source, tier) {
|
|||
const result = [];
|
||||
for (const property of ['value', 'valueAlt']) {
|
||||
const { [property]: data, type: damageType } = action.damage.parts.hitPoints;
|
||||
const previousFormula = getDamagePartsFormula(data);
|
||||
const previousFormula = getFormula(data);
|
||||
const isActuallyAttack =
|
||||
previousFormula === initialAttack.value &&
|
||||
foundry.utils.equals(damageType.toSorted(), initialAttack.type) &&
|
||||
!descriptionFormulas.includes(previousFormula);
|
||||
const type = isActuallyAttack ? 'attack' : 'action';
|
||||
const { value, formula } = calculateAdjustedDamage(previousFormula, type, damageMeta);
|
||||
applyAdjustedDamage(data, value, formula);
|
||||
result.push({ previousFormula, formula });
|
||||
const value = calculateAdjustedDamage(previousFormula, type, damageMeta);
|
||||
applyAdjustedDamage(data, value);
|
||||
result.push({ previousFormula, formula: getFormula(value) });
|
||||
}
|
||||
|
||||
// Override text in the description with those values
|
||||
|
|
@ -189,24 +195,30 @@ function calculateAdjustedDamage(formula, type, { currentDamageRange, newDamageR
|
|||
value.bonus = Math.round(expected - getBaseAverage());
|
||||
}
|
||||
|
||||
const newFormula = [value.diceQuantity ? `${value.diceQuantity}d${value.faces}` : null, value.bonus]
|
||||
.filter(p => !!p)
|
||||
.join('+');
|
||||
return { value, formula: newFormula };
|
||||
return value;
|
||||
}
|
||||
|
||||
function getDamagePartsFormula(data) {
|
||||
return data.custom.enabled
|
||||
? data.custom.formula
|
||||
: [data.flatMultiplier ? `${data.flatMultiplier}${data.dice}` : 0, data.bonus ?? 0].filter(p => !!p).join('+');
|
||||
/**
|
||||
* Get formula from either damage parts *or* a simple formula object.
|
||||
* @returns {string} the new formula data
|
||||
*/
|
||||
function getFormula(data) {
|
||||
if (data.custom?.enabled) {
|
||||
return data.custom.formula;
|
||||
}
|
||||
|
||||
const diceQuantity = data.flatMultiplier ?? data.diceQuantity;
|
||||
const dice = data.faces ? `d${data.faces}` : data.dice;
|
||||
const mod = data.bonus;
|
||||
return [diceQuantity ? `${diceQuantity}${dice}` : 0, mod].filter(p => !!p).join('+');
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates damage to reflect a specific value.
|
||||
* @throws if damage structure is invalid for conversion
|
||||
* @returns the converted formula and value as a simplified term, or null if it doesn't deal HP damage
|
||||
* @param {object} diceData
|
||||
* @param {object} value
|
||||
*/
|
||||
function applyAdjustedDamage(diceData, value, formula) {
|
||||
function applyAdjustedDamage(diceData, value) {
|
||||
if (value.diceQuantity) {
|
||||
diceData.custom.enabled = false;
|
||||
diceData.bonus = value.bonus;
|
||||
|
|
@ -214,6 +226,6 @@ function applyAdjustedDamage(diceData, value, formula) {
|
|||
diceData.flatMultiplier = value.diceQuantity;
|
||||
} else if (!value.diceQuantity) {
|
||||
diceData.custom.enabled = true;
|
||||
diceData.custom.formula = formula;
|
||||
diceData.custom.formula = getFormula(value);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,6 +33,10 @@ export default class AreasField extends fields.ArrayField {
|
|||
initial: CONFIG.DH.GENERAL.range.veryClose.id,
|
||||
label: 'DAGGERHEART.ACTIONS.Config.area.size'
|
||||
}),
|
||||
hasHole: new fields.BooleanField({
|
||||
initial: false,
|
||||
label: 'DAGGERHEART.ACTIONS.Config.area.hasHole'
|
||||
}),
|
||||
effects: new fields.ArrayField(new fields.DocumentIdField())
|
||||
});
|
||||
super(element, options, context);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,11 @@
|
|||
import { getWorldActor } from '../../../helpers/utils.mjs';
|
||||
|
||||
const fields = foundry.data.fields;
|
||||
|
||||
/**
|
||||
* @import DHSummonAction from '../../action/summonAction.mjs'
|
||||
*/
|
||||
|
||||
export default class DHSummonField extends fields.SchemaField {
|
||||
/**
|
||||
* Action Workflow order
|
||||
|
|
@ -20,6 +26,11 @@ export default class DHSummonField extends fields.SchemaField {
|
|||
super(transformFields, options, context);
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs the execute. This is run on behalf of DHSummonAction.
|
||||
* @todo move this function to be on the summon action.
|
||||
* @this DHSummonAction
|
||||
*/
|
||||
static async execute() {
|
||||
if (!this.transform.actorUUID) {
|
||||
ui.notifications.warn(game.i18n.localize('DAGGERHEART.ACTIONS.TYPES.transform.noTransformActor'));
|
||||
|
|
@ -37,26 +48,37 @@ export default class DHSummonField extends fields.SchemaField {
|
|||
return false;
|
||||
}
|
||||
|
||||
if (this.actor.prototypeToken.actorLink) {
|
||||
ui.notifications.warn(game.i18n.localize('DAGGERHEART.ACTIONS.TYPES.transform.actorLinkError'));
|
||||
const activeTokens = this.actor.getActiveTokens(false, true);
|
||||
const controlledMatchingTokens = canvas.tokens.controlled
|
||||
.filter(x => x.actor && x.actor.uuid === this.actor.uuid)
|
||||
.map(x => x.document);
|
||||
/** @type {typeof game.system.api.documents.DhToken | null} */
|
||||
const token = this.actor.token ?? (
|
||||
activeTokens.length === 1 ? activeTokens[0] :
|
||||
(controlledMatchingTokens.length === 1 ? controlledMatchingTokens[0] : null)
|
||||
);
|
||||
|
||||
if (!this.actor.token && !token) {
|
||||
ui.notifications.warn(game.i18n.localize('DAGGERHEART.ACTIONS.TYPES.transform.linkedSelectedError'));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!this.actor.token) {
|
||||
if (!token) {
|
||||
ui.notifications.warn(game.i18n.localize('DAGGERHEART.ACTIONS.TYPES.transform.prototypeError'));
|
||||
return false;
|
||||
}
|
||||
|
||||
const actor = await DHSummonField.getWorldActor(baseActor);
|
||||
const actor = await getWorldActor(baseActor);
|
||||
const tokenSizes = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).tokenSizes;
|
||||
const tokenSize = actor?.system.metadata.usesSize ? tokenSizes[actor.system.size] : actor.prototypeToken.width;
|
||||
|
||||
await this.actor.token.update(
|
||||
{ ...actor.prototypeToken.toJSON(), actorId: actor.id, width: tokenSize, height: tokenSize },
|
||||
{ diff: false, recursive: false, noHook: true }
|
||||
// Update token. Avoid using recursive: false, since that prevents animations
|
||||
await token.update(
|
||||
{ ...actor.prototypeToken.toObject(), actorId: actor.id, width: tokenSize, height: tokenSize },
|
||||
{ diff: false, noHook: true }
|
||||
);
|
||||
|
||||
if (this.actor.token.combatant) {
|
||||
if (token.combatant) {
|
||||
this.actor.token.combatant.update({ actorId: actor.id, img: actor.prototypeToken.texture.src });
|
||||
}
|
||||
|
||||
|
|
@ -64,17 +86,17 @@ export default class DHSummonField extends fields.SchemaField {
|
|||
if (!this.transform.resourceRefresh.hitPoints) {
|
||||
marks.hitPoints = Math.min(
|
||||
this.actor.system.resources.hitPoints.value,
|
||||
this.actor.token.actor.system.resources.hitPoints.max - 1
|
||||
token.actor.system.resources.hitPoints.max - 1
|
||||
);
|
||||
}
|
||||
if (!this.transform.resourceRefresh.stress) {
|
||||
marks.stress = Math.min(
|
||||
this.actor.system.resources.stress.value,
|
||||
this.actor.token.actor.system.resources.stress.max - 1
|
||||
token.actor.system.resources.stress.max - 1
|
||||
);
|
||||
}
|
||||
if (marks.hitPoints || marks.stress) {
|
||||
this.actor.token.actor.update({
|
||||
token.actor.update({
|
||||
'system.resources': {
|
||||
hitPoints: { value: marks.hitPoints },
|
||||
stress: { value: marks.stress }
|
||||
|
|
@ -84,20 +106,9 @@ export default class DHSummonField extends fields.SchemaField {
|
|||
|
||||
const prevPosition = { ...this.actor.sheet.position };
|
||||
this.actor.sheet.close();
|
||||
this.actor.token.actor.sheet.render({ force: true, position: prevPosition });
|
||||
}
|
||||
|
||||
/* Check for any available instances of the actor present in the world, or create a world actor based on compendium */
|
||||
static async getWorldActor(baseActor) {
|
||||
if (!baseActor.inCompendium) return baseActor;
|
||||
|
||||
const dataType = game.system.api.data.actors[`Dh${baseActor.type.capitalize()}`];
|
||||
if (dataType && baseActor.img === dataType.DEFAULT_ICON) {
|
||||
const worldActorCopy = game.actors.find(x => x.name === baseActor.name);
|
||||
if (worldActorCopy) return worldActorCopy;
|
||||
token.actor.sheet.render({ force: true, position: prevPosition });
|
||||
if (token.object.controlled) {
|
||||
ui.effectsDisplay.refresh();
|
||||
}
|
||||
|
||||
const worldActor = await game.system.api.documents.DhpActor.create(baseActor.toObject());
|
||||
return worldActor;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,7 +9,8 @@ export default class DHWeapon extends AttachableItem {
|
|||
type: 'weapon',
|
||||
hasDescription: true,
|
||||
isInventoryItem: true,
|
||||
hasActions: true
|
||||
hasActions: true,
|
||||
hasResource: true
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
13
module/documents/_types.d.ts
vendored
13
module/documents/_types.d.ts
vendored
|
|
@ -3,17 +3,26 @@ import DHItem from './item.mjs';
|
|||
import BaseDataItem from '../data/item/base.mjs';
|
||||
import DhActiveEffect from './activeEffect.mjs';
|
||||
import EmbeddedCollection from '@common/abstract/embedded-collection.mjs';
|
||||
import DHToken from './token.mjs';
|
||||
import Actor from '@client/documents/actor.mjs';
|
||||
import Item from '@client/documents/item.mjs';
|
||||
|
||||
declare module './actor.mjs' {
|
||||
export default interface DhpActor<T extends BaseDataActor = BaseDataActor> {
|
||||
export default interface DhpActor<T extends BaseDataActor = BaseDataActor> extends Actor {
|
||||
system: T;
|
||||
items: EmbeddedCollection<DHItem>;
|
||||
effects: EmbeddedCollection<DhActiveEffect>;
|
||||
get token(): DHToken | null;
|
||||
|
||||
/** @inheritdoc */
|
||||
getActiveTokens(linked?: boolean, document?: boolean): (DHToken | foundry.canvas.placeables.Token)[];
|
||||
getActiveTokens(linked?: boolean, document: true): DHToken[];
|
||||
getActiveTokens(linked?: boolean, document: false): foundry.canvas.placeables.Token[];
|
||||
}
|
||||
}
|
||||
|
||||
declare module './item.mjs' {
|
||||
export default interface DHItem<T extends BaseDataItem = BaseDataItem> {
|
||||
export default interface DHItem<T extends BaseDataItem = BaseDataItem> extends Item {
|
||||
parent: DhpActor;
|
||||
actor: DhpActor;
|
||||
system: T;
|
||||
|
|
|
|||
|
|
@ -34,12 +34,14 @@ export default class DhpActor extends Actor {
|
|||
super.prepareData();
|
||||
|
||||
// Update effects if it is the user's character or is controlled
|
||||
if (canvas.ready) {
|
||||
// A timeout avoids an infinite loop when accessing token actors before the delta is finished constructing
|
||||
window.setTimeout(() => {
|
||||
if (!canvas.ready) return;
|
||||
const controlled = canvas.tokens.controlled.some(t => t.actor === this);
|
||||
if (game.user.character === this || controlled) {
|
||||
ui.effectsDisplay.render();
|
||||
ui.effectsDisplay.refresh();
|
||||
}
|
||||
}
|
||||
}, 0);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
|
|
|||
|
|
@ -276,8 +276,12 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage {
|
|||
async onCreateAreas(event) {
|
||||
const createArea = async selectedArea => {
|
||||
const effects = selectedArea.effects.map(effect => this.system.action.item.effects.get(effect).uuid);
|
||||
const { shape: type, size: range } = selectedArea;
|
||||
const shapeData = CONFIG.Canvas.layers.regions.layerClass.getTemplateShape({ type, range });
|
||||
const { shape: shapeType, size: range, hasHole } = selectedArea;
|
||||
const shapeData = CONFIG.Canvas.layers.regions.layerClass.getTemplateShape({
|
||||
shapeType,
|
||||
range,
|
||||
hasHole
|
||||
});
|
||||
|
||||
const scene = game.scenes.get(game.user.viewedScene);
|
||||
const level = scene.levels.find(x => x.isView);
|
||||
|
|
@ -305,7 +309,10 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage {
|
|||
visibility: CONST.REGION_VISIBILITY.ALWAYS
|
||||
};
|
||||
const placeRegion = data => {
|
||||
canvas.regions.placeRegion(data, { create: true });
|
||||
canvas.regions.placeRegion(data, {
|
||||
create: true,
|
||||
attachToToken: selectedArea.type === CONFIG.DH.ACTIONS.areaTypes.attached.id
|
||||
});
|
||||
};
|
||||
|
||||
// Regions with effects must be placed by the GM
|
||||
|
|
|
|||
|
|
@ -38,7 +38,8 @@ export default class DHToken extends CONFIG.Token.documentClass {
|
|||
tokens.filter(x => x.actor).map(x => x.actor)
|
||||
);
|
||||
}
|
||||
super.createCombatants(tokens, combat ?? {});
|
||||
|
||||
await super.createCombatants(tokens, combat ?? {});
|
||||
}
|
||||
|
||||
/**@inheritdoc */
|
||||
|
|
|
|||
|
|
@ -58,10 +58,11 @@ export const renderMeasuredTemplate = async event => {
|
|||
if (!type || !range || !game.canvas.scene) return;
|
||||
|
||||
const shapeData = CONFIG.Canvas.layers.regions.layerClass.getTemplateShape({
|
||||
type,
|
||||
shapetype: type,
|
||||
angle,
|
||||
range,
|
||||
direction
|
||||
direction,
|
||||
hasHole: false
|
||||
});
|
||||
|
||||
await canvas.regions.placeRegion(
|
||||
|
|
|
|||
|
|
@ -1,6 +1,10 @@
|
|||
import { diceTypes, getDiceSoNicePresets, getDiceSoNicePreset, range } from '../config/generalConfig.mjs';
|
||||
import Tagify from '@yaireo/tagify';
|
||||
|
||||
/**
|
||||
* @import DhpActor from '../documents/actor.mjs';
|
||||
*/
|
||||
|
||||
export const capitalize = string => {
|
||||
return string.charAt(0).toUpperCase() + string.slice(1);
|
||||
};
|
||||
|
|
@ -891,15 +895,21 @@ export function shouldUseHopeFearAutomation(options = { gmAsPlayer: true }) {
|
|||
return (!game.user.isGM || options.gmAsPlayer) ? hopeFear.players : hopeFear.gm;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the given actor if its a world actor,
|
||||
* finds a world actor equivalent,
|
||||
* or imports the actor and returns the imported actor.
|
||||
* @param {DhpActor} baseActor
|
||||
* @returns {Promise<DhpActor>} a world actor
|
||||
*/
|
||||
export async function getWorldActor(baseActor) {
|
||||
if (baseActor.inCompendium) {
|
||||
const worldActorCopy = game.actors.find(x =>
|
||||
x._stats.compendiumSource === baseActor.uuid &&
|
||||
(!x.prototypeToken.actorLink || x.name === baseActor.name)
|
||||
const worldActorCandidates = game.actors.filter(x =>
|
||||
x._stats.compendiumSource === baseActor.uuid &&
|
||||
x.prototypeToken.actorLink === baseActor.prototypeToken.actorLink
|
||||
);
|
||||
|
||||
if (worldActorCopy)
|
||||
return worldActorCopy;
|
||||
const worldActorCopy = worldActorCandidates.find(a => a.name === baseActor.name) ?? worldActorCandidates[0];
|
||||
if (worldActorCopy) return worldActorCopy;
|
||||
|
||||
const baseActorData = baseActor;
|
||||
return await game.system.api.documents.DhpActor.create({
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@
|
|||
"includeBase": false
|
||||
},
|
||||
"target": {
|
||||
"type": "hostile",
|
||||
"type": "",
|
||||
"amount": 1
|
||||
},
|
||||
"effects": [
|
||||
|
|
@ -63,13 +63,23 @@
|
|||
],
|
||||
"name": "Fire",
|
||||
"img": "icons/magic/fire/barrier-wall-explosion-orange.webp",
|
||||
"range": "close"
|
||||
"range": "",
|
||||
"areas": [
|
||||
{
|
||||
"name": "Elemental Aura: Fire",
|
||||
"type": "attached",
|
||||
"shape": "emanation",
|
||||
"size": "close",
|
||||
"hasHole": false,
|
||||
"effects": []
|
||||
}
|
||||
]
|
||||
},
|
||||
"xDBLH5TWidvrYF7z": {
|
||||
"type": "effect",
|
||||
"_id": "xDBLH5TWidvrYF7z",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>When an adversary marks 1 or more Hit Points, they must also mark a Stress.</p>",
|
||||
"description": "<p>Your allies gain a +1 bonus to Strength.</p>",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
|
|
@ -78,19 +88,26 @@
|
|||
"max": "",
|
||||
"recovery": null
|
||||
},
|
||||
"effects": [
|
||||
{
|
||||
"_id": "WRuijfHxmUscAa69",
|
||||
"onSave": false
|
||||
}
|
||||
],
|
||||
"effects": [],
|
||||
"target": {
|
||||
"type": "friendly",
|
||||
"type": "",
|
||||
"amount": null
|
||||
},
|
||||
"name": "Earth",
|
||||
"img": "icons/magic/control/buff-strength-muscle-damage-red.webp",
|
||||
"range": "close"
|
||||
"range": "",
|
||||
"areas": [
|
||||
{
|
||||
"name": "Elemental Aura: Earth",
|
||||
"type": "attached",
|
||||
"shape": "emanation",
|
||||
"size": "close",
|
||||
"hasHole": true,
|
||||
"effects": [
|
||||
"yvpWNCNobg0LLjey"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"S4t5HlgxWlHwaBDw": {
|
||||
"type": "effect",
|
||||
|
|
@ -112,12 +129,22 @@
|
|||
}
|
||||
],
|
||||
"target": {
|
||||
"type": "hostile",
|
||||
"type": "self",
|
||||
"amount": null
|
||||
},
|
||||
"name": "Water",
|
||||
"img": "icons/magic/water/vortex-water-whirlpool.webp",
|
||||
"range": "close"
|
||||
"range": "self",
|
||||
"areas": [
|
||||
{
|
||||
"name": "Elemental Aura: Water",
|
||||
"type": "attached",
|
||||
"shape": "emanation",
|
||||
"size": "close",
|
||||
"hasHole": false,
|
||||
"effects": []
|
||||
}
|
||||
]
|
||||
},
|
||||
"hAsKFFewtTqd1gg9": {
|
||||
"type": "attack",
|
||||
|
|
@ -138,15 +165,10 @@
|
|||
"includeBase": false
|
||||
},
|
||||
"target": {
|
||||
"type": "any",
|
||||
"type": "self",
|
||||
"amount": null
|
||||
},
|
||||
"effects": [
|
||||
{
|
||||
"_id": "mJBA2QTyM9SM5NVS",
|
||||
"onSave": false
|
||||
}
|
||||
],
|
||||
"effects": [],
|
||||
"roll": {
|
||||
"type": "diceSet",
|
||||
"trait": null,
|
||||
|
|
@ -169,7 +191,19 @@
|
|||
},
|
||||
"name": "Air",
|
||||
"img": "icons/magic/air/air-burst-spiral-blue-gray.webp",
|
||||
"range": ""
|
||||
"range": "self",
|
||||
"areas": [
|
||||
{
|
||||
"name": "Elemental Aura: Air",
|
||||
"type": "attached",
|
||||
"shape": "emanation",
|
||||
"size": "close",
|
||||
"hasHole": false,
|
||||
"effects": [
|
||||
"vnKV5hsO4DVjURAl"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
|
|
@ -181,49 +215,6 @@
|
|||
}
|
||||
},
|
||||
"effects": [
|
||||
{
|
||||
"name": "Elemental Aura (Earth)",
|
||||
"img": "icons/magic/control/buff-strength-muscle-damage-orange.webp",
|
||||
"origin": "Compendium.daggerheart.subclasses.Item.2JH9NaOh69yN80Gw",
|
||||
"transfer": false,
|
||||
"_id": "WRuijfHxmUscAa69",
|
||||
"type": "base",
|
||||
"system": {
|
||||
"rangeDependence": {
|
||||
"enabled": false,
|
||||
"type": "withinRange",
|
||||
"target": "hostile",
|
||||
"range": "melee"
|
||||
}
|
||||
},
|
||||
"changes": [
|
||||
{
|
||||
"key": "system.traits.strength.value",
|
||||
"mode": 2,
|
||||
"value": "1",
|
||||
"priority": null
|
||||
}
|
||||
],
|
||||
"disabled": false,
|
||||
"duration": {
|
||||
"startTime": null,
|
||||
"combat": null,
|
||||
"seconds": null,
|
||||
"rounds": null,
|
||||
"turns": null,
|
||||
"startRound": null,
|
||||
"startTurn": null
|
||||
},
|
||||
"description": "",
|
||||
"tint": "#ffffff",
|
||||
"statuses": [],
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null
|
||||
},
|
||||
"_key": "!items.effects!2JH9NaOh69yN80Gw.WRuijfHxmUscAa69"
|
||||
},
|
||||
{
|
||||
"name": "Elemental Aura (Water)",
|
||||
"img": "icons/magic/water/vortex-water-whirlpool.webp",
|
||||
|
|
@ -237,18 +228,15 @@
|
|||
"type": "withinRange",
|
||||
"target": "hostile",
|
||||
"range": "melee"
|
||||
}
|
||||
},
|
||||
"changes": []
|
||||
},
|
||||
"changes": [],
|
||||
"disabled": false,
|
||||
"duration": {
|
||||
"startTime": null,
|
||||
"combat": null,
|
||||
"seconds": null,
|
||||
"rounds": null,
|
||||
"turns": null,
|
||||
"startRound": null,
|
||||
"startTurn": null
|
||||
"value": null,
|
||||
"units": "seconds",
|
||||
"expiry": null,
|
||||
"expired": false
|
||||
},
|
||||
"description": "",
|
||||
"tint": "#ffffff",
|
||||
|
|
@ -258,6 +246,9 @@
|
|||
"_stats": {
|
||||
"compendiumSource": null
|
||||
},
|
||||
"start": null,
|
||||
"showIcon": 1,
|
||||
"folder": null,
|
||||
"_key": "!items.effects!2JH9NaOh69yN80Gw.H7W52ps5d3UGmaFr"
|
||||
},
|
||||
{
|
||||
|
|
@ -273,18 +264,15 @@
|
|||
"type": "withinRange",
|
||||
"target": "hostile",
|
||||
"range": "melee"
|
||||
}
|
||||
},
|
||||
"changes": []
|
||||
},
|
||||
"changes": [],
|
||||
"disabled": false,
|
||||
"duration": {
|
||||
"startTime": null,
|
||||
"combat": null,
|
||||
"seconds": null,
|
||||
"rounds": null,
|
||||
"turns": null,
|
||||
"startRound": null,
|
||||
"startTurn": null
|
||||
"value": null,
|
||||
"units": "seconds",
|
||||
"expiry": null,
|
||||
"expired": false
|
||||
},
|
||||
"description": "",
|
||||
"tint": "#ffffff",
|
||||
|
|
@ -294,43 +282,120 @@
|
|||
"_stats": {
|
||||
"compendiumSource": null
|
||||
},
|
||||
"start": null,
|
||||
"showIcon": 1,
|
||||
"folder": null,
|
||||
"_key": "!items.effects!2JH9NaOh69yN80Gw.WX5AMEpmUAutB9Hm"
|
||||
},
|
||||
{
|
||||
"name": "Elemental Aura (Air)",
|
||||
"img": "icons/magic/air/air-burst-spiral-blue-gray.webp",
|
||||
"origin": "Compendium.daggerheart.subclasses.Item.2JH9NaOh69yN80Gw",
|
||||
"name": "Elemental Aura: Earth",
|
||||
"disabled": false,
|
||||
"img": "icons/magic/control/buff-strength-muscle-damage-red.webp",
|
||||
"description": "<p>Your allies gain a +1 bonus to Strength.</p>",
|
||||
"transfer": false,
|
||||
"_id": "mJBA2QTyM9SM5NVS",
|
||||
"type": "base",
|
||||
"statuses": [],
|
||||
"system": {
|
||||
"rangeDependence": {
|
||||
"enabled": false,
|
||||
"type": "withinRange",
|
||||
"target": "hostile",
|
||||
"range": "melee"
|
||||
}
|
||||
},
|
||||
"changes": [
|
||||
{
|
||||
"key": "system.traits.strength.value",
|
||||
"type": "add",
|
||||
"value": 1,
|
||||
"priority": null,
|
||||
"phase": "initial"
|
||||
}
|
||||
],
|
||||
"duration": {
|
||||
"description": "",
|
||||
"type": ""
|
||||
},
|
||||
"stacking": null,
|
||||
"targetDispositions": [
|
||||
1
|
||||
]
|
||||
},
|
||||
"changes": [],
|
||||
"disabled": false,
|
||||
"duration": {
|
||||
"startTime": null,
|
||||
"_id": "yvpWNCNobg0LLjey",
|
||||
"type": "base",
|
||||
"start": {
|
||||
"time": 0,
|
||||
"combat": null,
|
||||
"seconds": null,
|
||||
"rounds": null,
|
||||
"turns": null,
|
||||
"startRound": null,
|
||||
"startTurn": null
|
||||
"combatant": null,
|
||||
"initiative": null,
|
||||
"round": null,
|
||||
"turn": null
|
||||
},
|
||||
"description": "",
|
||||
"duration": {
|
||||
"value": null,
|
||||
"units": "seconds",
|
||||
"expiry": null,
|
||||
"expired": false
|
||||
},
|
||||
"origin": null,
|
||||
"tint": "#ffffff",
|
||||
"statuses": [],
|
||||
"showIcon": 1,
|
||||
"folder": null,
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null
|
||||
},
|
||||
"_key": "!items.effects!2JH9NaOh69yN80Gw.mJBA2QTyM9SM5NVS"
|
||||
"_key": "!items.effects!2JH9NaOh69yN80Gw.yvpWNCNobg0LLjey"
|
||||
},
|
||||
{
|
||||
"name": "Elemental Aura: Air",
|
||||
"disabled": false,
|
||||
"img": "icons/magic/air/air-burst-spiral-blue-gray.webp",
|
||||
"description": "<p><span style=\"color:rgb(239, 230, 216);font-family:Montserrat, sans-serif;font-size:14px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;orphans:2;text-align:start;text-indent:0px;text-transform:none;widows:2;word-spacing:0px;-webkit-text-stroke-width:0px;white-space:normal;background-color:rgba(24, 22, 46, 0.753);text-decoration-thickness:initial;text-decoration-style:initial;text-decoration-color:initial;display:inline !important;float:none\">When you or an ally takes damage from an attack beyond Melee range, reduce the damage by 1d8.</span></p>",
|
||||
"transfer": false,
|
||||
"statuses": [],
|
||||
"system": {
|
||||
"rangeDependence": {
|
||||
"enabled": false,
|
||||
"type": "withinRange",
|
||||
"target": "hostile",
|
||||
"range": "melee"
|
||||
},
|
||||
"changes": [],
|
||||
"duration": {
|
||||
"description": "",
|
||||
"type": ""
|
||||
},
|
||||
"stacking": null,
|
||||
"targetDispositions": [
|
||||
1
|
||||
]
|
||||
},
|
||||
"_id": "vnKV5hsO4DVjURAl",
|
||||
"type": "base",
|
||||
"start": {
|
||||
"time": 0,
|
||||
"combat": null,
|
||||
"combatant": null,
|
||||
"initiative": null,
|
||||
"round": null,
|
||||
"turn": null
|
||||
},
|
||||
"duration": {
|
||||
"value": null,
|
||||
"units": "seconds",
|
||||
"expiry": null,
|
||||
"expired": false
|
||||
},
|
||||
"origin": null,
|
||||
"tint": "#ffffff",
|
||||
"showIcon": 1,
|
||||
"folder": null,
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null
|
||||
},
|
||||
"_key": "!items.effects!2JH9NaOh69yN80Gw.vnKV5hsO4DVjURAl"
|
||||
}
|
||||
],
|
||||
"sort": 100000,
|
||||
|
|
|
|||
|
|
@ -261,13 +261,14 @@
|
|||
|
||||
fieldset {
|
||||
align-items: center;
|
||||
margin-top: 5px;
|
||||
margin: 5px 0 0 0;
|
||||
border-radius: 6px;
|
||||
border-color: @color-fieldset-border;
|
||||
padding-inline: 0.625rem;
|
||||
|
||||
&.glassy {
|
||||
background-color: light-dark(@dark-blue-10, @golden-10);
|
||||
border-color: transparent;
|
||||
border: none;
|
||||
|
||||
legend {
|
||||
padding: 2px 12px;
|
||||
|
|
@ -384,6 +385,10 @@
|
|||
justify-content: space-between;
|
||||
}
|
||||
|
||||
label {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.btn {
|
||||
padding-top: 15px;
|
||||
}
|
||||
|
|
@ -399,6 +404,13 @@
|
|||
> .checkbox {
|
||||
align-self: end;
|
||||
}
|
||||
|
||||
.auto-sized {
|
||||
width: auto;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
|
||||
.form-group {
|
||||
|
|
@ -535,50 +547,39 @@
|
|||
transform-origin: top;
|
||||
}
|
||||
|
||||
.item-buttons {
|
||||
grid-column: span 3;
|
||||
/* A multi-button element used to attach resources to other buttons */
|
||||
.item-button {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
flex-wrap: wrap;
|
||||
margin-top: 2px;
|
||||
button {
|
||||
color: light-dark(@dark-blue, @dark-blue);
|
||||
white-space: nowrap;
|
||||
border: none;
|
||||
|
||||
.item-button {
|
||||
display: flex;
|
||||
border: 1px solid light-dark(#18162e, #18162e);
|
||||
color: light-dark(#18162e, #18162e);
|
||||
outline: none;
|
||||
box-shadow: none;
|
||||
border-radius: 6px;
|
||||
&:hover {
|
||||
color: @color-text-emphatic;
|
||||
}
|
||||
|
||||
button {
|
||||
border-radius: 3px 0px 0px 3px;
|
||||
color: light-dark(@dark-blue, @dark-blue);
|
||||
white-space: nowrap;
|
||||
border: 0;
|
||||
&:not(:first-child) {
|
||||
border-top-left-radius: 0;
|
||||
border-bottom-left-radius: 0;
|
||||
padding: 6px;
|
||||
background: light-dark(@dark-blue-10, @golden-secondary);
|
||||
color: light-dark(@dark-blue, @dark-golden);
|
||||
|
||||
&:hover {
|
||||
color: @color-text-emphatic;
|
||||
}
|
||||
|
||||
&:not(:first-child) {
|
||||
padding: 6px;
|
||||
background: light-dark(@dark-blue-10, @golden-secondary);
|
||||
border-radius: 0px 3px 3px 0px;
|
||||
color: light-dark(@dark-blue, @dark-golden);
|
||||
|
||||
&:hover {
|
||||
background: light-dark(@light-black, @dark-blue);
|
||||
color: light-dark(@dark-blue, @golden-secondary);
|
||||
}
|
||||
background: light-dark(@light-black, @dark-blue);
|
||||
color: light-dark(@dark-blue, @golden-secondary);
|
||||
}
|
||||
}
|
||||
|
||||
.spacer {
|
||||
&:not(:last-child) {
|
||||
border-top-right-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
border-right: 1px solid black;
|
||||
content: '';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.artist-attribution {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
|
|
|
|||
|
|
@ -271,6 +271,14 @@
|
|||
grid-area: labels;
|
||||
}
|
||||
}
|
||||
|
||||
.item-buttons {
|
||||
grid-column: span 3;
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
flex-wrap: wrap;
|
||||
margin-top: 2px;
|
||||
}
|
||||
}
|
||||
|
||||
.card-item {
|
||||
|
|
|
|||
|
|
@ -9,111 +9,108 @@
|
|||
}
|
||||
});
|
||||
|
||||
/** Pips styling, can exist standalone even without a slot-value */
|
||||
.slot-bar {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
padding: 5px;
|
||||
border: 1px solid @color-border;
|
||||
border-radius: 6px;
|
||||
z-index: 1;
|
||||
color: @color-text-emphatic;
|
||||
width: fit-content;
|
||||
min-height: 22px;
|
||||
flex-wrap: wrap;
|
||||
|
||||
.slot {
|
||||
transition: all 0.3s ease;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.slot:not(:has(i)) {
|
||||
width: 15px;
|
||||
height: 10px;
|
||||
border: 1px solid @color-border;
|
||||
background: light-dark(@dark-blue-10, @golden-10);
|
||||
border-radius: 3px;
|
||||
|
||||
&.large {
|
||||
width: 20px;
|
||||
}
|
||||
|
||||
&.filled {
|
||||
background: light-dark(@dark-blue, @golden);
|
||||
}
|
||||
}
|
||||
|
||||
&.armor .slot {
|
||||
font-size: var(--font-size-12);
|
||||
.fa-shield-halved {
|
||||
color: light-dark(@dark-blue-40, @golden-40);
|
||||
}
|
||||
}
|
||||
|
||||
.empty-slot {
|
||||
width: 15px;
|
||||
height: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.slot-value {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
font-size: 1.5rem;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
z-index: 2;
|
||||
color: @beige;
|
||||
|
||||
.slot-label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: light-dark(@beige, @dark-blue);
|
||||
background: light-dark(@dark-blue, @golden);
|
||||
padding: 0 5px;
|
||||
width: fit-content;
|
||||
font-weight: bold;
|
||||
border-radius: 0px 0px 5px 5px;
|
||||
font-size: var(--font-size-12);
|
||||
|
||||
.label {
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
.value {
|
||||
padding-left: 6px;
|
||||
border-left: 1px solid light-dark(@beige, @dark-golden);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.status-bar {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
position: relative;
|
||||
width: 120px;
|
||||
height: 40px;
|
||||
|
||||
.status-label {
|
||||
position: relative;
|
||||
top: 40px;
|
||||
height: 22px;
|
||||
width: 79px;
|
||||
clip-path: path('M0 0H79L74 16.5L39 22L4 16.5L0 0Z');
|
||||
background: light-dark(@dark-blue, @golden);
|
||||
|
||||
h4 {
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
line-height: 18px;
|
||||
color: light-dark(@beige, @dark-blue);
|
||||
}
|
||||
}
|
||||
.slot-value {
|
||||
position: absolute;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 0 5px;
|
||||
font-size: 1.5rem;
|
||||
align-items: center;
|
||||
width: 140px;
|
||||
height: 40px;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
z-index: 2;
|
||||
color: @beige;
|
||||
|
||||
.slot-bar {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 5px;
|
||||
padding: 5px;
|
||||
border: 1px solid @color-border;
|
||||
border-radius: 6px;
|
||||
z-index: 1;
|
||||
color: @color-text-emphatic;
|
||||
width: fit-content;
|
||||
|
||||
.slot {
|
||||
width: 15px;
|
||||
height: 10px;
|
||||
border: 1px solid @color-border;
|
||||
background: light-dark(@dark-blue-10, @golden-10);
|
||||
border-radius: 3px;
|
||||
transition: all 0.3s ease;
|
||||
cursor: pointer;
|
||||
|
||||
&.large {
|
||||
width: 20px;
|
||||
}
|
||||
|
||||
&.filled {
|
||||
background: light-dark(@dark-blue, @golden);
|
||||
}
|
||||
}
|
||||
|
||||
.empty-slot {
|
||||
width: 15px;
|
||||
height: 10px;
|
||||
}
|
||||
}
|
||||
.slot-label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: light-dark(@beige, @dark-blue);
|
||||
background: light-dark(@dark-blue, @golden);
|
||||
padding: 0 5px;
|
||||
width: fit-content;
|
||||
font-weight: bold;
|
||||
border-radius: 0px 0px 5px 5px;
|
||||
font-size: var(--font-size-12);
|
||||
|
||||
.label {
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
.value {
|
||||
padding-left: 6px;
|
||||
border-left: 1px solid light-dark(@beige, @dark-golden);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.status-value {
|
||||
position: absolute;
|
||||
position: relative;
|
||||
display: flex;
|
||||
padding: 0 5px;
|
||||
font-size: 1.5rem;
|
||||
align-items: center;
|
||||
width: 140px;
|
||||
width: 100px;
|
||||
height: 40px;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
z-index: 2;
|
||||
color: @beige;
|
||||
|
||||
> * {
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
input[type='number'] {
|
||||
background: transparent;
|
||||
font-size: 1.5rem;
|
||||
|
|
@ -146,11 +143,11 @@
|
|||
.progress-bar {
|
||||
position: absolute;
|
||||
appearance: none;
|
||||
width: 100px;
|
||||
height: 40px;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border: 1px solid @color-border;
|
||||
border-radius: 6px;
|
||||
z-index: 1;
|
||||
z-index: 0;
|
||||
background: @dark-blue;
|
||||
|
||||
&::-webkit-progress-bar {
|
||||
|
|
@ -175,4 +172,29 @@
|
|||
border-radius: 6px;
|
||||
}
|
||||
}
|
||||
.status-label {
|
||||
position: relative;
|
||||
height: 22px;
|
||||
width: 79px;
|
||||
background: light-dark(@dark-blue, @golden);
|
||||
|
||||
&.pointy {
|
||||
clip-path: path('M0 0H79L74 16.5L39 22L4 16.5L0 0Z');
|
||||
margin-bottom: -2px; // compensate for pointy bottom so spacing feels more "right"
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
line-height: 18px;
|
||||
color: light-dark(@beige, @dark-blue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Overrides for sidebar usage.
|
||||
aside[data-application-part="sidebar"] .resources-section .slot-bar {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(6, min-content);
|
||||
grid-auto-flow: row;
|
||||
}
|
||||
|
|
@ -54,7 +54,7 @@ body.game:is(.performance-low, .noblur) {
|
|||
position: relative;
|
||||
min-height: -webkit-fill-available;
|
||||
transition: opacity 0.3s ease;
|
||||
padding-bottom: 20px;
|
||||
padding-bottom: 16px;
|
||||
|
||||
.tab {
|
||||
padding: 0 10px;
|
||||
|
|
|
|||
|
|
@ -39,6 +39,20 @@
|
|||
|
||||
.window-header > .attribution-header-label {
|
||||
margin-right: var(--spacer-4);
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.tab-navigation {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.tab {
|
||||
flex: 1;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
.search-section {
|
||||
padding: 12px 14px var(--spacer-8) 12px;
|
||||
}
|
||||
}
|
||||
|
||||
.tab.inventory {
|
||||
|
|
@ -46,7 +60,7 @@
|
|||
display: grid;
|
||||
grid-template-columns: 1fr 1fr 1fr 1fr;
|
||||
gap: 10px;
|
||||
padding: 10px 10px 0;
|
||||
padding: var(--spacer-8) 16px var(--spacer-8) 16px;
|
||||
|
||||
.input {
|
||||
color: light-dark(@dark, @beige);
|
||||
|
|
@ -57,7 +71,6 @@
|
|||
.tab.notes.active {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
margin-top: -10px; // will be removed once tab-navigation bottom margin is removed on all actor sheets
|
||||
scrollbar-gutter: unset;
|
||||
|
||||
// Add padding around top level level prosemirrors used for note tabs
|
||||
|
|
@ -66,6 +79,7 @@
|
|||
.editor-content {
|
||||
scrollbar-gutter: stable;
|
||||
padding-right: @right-padding;
|
||||
padding-bottom: 4px;
|
||||
}
|
||||
&.inactive {
|
||||
button.toggle {
|
||||
|
|
@ -76,7 +90,7 @@
|
|||
}
|
||||
}
|
||||
&.active {
|
||||
padding: 8px 0 4px 16px;
|
||||
padding: 8px 0 0 16px;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -7,9 +7,8 @@
|
|||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
overflow-y: auto;
|
||||
padding-bottom: 20px;
|
||||
.with-scroll-shadows();
|
||||
padding: 7px calc(12px - var(--scrollbar-width)) 4px 12px;
|
||||
.stable-scroll-container();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,12 +5,8 @@
|
|||
.application.sheet.daggerheart.actor.dh-style.adversary {
|
||||
.tab.features {
|
||||
.feature-section {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
overflow-y: auto;
|
||||
padding-bottom: 20px;
|
||||
.with-scroll-shadows();
|
||||
padding: 16px calc(16px - var(--scrollbar-width)) 4px 16px;
|
||||
.stable-scroll-container();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
@import './sheet.less';
|
||||
@import './features.less';
|
||||
@import './header.less';
|
||||
@import './sheet.less';
|
||||
@import './sidebar.less';
|
||||
@import './effects.less';
|
||||
@import './notes.less';
|
||||
|
||||
|
|
|
|||
|
|
@ -2,35 +2,37 @@
|
|||
@import '../../../utils/fonts.less';
|
||||
|
||||
.application.sheet.daggerheart.actor.dh-style.adversary {
|
||||
--sidebar-width: 260px;
|
||||
|
||||
.window-content {
|
||||
display: grid;
|
||||
grid-template-columns: 275px 1fr;
|
||||
grid-template-columns: var(--sidebar-width) 1fr;
|
||||
grid-template-rows: auto 1fr;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.adversary-sidebar-sheet {
|
||||
grid-row: 1 / span 2;
|
||||
grid-column: 1;
|
||||
overflow: hidden;
|
||||
.adversary-sidebar-sheet {
|
||||
grid-row: 1 / span 2;
|
||||
grid-column: 1;
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.adversary-header-sheet {
|
||||
grid-row: 1;
|
||||
grid-column: 2;
|
||||
}
|
||||
|
||||
.tab {
|
||||
grid-row: 2;
|
||||
grid-column: 2;
|
||||
&.active {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.adversary-header-sheet {
|
||||
grid-row: 1;
|
||||
grid-column: 2;
|
||||
}
|
||||
|
||||
.tab {
|
||||
grid-row: 2;
|
||||
grid-column: 2;
|
||||
&.active {
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
margin: 0 0 10px 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -22,8 +22,8 @@
|
|||
|
||||
.application.sheet.daggerheart.actor.dh-style.adversary {
|
||||
.adversary-sidebar-sheet {
|
||||
width: 275px;
|
||||
min-width: 275px;
|
||||
width: var(--sidebar-width);
|
||||
min-width: var(--sidebar-width);
|
||||
border-right: 1px solid light-dark(@dark-blue, @golden);
|
||||
|
||||
.portrait {
|
||||
|
|
@ -52,7 +52,7 @@
|
|||
}
|
||||
|
||||
img {
|
||||
height: 275px;
|
||||
height: var(--sidebar-width);
|
||||
}
|
||||
|
||||
.death-roll-btn {
|
||||
|
|
@ -63,7 +63,7 @@
|
|||
.threshold-section {
|
||||
position: relative;
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
gap: 7px;
|
||||
background-color: light-dark(transparent, @dark-blue);
|
||||
color: @color-text-emphatic;
|
||||
padding: 5px 10px;
|
||||
|
|
@ -106,8 +106,8 @@
|
|||
display: flex;
|
||||
flex-direction: column;
|
||||
top: -20px;
|
||||
gap: 16px;
|
||||
margin-bottom: -10px;
|
||||
gap: 10px;
|
||||
margin-bottom: -16px;
|
||||
|
||||
&.pip-display {
|
||||
top: -15px;
|
||||
|
|
@ -120,105 +120,6 @@
|
|||
.resources-section {
|
||||
display: flex;
|
||||
justify-content: space-evenly;
|
||||
margin-bottom: 16px;
|
||||
|
||||
.status-bar {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
width: 100px;
|
||||
height: 40px;
|
||||
|
||||
.status-label {
|
||||
position: relative;
|
||||
top: 40px;
|
||||
height: 22px;
|
||||
width: 79px;
|
||||
clip-path: path('M0 0H79L74 16.5L39 22L4 16.5L0 0Z');
|
||||
background: light-dark(@dark-blue, @golden);
|
||||
|
||||
h4 {
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
line-height: 18px;
|
||||
color: light-dark(@beige, @dark-blue);
|
||||
}
|
||||
}
|
||||
.status-value {
|
||||
position: absolute;
|
||||
display: flex;
|
||||
padding: 0 6px;
|
||||
font-size: 1.5rem;
|
||||
align-items: center;
|
||||
width: 100px;
|
||||
height: 40px;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
z-index: 2;
|
||||
color: @beige;
|
||||
|
||||
input[type='number'] {
|
||||
background: transparent;
|
||||
font-size: 1.5rem;
|
||||
width: 40px;
|
||||
height: 30px;
|
||||
text-align: center;
|
||||
border: none;
|
||||
outline: 2px solid transparent;
|
||||
color: @beige;
|
||||
|
||||
&.bar-input {
|
||||
padding: 0;
|
||||
color: @beige;
|
||||
backdrop-filter: none;
|
||||
background: transparent;
|
||||
transition: all 0.3s ease;
|
||||
|
||||
&:hover,
|
||||
&:focus {
|
||||
background: @semi-transparent-dark-blue;
|
||||
backdrop-filter: blur(9.5px);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.bar-label {
|
||||
width: 40px;
|
||||
}
|
||||
}
|
||||
.progress-bar {
|
||||
position: absolute;
|
||||
appearance: none;
|
||||
width: 100px;
|
||||
height: 40px;
|
||||
border: 1px solid @color-border;
|
||||
border-radius: 6px;
|
||||
z-index: 1;
|
||||
background: @dark-blue;
|
||||
|
||||
&::-webkit-progress-bar {
|
||||
border: none;
|
||||
background: @dark-blue;
|
||||
border-radius: 6px;
|
||||
}
|
||||
&::-webkit-progress-value {
|
||||
background: @gradient-hp;
|
||||
border-radius: 6px;
|
||||
}
|
||||
&.stress-color::-webkit-progress-value {
|
||||
background: @gradient-stress;
|
||||
border-radius: 6px;
|
||||
}
|
||||
&::-moz-progress-bar {
|
||||
background: @gradient-hp;
|
||||
border-radius: 6px;
|
||||
}
|
||||
&.stress-color::-moz-progress-bar {
|
||||
background: @gradient-stress;
|
||||
border-radius: 6px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.status-section {
|
||||
|
|
@ -256,7 +157,7 @@
|
|||
.status-label {
|
||||
padding: 2px 10px;
|
||||
width: 100%;
|
||||
border-radius: 3px;
|
||||
border-radius: 0 0 3px 3px;
|
||||
background: light-dark(@dark-blue, @golden);
|
||||
|
||||
h4 {
|
||||
|
|
@ -284,8 +185,8 @@
|
|||
|
||||
.shortcut-items-section {
|
||||
overflow-y: hidden;
|
||||
padding-top: 10px;
|
||||
padding-bottom: 20px;
|
||||
padding: 10px 0;
|
||||
flex: 1;
|
||||
scrollbar-gutter: stable;
|
||||
.with-scroll-shadows();
|
||||
|
||||
|
|
@ -313,8 +214,6 @@
|
|||
}
|
||||
|
||||
.experience-section {
|
||||
margin-bottom: 20px;
|
||||
|
||||
.title {
|
||||
display: flex;
|
||||
gap: 15px;
|
||||
|
|
@ -331,21 +230,21 @@
|
|||
gap: 5px;
|
||||
width: 100%;
|
||||
margin-top: 10px;
|
||||
align-items: center;
|
||||
align-items: stretch;
|
||||
padding: 0 4px 0 12px;
|
||||
|
||||
.experience-row {
|
||||
display: flex;
|
||||
gap: 5px;
|
||||
width: 250px;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
|
||||
.experience-name {
|
||||
width: 180px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
text-align: start;
|
||||
font-size: var(--font-size-14);
|
||||
flex: 1;
|
||||
color: light-dark(@dark, @beige);
|
||||
line-height: 1;
|
||||
}
|
||||
|
|
@ -370,9 +269,7 @@
|
|||
|
||||
.reaction-section {
|
||||
display: flex;
|
||||
padding: 0 10px;
|
||||
margin-top: 20px;
|
||||
width: 100%;
|
||||
margin: 10px;
|
||||
|
||||
button {
|
||||
height: 40px;
|
||||
|
|
|
|||
|
|
@ -8,17 +8,14 @@
|
|||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
padding-top: 8px;
|
||||
padding-bottom: 20px;
|
||||
height: 100%;
|
||||
.with-scroll-shadows();
|
||||
height: 100%;
|
||||
padding: 12px calc(12px - var(--scrollbar-width)) 4px 12px;
|
||||
.stable-scroll-container();
|
||||
}
|
||||
|
||||
.characteristics-section {
|
||||
gap: 20px;
|
||||
padding: 0 10px;
|
||||
padding: 0 4px;
|
||||
}
|
||||
|
||||
.biography-section {
|
||||
|
|
|
|||
|
|
@ -8,9 +8,8 @@
|
|||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
overflow-y: auto;
|
||||
padding-bottom: 20px;
|
||||
.with-scroll-shadows();
|
||||
padding: 7px calc(12px - var(--scrollbar-width)) 4px 12px;
|
||||
.stable-scroll-container();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,9 +8,8 @@
|
|||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
overflow-y: auto;
|
||||
padding-bottom: 20px;
|
||||
.with-scroll-shadows();
|
||||
padding: 7px calc(12px - var(--scrollbar-width)) 4px 12px;
|
||||
.stable-scroll-container();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,16 +19,19 @@
|
|||
|
||||
.application.sheet.daggerheart.actor.dh-style.character {
|
||||
.character-header-sheet {
|
||||
padding: 0 15px;
|
||||
padding-top: var(--header-height);
|
||||
width: 100%;
|
||||
|
||||
> *:not(line-div, .tab-navigation) {
|
||||
padding-left: 15px;
|
||||
padding-right: 15px;
|
||||
}
|
||||
|
||||
.name-row {
|
||||
display: flex;
|
||||
gap: 6px;
|
||||
align-items: start;
|
||||
justify-content: space-between;
|
||||
padding: 0;
|
||||
padding-top: 5px;
|
||||
flex: 1;
|
||||
|
||||
|
|
@ -100,8 +103,8 @@
|
|||
.character-details {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: 5px 0;
|
||||
margin-bottom: 8px;
|
||||
margin-top: 5px;
|
||||
margin-bottom: 10px;
|
||||
font-size: var(--font-size-12);
|
||||
color: @color-text-emphatic;
|
||||
|
||||
|
|
@ -130,7 +133,6 @@
|
|||
.character-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 0;
|
||||
margin-bottom: 12px;
|
||||
|
||||
.resource-section {
|
||||
|
|
@ -218,12 +220,11 @@
|
|||
|
||||
.character-traits {
|
||||
display: flex;
|
||||
padding: 0;
|
||||
margin-bottom: 15px;
|
||||
justify-content: space-between;
|
||||
max-width: 38.5rem;
|
||||
gap: 0.5rem;
|
||||
padding-left: 0.5rem;
|
||||
margin-left: 0.5rem;
|
||||
|
||||
.trait {
|
||||
cursor: pointer;
|
||||
|
|
@ -325,5 +326,9 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.tab-navigation button[data-action="openSettings"] {
|
||||
margin-right: 12px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
@import './sheet.less';
|
||||
@import './biography.less';
|
||||
@import './effects.less';
|
||||
@import './features.less';
|
||||
@import './header.less';
|
||||
@import './inventory.less';
|
||||
@import './loadout.less';
|
||||
@import './sheet.less';
|
||||
@import './sidebar.less';
|
||||
|
|
|
|||
|
|
@ -7,11 +7,9 @@
|
|||
.items-section {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
overflow-y: auto;
|
||||
margin-top: 20px;
|
||||
padding-bottom: 20px;
|
||||
.with-scroll-shadows();
|
||||
gap: 10px;
|
||||
padding: 8px calc(12px - var(--scrollbar-width)) 4px 12px;
|
||||
.stable-scroll-container();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,11 +50,8 @@
|
|||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
margin-top: 20px;
|
||||
padding-bottom: 20px;
|
||||
.with-scroll-shadows();
|
||||
padding: 8px calc(12px - var(--scrollbar-width)) 4px 12px;
|
||||
.stable-scroll-container();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
&.active {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
overflow: hidden;
|
||||
margin: 0 0 10px 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -89,113 +89,13 @@
|
|||
|
||||
.resources-section {
|
||||
justify-content: space-around;
|
||||
margin: 8px 2px 8px 2px;
|
||||
margin: 8px 2px 0 2px;
|
||||
}
|
||||
}
|
||||
|
||||
.resources-section {
|
||||
display: flex;
|
||||
justify-content: space-evenly;
|
||||
margin-bottom: 20px;
|
||||
|
||||
.status-bar {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
width: 120px;
|
||||
height: 40px;
|
||||
|
||||
.status-label {
|
||||
position: relative;
|
||||
top: 40px;
|
||||
height: 22px;
|
||||
width: 79px;
|
||||
clip-path: path('M0 0H79L74 16.5L39 22L4 16.5L0 0Z');
|
||||
background: light-dark(@dark-blue, @golden);
|
||||
|
||||
h4 {
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
line-height: 18px;
|
||||
color: light-dark(@beige, @dark-blue);
|
||||
}
|
||||
}
|
||||
|
||||
.status-value {
|
||||
position: absolute;
|
||||
display: flex;
|
||||
padding: 0 5px;
|
||||
font-size: 1.5rem;
|
||||
align-items: center;
|
||||
width: 140px;
|
||||
height: 40px;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
z-index: 2;
|
||||
color: @beige;
|
||||
|
||||
input[type='number'] {
|
||||
background: transparent;
|
||||
font-size: 1.5rem;
|
||||
width: 40px;
|
||||
height: 30px;
|
||||
text-align: center;
|
||||
border: none;
|
||||
outline: 2px solid transparent;
|
||||
color: @beige;
|
||||
|
||||
&.bar-input {
|
||||
padding: 0;
|
||||
color: @beige;
|
||||
backdrop-filter: none;
|
||||
background: transparent;
|
||||
transition: all 0.3s ease;
|
||||
|
||||
&:hover,
|
||||
&:focus {
|
||||
background: @semi-transparent-dark-blue;
|
||||
backdrop-filter: blur(9.5px);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.bar-label {
|
||||
width: 40px;
|
||||
}
|
||||
}
|
||||
.progress-bar {
|
||||
position: absolute;
|
||||
appearance: none;
|
||||
width: 100px;
|
||||
height: 40px;
|
||||
border: 1px solid @color-border;
|
||||
border-radius: 6px;
|
||||
z-index: 1;
|
||||
background: @dark-blue;
|
||||
|
||||
&::-webkit-progress-bar {
|
||||
border: none;
|
||||
background: @dark-blue;
|
||||
border-radius: 6px;
|
||||
}
|
||||
&::-webkit-progress-value {
|
||||
background: @gradient-hp;
|
||||
border-radius: 6px;
|
||||
}
|
||||
&.stress-color::-webkit-progress-value {
|
||||
background: @gradient-stress;
|
||||
border-radius: 6px;
|
||||
}
|
||||
&::-moz-progress-bar {
|
||||
background: @gradient-hp;
|
||||
border-radius: 6px;
|
||||
}
|
||||
&.stress-color::-moz-progress-bar {
|
||||
background: @gradient-stress;
|
||||
border-radius: 6px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.status-section {
|
||||
|
|
@ -245,21 +145,21 @@
|
|||
|
||||
.status-bar.armor-slots {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
width: 95px;
|
||||
height: 30px;
|
||||
white-space: nowrap;
|
||||
|
||||
.status-label {
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
.status-label {
|
||||
padding: 2px 2px;
|
||||
position: relative;
|
||||
top: 30px;
|
||||
height: 22px;
|
||||
width: 95px;
|
||||
border-radius: 3px;
|
||||
background: light-dark(@dark-blue, @golden);
|
||||
clip-path: none;
|
||||
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
|
@ -291,40 +191,16 @@
|
|||
}
|
||||
}
|
||||
.slot-value {
|
||||
position: absolute;
|
||||
display: flex;
|
||||
padding: 0 5px;
|
||||
font-size: 1.2rem;
|
||||
align-items: center;
|
||||
width: 80px;
|
||||
height: 30px;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
z-index: 2;
|
||||
color: light-dark(@dark-blue, @beige);
|
||||
flex-direction: column;
|
||||
|
||||
.slot-bar {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 4px;
|
||||
padding: 5px;
|
||||
border: 1px solid @color-border;
|
||||
border-radius: 6px;
|
||||
z-index: 1;
|
||||
background: @dark-blue;
|
||||
justify-content: center;
|
||||
color: @color-text-emphatic;
|
||||
|
||||
.armor-slot {
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
font-size: var(--font-size-12);
|
||||
|
||||
.fa-shield-halved {
|
||||
color: light-dark(@dark-blue-40, @golden-40);
|
||||
}
|
||||
}
|
||||
border-bottom: none;
|
||||
}
|
||||
.slot-label {
|
||||
display: flex;
|
||||
|
|
@ -364,41 +240,21 @@
|
|||
}
|
||||
}
|
||||
.status-value {
|
||||
position: absolute;
|
||||
display: flex;
|
||||
padding: 0 6px;
|
||||
font-size: 1.2rem;
|
||||
align-items: center;
|
||||
width: 80px;
|
||||
height: 30px;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
z-index: 2;
|
||||
color: light-dark(@dark-blue, @beige);
|
||||
border: 1px solid @color-border;
|
||||
border-bottom: none;
|
||||
border-radius: 6px 6px 0 0;
|
||||
|
||||
input[type='number'] {
|
||||
background: transparent;
|
||||
font-size: 1.2rem;
|
||||
width: 30px;
|
||||
height: 20px;
|
||||
text-align: center;
|
||||
border: none;
|
||||
outline: 2px solid transparent;
|
||||
color: light-dark(@dark-blue, @beige);
|
||||
|
||||
&.bar-input {
|
||||
padding: 0;
|
||||
color: light-dark(@dark-blue, @beige);
|
||||
backdrop-filter: none;
|
||||
background: transparent;
|
||||
&:hover,
|
||||
&:focus {
|
||||
background: @semi-transparent-dark-blue;
|
||||
backdrop-filter: blur(9.5px);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -407,32 +263,9 @@
|
|||
}
|
||||
}
|
||||
.progress-bar {
|
||||
position: absolute;
|
||||
appearance: none;
|
||||
width: 80px;
|
||||
height: 30px;
|
||||
border: 1px solid @color-border;
|
||||
border-radius: 6px;
|
||||
z-index: 1;
|
||||
background: light-dark(transparent, @dark-blue);
|
||||
border-bottom: none;
|
||||
border-radius: 6px 6px 0 0;
|
||||
&::-webkit-progress-bar {
|
||||
border: none;
|
||||
background: light-dark(transparent, @dark-blue);
|
||||
}
|
||||
&::-webkit-progress-value {
|
||||
background: @gradient-stress;
|
||||
}
|
||||
&.stress-color::-webkit-progress-value {
|
||||
background: @gradient-stress;
|
||||
}
|
||||
&::-moz-progress-bar {
|
||||
background: @gradient-stress;
|
||||
}
|
||||
&.stress-color::-moz-progress-bar {
|
||||
background: @gradient-stress;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,10 @@
|
|||
@import '../../../utils/colors.less';
|
||||
@import '../../../utils/fonts.less';
|
||||
|
||||
.application.sheet.daggerheart.actor.dh-style.companion {
|
||||
.application.sheet.daggerheart.actor.dh-style.companion .tab.details.active {
|
||||
padding: 12px calc(12px - var(--scrollbar-width)) 4px 12px;
|
||||
.stable-scroll-container();
|
||||
|
||||
.partner-section,
|
||||
.attack-section,
|
||||
.experience-list {
|
||||
|
|
|
|||
|
|
@ -6,9 +6,8 @@
|
|||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
overflow-y: auto;
|
||||
padding-bottom: 20px;
|
||||
.with-scroll-shadows();
|
||||
padding: 7px calc(12px - var(--scrollbar-width)) 4px 12px;
|
||||
.stable-scroll-container();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,12 +5,8 @@
|
|||
.application.sheet.daggerheart.actor.dh-style.environment {
|
||||
.tab.features {
|
||||
.feature-section {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
overflow-y: auto;
|
||||
padding-bottom: 4px;
|
||||
.with-scroll-shadows();
|
||||
padding: 16px calc(16px - var(--scrollbar-width)) 4px 16px;
|
||||
.stable-scroll-container();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
@import './sheet.less';
|
||||
@import './features.less';
|
||||
@import './header.less';
|
||||
@import './potentialAdversaries.less';
|
||||
@import './sheet.less';
|
||||
|
|
|
|||
|
|
@ -6,9 +6,8 @@
|
|||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
overflow-y: auto;
|
||||
padding-bottom: 4px;
|
||||
.with-scroll-shadows();
|
||||
padding: 7px calc(12px - var(--scrollbar-width)) 4px 12px;
|
||||
.stable-scroll-container();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,9 +14,7 @@
|
|||
|
||||
.application.sheet.daggerheart.actor.dh-style.environment {
|
||||
.tab {
|
||||
flex: 1;
|
||||
overflow-y: auto;
|
||||
|
||||
&.active {
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
|
|
|
|||
|
|
@ -7,12 +7,8 @@
|
|||
}
|
||||
|
||||
.feature-section {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
overflow-y: auto;
|
||||
padding-bottom: 4px;
|
||||
.with-scroll-shadows();
|
||||
padding: 16px calc(16px - var(--scrollbar-width)) 4px 16px;
|
||||
.stable-scroll-container();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,295 +1,286 @@
|
|||
@import '../../../utils/colors.less';
|
||||
@import '../../../utils/fonts.less';
|
||||
@import '../../../utils/mixin.less';
|
||||
|
||||
.application.sheet.daggerheart.actor.dh-style.party .tab.partyMembers {
|
||||
overflow: auto;
|
||||
|
||||
.actors-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
align-items: stretch;
|
||||
width: 100%;
|
||||
|
||||
.actor-resources {
|
||||
display: grid;
|
||||
grid-template:
|
||||
"img header" min-content
|
||||
"img body" 1fr
|
||||
/ 7.5rem 1fr;
|
||||
gap: 6px;
|
||||
column-gap: 12px;
|
||||
padding: 6px;
|
||||
background-color: light-dark(@dark-blue-10, @golden-10);
|
||||
|
||||
.actor-img-frame {
|
||||
grid-area: img;
|
||||
width: 7.375rem;
|
||||
height: 7.375rem;
|
||||
position: relative;
|
||||
|
||||
.actor-img {
|
||||
object-fit: cover;
|
||||
object-position: top center;
|
||||
border-radius: 6px;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.equipped-weapons {
|
||||
position: absolute;
|
||||
top: -2px;
|
||||
left: -3px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 1px;
|
||||
img {
|
||||
border-radius: 50%;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
border: 1px solid @color-border;
|
||||
object-fit: cover;
|
||||
}
|
||||
}
|
||||
|
||||
.evasion {
|
||||
position: absolute;
|
||||
top: 1px;
|
||||
right: 1px;
|
||||
width: 1.75rem;
|
||||
height: 1.75rem;
|
||||
background: url('../assets/svg/trait-shield.svg') no-repeat;
|
||||
background-size: 100%;
|
||||
color: var(--color-light-1);
|
||||
font-size: var(--font-size-14);
|
||||
font-weight: 700;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.threshold-section {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: -2px;
|
||||
margin: auto;
|
||||
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
background-color: light-dark(var(--color-light-1), @dark-blue);
|
||||
color: @color-text-emphatic;
|
||||
padding: 4px 6px;
|
||||
border: 1px solid @color-border;
|
||||
border-radius: 3px;
|
||||
align-items: baseline;
|
||||
width: fit-content;
|
||||
|
||||
h4 {
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
white-space: nowrap;
|
||||
|
||||
&.threshold-label {
|
||||
font-size: var(--font-size-10);
|
||||
color: @color-text-emphatic;
|
||||
}
|
||||
|
||||
&.threshold-value {
|
||||
font-size: var(--font-size-11);
|
||||
color: light-dark(@dark, @beige);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
header {
|
||||
grid-area: header;
|
||||
display: grid;
|
||||
grid-template:
|
||||
"name hope" min-content
|
||||
"subtitle subtitle" min-content
|
||||
/ 1fr min-content;
|
||||
|
||||
.actor-name {
|
||||
width: 100%;
|
||||
z-index: 1;
|
||||
font-size: var(--font-size-20);
|
||||
color: @color-text-emphatic;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.delete-icon {
|
||||
font-size: 0.75em;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
grid-area: subtitle;
|
||||
font-size: var(--font-size-14);
|
||||
}
|
||||
|
||||
.hope-section {
|
||||
display: flex;
|
||||
background-color: light-dark(transparent, @dark-blue);
|
||||
color: @color-text-emphatic;
|
||||
padding: 3px 6px;
|
||||
border: 1px solid @color-border;
|
||||
border-radius: 3px;
|
||||
align-items: center;
|
||||
width: fit-content;
|
||||
margin-left: auto;
|
||||
|
||||
h4 {
|
||||
font-size: var(--font-size-12);
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
color: @color-text-emphatic;
|
||||
margin-right: 3px;
|
||||
}
|
||||
|
||||
.hope-value {
|
||||
display: flex;
|
||||
cursor: pointer;
|
||||
font-size: var(--font-size-12);
|
||||
margin-left: 1px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.body {
|
||||
grid-area: body;
|
||||
display: flex;
|
||||
align-items: start;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.resources {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
|
||||
.slot-section {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: stretch;
|
||||
|
||||
.slot-label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: light-dark(@beige, @dark-blue);
|
||||
background: light-dark(@dark-blue, @golden);
|
||||
padding: 0 4px;
|
||||
width: fit-content;
|
||||
font-weight: bold;
|
||||
border-radius: 6px 0px 0px 6px;
|
||||
font-size: var(--font-size-12);
|
||||
white-space: nowrap;
|
||||
|
||||
.label {
|
||||
padding-right: 2px;
|
||||
}
|
||||
|
||||
.value {
|
||||
font-variant-numeric: tabular-nums;
|
||||
.current {
|
||||
display: inline-block;
|
||||
text-align: end;
|
||||
width: 2ch;
|
||||
}
|
||||
.max {
|
||||
display: inline-block;
|
||||
text-align: start;
|
||||
width: 2ch;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.slot-bar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 4px;
|
||||
|
||||
background-color: light-dark(@dark-blue-10, @dark-blue);
|
||||
color: @color-text-emphatic;
|
||||
padding: 2px 5px;
|
||||
border: 1px solid @color-border;
|
||||
border-radius: 0 6px 6px 0;
|
||||
width: fit-content;
|
||||
min-height: 22px;
|
||||
|
||||
.armor-slot {
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
font-size: var(--font-size-12);
|
||||
|
||||
.fa-shield-halved {
|
||||
color: light-dark(@dark-blue-40, @golden-40);
|
||||
}
|
||||
}
|
||||
|
||||
.slot {
|
||||
width: 16px;
|
||||
height: 10px;
|
||||
border: 1px solid @color-border;
|
||||
background: light-dark(@dark-blue-10, @golden-10);
|
||||
border-radius: 3px;
|
||||
transition: all 0.3s ease;
|
||||
cursor: pointer;
|
||||
|
||||
&.filled {
|
||||
background: light-dark(@dark-blue, @golden);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.traits {
|
||||
background-color: light-dark(@dark-blue-10, @dark-blue);
|
||||
border: 1px solid @color-border;
|
||||
border-radius: 6px;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
font-size: var(--font-size-12);
|
||||
padding: 3px 4px;
|
||||
gap: 3px 7px;
|
||||
.trait {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
gap: 3px;
|
||||
.label {
|
||||
color: @color-text-emphatic;
|
||||
}
|
||||
.value {
|
||||
font-weight: 600;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.actors-list.limited {
|
||||
.actor-resources {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.actor-img-frame {
|
||||
width: 3rem;
|
||||
height: 3rem;
|
||||
}
|
||||
}
|
||||
|
||||
.actors-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);
|
||||
}
|
||||
}
|
||||
@import '../../../utils/colors.less';
|
||||
@import '../../../utils/fonts.less';
|
||||
@import '../../../utils/mixin.less';
|
||||
|
||||
.application.sheet.daggerheart.actor.dh-style.party .tab.partyMembers {
|
||||
padding: 12px calc(12px - var(--scrollbar-width)) 4px 12px;
|
||||
.stable-scroll-container();
|
||||
|
||||
.actions-section {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 10px;
|
||||
margin-bottom: 10px;
|
||||
gap: 20px;
|
||||
background-color: light-dark(@dark-blue-10, @golden-10);
|
||||
|
||||
button {
|
||||
span {
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
.active-action {
|
||||
animation: glow 0.75s infinite alternate;
|
||||
}
|
||||
}
|
||||
|
||||
.actors-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
align-items: stretch;
|
||||
width: 100%;
|
||||
|
||||
.actor-resources {
|
||||
display: grid;
|
||||
grid-template:
|
||||
"img header" min-content
|
||||
"img body" 1fr
|
||||
/ 7.5rem 1fr;
|
||||
gap: 6px;
|
||||
column-gap: 12px;
|
||||
padding: 6px;
|
||||
background-color: light-dark(@dark-blue-10, @golden-10);
|
||||
|
||||
.actor-img-frame {
|
||||
grid-area: img;
|
||||
width: 7.375rem;
|
||||
height: 7.375rem;
|
||||
position: relative;
|
||||
|
||||
.actor-img {
|
||||
object-fit: cover;
|
||||
object-position: top center;
|
||||
border-radius: 6px;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.equipped-weapons {
|
||||
position: absolute;
|
||||
top: -2px;
|
||||
left: -3px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 1px;
|
||||
img {
|
||||
border-radius: 50%;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
border: 1px solid @color-border;
|
||||
object-fit: cover;
|
||||
}
|
||||
}
|
||||
|
||||
.evasion {
|
||||
position: absolute;
|
||||
top: 1px;
|
||||
right: 1px;
|
||||
width: 1.75rem;
|
||||
height: 1.75rem;
|
||||
background: url('../assets/svg/trait-shield.svg') no-repeat;
|
||||
background-size: 100%;
|
||||
color: var(--color-light-1);
|
||||
font-size: var(--font-size-14);
|
||||
font-weight: 700;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.threshold-section {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: -2px;
|
||||
margin: auto;
|
||||
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
background-color: light-dark(var(--color-light-1), @dark-blue);
|
||||
color: @color-text-emphatic;
|
||||
padding: 4px 6px;
|
||||
border: 1px solid @color-border;
|
||||
border-radius: 3px;
|
||||
align-items: baseline;
|
||||
width: fit-content;
|
||||
|
||||
h4 {
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
white-space: nowrap;
|
||||
|
||||
&.threshold-label {
|
||||
font-size: var(--font-size-10);
|
||||
color: @color-text-emphatic;
|
||||
}
|
||||
|
||||
&.threshold-value {
|
||||
font-size: var(--font-size-11);
|
||||
color: light-dark(@dark, @beige);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
header {
|
||||
grid-area: header;
|
||||
display: grid;
|
||||
grid-template:
|
||||
"name hope" min-content
|
||||
"subtitle subtitle" min-content
|
||||
/ 1fr min-content;
|
||||
|
||||
.actor-name {
|
||||
width: 100%;
|
||||
z-index: 1;
|
||||
font-size: var(--font-size-20);
|
||||
color: @color-text-emphatic;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.delete-icon {
|
||||
font-size: 0.75em;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
grid-area: subtitle;
|
||||
font-size: var(--font-size-14);
|
||||
}
|
||||
|
||||
.hope-section {
|
||||
display: flex;
|
||||
background-color: light-dark(transparent, @dark-blue);
|
||||
color: @color-text-emphatic;
|
||||
padding: 3px 6px;
|
||||
border: 1px solid @color-border;
|
||||
border-radius: 3px;
|
||||
align-items: center;
|
||||
width: fit-content;
|
||||
margin-left: auto;
|
||||
|
||||
h4 {
|
||||
font-size: var(--font-size-12);
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
color: @color-text-emphatic;
|
||||
margin-right: 3px;
|
||||
}
|
||||
|
||||
.hope-value {
|
||||
display: flex;
|
||||
cursor: pointer;
|
||||
font-size: var(--font-size-12);
|
||||
margin-left: 1px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.body {
|
||||
grid-area: body;
|
||||
display: flex;
|
||||
align-items: start;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.resources {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
|
||||
.slot-section {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: stretch;
|
||||
|
||||
.slot-label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: light-dark(@beige, @dark-blue);
|
||||
background: light-dark(@dark-blue, @golden);
|
||||
padding: 0 4px;
|
||||
width: fit-content;
|
||||
font-weight: bold;
|
||||
border-radius: 6px 0px 0px 6px;
|
||||
font-size: var(--font-size-12);
|
||||
white-space: nowrap;
|
||||
|
||||
.label {
|
||||
padding-right: 2px;
|
||||
}
|
||||
|
||||
.value {
|
||||
font-variant-numeric: tabular-nums;
|
||||
.current {
|
||||
display: inline-block;
|
||||
text-align: end;
|
||||
width: 2ch;
|
||||
}
|
||||
.max {
|
||||
display: inline-block;
|
||||
text-align: start;
|
||||
width: 2ch;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.slot-bar {
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
background-color: light-dark(@dark-blue-10, @dark-blue);
|
||||
padding: 2px 5px;
|
||||
border-radius: 0 6px 6px 0;
|
||||
width: fit-content;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.traits {
|
||||
background-color: light-dark(@dark-blue-10, @dark-blue);
|
||||
border: 1px solid @color-border;
|
||||
border-radius: 6px;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
font-size: var(--font-size-12);
|
||||
padding: 3px 4px;
|
||||
gap: 3px 7px;
|
||||
.trait {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
gap: 3px;
|
||||
.label {
|
||||
color: @color-text-emphatic;
|
||||
}
|
||||
.value {
|
||||
font-weight: 600;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.actors-list.limited {
|
||||
.actor-resources {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.actor-img-frame {
|
||||
width: 3rem;
|
||||
height: 3rem;
|
||||
}
|
||||
}
|
||||
|
||||
.actors-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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,35 +17,8 @@
|
|||
});
|
||||
|
||||
.application.sheet.daggerheart.actor.dh-style.party {
|
||||
.tab {
|
||||
flex: 1;
|
||||
overflow-y: auto;
|
||||
scrollbar-gutter: stable;
|
||||
|
||||
&.active {
|
||||
overflow: auto;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.actions-section {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 10px;
|
||||
margin-bottom: 10px;
|
||||
gap: 20px;
|
||||
background-color: light-dark(@dark-blue-10, @golden-10);
|
||||
|
||||
button {
|
||||
span {
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
.active-action {
|
||||
animation: glow 0.75s infinite alternate;
|
||||
}
|
||||
}
|
||||
.tab.active {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -174,10 +174,10 @@
|
|||
--fade-start: 0;
|
||||
}
|
||||
10%, 100% {
|
||||
--fade-start: 12px;
|
||||
--fade-start: 14px;
|
||||
}
|
||||
0%, 90% {
|
||||
--fade-end: 12px;
|
||||
--fade-end: 14px;
|
||||
}
|
||||
100% {
|
||||
--fade-end: 0;
|
||||
|
|
@ -198,3 +198,9 @@
|
|||
transparent 100%
|
||||
);
|
||||
}
|
||||
|
||||
.stable-scroll-container() {
|
||||
overflow-y: auto;
|
||||
scrollbar-gutter: stable;
|
||||
.with-scroll-shadows();
|
||||
}
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
"id": "daggerheart",
|
||||
"title": "Daggerheart",
|
||||
"description": "An unofficial implementation of the Daggerheart system",
|
||||
"version": "2.4.2",
|
||||
"version": "2.5.0",
|
||||
"compatibility": {
|
||||
"minimum": "14.364",
|
||||
"verified": "14.364",
|
||||
|
|
@ -10,7 +10,7 @@
|
|||
},
|
||||
"url": "https://github.com/Foundryborne/daggerheart",
|
||||
"manifest": "https://raw.githubusercontent.com/Foundryborne/daggerheart/v14/system.json",
|
||||
"download": "https://github.com/Foundryborne/daggerheart/releases/download/2.4.2/system.zip",
|
||||
"download": "https://github.com/Foundryborne/daggerheart/releases/download/2.5.0/system.zip",
|
||||
"authors": [
|
||||
{
|
||||
"name": "WBHarry"
|
||||
|
|
|
|||
|
|
@ -11,9 +11,10 @@
|
|||
<a class="btn" data-tooltip="{{localize "CONTROLS.CommonDelete"}}" data-action="removeElement" data-index="{{index}}"><i class="fas fa-trash"></i></a>
|
||||
</div>
|
||||
<div class="nest-inputs">
|
||||
{{formField ../fields.type value=area.type name=(concat "areas." index ".type") localize=true}}
|
||||
{{formField ../fields.shape value=area.shape name=(concat "areas." index ".shape") localize=true}}
|
||||
{{formField ../fields.size value=area.size name=(concat "areas." index ".size") localize=true}}
|
||||
{{formField ../fields.type value=area.type name=(concat "areas." index ".type") localize=true blank=false}}
|
||||
{{formField ../fields.shape value=area.shape name=(concat "areas." index ".shape") localize=true blank=false}}
|
||||
{{formField ../fields.size value=area.size name=(concat "areas." index ".size") localize=true blank=false}}
|
||||
{{formField ../fields.hasHole value=area.hasHole name=(concat "areas." index ".hasHole") localize=true classes="auto-sized" }}
|
||||
</div>
|
||||
|
||||
<div class="sub-section-header">
|
||||
|
|
|
|||
|
|
@ -1,14 +1,15 @@
|
|||
<section class='tab {{tabs.features.cssClass}} {{tabs.features.id}}' data-tab='{{tabs.features.id}}'
|
||||
data-group='{{tabs.features.group}}'>
|
||||
<div class="feature-section">
|
||||
{{> 'daggerheart.inventory-items'
|
||||
title=tabs.features.label
|
||||
type='feature'
|
||||
collection=@root.features
|
||||
hideContextMenu=true
|
||||
hideModifyControls=true
|
||||
canCreate=@root.editable
|
||||
showActions=@root.editable
|
||||
}}
|
||||
<div class="feature-section items-list">
|
||||
{{#each @root.features as |item|}}
|
||||
{{> "daggerheart.inventory-item"
|
||||
item=item
|
||||
type="feature"
|
||||
actorType=@root.document.type
|
||||
hideContextMenu=true
|
||||
hideModifyControls=true
|
||||
showActions=@root.editable
|
||||
}}
|
||||
{{/each}}
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,100 +1,102 @@
|
|||
<aside class="adversary-sidebar-sheet">
|
||||
<div class="portrait {{#if (and source.system.resources.hitPoints.max (gte source.system.resources.hitPoints.value source.system.resources.hitPoints.max))}}death-roll{{/if}}">
|
||||
<img src="{{source.img}}" alt="{{source.name}}" data-action='editImage' data-edit="img">
|
||||
<a class="death-roll-btn"><i class="fa-solid fa-skull death-save"></i></a>
|
||||
</div>
|
||||
|
||||
<div class="info-section {{#if useResourcePips}}pip-display{{/if}}">
|
||||
<div class="resources-section">
|
||||
{{> "systems/daggerheart/templates/sheets/global/partials/resource-bar.hbs" resource=resources.hitPoints label="DAGGERHEART.GENERAL.HitPoints.short" key="system.resources.hitPoints.value" action="toggleHitPoints" }}
|
||||
{{> "systems/daggerheart/templates/sheets/global/partials/resource-bar.hbs" resource=resources.stress label="DAGGERHEART.GENERAL.stress" key="system.resources.stress.value" action="toggleStress" }}
|
||||
</div>
|
||||
<div class="status-section">
|
||||
<div class="status-number">
|
||||
<div class='status-value armor-slots'>
|
||||
{{#if source.system.difficulty}}
|
||||
<p>{{source.system.difficulty}}</p>
|
||||
{{else}}
|
||||
<p>-</p>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="status-label">
|
||||
<h4>{{localize "DAGGERHEART.GENERAL.difficulty"}}</h4>
|
||||
</div>
|
||||
</div>
|
||||
<div class="status-number">
|
||||
<div class='status-value armor-slots'>
|
||||
{{#if source.system.attack.roll.bonus includeZero=true}}
|
||||
<p>{{numberFormat source.system.attack.roll.bonus sign=true}}</p>
|
||||
{{else}}
|
||||
<p>-</p>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="status-label">
|
||||
<h4>{{localize "DAGGERHEART.GENERAL.attack"}}</h4>
|
||||
</div>
|
||||
</div>
|
||||
{{#if (lt source.system.criticalThreshold 20)}}
|
||||
<div class="status-number">
|
||||
<div class='status-value armor-slots'>
|
||||
<p>{{source.system.criticalThreshold}}+</p>
|
||||
</div>
|
||||
<div class="status-label">
|
||||
<h4>{{localize "DAGGERHEART.GENERAL.criticalShort"}}</h4>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="status-section">
|
||||
<div class="threshold-section">
|
||||
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.minor"}}</h4>
|
||||
<h4 class="threshold-value">{{document.system.damageThresholds.major}}</h4>
|
||||
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.major"}}</h4>
|
||||
<h4 class="threshold-value">{{document.system.damageThresholds.severe}}</h4>
|
||||
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.severe"}}</h4>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="shortcut-items-section">
|
||||
<div class="attack-section">
|
||||
<div class="title">
|
||||
<side-line-div class="invert"></side-line-div>
|
||||
<h3>{{localize "DAGGERHEART.GENERAL.attack"}}</h3>
|
||||
<side-line-div></side-line-div>
|
||||
</div>
|
||||
<ul class="items-sidebar-list">
|
||||
{{> 'daggerheart.inventory-item-compact'
|
||||
item=document.system.attack
|
||||
type='attack'
|
||||
noCompendiumEdit=true
|
||||
}}
|
||||
</ul>
|
||||
</div>
|
||||
<div class="experience-section">
|
||||
<div class="title">
|
||||
<side-line-div class="invert"></side-line-div>
|
||||
<h3>{{localize "DAGGERHEART.GENERAL.experience.plural"}}</h3>
|
||||
<side-line-div></side-line-div>
|
||||
</div>
|
||||
<div class="experience-list">
|
||||
{{#each source.system.experiences as |experience id|}}
|
||||
<div class="experience-row" data-tooltip-text="{{experience.description}}">
|
||||
<span class="experience-value">
|
||||
+{{experience.value}}
|
||||
</span>
|
||||
<span class="experience-name">{{experience.name}}</span>
|
||||
<div class="controls">
|
||||
<a data-action="sendExpToChat" data-id="{{id}}">
|
||||
<i class="fa-regular fa-message"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
<line-div></line-div>
|
||||
<div class="reaction-section">
|
||||
<button type="button" data-action="reactionRoll">{{localize "DAGGERHEART.GENERAL.Roll.reaction"}}</button>
|
||||
</div>
|
||||
</div>
|
||||
<aside class="adversary-sidebar-sheet">
|
||||
<div class="portrait {{#if (and source.system.resources.hitPoints.max (gte source.system.resources.hitPoints.value source.system.resources.hitPoints.max))}}death-roll{{/if}}">
|
||||
<img src="{{source.img}}" alt="{{source.name}}" data-action='editImage' data-edit="img">
|
||||
<a class="death-roll-btn"><i class="fa-solid fa-skull death-save"></i></a>
|
||||
</div>
|
||||
|
||||
<div class="info-section {{#if useResourcePips}}pip-display{{/if}}">
|
||||
<div class="resources-section">
|
||||
{{> "systems/daggerheart/templates/sheets/global/partials/resource-bar.hbs" resource=resources.hitPoints label="DAGGERHEART.GENERAL.HitPoints.short" key="system.resources.hitPoints.value" action="toggleHitPoints" }}
|
||||
{{> "systems/daggerheart/templates/sheets/global/partials/resource-bar.hbs" resource=resources.stress label="DAGGERHEART.GENERAL.stress" key="system.resources.stress.value" action="toggleStress" }}
|
||||
</div>
|
||||
<div class="status-section">
|
||||
<div class="status-number">
|
||||
<div class='status-value armor-slots'>
|
||||
{{#if source.system.difficulty}}
|
||||
<p>{{source.system.difficulty}}</p>
|
||||
{{else}}
|
||||
<p>-</p>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="status-label">
|
||||
<h4>{{localize "DAGGERHEART.GENERAL.difficulty"}}</h4>
|
||||
</div>
|
||||
</div>
|
||||
<div class="status-number">
|
||||
<div class='status-value armor-slots'>
|
||||
{{#if source.system.attack.roll.bonus includeZero=true}}
|
||||
<p>{{numberFormat source.system.attack.roll.bonus sign=true}}</p>
|
||||
{{else}}
|
||||
<p>-</p>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="status-label">
|
||||
<h4>{{localize "DAGGERHEART.GENERAL.attack"}}</h4>
|
||||
</div>
|
||||
</div>
|
||||
{{#if (lt source.system.criticalThreshold 20)}}
|
||||
<div class="status-number">
|
||||
<div class='status-value armor-slots'>
|
||||
<p>{{source.system.criticalThreshold}}+</p>
|
||||
</div>
|
||||
<div class="status-label">
|
||||
<h4>{{localize "DAGGERHEART.GENERAL.criticalShort"}}</h4>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="status-section">
|
||||
<div class="threshold-section">
|
||||
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.minor"}}</h4>
|
||||
<h4 class="threshold-value">{{document.system.damageThresholds.major}}</h4>
|
||||
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.major"}}</h4>
|
||||
<h4 class="threshold-value">{{document.system.damageThresholds.severe}}</h4>
|
||||
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.severe"}}</h4>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="shortcut-items-section">
|
||||
<div class="attack-section">
|
||||
<div class="title">
|
||||
<side-line-div class="invert"></side-line-div>
|
||||
<h3>{{localize "DAGGERHEART.GENERAL.attack"}}</h3>
|
||||
<side-line-div></side-line-div>
|
||||
</div>
|
||||
<ul class="items-sidebar-list">
|
||||
{{> 'daggerheart.inventory-item-compact'
|
||||
item=document.system.attack
|
||||
type='attack'
|
||||
noCompendiumEdit=true
|
||||
}}
|
||||
</ul>
|
||||
</div>
|
||||
<div class="experience-section">
|
||||
<div class="title">
|
||||
<side-line-div class="invert"></side-line-div>
|
||||
<h3>{{localize "DAGGERHEART.GENERAL.experience.plural"}}</h3>
|
||||
<side-line-div></side-line-div>
|
||||
</div>
|
||||
<div class="experience-list">
|
||||
{{#each source.system.experiences as |experience id|}}
|
||||
<div class="experience-row" data-tooltip-text="{{experience.description}}">
|
||||
<span class="experience-value">
|
||||
+{{experience.value}}
|
||||
</span>
|
||||
<span class="experience-name">{{experience.name}}</span>
|
||||
<div class="controls">
|
||||
<a data-action="sendExpToChat" data-id="{{id}}">
|
||||
<i class="fa-regular fa-message"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="reaction-section">
|
||||
<button type="button" data-action="reactionRoll">
|
||||
<i class="fa-solid fa-dice"></i>
|
||||
{{localize "DAGGERHEART.GENERAL.Roll.reaction"}}
|
||||
</button>
|
||||
</div>
|
||||
</aside>
|
||||
|
|
@ -1,26 +1,26 @@
|
|||
<section class='tab {{tabs.features.cssClass}} {{tabs.features.id}}' data-tab='{{tabs.features.id}}'
|
||||
data-group='{{tabs.features.group}}'>
|
||||
<div class="features-sections">
|
||||
{{#each document.system.sheetLists as |category|}}
|
||||
{{#if (eq category.type 'feature' )}}
|
||||
{{> 'daggerheart.inventory-items'
|
||||
title=category.title
|
||||
type='feature'
|
||||
actorType='character'
|
||||
collection=category.values
|
||||
canCreate=@root.editable
|
||||
showActions=@root.editable
|
||||
}}
|
||||
{{else if category.values}}
|
||||
{{> 'daggerheart.inventory-items'
|
||||
title=category.title
|
||||
type='feature'
|
||||
actorType='character'
|
||||
collection=category.values
|
||||
canCreate=false
|
||||
showActions=@root.editable
|
||||
}}
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
</div>
|
||||
<section class='tab {{tabs.features.cssClass}} {{tabs.features.id}}' data-tab='{{tabs.features.id}}'
|
||||
data-group='{{tabs.features.group}}'>
|
||||
<div class="features-sections">
|
||||
{{#each document.system.sheetLists as |category|}}
|
||||
{{#if (eq category.type 'feature' )}}
|
||||
{{> 'daggerheart.inventory-items'
|
||||
title=category.title
|
||||
type='feature'
|
||||
actorType='character'
|
||||
collection=category.values
|
||||
canCreate=@root.editable
|
||||
showActions=@root.editable
|
||||
}}
|
||||
{{else if category.values}}
|
||||
{{> 'daggerheart.inventory-items'
|
||||
title=category.title
|
||||
type='feature'
|
||||
actorType='character'
|
||||
collection=category.values
|
||||
canCreate=false
|
||||
showActions=@root.editable
|
||||
}}
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,165 +1,163 @@
|
|||
<header class="character-header-sheet">
|
||||
<line-div></line-div>
|
||||
<div class="name-row">
|
||||
<h1
|
||||
class="actor-name input"
|
||||
contenteditable="plaintext-only"
|
||||
data-property="name"
|
||||
placeholder="{{localize "DAGGERHEART.GENERAL.actorName"}}"
|
||||
autocomplete="off"
|
||||
spellcheck="false"
|
||||
>{{source.name}}</h1>
|
||||
<div class='level-div'>
|
||||
<h3 class='label'>
|
||||
{{#if @root.editable}}
|
||||
{{#if document.system.needsCharacterSetup}}
|
||||
<button
|
||||
type="button"
|
||||
class="level-button glow"
|
||||
data-action="levelManagement"
|
||||
>
|
||||
{{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.buttonTitle"}}
|
||||
</button>
|
||||
{{else if document.system.levelData.canLevelUp}}
|
||||
<button
|
||||
type="button"
|
||||
class="level-button glow" data-tooltip="{{localize "DAGGERHEART.ACTORS.Character.levelUp"}}"
|
||||
data-action="levelManagement"
|
||||
>
|
||||
<i class="fa-solid fa-angles-up"></i>
|
||||
</button>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
{{#unless document.system.needsCharacterSetup}}
|
||||
{{localize 'DAGGERHEART.GENERAL.level'}}
|
||||
<input type="text" data-dtype="Number" class="level-value" value={{#if document.system.needsCharacterSetup}}0{{else}}{{document.system.levelData.level.changed}}{{/if}} {{#if document.system.needsCharacterSetup}}disabled{{/if}} />
|
||||
{{/unless}}
|
||||
</h3>
|
||||
</div>
|
||||
</div>
|
||||
<div class="character-details">
|
||||
<div>
|
||||
{{#if document.system.class.value}}
|
||||
<span data-action="editDoc" data-item-uuid="{{document.system.class.value.uuid}}">{{document.system.class.value.name}}</span>
|
||||
{{else}}
|
||||
<span class="missing-header-feature" data-action="openPack" data-key="classes">{{localize 'TYPES.Item.class'}}</span>
|
||||
{{/if}}
|
||||
<span class="dot">•</span>
|
||||
{{#if document.system.class.subclass}}
|
||||
<span data-action="editDoc" data-item-uuid="{{document.system.class.subclass.uuid}}">{{document.system.class.subclass.name}}</span>
|
||||
{{else}}
|
||||
<span class="missing-header-feature" data-action="openPack" data-key="subclasses">{{localize 'TYPES.Item.subclass'}}</span>
|
||||
{{/if}}
|
||||
<span class="dot">•</span>
|
||||
{{#if document.system.community}}
|
||||
<span data-action="editDoc" data-item-uuid="{{document.system.community.uuid}}">{{document.system.community.name}}</span>
|
||||
{{else}}
|
||||
<span class="missing-header-feature" data-action="openPack" data-key="communities">{{localize 'TYPES.Item.community'}}</span>
|
||||
{{/if}}
|
||||
<span class="dot">•</span>
|
||||
{{#if document.system.ancestry}}
|
||||
<span data-action="editDoc" data-item-uuid="{{document.system.ancestry.uuid}}">{{document.system.ancestry.name}}</span>
|
||||
{{else}}
|
||||
<span class="missing-header-feature" data-action="openPack" data-key="ancestries">{{localize 'TYPES.Item.ancestry'}}</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
{{#if (or document.system.multiclass.value document.system.multiclass.subclass)}}
|
||||
<div class="multiclass">
|
||||
{{#if document.system.multiclass.value}}
|
||||
<span data-action="editDoc"data-item-uuid="{{document.system.multiclass.value.uuid}}">{{document.system.multiclass.value.name}}</span>
|
||||
{{else}}
|
||||
<span data-action="openPack" data-key="classes">{{localize 'DAGGERHEART.GENERAL.multiclass'}}</span>
|
||||
{{/if}}
|
||||
<span class="dot">•</span>
|
||||
{{#if document.system.multiclass.subclass}}
|
||||
<span data-action="editDoc" data-item-uuid="{{document.system.multiclass.subclass.uuid}}">{{document.system.multiclass.subclass.name}}</span>
|
||||
{{else}}
|
||||
<span class="missing-header-feature" data-action="openPack" data-key="subclasses">{{localize 'TYPES.Item.subclass'}}</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div class="character-row">
|
||||
<div class="resource-section">
|
||||
<div class="hope-section">
|
||||
<h4>{{localize "DAGGERHEART.GENERAL.hope"}}</h4>
|
||||
{{#times document.system.resources.hope.max}}
|
||||
<span class='hope-value' data-action='toggleHope' data-value="{{add this 1}}">
|
||||
{{#if (gte ../document.system.resources.hope.value (add this 1))}}
|
||||
<i class='fa-solid fa-diamond'></i>
|
||||
{{else}}
|
||||
<i class='fa-regular fa-circle'></i>
|
||||
{{/if}}
|
||||
</span>
|
||||
{{/times}}
|
||||
{{#times document.system.scars}}
|
||||
<span class='hope-value scar'>
|
||||
<i class='fa-regular fa-ban'></i>
|
||||
</span>
|
||||
{{/times}}
|
||||
{{#if hasExtraResources}}<a type="button" class="resource-manager" data-action="toggleResourceManagement"><i class="fa-solid fa-angle-down"></i></a>{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
{{#if document.system.class.value}}
|
||||
<div class="domains-section">
|
||||
{{#each document.system.domainData as |data|}}
|
||||
<div class="domain">
|
||||
<img src="{{data.src}}" alt="" data-tooltip="{{data.label}}" />
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
{{/if}}
|
||||
<div class="downtime-section">
|
||||
{{#if document.parties.size}}
|
||||
<button type="button" data-action="viewParty" data-tooltip="DAGGERHEART.ACTORS.Character.viewParty">
|
||||
<i class="fa-solid fa-fw fa-users"></i>
|
||||
</button>
|
||||
{{/if}}
|
||||
{{#if @root.editable}}
|
||||
<button type="button" data-action="useDowntime" data-type="shortRest" data-tooltip="DAGGERHEART.APPLICATIONS.Downtime.shortRest.title">
|
||||
<i class="fa-solid fa-fw fa-utensils"></i>
|
||||
</button>
|
||||
<button type="button" data-action="useDowntime" data-type="longRest" data-tooltip="DAGGERHEART.APPLICATIONS.Downtime.longRest.title">
|
||||
<i class="fa-solid fa-fw fa-bed"></i>
|
||||
</button>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="character-traits">
|
||||
{{#each this.attributes as |attribute key|}}
|
||||
<div class="trait {{#if isSpellcasting}}with-spellcasting{{/if}}" data-tooltip="<b>{{attribute.label}}:</b><br>{{#each attribute.verbs}}{{this}}<br>{{/each}}" data-action="rollAttribute" data-attribute="{{key}}" data-value="{{attribute.value}}">
|
||||
<div class="trait-name">
|
||||
<div class="tier-mark {{#if attribute.tierMarked}}marked{{/if}}"></div>
|
||||
<span>{{attribute.label}}</span>
|
||||
</div>
|
||||
<div class="trait-value-area">
|
||||
<svg width="52" height="46" viewBox="0 0 52 46" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M 0,0 H 52 L 51.0714,18.254 48.781,24.0952 47.5745,39.9596 26,46 4.42553,39.9596 3.219,24.0952 0.928571,18.254 Z" fill="var(--color-border)"/>
|
||||
<path d="M 3.312,5.357 8.58596,0 H 43.414 l 5.274,5.357 -1.8797,28.846 c -0.2431,2.605 -2.1461,4.7522 -4.7031,5.3064 l -14.8343,3.2151 c -0.8375,0.1816 -1.7043,0.1816 -2.5418,0 L 9.89482,39.5094 C 7.33785,38.9552 5.43478,36.808 5.19169,34.203 Z" fill="var(--background)"/>
|
||||
</svg>
|
||||
<div class="trait-value">
|
||||
{{#if (gt attribute.value 0)}}
|
||||
<span>+{{attribute.value}}</span>
|
||||
{{else}}
|
||||
<span>{{attribute.value}}</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{#if isSpellcasting}}
|
||||
<div class="spellcasting-mark" data-tooltip="DAGGERHEART.ITEMS.Subclass.spellcastingTrait">
|
||||
<i class="fa-solid fa-wand-magic-sparkles" inert></i>
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
|
||||
{{#> 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs' }}
|
||||
<button type="button" data-action="openSettings" data-tooltip-text="{{localize "DAGGERHEART.UI.Tooltip.openSheetSettings"}}"><i class="fa-solid fa-wrench"></i></button>
|
||||
{{/'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs'}}
|
||||
<header class="character-header-sheet">
|
||||
<line-div></line-div>
|
||||
<div class="name-row">
|
||||
<h1
|
||||
class="actor-name input"
|
||||
contenteditable="plaintext-only"
|
||||
data-property="name"
|
||||
placeholder="{{localize "DAGGERHEART.GENERAL.actorName"}}"
|
||||
autocomplete="off"
|
||||
spellcheck="false"
|
||||
>{{source.name}}</h1>
|
||||
<div class='level-div'>
|
||||
<h3 class='label'>
|
||||
{{#if @root.editable}}
|
||||
{{#if document.system.needsCharacterSetup}}
|
||||
<button
|
||||
type="button"
|
||||
class="level-button glow"
|
||||
data-action="levelManagement"
|
||||
>
|
||||
{{localize "DAGGERHEART.APPLICATIONS.CharacterCreation.buttonTitle"}}
|
||||
</button>
|
||||
{{else if document.system.levelData.canLevelUp}}
|
||||
<button
|
||||
type="button"
|
||||
class="level-button glow" data-tooltip="{{localize "DAGGERHEART.ACTORS.Character.levelUp"}}"
|
||||
data-action="levelManagement"
|
||||
>
|
||||
<i class="fa-solid fa-angles-up"></i>
|
||||
</button>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
{{#unless document.system.needsCharacterSetup}}
|
||||
{{localize 'DAGGERHEART.GENERAL.level'}}
|
||||
<input type="text" data-dtype="Number" class="level-value" value={{#if document.system.needsCharacterSetup}}0{{else}}{{document.system.levelData.level.changed}}{{/if}} {{#if document.system.needsCharacterSetup}}disabled{{/if}} />
|
||||
{{/unless}}
|
||||
</h3>
|
||||
</div>
|
||||
</div>
|
||||
<div class="character-details">
|
||||
<div>
|
||||
{{#if document.system.class.value}}
|
||||
<span data-action="editDoc" data-item-uuid="{{document.system.class.value.uuid}}">{{document.system.class.value.name}}</span>
|
||||
{{else}}
|
||||
<span class="missing-header-feature" data-action="openPack" data-key="classes">{{localize 'TYPES.Item.class'}}</span>
|
||||
{{/if}}
|
||||
<span class="dot">•</span>
|
||||
{{#if document.system.class.subclass}}
|
||||
<span data-action="editDoc" data-item-uuid="{{document.system.class.subclass.uuid}}">{{document.system.class.subclass.name}}</span>
|
||||
{{else}}
|
||||
<span class="missing-header-feature" data-action="openPack" data-key="subclasses">{{localize 'TYPES.Item.subclass'}}</span>
|
||||
{{/if}}
|
||||
<span class="dot">•</span>
|
||||
{{#if document.system.community}}
|
||||
<span data-action="editDoc" data-item-uuid="{{document.system.community.uuid}}">{{document.system.community.name}}</span>
|
||||
{{else}}
|
||||
<span class="missing-header-feature" data-action="openPack" data-key="communities">{{localize 'TYPES.Item.community'}}</span>
|
||||
{{/if}}
|
||||
<span class="dot">•</span>
|
||||
{{#if document.system.ancestry}}
|
||||
<span data-action="editDoc" data-item-uuid="{{document.system.ancestry.uuid}}">{{document.system.ancestry.name}}</span>
|
||||
{{else}}
|
||||
<span class="missing-header-feature" data-action="openPack" data-key="ancestries">{{localize 'TYPES.Item.ancestry'}}</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
{{#if (or document.system.multiclass.value document.system.multiclass.subclass)}}
|
||||
<div class="multiclass">
|
||||
{{#if document.system.multiclass.value}}
|
||||
<span data-action="editDoc"data-item-uuid="{{document.system.multiclass.value.uuid}}">{{document.system.multiclass.value.name}}</span>
|
||||
{{else}}
|
||||
<span data-action="openPack" data-key="classes">{{localize 'DAGGERHEART.GENERAL.multiclass'}}</span>
|
||||
{{/if}}
|
||||
<span class="dot">•</span>
|
||||
{{#if document.system.multiclass.subclass}}
|
||||
<span data-action="editDoc" data-item-uuid="{{document.system.multiclass.subclass.uuid}}">{{document.system.multiclass.subclass.name}}</span>
|
||||
{{else}}
|
||||
<span class="missing-header-feature" data-action="openPack" data-key="subclasses">{{localize 'TYPES.Item.subclass'}}</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
<div class="character-row">
|
||||
<div class="resource-section">
|
||||
<div class="hope-section">
|
||||
<h4>{{localize "DAGGERHEART.GENERAL.hope"}}</h4>
|
||||
{{#times document.system.resources.hope.max}}
|
||||
<span class='hope-value' data-action='toggleHope' data-value="{{add this 1}}">
|
||||
{{#if (gte ../document.system.resources.hope.value (add this 1))}}
|
||||
<i class='fa-solid fa-diamond'></i>
|
||||
{{else}}
|
||||
<i class='fa-regular fa-circle'></i>
|
||||
{{/if}}
|
||||
</span>
|
||||
{{/times}}
|
||||
{{#times document.system.scars}}
|
||||
<span class='hope-value scar'>
|
||||
<i class='fa-regular fa-ban'></i>
|
||||
</span>
|
||||
{{/times}}
|
||||
{{#if hasExtraResources}}<a type="button" class="resource-manager" data-action="toggleResourceManagement"><i class="fa-solid fa-angle-down"></i></a>{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
{{#if document.system.class.value}}
|
||||
<div class="domains-section">
|
||||
{{#each document.system.domainData as |data|}}
|
||||
<div class="domain">
|
||||
<img src="{{data.src}}" alt="" data-tooltip="{{data.label}}" />
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
{{/if}}
|
||||
<div class="downtime-section">
|
||||
{{#if document.parties.size}}
|
||||
<button type="button" data-action="viewParty" data-tooltip="DAGGERHEART.ACTORS.Character.viewParty">
|
||||
<i class="fa-solid fa-fw fa-users"></i>
|
||||
</button>
|
||||
{{/if}}
|
||||
{{#if @root.editable}}
|
||||
<button type="button" data-action="useDowntime" data-type="shortRest" data-tooltip="DAGGERHEART.APPLICATIONS.Downtime.shortRest.title">
|
||||
<i class="fa-solid fa-fw fa-utensils"></i>
|
||||
</button>
|
||||
<button type="button" data-action="useDowntime" data-type="longRest" data-tooltip="DAGGERHEART.APPLICATIONS.Downtime.longRest.title">
|
||||
<i class="fa-solid fa-fw fa-bed"></i>
|
||||
</button>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="character-traits">
|
||||
{{#each this.attributes as |attribute key|}}
|
||||
<div class="trait {{#if isSpellcasting}}with-spellcasting{{/if}}" data-tooltip="<b>{{attribute.label}}:</b><br>{{#each attribute.verbs}}{{this}}<br>{{/each}}" data-action="rollAttribute" data-attribute="{{key}}" data-value="{{attribute.value}}">
|
||||
<div class="trait-name">
|
||||
<div class="tier-mark {{#if attribute.tierMarked}}marked{{/if}}"></div>
|
||||
<span>{{attribute.label}}</span>
|
||||
</div>
|
||||
<div class="trait-value-area">
|
||||
<svg width="52" height="46" viewBox="0 0 52 46" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M 0,0 H 52 L 51.0714,18.254 48.781,24.0952 47.5745,39.9596 26,46 4.42553,39.9596 3.219,24.0952 0.928571,18.254 Z" fill="var(--color-border)"/>
|
||||
<path d="M 3.312,5.357 8.58596,0 H 43.414 l 5.274,5.357 -1.8797,28.846 c -0.2431,2.605 -2.1461,4.7522 -4.7031,5.3064 l -14.8343,3.2151 c -0.8375,0.1816 -1.7043,0.1816 -2.5418,0 L 9.89482,39.5094 C 7.33785,38.9552 5.43478,36.808 5.19169,34.203 Z" fill="var(--background)"/>
|
||||
</svg>
|
||||
<div class="trait-value">
|
||||
{{#if (gt attribute.value 0)}}
|
||||
<span>+{{attribute.value}}</span>
|
||||
{{else}}
|
||||
<span>{{attribute.value}}</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{#if isSpellcasting}}
|
||||
<div class="spellcasting-mark" data-tooltip="DAGGERHEART.ITEMS.Subclass.spellcastingTrait">
|
||||
<i class="fa-solid fa-wand-magic-sparkles" inert></i>
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
|
||||
{{#> 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs' }}
|
||||
<button type="button" data-action="openSettings" data-tooltip-text="{{localize "DAGGERHEART.UI.Tooltip.openSheetSettings"}}"><i class="fa-solid fa-wrench"></i></button>
|
||||
{{/'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs'}}
|
||||
</header>
|
||||
|
|
@ -23,7 +23,6 @@
|
|||
collection=@root.inventory.weapons
|
||||
isGlassy=true
|
||||
canCreate=@root.editable
|
||||
hideResources=true
|
||||
}}
|
||||
{{> 'daggerheart.inventory-items'
|
||||
title='TYPES.Item.armor'
|
||||
|
|
|
|||
|
|
@ -1,152 +1,152 @@
|
|||
<aside class="character-sidebar-sheet">
|
||||
<div class="portrait {{#if isDeath}}death-roll{{/if}}">
|
||||
<img src="{{document.img}}" alt="{{document.name}}" data-action='editImage' data-edit="img">
|
||||
<a class="death-roll-btn" data-tooltip="DAGGERHEART.UI.Tooltip.makeDeathMove" {{#if
|
||||
isDeath}}data-action="makeDeathMove" {{/if}}><i class="fa-solid fa-skull death-save"></i></a>
|
||||
</div>
|
||||
<div class="info-section {{#if useResourcePips}}pip-display{{/if}}">
|
||||
<div class="resources-section">
|
||||
{{> "systems/daggerheart/templates/sheets/global/partials/resource-bar.hbs" resource=resources.hitPoints label="DAGGERHEART.GENERAL.HitPoints.short" key="system.resources.hitPoints.value" action="toggleHitPoints" }}
|
||||
{{> "systems/daggerheart/templates/sheets/global/partials/resource-bar.hbs" resource=resources.stress label="DAGGERHEART.GENERAL.stress" key="system.resources.stress.value" action="toggleStress" }}
|
||||
</div>
|
||||
<div class="status-section {{#if useResourcePips}}pip-display{{/if}}">
|
||||
<div class="status-number">
|
||||
<div class='status-value'>
|
||||
<p>{{document.system.evasion}}</p>
|
||||
</div>
|
||||
<div class="status-label">
|
||||
<h4>{{localize "DAGGERHEART.GENERAL.evasion"}}</h4>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{#if document.system.armorScore.max}}
|
||||
<div class="status-bar armor-slots">
|
||||
{{#if useResourcePips}}
|
||||
<div class='slot-value'>
|
||||
<div class="slot-bar">
|
||||
{{#times document.system.armorScore.max}}
|
||||
<a class='armor-slot' data-action='toggleArmor' data-value="{{add this 1}}">
|
||||
{{#if (gte ../document.system.armorScore.value (add this 1))}}
|
||||
<i class="fa-solid fa-shield"></i>
|
||||
{{else}}
|
||||
<i class="fa-solid fa-shield-halved"></i>
|
||||
{{/if}}
|
||||
</a>
|
||||
{{/times}}
|
||||
</div>
|
||||
<a class="slot-label" data-action="toggleArmorMangement" {{disabled (not @root.editable)}}>
|
||||
<span class="label">{{localize "DAGGERHEART.GENERAL.armorSlots"}}</span>
|
||||
<div class="slot-value-container">
|
||||
<span class="value">{{document.system.armorScore.value}} / {{document.system.armorScore.max}}</span>
|
||||
{{#if @root.editable}}<i class="fa-solid fa-gear" inert></i>{{/if}}
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class='status-value'>
|
||||
<input class="bar-input armor-marks-input" value="{{document.system.armorScore.value}}" type="number" id="{{document.uuid}}-armor-slots">
|
||||
<span>/</span>
|
||||
<span class="bar-label">{{document.system.armorScore.max}}</span>
|
||||
</div>
|
||||
<progress
|
||||
class='progress-bar stress-color'
|
||||
value='{{document.system.armorScore.value}}'
|
||||
max='{{document.system.armorScore.max}}'
|
||||
></progress>
|
||||
<a class="status-label" data-action="toggleArmorMangement" {{disabled (not @root.editable)}}>
|
||||
<h4>{{localize "DAGGERHEART.GENERAL.armorSlots"}}</h4>
|
||||
{{#if @root.editable}}<i class="fa-solid fa-gear" inert></i>{{/if}}
|
||||
</a>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="status-number armor-slots">
|
||||
<div class='status-value'>
|
||||
<p>-</p>
|
||||
</div>
|
||||
<div class="status-label">
|
||||
<h4>{{localize "DAGGERHEART.GENERAL.armorSlots"}}</h4>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="status-number">
|
||||
<div class='status-value'>
|
||||
<p>{{document.system.proficiency}}</p>
|
||||
</div>
|
||||
<div class="status-label">
|
||||
<h4>{{localize "DAGGERHEART.GENERAL.proficiency"}}</h4>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="threshold-section">
|
||||
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.minor"}}</h4>
|
||||
<h4 class="threshold-value">{{document.system.damageThresholds.major}}</h4>
|
||||
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.major"}}</h4>
|
||||
<h4 class="threshold-value">{{document.system.damageThresholds.severe}}</h4>
|
||||
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.severe"}}</h4>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="shortcut-items-section">
|
||||
<div class="equipment-section">
|
||||
<div class="title">
|
||||
<side-line-div class="invert"></side-line-div>
|
||||
<h3>{{localize "DAGGERHEART.GENERAL.equipment"}}</h3>
|
||||
<side-line-div></side-line-div>
|
||||
</div>
|
||||
<ul class="items-sidebar-list">
|
||||
{{#if document.system.usedUnarmed}}
|
||||
{{> 'daggerheart.inventory-item-compact'
|
||||
item=document.system.usedUnarmed
|
||||
type='attack'
|
||||
}}
|
||||
{{/if}}
|
||||
{{#each equippedItems as |item|}}
|
||||
{{> 'daggerheart.inventory-item-compact'
|
||||
item=item
|
||||
type=item.type
|
||||
}}
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
<div class="loadout-section">
|
||||
<div class="title">
|
||||
<side-line-div class="invert"></side-line-div>
|
||||
<h3>{{localize "DAGGERHEART.GENERAL.loadout"}}</h3>
|
||||
<side-line-div></side-line-div>
|
||||
</div>
|
||||
<ul class="items-sidebar-list">
|
||||
{{#each document.system.domainCards.loadout as |card|}}
|
||||
{{> 'daggerheart.inventory-item-compact'
|
||||
item=card
|
||||
type='domainCard'
|
||||
}}
|
||||
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
<div class="experience-section">
|
||||
<div class="title">
|
||||
<side-line-div class="invert"></side-line-div>
|
||||
<h3>{{localize "DAGGERHEART.GENERAL.experience.single"}}</h3>
|
||||
<side-line-div></side-line-div>
|
||||
</div>
|
||||
<div class="experience-list">
|
||||
{{#each document.system.experiences as |experience id|}}
|
||||
<div class="experience-row" data-tooltip-text="{{experience.description}}">
|
||||
<span class="experience-value">
|
||||
{{numberFormat experience.value sign=true}}
|
||||
</span>
|
||||
<span class="experience-name">{{experience.name}}</span>
|
||||
<div class="controls">
|
||||
<a data-action="sendExpToChat" data-type="experience" data-id="{{id}}">
|
||||
<i class="fa-regular fa-message"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<aside class="character-sidebar-sheet">
|
||||
<div class="portrait {{#if isDeath}}death-roll{{/if}}">
|
||||
<img src="{{document.img}}" alt="{{document.name}}" data-action='editImage' data-edit="img">
|
||||
<a class="death-roll-btn" data-tooltip="DAGGERHEART.UI.Tooltip.makeDeathMove" {{#if
|
||||
isDeath}}data-action="makeDeathMove" {{/if}}><i class="fa-solid fa-skull death-save"></i></a>
|
||||
</div>
|
||||
<div class="info-section {{#if useResourcePips}}pip-display{{/if}}">
|
||||
<div class="resources-section">
|
||||
{{> "systems/daggerheart/templates/sheets/global/partials/resource-bar.hbs" resource=resources.hitPoints label="DAGGERHEART.GENERAL.HitPoints.short" key="system.resources.hitPoints.value" action="toggleHitPoints" }}
|
||||
{{> "systems/daggerheart/templates/sheets/global/partials/resource-bar.hbs" resource=resources.stress label="DAGGERHEART.GENERAL.stress" key="system.resources.stress.value" action="toggleStress" }}
|
||||
</div>
|
||||
<div class="status-section {{#if useResourcePips}}pip-display{{/if}}">
|
||||
<div class="status-number">
|
||||
<div class='status-value'>
|
||||
<p>{{document.system.evasion}}</p>
|
||||
</div>
|
||||
<div class="status-label">
|
||||
<h4>{{localize "DAGGERHEART.GENERAL.evasion"}}</h4>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{#if document.system.armorScore.max}}
|
||||
<div class="status-bar armor-slots">
|
||||
{{#if useResourcePips}}
|
||||
<div class='slot-value'>
|
||||
<div class="slot-bar armor">
|
||||
{{#times document.system.armorScore.max}}
|
||||
<a class="slot" data-action="toggleArmor" data-value="{{add this 1}}">
|
||||
{{#if (gte ../document.system.armorScore.value (add this 1))}}
|
||||
<i class="fa-solid fa-shield"></i>
|
||||
{{else}}
|
||||
<i class="fa-solid fa-shield-halved"></i>
|
||||
{{/if}}
|
||||
</a>
|
||||
{{/times}}
|
||||
</div>
|
||||
<a class="slot-label" data-action="toggleArmorMangement" {{disabled (not @root.editable)}}>
|
||||
<span class="label">{{localize "DAGGERHEART.GENERAL.armorSlots"}}</span>
|
||||
<div class="slot-value-container">
|
||||
<span class="value">{{document.system.armorScore.value}} / {{document.system.armorScore.max}}</span>
|
||||
{{#if @root.editable}}<i class="fa-solid fa-gear" inert></i>{{/if}}
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class='status-value'>
|
||||
<progress
|
||||
class='progress-bar stress-color'
|
||||
value='{{document.system.armorScore.value}}'
|
||||
max='{{document.system.armorScore.max}}'
|
||||
></progress>
|
||||
<input class="bar-input armor-marks-input" value="{{document.system.armorScore.value}}" type="number" id="{{document.uuid}}-armor-slots">
|
||||
<span>/</span>
|
||||
<span class="bar-label">{{document.system.armorScore.max}}</span>
|
||||
</div>
|
||||
<a class="status-label" data-action="toggleArmorMangement" {{disabled (not @root.editable)}}>
|
||||
<h4>{{localize "DAGGERHEART.GENERAL.armorSlots"}}</h4>
|
||||
{{#if @root.editable}}<i class="fa-solid fa-gear" inert></i>{{/if}}
|
||||
</a>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="status-number armor-slots">
|
||||
<div class='status-value'>
|
||||
<p>-</p>
|
||||
</div>
|
||||
<div class="status-label">
|
||||
<h4>{{localize "DAGGERHEART.GENERAL.armorSlots"}}</h4>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="status-number">
|
||||
<div class='status-value'>
|
||||
<p>{{document.system.proficiency}}</p>
|
||||
</div>
|
||||
<div class="status-label">
|
||||
<h4>{{localize "DAGGERHEART.GENERAL.proficiency"}}</h4>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="threshold-section">
|
||||
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.minor"}}</h4>
|
||||
<h4 class="threshold-value">{{document.system.damageThresholds.major}}</h4>
|
||||
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.major"}}</h4>
|
||||
<h4 class="threshold-value">{{document.system.damageThresholds.severe}}</h4>
|
||||
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.severe"}}</h4>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="shortcut-items-section">
|
||||
<div class="equipment-section">
|
||||
<div class="title">
|
||||
<side-line-div class="invert"></side-line-div>
|
||||
<h3>{{localize "DAGGERHEART.GENERAL.equipment"}}</h3>
|
||||
<side-line-div></side-line-div>
|
||||
</div>
|
||||
<ul class="items-sidebar-list">
|
||||
{{#if document.system.usedUnarmed}}
|
||||
{{> 'daggerheart.inventory-item-compact'
|
||||
item=document.system.usedUnarmed
|
||||
type='attack'
|
||||
}}
|
||||
{{/if}}
|
||||
{{#each equippedItems as |item|}}
|
||||
{{> 'daggerheart.inventory-item-compact'
|
||||
item=item
|
||||
type=item.type
|
||||
}}
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
<div class="loadout-section">
|
||||
<div class="title">
|
||||
<side-line-div class="invert"></side-line-div>
|
||||
<h3>{{localize "DAGGERHEART.GENERAL.loadout"}}</h3>
|
||||
<side-line-div></side-line-div>
|
||||
</div>
|
||||
<ul class="items-sidebar-list">
|
||||
{{#each document.system.domainCards.loadout as |card|}}
|
||||
{{> 'daggerheart.inventory-item-compact'
|
||||
item=card
|
||||
type='domainCard'
|
||||
}}
|
||||
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
<div class="experience-section">
|
||||
<div class="title">
|
||||
<side-line-div class="invert"></side-line-div>
|
||||
<h3>{{localize "DAGGERHEART.GENERAL.experience.single"}}</h3>
|
||||
<side-line-div></side-line-div>
|
||||
</div>
|
||||
<div class="experience-list">
|
||||
{{#each document.system.experiences as |experience id|}}
|
||||
<div class="experience-row" data-tooltip-text="{{experience.description}}">
|
||||
<span class="experience-value">
|
||||
{{numberFormat experience.value sign=true}}
|
||||
</span>
|
||||
<span class="experience-name">{{experience.name}}</span>
|
||||
<div class="controls">
|
||||
<a data-action="sendExpToChat" data-type="experience" data-id="{{id}}">
|
||||
<i class="fa-regular fa-message"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</aside>
|
||||
|
|
@ -3,15 +3,16 @@
|
|||
data-tab='{{tabs.features.id}}'
|
||||
data-group='{{tabs.features.group}}'
|
||||
>
|
||||
<div class="feature-section">
|
||||
{{> 'daggerheart.inventory-items'
|
||||
title=tabs.features.label
|
||||
type='feature'
|
||||
collection=@root.features
|
||||
hideContextMenu=true
|
||||
hideModifyControls=true
|
||||
canCreate=@root.editable
|
||||
showActions=@root.editable
|
||||
}}
|
||||
<div class="feature-section items-list">
|
||||
{{#each @root.features as |item|}}
|
||||
{{> "daggerheart.inventory-item"
|
||||
item=item
|
||||
type="feature"
|
||||
actorType=@root.document.type
|
||||
hideContextMenu=true
|
||||
hideModifyControls=true
|
||||
showActions=@root.editable
|
||||
}}
|
||||
{{/each}}
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,14 +1,15 @@
|
|||
<section class='tab {{tabs.features.cssClass}} {{tabs.features.id}}' data-tab='{{tabs.features.id}}'
|
||||
data-group='{{tabs.features.group}}'>
|
||||
<div class="feature-section">
|
||||
{{> 'daggerheart.inventory-items'
|
||||
title=tabs.features.label
|
||||
type='feature'
|
||||
collection=@root.features
|
||||
hideContextMenu=true
|
||||
hideModifyControls=true
|
||||
canCreate=@root.editable
|
||||
showActions=@root.editable
|
||||
}}
|
||||
<div class="feature-section items-list">
|
||||
{{#each @root.features as |item|}}
|
||||
{{> "daggerheart.inventory-item"
|
||||
item=item
|
||||
type="feature"
|
||||
actorType=@root.document.type
|
||||
hideContextMenu=true
|
||||
hideModifyControls=true
|
||||
showActions=@root.editable
|
||||
}}
|
||||
{{/each}}
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,191 +1,191 @@
|
|||
<section
|
||||
class='tab {{tabs.partyMembers.cssClass}} {{tabs.partyMembers.id}}'
|
||||
data-tab='{{tabs.partyMembers.id}}'
|
||||
data-group='{{tabs.partyMembers.group}}'
|
||||
>
|
||||
|
||||
<div class="actions-section">
|
||||
<button data-action="tagTeamRoll" class="{{#if tagTeamActive}}active-action{{/if}}">
|
||||
<i class="fa-solid fa-user-group"></i>
|
||||
<span>{{localize "DAGGERHEART.APPLICATIONS.TagTeamSelect.title"}}</span>
|
||||
</button>
|
||||
<button data-action="groupRoll" class="{{#if groupRollActive}}active-action{{/if}}">
|
||||
<i class="fa-solid fa-users"></i>
|
||||
<span>{{localize "DAGGERHEART.APPLICATIONS.GroupRollSelect.title"}}</span>
|
||||
</button>
|
||||
<button data-action="triggerRest" data-action="triggerRest" data-type="shortRest">
|
||||
<i class="fa-solid fa-utensils"></i>
|
||||
<span>{{localize "DAGGERHEART.APPLICATIONS.Downtime.shortRest.title"}}</span>
|
||||
</button>
|
||||
<button data-action="triggerRest" data-type="longRest">
|
||||
<i class="fa-solid fa-bed"></i>
|
||||
<span>{{localize "DAGGERHEART.APPLICATIONS.Downtime.longRest.title"}}</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{{#if @root.showStats}}
|
||||
<ul class="actors-list">
|
||||
{{#each partyMembers as |member id|}}
|
||||
<li class="actor-resources">
|
||||
<div class="actor-img-frame">
|
||||
<img class="actor-img" src="{{member.img}}">
|
||||
{{#if member.weapons}}
|
||||
<div class="equipped-weapons">
|
||||
{{#each member.weapons as |weapon|}}
|
||||
<img src="{{weapon.img}}" data-tooltip="{{weapon.name}}"/>
|
||||
{{/each}}
|
||||
</div>
|
||||
{{/if}}
|
||||
{{#if member.evasion includeZero=true}}
|
||||
<div class="evasion" data-tooltip="DAGGERHEART.GENERAL.evasion">{{member.evasion}}</div>
|
||||
{{/if}}
|
||||
{{#if member.difficulty includeZero=true}}
|
||||
<div class="evasion" data-tooltip="DAGGERHEART.GENERAL.difficulty">{{member.difficulty}}</div>
|
||||
{{/if}}
|
||||
{{#unless (or (eq member.type 'companion') (eq member.type 'npc'))}}
|
||||
<div class="threshold-section">
|
||||
<h4 class="threshold-label">{{localize "DAGGERHEART.ACTORS.Party.Thresholds.minor"}}</h4>
|
||||
<h4 class="threshold-value">{{member.damageThresholds.major}}</h4>
|
||||
<h4 class="threshold-label">{{localize "DAGGERHEART.ACTORS.Party.Thresholds.major"}}</h4>
|
||||
<h4 class="threshold-value">{{member.damageThresholds.severe}}</h4>
|
||||
<h4 class="threshold-label">{{localize "DAGGERHEART.ACTORS.Party.Thresholds.severe"}}</h4>
|
||||
</div>
|
||||
{{/unless}}
|
||||
</div>
|
||||
<header>
|
||||
<h2 class="actor-name">
|
||||
<a data-action="openDocument" data-uuid="{{member.uuid}}">{{member.name}}</a>
|
||||
<a class="delete-icon" data-action="deletePartyMember" data-uuid="{{member.uuid}}"><i class="fa-regular fa-times" inert></i></a>
|
||||
</h2>
|
||||
<div>
|
||||
{{#unless (or (eq member.type 'companion') (eq member.type 'adversary') (eq member.type 'npc')) }}
|
||||
<div class="hope-section">
|
||||
<h4>{{localize "DAGGERHEART.GENERAL.hope"}}</h4>
|
||||
{{#times member.resources.hope.max}}
|
||||
<span class='hope-value' data-action='toggleHope' data-actor-id="{{member.uuid}}" data-value="{{add this 1}}">
|
||||
{{#if (gte member.resources.hope.value (add this 1))}}
|
||||
<i class='fa-solid fa-diamond'></i>
|
||||
{{else}}
|
||||
<i class='fa-regular fa-circle'></i>
|
||||
{{/if}}
|
||||
</span>
|
||||
{{/times}}
|
||||
</div>
|
||||
{{/unless}}
|
||||
</div>
|
||||
{{#if member.subtitle}}
|
||||
<span class="subtitle">{{member.subtitle}}</span>
|
||||
{{/if}}
|
||||
</header>
|
||||
<section class="body">
|
||||
<section class="resources">
|
||||
{{#unless (or (eq member.type 'companion') (eq member.type 'npc')) }}
|
||||
<div class="slot-section">
|
||||
<div class="slot-label" data-tooltip="DAGGERHEART.GENERAL.HitPoints.plural">
|
||||
<span class="label">
|
||||
<i class="fa-solid fa-heart" inert></i>
|
||||
</span>
|
||||
<span class="value">
|
||||
<span class="current">{{member.resources.hitPoints.value}}</span>
|
||||
/
|
||||
<span class="max">{{member.resources.hitPoints.max}}</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="slot-bar">
|
||||
{{#times member.resources.hitPoints.max}}
|
||||
<span class='slot {{#if (gte member.resources.hitPoints.value (add this 1))}}filled{{/if}}'
|
||||
data-action='toggleHitPoints' data-actor-id="{{member.uuid}}" data-value="{{add this 1}}">
|
||||
</span>
|
||||
{{/times}}
|
||||
</div>
|
||||
</div>
|
||||
{{/unless}}
|
||||
|
||||
{{#unless (eq member.type 'npc')}}
|
||||
<div class="slot-section">
|
||||
<div class="slot-label" data-tooltip="DAGGERHEART.GENERAL.stress">
|
||||
<span class="label">
|
||||
<i class="fa-solid fa-bolt" inert></i>
|
||||
</span>
|
||||
<span class="value">
|
||||
<span class="current">{{member.resources.stress.value}}</span>
|
||||
/
|
||||
<span class="max">{{member.resources.stress.max}}</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="slot-bar">
|
||||
{{#times member.resources.stress.max}}
|
||||
<span class='slot {{#if (gte member.resources.stress.value (add this 1))}}filled{{/if}}'
|
||||
data-action='toggleStress' data-actor-id="{{member.uuid}}" data-value="{{add this 1}}">
|
||||
</span>
|
||||
{{/times}}
|
||||
</div>
|
||||
</div>
|
||||
{{/unless}}
|
||||
|
||||
{{#if member.armorScore.max}}
|
||||
<div class="slot-section">
|
||||
<div class="slot-label" data-tooltip="DAGGERHEART.GENERAL.armorSlots">
|
||||
<span class="label">
|
||||
<i class="fa-solid fa-shield" inert></i>
|
||||
</span>
|
||||
<span class="value">
|
||||
<span class="current">{{member.armorScore.value}}</span>
|
||||
/
|
||||
<span class="max">{{member.armorScore.max}}</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="slot-bar">
|
||||
{{#times member.armorScore.max}}
|
||||
<a class='armor-slot' data-action='toggleArmorSlot' data-actor-id="{{member.uuid}}" data-value="{{add this 1}}">
|
||||
{{#if (gte member.armorScore.value (add this 1))}}
|
||||
<i class="fa-solid fa-shield"></i>
|
||||
{{else}}
|
||||
<i class="fa-solid fa-shield-halved"></i>
|
||||
{{/if}}
|
||||
</a>
|
||||
{{/times}}
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
</section>
|
||||
{{#if member.traits}}
|
||||
<div class="traits">
|
||||
{{#each member.traits as |trait|}}
|
||||
<span class="trait">
|
||||
<span class="label">{{trait.label}}</span>
|
||||
<span class="value">{{trait.value}}</span>
|
||||
</span>
|
||||
{{/each}}
|
||||
</div>
|
||||
{{/if}}
|
||||
</section>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{else}}
|
||||
<ul class="actors-list limited">
|
||||
{{#each partyMembers as |member id|}}
|
||||
<li class="actor-resources">
|
||||
<div class="actor-img-frame">
|
||||
<img class="actor-img" src="{{member.img}}">
|
||||
</div>
|
||||
<header>
|
||||
<h2 class="actor-name">
|
||||
<a data-action="openDocument" data-uuid="{{member.uuid}}">{{member.name}}</a>
|
||||
<a class="delete-icon" data-action="deletePartyMember" data-uuid="{{member.uuid}}"><i class="fa-regular fa-times" inert></i></a>
|
||||
</h2>
|
||||
{{#if member.subtitle}}
|
||||
<span class="subtitle">{{member.subtitle}}</span>
|
||||
{{/if}}
|
||||
</header>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{/if}}
|
||||
{{#unless document.system.partyMembers.length}}
|
||||
<div class="actors-dragger">
|
||||
<span>{{localize "DAGGERHEART.GENERAL.dropActorsHere"}}</span>
|
||||
</div>
|
||||
{{/unless}}
|
||||
</section>
|
||||
<section
|
||||
class='tab {{tabs.partyMembers.cssClass}} {{tabs.partyMembers.id}}'
|
||||
data-tab='{{tabs.partyMembers.id}}'
|
||||
data-group='{{tabs.partyMembers.group}}'
|
||||
>
|
||||
|
||||
<div class="actions-section">
|
||||
<button data-action="tagTeamRoll" class="{{#if tagTeamActive}}active-action{{/if}}">
|
||||
<i class="fa-solid fa-user-group"></i>
|
||||
<span>{{localize "DAGGERHEART.APPLICATIONS.TagTeamSelect.title"}}</span>
|
||||
</button>
|
||||
<button data-action="groupRoll" class="{{#if groupRollActive}}active-action{{/if}}">
|
||||
<i class="fa-solid fa-users"></i>
|
||||
<span>{{localize "DAGGERHEART.APPLICATIONS.GroupRollSelect.title"}}</span>
|
||||
</button>
|
||||
<button data-action="triggerRest" data-action="triggerRest" data-type="shortRest">
|
||||
<i class="fa-solid fa-utensils"></i>
|
||||
<span>{{localize "DAGGERHEART.APPLICATIONS.Downtime.shortRest.title"}}</span>
|
||||
</button>
|
||||
<button data-action="triggerRest" data-type="longRest">
|
||||
<i class="fa-solid fa-bed"></i>
|
||||
<span>{{localize "DAGGERHEART.APPLICATIONS.Downtime.longRest.title"}}</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{{#if @root.showStats}}
|
||||
<ul class="actors-list">
|
||||
{{#each partyMembers as |member id|}}
|
||||
<li class="actor-resources">
|
||||
<div class="actor-img-frame">
|
||||
<img class="actor-img" src="{{member.img}}">
|
||||
{{#if member.weapons}}
|
||||
<div class="equipped-weapons">
|
||||
{{#each member.weapons as |weapon|}}
|
||||
<img src="{{weapon.img}}" data-tooltip="{{weapon.name}}"/>
|
||||
{{/each}}
|
||||
</div>
|
||||
{{/if}}
|
||||
{{#if member.evasion includeZero=true}}
|
||||
<div class="evasion" data-tooltip="DAGGERHEART.GENERAL.evasion">{{member.evasion}}</div>
|
||||
{{/if}}
|
||||
{{#if member.difficulty includeZero=true}}
|
||||
<div class="evasion" data-tooltip="DAGGERHEART.GENERAL.difficulty">{{member.difficulty}}</div>
|
||||
{{/if}}
|
||||
{{#unless (or (eq member.type 'companion') (eq member.type 'npc'))}}
|
||||
<div class="threshold-section">
|
||||
<h4 class="threshold-label">{{localize "DAGGERHEART.ACTORS.Party.Thresholds.minor"}}</h4>
|
||||
<h4 class="threshold-value">{{member.damageThresholds.major}}</h4>
|
||||
<h4 class="threshold-label">{{localize "DAGGERHEART.ACTORS.Party.Thresholds.major"}}</h4>
|
||||
<h4 class="threshold-value">{{member.damageThresholds.severe}}</h4>
|
||||
<h4 class="threshold-label">{{localize "DAGGERHEART.ACTORS.Party.Thresholds.severe"}}</h4>
|
||||
</div>
|
||||
{{/unless}}
|
||||
</div>
|
||||
<header>
|
||||
<h2 class="actor-name">
|
||||
<a data-action="openDocument" data-uuid="{{member.uuid}}">{{member.name}}</a>
|
||||
<a class="delete-icon" data-action="deletePartyMember" data-uuid="{{member.uuid}}"><i class="fa-regular fa-times" inert></i></a>
|
||||
</h2>
|
||||
<div>
|
||||
{{#unless (or (eq member.type 'companion') (eq member.type 'adversary') (eq member.type 'npc')) }}
|
||||
<div class="hope-section">
|
||||
<h4>{{localize "DAGGERHEART.GENERAL.hope"}}</h4>
|
||||
{{#times member.resources.hope.max}}
|
||||
<span class='hope-value' data-action='toggleHope' data-actor-id="{{member.uuid}}" data-value="{{add this 1}}">
|
||||
{{#if (gte member.resources.hope.value (add this 1))}}
|
||||
<i class='fa-solid fa-diamond'></i>
|
||||
{{else}}
|
||||
<i class='fa-regular fa-circle'></i>
|
||||
{{/if}}
|
||||
</span>
|
||||
{{/times}}
|
||||
</div>
|
||||
{{/unless}}
|
||||
</div>
|
||||
{{#if member.subtitle}}
|
||||
<span class="subtitle">{{member.subtitle}}</span>
|
||||
{{/if}}
|
||||
</header>
|
||||
<section class="body">
|
||||
<section class="resources">
|
||||
{{#unless (or (eq member.type 'companion') (eq member.type 'npc')) }}
|
||||
<div class="slot-section">
|
||||
<div class="slot-label" data-tooltip="DAGGERHEART.GENERAL.HitPoints.plural">
|
||||
<span class="label">
|
||||
<i class="fa-solid fa-heart" inert></i>
|
||||
</span>
|
||||
<span class="value">
|
||||
<span class="current">{{member.resources.hitPoints.value}}</span>
|
||||
/
|
||||
<span class="max">{{member.resources.hitPoints.max}}</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="slot-bar">
|
||||
{{#times member.resources.hitPoints.max}}
|
||||
<span class='slot {{#if (gte member.resources.hitPoints.value (add this 1))}}filled{{/if}}'
|
||||
data-action='toggleHitPoints' data-actor-id="{{member.uuid}}" data-value="{{add this 1}}">
|
||||
</span>
|
||||
{{/times}}
|
||||
</div>
|
||||
</div>
|
||||
{{/unless}}
|
||||
|
||||
{{#unless (eq member.type 'npc')}}
|
||||
<div class="slot-section">
|
||||
<div class="slot-label" data-tooltip="DAGGERHEART.GENERAL.stress">
|
||||
<span class="label">
|
||||
<i class="fa-solid fa-bolt" inert></i>
|
||||
</span>
|
||||
<span class="value">
|
||||
<span class="current">{{member.resources.stress.value}}</span>
|
||||
/
|
||||
<span class="max">{{member.resources.stress.max}}</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="slot-bar">
|
||||
{{#times member.resources.stress.max}}
|
||||
<span class='slot {{#if (gte member.resources.stress.value (add this 1))}}filled{{/if}}'
|
||||
data-action='toggleStress' data-actor-id="{{member.uuid}}" data-value="{{add this 1}}">
|
||||
</span>
|
||||
{{/times}}
|
||||
</div>
|
||||
</div>
|
||||
{{/unless}}
|
||||
|
||||
{{#if member.armorScore.max}}
|
||||
<div class="slot-section">
|
||||
<div class="slot-label" data-tooltip="DAGGERHEART.GENERAL.armorSlots">
|
||||
<span class="label">
|
||||
<i class="fa-solid fa-shield" inert></i>
|
||||
</span>
|
||||
<span class="value">
|
||||
<span class="current">{{member.armorScore.value}}</span>
|
||||
/
|
||||
<span class="max">{{member.armorScore.max}}</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="slot-bar armor">
|
||||
{{#times member.armorScore.max}}
|
||||
<a class="slot" data-action="toggleArmorSlot" data-actor-id="{{member.uuid}}" data-value="{{add this 1}}">
|
||||
{{#if (gte member.armorScore.value (add this 1))}}
|
||||
<i class="fa-solid fa-shield"></i>
|
||||
{{else}}
|
||||
<i class="fa-solid fa-shield-halved"></i>
|
||||
{{/if}}
|
||||
</a>
|
||||
{{/times}}
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
</section>
|
||||
{{#if member.traits}}
|
||||
<div class="traits">
|
||||
{{#each member.traits as |trait|}}
|
||||
<span class="trait">
|
||||
<span class="label">{{trait.label}}</span>
|
||||
<span class="value">{{trait.value}}</span>
|
||||
</span>
|
||||
{{/each}}
|
||||
</div>
|
||||
{{/if}}
|
||||
</section>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{else}}
|
||||
<ul class="actors-list limited">
|
||||
{{#each partyMembers as |member id|}}
|
||||
<li class="actor-resources">
|
||||
<div class="actor-img-frame">
|
||||
<img class="actor-img" src="{{member.img}}">
|
||||
</div>
|
||||
<header>
|
||||
<h2 class="actor-name">
|
||||
<a data-action="openDocument" data-uuid="{{member.uuid}}">{{member.name}}</a>
|
||||
<a class="delete-icon" data-action="deletePartyMember" data-uuid="{{member.uuid}}"><i class="fa-regular fa-times" inert></i></a>
|
||||
</h2>
|
||||
{{#if member.subtitle}}
|
||||
<span class="subtitle">{{member.subtitle}}</span>
|
||||
{{/if}}
|
||||
</header>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{/if}}
|
||||
{{#unless document.system.partyMembers.length}}
|
||||
<div class="actors-dragger">
|
||||
<span>{{localize "DAGGERHEART.GENERAL.dropActorsHere"}}</span>
|
||||
</div>
|
||||
{{/unless}}
|
||||
</section>
|
||||
|
|
|
|||
|
|
@ -158,7 +158,6 @@ Parameters:
|
|||
</button>
|
||||
{{/if}}
|
||||
{{#if action.uses.max}}
|
||||
<div class="spacer"></div>
|
||||
<button type="button" class="action-uses-button" data-action="increaseActionUses" data-item-uuid="{{action.uuid}}">
|
||||
{{action.remainingUses}}/{{action.uses.max}}
|
||||
</button>
|
||||
|
|
|
|||
|
|
@ -1,35 +1,35 @@
|
|||
<div class="status-bar">
|
||||
{{#if useResourcePips}}
|
||||
<div class='slot-value'>
|
||||
<div class="slot-bar">
|
||||
{{#times resource.max}}
|
||||
<span class='slot {{#if (gte ../resource.value (add this 1))}}filled{{/if}} {{#if ../largePips}}large{{/if}}' data-action="{{../action}}" data-value="{{add this 1}}">
|
||||
</span>
|
||||
{{/times}}
|
||||
|
||||
{{#times resource.emptyPips}}
|
||||
<span class="empty-slot"></span>
|
||||
{{/times}}
|
||||
</div>
|
||||
<div class="slot-label">
|
||||
<span class="label">{{localize label}}</span>
|
||||
<span class="value">{{resource.value}} / {{resource.max}}</span>
|
||||
</div>
|
||||
{{#if useResourcePips}}
|
||||
<div class="slot-value">
|
||||
<div class="slot-bar">
|
||||
{{#times resource.max}}
|
||||
<span class='slot {{#if (gte ../resource.value (add this 1))}}filled{{/if}} {{#if ../largePips}}large{{/if}}' data-action="{{../action}}" data-value="{{add this 1}}">
|
||||
</span>
|
||||
{{/times}}
|
||||
|
||||
{{#times resource.emptyPips}}
|
||||
<span class="empty-slot"></span>
|
||||
{{/times}}
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="slot-label">
|
||||
<span class="label">{{localize label}}</span>
|
||||
<span class="value">{{resource.value}} / {{resource.max}}</span>
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="status-bar">
|
||||
<div class='status-value'>
|
||||
<progress
|
||||
class='progress-bar'
|
||||
max='{{resource.max}}'
|
||||
value='{{resource.value}}'
|
||||
></progress>
|
||||
<input class="bar-input" name="{{key}}" min="0" max='{{resource.max}}'
|
||||
value="{{resource.value}}" type="number">
|
||||
<span>/</span>
|
||||
<span class="bar-label">{{resource.max}}</span>
|
||||
</div>
|
||||
<progress
|
||||
class='progress-bar'
|
||||
max='{{resource.max}}'
|
||||
value='{{resource.value}}'
|
||||
></progress>
|
||||
<div class="status-label">
|
||||
<div class="status-label pointy">
|
||||
<h4>{{localize label}}</h4>
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
|
@ -45,4 +45,5 @@
|
|||
<span>{{localize "TYPES.Item.feature"}}</span>
|
||||
<input type="text" class="features-input" value="{{features}}" />
|
||||
</fieldset>
|
||||
{{> "systems/daggerheart/templates/sheets/global/partials/resource-section/resource-section.hbs" }}
|
||||
</section>
|
||||
|
|
@ -6,18 +6,13 @@
|
|||
<div class="message-sub-header-container">
|
||||
{{#if message.title}}
|
||||
<h4>{{message.title}}</h4>
|
||||
<div>{{actor.name}} {{#if author.isGM}}(GM){{/if}}</div>
|
||||
<div>{{alias}} {{#if author.isGM}}(GM){{/if}}</div>
|
||||
{{else}}
|
||||
{{#unless actor.name}}
|
||||
<h4>{{author.name}}</h4>
|
||||
{{else}}
|
||||
{{#if (eq message.type 'base')}}
|
||||
<h4>{{actor.name}}</h4>
|
||||
<div>{{author.name}}</div>
|
||||
{{else}}
|
||||
<h4>{{alias}}</h4>
|
||||
<div>{{actor.name}} {{#if author.isGM}}(GM){{/if}}</div>
|
||||
{{/if}}
|
||||
<h4>{{alias}}</h4>
|
||||
<div>{{author.name}}</div>
|
||||
{{/unless}}
|
||||
{{/if}}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -3,9 +3,9 @@
|
|||
{{#each sources as |source|}}
|
||||
<div class="armor-source-container">
|
||||
<p class="armor-source-label">{{source.name}}</p>
|
||||
<div class="slot-bar">
|
||||
<div class="slot-bar armor">
|
||||
{{#times source.max}}
|
||||
<a class='armor-slot' data-value="{{add this 1}}" data-uuid="{{source.uuid}}">
|
||||
<a class="slot" data-value="{{add this 1}}" data-uuid="{{source.uuid}}">
|
||||
{{#if (gte ../current (add this 1))}}
|
||||
<i class="fa-solid fa-shield" data-index="{{this}}"></i>
|
||||
{{else}}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue