import { VermineReliability } from '../reliability.mjs'; const { HandlebarsApplicationMixin } = foundry.applications.api; /** * Dialogue de Test de Fiabilité / Réparation d'un item. * Mode "test" : choix de la gravité des Dommages matériels (Mineurs/Graves/Critiques) * + case Immersion (Trait Étanche). Mode "repair" : type de réparation * (classique/de fortune) + compétence utilisée. */ export default class ReliabilityDialog extends HandlebarsApplicationMixin(foundry.applications.api.ApplicationV2) { #item; #mode; static DEFAULT_OPTIONS = { classes: ['vermine-roll', 'reliability'], tag: 'form', window: { icon: 'fas fa-tools', resizable: false, }, position: { width: 460, height: 'auto', }, actions: { run: ReliabilityDialog.#onRun, cancel: ReliabilityDialog.#onCancel, }, }; static PARTS = { main: { template: 'systems/vermine2047/templates/dialogs/reliability-dialog.hbs', scrollable: [''] }, }; static async create({ item, mode = 'test' }) { return new ReliabilityDialog({ item, mode }); } constructor(options = {}) { super(options); this.#item = options.item; this.#mode = options.mode ?? 'test'; } get title() { return game.i18n.localize(this.#mode === 'repair' ? 'VERMINE.reliability_repair' : 'VERMINE.reliability_test'); } async _prepareContext() { const hasEtanche = !!this.#item.system?.traits?.etanche; const hasActor = !!this.#item.actor; const severities = ['mineurs', 'graves', 'critiques'].map((key) => ({ key, label: game.i18n.localize(`VERMINE.reliability_severity_${key}`), selected: key === 'graves', })); const skills = VermineReliability.REPAIR_SKILLS.map((key) => ({ key, label: game.i18n.localize(`SKILLS.${key}.name`), })); return { mode: this.#mode, isTest: this.#mode === 'test', isRepair: this.#mode === 'repair', hasEtanche, hasActor, severities, skills, }; } _onRender(context, options) { super._onRender(context, options); if (this.#mode !== 'repair') return; const select = this.element.querySelector('#reliability-skill'); const radios = this.element.querySelectorAll('input[name="repairMode"]'); if (!select || !radios.length) return; const refresh = () => { const fortune = this.element.querySelector('input[name="repairMode"]:checked')?.value === 'fortune'; select.closest('.form-group')?.classList.toggle('hidden', fortune); }; radios.forEach((r) => r.addEventListener('change', refresh)); refresh(); } #getOptions() { const el = this.element; if (this.#mode === 'test') { return { severity: el.querySelector('input[name="severity"]:checked')?.value ?? 'graves', immersion: !!el.querySelector('#reliability-immersion')?.checked, }; } return { mode: el.querySelector('input[name="repairMode"]:checked')?.value ?? 'classique', skill: el.querySelector('#reliability-skill')?.value ?? 'technology', }; } static async #onRun() { const options = this.#getOptions(); if (this.#mode === 'test') { await VermineReliability.test(this.#item, options); } else { await VermineReliability.repair(this.#item, options); } this.close(); } static #onCancel() { this.close(); } }