import { SYSTEM_RDD } from "./constants.js"; import { Misc } from "./misc.js"; const listeReglesOptionelles = [ { name: 'recul', group: 'Règles de combat', descr: "Appliquer le recul en cas de particulière en force ou de charge" }, { name: 'resistanceArmeParade', group: 'Règles de combat', descr: "Faire le jet de résistance des armes lors de parades pouvant les endommager" }, { name: 'deteriorationArmure', group: 'Règles de combat', descr: "Tenir compte de la détérioration des armures" }, { name: 'defenseurDesarme', group: 'Règles de combat', 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" }, { name: 'categorieParade', group: 'Règles de combat', descr: "Le défenseur doit obtenir une significative en cas de parade avec des armes de catégories différentes" }, { name: 'tripleSignificative', group: 'Règles de combat', 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" }, { name: 'degat-minimum-malus-libre-simple', group: 'Règles de combat', 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 1 résultat est inférieur à 4, alors il devient 4.", default: false }, { name: 'degat-minimum-malus-libre', group: 'Règles de combat', 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 }, { name: 'degat-ajout-malus-libre', group: 'Règles de combat', 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 }, { name: 'astrologie', group: 'Règles générales', descr: "Appliquer les ajustements astrologiques aux jets de chance et aux rituels"}, { name: 'afficher-prix-joueurs', group: 'Règles générales', descr: "Afficher le prix de l'équipement des joueurs", uniquementJoueur: true}, { name: 'appliquer-fatigue', group: 'Règles générales', descr: "Appliquer les règles de fatigue"}, { name: 'afficher-colonnes-reussite', group: 'Règles générales', descr: "Afficher le nombre de colonnes de réussite ou d'échec", default: false }, { name: 'confirmation-tmr', group: 'Confirmations', descr: "Confirmer pour monter dans les TMR", scope: "client"}, { name: 'confirmation-vider', group: 'Confirmations', descr: "Confirmer pour vider l'équipement", scope: "client"}, { name: 'confirmation-supprimer-lien-acteur', group: 'Confirmations', descr: "Confirmer pour détacher un animal/suivant/véhicule", scope: "client"}, { name: 'confirmation-supprimer-equipement', group: 'Confirmations', descr: "Confirmer la suppression des équipements", scope: "client"}, { name: 'confirmation-supprimer-oeuvre', group: 'Confirmations', descr: "Confirmer la suppression des oeuvres", scope: "client"}, { name: 'confirmation-supprimer-connaissance', group: 'Confirmations', descr: "Confirmer la suppression des connaissances", scope: "client"}, { name: 'confirmation-supprimer-draconique', group: 'Confirmations', descr: "Confirmer la suppression des queues, souffles, têtes", scope: "client"}, { name: 'confirmation-supprimer-effet', group: 'Confirmations', descr: "Confirmer la suppression des effets", scope: "client"}, { name: 'confirmation-supprimer-competence', group: 'Confirmations', descr: "Confirmer la suppression des compétences", scope: "client"}, { name: 'confirmation-supprimer-autres', group: 'Confirmations', descr: "Confirmer la suppression des autres types d'Objets", scope: "client"}, ]; const uniquementJoueur = listeReglesOptionelles.filter(it => it.uniquementJoueur).map(it=>it.name); export class ReglesOptionelles extends FormApplication { static init() { for (const regle of listeReglesOptionelles) { const name = regle.name; const id = ReglesOptionelles._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 }); } game.settings.registerMenu(SYSTEM_RDD, "rdd-options-regles", { name: "Choisir les règles optionelles", label: "Choix des règles optionelles", hint: "Ouvre la fenêtre de sélection des règles optionelles", icon: "fas fa-bars", type: ReglesOptionelles }); } constructor(...args) { super(...args); } static _getIdRegle(name) { return `rdd-option-${name}`; } static get defaultOptions() { const options = super.defaultOptions; mergeObject(options, { id: "optional-settings", template: "systems/foundryvtt-reve-de-dragon/templates/regles-optionelles.html", height: 600, width: 450, minimizable: false, closeOnSubmit: true, title: "Règles optionnelles" }); return options; } getData() { let formData = super.getData(); const regles = listeReglesOptionelles.filter(it => game.user.isGM || it.scope == "client").map(it => { it = duplicate(it); it.id = ReglesOptionelles._getIdRegle(it.name); it.active = ReglesOptionelles.isUsing(it.name); return it; }); formData.regles = regles; formData.groups = Misc.classify(regles, it => it.group); return formData; } static isUsing(name) { if (game.user.isGM && uniquementJoueur.includes(name)) { return true; } return game.settings.get(SYSTEM_RDD, ReglesOptionelles._getIdRegle(name)); } static isSet(name) { return ReglesOptionelles.isUsing(name); } static set(name, value) { return game.settings.set(SYSTEM_RDD, ReglesOptionelles._getIdRegle(name), value ? true: false); } 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); } }); } async _updateObject(event, formData) { this.close(); } }