diff --git a/daggerheart.mjs b/daggerheart.mjs index 99eceed5..239b307d 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -112,6 +112,7 @@ Hooks.once('init', () => { CONFIG.Token.rulerClass = DhpTokenRuler; CONFIG.ui.resources = Resources; + CONFIG.ux.ContextMenu = applications.DhContextMenu; game.socket.on(`system.${SYSTEM.id}`, handleSocketEvent); diff --git a/module/applications/_module.mjs b/module/applications/_module.mjs index 85a7d7ed..c9f5ddc6 100644 --- a/module/applications/_module.mjs +++ b/module/applications/_module.mjs @@ -13,5 +13,6 @@ export { default as DhpArmor } from './sheets/items/armor.mjs'; export { default as DhpChatMessage } from './chatMessage.mjs'; export { default as DhpEnvironment } from './sheets/environment.mjs'; export { default as DhActiveEffectConfig } from './sheets/activeEffectConfig.mjs'; +export { default as DhContextMenu } from './contextMenu.mjs'; export * as api from './sheets/api/_modules.mjs'; diff --git a/module/applications/contextMenu.mjs b/module/applications/contextMenu.mjs new file mode 100644 index 00000000..68c6fee4 --- /dev/null +++ b/module/applications/contextMenu.mjs @@ -0,0 +1,24 @@ +export default class DhContextMenu extends ContextMenu { + constructor(container, selector, menuItems, options) { + super(container, selector, menuItems, options); + + /** @deprecated since v13 until v15 */ + this.#jQuery = options.jQuery; + } + + #jQuery; + + activateListeners(menu) { + menu.addEventListener('click', this.#onClickItem.bind(this)); + } + + #onClickItem(event) { + event.preventDefault(); + event.stopPropagation(); + const element = event.target.closest('.context-item'); + if (!element) return; + const item = this.menuItems.find(i => i.element === element); + item?.callback(this.#jQuery ? $(this.target) : this.target, event); + this.close(); + } +} diff --git a/module/applications/countdowns.mjs b/module/applications/countdowns.mjs index 8f7c1cbf..0eac145f 100644 --- a/module/applications/countdowns.mjs +++ b/module/applications/countdowns.mjs @@ -48,8 +48,8 @@ class Countdowns extends HandlebarsApplicationMixin(ApplicationV2) { super._attachPartListeners(partId, htmlElement, options); htmlElement.querySelectorAll('.mini-countdown-container').forEach(element => { - element.addEventListener('click', event => this.updateCountdownValue.bind(this)(event, true)); - element.addEventListener('contextmenu', event => this.updateCountdownValue.bind(this)(event, false)); + element.addEventListener('click', event => this.updateCountdownValue.bind(this)(event, false)); + element.addEventListener('contextmenu', event => this.updateCountdownValue.bind(this)(event, true)); }); } diff --git a/module/applications/sheets/character.mjs b/module/applications/sheets/character.mjs index 11bbd18f..3b191b32 100644 --- a/module/applications/sheets/character.mjs +++ b/module/applications/sheets/character.mjs @@ -223,7 +223,7 @@ export default class CharacterSheet extends DaggerheartSheet(ActorSheetV2) { useItem: { name: 'DAGGERHEART.Sheets.PC.ContextMenu.UseItem', icon: '', - callback: this.constructor.useItem.bind(this) + callback: (element, event) => this.constructor.useItem.bind(this)(event, element) }, equip: { name: 'DAGGERHEART.Sheets.PC.ContextMenu.Equip', @@ -555,6 +555,12 @@ export default class CharacterSheet extends DaggerheartSheet(ActorSheetV2) { this.render(); } + static async toggleLoadoutView(_, button) { + const newAbilityView = !(button.dataset.value === 'true'); + await game.user.setFlag(SYSTEM.id, SYSTEM.FLAGS.displayDomainCardsAsList, newAbilityView); + this.render(); + } + static async attackRoll(event, button) { const weapon = await fromUuid(button.dataset.weapon); if (!weapon) return; @@ -652,10 +658,13 @@ export default class CharacterSheet extends DaggerheartSheet(ActorSheetV2) { (await game.packs.get('daggerheart.communities'))?.render(true); } - static useItem(element, button) { - const id = (button ?? element).closest('a').id, + static async useItem(event, button) { + const id = button.closest('a').id, item = this.document.items.get(id); - item.use({}); + const wasUsed = await item.use(event); + if (wasUsed && item.type === 'weapon') { + Hooks.callAll(SYSTEM.HOOKS.characterAttack, {}); + } } static async viewObject(element, button) { @@ -707,7 +716,6 @@ export default class CharacterSheet extends DaggerheartSheet(ActorSheetV2) { static async makeDeathMove() { if (this.document.system.resources.hitPoints.value === this.document.system.resources.hitPoints.max) { await new DhpDeathMove(this.document).render(true); - await this.minimize(); } } @@ -763,7 +771,9 @@ export default class CharacterSheet extends DaggerheartSheet(ActorSheetV2) { const cls = getDocumentClass('ChatMessage'); const systemData = { name: game.i18n.localize('DAGGERHEART.General.Experience.Single'), - description: `${experience.description} ${experience.total < 0 ? experience.total : `+${experience.total}`}` + description: `${experience.description} ${ + experience.total < 0 ? experience.total : `+${experience.total}` + }` }; const msg = new cls({ type: 'abilityUse', @@ -788,7 +798,9 @@ export default class CharacterSheet extends DaggerheartSheet(ActorSheetV2) { ? this.document.system.multiclass.subclass : this.document.system.class.subclass; const ability = item.system[`${button.dataset.key}Feature`]; - const title = `${item.name} - ${game.i18n.localize(`DAGGERHEART.Sheets.PC.DomainCard.${capitalize(button.dataset.key)}Title`)}`; + const title = `${item.name} - ${game.i18n.localize( + `DAGGERHEART.Sheets.PC.DomainCard.${capitalize(button.dataset.key)}Title` + )}`; const cls = getDocumentClass('ChatMessage'); const systemData = { diff --git a/styles/daggerheart.css b/styles/daggerheart.css index b6508ed8..395912ec 100755 --- a/styles/daggerheart.css +++ b/styles/daggerheart.css @@ -3619,13 +3619,35 @@ div.daggerheart.views.multiclass { .theme-light .application.sheet.daggerheart.actor.dh-style.character .character-sidebar-sheet { background: transparent; } -.application.sheet.daggerheart.actor.dh-style.character .character-sidebar-sheet img { +.application.sheet.daggerheart.actor.dh-style.character .character-sidebar-sheet .portrait { + position: relative; height: 235px; width: 275px; border-bottom: 1px solid light-dark(#18162e, #f3c267); cursor: pointer; +} +.application.sheet.daggerheart.actor.dh-style.character .character-sidebar-sheet .portrait img { + height: 235px; + width: 275px; object-fit: cover; } +.application.sheet.daggerheart.actor.dh-style.character .character-sidebar-sheet .portrait .death-roll-btn { + display: none; +} +.application.sheet.daggerheart.actor.dh-style.character .character-sidebar-sheet .portrait.death-roll { + filter: grayscale(1); +} +.application.sheet.daggerheart.actor.dh-style.character .character-sidebar-sheet .portrait.death-roll .death-roll-btn { + display: flex; + position: absolute; + top: 30%; + right: 30%; + font-size: 6rem; + color: #efe6d8; +} +.application.sheet.daggerheart.actor.dh-style.character .character-sidebar-sheet .portrait.death-roll .death-roll-btn:hover { + text-shadow: 0 0 8px #efe6d8; +} .application.sheet.daggerheart.actor.dh-style.character .character-sidebar-sheet .info-section { position: relative; display: flex; diff --git a/styles/less/actors/character/sidebar.less b/styles/less/actors/character/sidebar.less index b3ac42e0..0a37aff4 100644 --- a/styles/less/actors/character/sidebar.less +++ b/styles/less/actors/character/sidebar.less @@ -12,12 +12,39 @@ background: transparent; } - img { + .portrait { + position: relative; height: 235px; width: 275px; border-bottom: 1px solid light-dark(@dark-blue, @golden); cursor: pointer; - object-fit: cover; + + img { + height: 235px; + width: 275px; + object-fit: cover; + } + + .death-roll-btn { + display: none; + } + + &.death-roll { + filter: grayscale(1); + + .death-roll-btn { + display: flex; + position: absolute; + top: 30%; + right: 30%; + font-size: 6rem; + color: @beige; + + &:hover { + text-shadow: 0 0 8px @beige; + } + } + } } .info-section { diff --git a/templates/sheets/actors/character/sidebar.hbs b/templates/sheets/actors/character/sidebar.hbs index bba7b3e3..4060caeb 100644 --- a/templates/sheets/actors/character/sidebar.hbs +++ b/templates/sheets/actors/character/sidebar.hbs @@ -1,5 +1,9 @@