diff --git a/module/actor.js b/module/actor.js index 489d2968..a49c3a25 100644 --- a/module/actor.js +++ b/module/actor.js @@ -152,6 +152,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ setRollWindowsOpened(flag) { + // TODO: résoudre le souci lié aux ids dans les fenêtres roll this.rollWindowsOpened = flag; } @@ -769,7 +770,7 @@ export class RdDActor extends Actor { actor: this, competence: duplicate(this.getDraconicOuPossession()), canClose: false, - rencontre: await game.system.rencontresTMR.getReveDeDragon(force), + rencontre: await game.system.rdd.rencontresTMR.getReveDeDragon(force), tmr: true, use: { libre: false, conditions: false }, forceCarac: { 'reve-actuel': { label: "Rêve Actuel", value: this.getReveActuel() } } diff --git a/module/misc.js b/module/misc.js index e016508c..fb506356 100644 --- a/module/misc.js +++ b/module/misc.js @@ -24,7 +24,7 @@ export class Misc { } static sum() { - return (a, b) => a + b; + return (a, b) => Number(a) + Number(b); } static ascending(orderFunction = x => x) { @@ -41,6 +41,10 @@ export class Misc { return 0; } + static typeName(type, subType) { + return game.i18n.localize(`${type.toUpperCase()}.Type${Misc.upperFirst(subType)}`); + } + /** * Converts the value to an integer, or to 0 if undefined/null/not representing integer * @param {*} value value to convert to an integer using parseInt @@ -102,7 +106,11 @@ export class Misc { } static join(params, separator = '') { - return params?.reduce((a, b) => a + separator + b) ?? ''; + return params?.reduce(Misc.joining(separator)) ?? ''; + } + + static joining(separator = '') { + return (a, b) => a + separator + b; } static connectedGMOrUser(ownerId = undefined) { diff --git a/module/rdd-commands.js b/module/rdd-commands.js index 9f4b4bbb..5f0766da 100644 --- a/module/rdd-commands.js +++ b/module/rdd-commands.js @@ -21,74 +21,85 @@ const rddRollNumeric = /^(\d+)\s*([\+\-]?\d+)?\s*(s)?/; export class RdDCommands { static init() { - if (!game.system.rdd.commands) { - const rddCommands = new RdDCommands(); - rddCommands.registerCommand({ path: ["/aide"], func: (content, msg, params) => rddCommands.help(msg), descr: "Affiche l'aide pour toutes les commandes" }); - rddCommands.registerCommand({ path: ["/help"], func: (content, msg, params) => rddCommands.help(msg), descr: "Affiche l'aide pour toutes les commandes" }); + game.system.rdd.commands = new RdDCommands(); + } - rddCommands.registerCommand({ path: ["/liste", "comp"], func: (content, msg, params) => RdDRollTables.getCompetence('liste'), descr: "Affiche la liste des compétences" }); + constructor() { + this.commandsTable = undefined; + } - rddCommands.registerCommand({ path: ["/table", "queue"], func: (content, msg, params) => RdDRollTables.getQueue('liste'), descr: "Affiche la table des Queues de Dragon" }); - rddCommands.registerCommand({ path: ["/table", "ombre"], func: (content, msg, params) => RdDRollTables.getOmbre('liste'), descr: "Affiche la table des Ombres de Thanatos" }); - rddCommands.registerCommand({ path: ["/table", "tetehr"], func: (content, msg, params) => RdDRollTables.getTeteHR('liste'), descr: "Affiche la table des Têtes de Dragon pour Hauts Revants" }); - rddCommands.registerCommand({ path: ["/table", "tete"], func: (content, msg, params) => RdDRollTables.getTete('liste'), descr: "Affiche la table des Tête de Dragon pour tous" }); - rddCommands.registerCommand({ path: ["/table", "souffle"], func: (content, msg, params) => RdDRollTables.getSouffle('liste'), descr: "Affiche la table des Souffles de Dragon" }); - rddCommands.registerCommand({ path: ["/table", "tarot"], func: (content, msg, params) => RdDRollTables.getTarot('liste'), descr: "Affiche la table les cartes du Tarot Draconique" }); - rddCommands.registerCommand({ path: ["/table", "ideefixe"], func: (content, msg, params) => RdDRollTables.getIdeeFixe('liste'), descr: "Affiche la table des Idées fixes" }); - rddCommands.registerCommand({ path: ["/table", "desir"], func: (content, msg, params) => RdDRollTables.getDesirLancinant('liste'), descr: "Affiche la table des Désirs Lancinants" }); - rddCommands.registerCommand({ - path: ["/table", "rencontre"], func: (content, msg, params) => rddCommands.tableRencontres(msg, params), - descr: `Affiche la table des Rencontres + _registerCommands() { + this.commandsTable = {} + this.registerCommand({ path: ["/aide"], func: (content, msg, params) => this.help(msg), descr: "Affiche l'aide pour toutes les commandes" }); + this.registerCommand({ path: ["/help"], func: (content, msg, params) => this.help(msg), descr: "Affiche l'aide pour toutes les commandes" }); + + this.registerCommand({ path: ["/liste", "comp"], func: (content, msg, params) => RdDRollTables.getCompetence('liste'), descr: "Affiche la liste des compétences" }); + + this.registerCommand({ path: ["/table", "queue"], func: (content, msg, params) => RdDRollTables.getQueue('liste'), descr: "Affiche la table des Queues de Dragon" }); + this.registerCommand({ path: ["/table", "ombre"], func: (content, msg, params) => RdDRollTables.getOmbre('liste'), descr: "Affiche la table des Ombres de Thanatos" }); + this.registerCommand({ path: ["/table", "tetehr"], func: (content, msg, params) => RdDRollTables.getTeteHR('liste'), descr: "Affiche la table des Têtes de Dragon pour Hauts Revants" }); + this.registerCommand({ path: ["/table", "tete"], func: (content, msg, params) => RdDRollTables.getTete('liste'), descr: "Affiche la table des Tête de Dragon pour tous" }); + this.registerCommand({ path: ["/table", "souffle"], func: (content, msg, params) => RdDRollTables.getSouffle('liste'), descr: "Affiche la table des Souffles de Dragon" }); + this.registerCommand({ path: ["/table", "tarot"], func: (content, msg, params) => RdDRollTables.getTarot('liste'), descr: "Affiche la table les cartes du Tarot Draconique" }); + this.registerCommand({ path: ["/table", "ideefixe"], func: (content, msg, params) => RdDRollTables.getIdeeFixe('liste'), descr: "Affiche la table des Idées fixes" }); + this.registerCommand({ path: ["/table", "desir"], func: (content, msg, params) => RdDRollTables.getDesirLancinant('liste'), descr: "Affiche la table des Désirs Lancinants" }); + this.registerCommand({ + path: ["/table", "rencontre"], func: (content, msg, params) => this.tableRencontres(msg, params), + descr: `Affiche la table des Rencontres
/table rencontre deso affiche la table des rencontres en Désolation -
/table rencontre mauvaise affiche la table des mauvaises rencontres` }); +
/table rencontre mauvaise affiche la table des mauvaises rencontres` + }); - rddCommands.registerCommand({ path: ["/tirer", "comp"], func: (content, msg, params) => RdDRollTables.getCompetence('chat'), descr: "Tire une compétence au hasard" }); - rddCommands.registerCommand({ path: ["/tirer", "queue"], func: (content, msg, params) => RdDRollTables.getQueue('chat'), descr: "Tire une Queue de Dragon" }); - rddCommands.registerCommand({ path: ["/tirer", "ombre"], func: (content, msg, params) => RdDRollTables.getOmbre('chat'), descr: "Tire une Ombre de Thanatos" }); - rddCommands.registerCommand({ path: ["/tirer", "tetehr"], func: (content, msg, params) => RdDRollTables.getTeteHR('chat'), descr: "Tire une Tête de Dragon pour Hauts Revants" }); - rddCommands.registerCommand({ path: ["/tirer", "tete"], func: (content, msg, params) => RdDRollTables.getTete('chat'), descr: "Tire une Tête de Dragon" }); - rddCommands.registerCommand({ path: ["/tirer", "souffle"], func: (content, msg, params) => RdDRollTables.getSouffle('chat'), descr: "Tire un Souffle de Dragon" }); - rddCommands.registerCommand({ path: ["/tirer", "tarot"], func: (content, msg, params) => RdDRollTables.getTarot('chat'), descr: "Tire une carte du Tarot Draconique" }); - rddCommands.registerCommand({ path: ["/tirer", "ideefixe"], func: (content, msg, params) => RdDRollTables.getIdeeFixe('chat'), descr: "Tire une Idée fixe" }); - rddCommands.registerCommand({ path: ["/tirer", "desir"], func: (content, msg, params) => RdDRollTables.getDesirLancinant('chat'), descr: "Tire un Désir Lancinant" }); - rddCommands.registerCommand({ path: ["/tirer", "rencontre"], func: (content, msg, params) => rddCommands.getRencontreTMR(params), descr: `Détermine une rencontre dans les TMR (synonyme de "/tmrr")` }); + this.registerCommand({ path: ["/tirer", "comp"], func: (content, msg, params) => RdDRollTables.getCompetence('chat'), descr: "Tire une compétence au hasard" }); + this.registerCommand({ path: ["/tirer", "queue"], func: (content, msg, params) => RdDRollTables.getQueue('chat'), descr: "Tire une Queue de Dragon" }); + this.registerCommand({ path: ["/tirer", "ombre"], func: (content, msg, params) => RdDRollTables.getOmbre('chat'), descr: "Tire une Ombre de Thanatos" }); + this.registerCommand({ path: ["/tirer", "tetehr"], func: (content, msg, params) => RdDRollTables.getTeteHR('chat'), descr: "Tire une Tête de Dragon pour Hauts Revants" }); + this.registerCommand({ path: ["/tirer", "tete"], func: (content, msg, params) => RdDRollTables.getTete('chat'), descr: "Tire une Tête de Dragon" }); + this.registerCommand({ path: ["/tirer", "souffle"], func: (content, msg, params) => RdDRollTables.getSouffle('chat'), descr: "Tire un Souffle de Dragon" }); + this.registerCommand({ path: ["/tirer", "tarot"], func: (content, msg, params) => RdDRollTables.getTarot('chat'), descr: "Tire une carte du Tarot Draconique" }); + this.registerCommand({ path: ["/tirer", "ideefixe"], func: (content, msg, params) => RdDRollTables.getIdeeFixe('chat'), descr: "Tire une Idée fixe" }); + this.registerCommand({ path: ["/tirer", "desir"], func: (content, msg, params) => RdDRollTables.getDesirLancinant('chat'), descr: "Tire un Désir Lancinant" }); + this.registerCommand({ path: ["/tirer", "rencontre"], func: (content, msg, params) => this.getRencontreTMR(params), descr: `Détermine une rencontre dans les TMR (synonyme de "/tmrr")` }); - rddCommands.registerCommand({ path: ["/meteo"], func: (content, msg, params) => rddCommands.getMeteo(msg, params), descr: "Propose une météo marine" }); - rddCommands.registerCommand({ path: ["/nom"], func: (content, msg, params) => RdDNameGen.getName(msg, params), descr: "Génère un nom aléatoire" }); + this.registerCommand({ path: ["/meteo"], func: (content, msg, params) => this.getMeteo(msg, params), descr: "Propose une météo marine" }); + this.registerCommand({ path: ["/nom"], func: (content, msg, params) => RdDNameGen.getName(msg, params), descr: "Génère un nom aléatoire" }); - rddCommands.registerCommand({ - path: ["/tmr"], func: (content, msg, params) => rddCommands.findTMR(msg, params), - descr: `Cherche où se trouve une case des Terres médianes + this.registerCommand({ + path: ["/tmr"], func: (content, msg, params) => this.findTMR(msg, params), + descr: `Cherche où se trouve une case des Terres médianes
/tmr sord indique que la cité Sordide est en D13 -
/tmr foret donne la liste des TMR dont le nom contient "foret" (donc, toutes les forêts)` }); - rddCommands.registerCommand({ - path: ["/tmra"], func: (content, msg, params) => rddCommands.getTMRAleatoire(msg, params), - descr: `Tire une case aléatoire des Terres médianes +
/tmr foret donne la liste des TMR dont le nom contient "foret" (donc, toutes les forêts)` + }); + this.registerCommand({ + path: ["/tmra"], func: (content, msg, params) => this.getTMRAleatoire(msg, params), + descr: `Tire une case aléatoire des Terres médianes
/tmra forêt détermine une 'forêt' aléatoire -
/tmra détermine une case aléatoire dans toutes les TMR` }); - rddCommands.registerCommand({ - path: ["/tmrr"], func: (content, msg, params) => rddCommands.getRencontreTMR(params), - descr: `Détermine une rencontre dans les TMR +
/tmra détermine une case aléatoire dans toutes les TMR` + }); + this.registerCommand({ + path: ["/tmrr"], func: (content, msg, params) => this.getRencontreTMR(params), + descr: `Détermine une rencontre dans les TMR
/tmrr forêt détermine une rencontre aléatoire en 'forêt'
/tmrr mauvaise détermine une mauvaise rencontre aléatoire -
/tmrr for 47 détermine la rencontre en 'forêt' pour un jet de dé de 47` }); +
/tmrr for 47 détermine la rencontre en 'forêt' pour un jet de dé de 47` + }); - rddCommands.registerCommand({ - path: ["/xp", "comp"], func: (content, msg, params) => rddCommands.getCoutXpComp(msg, params), - descr: `Détermine le coût d'expérience pour augmenter une compétence. Exemples: + this.registerCommand({ + path: ["/xp", "comp"], func: (content, msg, params) => this.getCoutXpComp(msg, params), + descr: `Détermine le coût d'expérience pour augmenter une compétence. Exemples:
/xp comp -6 1: pour passer de -6 à +1
/xp comp +4: pour atteindre le niveau 4 (depuis +3)` - }); + }); - rddCommands.registerCommand({ - path: ["/xp", "carac"], func: (content, msg, params) => rddCommands.getCoutXpCarac(msg, params), - descr: `Détermine le coût d'expérience pour augmenter une caractéristique. Exemples: + this.registerCommand({ + path: ["/xp", "carac"], func: (content, msg, params) => this.getCoutXpCarac(msg, params), + descr: `Détermine le coût d'expérience pour augmenter une caractéristique. Exemples:
/xp carac 15: coût pour atteindre 15 (depuis 14)` - }); + }); - rddCommands.registerCommand({ - path: ["/rdd"], func: (content, msg, params) => rddCommands.rollRdd(msg, params), - descr: `Effectue un jet de dés dans la table de résolution. Exemples: + this.registerCommand({ + path: ["/rdd"], func: (content, msg, params) => this.rollRdd(msg, params), + descr: `Effectue un jet de dés dans la table de résolution. Exemples:
/rdd ouvre la table de résolution
/rdd 10 3 effectue un jet 10 à +3
/rdd 15 -2 effectue un jet 15 à -2 @@ -96,57 +107,58 @@ export class RdDCommands {
/rdd Vue Vigilance -2 effectue un jet de Vue/Vigilance à -2 pour les tokens sélectionnés
/rdd vol déser +2 effectue un jet de Volonté/Survie en désert à +2 pour les tokens sélectionnés ` - }); - rddCommands.registerCommand({ path: ["/ddr"], func: (content, msg, params) => rddCommands.rollDeDraconique(msg), descr: "Lance un Dé Draconique" }); + }); + this.registerCommand({ path: ["/ddr"], func: (content, msg, params) => this.rollDeDraconique(msg), descr: "Lance un Dé Draconique" }); - rddCommands.registerCommand({ - path: ["/payer"], func: (content, msg, params) => RdDUtility.afficherDemandePayer(params[0], params[1]), - descr: `Demande aux joueurs de payer un montant. Exemples: + this.registerCommand({ + path: ["/payer"], func: (content, msg, params) => RdDUtility.afficherDemandePayer(params[0], params[1]), + descr: `Demande aux joueurs de payer un montant. Exemples:
/payer 5s 10d permet d'envoyer un message pour payer 5 sols et 10 deniers
/payer 10d permet d'envoyer un message pour payer 10 deniers` - }); - rddCommands.registerCommand({ - path: ["/astro"], func: (content, msg, params) => RdDUtility.afficherHeuresChanceMalchance(Misc.join(params, ' ')), - descr: `Affiche les heures de chance et de malchance selon l'heure de naissance donnée en argument. Exemples pour l'heure de la Lyre: + }); + this.registerCommand({ + path: ["/astro"], func: (content, msg, params) => RdDUtility.afficherHeuresChanceMalchance(Misc.join(params, ' ')), + descr: `Affiche les heures de chance et de malchance selon l'heure de naissance donnée en argument. Exemples pour l'heure de la Lyre:
/astro 7
/astro Lyre
/astro Lyr` - }); + }); - rddCommands.registerCommand({ - path: ["/signe", "+"], func: (content, msg, params) => rddCommands.creerSignesDraconiques(), - descr: "Crée un signe draconique et l'ajoute aux haut-rêvants choisis." - }); + this.registerCommand({ + path: ["/signe", "+"], func: (content, msg, params) => this.creerSignesDraconiques(), + descr: "Crée un signe draconique et l'ajoute aux haut-rêvants choisis." + }); - rddCommands.registerCommand({ - path: ["/signe", "-"], func: (content, msg, params) => rddCommands.supprimerSignesDraconiquesEphemeres(), - descr: "Supprime les signes draconiques éphémères" - }); + this.registerCommand({ + path: ["/signe", "-"], func: (content, msg, params) => this.supprimerSignesDraconiquesEphemeres(), + descr: "Supprime les signes draconiques éphémères" + }); - rddCommands.registerCommand({ - path: ["/stress"], func: (content, msg, params) => rddCommands.distribuerStress(params), - descr: `Distribue du stress aux personnages. Exemples: + this.registerCommand({ + path: ["/stress"], func: (content, msg, params) => this.distribuerStress(params), + descr: `Distribue du stress aux personnages. Exemples:
/stress : Ouvre une fenêtre pour donner du stress ou de l'expérience à un ensemble de personnages
/stress 6 : Distribue 6 points des Stress à tout les personnages joueurs, sans raison renseignée
/stress 6 Tigre : Distribue 6 points des Stress à tout les personnages joueurs, à cause d'un Tigre (Vert)
/stress 6 Glou Paulo : Distribue 6 points de Stress au personnage Paulon ou au personnage joueur Paulo, à cause d'un Glou` - }); + }); - rddCommands.registerCommand({ - path: ["/chrono"], func: (content, msg, params) => DialogChronologie.create(), - descr: `Enregistre une entrée de chronologie dans un article de journal` - }); - - game.system.rdd.commands = rddCommands; - } - } - constructor() { - this.commandsTable = {}; + this.registerCommand({ + path: ["/chrono"], func: (content, msg, params) => DialogChronologie.create(), + descr: `Enregistre une entrée de chronologie dans un article de journal` + }); } /* -------------------------------------------- */ registerCommand(command) { - this._addCommand(this.commandsTable, command.path, '', command); + this._addCommand(this.getCommands(), command.path, '', command); + } + + getCommands() { + if (!this.commandsTable){ + this._registerCommands(); + } + return this.commandsTable; } /* -------------------------------------------- */ @@ -194,7 +206,7 @@ export class RdDCommands { } process(command, params, content, msg) { - return this._processCommand(this.commandsTable, command, params, content, msg); + return this._processCommand(this.getCommands(), command, params, content, msg); } async _processCommand(commandsTable, name, params, content = '', msg = {}, path = "") { @@ -225,7 +237,7 @@ export class RdDCommands { } async help(msg, table) { let commands = [] - this._buildSubTableHelp(commands, table || this.commandsTable); + this._buildSubTableHelp(commands, table ?? this.getCommands()); let html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/settings/dialog-aide-commands.html", { commands: commands }); let d = new Dialog( @@ -265,7 +277,7 @@ export class RdDCommands { /* -------------------------------------------- */ async getRencontreTMR(params) { if (params.length == 1 || params.length == 2) { - return game.system.rencontresTMR.rollRencontre(params[0], params[1]) + return game.system.rdd.rencontresTMR.rollRencontre(params[0], params[1]) } return false; } @@ -358,7 +370,7 @@ export class RdDCommands { if (solvedTerrain == undefined) { return RdDCommands._chatAnswer(msg, 'Aucune TMR correspondant à ' + search); } - return game.system.rencontresTMR.chatTable(solvedTerrain); + return game.system.rdd.rencontresTMR.chatTable(solvedTerrain); } return false; } diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index 0c5e0439..341191ca 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -575,7 +575,7 @@ export class RdDTMRDialog extends Dialog { async _jetDeRencontre(tmr) { let rencontre = this.lookupRencontreExistente(tmr); if (rencontre) { - return game.system.rencontresTMR.calculRencontre(rencontre, tmr); + return game.system.rdd.rencontresTMR.calculRencontre(rencontre, tmr); } let locTMR = (this.isDemiReveCache() ? TMRUtility.getTMRType(tmr.coord) + " ??" @@ -584,7 +584,7 @@ export class RdDTMRDialog extends Dialog { let myRoll = await RdDDice.rollTotal("1dt", { showDice: SHOW_DICE }); if (myRoll == 7) { this._tellToUser(myRoll + ": Rencontre en " + locTMR); - return await game.system.rencontresTMR.getRencontreAleatoire(tmr, this.actor.isMauvaiseRencontre()) + return await game.system.rdd.rencontresTMR.getRencontreAleatoire(tmr, this.actor.isMauvaiseRencontre()) } else { this._tellToUser(myRoll + ": Pas de rencontre en " + locTMR); } diff --git a/module/settings/system-compendiums.js b/module/settings/system-compendiums.js index 31ebb69d..b4d95bc4 100644 --- a/module/settings/system-compendiums.js +++ b/module/settings/system-compendiums.js @@ -192,7 +192,7 @@ export class SystemCompendiumTable { } typeName() { - return game.i18n.localize(`${this.type.toUpperCase()}.Type${Misc.upperFirst(this.subType)}`); + return Misc.typeName(this.type, this.subType); } applyType(filter) { return it => it.type == this.subType && filter(it); diff --git a/module/tmr-rencontres.js b/module/tmr-rencontres.js index 8defba46..44cb488e 100644 --- a/module/tmr-rencontres.js +++ b/module/tmr-rencontres.js @@ -10,7 +10,7 @@ export class TMRRencontres { static init() { const tmrRencontre = new TMRRencontres(); - game.system.rencontresTMR = tmrRencontre; + game.system.rdd.rencontresTMR = tmrRencontre; } diff --git a/module/tmr/present-cites.js b/module/tmr/present-cites.js index 2ad65244..ff7027e4 100644 --- a/module/tmr/present-cites.js +++ b/module/tmr/present-cites.js @@ -46,7 +46,7 @@ export class PresentCites extends Draconique { } async choisirUnPresent(casetmr, onChoixPresent) { - const presents = await game.system.rencontresTMR.getPresentsCite() + const presents = await game.system.rdd.rencontresTMR.getPresentsCite() const buttons = {}; presents.forEach(r => buttons['present'+r.id] = { icon: '', label: r.name, callback: async () => onChoixPresent(r) }); let d = new Dialog({ diff --git a/templates/item-rencontresTMR-sheet.html b/templates/item-rencontresTMR-sheet.html deleted file mode 100644 index 7cbaf61a..00000000 --- a/templates/item-rencontresTMR-sheet.html +++ /dev/null @@ -1,7 +0,0 @@ -
- {{>"systems/foundryvtt-reve-de-dragon/templates/header-item.html"}} - {{!-- Sheet Body --}} -
- {{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}} -
-