const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api; export default class DamageSelectionDialog extends HandlebarsApplicationMixin(ApplicationV2) { constructor(rollString, bonusDamage, resolve, hope = 0) { super({}); this.data = { rollString, bonusDamage: bonusDamage.reduce((acc, x) => { if (x.appliesOn === SYSTEM.EFFECTS.applyLocations.damageRoll.id) { acc.push({ ...x, hopeUses: 0 }); } return acc; }, []), hope }; this.resolve = resolve; } static DEFAULT_OPTIONS = { tag: 'form', classes: ['daggerheart', 'views', 'damage-selection'], position: { width: 400, height: 'auto' }, actions: { decreaseHopeUse: this.decreaseHopeUse, increaseHopeUse: this.increaseHopeUse, rollDamage: this.rollDamage }, form: { handler: this.updateSelection, submitOnChange: true, closeOnSubmit: false } }; /** @override */ static PARTS = { damageSelection: { id: 'damageSelection', template: 'systems/daggerheart/templates/views/damageSelection.hbs' } }; /* -------------------------------------------- */ /** @inheritDoc */ get title() { return `Damage Options`; } async _prepareContext(_options) { return { rollString: this.getRollString(), bonusDamage: this.data.bonusDamage, hope: this.data.hope + 1, hopeUsed: this.getHopeUsed() }; } static updateSelection(event, _, formData) { const { bonusDamage, ...rest } = foundry.utils.expandObject(formData.object); for (var index in bonusDamage) { this.data.bonusDamage[index].initiallySelected = bonusDamage[index].initiallySelected; if (bonusDamage[index].hopeUses) { const value = Number.parseInt(bonusDamage[index].hopeUses); if (!Number.isNaN(value)) this.data.bonusDamage[index].hopeUses = value; } } this.data = foundry.utils.mergeObject(this.data, rest); this.render(true); } getRollString() { return this.data.rollString.concat( this.data.bonusDamage.reduce((acc, x) => { if (x.initiallySelected) { const nr = 1 + x.hopeUses; const baseDamage = x.value; return acc.concat(` + ${nr}${baseDamage}`); } return acc; }, '') ); } getHopeUsed() { return this.data.bonusDamage.reduce((acc, x) => acc + x.hopeUses, 0); } static decreaseHopeUse(_, button) { const index = Number.parseInt(button.dataset.index); if (this.data.bonusDamage[index].hopeUses - 1 >= 0) { this.data.bonusDamage[index].hopeUses -= 1; this.render(true); } } static increaseHopeUse(_, button) { const index = Number.parseInt(button.dataset.index); if (this.data.bonusDamage[index].hopeUses <= this.data.hope + 1) { this.data.bonusDamage[index].hopeUses += 1; this.render(true); } } static rollDamage() { this.resolve({ rollString: this.getRollString(), bonusDamage: this.data.bonusDamage, hopeUsed: this.getHopeUsed() }); this.close(); } } // export default class DamageSelectionDialog extends FormApplication { // constructor(rollString, bonusDamage, resolve){ // super({}, {}); // this.data = { // rollString, // bonusDamage: bonusDamage.map(x => ({ // ...x, // hopeUses: 0 // })), // } // this.resolve = resolve; // } // get title (){ // return 'Damage Options'; // } // static get defaultOptions() { // const defaults = super.defaultOptions; // const overrides = { // height: 'auto', // width: 400, // id: 'damage-selection', // template: 'systems/daggerheart/templates/views/damageSelection.hbs', // closeOnSubmit: false, // classes: ["daggerheart", "views", "damage-selection"], // }; // const mergedOptions = foundry.utils.mergeObject(defaults, overrides); // return mergedOptions; // } // async getData(){ // const context = super.getData(); // context.rollString = this.data.rollString; // context.bonusDamage = this.data.bonusDamage; // return context; // } // activateListeners(html) { // super.activateListeners(html); // html.find('.roll-button').click(this.finish.bind(this)); // html.find('.').change(); // } // // async _updateObject(_, formData) { // // const data = foundry.utils.expandObject(formData); // // this.data = foundry.utils.mergeObject(this.data, data); // // this.render(true); // // } // finish(){ // this.resolve(this.data); // this.close(); // } // }