mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-01-11 19:25:21 +01:00
81 lines
3.7 KiB
JavaScript
81 lines
3.7 KiB
JavaScript
export default class DhActorDirectory extends foundry.applications.sidebar.tabs.ActorDirectory {
|
|
static DEFAULT_OPTIONS = {
|
|
renderUpdateKeys: ['system.levelData.level.current', 'system.partner', 'system.tier']
|
|
};
|
|
|
|
static _entryPartial = 'systems/daggerheart/templates/ui/sidebar/actor-document-partial.hbs';
|
|
|
|
async _prepareDirectoryContext(context, options) {
|
|
await super._prepareDirectoryContext(context, options);
|
|
const adversaryTypes = CONFIG.DH.ACTOR.allAdversaryTypes();
|
|
const environmentTypes = CONFIG.DH.ACTOR.environmentTypes;
|
|
context.getTypeLabel = document => {
|
|
return document.type === 'adversary'
|
|
? game.i18n.localize(adversaryTypes[document.system.type]?.label ?? 'TYPES.Actor.adversary')
|
|
: document.type === 'environment'
|
|
? game.i18n.localize(environmentTypes[document.system.type]?.label ?? 'TYPES.Actor.environment')
|
|
: null;
|
|
};
|
|
}
|
|
|
|
/** @inheritDoc */
|
|
_onDragStart(event) {
|
|
let actor;
|
|
const { entryId } = event.currentTarget.dataset;
|
|
if (entryId) {
|
|
actor = this.collection.get(entryId);
|
|
if (!actor?.visible) return false;
|
|
}
|
|
super._onDragStart(event);
|
|
|
|
// Create the drag preview.
|
|
if (actor && canvas.ready) {
|
|
const img = event.currentTarget.querySelector('img');
|
|
const pt = actor.prototypeToken;
|
|
const usesSize = actor.system.metadata.usesSize;
|
|
const tokenSizes = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).tokenSizes;
|
|
const width = usesSize ? tokenSizes[actor.system.size] : pt.width;
|
|
const height = usesSize ? tokenSizes[actor.system.size] : pt.height;
|
|
|
|
const w = width * canvas.dimensions.size * Math.abs(pt.texture.scaleX) * canvas.stage.scale.x;
|
|
const h = height * canvas.dimensions.size * Math.abs(pt.texture.scaleY) * canvas.stage.scale.y;
|
|
const preview = foundry.applications.ux.DragDrop.implementation.createDragImage(img, w, h);
|
|
event.dataTransfer.setDragImage(preview, w / 2, h / 2);
|
|
}
|
|
}
|
|
|
|
_getEntryContextOptions() {
|
|
const options = super._getEntryContextOptions();
|
|
options.push({
|
|
name: 'Duplicate To New Tier',
|
|
icon: `<i class="fa-solid fa-arrow-trend-up" inert></i>`,
|
|
condition: li => {
|
|
const actor = game.actors.get(li.dataset.entryId);
|
|
return actor?.type === 'adversary' && actor.system.type !== 'social';
|
|
},
|
|
callback: async li => {
|
|
const actor = game.actors.get(li.dataset.entryId);
|
|
if (!actor) throw new Error('Unexpected missing actor');
|
|
|
|
const tier = await foundry.applications.api.Dialog.input({
|
|
window: { title: 'Pick a new tier for this adversary' },
|
|
content: '<input name="tier" type="number" min="1" max="4" step="1" autofocus>',
|
|
ok: {
|
|
label: 'Create Adversary',
|
|
callback: (event, button, dialog) => Math.clamp(button.form.elements.tier.valueAsNumber, 1, 4)
|
|
}
|
|
});
|
|
|
|
if (tier === actor.system.tier) {
|
|
ui.notifications.warn('This actor is already at this tier');
|
|
} else if (tier) {
|
|
const source = actor.system.adjustForTier(tier);
|
|
await Actor.create(source);
|
|
ui.notifications.info(`Tier ${tier} ${actor.name} created`);
|
|
}
|
|
}
|
|
});
|
|
|
|
return options;
|
|
}
|
|
}
|