diff --git a/module/applications/sheets/actors/adversary.mjs b/module/applications/sheets/actors/adversary.mjs index 6b57565c..95d77787 100644 --- a/module/applications/sheets/actors/adversary.mjs +++ b/module/applications/sheets/actors/adversary.mjs @@ -10,6 +10,8 @@ export default class AdversarySheet extends DHBaseActorSheet { position: { width: 660, height: 766 }, window: { resizable: true }, actions: { + toggleHitPoints: AdversarySheet.#toggleHitPoints, + toggleStress: AdversarySheet.#toggleStress, reactionRoll: AdversarySheet.#reactionRoll, toggleResourceDice: AdversarySheet.#toggleResourceDice, handleResourceDice: AdversarySheet.#handleResourceDice @@ -75,6 +77,16 @@ export default class AdversarySheet extends DHBaseActorSheet { const context = await super._prepareContext(options); context.systemFields.attack.fields = this.document.system.attack.schema.fields; + context.resources = Object.keys(this.document.system.resources).reduce((acc, key) => { + acc[key] = this.document.system.resources[key]; + return acc; + }, {}); + const maxResource = Math.max(context.resources.hitPoints.max, context.resources.stress.max); + context.resources.hitPoints.emptyPips = + context.resources.hitPoints.max < maxResource ? maxResource - context.resources.hitPoints.max : 0; + context.resources.stress.emptyPips = + context.resources.stress.max < maxResource ? maxResource - context.resources.stress.max : 0; + return context; } @@ -155,6 +167,27 @@ export default class AdversarySheet extends DHBaseActorSheet { /* Application Clicks Actions */ /* -------------------------------------------- */ + /** + * Toggles hitpoint resource value. + * @type {ApplicationClickAction} + */ + static async #toggleHitPoints(_, button) { + const hitPointsValue = Number.parseInt(button.dataset.value); + const newValue = + this.document.system.resources.hitPoints.value >= hitPointsValue ? hitPointsValue - 1 : hitPointsValue; + await this.document.update({ 'system.resources.hitPoints.value': newValue }); + } + + /** + * Toggles stress resource value. + * @type {ApplicationClickAction} + */ + static async #toggleStress(_, button) { + const StressValue = Number.parseInt(button.dataset.value); + const newValue = this.document.system.resources.stress.value >= StressValue ? StressValue - 1 : StressValue; + await this.document.update({ 'system.resources.stress.value': newValue }); + } + /** * Performs a reaction roll for an Adversary. * @type {ApplicationClickAction} diff --git a/module/applications/sheets/actors/companion.mjs b/module/applications/sheets/actors/companion.mjs index fd8cddbf..9b85f622 100644 --- a/module/applications/sheets/actors/companion.mjs +++ b/module/applications/sheets/actors/companion.mjs @@ -8,6 +8,7 @@ export default class DhCompanionSheet extends DHBaseActorSheet { classes: ['actor', 'companion'], position: { width: 340 }, actions: { + toggleStress: DhCompanionSheet.#toggleStress, actionRoll: DhCompanionSheet.#actionRoll, levelManagement: DhCompanionSheet.#levelManagement } @@ -50,6 +51,16 @@ export default class DhCompanionSheet extends DHBaseActorSheet { /* Application Clicks Actions */ /* -------------------------------------------- */ + /** + * Toggles stress resource value. + * @type {ApplicationClickAction} + */ + static async #toggleStress(_, button) { + const StressValue = Number.parseInt(button.dataset.value); + const newValue = this.document.system.resources.stress.value >= StressValue ? StressValue - 1 : StressValue; + await this.document.update({ 'system.resources.stress.value': newValue }); + } + /** * */ diff --git a/styles/less/global/index.less b/styles/less/global/index.less index db61304a..f51140de 100644 --- a/styles/less/global/index.less +++ b/styles/less/global/index.less @@ -19,3 +19,4 @@ @import './filter-menu.less'; @import './tab-attachments.less'; @import './dice.less'; +@import './resource-bar.less'; diff --git a/styles/less/global/resource-bar.less b/styles/less/global/resource-bar.less new file mode 100644 index 00000000..be9bc68b --- /dev/null +++ b/styles/less/global/resource-bar.less @@ -0,0 +1,178 @@ +// Theme sidebar backgrounds +.appTheme({ + .slot-value .slot-bar { + background: @dark-blue; + } +}, { + .slot-value .slot-bar { + background-image: url('../assets/parchments/dh-parchment-light.png'); + } +}); + +.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); + } + } + .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 light-dark(@dark-blue, @golden); + border-radius: 6px; + z-index: 1; + color: light-dark(@dark-blue, @golden); + width: fit-content; + + .slot { + width: 15px; + height: 10px; + border: 1px solid light-dark(@dark-blue, @golden); + 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; + 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 light-dark(@dark-blue, @golden); + 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; + } + } +} diff --git a/styles/less/sheets/actors/adversary/sidebar.less b/styles/less/sheets/actors/adversary/sidebar.less index ab15fa46..f8537525 100644 --- a/styles/less/sheets/actors/adversary/sidebar.less +++ b/styles/less/sheets/actors/adversary/sidebar.less @@ -109,6 +109,14 @@ gap: 16px; margin-bottom: -10px; + &.pip-display { + top: -15px; + + .resources-section { + justify-content: space-around; + } + } + .resources-section { display: flex; justify-content: space-evenly; diff --git a/styles/less/sheets/actors/character/sidebar.less b/styles/less/sheets/actors/character/sidebar.less index 42a91ecc..e66cba82 100644 --- a/styles/less/sheets/actors/character/sidebar.less +++ b/styles/less/sheets/actors/character/sidebar.less @@ -11,12 +11,10 @@ background: url(../assets/svg/experience-shield.svg) no-repeat; } - .info-section { - .resources-section .status-bar, .status-section .status-bar.armor-slots { - .slot-value .slot-bar { - background: @dark-blue; - } - } + .info-section .status-section .status-bar.armor-slots { + .slot-value .slot-bar { + background: @dark-blue; + } } } }, { @@ -31,12 +29,10 @@ filter: brightness(0) drop-shadow(0 0 3px @dark-blue); } - .info-section { - .resources-section .status-bar, .status-section .status-bar.armor-slots { - .slot-value .slot-bar { - background-image: url('../assets/parchments/dh-parchment-light.png'); - } - } + .info-section .status-section .status-bar.armor-slots { + .slot-value .slot-bar { + background-image: url('../assets/parchments/dh-parchment-light.png'); + } } } }); @@ -141,13 +137,22 @@ display: flex; flex-direction: column; top: -20px; - gap: 15px; + gap: 10px; margin-bottom: -16px; + &.pip-display { + gap: 15px; + + .resources-section { + justify-content: space-around; + margin: 8px 2px 8px 2px; + } + } + .resources-section { display: flex; - justify-content: space-around; - margin: 8px 2px 8px 2px; + justify-content: space-evenly; + margin-bottom: 20px; .status-bar { display: flex; @@ -171,71 +176,6 @@ 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 light-dark(@dark-blue, @golden); - border-radius: 6px; - z-index: 1; - color: light-dark(@dark-blue, @golden); - width: fit-content; - - .slot { - width: 15px; - height: 10px; - border: 1px solid light-dark(@dark-blue, @golden); - 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); - } - } - - .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; @@ -319,13 +259,34 @@ flex-wrap: wrap; gap: 5px; justify-content: center; - align-items: center; + + &.pip-display { + align-items: end; + + .status-bar.armor-slots { + width: 100px; + height: auto; + + .slot-value { + position: relative; + height: auto; + + .slot-bar { + border-radius: 6px 6px 0 0; + } + } + + .status-value { + padding: 0 5px; + } + } + } .status-bar.armor-slots { display: flex; justify-content: center; position: relative; - width: 100px; + width: 95px; height: 30px; .status-label { @@ -336,6 +297,7 @@ width: 95px; border-radius: 3px; background: light-dark(@dark-blue, @golden); + clip-path: none; h4 { font-weight: bold; @@ -401,13 +363,14 @@ .value { padding-left: 6px; + border-left: 0; } } } .status-value { position: absolute; display: flex; - padding: 0 5px; + padding: 0 6px; font-size: 1.2rem; align-items: center; width: 80px; @@ -416,6 +379,9 @@ text-align: center; z-index: 2; color: light-dark(@dark-blue, @beige); + border: 1px solid light-dark(@dark-blue, @golden); + border-bottom: none; + border-radius: 6px 6px 0 0; input[type='number'] { background: transparent; diff --git a/styles/less/sheets/actors/companion/header.less b/styles/less/sheets/actors/companion/header.less index b85a1819..3616a6b3 100644 --- a/styles/less/sheets/actors/companion/header.less +++ b/styles/less/sheets/actors/companion/header.less @@ -37,11 +37,22 @@ } } + .resource-section { + width: 100%; + display: flex; + justify-content: center; + } + .status-section { display: flex; gap: 5px; justify-content: center; + &.pip-display { + width: 100%; + justify-content: space-around; + } + .status-number { display: flex; flex-direction: column; @@ -84,103 +95,103 @@ } } - .status-bar { - display: flex; - justify-content: center; - position: relative; - width: 100px; - height: 40px; + // .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); + // .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; + // 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; + // 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; + // &.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); - } - } - } + // &: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 light-dark(@dark-blue, @golden); - border-radius: 6px; - z-index: 1; - background: @dark-blue; + // .bar-label { + // width: 40px; + // } + // } + // .progress-bar { + // position: absolute; + // appearance: none; + // width: 100px; + // height: 40px; + // border: 1px solid light-dark(@dark-blue, @golden); + // 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; - } - } - } + // &::-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; + // } + // } + // } .level-div { white-space: nowrap; diff --git a/templates/sheets/actors/adversary/sidebar.hbs b/templates/sheets/actors/adversary/sidebar.hbs index 0909c969..38a5c11f 100644 --- a/templates/sheets/actors/adversary/sidebar.hbs +++ b/templates/sheets/actors/adversary/sidebar.hbs @@ -4,35 +4,10 @@ -
+
-
-
- - / - {{source.system.resources.hitPoints.max}} -
- -
-

{{localize 'DAGGERHEART.GENERAL.HitPoints.short'}}

-
- -
-
-
- - / - {{source.system.resources.stress.max}} -
- -
-

{{localize 'DAGGERHEART.GENERAL.stress'}}

-
-
+ {{> "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" }}
diff --git a/templates/sheets/actors/character/sidebar.hbs b/templates/sheets/actors/character/sidebar.hbs index 12aa5d76..9ef3939a 100644 --- a/templates/sheets/actors/character/sidebar.hbs +++ b/templates/sheets/actors/character/sidebar.hbs @@ -15,12 +15,12 @@
-
+
- {{> "systems/daggerheart/templates/sheets/global/partials/resource-bar.hbs" resource=resources.hitPoints }} - {{> "systems/daggerheart/templates/sheets/global/partials/resource-bar.hbs" resource=resources.stress }} + {{> "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" }}
-
+

{{document.system.evasion}}

@@ -52,9 +52,9 @@
{{else}}
-

-

/

-

{{document.system.armorScore}}

+ + / + {{document.system.armorScore}}
-
+ {{#if useResourcePips}} +
+ {{> "systems/daggerheart/templates/sheets/global/partials/resource-bar.hbs" resource=document.system.resources.stress label="DAGGERHEART.GENERAL.stress" key="system.resources.stress.value" action="toggleStress" largePips=true }} +
+ {{/if}} +

{{document.system.evasion}}

@@ -17,21 +22,11 @@

{{localize "DAGGERHEART.GENERAL.evasion"}}

-
-
- - / - {{document.system.resources.stress.max}} + {{#unless useResourcePips}} +
+ {{> "systems/daggerheart/templates/sheets/global/partials/resource-bar.hbs" resource=document.system.resources.stress label="DAGGERHEART.GENERAL.stress" key="system.resources.stress.value" action="toggleStress" }}
- -
-

{{localize "DAGGERHEART.GENERAL.stress"}}

-
-
+ {{/unless}}

{{localize 'DAGGERHEART.GENERAL.level'}} diff --git a/templates/sheets/global/partials/resource-bar.hbs b/templates/sheets/global/partials/resource-bar.hbs index d195322d..c0d13e54 100644 --- a/templates/sheets/global/partials/resource-bar.hbs +++ b/templates/sheets/global/partials/resource-bar.hbs @@ -3,7 +3,7 @@
{{#times resource.max}} - + {{/times}} @@ -12,13 +12,13 @@ {{/times}}
- {{localize "DAGGERHEART.GENERAL.HitPoints.short"}} + {{localize label}} {{resource.value}} / {{resource.max}}
{{else}}
- / {{resource.max}} @@ -29,7 +29,7 @@ value='{{resource.value}}' >
-

{{localize "DAGGERHEART.GENERAL.HitPoints.short"}}

+

{{localize label}}

{{/if}}
\ No newline at end of file