mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-01-12 11:41:08 +01:00
* FIX: Add enritch to HTMLField FIX: Remove no-HTMLField from Manifest FIX: Convert Scar's HTMLField to StringField FIX: Remove unused HTMLField * REMOVE unused hanldebars helpers * FEAT: add inventory-fieldset-items-V2 and inventory-item-V2 partials for Actors * FIX showLabels to hideTags * FEAT: add template to items sheet * FEAT: add effects tabs on ItemSheet * FEAT: add context menus for all inventory-items * FEAT: add resources to inventory-item template * FEAT: add enritch on inventory-item description FEAT: add extensible behavior on inventory-item-content FEAT: add fade effect on item-img to roll-itmg * FEAT: add eritch to NPC description FIX: missing htmlFieldss on manfiest FIX: add misisng localizations * FIX_ minor fixes * Little resource fix. Noone will notice ._. * FIX: remove default list styles FIX: .extended css reduce max-height, shorten animation duration to 0.5s, and set overflow to auto. FIX: set enriched=notes.enriche on notes.hbs FIX: set experience.value on sidebar.hbs FIX: move tooltip from item-img to img-portrait on inventory-item-V2.hbs REMOVE: unused files --------- Co-authored-by: Joaquin Pereyra <joaquinpereyra98@users.noreply.github.com> Co-authored-by: WBHarry <williambjrklund@gmail.com>
165 lines
5.3 KiB
JavaScript
165 lines
5.3 KiB
JavaScript
import DHBaseActorSettings from './actor-setting.mjs';
|
|
import DHApplicationMixin from './application-mixin.mjs';
|
|
|
|
const { ActorSheetV2 } = foundry.applications.sheets;
|
|
|
|
/**@typedef {import('@client/applications/_types.mjs').ApplicationClickAction} ApplicationClickAction */
|
|
|
|
/**
|
|
* A base actor sheet extending {@link ActorSheetV2} via {@link DHApplicationMixin}
|
|
* @extends ActorSheetV2
|
|
* @mixes DHSheetV2
|
|
*/
|
|
export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) {
|
|
/** @inheritDoc */
|
|
static DEFAULT_OPTIONS = {
|
|
classes: ['actor'],
|
|
position: {
|
|
width: 480
|
|
},
|
|
form: {
|
|
submitOnChange: true
|
|
},
|
|
actions: {
|
|
openSettings: DHBaseActorSheet.#openSettings,
|
|
sendExpToChat: DHBaseActorSheet.#sendExpToChat,
|
|
},
|
|
contextMenus: [
|
|
{
|
|
handler: DHBaseActorSheet.#getFeatureContextOptions,
|
|
selector: '[data-item-uuid][data-type="feature"]',
|
|
options: {
|
|
parentClassHooks: false,
|
|
fixed: true
|
|
}
|
|
}
|
|
],
|
|
dragDrop: [{ dragSelector: '.inventory-item[data-type="attack"]', dropSelector: null }]
|
|
};
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
/**@type {typeof DHBaseActorSettings}*/
|
|
#settingSheet;
|
|
|
|
/**@returns {DHBaseActorSettings|null} */
|
|
get settingSheet() {
|
|
const SheetClass = this.document.system.metadata.settingSheet;
|
|
return (this.#settingSheet ??= SheetClass ? new SheetClass({ document: this.document }) : null);
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
/* Prepare Context */
|
|
/* -------------------------------------------- */
|
|
|
|
/**@inheritdoc */
|
|
async _prepareContext(_options) {
|
|
const context = await super._prepareContext(_options);
|
|
context.isNPC = this.document.isNPC;
|
|
return context;
|
|
}
|
|
|
|
|
|
/**@inheritdoc */
|
|
async _preparePartContext(partId, context, options) {
|
|
context = await super._preparePartContext(partId, context, options);
|
|
switch (partId) {
|
|
case 'effects':
|
|
await this._prepareEffectsContext(context, options);
|
|
break;
|
|
}
|
|
return context;
|
|
}
|
|
|
|
/**
|
|
* Prepare render context for the Effect part.
|
|
* @param {ApplicationRenderContext} context
|
|
* @param {ApplicationRenderOptions} options
|
|
* @returns {Promise<void>}
|
|
* @protected
|
|
*/
|
|
async _prepareEffectsContext(context, _options) {
|
|
context.effects = {
|
|
actives: [],
|
|
inactives: [],
|
|
};
|
|
|
|
for (const effect of this.actor.allApplicableEffects()) {
|
|
const list = effect.active ? context.effects.actives : context.effects.inactives;
|
|
list.push(effect);
|
|
}
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
/* Context Menu */
|
|
/* -------------------------------------------- */
|
|
|
|
/**
|
|
* Get the set of ContextMenu options for Features.
|
|
* @returns {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]} - The Array of context options passed to the ContextMenu instance
|
|
* @this {DHSheetV2}
|
|
* @protected
|
|
*/
|
|
static #getFeatureContextOptions() {
|
|
return this._getContextMenuCommonOptions.call(this, { usable: true, toChat: true });
|
|
}
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
/* Application Clicks Actions */
|
|
/* -------------------------------------------- */
|
|
|
|
/**
|
|
* Open the Actor Setting Sheet
|
|
* @type {ApplicationClickAction}
|
|
*/
|
|
static async #openSettings() {
|
|
await this.settingSheet.render({ force: true });
|
|
}
|
|
|
|
/**
|
|
* Send Experience to Chat
|
|
* @type {ApplicationClickAction}
|
|
*/
|
|
static async #sendExpToChat(_, button) {
|
|
const experience = this.document.system.experiences[button.dataset.id];
|
|
|
|
const systemData = {
|
|
name: game.i18n.localize('DAGGERHEART.GENERAL.Experience.single'),
|
|
description: `${experience.name} ${experience.value.signedString()}`
|
|
};
|
|
|
|
foundry.documents.ChatMessage.implementation.create({
|
|
type: 'abilityUse',
|
|
user: game.user.id,
|
|
system: systemData,
|
|
content: await foundry.applications.handlebars.renderTemplate(
|
|
'systems/daggerheart/templates/ui/chat/ability-use.hbs',
|
|
systemData
|
|
)
|
|
});
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
/* Application Drag/Drop */
|
|
/* -------------------------------------------- */
|
|
|
|
/**
|
|
* On dragStart on the item.
|
|
* @param {DragEvent} event - The drag event
|
|
*/
|
|
async _onDragStart(event) {
|
|
const attackItem = event.currentTarget.closest('.inventory-item[data-type="attack"]');
|
|
|
|
if (attackItem) {
|
|
const attackData = {
|
|
type: 'Attack',
|
|
actorUuid: this.document.uuid,
|
|
img: this.document.system.attack.img,
|
|
fromInternal: true
|
|
};
|
|
event.dataTransfer.setData('text/plain', JSON.stringify(attackData));
|
|
event.dataTransfer.setDragImage(attackItem.querySelector('img'), 60, 0);
|
|
}
|
|
}
|
|
}
|