Compare commits

..

No commits in common. "cdf6e7fdd0db9edf357ac165c2904d92368b89cb" and "1af86d87bb5a522308981e9cbb883434ef546c4d" have entirely different histories.

17 changed files with 265 additions and 356 deletions

View file

@ -113,8 +113,7 @@
"area": { "area": {
"sectionTitle": "Areas", "sectionTitle": "Areas",
"shape": "Shape", "shape": "Shape",
"size": "Size", "size": "Size"
"hasHole": "Area Hole"
}, },
"displayInChat": "Display in chat", "displayInChat": "Display in chat",
"deleteTriggerTitle": "Delete Trigger", "deleteTriggerTitle": "Delete Trigger",
@ -871,10 +870,6 @@
"bruiser": "for each Bruiser adversary.", "bruiser": "for each Bruiser adversary.",
"solo": "for each Solo adversary." "solo": "for each Solo adversary."
}, },
"AreaTypes": {
"attached": { "label": "Attached To Token" },
"placed": { "label": "Placed In Scene" }
},
"ArmorInteraction": { "ArmorInteraction": {
"none": { "label": "Ignores Armor" }, "none": { "label": "Ignores Armor" },
"active": { "label": "Active w/ Armor" }, "active": { "label": "Active w/ Armor" },

View file

@ -7,7 +7,7 @@ export default class AdversarySheet extends DHBaseActorSheet {
/** @inheritDoc */ /** @inheritDoc */
static DEFAULT_OPTIONS = { static DEFAULT_OPTIONS = {
classes: ['adversary'], classes: ['adversary'],
position: { width: 645, height: 760 }, position: { width: 660, height: 766 },
window: { resizable: true }, window: { resizable: true },
actions: { actions: {
toggleHitPoints: AdversarySheet.#toggleHitPoints, toggleHitPoints: AdversarySheet.#toggleHitPoints,

View file

@ -96,7 +96,7 @@ export default class DhRegionLayer extends foundry.canvas.layers.RegionLayer {
return inBounds.length === 1 ? inBounds[0] : null; return inBounds.length === 1 ? inBounds[0] : null;
} }
static getTemplateShape({ shapeType, angle, range, direction, hasHole } = {}) { static getTemplateShape({ type, angle, range, direction } = {}) {
const { line, rectangle, inFront, cone, circle, emanation } = CONFIG.DH.GENERAL.templateTypes; const { line, rectangle, inFront, cone, circle, emanation } = CONFIG.DH.GENERAL.templateTypes;
/* Length calculation */ /* Length calculation */
@ -112,11 +112,11 @@ export default class DhRegionLayer extends foundry.canvas.layers.RegionLayer {
const shapeData = { const shapeData = {
...canvas.mousePosition, ...canvas.mousePosition,
type: shapeType, type: type,
direction: direction ?? 0 direction: direction ?? 0
}; };
switch (shapeType) { switch (type) {
case rectangle.id: case rectangle.id:
shapeData.width = length; shapeData.width = length;
shapeData.height = length; shapeData.height = length;
@ -145,8 +145,7 @@ export default class DhRegionLayer extends foundry.canvas.layers.RegionLayer {
y: 0, y: 0,
width: 1, width: 1,
height: 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; break;
} }

View file

@ -119,10 +119,6 @@ export const advantageState = {
export const areaTypes = { export const areaTypes = {
placed: { placed: {
id: 'placed', id: 'placed',
label: 'DAGGERHEART.CONFIG.AreaTypes.placed.label' label: 'Placed Area'
},
attached: {
id: 'attached',
label: 'DAGGERHEART.CONFIG.AreaTypes.attached.label'
} }
}; };

View file

@ -33,10 +33,6 @@ export default class AreasField extends fields.ArrayField {
initial: CONFIG.DH.GENERAL.range.veryClose.id, initial: CONFIG.DH.GENERAL.range.veryClose.id,
label: 'DAGGERHEART.ACTIONS.Config.area.size' 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()) effects: new fields.ArrayField(new fields.DocumentIdField())
}); });
super(element, options, context); super(element, options, context);

View file

@ -276,12 +276,8 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage {
async onCreateAreas(event) { async onCreateAreas(event) {
const createArea = async selectedArea => { const createArea = async selectedArea => {
const effects = selectedArea.effects.map(effect => this.system.action.item.effects.get(effect).uuid); const effects = selectedArea.effects.map(effect => this.system.action.item.effects.get(effect).uuid);
const { shape: shapeType, size: range, hasHole } = selectedArea; const { shape: type, size: range } = selectedArea;
const shapeData = CONFIG.Canvas.layers.regions.layerClass.getTemplateShape({ const shapeData = CONFIG.Canvas.layers.regions.layerClass.getTemplateShape({ type, range });
shapeType,
range,
hasHole
});
const scene = game.scenes.get(game.user.viewedScene); const scene = game.scenes.get(game.user.viewedScene);
const level = scene.levels.find(x => x.isView); const level = scene.levels.find(x => x.isView);
@ -309,10 +305,7 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage {
visibility: CONST.REGION_VISIBILITY.ALWAYS visibility: CONST.REGION_VISIBILITY.ALWAYS
}; };
const placeRegion = data => { const placeRegion = data => {
canvas.regions.placeRegion(data, { canvas.regions.placeRegion(data, { create: true });
create: true,
attachToToken: selectedArea.type === CONFIG.DH.ACTIONS.areaTypes.attached.id
});
}; };
// Regions with effects must be placed by the GM // Regions with effects must be placed by the GM

View file

@ -58,11 +58,10 @@ export const renderMeasuredTemplate = async event => {
if (!type || !range || !game.canvas.scene) return; if (!type || !range || !game.canvas.scene) return;
const shapeData = CONFIG.Canvas.layers.regions.layerClass.getTemplateShape({ const shapeData = CONFIG.Canvas.layers.regions.layerClass.getTemplateShape({
shapetype: type, type,
angle, angle,
range, range,
direction, direction
hasHole: false
}); });
await canvas.regions.placeRegion( await canvas.regions.placeRegion(

View file

@ -893,12 +893,13 @@ export function shouldUseHopeFearAutomation(options = { gmAsPlayer: true }) {
export async function getWorldActor(baseActor) { export async function getWorldActor(baseActor) {
if (baseActor.inCompendium) { if (baseActor.inCompendium) {
const worldActorCandidates = game.actors.filter(x => const worldActorCopy = game.actors.find(x =>
x._stats.compendiumSource === baseActor.uuid && x._stats.compendiumSource === baseActor.uuid &&
x.prototypeToken.actorLink === baseActor.prototypeToken.actorLink (!x.prototypeToken.actorLink || x.name === baseActor.name)
); );
const worldActorCopy = worldActorCandidates.find(a => a.name === baseActor.name) ?? worldActorCandidates[0];
if (worldActorCopy) return worldActorCopy; if (worldActorCopy)
return worldActorCopy;
const baseActorData = baseActor; const baseActorData = baseActor;
return await game.system.api.documents.DhpActor.create({ return await game.system.api.documents.DhpActor.create({

View file

@ -52,7 +52,7 @@
"includeBase": false "includeBase": false
}, },
"target": { "target": {
"type": "", "type": "hostile",
"amount": 1 "amount": 1
}, },
"effects": [ "effects": [
@ -63,23 +63,13 @@
], ],
"name": "Fire", "name": "Fire",
"img": "icons/magic/fire/barrier-wall-explosion-orange.webp", "img": "icons/magic/fire/barrier-wall-explosion-orange.webp",
"range": "", "range": "close"
"areas": [
{
"name": "Elemental Aura: Fire",
"type": "attached",
"shape": "emanation",
"size": "close",
"hasHole": false,
"effects": []
}
]
}, },
"xDBLH5TWidvrYF7z": { "xDBLH5TWidvrYF7z": {
"type": "effect", "type": "effect",
"_id": "xDBLH5TWidvrYF7z", "_id": "xDBLH5TWidvrYF7z",
"systemPath": "actions", "systemPath": "actions",
"description": "<p>Your allies gain a +1 bonus to Strength.</p>", "description": "<p>When an adversary marks 1 or more Hit Points, they must also mark a Stress.</p>",
"chatDisplay": true, "chatDisplay": true,
"actionType": "action", "actionType": "action",
"cost": [], "cost": [],
@ -88,26 +78,19 @@
"max": "", "max": "",
"recovery": null "recovery": null
}, },
"effects": [], "effects": [
{
"_id": "WRuijfHxmUscAa69",
"onSave": false
}
],
"target": { "target": {
"type": "", "type": "friendly",
"amount": null "amount": null
}, },
"name": "Earth", "name": "Earth",
"img": "icons/magic/control/buff-strength-muscle-damage-red.webp", "img": "icons/magic/control/buff-strength-muscle-damage-red.webp",
"range": "", "range": "close"
"areas": [
{
"name": "Elemental Aura: Earth",
"type": "attached",
"shape": "emanation",
"size": "close",
"hasHole": true,
"effects": [
"yvpWNCNobg0LLjey"
]
}
]
}, },
"S4t5HlgxWlHwaBDw": { "S4t5HlgxWlHwaBDw": {
"type": "effect", "type": "effect",
@ -129,22 +112,12 @@
} }
], ],
"target": { "target": {
"type": "self", "type": "hostile",
"amount": null "amount": null
}, },
"name": "Water", "name": "Water",
"img": "icons/magic/water/vortex-water-whirlpool.webp", "img": "icons/magic/water/vortex-water-whirlpool.webp",
"range": "self", "range": "close"
"areas": [
{
"name": "Elemental Aura: Water",
"type": "attached",
"shape": "emanation",
"size": "close",
"hasHole": false,
"effects": []
}
]
}, },
"hAsKFFewtTqd1gg9": { "hAsKFFewtTqd1gg9": {
"type": "attack", "type": "attack",
@ -165,10 +138,15 @@
"includeBase": false "includeBase": false
}, },
"target": { "target": {
"type": "self", "type": "any",
"amount": null "amount": null
}, },
"effects": [], "effects": [
{
"_id": "mJBA2QTyM9SM5NVS",
"onSave": false
}
],
"roll": { "roll": {
"type": "diceSet", "type": "diceSet",
"trait": null, "trait": null,
@ -191,19 +169,7 @@
}, },
"name": "Air", "name": "Air",
"img": "icons/magic/air/air-burst-spiral-blue-gray.webp", "img": "icons/magic/air/air-burst-spiral-blue-gray.webp",
"range": "self", "range": ""
"areas": [
{
"name": "Elemental Aura: Air",
"type": "attached",
"shape": "emanation",
"size": "close",
"hasHole": false,
"effects": [
"vnKV5hsO4DVjURAl"
]
}
]
} }
}, },
"originItemType": null, "originItemType": null,
@ -215,6 +181,49 @@
} }
}, },
"effects": [ "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)", "name": "Elemental Aura (Water)",
"img": "icons/magic/water/vortex-water-whirlpool.webp", "img": "icons/magic/water/vortex-water-whirlpool.webp",
@ -228,15 +237,18 @@
"type": "withinRange", "type": "withinRange",
"target": "hostile", "target": "hostile",
"range": "melee" "range": "melee"
}, }
"changes": []
}, },
"changes": [],
"disabled": false, "disabled": false,
"duration": { "duration": {
"value": null, "startTime": null,
"units": "seconds", "combat": null,
"expiry": null, "seconds": null,
"expired": false "rounds": null,
"turns": null,
"startRound": null,
"startTurn": null
}, },
"description": "", "description": "",
"tint": "#ffffff", "tint": "#ffffff",
@ -246,9 +258,6 @@
"_stats": { "_stats": {
"compendiumSource": null "compendiumSource": null
}, },
"start": null,
"showIcon": 1,
"folder": null,
"_key": "!items.effects!2JH9NaOh69yN80Gw.H7W52ps5d3UGmaFr" "_key": "!items.effects!2JH9NaOh69yN80Gw.H7W52ps5d3UGmaFr"
}, },
{ {
@ -264,15 +273,18 @@
"type": "withinRange", "type": "withinRange",
"target": "hostile", "target": "hostile",
"range": "melee" "range": "melee"
}, }
"changes": []
}, },
"changes": [],
"disabled": false, "disabled": false,
"duration": { "duration": {
"value": null, "startTime": null,
"units": "seconds", "combat": null,
"expiry": null, "seconds": null,
"expired": false "rounds": null,
"turns": null,
"startRound": null,
"startTurn": null
}, },
"description": "", "description": "",
"tint": "#ffffff", "tint": "#ffffff",
@ -282,120 +294,43 @@
"_stats": { "_stats": {
"compendiumSource": null "compendiumSource": null
}, },
"start": null,
"showIcon": 1,
"folder": null,
"_key": "!items.effects!2JH9NaOh69yN80Gw.WX5AMEpmUAutB9Hm" "_key": "!items.effects!2JH9NaOh69yN80Gw.WX5AMEpmUAutB9Hm"
}, },
{ {
"name": "Elemental Aura: Earth", "name": "Elemental Aura (Air)",
"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,
"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
]
},
"_id": "yvpWNCNobg0LLjey",
"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.yvpWNCNobg0LLjey"
},
{
"name": "Elemental Aura: Air",
"disabled": false,
"img": "icons/magic/air/air-burst-spiral-blue-gray.webp", "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>", "origin": "Compendium.daggerheart.subclasses.Item.2JH9NaOh69yN80Gw",
"transfer": false, "transfer": false,
"statuses": [], "_id": "mJBA2QTyM9SM5NVS",
"type": "base",
"system": { "system": {
"rangeDependence": { "rangeDependence": {
"enabled": false, "enabled": false,
"type": "withinRange", "type": "withinRange",
"target": "hostile", "target": "hostile",
"range": "melee" "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
}, },
"changes": [],
"disabled": false,
"duration": { "duration": {
"value": null, "startTime": null,
"units": "seconds", "combat": null,
"expiry": null, "seconds": null,
"expired": false "rounds": null,
"turns": null,
"startRound": null,
"startTurn": null
}, },
"origin": null, "description": "",
"tint": "#ffffff", "tint": "#ffffff",
"showIcon": 1, "statuses": [],
"folder": null,
"sort": 0, "sort": 0,
"flags": {}, "flags": {},
"_stats": { "_stats": {
"compendiumSource": null "compendiumSource": null
}, },
"_key": "!items.effects!2JH9NaOh69yN80Gw.vnKV5hsO4DVjURAl" "_key": "!items.effects!2JH9NaOh69yN80Gw.mJBA2QTyM9SM5NVS"
} }
], ],
"sort": 100000, "sort": 100000,

View file

@ -384,10 +384,6 @@
justify-content: space-between; justify-content: space-between;
} }
label {
white-space: nowrap;
}
.btn { .btn {
padding-top: 15px; padding-top: 15px;
} }
@ -403,13 +399,6 @@
> .checkbox { > .checkbox {
align-self: end; align-self: end;
} }
.auto-sized {
width: auto;
display: flex;
flex-direction: column;
align-items: center;
}
} }
.form-group { .form-group {

View file

@ -59,6 +59,7 @@
.slot-value { .slot-value {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding: 0 5px;
font-size: 1.5rem; font-size: 1.5rem;
align-items: center; align-items: center;
justify-content: center; justify-content: center;

View file

@ -1,6 +1,7 @@
@import './sheet.less';
@import './features.less'; @import './features.less';
@import './header.less'; @import './header.less';
@import './sheet.less';
@import './sidebar.less'; @import './sidebar.less';
@import './effects.less'; @import './effects.less';
@import './notes.less'; @import './notes.less';

View file

@ -2,37 +2,35 @@
@import '../../../utils/fonts.less'; @import '../../../utils/fonts.less';
.application.sheet.daggerheart.actor.dh-style.adversary { .application.sheet.daggerheart.actor.dh-style.adversary {
--sidebar-width: 260px;
.window-content { .window-content {
display: grid; display: grid;
grid-template-columns: var(--sidebar-width) 1fr; grid-template-columns: 275px 1fr;
grid-template-rows: auto 1fr; grid-template-rows: auto 1fr;
height: 100%; height: 100%;
width: 100%; width: 100%;
padding-bottom: 0; padding-bottom: 0;
}
.adversary-sidebar-sheet { .adversary-sidebar-sheet {
grid-row: 1 / span 2; grid-row: 1 / span 2;
grid-column: 1; 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 {
overflow: hidden; overflow: hidden;
display: flex; display: flex;
flex-direction: column; 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;
}
}
} }
} }

View file

@ -22,8 +22,8 @@
.application.sheet.daggerheart.actor.dh-style.adversary { .application.sheet.daggerheart.actor.dh-style.adversary {
.adversary-sidebar-sheet { .adversary-sidebar-sheet {
width: var(--sidebar-width); width: 275px;
min-width: var(--sidebar-width); min-width: 275px;
border-right: 1px solid light-dark(@dark-blue, @golden); border-right: 1px solid light-dark(@dark-blue, @golden);
.portrait { .portrait {
@ -52,7 +52,7 @@
} }
img { img {
height: var(--sidebar-width); height: 275px;
} }
.death-roll-btn { .death-roll-btn {
@ -63,7 +63,7 @@
.threshold-section { .threshold-section {
position: relative; position: relative;
display: flex; display: flex;
gap: 7px; gap: 10px;
background-color: light-dark(transparent, @dark-blue); background-color: light-dark(transparent, @dark-blue);
color: @color-text-emphatic; color: @color-text-emphatic;
padding: 5px 10px; padding: 5px 10px;
@ -107,7 +107,7 @@
flex-direction: column; flex-direction: column;
top: -20px; top: -20px;
gap: 10px; gap: 10px;
margin-bottom: -16px; margin-bottom: -10px;
&.pip-display { &.pip-display {
top: -15px; top: -15px;
@ -185,8 +185,8 @@
.shortcut-items-section { .shortcut-items-section {
overflow-y: hidden; overflow-y: hidden;
padding: 10px 0; padding-top: 10px;
flex: 1; padding-bottom: 20px;
scrollbar-gutter: stable; scrollbar-gutter: stable;
.with-scroll-shadows(); .with-scroll-shadows();
@ -214,6 +214,8 @@
} }
.experience-section { .experience-section {
margin-bottom: 20px;
.title { .title {
display: flex; display: flex;
gap: 15px; gap: 15px;
@ -230,21 +232,21 @@
gap: 5px; gap: 5px;
width: 100%; width: 100%;
margin-top: 10px; margin-top: 10px;
align-items: stretch; align-items: center;
padding: 0 4px 0 12px;
.experience-row { .experience-row {
display: flex; display: flex;
gap: 5px; gap: 5px;
width: 250px;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
.experience-name { .experience-name {
width: 180px;
display: flex; display: flex;
align-items: center; align-items: center;
text-align: start; text-align: start;
font-size: var(--font-size-14); font-size: var(--font-size-14);
flex: 1;
color: light-dark(@dark, @beige); color: light-dark(@dark, @beige);
line-height: 1; line-height: 1;
} }
@ -269,7 +271,9 @@
.reaction-section { .reaction-section {
display: flex; display: flex;
margin: 10px; padding: 0 10px;
margin-top: 20px;
width: 100%;
button { button {
height: 40px; height: 40px;

View file

@ -11,10 +11,9 @@
<a class="btn" data-tooltip="{{localize "CONTROLS.CommonDelete"}}" data-action="removeElement" data-index="{{index}}"><i class="fas fa-trash"></i></a> <a class="btn" data-tooltip="{{localize "CONTROLS.CommonDelete"}}" data-action="removeElement" data-index="{{index}}"><i class="fas fa-trash"></i></a>
</div> </div>
<div class="nest-inputs"> <div class="nest-inputs">
{{formField ../fields.type value=area.type name=(concat "areas." index ".type") localize=true blank=false}} {{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 blank=false}} {{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 blank=false}} {{formField ../fields.size value=area.size name=(concat "areas." index ".size") localize=true}}
{{formField ../fields.hasHole value=area.hasHole name=(concat "areas." index ".hasHole") localize=true classes="auto-sized" }}
</div> </div>
<div class="sub-section-header"> <div class="sub-section-header">

View file

@ -1,102 +1,100 @@
<aside class="adversary-sidebar-sheet"> <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}}"> <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"> <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> <a class="death-roll-btn"><i class="fa-solid fa-skull death-save"></i></a>
</div> </div>
<div class="info-section {{#if useResourcePips}}pip-display{{/if}}"> <div class="info-section {{#if useResourcePips}}pip-display{{/if}}">
<div class="resources-section"> <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.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" }} {{> "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>
<div class="status-section"> <div class="status-section">
<div class="status-number"> <div class="status-number">
<div class='status-value armor-slots'> <div class='status-value armor-slots'>
{{#if source.system.difficulty}} {{#if source.system.difficulty}}
<p>{{source.system.difficulty}}</p> <p>{{source.system.difficulty}}</p>
{{else}} {{else}}
<p>-</p> <p>-</p>
{{/if}} {{/if}}
</div> </div>
<div class="status-label"> <div class="status-label">
<h4>{{localize "DAGGERHEART.GENERAL.difficulty"}}</h4> <h4>{{localize "DAGGERHEART.GENERAL.difficulty"}}</h4>
</div> </div>
</div> </div>
<div class="status-number"> <div class="status-number">
<div class='status-value armor-slots'> <div class='status-value armor-slots'>
{{#if source.system.attack.roll.bonus includeZero=true}} {{#if source.system.attack.roll.bonus includeZero=true}}
<p>{{numberFormat source.system.attack.roll.bonus sign=true}}</p> <p>{{numberFormat source.system.attack.roll.bonus sign=true}}</p>
{{else}} {{else}}
<p>-</p> <p>-</p>
{{/if}} {{/if}}
</div> </div>
<div class="status-label"> <div class="status-label">
<h4>{{localize "DAGGERHEART.GENERAL.attack"}}</h4> <h4>{{localize "DAGGERHEART.GENERAL.attack"}}</h4>
</div> </div>
</div> </div>
{{#if (lt source.system.criticalThreshold 20)}} {{#if (lt source.system.criticalThreshold 20)}}
<div class="status-number"> <div class="status-number">
<div class='status-value armor-slots'> <div class='status-value armor-slots'>
<p>{{source.system.criticalThreshold}}+</p> <p>{{source.system.criticalThreshold}}+</p>
</div> </div>
<div class="status-label"> <div class="status-label">
<h4>{{localize "DAGGERHEART.GENERAL.criticalShort"}}</h4> <h4>{{localize "DAGGERHEART.GENERAL.criticalShort"}}</h4>
</div> </div>
</div> </div>
{{/if}} {{/if}}
</div> </div>
<div class="status-section"> <div class="status-section">
<div class="threshold-section"> <div class="threshold-section">
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.minor"}}</h4> <h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.minor"}}</h4>
<h4 class="threshold-value">{{document.system.damageThresholds.major}}</h4> <h4 class="threshold-value">{{document.system.damageThresholds.major}}</h4>
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.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-value">{{document.system.damageThresholds.severe}}</h4>
<h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.severe"}}</h4> <h4 class="threshold-label">{{localize "DAGGERHEART.GENERAL.DamageThresholds.severe"}}</h4>
</div> </div>
</div> </div>
</div> </div>
<div class="shortcut-items-section"> <div class="shortcut-items-section">
<div class="attack-section"> <div class="attack-section">
<div class="title"> <div class="title">
<side-line-div class="invert"></side-line-div> <side-line-div class="invert"></side-line-div>
<h3>{{localize "DAGGERHEART.GENERAL.attack"}}</h3> <h3>{{localize "DAGGERHEART.GENERAL.attack"}}</h3>
<side-line-div></side-line-div> <side-line-div></side-line-div>
</div> </div>
<ul class="items-sidebar-list"> <ul class="items-sidebar-list">
{{> 'daggerheart.inventory-item-compact' {{> 'daggerheart.inventory-item-compact'
item=document.system.attack item=document.system.attack
type='attack' type='attack'
noCompendiumEdit=true noCompendiumEdit=true
}} }}
</ul> </ul>
</div> </div>
<div class="experience-section"> <div class="experience-section">
<div class="title"> <div class="title">
<side-line-div class="invert"></side-line-div> <side-line-div class="invert"></side-line-div>
<h3>{{localize "DAGGERHEART.GENERAL.experience.plural"}}</h3> <h3>{{localize "DAGGERHEART.GENERAL.experience.plural"}}</h3>
<side-line-div></side-line-div> <side-line-div></side-line-div>
</div> </div>
<div class="experience-list"> <div class="experience-list">
{{#each source.system.experiences as |experience id|}} {{#each source.system.experiences as |experience id|}}
<div class="experience-row" data-tooltip-text="{{experience.description}}"> <div class="experience-row" data-tooltip-text="{{experience.description}}">
<span class="experience-value"> <span class="experience-value">
+{{experience.value}} +{{experience.value}}
</span> </span>
<span class="experience-name">{{experience.name}}</span> <span class="experience-name">{{experience.name}}</span>
<div class="controls"> <div class="controls">
<a data-action="sendExpToChat" data-id="{{id}}"> <a data-action="sendExpToChat" data-id="{{id}}">
<i class="fa-regular fa-message"></i> <i class="fa-regular fa-message"></i>
</a> </a>
</div> </div>
</div> </div>
{{/each}} {{/each}}
</div> </div>
</div> </div>
</div> <line-div></line-div>
<div class="reaction-section"> <div class="reaction-section">
<button type="button" data-action="reactionRoll"> <button type="button" data-action="reactionRoll">{{localize "DAGGERHEART.GENERAL.Roll.reaction"}}</button>
<i class="fa-solid fa-dice"></i> </div>
{{localize "DAGGERHEART.GENERAL.Roll.reaction"}} </div>
</button>
</div>
</aside> </aside>

View file

@ -6,13 +6,18 @@
<div class="message-sub-header-container"> <div class="message-sub-header-container">
{{#if message.title}} {{#if message.title}}
<h4>{{message.title}}</h4> <h4>{{message.title}}</h4>
<div>{{alias}} {{#if author.isGM}}(GM){{/if}}</div> <div>{{actor.name}} {{#if author.isGM}}(GM){{/if}}</div>
{{else}} {{else}}
{{#unless actor.name}} {{#unless actor.name}}
<h4>{{author.name}}</h4> <h4>{{author.name}}</h4>
{{else}} {{else}}
<h4>{{alias}}</h4> {{#if (eq message.type 'base')}}
<div>{{author.name}}</div> <h4>{{actor.name}}</h4>
<div>{{author.name}}</div>
{{else}}
<h4>{{alias}}</h4>
<div>{{actor.name}} {{#if author.isGM}}(GM){{/if}}</div>
{{/if}}
{{/unless}} {{/unless}}
{{/if}} {{/if}}
</div> </div>