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 @@