mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-01-17 23:49:02 +01:00
Good for now
This commit is contained in:
parent
53ba65df07
commit
b7cb97c323
15 changed files with 167 additions and 476 deletions
|
|
@ -108,17 +108,15 @@ export default class AdversarySheet extends DHBaseActorSheet {
|
||||||
*/
|
*/
|
||||||
static #reactionRoll(event) {
|
static #reactionRoll(event) {
|
||||||
const config = {
|
const config = {
|
||||||
event: event,
|
event,
|
||||||
title: `Reaction Roll: ${this.actor.name}`,
|
title: `Reaction Roll: ${this.actor.name}`,
|
||||||
headerTitle: 'Adversary Reaction Roll',
|
headerTitle: 'Adversary Reaction Roll',
|
||||||
roll: {
|
roll: {
|
||||||
type: 'reaction'
|
type: 'reaction'
|
||||||
},
|
},
|
||||||
chatMessage: {
|
type: 'trait',
|
||||||
type: 'adversaryRoll',
|
hasRoll: true,
|
||||||
template: 'systems/daggerheart/templates/ui/chat/adversary-roll.hbs',
|
data: this.actor.getRollData()
|
||||||
mute: true
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
this.actor.diceRoll(config);
|
this.actor.diceRoll(config);
|
||||||
|
|
|
||||||
|
|
@ -61,43 +61,5 @@ export default class DHDamageAction extends DHBaseAction {
|
||||||
}
|
}
|
||||||
|
|
||||||
return CONFIG.Dice.daggerheart.DamageRoll.build(config);
|
return CONFIG.Dice.daggerheart.DamageRoll.build(config);
|
||||||
|
|
||||||
/* const systemData = data.system ?? data;
|
|
||||||
|
|
||||||
let formulas = this.damage.parts.map(p => ({
|
|
||||||
formula: this.getFormulaValue(p, data).getFormula(this.actor),
|
|
||||||
damageTypes: p.applyTo === 'hitPoints' && !p.type.size ? new Set(['physical']) : p.type,
|
|
||||||
applyTo: p.applyTo
|
|
||||||
}));
|
|
||||||
|
|
||||||
if (!formulas.length) return;
|
|
||||||
|
|
||||||
formulas = this.formatFormulas(formulas, systemData);
|
|
||||||
|
|
||||||
const config = {
|
|
||||||
title: game.i18n.format(`DAGGERHEART.UI.Chat.${this.type === 'healing' ? 'healing' : 'damage'}Roll.title`, {
|
|
||||||
damage: game.i18n.localize(this.name)
|
|
||||||
}),
|
|
||||||
roll: formulas,
|
|
||||||
targets: systemData.targets?.filter(t => t.hit) ?? data.targets,
|
|
||||||
hasSave: this.hasSave,
|
|
||||||
isCritical: systemData.roll?.isCritical ?? false,
|
|
||||||
isHealing: this.type === 'healing',
|
|
||||||
hasDamage: this.type !== 'healing',
|
|
||||||
hasHealing: this.type === 'healing',
|
|
||||||
hasTarget: true,
|
|
||||||
source: systemData.source,
|
|
||||||
data: this.getRollData(),
|
|
||||||
event
|
|
||||||
};
|
|
||||||
if (this.hasSave) config.onSave = this.save.damageMod;
|
|
||||||
if (data.system) {
|
|
||||||
config.source.message = data._id;
|
|
||||||
config.directDamage = false;
|
|
||||||
} else {
|
|
||||||
config.directDamage = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return CONFIG.Dice.daggerheart.DamageRoll.build(config); */
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,11 @@
|
||||||
import DHAbilityUse from "./abilityUse.mjs";
|
import DHAbilityUse from "./abilityUse.mjs";
|
||||||
import DHAdversaryRoll from "./adversaryRoll.mjs";
|
import DHActorRoll from "./adversaryRoll.mjs";
|
||||||
import DHDamageRoll from "./damageRoll.mjs";
|
|
||||||
import DHDualityRoll from "./dualityRoll.mjs";
|
|
||||||
import DHApplyEffect from './applyEffects.mjs'
|
import DHApplyEffect from './applyEffects.mjs'
|
||||||
|
|
||||||
export {
|
|
||||||
DHAbilityUse,
|
|
||||||
DHAdversaryRoll,
|
|
||||||
DHDamageRoll,
|
|
||||||
DHDualityRoll,
|
|
||||||
DHApplyEffect
|
|
||||||
}
|
|
||||||
|
|
||||||
export const config = {
|
export const config = {
|
||||||
abilityUse: DHAbilityUse,
|
abilityUse: DHAbilityUse,
|
||||||
adversaryRoll: DHAdversaryRoll,
|
adversaryRoll: DHActorRoll,
|
||||||
damageRoll: DHDamageRoll,
|
damageRoll: DHActorRoll,
|
||||||
dualityRoll: DHDualityRoll,
|
dualityRoll: DHActorRoll,
|
||||||
applyEffect: DHApplyEffect
|
applyEffect: DHApplyEffect
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
const fields = foundry.data.fields;
|
const fields = foundry.data.fields;
|
||||||
|
|
||||||
export default class DHAdversaryRoll extends foundry.abstract.TypeDataModel {
|
export default class DHActorRoll extends foundry.abstract.TypeDataModel {
|
||||||
static defineSchema() {
|
static defineSchema() {
|
||||||
return {
|
return {
|
||||||
title: new fields.StringField(),
|
title: new fields.StringField(),
|
||||||
|
|
@ -27,13 +27,17 @@ export default class DHAdversaryRoll extends foundry.abstract.TypeDataModel {
|
||||||
hasEffect: new fields.BooleanField({ initial: false }),
|
hasEffect: new fields.BooleanField({ initial: false }),
|
||||||
hasSave: new fields.BooleanField({ initial: false }),
|
hasSave: new fields.BooleanField({ initial: false }),
|
||||||
hasTarget: new fields.BooleanField({ initial: false }),
|
hasTarget: new fields.BooleanField({ initial: false }),
|
||||||
|
isCritical: new fields.BooleanField({ initial: false }),
|
||||||
onSave: new fields.StringField(),
|
onSave: new fields.StringField(),
|
||||||
source: new fields.SchemaField({
|
source: new fields.SchemaField({
|
||||||
actor: new fields.StringField(),
|
actor: new fields.StringField(),
|
||||||
item: new fields.StringField(),
|
item: new fields.StringField(),
|
||||||
action: new fields.StringField()
|
action: new fields.StringField()
|
||||||
}),
|
}),
|
||||||
damage: new fields.ObjectField()
|
damage: new fields.ObjectField(),
|
||||||
|
costs: new fields.ArrayField(
|
||||||
|
new fields.ObjectField()
|
||||||
|
)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,65 +0,0 @@
|
||||||
export default class DHDamageRoll extends foundry.abstract.TypeDataModel {
|
|
||||||
static defineSchema() {
|
|
||||||
const fields = foundry.data.fields;
|
|
||||||
|
|
||||||
return {
|
|
||||||
messageType: new fields.StringField({ initial: 'damage' }),
|
|
||||||
title: new fields.StringField(),
|
|
||||||
roll: new fields.DataField({}),
|
|
||||||
targets: new fields.ArrayField(
|
|
||||||
new fields.SchemaField({
|
|
||||||
id: new fields.StringField({ required: true }),
|
|
||||||
actorId: new fields.StringField({}),
|
|
||||||
name: new fields.StringField(),
|
|
||||||
img: new fields.StringField(),
|
|
||||||
hit: new fields.BooleanField({ initial: false }),
|
|
||||||
saved: new fields.SchemaField({
|
|
||||||
result: new fields.NumberField(),
|
|
||||||
success: new fields.BooleanField({ nullable: true, initial: null })
|
|
||||||
})
|
|
||||||
})
|
|
||||||
),
|
|
||||||
targetSelection: new fields.BooleanField({ initial: false }),
|
|
||||||
hasSave: new fields.BooleanField({ initial: false }),
|
|
||||||
isHealing: new fields.BooleanField({ initial: false }),
|
|
||||||
onSave: new fields.StringField(),
|
|
||||||
source: new fields.SchemaField({
|
|
||||||
actor: new fields.StringField(),
|
|
||||||
item: new fields.StringField(),
|
|
||||||
action: new fields.StringField(),
|
|
||||||
message: new fields.StringField()
|
|
||||||
}),
|
|
||||||
directDamage: new fields.BooleanField({ initial: true }),
|
|
||||||
damage: new fields.ObjectField(),
|
|
||||||
hasRoll: new fields.BooleanField({ initial: false }),
|
|
||||||
hasDamage: new fields.BooleanField({ initial: false }),
|
|
||||||
hasHealing: new fields.BooleanField({ initial: false }),
|
|
||||||
hasEffect: new fields.BooleanField({ initial: false })
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
get messageTemplate() {
|
|
||||||
return `systems/daggerheart/templates/ui/chat/roll.hbs`;
|
|
||||||
// return `systems/daggerheart/templates/ui/chat/${this.messageType}-roll.hbs`;
|
|
||||||
}
|
|
||||||
|
|
||||||
prepareDerivedData() {
|
|
||||||
this.hasHitTarget = this.targets.filter(t => t.hit === true).length > 0;
|
|
||||||
this.currentTargets =
|
|
||||||
this.targetSelection !== true
|
|
||||||
? Array.from(game.user.targets).map(t =>
|
|
||||||
game.system.api.fields.ActionFields.TargetField.formatTarget(t)
|
|
||||||
)
|
|
||||||
: this.targets;
|
|
||||||
if(this.targetSelection === true) {
|
|
||||||
this.targetShort = this.targets.reduce((a,c) => {
|
|
||||||
if(c.hit) a.hit += 1;
|
|
||||||
else c.miss += 1;
|
|
||||||
return a;
|
|
||||||
}, {hit: 0, miss: 0})
|
|
||||||
}
|
|
||||||
this.pendingSaves = this.targets.filter(
|
|
||||||
target => target.hit && target.saved.success === null
|
|
||||||
).length > 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
import DHAdversaryRoll from './adversaryRoll.mjs';
|
|
||||||
|
|
||||||
export default class DHDualityRoll extends DHAdversaryRoll {
|
|
||||||
get messageTemplate() {
|
|
||||||
return 'systems/daggerheart/templates/ui/chat/roll.hbs';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -13,8 +13,6 @@ export default class D20Roll extends DHRoll {
|
||||||
DISADVANTAGE: -1
|
DISADVANTAGE: -1
|
||||||
};
|
};
|
||||||
|
|
||||||
static messageType = 'adversaryRoll';
|
|
||||||
|
|
||||||
static CRITICAL_TRESHOLD = 20;
|
static CRITICAL_TRESHOLD = 20;
|
||||||
|
|
||||||
static DefaultDialog = D20RollDialog;
|
static DefaultDialog = D20RollDialog;
|
||||||
|
|
@ -153,7 +151,6 @@ export default class D20Roll extends DHRoll {
|
||||||
data.difficulty = config.roll.difficulty;
|
data.difficulty = config.roll.difficulty;
|
||||||
data.success = roll.isCritical || roll.total >= config.roll.difficulty;
|
data.success = roll.isCritical || roll.total >= config.roll.difficulty;
|
||||||
}
|
}
|
||||||
data.type = config.roll.type;
|
|
||||||
data.advantage = {
|
data.advantage = {
|
||||||
type: config.roll.advantage,
|
type: config.roll.advantage,
|
||||||
dice: roll.dAdvantage?.denomination,
|
dice: roll.dAdvantage?.denomination,
|
||||||
|
|
@ -167,7 +164,7 @@ export default class D20Roll extends DHRoll {
|
||||||
rerolls: dice.results.filter(x => x.rerolled)
|
rerolls: dice.results.filter(x => x.rerolled)
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
data.isCritical = roll.isCritical;
|
data.isCritical = config.isCritical = roll.isCritical;
|
||||||
data.extra = roll.dice
|
data.extra = roll.dice
|
||||||
.filter(d => !roll.baseTerms.includes(d))
|
.filter(d => !roll.baseTerms.includes(d))
|
||||||
.map(d => {
|
.map(d => {
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,6 @@ export default class DamageRoll extends DHRoll {
|
||||||
super(formula, data, options);
|
super(formula, data, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
static messageType = 'dualityRoll';
|
|
||||||
|
|
||||||
static DefaultDialog = DamageDialog;
|
static DefaultDialog = DamageDialog;
|
||||||
|
|
||||||
static async buildEvaluate(roll, config = {}, message = {}) {
|
static async buildEvaluate(roll, config = {}, message = {}) {
|
||||||
|
|
|
||||||
|
|
@ -92,11 +92,8 @@ export default class DHRoll extends Roll {
|
||||||
system: config,
|
system: config,
|
||||||
rolls: [roll]
|
rolls: [roll]
|
||||||
};
|
};
|
||||||
// msg.applyRollMode(config.selectedRollMode);
|
|
||||||
// return msg;
|
|
||||||
if(roll._evaluated) return await cls.create(msg, { rollMode: config.selectedRollMode });
|
if(roll._evaluated) return await cls.create(msg, { rollMode: config.selectedRollMode });
|
||||||
return msg;
|
return msg;
|
||||||
// return await cls.create(msg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static applyKeybindings(config) {
|
static applyKeybindings(config) {
|
||||||
|
|
|
||||||
|
|
@ -26,8 +26,6 @@ export const preloadHandlebarsTemplates = async function () {
|
||||||
'systems/daggerheart/templates/actionTypes/effect.hbs',
|
'systems/daggerheart/templates/actionTypes/effect.hbs',
|
||||||
'systems/daggerheart/templates/actionTypes/beastform.hbs',
|
'systems/daggerheart/templates/actionTypes/beastform.hbs',
|
||||||
'systems/daggerheart/templates/settings/components/settings-item-line.hbs',
|
'systems/daggerheart/templates/settings/components/settings-item-line.hbs',
|
||||||
'systems/daggerheart/templates/ui/chat/parts/damage-chat.hbs',
|
|
||||||
'systems/daggerheart/templates/ui/chat/parts/target-chat.hbs',
|
|
||||||
'systems/daggerheart/templates/ui/tooltip/parts/tooltipChips.hbs',
|
'systems/daggerheart/templates/ui/tooltip/parts/tooltipChips.hbs',
|
||||||
'systems/daggerheart/templates/ui/tooltip/parts/tooltipTags.hbs',
|
'systems/daggerheart/templates/ui/tooltip/parts/tooltipTags.hbs',
|
||||||
'systems/daggerheart/templates/dialogs/downtime/activities.hbs',
|
'systems/daggerheart/templates/dialogs/downtime/activities.hbs',
|
||||||
|
|
|
||||||
|
|
@ -364,7 +364,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.daggerheart {
|
.daggerheart, #chat-notifications {
|
||||||
.chat-message {
|
.chat-message {
|
||||||
--text-color: light-dark(@dark-blue, @golden);
|
--text-color: light-dark(@dark-blue, @golden);
|
||||||
--bg-color: light-dark(@dark-blue-40, @golden-40);
|
--bg-color: light-dark(@dark-blue-40, @golden-40);
|
||||||
|
|
@ -489,186 +489,184 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.roll-dice {
|
.roll-dice {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 5px;
|
||||||
|
font-weight: 700;
|
||||||
|
font-family: 'Cinzel', sans-serif;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
.roll-die {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 3px;
|
||||||
|
|
||||||
|
label {
|
||||||
|
text-align: center;
|
||||||
|
height: var(--font-size-12);
|
||||||
|
}
|
||||||
|
|
||||||
|
> div {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
gap: 5px;
|
gap: 5px;
|
||||||
font-weight: 700;
|
// font-size: var(--font-size-20);
|
||||||
font-family: 'Cinzel', sans-serif;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
|
|
||||||
.roll-die {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 3px;
|
|
||||||
|
|
||||||
label {
|
|
||||||
text-align: center;
|
|
||||||
height: var(--font-size-12);
|
|
||||||
}
|
|
||||||
|
|
||||||
> div {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
gap: 5px;
|
|
||||||
// font-size: var(--font-size-20);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fieldset {
|
fieldset {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
// gap: 10px;
|
// gap: 10px;
|
||||||
border-color: var(--text-color);
|
border-color: var(--text-color);
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
|
|
||||||
legend {
|
legend {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 10px;
|
gap: 10px;
|
||||||
padding: 0 5px;
|
padding: 0 5px;
|
||||||
color: var(--text-color);
|
color: var(--text-color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.target-selector {
|
.target-selector {
|
||||||
+ .roll-part-extra {
|
+ .roll-part-extra {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.target-choice {
|
.target-choice {
|
||||||
display: flex;
|
display: flex;
|
||||||
font-size: var(--font-size-14);
|
font-size: var(--font-size-14);
|
||||||
color: var(--text-color);
|
color: var(--text-color);
|
||||||
padding: 5px 0;
|
padding: 5px 0;
|
||||||
|
|
||||||
.button-target-selection {
|
.button-target-selection {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button-target-selection:hover, .target-selected {
|
|
||||||
font-weight: bold;
|
|
||||||
text-shadow: 0px 0px 8px var(--text-color);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
i {
|
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.roll-target {
|
.button-target-selection:hover, .target-selected {
|
||||||
|
font-weight: bold;
|
||||||
|
text-shadow: 0px 0px 8px var(--text-color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.roll-target {
|
||||||
|
display: flex;
|
||||||
|
width: 100%;
|
||||||
|
gap: 10px;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
.target-img {
|
||||||
|
border-radius: 50%;
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
.target-data {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.target-save {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 22px;
|
||||||
|
height: 22px;
|
||||||
|
&:hover > i {
|
||||||
|
scale: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
i {
|
||||||
|
&.fa-check {
|
||||||
|
color: @green;
|
||||||
|
}
|
||||||
|
&.fa-xmark {
|
||||||
|
color: @medium-red;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.roll-formula {
|
||||||
|
background-color: var(--bg-color);
|
||||||
|
color: var(--text-color);
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 3px 5px;
|
||||||
|
width: fit-content;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.roll-difficulty, .target-hit-status {
|
||||||
|
color: @green;
|
||||||
|
background-color: @green-10;
|
||||||
|
border: 1px solid currentColor;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 3px 5px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-weight: 600;
|
||||||
|
|
||||||
|
&.is-miss {
|
||||||
|
color: @medium-red;
|
||||||
|
background-color: @medium-red-10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.target-hit-status {
|
||||||
|
width: fit-content;
|
||||||
|
margin-top: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div[data-action="expandRoll"] {
|
||||||
|
.roll-part-header > div > span {
|
||||||
|
&:before, &:after {
|
||||||
|
content: '\f078';
|
||||||
|
font-family: var(--font-awesome);
|
||||||
|
color: var(--text-color);
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.on-reduced {
|
||||||
|
display: grid;
|
||||||
|
overflow: hidden;
|
||||||
|
grid-template-rows: 1fr;
|
||||||
|
transition: grid-template-rows 250ms ease;
|
||||||
|
|
||||||
|
.wrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
width: 100%;
|
|
||||||
gap: 10px;
|
gap: 10px;
|
||||||
align-items: center;
|
overflow: hidden;
|
||||||
|
|
||||||
.target-img {
|
|
||||||
border-radius: 50%;
|
|
||||||
width: 40px;
|
|
||||||
height: 40px;
|
|
||||||
object-fit: cover;
|
|
||||||
}
|
|
||||||
|
|
||||||
.target-data {
|
|
||||||
flex: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.target-save {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
width: 22px;
|
|
||||||
height: 22px;
|
|
||||||
&:hover > i {
|
|
||||||
scale: 1.2;
|
|
||||||
}
|
|
||||||
|
|
||||||
i {
|
|
||||||
&.fa-check {
|
|
||||||
color: @green;
|
|
||||||
}
|
|
||||||
&.fa-xmark {
|
|
||||||
color: @medium-red;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// }
|
|
||||||
|
|
||||||
.roll-formula {
|
|
||||||
background-color: var(--bg-color);
|
|
||||||
color: var(--text-color);
|
|
||||||
border-radius: 4px;
|
|
||||||
padding: 3px 5px;
|
|
||||||
width: fit-content;
|
|
||||||
margin: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.roll-difficulty, .target-hit-status {
|
|
||||||
color: @green;
|
|
||||||
background-color: @green-10;
|
|
||||||
border: 1px solid currentColor;
|
|
||||||
border-radius: 4px;
|
|
||||||
padding: 3px 5px;
|
|
||||||
text-transform: uppercase;
|
|
||||||
font-weight: 600;
|
|
||||||
|
|
||||||
&.is-miss {
|
|
||||||
color: @medium-red;
|
|
||||||
background-color: @medium-red-10;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.target-hit-status {
|
&.expanded {
|
||||||
width: fit-content;
|
|
||||||
margin-top: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
div[data-action="expandRoll"] {
|
|
||||||
.roll-part-header > div > span {
|
.roll-part-header > div > span {
|
||||||
&:before, &:after {
|
&:before, &:after {
|
||||||
content: '\f078';
|
transform: rotate(180deg);
|
||||||
font-family: var(--font-awesome);
|
|
||||||
color: var(--text-color);
|
|
||||||
transition: all 0.3s ease;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.on-reduced {
|
.on-reduced {
|
||||||
display: grid;
|
grid-template-rows: 0fr;
|
||||||
overflow: hidden;
|
|
||||||
grid-template-rows: 1fr;
|
|
||||||
transition: grid-template-rows 250ms ease;
|
|
||||||
|
|
||||||
.wrapper {
|
|
||||||
display: flex;
|
|
||||||
gap: 10px;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.expanded {
|
|
||||||
.roll-part-header > div > span {
|
|
||||||
&:before, &:after {
|
|
||||||
transform: rotate(180deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.on-reduced {
|
|
||||||
grid-template-rows: 0fr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.roll-part + .roll-part {
|
.roll-part + .roll-part {
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
// }
|
|
||||||
|
|
||||||
.target-section {
|
.target-section {
|
||||||
.roll-part-content {
|
.roll-part-content {
|
||||||
|
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
<div class="dice-roll daggerheart chat roll" data-action="expandRoll">
|
|
||||||
<div class="dice-flavor">{{localize "DAGGERHEART.UI.Chat.attackRoll.title" attack=this.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">
|
|
||||||
{{#each dice}}
|
|
||||||
<header class="part-header flexrow">
|
|
||||||
<span class="part-formula">{{number}}{{denomination}}</span>
|
|
||||||
<span class="part-total">{{total}}</span>
|
|
||||||
</header>
|
|
||||||
<div class="flexrow">
|
|
||||||
<ol class="dice-rolls">
|
|
||||||
{{#each results}}
|
|
||||||
<li class="roll die {{../denomination}}{{#if discarded}} discarded{{/if}} min">{{result}}</li>
|
|
||||||
{{/each}}
|
|
||||||
</ol>
|
|
||||||
<div class="attack-roll-advantage-container">{{#if ../advantageState}}{{localize "DAGGERHEART.GENERAL.Advantage.full"}}{{/if}}{{#if (eq ../advantageState false)}}{{localize "DAGGERHEART.GENERAL.Disadvantage.full"}}{{/if}}</div>
|
|
||||||
</div>
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="dice-total">
|
|
||||||
<div class="dice-total-value">{{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}}miss{{/if}}" data-token="{{target.id}}">
|
|
||||||
<img src="{{target.img}}" />
|
|
||||||
<div class="target-inner-container">
|
|
||||||
{{#if target.hit}}{{localize "Hit"}}{{else}}{{localize "Miss"}}{{/if}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
{{/if}}
|
|
||||||
<div class="flexrow">
|
|
||||||
<button class="duality-action" data-value="{{roll.total}}"><span>{{localize "DAGGERHEART.GENERAL.rollDamage"}}</span></button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
<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">
|
|
||||||
{{#each roll.dice as | dice index |}}
|
|
||||||
<header class="part-header flexrow">
|
|
||||||
<span class="part-formula">{{formula}}</span>
|
|
||||||
<span class="part-total">{{total}}</span>
|
|
||||||
</header>
|
|
||||||
<div class="flexrow">
|
|
||||||
<ol class="dice-rolls rerollable">
|
|
||||||
{{#if dice.rerolled.any}}
|
|
||||||
<i class="fa-solid fa-dice dice-rerolled" title="{{localize "DAGGERHEART.UI.Tooltip.diceIsRerolled" times=dice.rerolled.rerolls.length}}"></i>
|
|
||||||
{{/if}}
|
|
||||||
<button type="checkbox" class="reroll-button" data-die-index="0" data-tooltip="{{localize "DAGGERHEART.GENERAL.reroll"}}">
|
|
||||||
{{#each results as |result index|}}
|
|
||||||
<li class="roll die {{../dice}}{{#if discarded}} discarded{{/if}} min">{{result.result}}</li>
|
|
||||||
{{/each}}
|
|
||||||
</button>
|
|
||||||
</ol>
|
|
||||||
</div>
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="dice-total">
|
|
||||||
<div class="dice-total-value">{{roll.total}}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<fieldset class="dice-roll daggerheart chat roll expanded{{#unless damage.roll}} hidden{{/unless}}" data-action="expandRoll">
|
|
||||||
<legend class="dice-flavor">{{localize "DAGGERHEART.GENERAL.damage"}}</legend>
|
|
||||||
<div class="dice-result">
|
|
||||||
<div class="dice-tooltip">
|
|
||||||
<div class="wrapper">
|
|
||||||
{{> 'systems/daggerheart/templates/ui/chat/parts/damage-chat.hbs' damage=damage noTitle=true}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</fieldset>
|
|
||||||
{{> 'systems/daggerheart/templates/ui/chat/parts/target-chat.hbs'}}
|
|
||||||
{{#if hasDamage}}
|
|
||||||
<div class="dice-roll daggerheart chat roll">
|
|
||||||
<div class="dice-result">
|
|
||||||
{{#if damage.roll}}
|
|
||||||
<div class="dice-actions">
|
|
||||||
<button class="damage-button">{{localize "DAGGERHEART.UI.Chat.damageRoll.dealDamage"}}</button>
|
|
||||||
</div>
|
|
||||||
{{else}}
|
|
||||||
<div class="flexrow">
|
|
||||||
<button class="duality-action duality-action-damage" data-value="{{roll.total}}"><span>{{localize "DAGGERHEART.UI.Chat.damageRoll.rollDamage"}}</span></button>
|
|
||||||
</div>
|
|
||||||
{{/if}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{{/if}}
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
<div class="dice-roll daggerheart chat roll" data-action="expandRoll">
|
|
||||||
{{#unless noTitle}}<div class="dice-flavor">{{damage.title}}</div>{{/unless}}
|
|
||||||
<div class="dice-result">
|
|
||||||
{{#each damage.roll as | roll index | }}
|
|
||||||
<div class="dice-flavor">{{localize (concat 'DAGGERHEART.CONFIG.HealingType.' index '.name')}}</div>
|
|
||||||
<div class="dice-formula">{{roll.formula}}</div>
|
|
||||||
<div class="dice-tooltip">
|
|
||||||
<div class="wrapper">
|
|
||||||
{{#each roll.parts}}
|
|
||||||
<section class="tooltip-part">
|
|
||||||
<div class="dice">
|
|
||||||
<header class="part-header flexrow">
|
|
||||||
<span class="part-formula">{{formula}}</span>
|
|
||||||
<span class="part-total">{{total}}</span>
|
|
||||||
</header>
|
|
||||||
<ol class="dice-rolls">
|
|
||||||
{{#each dice}}
|
|
||||||
{{#each results}}
|
|
||||||
<li class="roll die {{../dice}} min">{{result}}</li>
|
|
||||||
{{/each}}
|
|
||||||
{{/each}}
|
|
||||||
</ol>
|
|
||||||
</div>
|
|
||||||
{{#if modifierTotal}}<div class="duality-modifier">{{#if (gt modifierTotal 0)}}+{{/if}}{{modifierTotal}}</div>{{/if}}
|
|
||||||
<div class="duality-result">{{localize "DAGGERHEART.GENERAL.total"}}: {{total}}</div>
|
|
||||||
</section>
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="dice-total">{{roll.total}}</div>
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
||||||
{{#if (gt currentTargets.length 0)}}
|
|
||||||
<fieldset class="dice-roll daggerheart chat roll expanded" data-action="expandRoll">
|
|
||||||
<legend class="dice-flavor">{{localize "DAGGERHEART.GENERAL.Target.plural"}}</legend>
|
|
||||||
<div class="dice-result">
|
|
||||||
<div class="dice-tooltip">
|
|
||||||
<div class="wrapper">
|
|
||||||
<div class="target-selection">
|
|
||||||
<label class="button-target-selection{{#if @root.targetSelection}} target-selected{{/if}}" data-target-hit="true">{{localize "DAGGERHEART.UI.Chat.damageRoll.hitTarget"}}</label>
|
|
||||||
<label class="button-target-selection{{#unless @root.targetSelection}} target-selected{{/unless}}">{{localize "DAGGERHEART.UI.Chat.damageRoll.selectedTarget"}}</label>
|
|
||||||
</div>
|
|
||||||
{{#if (and hasSave @root.targetSelection @root.hasHitTarget)}}
|
|
||||||
<button class="inner-button inner-button-right roll-all-save-button">{{localize "DAGGERHEART.GENERAL.rollAll"}} <i class="fa-solid fa-shield"></i></button>
|
|
||||||
{{/if}}
|
|
||||||
<div class="target-section">
|
|
||||||
{{#each currentTargets 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 (or ../directDamage (not @root.targetSelection))}}
|
|
||||||
<div data-perm-id="{{target.actorId}}"><span>{{target.name}}</span></div>
|
|
||||||
{{else}}
|
|
||||||
{{#if target.hit}}{{localize "Hit"}}{{else}}{{#if (not ../total.alternate)}}{{localize "Miss"}}{{else}}?{{/if}}{{/if}}
|
|
||||||
{{/if}}
|
|
||||||
</div>
|
|
||||||
{{#if (and ../hasSave target.hit @root.targetSelection)}}
|
|
||||||
<button class="target-save-container{{#if target.saved.result includeZero=true}} is-rolled{{/if}}" data-perm-id="{{target.actorId}}">
|
|
||||||
<i class="fa-solid {{#if target.saved.result includeZero=true}}{{#if target.saved.success}}fa-check{{else}}fa-xmark{{/if}}{{else}}fa-shield{{/if}}">
|
|
||||||
</i>
|
|
||||||
</button>
|
|
||||||
{{/if}}
|
|
||||||
</div>
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</fieldset>
|
|
||||||
{{/if}}
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue