duality tpl

This commit is contained in:
Dapoolp 2025-06-13 20:18:51 +02:00
parent 21b528e56c
commit 36bbfc52fb
10 changed files with 990 additions and 511 deletions

View file

@ -14,6 +14,7 @@ import { getCommandTarget, rollCommandToJSON, setDiceSoNiceForDualityRoll } from
import { abilities } from './module/config/actorConfig.mjs';
import Resources from './module/applications/resources.mjs';
import DHDualityRoll from './module/data/chat-message/dualityRoll.mjs';
import { DualityRollColor } from './module/data/settings/Appearance.mjs';
globalThis.SYSTEM = SYSTEM;
@ -105,6 +106,7 @@ Hooks.once('init', () => {
Hooks.on('ready', () => {
ui.resources = new CONFIG.ui.resources();
ui.resources.render({ force: true });
document.body.classList.toggle('theme-colorfull', game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.appearance).dualityColorScheme === DualityRollColor.colorful.value);
});
Hooks.once('dicesoniceready', () => {});

View file

@ -1,4 +1,4 @@
import DhAppearance from '../../data/settings/Appearance.mjs';
import DhAppearance, { DualityRollColor } from '../../data/settings/Appearance.mjs';
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
@ -54,7 +54,7 @@ export default class DHAppearanceSettings extends HandlebarsApplicationMixin(App
static async save() {
await game.settings.set(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.appearance, this.settings.toObject());
const reload = await foundry.applications.api.DialogV2.confirm({
/* const reload = await foundry.applications.api.DialogV2.confirm({
id: 'reload-world-confirm',
modal: true,
rejectClose: false,
@ -66,7 +66,8 @@ export default class DHAppearanceSettings extends HandlebarsApplicationMixin(App
if (reload) {
await game.socket.emit('reload');
foundry.utils.debouncedReload();
}
} */
document.body.classList.toggle('theme-colorfull', game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.appearance).dualityColorScheme === DualityRollColor.colorful.value);
this.close();
}

View file

@ -105,7 +105,11 @@ export class DHBaseAction extends foundry.abstract.DataModel {
}
get chatTemplate() {
return 'systems/daggerheart/templates/chat/attack-roll.hbs';
return 'systems/daggerheart/templates/chat/duality-roll.hbs';
}
get chatTitle() {
return this.item.name;
}
static getRollType() {
@ -132,7 +136,7 @@ export class DHBaseAction extends foundry.abstract.DataModel {
const modifierValue = this.actor.system.traits[this.roll.trait].value;
const config = {
event: event,
title: this.item.name,
title: this.chatTitle,
roll: {
modifier: modifierValue,
label: game.i18n.localize(abilities[this.roll.trait].label),
@ -200,6 +204,12 @@ export class DHAttackAction extends DHBaseAction {
return 'weapon';
}
get chatTitle() {
return game.i18n.format('DAGGERHEART.Chat.AttackRoll.Title', {
attack: this.item.name
});
}
prepareData() {
super.prepareData();
if (this.damage.includeBase && !!this.item?.system?.damage) {

View file

@ -59,7 +59,8 @@ export default class DHDualityRoll extends foundry.abstract.TypeDataModel {
}),
{ nullable: true, initial: null }
)
})
}),
forceDisplay: new fields.BooleanField({initial: false})
};
}
@ -96,7 +97,7 @@ export default class DHDualityRoll extends foundry.abstract.TypeDataModel {
get colorful() {
return (
game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.appearance).dualityColorScheme ===
!this.forceDisplay && game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.appearance).dualityColorScheme ===
DualityRollColor.colorful.value
);
}

View file

@ -272,9 +272,17 @@ export default class DhpActor extends Actor {
system: systemData,
content: config.chatMessage.template,
rolls: [roll]
}),
msg2 = new cls({
type: config.chatMessage.type ?? 'dualityRoll',
sound: config.chatMessage.mute ? null : CONFIG.sounds.dice,
system: {...systemData, forceDisplay: true },
content: config.chatMessage.template,
rolls: [roll]
});
await cls.create(msg.toObject());
await cls.create(msg2.toObject());
}
return roll;
}

View file

@ -1,59 +1,339 @@
.chat-message {
&.duality {
border-color: black;
padding: 8px 0 0 0;
// &.duality {
// border-color: black;
// padding: 8px 0 0 0;
.message-header {
color: var(--color-light-3);
padding: 0 8px;
}
// .message-header {
// color: var(--color-light-3);
// padding: 0 8px;
// }
.duality-data {
// .duality-data {
// display: flex;
// flex-direction: column;
// .duality-title {
// color: var(--color-light-1);
// text-shadow: 0 0 1px black;
// border-bottom: 1px solid;
// margin-bottom: 2px;
// display: flex;
// align-items: end;
// justify-content: space-between;
// padding: 0 8px;
// }
// .duality-modifiers {
// display: flex;
// gap: 2px;
// margin-bottom: 4px;
// padding: 0 8px;
// .duality-modifier {
// padding: 2px;
// border-radius: 6px;
// border: 1px solid;
// background: var(--color-dark-6);
// font-size: 12px;
// }
// }
// .duality-line {
// display: flex;
// align-items: end;
// justify-content: space-between;
// padding: 0 8px;
// &.simple {
// padding-right: 0;
// }
// .dice-outer-container {
// display: flex;
// align-items: center;
// gap: 4px;
// margin-bottom: 4px;
// .dice-container {
// display: flex;
// flex-direction: column;
// gap: 2px;
// .dice-title {
// color: var(--color-light-1);
// text-shadow: 0 0 1px black;
// }
// .dice-inner-container {
// display: flex;
// align-items: center;
// justify-content: center;
// position: relative;
// .dice-wrapper {
// height: 24px;
// width: 24px;
// position: relative;
// display: flex;
// align-items: center;
// justify-content: center;
// clip-path: polygon(
// 50% 0%,
// 80% 10%,
// 100% 35%,
// 100% 70%,
// 80% 90%,
// 50% 100%,
// 20% 90%,
// 0% 70%,
// 0% 35%,
// 20% 10%
// );
// .dice {
// height: 26px;
// width: 26px;
// max-width: unset;
// position: absolute;
// }
// }
// .dice-value {
// position: absolute;
// font-weight: bold;
// font-size: 16px;
// }
// &.hope {
// .dice-wrapper {
// background: black;
// .dice {
// filter: brightness(0) saturate(100%) invert(79%) sepia(79%) saturate(333%)
// hue-rotate(352deg) brightness(102%) contrast(103%);
// }
// }
// .dice-value {
// color: var(--color-dark-1);
// text-shadow: 0 0 4px white;
// }
// }
// &.fear {
// .dice-wrapper {
// background: white;
// .dice {
// filter: brightness(0) saturate(100%) invert(12%) sepia(88%) saturate(4321%)
// hue-rotate(221deg) brightness(92%) contrast(110%);
// }
// }
// .dice-value {
// color: var(--color-light-1);
// text-shadow: 0 0 4px black;
// }
// }
// }
// }
// .advantage-container {
// padding-top: 21px;
// .dice-wrapper {
// height: 24px;
// width: 24px;
// position: relative;
// display: flex;
// align-items: center;
// justify-content: center;
// .dice {
// height: 26px;
// width: 26px;
// max-width: unset;
// position: absolute;
// }
// .dice-value {
// position: absolute;
// font-weight: bold;
// font-size: 16px;
// }
// }
// &.advantage {
// .dice-wrapper {
// .dice {
// filter: brightness(0) saturate(100%) invert(18%) sepia(92%) saturate(4133%)
// hue-rotate(96deg) brightness(104%) contrast(107%);
// }
// }
// }
// &.disadvantage {
// .dice-wrapper {
// .dice {
// filter: brightness(0) saturate(100%) invert(9%) sepia(78%) saturate(6903%)
// hue-rotate(11deg) brightness(93%) contrast(117%);
// }
// }
// }
// }
// .duality-modifier {
// padding-top: 21px;
// color: var(--color-light-1);
// text-shadow: 0 0 1px black;
// font-size: 16px;
// }
// }
// }
// }
// .duality-result {
// display: flex;
// flex-direction: column;
// align-items: end;
// justify-content: center;
// gap: 2px;
// color: var(--color-light-1);
// text-shadow: 0 0 1px black;
// font-weight: bold;
// background: var(--color-dark-1);
// padding: 4px 4px 0 4px;
// border-radius: 6px 0 0 0;
// }
// .duality-actions {
// display: flex;
// justify-content: space-between;
// .duality-action {
// color: var(--color-light-1);
// text-shadow: 0 0 1px black;
// font-weight: bold;
// background: var(--color-dark-1);
// padding: 4px;
// border-radius: 0 6px 0 0;
// border-color: black;
// min-height: unset;
// height: 26px;
// &:hover {
// background: var(--button-hover-background-color);
// }
// }
// }
// .target-section {
// margin: 4px 4px;
// border: 2px solid;
// .target-container {
// display: flex;
// align-items: center;
// transition: all 0.2s ease-in-out;
// &:hover {
// filter: drop-shadow(0 0 3px @secondaryShadow);
// border-color: gold;
// }
// &.hit {
// background: @hit;
// }
// &.miss {
// background: @miss;
// }
// img {
// flex: 0;
// width: 22px;
// height: 22px;
// margin-left: 8px;
// align-self: center;
// border-color: transparent;
// }
// .target-inner-container {
// flex: 1;
// display: flex;
// justify-content: center;
// margin-right: @hugeMargin;
// font-weight: bold;
// font-size: 17px;
// }
// }
// }
// &.hope {
// background: linear-gradient(0, @hopeBackgroundEnd 40px, @hopeBackgroundStart);
// }
// &.fear {
// background: linear-gradient(0, @fearBackgroundEnd, @fearBackgroundStart);
// }
// &.critical {
// background: linear-gradient(0, @criticalBackgroundEnd, @criticalBackgroundStart);
// }
// .dice-roll {
// color: var(--color-dark-1);
// .dice-flavor {
// color: var(--color-light-1);
// }
// }
// }
.duality-modifiers, .duality-result, .dice-title {
display: none;
}
}
.daggerheart.chat {
&.downtime {
display: flex;
flex-direction: column;
align-items: center;
.downtime-title-container {
display: flex;
flex-direction: column;
align-items: center;
.duality-title {
color: var(--color-light-1);
text-shadow: 0 0 1px black;
border-bottom: 1px solid;
margin-bottom: 2px;
display: flex;
align-items: end;
justify-content: space-between;
padding: 0 8px;
.downtime-subtitle {
font-size: 17px;
}
}
.duality-modifiers {
display: flex;
gap: 2px;
margin-bottom: 4px;
padding: 0 8px;
.downtime-image {
width: 80px;
}
.duality-modifier {
padding: 2px;
border-radius: 6px;
border: 1px solid;
background: var(--color-dark-6);
font-size: 12px;
}
.downtime-refresh-container {
margin-top: @fullMargin;
width: 100%;
.refresh-title {
font-weight: bold;
}
}
}
.duality-line {
display: flex;
align-items: end;
justify-content: space-between;
padding: 0 8px;
&.simple {
padding-right: 0;
}
.dice-outer-container {
&.roll {
.dice-flavor {
text-align: center;
font-weight: bold;
}
.dice-tooltip {
.dice-rolls {
> .roll {
display: flex;
align-items: center;
gap: 4px;
margin-bottom: 4px;
.dice-container {
display: flex;
flex-direction: column;
@ -137,195 +417,9 @@
}
}
}
.advantage-container {
padding-top: 21px;
.dice-wrapper {
height: 24px;
width: 24px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
.dice {
height: 26px;
width: 26px;
max-width: unset;
position: absolute;
}
.dice-value {
position: absolute;
font-weight: bold;
font-size: 16px;
}
}
&.advantage {
.dice-wrapper {
.dice {
filter: brightness(0) saturate(100%) invert(18%) sepia(92%) saturate(4133%)
hue-rotate(96deg) brightness(104%) contrast(107%);
}
}
}
&.disadvantage {
.dice-wrapper {
.dice {
filter: brightness(0) saturate(100%) invert(9%) sepia(78%) saturate(6903%)
hue-rotate(11deg) brightness(93%) contrast(117%);
}
}
}
}
.duality-modifier {
padding-top: 21px;
color: var(--color-light-1);
text-shadow: 0 0 1px black;
font-size: 16px;
}
}
}
}
.duality-result {
display: flex;
flex-direction: column;
align-items: end;
justify-content: center;
gap: 2px;
color: var(--color-light-1);
text-shadow: 0 0 1px black;
font-weight: bold;
background: var(--color-dark-1);
padding: 4px 4px 0 4px;
border-radius: 6px 0 0 0;
}
.duality-actions {
display: flex;
justify-content: space-between;
.duality-action {
color: var(--color-light-1);
text-shadow: 0 0 1px black;
font-weight: bold;
background: var(--color-dark-1);
padding: 4px;
border-radius: 0 6px 0 0;
border-color: black;
min-height: unset;
height: 26px;
&:hover {
background: var(--button-hover-background-color);
}
}
}
.target-section {
margin: 4px 4px;
border: 2px solid;
.target-container {
display: flex;
align-items: center;
transition: all 0.2s ease-in-out;
&:hover {
filter: drop-shadow(0 0 3px @secondaryShadow);
border-color: gold;
}
&.hit {
background: @hit;
}
&.miss {
background: @miss;
}
img {
flex: 0;
width: 22px;
height: 22px;
margin-left: 8px;
align-self: center;
border-color: transparent;
}
.target-inner-container {
flex: 1;
display: flex;
justify-content: center;
margin-right: @hugeMargin;
font-weight: bold;
font-size: 17px;
}
}
}
&.hope {
background: linear-gradient(0, @hopeBackgroundEnd 40px, @hopeBackgroundStart);
}
&.fear {
background: linear-gradient(0, @fearBackgroundEnd, @fearBackgroundStart);
}
&.critical {
background: linear-gradient(0, @criticalBackgroundEnd, @criticalBackgroundStart);
}
.dice-roll {
color: var(--color-dark-1);
.dice-flavor {
color: var(--color-light-1);
}
}
}
}
.daggerheart.chat {
&.downtime {
display: flex;
flex-direction: column;
align-items: center;
.downtime-title-container {
display: flex;
flex-direction: column;
align-items: center;
.downtime-subtitle {
font-size: 17px;
}
}
.downtime-image {
width: 80px;
}
.downtime-refresh-container {
margin-top: @fullMargin;
width: 100%;
.refresh-title {
font-weight: bold;
}
}
}
&.roll {
.dice-flavor {
text-align: center;
font-weight: bold;
}
.dice-tooltip {
.dice-rolls.duality {
/* .dice-rolls.duality {
display: flex;
align-items: center;
@ -397,7 +491,7 @@
.attack-roll-advantage-container {
text-align: end;
font-weight: bold;
}
} */
}
.dice-total {
@ -559,3 +653,143 @@
}
}
}
.theme-colorfull {
.chat-message.duality {
border-color: black;
padding: 8px 0 0 0;
.message-header {
color: var(--color-light-3);
padding: 0 8px;
}
&.hope {
background: linear-gradient(0, rgba(165, 42, 42, 0.6) 40px, rgba(0, 0, 0, 0.6));
}
&.fear {
background: linear-gradient(0, @fearBackgroundEnd, @fearBackgroundStart);
}
&.critical {
background: linear-gradient(0, @criticalBackgroundEnd, @criticalBackgroundStart);
}
.chat-message header {
color: var(--color-light-3);
}
> * {
padding: 0 8px;
}
.message-content {
.duality-modifiers, .duality-result, .dice-title {
display: flex;
}
.duality-modifiers {
display: flex;
gap: 2px;
margin-bottom: 4px;
// padding: 0 8px;
.duality-modifier {
padding: 2px;
border-radius: 6px;
border: 1px solid;
background: var(--color-dark-6);
font-size: 12px;
}
}
.dice-flavor {
color: var(--color-light-1);
text-shadow: 0 0 1px black;
border-bottom: 1px solid;
display: flex;
align-items: end;
justify-content: space-between;
padding: 0 8px;
margin: 0 -8px 2px;
font-weight: unset;
}
.dice-result {
.duality-modifiers {
display: flex; // Default => display: none;
gap: 2px;
margin-bottom: 4px;
.duality-modifier {
padding: 2px;
border-radius: 6px;
border: 1px solid;
background: var(--color-dark-6);
font-size: 12px;
}
}
.dice-formula, > .dice-total, .part-header {
display: none;
}
.dice-tooltip {
grid-template-rows: 1fr;
.wrapper {
.tooltip-part {
display: flex;
align-items: end;
gap: .25rem;
.dice {
.dice-rolls {
display: flex;
gap: 0.25rem;
margin-bottom: 0;
li {
display: flex;
align-items: center;
justify-content: center;
position: relative;
background: unset;
line-height: unset;
font-weight: unset;
}
}
}
}
}
}
.target-section {
margin: 4px 0;
border: 2px solid;
margin-top: 5px;
.dice-total {
box-shadow: unset;
border: unset;
border-radius: unset;
font-size: var(--font-size-18);
}
}
.dice-actions {
justify-content: space-between;
.duality-action {
color: var(--color-light-1);
text-shadow: 0 0 1px black;
font-weight: bold;
background: var(--color-dark-1);
padding: 4px;
border-radius: 0 6px 0 0;
border-color: black;
min-height: unset;
height: 26px;
margin-left: -8px;
flex: unset;
}
}
.duality-result {
display: flex;
flex-direction: column;
align-items: end;
justify-content: center;
gap: 2px;
color: var(--color-light-1);
text-shadow: 0 0 1px black;
font-weight: bold;
background: var(--color-dark-1);
padding: 4px 4px 0 4px;
border-radius: 6px 0 0 0;
margin-right: -8px;
}
}
}
}
}

View file

@ -1380,225 +1380,10 @@
margin: 0;
text-align: center;
}
.chat-message.duality {
border-color: black;
padding: 8px 0 0 0;
}
.chat-message.duality .message-header {
color: var(--color-light-3);
padding: 0 8px;
}
.chat-message.duality .duality-data {
display: flex;
flex-direction: column;
}
.chat-message.duality .duality-data .duality-title {
color: var(--color-light-1);
text-shadow: 0 0 1px black;
border-bottom: 1px solid;
margin-bottom: 2px;
display: flex;
align-items: end;
justify-content: space-between;
padding: 0 8px;
}
.chat-message.duality .duality-data .duality-modifiers {
display: flex;
gap: 2px;
margin-bottom: 4px;
padding: 0 8px;
}
.chat-message.duality .duality-data .duality-modifiers .duality-modifier {
padding: 2px;
border-radius: 6px;
border: 1px solid;
background: var(--color-dark-6);
font-size: 12px;
}
.chat-message.duality .duality-data .duality-line {
display: flex;
align-items: end;
justify-content: space-between;
padding: 0 8px;
}
.chat-message.duality .duality-data .duality-line.simple {
padding-right: 0;
}
.chat-message.duality .duality-data .duality-line .dice-outer-container {
display: flex;
align-items: center;
gap: 4px;
margin-bottom: 4px;
}
.chat-message.duality .duality-data .duality-line .dice-outer-container .dice-container {
display: flex;
flex-direction: column;
gap: 2px;
}
.chat-message.duality .duality-data .duality-line .dice-outer-container .dice-container .dice-title {
color: var(--color-light-1);
text-shadow: 0 0 1px black;
}
.chat-message.duality .duality-data .duality-line .dice-outer-container .dice-container .dice-inner-container {
display: flex;
align-items: center;
justify-content: center;
position: relative;
}
.chat-message.duality .duality-data .duality-line .dice-outer-container .dice-container .dice-inner-container .dice-wrapper {
height: 24px;
width: 24px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
clip-path: polygon(50% 0%, 80% 10%, 100% 35%, 100% 70%, 80% 90%, 50% 100%, 20% 90%, 0% 70%, 0% 35%, 20% 10%);
}
.chat-message.duality .duality-data .duality-line .dice-outer-container .dice-container .dice-inner-container .dice-wrapper .dice {
height: 26px;
width: 26px;
max-width: unset;
position: absolute;
}
.chat-message.duality .duality-data .duality-line .dice-outer-container .dice-container .dice-inner-container .dice-value {
position: absolute;
font-weight: bold;
font-size: 16px;
}
.chat-message.duality .duality-data .duality-line .dice-outer-container .dice-container .dice-inner-container.hope .dice-wrapper {
background: black;
}
.chat-message.duality .duality-data .duality-line .dice-outer-container .dice-container .dice-inner-container.hope .dice-wrapper .dice {
filter: brightness(0) saturate(100%) invert(79%) sepia(79%) saturate(333%) hue-rotate(352deg) brightness(102%) contrast(103%);
}
.chat-message.duality .duality-data .duality-line .dice-outer-container .dice-container .dice-inner-container.hope .dice-value {
color: var(--color-dark-1);
text-shadow: 0 0 4px white;
}
.chat-message.duality .duality-data .duality-line .dice-outer-container .dice-container .dice-inner-container.fear .dice-wrapper {
background: white;
}
.chat-message.duality .duality-data .duality-line .dice-outer-container .dice-container .dice-inner-container.fear .dice-wrapper .dice {
filter: brightness(0) saturate(100%) invert(12%) sepia(88%) saturate(4321%) hue-rotate(221deg) brightness(92%) contrast(110%);
}
.chat-message.duality .duality-data .duality-line .dice-outer-container .dice-container .dice-inner-container.fear .dice-value {
color: var(--color-light-1);
text-shadow: 0 0 4px black;
}
.chat-message.duality .duality-data .duality-line .dice-outer-container .advantage-container {
padding-top: 21px;
}
.chat-message.duality .duality-data .duality-line .dice-outer-container .advantage-container .dice-wrapper {
height: 24px;
width: 24px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.chat-message.duality .duality-data .duality-line .dice-outer-container .advantage-container .dice-wrapper .dice {
height: 26px;
width: 26px;
max-width: unset;
position: absolute;
}
.chat-message.duality .duality-data .duality-line .dice-outer-container .advantage-container .dice-wrapper .dice-value {
position: absolute;
font-weight: bold;
font-size: 16px;
}
.chat-message.duality .duality-data .duality-line .dice-outer-container .advantage-container.advantage .dice-wrapper .dice {
filter: brightness(0) saturate(100%) invert(18%) sepia(92%) saturate(4133%) hue-rotate(96deg) brightness(104%) contrast(107%);
}
.chat-message.duality .duality-data .duality-line .dice-outer-container .advantage-container.disadvantage .dice-wrapper .dice {
filter: brightness(0) saturate(100%) invert(9%) sepia(78%) saturate(6903%) hue-rotate(11deg) brightness(93%) contrast(117%);
}
.chat-message.duality .duality-data .duality-line .dice-outer-container .duality-modifier {
padding-top: 21px;
color: var(--color-light-1);
text-shadow: 0 0 1px black;
font-size: 16px;
}
.chat-message.duality .duality-result {
display: flex;
flex-direction: column;
align-items: end;
justify-content: center;
gap: 2px;
color: var(--color-light-1);
text-shadow: 0 0 1px black;
font-weight: bold;
background: var(--color-dark-1);
padding: 4px 4px 0 4px;
border-radius: 6px 0 0 0;
}
.chat-message.duality .duality-actions {
display: flex;
justify-content: space-between;
}
.chat-message.duality .duality-actions .duality-action {
color: var(--color-light-1);
text-shadow: 0 0 1px black;
font-weight: bold;
background: var(--color-dark-1);
padding: 4px;
border-radius: 0 6px 0 0;
border-color: black;
min-height: unset;
height: 26px;
}
.chat-message.duality .duality-actions .duality-action:hover {
background: var(--button-hover-background-color);
}
.chat-message.duality .target-section {
margin: 4px 4px;
border: 2px solid;
}
.chat-message.duality .target-section .target-container {
display: flex;
align-items: center;
transition: all 0.2s ease-in-out;
}
.chat-message.duality .target-section .target-container:hover {
filter: drop-shadow(0 0 3px gold);
border-color: gold;
}
.chat-message.duality .target-section .target-container.hit {
background: #008000;
}
.chat-message.duality .target-section .target-container.miss {
background: #ff0000;
}
.chat-message.duality .target-section .target-container img {
flex: 0;
width: 22px;
height: 22px;
margin-left: 8px;
align-self: center;
border-color: transparent;
}
.chat-message.duality .target-section .target-container .target-inner-container {
flex: 1;
display: flex;
justify-content: center;
margin-right: 32px;
font-weight: bold;
font-size: 17px;
}
.chat-message.duality.hope {
background: linear-gradient(0, rgba(165, 42, 42, 0.6) 40px, rgba(0, 0, 0, 0.6));
}
.chat-message.duality.fear {
background: linear-gradient(0, rgba(0, 0, 255, 0.6), rgba(15, 15, 97, 0.6));
}
.chat-message.duality.critical {
background: linear-gradient(0, rgba(128, 0, 128, 0.6), rgba(37, 8, 37, 0.6));
}
.chat-message.duality .dice-roll {
color: var(--color-dark-1);
}
.chat-message.duality .dice-roll .dice-flavor {
color: var(--color-light-1);
.chat-message .duality-modifiers,
.chat-message .duality-result,
.chat-message .dice-title {
display: none;
}
.daggerheart.chat.downtime {
display: flex;
@ -1627,63 +1412,141 @@
text-align: center;
font-weight: bold;
}
.daggerheart.chat.roll .dice-tooltip .dice-rolls.duality {
.daggerheart.chat.roll .dice-tooltip {
/* .dice-rolls.duality {
display: flex;
align-items: center;
.dice-hope-container {
display: flex;
.roll.die:not(:last-of-type) {
margin-right: @fullMargin;
}
}
.modifiers-container {
display: flex;
.modifier-value:not(:last-of-type) {
margin-right: @fullMargin;
}
}
.roll.die {
&.hope {
color: white;
-webkit-text-stroke-color: @hope;
-webkit-text-stroke-width: 1.5px;
font-weight: 400;
&:not(.discarded) {
filter: none;
}
}
&.fear {
color: white;
-webkit-text-stroke-color: @fear;
-webkit-text-stroke-width: 1.5px;
font-weight: 400;
&:not(.discarded) {
filter: none;
}
}
&.disadvantage {
color: white;
-webkit-text-stroke-color: @disadvantage;
-webkit-text-stroke-width: 1.5px;
font-weight: 400;
}
&.advantage {
color: white;
-webkit-text-stroke-color: @advantage;
-webkit-text-stroke-width: 1.5px;
font-weight: 400;
}
//V1.3
// &.advantage {
// filter: drop-shadow(0 -4px 4px gold);
// cursor: pointer;
// }
&.unused {
opacity: 0.3;
}
}
.modifier-value {
text-align: center;
font-weight: bold;
font-size: 16px;
}
}
.attack-roll-advantage-container {
text-align: end;
font-weight: bold;
} */
}
.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll {
display: flex;
align-items: center;
gap: 4px;
margin-bottom: 4px;
}
.daggerheart.chat.roll .dice-tooltip .dice-rolls.duality .dice-hope-container {
.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container {
display: flex;
flex-direction: column;
gap: 2px;
}
.daggerheart.chat.roll .dice-tooltip .dice-rolls.duality .dice-hope-container .roll.die:not(:last-of-type) {
margin-right: 8px;
.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-title {
color: var(--color-light-1);
text-shadow: 0 0 1px black;
}
.daggerheart.chat.roll .dice-tooltip .dice-rolls.duality .modifiers-container {
.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container {
display: flex;
align-items: center;
justify-content: center;
position: relative;
}
.daggerheart.chat.roll .dice-tooltip .dice-rolls.duality .modifiers-container .modifier-value:not(:last-of-type) {
margin-right: 8px;
.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container .dice-wrapper {
height: 24px;
width: 24px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
clip-path: polygon(50% 0%, 80% 10%, 100% 35%, 100% 70%, 80% 90%, 50% 100%, 20% 90%, 0% 70%, 0% 35%, 20% 10%);
}
.daggerheart.chat.roll .dice-tooltip .dice-rolls.duality .roll.die.hope {
color: white;
-webkit-text-stroke-color: #ffe760;
-webkit-text-stroke-width: 1.5px;
font-weight: 400;
.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container .dice-wrapper .dice {
height: 26px;
width: 26px;
max-width: unset;
position: absolute;
}
.daggerheart.chat.roll .dice-tooltip .dice-rolls.duality .roll.die.hope:not(.discarded) {
filter: none;
}
.daggerheart.chat.roll .dice-tooltip .dice-rolls.duality .roll.die.fear {
color: white;
-webkit-text-stroke-color: #0032b1;
-webkit-text-stroke-width: 1.5px;
font-weight: 400;
}
.daggerheart.chat.roll .dice-tooltip .dice-rolls.duality .roll.die.fear:not(.discarded) {
filter: none;
}
.daggerheart.chat.roll .dice-tooltip .dice-rolls.duality .roll.die.disadvantage {
color: white;
-webkit-text-stroke-color: #b30000;
-webkit-text-stroke-width: 1.5px;
font-weight: 400;
}
.daggerheart.chat.roll .dice-tooltip .dice-rolls.duality .roll.die.advantage {
color: white;
-webkit-text-stroke-color: #008000;
-webkit-text-stroke-width: 1.5px;
font-weight: 400;
}
.daggerheart.chat.roll .dice-tooltip .dice-rolls.duality .roll.die.unused {
opacity: 0.3;
}
.daggerheart.chat.roll .dice-tooltip .dice-rolls.duality .modifier-value {
text-align: center;
.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container .dice-value {
position: absolute;
font-weight: bold;
font-size: 16px;
}
.daggerheart.chat.roll .dice-tooltip .attack-roll-advantage-container {
text-align: end;
font-weight: bold;
.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container.hope .dice-wrapper {
background: black;
}
.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container.hope .dice-wrapper .dice {
filter: brightness(0) saturate(100%) invert(79%) sepia(79%) saturate(333%) hue-rotate(352deg) brightness(102%) contrast(103%);
}
.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container.hope .dice-value {
color: var(--color-dark-1);
text-shadow: 0 0 4px white;
}
.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container.fear .dice-wrapper {
background: white;
}
.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container.fear .dice-wrapper .dice {
filter: brightness(0) saturate(100%) invert(12%) sepia(88%) saturate(4321%) hue-rotate(221deg) brightness(92%) contrast(110%);
}
.daggerheart.chat.roll .dice-tooltip .dice-rolls > .roll .dice-container .dice-inner-container.fear .dice-value {
color: var(--color-light-1);
text-shadow: 0 0 4px black;
}
.daggerheart.chat.roll .dice-total.duality.hope {
border-color: #ffe760;
@ -1810,6 +1673,137 @@
.daggerheart.chat.domain-card img {
width: 80px;
}
.theme-colorfull .chat-message.duality {
border-color: black;
padding: 8px 0 0 0;
}
.theme-colorfull .chat-message.duality .message-header {
color: var(--color-light-3);
padding: 0 8px;
}
.theme-colorfull .chat-message.duality.hope {
background: linear-gradient(0, rgba(165, 42, 42, 0.6) 40px, rgba(0, 0, 0, 0.6));
}
.theme-colorfull .chat-message.duality.fear {
background: linear-gradient(0, rgba(0, 0, 255, 0.6), rgba(15, 15, 97, 0.6));
}
.theme-colorfull .chat-message.duality.critical {
background: linear-gradient(0, rgba(128, 0, 128, 0.6), rgba(37, 8, 37, 0.6));
}
.theme-colorfull .chat-message.duality .chat-message header {
color: var(--color-light-3);
}
.theme-colorfull .chat-message.duality > * {
padding: 0 8px;
}
.theme-colorfull .chat-message.duality .message-content .duality-modifiers,
.theme-colorfull .chat-message.duality .message-content .duality-result,
.theme-colorfull .chat-message.duality .message-content .dice-title {
display: flex;
}
.theme-colorfull .chat-message.duality .message-content .duality-modifiers {
display: flex;
gap: 2px;
margin-bottom: 4px;
}
.theme-colorfull .chat-message.duality .message-content .duality-modifiers .duality-modifier {
padding: 2px;
border-radius: 6px;
border: 1px solid;
background: var(--color-dark-6);
font-size: 12px;
}
.theme-colorfull .chat-message.duality .message-content .dice-flavor {
color: var(--color-light-1);
text-shadow: 0 0 1px black;
border-bottom: 1px solid;
display: flex;
align-items: end;
justify-content: space-between;
padding: 0 8px;
margin: 0 -8px 2px;
font-weight: unset;
}
.theme-colorfull .chat-message.duality .message-content .dice-result .duality-modifiers {
display: flex;
gap: 2px;
margin-bottom: 4px;
}
.theme-colorfull .chat-message.duality .message-content .dice-result .duality-modifiers .duality-modifier {
padding: 2px;
border-radius: 6px;
border: 1px solid;
background: var(--color-dark-6);
font-size: 12px;
}
.theme-colorfull .chat-message.duality .message-content .dice-result .dice-formula,
.theme-colorfull .chat-message.duality .message-content .dice-result > .dice-total,
.theme-colorfull .chat-message.duality .message-content .dice-result .part-header {
display: none;
}
.theme-colorfull .chat-message.duality .message-content .dice-result .dice-tooltip {
grid-template-rows: 1fr;
}
.theme-colorfull .chat-message.duality .message-content .dice-result .dice-tooltip .wrapper .tooltip-part {
display: flex;
align-items: end;
gap: 0.25rem;
}
.theme-colorfull .chat-message.duality .message-content .dice-result .dice-tooltip .wrapper .tooltip-part .dice .dice-rolls {
display: flex;
gap: 0.25rem;
margin-bottom: 0;
}
.theme-colorfull .chat-message.duality .message-content .dice-result .dice-tooltip .wrapper .tooltip-part .dice .dice-rolls li {
display: flex;
align-items: center;
justify-content: center;
position: relative;
background: unset;
line-height: unset;
font-weight: unset;
}
.theme-colorfull .chat-message.duality .message-content .dice-result .target-section {
margin: 4px 0;
border: 2px solid;
margin-top: 5px;
}
.theme-colorfull .chat-message.duality .message-content .dice-result .target-section .dice-total {
box-shadow: unset;
border: unset;
border-radius: unset;
font-size: var(--font-size-18);
}
.theme-colorfull .chat-message.duality .message-content .dice-result .dice-actions {
justify-content: space-between;
}
.theme-colorfull .chat-message.duality .message-content .dice-result .dice-actions .duality-action {
color: var(--color-light-1);
text-shadow: 0 0 1px black;
font-weight: bold;
background: var(--color-dark-1);
padding: 4px;
border-radius: 0 6px 0 0;
border-color: black;
min-height: unset;
height: 26px;
margin-left: -8px;
flex: unset;
}
.theme-colorfull .chat-message.duality .message-content .dice-result .duality-result {
display: flex;
flex-direction: column;
align-items: end;
justify-content: center;
gap: 2px;
color: var(--color-light-1);
text-shadow: 0 0 1px black;
font-weight: bold;
background: var(--color-dark-1);
padding: 4px 4px 0 4px;
border-radius: 6px 0 0 0;
margin-right: -8px;
}
.daggerheart.sheet.feature .editable {
display: flex;
flex-direction: column;

View file

@ -1,4 +1,4 @@
{{#if colorful}}
{{!-- {{#if colorful}}
<div class="daggerheart chat roll" data-action="expandRoll">
<div class="duality-data">
<div class="duality-title">
@ -66,18 +66,47 @@
{{/if}}
</div>
</div>
{{#if (gt targets.length 0)}}
<div class="target-section">
{{#each targets as |target|}}
<div class="target-container {{#if target.hit}}hit{{else}}{{#if (not ../total.alternate)}}miss{{/if}}{{/if}}" data-token="{{target.id}}">
<img src="{{target.img}}" />
<div class="target-inner-container">
{{#if target.hit}}{{localize "Hit"}}{{else}}{{#if (not ../total.alternate)}}{{localize "Miss"}}{{else}}?{{/if}}{{/if}}
</div>
</div>
{{/each}}
</div>
{{/if}}
{{#if damage.value}}
<div class="duality-actions">
<div></div>
<button class="duality-action" data-value="{{roll.total}}" data-damage="{{damage.value}}" data-damage-type="{{damage.type}}" {{#if damage.disabled}}disabled{{/if}}><span>Roll Damage</span></button>
<div class="duality-result">
<div>{{#if (eq dualityResult 1)}}With Hope{{else}}{{#if (eq dualityResult 2)}}With Fear{{else}}Critical Success{{/if}}{{/if}}</div>
<div>{{roll.total}} {{#if (eq dualityResult 1)}}With Hope{{else}}{{#if (eq dualityResult 2)}}With Fear{{else}}Critical Success{{/if}}{{/if}}</div>
</div>
</div>
{{/if}}
</div>
{{else}}
{{else}} --}}
<div class="dice-roll daggerheart chat roll" data-action="expandRoll">
<div class="dice-flavor">{{title}}</div>
<div class="duality-modifiers">
{{#each modifiers}}
<div class="duality-modifier">
{{label}}
</div>
{{/each}}
{{#if advantageState}}
<div class="duality-modifier">
{{localize "DAGGERHEART.General.Advantage.Full"}}
</div>
{{/if}}
{{#if (eq advantageState false)}}
<div class="duality-modifier">
{{localize "DAGGERHEART.General.Disadvantage.Full"}}
</div>
{{/if}}
</div>
<div class="dice-result">
<div class="dice-formula">{{roll.formula}}</div>
<div class="dice-tooltip">
@ -94,12 +123,32 @@
</header>
<div class="flexrow">
<ol class="dice-rolls duality">
<li class="roll die {{hope.dice}} {{#if hope.discarded}}discarded{{/if}} hope min" title="{{localize "DAGGERHEART.General.Hope"}}">{{hope.value}}</li>
<li class="roll die {{fear.dice}} {{#if fear.discarded}}discarded{{/if}} fear min" title="{{localize "DAGGERHEART.General.Fear"}}">{{fear.value}}</li>
<li class="roll die {{hope.dice}} {{#if hope.discarded}}discarded{{/if}} hope min" title="{{localize "DAGGERHEART.General.Hope"}}">
<div class="dice-container">
<div class="dice-title">{{localize "DAGGERHEART.General.Hope"}}</div>
<div class="dice-inner-container hope" title="{{localize "DAGGERHEART.General.Hope"}}">
<div class="dice-wrapper">
<img class="dice" src="../icons/svg/d12-grey.svg"/>
</div>
<div class="dice-value">{{hope.value}}</div>
</div>
</div>
</li>
<li class="roll die {{fear.dice}} {{#if fear.discarded}}discarded{{/if}} fear min" title="{{localize "DAGGERHEART.General.Fear"}}">
<div class="dice-container">
<div class="dice-title">{{localize "DAGGERHEART.General.Fear"}}</div>
<div class="dice-inner-container fear" title="{{localize "DAGGERHEART.General.Fear"}}">
<div class="dice-wrapper">
<img class="dice" src="../icons/svg/d12-grey.svg"/>
</div>
<div class="dice-value">{{fear.value}}</div>
</div>
</div>
</li>
</ol>
</div>
</div>
{{#if (eq advantageState 1)}}
{{#if advantageState}}
<div class="dice">
<header class="part-header flexrow">
<span class="part-formula">
@ -109,12 +158,21 @@
</header>
<div class="flexrow">
<ol class="dice-rolls">
<li class="roll die {{advantage.dice}} hope min">{{advantage.value}}</li>
<li class="roll die {{advantage.dice}} hope min">
<div class="dice-container advantage">
<div class="dice-inner-container">
<div class="dice-wrapper">
<img class="dice" src="../icons/svg/d6-grey.svg"/>
</div>
<div class="dice-value">{{advantage.value}}</div>
</div>
</div>
</li>
</ol>
</div>
</div>
{{/if}}
{{#if (eq advantageState 2)}}
{{#if (eq advantageState false)}}
<div class="dice">
<header class="part-header flexrow">
<span class="part-formula">
@ -124,11 +182,19 @@
</header>
<div class="flexrow">
<ol class="dice-rolls">
<li class="roll die {{advantage.dice}} hope min">{{advantage.value}}</li>
<li class="roll die {{advantage.dice}} hope min">
<div class="advantage-container disadvantage">
<div class="dice-wrapper">
<img class="dice" src="../icons/svg/d6-grey.svg"/>
<div class="dice-value">{{advantage.value}}</div>
</div>
</div>
</li>
</ol>
</div>
</div>
{{/if}}
{{#if modifierTotal.value}}<div class="duality-modifier">{{modifierTotal.label}}</div>{{/if}}
</section>
</div>
</div>
@ -138,6 +204,26 @@
{{roll.total}}
</div>
</div>
{{#if (gt targets.length 0)}}
<div class="target-section">
{{#each targets as |target|}}
<div class="dice-total target-container {{#if target.hit}}hit{{else}}{{#if (not ../total.alternate)}}miss{{/if}}{{/if}}" data-token="{{target.id}}">
<img src="{{target.img}}" />
<div class="target-inner-container">
{{#if target.hit}}{{localize "Hit"}}{{else}}{{#if (not ../total.alternate)}}{{localize "Miss"}}{{else}}?{{/if}}{{/if}}
</div>
</div>
{{/each}}
</div>
{{/if}}
{{#if damage.value}}
<div class="dice-actions">
<button class="duality-action" data-value="{{roll.total}}" data-damage="{{damage.value}}" data-damage-type="{{damage.type}}" {{#if damage.disabled}}disabled{{/if}}><span>{{localize "DAGGERHEART.Chat.AttackRoll.RollDamage"}}</span></button>
<div class="duality-result">
<div>{{roll.total}} {{#if (eq dualityResult 1)}}With Hope{{else}}{{#if (eq dualityResult 2)}}With Fear{{else}}Critical Success{{/if}}{{/if}}</div>
</div>
</div>
{{/if}}
</div>
</div>
{{/if}}
{{!-- {{/if}} --}}

View file

@ -91,7 +91,7 @@
<div class="dice-roll daggerheart chat roll" data-action="expandRoll">
<div class="dice-flavor">{{localize "DAGGERHEART.Chat.AttackRoll.Title" attack=title}}</div>
<div class="dice-result">
<div class="dice-formula">{{roll}}</div>
<div class="dice-formula">{{roll.formula}}</div>
<div class="dice-tooltip">
<div class="wrapper">

View file

@ -0,0 +1,143 @@
{{#if colorful}}
<div class="daggerheart chat roll" data-action="expandRoll">
<div class="duality-data">
<div class="duality-title">
<div>{{title}}</div>
</div>
<div class="duality-modifiers">
{{#each modifiers}}
<div class="duality-modifier">
{{label}}
</div>
{{/each}}
{{#if advantageState}}
<div class="duality-modifier">
{{localize "DAGGERHEART.General.Advantage.Full"}}
</div>
{{/if}}
{{#if (eq advantageState false)}}
<div class="duality-modifier">
{{localize "DAGGERHEART.General.Disadvantage.Full"}}
</div>
{{/if}}
</div>
<div class="duality-line {{#if (not damage.value)}}simple{{/if}}">
<div class="dice-outer-container">
<div class="dice-container">
<div class="dice-title">{{localize "DAGGERHEART.General.Hope"}}</div>
<div class="dice-inner-container hope" title="{{localize "DAGGERHEART.General.Hope"}}">
<div class="dice-wrapper">
<img class="dice" src="../icons/svg/d12-grey.svg"/>
</div>
<div class="dice-value">{{hope.value}}</div>
</div>
</div>
<div class="dice-container">
<div class="dice-title">{{localize "DAGGERHEART.General.Fear"}}</div>
<div class="dice-inner-container fear" title="{{localize "DAGGERHEART.General.Fear"}}">
<div class="dice-wrapper">
<img class="dice" src="../icons/svg/d12-grey.svg"/>
</div>
<div class="dice-value">{{fear.value}}</div>
</div>
</div>
{{#if advantageState}}
<div class="advantage-container advantage">
<div class="dice-wrapper">
<img class="dice" src="../icons/svg/d6-grey.svg"/>
<div class="dice-value">{{advantage.value}}</div>
</div>
</div>
{{/if}}
{{#if (eq advantageState false)}}
<div class="advantage-container disadvantage">
<div class="dice-wrapper">
<img class="dice" src="../icons/svg/d6-grey.svg"/>
<div class="dice-value">{{advantage.value}}</div>
</div>
</div>
{{/if}}
{{#if modifierTotal.value}}<div class="duality-modifier">{{modifierTotal.label}}</div>{{/if}}
</div>
{{#if (not damage.value)}}
<div class="duality-result">
<div>{{roll.total}} {{#if (eq dualityResult 1)}}With Hope{{else}}{{#if (eq dualityResult 2)}}With Fear{{else}}Critical Success{{/if}}{{/if}}</div>
</div>
{{/if}}
</div>
</div>
{{#if damage.value}}
<div class="duality-actions">
<div></div>
<div class="duality-result">
<div>{{#if (eq dualityResult 1)}}With Hope{{else}}{{#if (eq dualityResult 2)}}With Fear{{else}}Critical Success{{/if}}{{/if}}</div>
</div>
</div>
{{/if}}
</div>
{{else}}
<div class="dice-roll daggerheart chat roll" data-action="expandRoll">
<div class="dice-flavor">{{title}}</div>
<div class="dice-result">
<div class="dice-formula">{{roll.formula}}</div>
<div class="dice-tooltip">
<div class="wrapper">
<section class="tooltip-part">
<div class="dice">
<header class="part-header flexrow">
<span class="part-formula">
<span>1{{hope.dice}}</span>
|
<span>1{{fear.dice}}</span>
</span>
<span class="part-total">{{diceTotal}}</span>
</header>
<div class="flexrow">
<ol class="dice-rolls duality">
<li class="roll die {{hope.dice}} {{#if hope.discarded}}discarded{{/if}} hope min" title="{{localize "DAGGERHEART.General.Hope"}}">{{hope.value}}</li>
<li class="roll die {{fear.dice}} {{#if fear.discarded}}discarded{{/if}} fear min" title="{{localize "DAGGERHEART.General.Fear"}}">{{fear.value}}</li>
</ol>
</div>
</div>
{{#if (eq advantageState 1)}}
<div class="dice">
<header class="part-header flexrow">
<span class="part-formula">
<span>1{{advantage.dice}}</span>
</span>
<span class="part-total">{{advantage.value}}</span>
</header>
<div class="flexrow">
<ol class="dice-rolls">
<li class="roll die {{advantage.dice}} hope min">{{advantage.value}}</li>
</ol>
</div>
</div>
{{/if}}
{{#if (eq advantageState 2)}}
<div class="dice">
<header class="part-header flexrow">
<span class="part-formula">
<span>1{{advantage.dice}}</span>
</span>
<span class="part-total">{{advantage.value}}</span>
</header>
<div class="flexrow">
<ol class="dice-rolls">
<li class="roll die {{advantage.dice}} hope min">{{advantage.value}}</li>
</ol>
</div>
</div>
{{/if}}
</section>
</div>
</div>
<div class="dice-total duality {{#if fear.discarded}}hope{{else}}{{#if hope.discarded}}fear{{else}}critical{{/if}}{{/if}}">
<div class="dice-total-label">{{totalLabel}}</div>
<div class="dice-total-value">
{{roll.total}}
</div>
</div>
</div>
</div>
{{/if}}