diff --git a/daggerheart.mjs b/daggerheart.mjs index bf8a9f63..56ad3e3d 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -19,7 +19,6 @@ import { } from './module/systemRegistration/_module.mjs'; import { placeables } from './module/canvas/_module.mjs'; import { registerRollDiceHooks } from './module/dice/dhRoll.mjs'; -import { registerDHActorHooks } from './module/documents/actor.mjs'; import './node_modules/@yaireo/tagify/dist/tagify.css'; Hooks.once('init', () => { @@ -169,7 +168,7 @@ Hooks.on('ready', () => { registerCountdownHooks(); socketRegistration.registerSocketHooks(); registerRollDiceHooks(); - registerDHActorHooks(); + socketRegistration.registerUserQueries(); }); Hooks.once('dicesoniceready', () => {}); diff --git a/lang/en.json b/lang/en.json index a472b40e..40317f8c 100755 --- a/lang/en.json +++ b/lang/en.json @@ -293,6 +293,7 @@ "usedMarks": "Used Marks" }, "DeathMove": { + "selectMove": "Select Move", "takeMove": "Take Death Move", "title": "{actor} - Death Move" }, @@ -452,6 +453,9 @@ "title": "Ownership Selection - {name}", "default": "Default Ownership" }, + "ReactionRoll": { + "title": "Reaction Roll: {trait}" + }, "ResourceDice": { "title": "{name} Resource", "rerollDice": "Reroll Dice" diff --git a/module/applications/dialogs/damageReductionDialog.mjs b/module/applications/dialogs/damageReductionDialog.mjs index 3e3bde44..9049522d 100644 --- a/module/applications/dialogs/damageReductionDialog.mjs +++ b/module/applications/dialogs/damageReductionDialog.mjs @@ -1,6 +1,6 @@ import { damageKeyToNumber, getDamageLabel } from '../../helpers/utils.mjs'; -const { DialogV2, ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api; +const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api; export default class DamageReductionDialog extends HandlebarsApplicationMixin(ApplicationV2) { constructor(resolve, reject, actor, damage, damageType) { @@ -53,10 +53,6 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap ); } - get title() { - return game.i18n.localize('DAGGERHEART.APPLICATIONS.DamageReduction.title'); - } - static DEFAULT_OPTIONS = { tag: 'form', classes: ['daggerheart', 'views', 'damage-reduction'], diff --git a/module/applications/dialogs/deathMove.mjs b/module/applications/dialogs/deathMove.mjs index 735c3c18..093d9680 100644 --- a/module/applications/dialogs/deathMove.mjs +++ b/module/applications/dialogs/deathMove.mjs @@ -13,8 +13,9 @@ export default class DhpDeathMove extends HandlebarsApplicationMixin(Application } static DEFAULT_OPTIONS = { - classes: ['daggerheart', 'views', 'death-move'], - position: { width: 800, height: 'auto' }, + classes: ['daggerheart', 'dh-style', 'dialog', 'views', 'death-move'], + position: { width: 'auto', height: 'auto' }, + window: { icon: 'fa-solid fa-skull' }, actions: { selectMove: this.selectMove, takeMove: this.takeMove @@ -32,6 +33,7 @@ export default class DhpDeathMove extends HandlebarsApplicationMixin(Application const context = await super._prepareContext(_options); context.selectedMove = this.selectedMove; context.options = CONFIG.DH.GENERAL.deathMoves; + context.title = game.i18n.localize('DAGGERHEART.APPLICATIONS.DeathMove.takeMove'); return context; } diff --git a/module/applications/hud/tokenHUD.mjs b/module/applications/hud/tokenHUD.mjs index 572b03f9..5c29260b 100644 --- a/module/applications/hud/tokenHUD.mjs +++ b/module/applications/hud/tokenHUD.mjs @@ -66,12 +66,9 @@ export default class DHTokenHUD extends foundry.applications.hud.TokenHUD { if (!status) continue; if (status._id) { if (status._id !== effect.id) continue; - } else { - if (effect.statuses.size !== 1) continue; } status.isActive = true; if (effect.getFlag('core', 'overlay')) status.isOverlay = true; - break; } } diff --git a/module/applications/sheets-configs/activeEffectConfig.mjs b/module/applications/sheets-configs/activeEffectConfig.mjs index 087b5b08..88edf9d6 100644 --- a/module/applications/sheets-configs/activeEffectConfig.mjs +++ b/module/applications/sheets-configs/activeEffectConfig.mjs @@ -99,7 +99,17 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac async _preparePartContext(partId, context) { const partContext = await super._preparePartContext(partId, context); switch (partId) { - case 'changes': + case 'details': + const useGeneric = game.settings.get( + CONFIG.DH.id, + CONFIG.DH.SETTINGS.gameSettings.appearance + ).showGenericStatusEffects; + if (!useGeneric) { + partContext.statuses = Object.values(CONFIG.DH.GENERAL.conditions).map(status => ({ + value: status.id, + label: game.i18n.localize(status.name) + })); + } break; } diff --git a/module/applications/ui/chatLog.mjs b/module/applications/ui/chatLog.mjs index e0f990ba..5e507a3b 100644 --- a/module/applications/ui/chatLog.mjs +++ b/module/applications/ui/chatLog.mjs @@ -1,3 +1,5 @@ +import { emitAsGM, GMUpdateEvent } from "../../systemRegistration/socket.mjs"; + export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLog { constructor(options) { super(options); @@ -98,17 +100,41 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo if (message.system.source.item && message.system.source.action) { const action = this.getAction(actor, message.system.source.item, message.system.source.action); if (!action || !action?.hasSave) return; - action.rollSave(token, event, message); + action.rollSave(token.actor, event, message).then(result => emitAsGM( + GMUpdateEvent.UpdateSaveMessage, + action.updateSaveMessage.bind(action, result, message, token.id), + { + action: action.uuid, + message: message._id, + token: token.id, + result + } + )); } } - onRollAllSave(event, _message) { + async onRollAllSave(event, message) { event.stopPropagation(); + if(!game.user.isGM) return; const targets = event.target.parentElement.querySelectorAll( '.target-section > [data-token] .target-save-container' ); - targets.forEach(el => { - el.dispatchEvent(new PointerEvent('click', { shiftKey: true })); + const actor = await this.getActor(message.system.source.actor), + action = this.getAction(actor, message.system.source.item, message.system.source.action); + targets.forEach(async el => { + const tokenId = el.closest('[data-token]')?.dataset.token, + token = game.canvas.tokens.get(tokenId); + if(!token.actor) return; + if(game.user === token.actor.owner) + el.dispatchEvent(new PointerEvent('click', { shiftKey: true })); + else { + token.actor.owner.query('reactionRoll', { + actionId: action.uuid, + actorId: token.actor.uuid, + event, + message + }).then(result => action.updateSaveMessage(result, message, token.id)); + } }); } diff --git a/module/canvas/placeables/token.mjs b/module/canvas/placeables/token.mjs index 967df0f8..dd6f089e 100644 --- a/module/canvas/placeables/token.mjs +++ b/module/canvas/placeables/token.mjs @@ -10,8 +10,28 @@ export default class DhTokenPlaceable extends foundry.canvas.placeables.Token { this.effects.overlay = null; // Categorize effects - const activeEffects = this.actor ? Array.from(this.actor.effects).filter(x => !x.disabled) : []; - const overlayEffect = activeEffects.findLast(e => e.img && e.getFlag('core', 'overlay')); + const statusMap = new Map(foundry.CONFIG.statusEffects.map(status => [status.id, status])); + const activeEffects = (this.actor ? this.actor.effects.filter(x => !x.disabled) : []).reduce((acc, effect) => { + acc.push(effect); + + const currentStatusActiveEffects = acc.filter( + x => x.statuses.size === 1 && x.name === game.i18n.localize(statusMap.get(x.statuses.first()).name) + ); + for (var status of effect.statuses) { + if (!currentStatusActiveEffects.find(x => x.statuses.includes(status))) { + const statusData = statusMap.get(status); + acc.push({ + name: game.i18n.localize(statusData.name), + statuses: [status], + img: statusData.icon, + tint: effect.tint + }); + } + } + + return acc; + }, []); + const overlayEffect = activeEffects.findLast(e => e.img && e.getFlag?.('core', 'overlay')); // Draw effects const promises = []; diff --git a/module/config/generalConfig.mjs b/module/config/generalConfig.mjs index 6781dc83..7e44cad7 100644 --- a/module/config/generalConfig.mjs +++ b/module/config/generalConfig.mjs @@ -322,18 +322,21 @@ export const deathMoves = { id: 'avoidDeath', name: 'DAGGERHEART.CONFIG.DeathMoves.avoidDeath.name', img: 'icons/magic/time/hourglass-yellow-green.webp', + icon: 'fa-person-running', description: 'DAGGERHEART.CONFIG.DeathMoves.avoidDeath.description' }, riskItAll: { id: 'riskItAll', name: 'DAGGERHEART.CONFIG.DeathMoves.riskItAll.name', img: 'icons/sundries/gaming/dice-pair-white-green.webp', + icon: 'fa-dice', description: 'DAGGERHEART.CONFIG.DeathMoves.riskItAll.description' }, blazeOfGlory: { id: 'blazeOfGlory', name: 'DAGGERHEART.CONFIG.DeathMoves.blazeOfGlory.name', img: 'icons/magic/life/heart-cross-strong-flame-purple-orange.webp', + icon: 'fa-burst', description: 'DAGGERHEART.CONFIG.DeathMoves.blazeOfGlory.description' } }; diff --git a/module/data/action/baseAction.mjs b/module/data/action/baseAction.mjs index 017c513a..1e955e5c 100644 --- a/module/data/action/baseAction.mjs +++ b/module/data/action/baseAction.mjs @@ -303,9 +303,9 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel /* EFFECTS */ /* SAVE */ - async rollSave(target, event, message) { - if (!target?.actor) return; - return target.actor + async rollSave(actor, event, message) { + if (!actor) return; + return actor .diceRoll({ event, title: 'Roll Save', @@ -314,16 +314,28 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel difficulty: this.save.difficulty ?? this.actor?.baseSaveDifficulty, type: 'reaction' }, - data: target.actor.getRollData() - }) - .then(async result => { - if (result) - this.updateChatMessage(message, target.id, { - result: result.roll.total, - success: result.roll.success - }); + data: actor.getRollData() }); } + + updateSaveMessage(result, message, targetId) { + const updateMsg = this.updateChatMessage.bind(this, message, targetId, { + result: result.roll.total, + success: result.roll.success + }); + if (game.modules.get('dice-so-nice')?.active) + game.dice3d.waitFor3DAnimationByMessageID(result.message.id ?? result.message._id).then(() => updateMsg()); + else updateMsg(); + } + + static rollSaveQuery({ actionId, actorId, event, message }) { + return new Promise(async (resolve, reject) => { + const actor = await fromUuid(actorId), + action = await fromUuid(actionId); + if (!actor || !actor?.isOwner) reject(); + action.rollSave(actor, event, message).then(result => resolve(result)); + }); + } /* SAVE */ async updateChatMessage(message, targetId, changes, chain = true) { @@ -337,7 +349,7 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel if (chain) { if (message.system.source.message) this.updateChatMessage(ui.chat.collection.get(message.system.source.message), targetId, changes, false); - const relatedChatMessages = ui.chat.collection.filter(c => c.system.source.message === message._id); + const relatedChatMessages = ui.chat.collection.filter(c => c.system.source?.message === message._id); relatedChatMessages.forEach(c => { this.updateChatMessage(c, targetId, changes, false); }); diff --git a/module/data/actor/base.mjs b/module/data/actor/base.mjs index 1f4060b0..f0db33e9 100644 --- a/module/data/actor/base.mjs +++ b/module/data/actor/base.mjs @@ -5,12 +5,14 @@ const resistanceField = (resistanceLabel, immunityLabel, reductionLabel) => resistance: new foundry.data.fields.BooleanField({ initial: false, label: `${resistanceLabel}.label`, - hint: `${resistanceLabel}.hint` + hint: `${resistanceLabel}.hint`, + isAttributeChoice: true }), immunity: new foundry.data.fields.BooleanField({ initial: false, label: `${immunityLabel}.label`, - hint: `${immunityLabel}.hint` + hint: `${immunityLabel}.hint`, + isAttributeChoice: true }), reduction: new foundry.data.fields.NumberField({ integer: true, diff --git a/module/dice/damageRoll.mjs b/module/dice/damageRoll.mjs index 43e275d4..d74ae410 100644 --- a/module/dice/damageRoll.mjs +++ b/module/dice/damageRoll.mjs @@ -12,7 +12,7 @@ export default class DamageRoll extends DHRoll { static async buildEvaluate(roll, config = {}, message = {}) { if (config.evaluate !== false) { - if (config.dialog.configure === false) roll.constructFormula(config); + // if (config.dialog.configure === false) roll.constructFormula(config); for (const roll of config.roll) await roll.roll.evaluate(); } roll._evaluated = true; diff --git a/module/documents/activeEffect.mjs b/module/documents/activeEffect.mjs index 3c45929b..5d45e2e1 100644 --- a/module/documents/activeEffect.mjs +++ b/module/documents/activeEffect.mjs @@ -41,6 +41,14 @@ export default class DhActiveEffect extends ActiveEffect { }); } + get localizedStatuses() { + const statusMap = new Map(foundry.CONFIG.statusEffects.map(status => [status.id, status.name])); + return this.statuses.map(x => ({ + key: x, + name: game.i18n.localize(statusMap.get(x)) + })); + } + async _preCreate(data, options, user) { const update = {}; if (!data.img) { diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index fc62e870..ec464ddb 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -1,5 +1,4 @@ import { emitAsGM, GMUpdateEvent } from '../systemRegistration/socket.mjs'; -import DamageReductionDialog from '../applications/dialogs/damageReductionDialog.mjs'; import { LevelOptionType } from '../data/levelTier.mjs'; import DHFeature from '../data/item/feature.mjs'; import { damageKeyToNumber } from '../helpers/utils.mjs'; @@ -389,6 +388,41 @@ export default class DhpActor extends Actor { return this.system.difficulty ?? 10; } + /** @inheritDoc */ + async toggleStatusEffect(statusId, { active, overlay = false } = {}) { + const status = CONFIG.statusEffects.find(e => e.id === statusId); + if (!status) throw new Error(`Invalid status ID "${statusId}" provided to Actor#toggleStatusEffect`); + const existing = []; + + // Find the effect with the static _id of the status effect + if (status._id) { + const effect = this.effects.get(status._id); + if (effect) existing.push(effect.id); + } + + // If no static _id, find all effects that have this status + else { + for (const effect of this.effects) { + if (effect.statuses.has(status.id)) existing.push(effect.id); + } + } + + // Remove the existing effects unless the status effect is forced active + if (existing.length) { + if (active) return true; + await this.deleteEmbeddedDocuments('ActiveEffect', existing); + return false; + } + + // Create a new effect unless the status effect is forced inactive + if (!active && active !== undefined) return; + + const ActiveEffect = getDocumentClass('ActiveEffect'); + const effect = await ActiveEffect.fromStatusEffect(statusId); + if (overlay) effect.updateSource({ 'flags.core.overlay': true }); + return ActiveEffect.implementation.create(effect, { parent: this, keepId: true }); + } + getRollData() { const rollData = super.getRollData(); rollData.system = this.system.getRollData(); @@ -448,10 +482,14 @@ export default class DhpActor extends Actor { this.#canReduceDamage(hpDamage.value, hpDamage.damageTypes) ) { const armorStackResult = await this.owner.query('armorStack', { - actorId: this.uuid, - damage: hpDamage.value, - type: [...hpDamage.damageTypes] - }); + actorId: this.uuid, + damage: hpDamage.value, + type: [...hpDamage.damageTypes] + }, + { + timeout: 30000 + } + ); if (armorStackResult) { const { modifiedDamage, armorSpent, stressSpent } = armorStackResult; updates.find(u => u.key === 'hitPoints').value = modifiedDamage; @@ -505,16 +543,16 @@ export default class DhpActor extends Actor { Object.entries(healings).forEach(([key, healing]) => { healing.parts.forEach(part => { const update = updates.find(u => u.key === key); - if (update) - update.value += part.total; + if (update) update.value += part.total; else updates.push({ value: part.total, key }); }); }); updates.forEach( u => - (u.value = - !(u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false) ? u.value * -1 : u.value) + (u.value = !(u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false) + ? u.value * -1 + : u.value) ); await this.modifyResource(updates); @@ -561,7 +599,7 @@ export default class DhpActor extends Actor { } } }); - + Object.keys(updates).forEach(async key => { const u = updates[key]; if (key === 'items') { @@ -603,7 +641,3 @@ export default class DhpActor extends Actor { }); } } - -export const registerDHActorHooks = () => { - CONFIG.queries.armorStack = DamageReductionDialog.armorStackQuery; -}; diff --git a/module/documents/token.mjs b/module/documents/token.mjs index a8105eb2..b6c47450 100644 --- a/module/documents/token.mjs +++ b/module/documents/token.mjs @@ -52,6 +52,7 @@ export default class DHToken extends TokenDocument { for (const [name, field] of Object.entries(schema.fields)) { const p = _path.concat([name]); if (field instanceof foundry.data.fields.NumberField) attributes.value.push(p); + if (field instanceof foundry.data.fields.BooleanField && field.options.isAttributeChoice) attributes.value.push(p); if (field instanceof foundry.data.fields.StringField) attributes.value.push(p); if (field instanceof foundry.data.fields.ArrayField) attributes.value.push(p); const isSchema = field instanceof foundry.data.fields.SchemaField; diff --git a/module/documents/tooltipManager.mjs b/module/documents/tooltipManager.mjs index f685c8a6..974f5596 100644 --- a/module/documents/tooltipManager.mjs +++ b/module/documents/tooltipManager.mjs @@ -87,6 +87,26 @@ export default class DhTooltipManager extends foundry.helpers.interaction.Toolti this.tooltip.innerHTML = html; } } + + const deathMove = element.dataset.tooltip?.startsWith('#deathMove#'); + if (deathMove) { + const name = element.dataset.deathName; + const img = element.dataset.deathImg; + const description = element.dataset.deathDescription; + + html = await foundry.applications.handlebars.renderTemplate( + `systems/daggerheart/templates/ui/tooltip/death-move.hbs`, + { + move: { name: name, img: img, description: description } + } + ); + + this.tooltip.innerHTML = html; + options.direction = this._determineItemTooltipDirection( + element, + this.constructor.TOOLTIP_DIRECTIONS.RIGHT + ); + } } super.activate(element, { ...options, html: html }); diff --git a/module/systemRegistration/socket.mjs b/module/systemRegistration/socket.mjs index 0037d99d..e97fe5b0 100644 --- a/module/systemRegistration/socket.mjs +++ b/module/systemRegistration/socket.mjs @@ -1,3 +1,5 @@ +import DamageReductionDialog from '../applications/dialogs/damageReductionDialog.mjs'; + export function handleSocketEvent({ action = null, data = {} } = {}) { switch (action) { case socketEvent.GMUpdate: @@ -21,7 +23,8 @@ export const socketEvent = { export const GMUpdateEvent = { UpdateDocument: 'DhGMUpdateDocument', UpdateSetting: 'DhGMUpdateSetting', - UpdateFear: 'DhGMUpdateFear' + UpdateFear: 'DhGMUpdateFear', + UpdateSaveMessage: 'DhGMUpdateSaveMessage' }; export const RefreshType = { @@ -53,8 +56,12 @@ export const registerSocketHooks = () => { ) ) ); - /* Hooks.callAll(socketEvent.DhpFearUpdate); - await game.socket.emit(`system.${CONFIG.DH.id}`, { action: socketEvent.DhpFearUpdate }); */ + break; + case GMUpdateEvent.UpdateSaveMessage: + const action = await fromUuid(data.update.action), + message = game.messages.get(data.update.message); + if(!action || !message) return; + action.updateSaveMessage(data.update.result, message, data.update.token); break; } @@ -69,6 +76,11 @@ export const registerSocketHooks = () => { }); }; +export const registerUserQueries = () => { + CONFIG.queries.armorStack = DamageReductionDialog.armorStackQuery; + CONFIG.queries.reactionRoll = game.system.api.models.actions.actionsTypes.base.rollSaveQuery; +} + export const emitAsGM = async (eventName, callback, update, uuid = null) => { if (!game.user.isGM) { return await game.socket.emit(`system.${CONFIG.DH.id}`, { diff --git a/styles/less/dialog/actions/action-list.less b/styles/less/dialog/actions/action-list.less index 4011d124..6a899ca7 100644 --- a/styles/less/dialog/actions/action-list.less +++ b/styles/less/dialog/actions/action-list.less @@ -1,4 +1,5 @@ @import '../../utils/fonts.less'; +@import '../../utils/colors.less'; .application.daggerheart.dh-style { .actions-list, @@ -36,7 +37,8 @@ .action-item { &:hover { - background-color: rgba(255, 255, 255, 0.05); + background-color: light-dark(@soft-shadow, @soft-white-shadow); + cursor: pointer; } padding: 5px; border-radius: 5px; @@ -47,7 +49,6 @@ align-items: center; gap: 10px; font-family: @font-body; - cursor: pointer; flex: 1; i { text-align: center; diff --git a/styles/less/dialog/death-move/death-move-container.less b/styles/less/dialog/death-move/death-move-container.less new file mode 100644 index 00000000..d5982131 --- /dev/null +++ b/styles/less/dialog/death-move/death-move-container.less @@ -0,0 +1,57 @@ +@import '../../utils/spacing.less'; +@import '../../utils/colors.less'; +@import '../../utils/fonts.less'; + +.daggerheart.dh-style.dialog.death-move { + .death-move-container { + display: flex; + flex-direction: column; + gap: 5px; + + .moves-list { + .move-item { + display: flex; + align-items: center; + gap: 5px; + + &:hover { + background-color: light-dark(@soft-shadow, @soft-white-shadow); + cursor: pointer; + } + padding: 5px; + border-radius: 5px; + transition: background-color 0.3s ease-in-out; + + .label { + display: flex; + align-items: center; + gap: 10px; + font-family: @font-body; + cursor: pointer; + flex: 1; + i { + text-align: center; + width: 30px; + } + } + + input[type='radio'] { + margin-left: auto; + } + } + } + } + + footer { + margin-top: 8px; + display: flex; + gap: 8px; + + button { + flex: 1; + height: 40px; + font-family: @font-body; + font-weight: 600; + } + } +} diff --git a/styles/less/dialog/downtime/downtime-container.less b/styles/less/dialog/downtime/downtime-container.less index 0f803d9b..6a520d4b 100644 --- a/styles/less/dialog/downtime/downtime-container.less +++ b/styles/less/dialog/downtime/downtime-container.less @@ -1,5 +1,6 @@ @import '../../utils/spacing.less'; @import '../../utils/colors.less'; +@import '../../utils/fonts.less'; .theme-light .daggerheart.dh-style.views.downtime { .downtime-container .activity-container .activity-selected-marker { @@ -69,7 +70,9 @@ button { flex: 1; - font-family: 'Montserrat', sans-serif; + height: 40px; + font-family: @font-body; + font-weight: 600; } } } diff --git a/styles/less/dialog/index.less b/styles/less/dialog/index.less index 66fd981d..496d09e9 100644 --- a/styles/less/dialog/index.less +++ b/styles/less/dialog/index.less @@ -12,6 +12,8 @@ @import './downtime/downtime-container.less'; +@import './death-move/death-move-container.less'; + @import './beastform/sheet.less'; @import './character-creation/creation-action-footer.less'; diff --git a/styles/less/utils/colors.less b/styles/less/utils/colors.less index 622480a7..033a42cb 100755 --- a/styles/less/utils/colors.less +++ b/styles/less/utils/colors.less @@ -38,6 +38,8 @@ @beige-15: #efe6d815; @beige-50: #efe6d850; +@soft-white-shadow: rgba(255, 255, 255, 0.05); + @light-black: rgba(0, 0, 0, 0.3); @soft-shadow: rgba(0, 0, 0, 0.05); diff --git a/templates/dialogs/deathMove.hbs b/templates/dialogs/deathMove.hbs index 1747a340..d2307900 100644 --- a/templates/dialogs/deathMove.hbs +++ b/templates/dialogs/deathMove.hbs @@ -1,19 +1,22 @@
-
- {{#each this.options as |option key|}} -
-
- - {{localize this.name}} -
-
- {{localize this.description}} -
-
- {{/each}} +
+

{{title}}

+
+
+
    + {{#each this.options as |option key|}} +
  • + + +
  • + {{/each}} +
- - + +
\ No newline at end of file diff --git a/templates/dialogs/reactionRoll.hbs b/templates/dialogs/reactionRoll.hbs new file mode 100644 index 00000000..98c94f16 --- /dev/null +++ b/templates/dialogs/reactionRoll.hbs @@ -0,0 +1,3 @@ +
+ Reaction Roll +
\ No newline at end of file diff --git a/templates/sheets/global/partials/inventory-item-V2.hbs b/templates/sheets/global/partials/inventory-item-V2.hbs index 90e1c543..46d63861 100644 --- a/templates/sheets/global/partials/inventory-item-V2.hbs +++ b/templates/sheets/global/partials/inventory-item-V2.hbs @@ -156,8 +156,8 @@ Parameters: {{localize 'DAGGERHEART.EFFECTS.Duration.passive'}} {{/if}}
- {{#each item.statuses as |status|}} -
{{localize (concat 'DAGGERHEART.CONFIG.Condition.' status '.name')}}
+ {{#each item.localizedStatuses as |status|}} +
{{status.name}}
{{/each}} {{else if (not hideLabels)}} diff --git a/templates/ui/tooltip/death-move.hbs b/templates/ui/tooltip/death-move.hbs new file mode 100644 index 00000000..febb2696 --- /dev/null +++ b/templates/ui/tooltip/death-move.hbs @@ -0,0 +1,7 @@ +
+
+ +

{{localize move.name}}

+
+
{{{localize move.description}}}
+
\ No newline at end of file