const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; /** * A UI element which displays the Users defined for this world. * Currently active users are always displayed, while inactive users can be displayed on toggle. * * @extends ApplicationV2 * @mixes HandlebarsApplication */ export default class Resources extends HandlebarsApplicationMixin(ApplicationV2) { constructor(options={}) { super(options); } /** @inheritDoc */ static DEFAULT_OPTIONS = { id: "resources", classes: ["flexcol"], tag: "div", window: { frame: true, title: "Fear", positioned: true }, actions: { setFear: Resources.setFear, increaseFear: Resources.increaseFear }, position: {} }; /** @override */ static PARTS = { resources: { root: true, template: "systems/daggerheart/templates/views/resources.hbs" // template: "templates/ui/players.hbs" } }; get currentFear() { return game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Resources.Fear); } get maxFear() { return game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Resources.MaxFear); } /* -------------------------------------------- */ /* Rendering */ /* -------------------------------------------- */ /** @override */ async _prepareContext(_options) { const display = game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Resources.DisplayFear), current = this.currentFear, max = this.maxFear, percent = (current / max) * 100, isGM = game.user.isGM; // Return the data for rendering return {display, current, max, percent, isGM}; } /** @override */ async _preFirstRender(context, options) { options.position = game.user.getFlag(SYSTEM.id, 'app.resources.position') ?? {}; } /** @override */ async _preRender(context, options) { if(this.currentFear > this.maxFear) await game.settings.set(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Resources.Fear, this.maxFear); } _onPosition(position) { game.user.setFlag(SYSTEM.id, 'app.resources.position', position); } async close(options={}) { if(!options.allowed) return; else super.close(options); } static async setFear(event, target) { if(!game.user.isGM) return; const fearCount = Number(target.dataset.index ?? 0); await this.updateFear(this.currentFear === fearCount + 1 ? fearCount : fearCount + 1); } static async increaseFear(event, target) { let value = target.dataset.increment ?? 0, operator = value.split('')[0] ?? null; value = Number(value); await this.updateFear(operator ? this.currentFear + value : value); } async updateFear(value) { if(!game.user.isGM) return; value = Math.max(0, Math.min(this.maxFear, value)); await game.settings.set(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Resources.Fear, value); await this.render(true); } }