Compare commits

...

2 commits

Author SHA1 Message Date
Carlos Fernandez
632e33ecd6 Move successful buttons to inner result 2026-04-23 06:53:41 -04:00
Carlos Fernandez
98f9957ba0 Style and restore aid modifiers 2026-04-23 06:35:02 -04:00
4 changed files with 179 additions and 116 deletions

View file

@ -37,7 +37,7 @@ export default class GroupRollDialog extends HandlebarsApplicationMixin(Applicat
tag: 'form', tag: 'form',
id: 'GroupRollDialog', id: 'GroupRollDialog',
classes: ['daggerheart', 'views', 'dh-style', 'dialog', 'group-roll-dialog'], classes: ['daggerheart', 'views', 'dh-style', 'dialog', 'group-roll-dialog'],
position: { width: 380, height: 'auto' }, position: { width: 390, height: 'auto' },
window: { window: {
icon: 'fa-solid fa-users' icon: 'fa-solid fa-users'
}, },
@ -47,7 +47,7 @@ export default class GroupRollDialog extends HandlebarsApplicationMixin(Applicat
makeRoll: this.#makeRoll, makeRoll: this.#makeRoll,
removeRoll: this.#removeRoll, removeRoll: this.#removeRoll,
rerollDice: this.#rerollDice, rerollDice: this.#rerollDice,
markSuccessfull: this.#markSuccessfull, markSuccessful: this.#markSuccessful,
cancelRoll: this.#onCancelRoll, cancelRoll: this.#onCancelRoll,
finishRoll: this.#finishRoll finishRoll: this.#finishRoll
}, },
@ -204,7 +204,8 @@ export default class GroupRollDialog extends HandlebarsApplicationMixin(Applicat
isEditable: actor?.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER), isEditable: actor?.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER),
key: partId, key: partId,
readyToRoll: Boolean(data.rollChoice), readyToRoll: Boolean(data.rollChoice),
hasRolled: Boolean(data.rollData) hasRolled: Boolean(data.rollData),
modifier: data.successfull ? 1 : data.successfull === false ? -1 : 0
}; };
} }
@ -406,12 +407,13 @@ export default class GroupRollDialog extends HandlebarsApplicationMixin(Applicat
); );
} }
static #markSuccessfull(_event, button) { static #markSuccessful(_event, button) {
const previousValue = this.party.system.groupRoll.aidingCharacters[button.dataset.member].successfull; const memberKey = button.closest('[data-member-key]').dataset.memberKey;
const newValue = Boolean(button.dataset.successfull === 'true'); const previousValue = this.party.system.groupRoll.aidingCharacters[memberKey].successfull;
const newValue = Boolean(button.dataset.success === 'true');
this.updatePartyData( this.updatePartyData(
{ {
[`system.groupRoll.aidingCharacters.${button.dataset.member}.successfull`]: [`system.groupRoll.aidingCharacters.${memberKey}.successfull`]:
previousValue === newValue ? null : newValue previousValue === newValue ? null : newValue
}, },
this.getUpdatingParts(button) this.getUpdatingParts(button)

View file

@ -19,15 +19,58 @@
} }
.item-tags { .item-tags {
gap: 6px;
.tag.failure,
.tag.success { .tag.success {
font-weight: 600;
justify-content: center;
min-width: 3ch;
}
.tag.success {
border-color: @green;
background: @green-10; background: @green-10;
color: @green; color: @green;
} }
.tag.failure { .tag.failure {
border-color: @red;
background: @red-10; background: @red-10;
color: @red; color: @red;
} }
.tag {
padding-top: 0;
padding-bottom: 0;
line-height: 1.1875rem;
}
}
.with-result {
border-radius: 5px;
background: var(--duality-bg);
color: var(--color-light-2);
&.hope {
--duality-text-color: @golden;
--duality-bg: url(../assets/parchments/dh-parchment-hope.png);
}
&.fear {
--duality-text-color: @chat-blue;
--duality-bg: url(../assets/parchments/dh-parchment-fear.png);
}
&.critical {
--duality-text-color: @chat-purple;
--duality-bg: url(../assets/parchments/dh-parchment-critical.png);
}
.duality-label {
font-family: var(--dh-font-subtitle);
color: var(--duality-text-color);
font-weight: 700;
}
} }
.member-roll-container { .member-roll-container {
@ -37,6 +80,11 @@
gap: 8px; gap: 8px;
height: 3.375rem; height: 3.375rem;
&.inactive {
opacity: 0.3;
pointer-events: none;
}
.name-area { .name-area {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -48,17 +96,24 @@
.trait { .trait {
display: flex; display: flex;
align-items: center; align-items: center;
gap: var(--spacer-8); gap: 6px;
select { select {
--input-height: 2em; --input-height: 2em;
width: auto; width: auto;
} }
} }
.item-tags {
align-items: stretch;
}
} }
&.inactive { .buttons {
opacity: 0.3; display: flex;
pointer-events: none; flex-direction: column;
button {
--button-size: 1.5em;
padding: 0 var(--spacer-4);
}
} }
a.roll-button.initial-roll { a.roll-button.initial-roll {
@ -66,94 +121,82 @@
height: 1.875rem; height: 1.875rem;
margin-right: 2px; /** makes hover look a bit nicer */ margin-right: 2px; /** makes hover look a bit nicer */
} }
}
}
.roll-container { .with-result {
display: flex;
flex-direction: column;
}
.with-result {
border-radius: 5px;
background: var(--duality-bg);
color: var(--color-light-2);
&.hope {
--duality-text-color: @golden;
--duality-bg: url(../assets/parchments/dh-parchment-hope.png);
}
&.fear {
--duality-text-color: @chat-blue;
--duality-bg: url(../assets/parchments/dh-parchment-fear.png);
}
&.critical {
--duality-text-color: @chat-purple;
--duality-bg: url(../assets/parchments/dh-parchment-critical.png);
}
.duality-label {
font-family: var(--dh-font-subtitle);
color: var(--duality-text-color);
font-weight: 700;
}
}
.roll-data {
display: flex;
flex-direction: column;
align-items: end;
justify-content: center;
padding: 0 4px;
min-height: 3rem;
.duality-label {
font-size: var(--font-size-15);
.unused-damage {
text-decoration: line-through;
}
.with {
font-size: var(--font-size-10);
}
}
.roll-dice-container {
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
gap: 4px;
.roll-dice {
position: relative;
display: flex; display: flex;
justify-content: end;
align-items: center; align-items: center;
justify-content: center; gap: 6px;
.dice-label { .roll-data {
position: absolute; display: flex;
color: white; flex-direction: column;
font-size: 1rem; align-items: end;
paint-order: stroke fill; justify-content: center;
-webkit-text-stroke: 2px black; padding: 0 4px;
min-height: 3rem;
.duality-label {
font-size: var(--font-size-15);
.unused-damage {
text-decoration: line-through;
}
.with {
font-size: var(--font-size-10);
}
}
.roll-dice-container {
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
gap: 4px;
.roll-dice {
position: relative;
display: flex;
align-items: center;
justify-content: center;
.dice-label {
position: absolute;
color: white;
font-size: 1rem;
paint-order: stroke fill;
-webkit-text-stroke: 2px black;
}
img {
height: 1.25rem;
}
}
.roll-operator {
font-size: var(--font-size-18);
}
.roll-value {
font-size: var(--font-size-16);
}
}
} }
img { .buttons {
height: 1.25rem; gap: 2px;
button {
color: var(--medium-red);
&[data-success=true] {
color: var(--green);
}
&.inactive {
opacity: 0.4;
}
}
} }
} }
.roll-operator {
font-size: var(--font-size-18);
}
.roll-value {
font-size: var(--font-size-16);
}
} }
} }
@ -178,6 +221,10 @@
margin-block: var(--spacer-4); margin-block: var(--spacer-4);
} }
.modifiers .item-tags {
min-height: calc(2px + 1.1875rem);
}
.total { .total {
.label { .label {
font-size: var(--font-size-14); font-size: var(--font-size-14);

View file

@ -1,13 +1,17 @@
{{#with (ifThen (eq partId "leader") leader (lookup members partId))}} {{#with (ifThen (eq partId "leader") leader (lookup members partId))}}
<section class="member-roll-container {{type}} {{#if @root.allHaveRolled}}select-padding{{/if}} {{#unless isEditable}}inactive{{/unless}}" data-member-key="{{@root.partId}}"> <section class="member-roll-container {{type}} {{#if @root.allHaveRolled}}select-padding{{/if}} {{#unless isEditable}}inactive{{/unless}}" data-member-key="{{@root.partId}}">
{{log this}} {{log this}}
{{log @root}}
<img class="portrait" src="{{img}}" /> <img class="portrait" src="{{img}}" />
<div class="name-area"> <div class="name-area">
<span class="name">{{name}}</span> <span class="name">{{name}}</span>
{{#if hasRolled}} {{#if hasRolled}}
<div class="trait item-tags"> <div class="trait item-tags">
<div class="tag">{{rollChoiceLabel}}</div> <div class="tag">{{rollChoiceLabel}}</div>
{{#if modifier}}
<span class="tag {{#if (gte modifier 0)}}success{{else}}failure{{/if}}">
{{numberFormat modifier sign=true}}
</span>
{{/if}}
</div> </div>
{{else if readyToRoll}} {{else if readyToRoll}}
<div class="trait"> <div class="trait">
@ -19,30 +23,38 @@
{{/if}} {{/if}}
</div> </div>
{{#if roll}} {{#if roll}}
<div class="roll-data with-result {{#if roll.withHope}}hope{{else if roll.withFear}}fear{{else}}critical{{/if}}"> <div class="with-result {{#if roll.withHope}}hope{{else if roll.withFear}}fear{{else}}critical{{/if}}">
<div class="duality-label"> <div class="roll-data">
{{roll.total}} <div class="duality-label">
<span class="with">{{localize "DAGGERHEART.GENERAL.withThing" thing=roll.totalLabel}}</span> {{roll.total}}
</div> <span class="with">{{localize "DAGGERHEART.GENERAL.withThing" thing=roll.totalLabel}}</span>
<div class="roll-dice-container"> </div>
<a class="roll-dice" data-action="rerollDice" data-member="{{@root.partId}}" data-dice-type="hope"> <div class="roll-dice-container">
<span class="dice-label">{{roll.dHope.total}}</span> <a class="roll-dice" data-action="rerollDice" data-member="{{@root.partId}}" data-dice-type="hope">
<img src="{{concat "systems/daggerheart/assets/icons/dice/hope/" roll.dHope.denomination ".svg"}}" /> <span class="dice-label">{{roll.dHope.total}}</span>
</a> <img src="{{concat "systems/daggerheart/assets/icons/dice/hope/" roll.dHope.denomination ".svg"}}" />
<a class="roll-dice" data-action="rerollDice" data-member="{{@root.partId}}" data-dice-type="fear"> </a>
<span class="dice-label">{{roll.dFear.total}}</span> <a class="roll-dice" data-action="rerollDice" data-member="{{@root.partId}}" data-dice-type="fear">
<img src="{{concat "systems/daggerheart/assets/icons/dice/fear/" roll.dFear.denomination ".svg"}}" /> <span class="dice-label">{{roll.dFear.total}}</span>
</a> <img src="{{concat "systems/daggerheart/assets/icons/dice/fear/" roll.dFear.denomination ".svg"}}" />
{{#if roll.advantage.type}} </a>
<span class="roll-operator">{{#if (eq roll.advantage.type 1)}}+{{else}}-{{/if}}</span> {{#if roll.advantage.type}}
<span class="roll-dice"> <span class="roll-operator">{{#if (eq roll.advantage.type 1)}}+{{else}}-{{/if}}</span>
<span class="dice-label">{{roll.advantage.value}}</span> <span class="roll-dice">
<img src="{{concat "systems/daggerheart/assets/icons/dice/" (ifThen (eq roll.advantage.type 1) "adv/" "disadv/") roll.advantage.dice ".svg"}}" /> <span class="dice-label">{{roll.advantage.value}}</span>
</span> <img src="{{concat "systems/daggerheart/assets/icons/dice/" (ifThen (eq roll.advantage.type 1) "adv/" "disadv/") roll.advantage.dice ".svg"}}" />
{{/if}} </span>
<span class="roll-operator">{{#if (gte roll.modifierTotal 0)}}+{{else}}-{{/if}}</span> {{/if}}
<span class="roll-value">{{positive roll.modifierTotal}}</span> <span class="roll-operator ">{{#if (gte roll.modifierTotal 0)}}+{{else}}-{{/if}}</span>
<span class="roll-value">{{positive roll.modifierTotal}}</span>
</div>
</div> </div>
{{#if (and isEditable (ne ../partId "leader"))}}
<div class="buttons">
<button type="button" data-action="markSuccessful" data-success="true" class="plain icon fa-solid fa-check {{#if modifier}}{{#if successfull}}active{{else}}inactive{{/if}}{{/if}}"></button>
<button type="button" data-action="markSuccessful" class="plain icon fa-solid fa-times {{#if modifier}}{{#if successfull}}inactive{{else}}active{{/if}}{{/if}}"></button>
</div>
{{/if}}
</div> </div>
{{else if readyToRoll}} {{else if readyToRoll}}
<a class="roll-button initial-roll" data-action="makeRoll" data-member="{{@root.partId}}"> <a class="roll-button initial-roll" data-action="makeRoll" data-member="{{@root.partId}}">

View file

@ -12,7 +12,9 @@
<span class="label">Modifiers</span> <span class="label">Modifiers</span>
<div class="item-tags"> <div class="item-tags">
{{#each groupRoll.modifiers as |modifier|}} {{#each groupRoll.modifiers as |modifier|}}
<span class="tag">{{#if (gte modifier 0)}}+{{else}}-{{/if}}{{positive modifier}}</span> <span class="tag {{#if (gte modifier 0)}}success{{else}}failure{{/if}}">
{{numberFormat modifier sign=true}}
</span>
{{/each}} {{/each}}
</div> </div>
</div> </div>