- min: 0 sur reliability (l'update à 0 était clippé à 1 par le schéma — l'état 'détruit' était inatteignable) - réparation de fortune (règles p. 39) : +1D si le personnage possède la Compétence requise, sinon Handicap de Rareté de cette Compétence (rarity du skill de l'acteur) ; select toujours visible (compétence requise) et pré-rempli depuis needSkill/skill de l'item - dés marqués 'dommage' uniquement pour les Dommages réellement comptés (Étanche/Coque absorbe → dés non marqués) - destruction : damages.value réel conservé (difficulté de réparation honnête au lieu de 5 forcé) - états de panne localisés (VERMINE.damages_state_N), aussi dans panneState() - ReliabilityDialog invoqué via .create() (convention du codebase)
104 lines
3.0 KiB
JavaScript
104 lines
3.0 KiB
JavaScript
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 storedSkill = (this.#item.system?.needSkill?.value && this.#item.system?.needSkill?.skill)
|
|
|| this.#item.system?.skill || '';
|
|
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`),
|
|
selected: key === storedSkill && VermineReliability.REPAIR_SKILLS.includes(storedSkill),
|
|
}));
|
|
return {
|
|
mode: this.#mode,
|
|
isTest: this.#mode === 'test',
|
|
isRepair: this.#mode === 'repair',
|
|
hasEtanche,
|
|
hasActor,
|
|
severities,
|
|
skills,
|
|
};
|
|
}
|
|
|
|
#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();
|
|
}
|
|
}
|