const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; export default class DhpMulticlassDialog extends HandlebarsApplicationMixin(ApplicationV2) { constructor(actorName, actorClass, resolve) { super({}); this.actorName = actorName; this.actorClass = actorClass; this.resolve = resolve; this.classChoices = Array.from( game.items.reduce((acc, x) => { if (x.type === 'class' && x.name !== actorClass.name) { acc.add(x); } return acc; }, new Set()) ); this.subclassChoices = []; this.domainChoices = []; this.data = { class: null, subclass: null, domain: null }; } get title() { return `${this.actorName} - Multiclass`; } static DEFAULT_OPTIONS = { classes: ['daggerheart', 'views', 'multiclass'], position: { width: 600, height: 'auto' }, actions: { selectClass: this.selectClass, selectSubclass: this.selectSubclass, selectDomain: this.selectDomain, finish: this.finish } }; static PARTS = { form: { id: 'levelup', template: 'systems/daggerheart/templates/views/multiclass.hbs' } }; async _prepareContext(_options) { const context = await super._prepareContext(_options); context.classChoices = this.classChoices; context.subclassChoices = this.subclassChoices; context.domainChoices = this.domainChoices; context.disabledFinish = !this.data.class || !this.data.subclass || !this.data.domain; context.data = this.data; return context; } static async selectClass(_, button) { const oldClass = this.data.class; this.data.class = this.data.class?.uuid === button.dataset.class ? null : await fromUuid(button.dataset.class); if (oldClass !== button.dataset.class) { this.data.subclass = null; this.data.domain = null; this.subclassChoices = this.data.class ? this.data.class.system.subclasses : []; //FIXME this.domainChoices = this.data.class ? this.data.class.system.domains.map(x => { const config = SYSTEM.DOMAIN.domains[x]; return { name: game.i18n.localize(config.name), id: config.id, img: config.src, disabled: this.actorClass.system.domains.includes(config.id) }; }) : []; } this.render(true); } static async selectSubclass(_, button) { this.data.subclass = this.data.subclass?.uuid === button.dataset.subclass ? null : this.subclassChoices.find(x => x.uuid === button.dataset.subclass); this.render(true); } static async selectDomain(_, button) { const domain = this.data.domain?.id === button.dataset.domain ? null : this.domainChoices.find(x => x.id === button.dataset.domain); if (domain?.disabled) return; this.data.domain = domain; this.render(true); } static finish() { this.close({}, this.data); } async close(options = {}, data = null) { this.resolve(data); super.close(options); } }