feat: gestion de la Fiabilité du matériel (test de Fiabilité + réparations)
- module/system/reliability.mjs : VermineReliability
- Test de Fiabilité : jet Xd10 (Mineurs 1D / Graves 3D / Critiques 5D),
chaque dé >= Fiabilité inflige 1 Dommage ; réduit Fiabilité et dommages
cumulés (panne/état/effet) ; destruction à 0
- Traits appliqués : Coque (absorbe n puis se perd), Cassant (+1 perte),
Étanche (Dommages d'immersion ignorés si Fiabilité au max)
- Réparations : classique (Précision + Artisanat/Mécanique/Technologie/
Armurerie vs Fiabilité d'origine + Handicap de panne, +1 Fiabilité/Réussite)
et de fortune (Précision + Bricolage, panne réparée sans gain de Fiabilité)
- ReliabilityDialog (test/réparation) + cartes de chat dédiées
- Boutons Test de Fiabilité / Réparer sur les fiches d'items (weapon/defense/item)
- i18n fr/en + styles des cartes et boutons
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user