- Coque : épuisée stockée {value:0, max:n} au lieu de null → réparable ; nouveau mode « Réparer la coque » (difficulté = coque.max) dans le dialogue ; affichage (0/n) sur la fiche
- Bien conçu : Réussite automatique en réparation classique (restauration complète) ; +1 Fiabilité à la 1ère réparation de fortune réussie (compteur traits.bien_conçu.value)
- Pratique : Handicap +I sur toutes les réparations (required +1, note sur la carte)
- i18n fr/en (9 clés)
- TRAITS_PLAN.md : suivi du plan d'automatisation des Traits
108 lines
3.2 KiB
JavaScript
108 lines
3.2 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 coque = this.#item.system?.traits?.coque ?? {};
|
|
const hasBrokenCoque = this.#mode === 'repair' && (parseInt(coque?.value ?? 0, 10) || 0) === 0 && (parseInt(coque?.max ?? 0, 10) || 0) > 0;
|
|
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,
|
|
hasBrokenCoque,
|
|
coqueMax: parseInt(coque?.max ?? 0, 10) || 0,
|
|
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();
|
|
}
|
|
}
|