foundryvtt-reve-de-dragon/module/settings/regles-optionnelles.js

128 lines
8.0 KiB
JavaScript
Raw Normal View History

2022-11-06 21:39:03 +01:00
import { SYSTEM_RDD } from "../constants.js";
import { Misc } from "../misc.js";
2021-01-26 19:43:37 +01:00
2023-06-20 23:43:24 +02:00
const listeReglesOptionnelles = [
2023-06-20 03:00:00 +02:00
{ group: 'Règles générales', name: 'appliquer-fatigue', descr: "Appliquer les règles de fatigue"},
{ group: 'Règles générales', name: 'astrologie', descr: "Appliquer les ajustements astrologiques aux jets de chance et aux rituels"},
2023-11-03 20:04:02 +01:00
{ group: 'Récupération', name: 'transformation-stress', descr: "Transformer le stress durant Château Dormant"},
2023-11-03 20:22:41 +01:00
{ group: 'Récupération', name: 'recuperation-chance', descr: "Récupérer la chance durant Château Dormant"},
{ group: 'Récupération', name: 'recuperation-ethylisme', descr: "Récupérer l'éthylisme"},
2023-11-03 20:23:35 +01:00
{ group: 'Récupération', name: 'recuperation-reve', descr: "Récupérer le rêve pendant la nuit (les jets sont toujours faits pour les Rêves de Dragons)"},
{ group: 'Récupération', name: 'recuperation-moral', descr: "Le moral revient vers 0 durant Château Dormant"},
2023-06-20 03:00:00 +02:00
{ group: 'Règles de combat', name: 'recul', descr: "Appliquer le recul en cas de particulière en force ou de charge" },
{ group: 'Règles de combat', name: 'resistanceArmeParade', descr: "Faire le jet de résistance des armes lors de parades pouvant les endommager" },
{ group: 'Règles de combat', name: 'deteriorationArmure', descr: "Tenir compte de la détérioration des armures" },
{ group: 'Règles de combat', name: 'defenseurDesarme', descr: "Le défenseur peut être désarmé en parant une particulière en force ou une charge avec une arme autre qu'un bouclier" },
{ group: 'Règles de combat', name: 'categorieParade', descr: "Le défenseur doit obtenir une significative en cas de parade avec des armes de catégories différentes" },
{ group: 'Règles de combat', name: 'tripleSignificative', descr: "En cas de demi-surprise, d'attaque particulière en finesse, et de catégories d'armes différentes, le défenseur doit obtenir 1/8 des chances de succès" },
{ group: 'Règles de combat', name: 'validation-encaissement-gr', descr: "Le Gardien des Rêves doit valider les jets d'encaissement et peut les changer.", default: false },
{ group: 'Automatisation', name: 'chateau-dormant-gardien', descr: "Saisie des heures de sommeil/jets de moral par le gardien des rêves", default: true },
2023-06-20 03:00:00 +02:00
{ group: 'Affichage', name: 'afficher-colonnes-reussite', descr: "Afficher le nombre de colonnes de réussite ou d'échec", default: false },
{ group: 'Affichage', name: 'afficher-prix-joueurs', descr: "Afficher le prix de l'équipement des joueurs", uniquementJoueur: true},
2022-11-22 02:12:26 +01:00
{ group: 'Confirmations', name: 'confirmer-combat-sans-cible', descr: "Confirmer avant une attaque sans cible", scope: "client"},
2022-10-21 02:27:16 +02:00
{ group: 'Confirmations', name: 'confirmation-tmr', descr: "Confirmer pour monter dans les TMR", scope: "client"},
{ group: 'Confirmations', name: 'confirmation-tmr-rencontre', descr: "Confirmer pour monter dans les TMR avec rencontre en attente", scope: "client"},
2022-10-21 02:27:16 +02:00
{ group: 'Confirmations', name: 'confirmation-refouler', descr: "Confirmer avant de refouler", scope: "client"},
{ group: 'Confirmations', name: 'confirmation-vider', descr: "Confirmer pour vider l'équipement", scope: "client"},
{ group: 'Confirmations', name: 'confirmation-supprimer-lien-acteur', descr: "Confirmer pour détacher un animal/suivant/véhicule", scope: "client"},
{ group: 'Confirmations', name: 'confirmation-supprimer-equipement', descr: "Confirmer la suppression des équipements", scope: "client"},
{ group: 'Confirmations', name: 'confirmation-supprimer-oeuvre', descr: "Confirmer la suppression des oeuvres", scope: "client"},
{ group: 'Confirmations', name: 'confirmation-supprimer-connaissance', descr: "Confirmer la suppression des connaissances", scope: "client"},
{ group: 'Confirmations', name: 'confirmation-supprimer-draconique', descr: "Confirmer la suppression des queues, souffles, têtes", scope: "client"},
{ group: 'Confirmations', name: 'confirmation-supprimer-effet', descr: "Confirmer la suppression des effets", scope: "client"},
{ group: 'Confirmations', name: 'confirmation-supprimer-competence', descr: "Confirmer la suppression des compétences", scope: "client"},
{ group: 'Confirmations', name: 'confirmation-supprimer-autres', descr: "Confirmer la suppression des autres types d'Objets", scope: "client"},
2023-06-20 03:00:00 +02:00
{ group: 'Options alternatives', name: 'degat-minimum-malus-libre-simple', descr: "Le malus libre d'attaque remplace une des valeurs de dés d'encaissement si elle est plus petite. Exemple : la difficulté libre de l'attaquant est de -4. Sur le jet d'encaissement, si le plus petit dé est inférieur à 4, alors il devient 4.", default: false },
{ group: 'Options alternatives', name: 'degat-minimum-malus-libre', descr: "Le malus libre d'attaque remplace une valeur de dés d'encaissement si elle est plus petite. Exemple : la difficulté libre de l'attaquant est de -4. Sur le jet d'encaissement, tout résultat inférieur à 4 devient 4.", default: false },
{ group: 'Options alternatives', name: 'degat-ajout-malus-libre', descr: "Le malus libre d'attaque s'ajoute au jet d'encaissement et aux autres bonus. Exemple : la difficulté libre de l'attaquant est de -4. Le jet d'encaissement est effectué à 2d10+4, plus les bonus de situation et d'armes.", default: false },
2021-01-26 19:43:37 +01:00
];
2023-06-20 23:43:24 +02:00
const uniquementJoueur = listeReglesOptionnelles.filter(it => it.uniquementJoueur).map(it=>it.name);
2021-01-26 19:43:37 +01:00
2023-06-20 23:43:24 +02:00
export class ReglesOptionnelles extends FormApplication {
2021-01-26 19:43:37 +01:00
static init() {
2023-06-20 23:43:24 +02:00
for (const regle of listeReglesOptionnelles) {
2021-01-26 19:43:37 +01:00
const name = regle.name;
2023-06-20 23:43:24 +02:00
const id = ReglesOptionnelles._getIdRegle(name);
game.settings.register(SYSTEM_RDD, id, { name: id, scope: regle.scope ?? "world", config: false, default: regle.default == undefined ? true : regle.default, type: Boolean });
2021-01-26 19:43:37 +01:00
}
game.settings.registerMenu(SYSTEM_RDD, "rdd-options-regles", {
2023-06-20 23:43:24 +02:00
name: "Choisir les règles optionnelles",
label: "Règles optionnelles",
hint: "Ouvre la fenêtre de sélection des règles optionnelles",
2021-01-26 19:43:37 +01:00
icon: "fas fa-bars",
2023-06-20 23:43:24 +02:00
type: ReglesOptionnelles
2021-01-26 19:43:37 +01:00
});
}
constructor(...args) {
super(...args);
}
static _getIdRegle(name) {
return `rdd-option-${name}`;
}
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
2023-06-20 23:43:24 +02:00
id: "regles-optionnelles",
template: "systems/foundryvtt-reve-de-dragon/templates/settings/regles-optionnelles.html",
2023-11-23 20:52:23 +01:00
height: 650,
width: 550,
2021-01-26 19:43:37 +01:00
minimizable: false,
closeOnSubmit: true,
2021-05-08 20:08:56 +02:00
title: "Règles optionnelles"
}, { inplace: false })
2021-01-26 19:43:37 +01:00
}
getData() {
2021-03-16 22:56:57 +01:00
let formData = super.getData();
2023-06-20 23:43:24 +02:00
const regles = listeReglesOptionnelles.filter(it => game.user.isGM || it.scope == "client").map(it => {
2024-05-02 14:08:02 +02:00
it = foundry.utils.duplicate(it);
2023-06-20 23:43:24 +02:00
it.id = ReglesOptionnelles._getIdRegle(it.name);
it.active = ReglesOptionnelles.isSet(it.name);
2021-05-08 20:08:56 +02:00
return it;
});
formData.regles = regles;
formData.groups = Misc.classify(regles, it => it.group);
2021-03-16 22:56:57 +01:00
return formData;
2021-01-26 19:43:37 +01:00
}
static isUsing(name) {
if (game.user.isGM && uniquementJoueur.includes(name)) {
return true;
}
2023-06-20 23:43:24 +02:00
return ReglesOptionnelles.isSet(name);
2021-01-26 19:43:37 +01:00
}
static isSet(name) {
2023-06-20 23:43:24 +02:00
return game.settings.get(SYSTEM_RDD, ReglesOptionnelles._getIdRegle(name));
}
static set(name, value) {
2023-06-20 23:43:24 +02:00
return game.settings.set(SYSTEM_RDD, ReglesOptionnelles._getIdRegle(name), value ? true: false);
}
2021-01-26 19:43:37 +01:00
activateListeners(html) {
html.find(".select-option").click((event) => {
if (event.currentTarget.attributes.name) {
let id = event.currentTarget.attributes.name.value;
let isChecked = event.currentTarget.checked;
game.settings.set(SYSTEM_RDD, id, isChecked);
2021-01-26 19:43:37 +01:00
}
});
}
async _updateObject(event, formData) {
this.close();
}
}