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 @@
-