const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api; export default class DamageSelectionDialog extends HandlebarsApplicationMixin(ApplicationV2) { constructor(rollString, bonusDamage, hope, resolve){ 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(); // } // }