diff --git a/module/environnement.js b/module/environnement.js
index 38b8c554..9130cd39 100644
--- a/module/environnement.js
+++ b/module/environnement.js
@@ -58,7 +58,7 @@ export class Environnement {
const milieux = new Set(this.getMilieuxSettings());
const elements = await this.getElements(it => 1, it => ITEM_ENVIRONNEMENT_TYPES.includes(it.type));
elements.forEach(it => it.system.environnement.forEach(env => milieux.add(env.milieu)))
- return [...milieux];
+ return [...milieux].filter(env => env);
}
getMilieuxSettings() {
@@ -66,22 +66,34 @@ export class Environnement {
}
async findEnvironnementsLike(search) {
- return (await this.milieux()).filter(it => Grammar.includesLowerCaseNoAccent(it, search));
+ const milieux = (await this.milieux()).filter(it => Grammar.includesLowerCaseNoAccent(it, search));
+ if (milieux.length > 1){
+ const milieuExact = milieux.find(it => Grammar.equalsInsensitive(it, search));
+ if (milieuExact) {
+ return [milieuExact];
+ }
+ }
+ return milieux;
}
- async searchToChatMessage(search) {
- const table = await this.buildEnvironnementTable(search);
- await CompendiumTableHelpers.tableToChatMessage(table, 'Item', ITEM_ENVIRONNEMENT_TYPES, `ressources en "${search}"`);
+ async searchToChatMessage(milieux, typeName) {
+ const table = await this.buildEnvironnementTable(milieux);
+ await CompendiumTableHelpers.tableToChatMessage(table, 'Item', ITEM_ENVIRONNEMENT_TYPES, typeName);
return true
}
- async getRandom(search) {
- const table = await this.buildEnvironnementTable(search);
- return await CompendiumTableHelpers.getRandom(table, 'Item', ITEM_ENVIRONNEMENT_TYPES, undefined, `ressources en "${search}"`);
+ async getRandom(milieux, typeName) {
+ const table = await this.buildEnvironnementTable(milieux);
+ return await CompendiumTableHelpers.getRandom(table, 'Item', ITEM_ENVIRONNEMENT_TYPES, undefined, typeName);
}
- async buildEnvironnementTable(search) {
- const itemRareteEnMilieu = item => item.system?.environnement.find(env => Grammar.includesLowerCaseNoAccent(env.milieu, search));
+ async buildEnvironnementTable(milieux) {
+ const filterMilieux = item => item.system?.environnement.filter(env => milieux.includes(env.milieu));
+ const itemRareteEnMilieu = item => {
+ const raretes = filterMilieux(item);
+ const frequenceMax = Math.max(raretes.map(env => env.frequence));
+ return raretes.find(env => env.frequence == frequenceMax);
+ }
const itemFrequenceEnMilieu = item => itemRareteEnMilieu(item)?.frequence ?? 0;
const isPresentEnMilieu = item => itemFrequenceEnMilieu(item) > 0;
return await this.table.buildTable(itemFrequenceEnMilieu, isPresentEnMilieu);
@@ -139,7 +151,7 @@ export class EnvironmentSheetHelper {
static activateListeners(sheet, html) {
if (!sheet.options.editable) return;
- html.find("a.milieu-add").click(event => EnvironmentSheetHelper.onAddMilieu(sheet, event));
+ html.find("a.milieu-add").click(event => EnvironmentSheetHelper.onAddMilieu(html, sheet, event));
html.find("div.environnement-milieu a.milieu-delete").click(event => EnvironmentSheetHelper.onDeleteMilieu(sheet, event));
html.find("div.environnement-milieu select.environnement-rarete").change(event => EnvironmentSheetHelper.onChange(sheet, event,
(updated) => {
@@ -156,8 +168,8 @@ export class EnvironmentSheetHelper {
}));
}
- static async onAddMilieu(sheet, event) {
- const milieu = $("input.input-selection-milieu").val();
+ static async onAddMilieu(html, sheet, event) {
+ const milieu = html.find('input.input-selection-milieu').val();
if (!milieu) {
ui.notifications.warn(`Choisissez le milieu dans lequel se trouve le/la ${sheet.item.name}`);
return
diff --git a/module/rdd-commands.js b/module/rdd-commands.js
index f567dcfb..9b21f0ea 100644
--- a/module/rdd-commands.js
+++ b/module/rdd-commands.js
@@ -22,7 +22,20 @@ const rddRollNumeric = /^(\d+)\s*([\+\-]?\d+)?\s*(s)?/;
export class RdDCommands {
static init() {
- game.system.rdd.commands = new RdDCommands();
+ const rddCommands = new RdDCommands();
+
+ Hooks.on("chatMessage", (html, content, msg) => {
+ if (content[0] == '/') {
+ let regExp = /(\S+)/g;
+ let commands = content.match(regExp);
+ if (rddCommands.processChatCommand(commands, content, msg)) {
+ return false;
+ }
+ }
+ return true;
+ });
+
+ game.system.rdd.commands = rddCommands;
}
constructor() {
@@ -50,8 +63,8 @@ export class RdDCommands {
/table rencontre deso affiche la table des rencontres en Désolation
/table rencontre mauvaise affiche la table des mauvaises rencontres`
});
- this.registerCommand({ path: ["/table", "milieu"], func: (content, msg, params) => this.tableMilieu(msg, params,'liste'), descr: "Affiche la table des ressource naturelles pour un milieu donné" });
-
+ this.registerCommand({ path: ["/table", "milieu"], func: (content, msg, params) => this.tableMilieu(msg, params, 'liste'), descr: "Affiche la table des ressource naturelles pour un milieu donné" });
+
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" });
@@ -63,7 +76,7 @@ export class RdDCommands {
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")` });
this.registerCommand({ path: ["/tirer", "milieu"], func: (content, msg, params) => this.tableMilieu(msg, params, 'chat'), descr: "Effectue un tirage dans la table desressource naturelles pour un milieu donné" });
-
+
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" });
@@ -154,14 +167,7 @@ export class RdDCommands {
/* -------------------------------------------- */
registerCommand(command) {
- this._addCommand(this.getCommands(), command.path, '', command);
- }
-
- getCommands() {
- if (!this.commandsTable){
- this._registerCommands();
- }
- return this.commandsTable;
+ this._addCommand(this.commandsTable, command.path, '', command);
}
/* -------------------------------------------- */
@@ -198,18 +204,29 @@ export class RdDCommands {
processChatCommand(commandLine, content = '', msg = {}) {
// Setup new message's visibility
let rollMode = game.settings.get("core", "rollMode");
- if (["gmroll", "blindroll"].includes(rollMode)) msg["whisper"] = ChatMessage.getWhisperRecipients("GM");
- if (rollMode === "blindroll") msg["blind"] = true;
+ if (["gmroll", "blindroll"].includes(rollMode)) {
+ msg["whisper"] = ChatMessage.getWhisperRecipients("GM");
+ }
+ if (rollMode === "blindroll"){
+ msg["blind"] = true;
+ }
msg["type"] = 0;
+ if (!this.commandsTable) {
+ this._registerCommands();
+ }
+
let command = commandLine[0].toLowerCase();
- let params = commandLine.slice(1);
-
- return this.process(command, params, content, msg);
+ if (this._isCommandHandled(command)) {
+ let params = commandLine.slice(1);
+ this._processCommand(this.commandsTable, command, params, content, msg);
+ return true;
+ }
+ return false;
}
- process(command, params, content, msg) {
- return this._processCommand(this.getCommands(), command, params, content, msg);
+ _isCommandHandled(command){
+ return this.commandsTable[command] != undefined;
}
async _processCommand(commandsTable, name, params, content = '', msg = {}, path = "") {
@@ -217,18 +234,20 @@ export class RdDCommands {
path = path + name + " ";
if (command && command.subTable) {
if (params[0]) {
- return this._processCommand(command.subTable, params[0], params.slice(1), content, msg, path)
+ this._processCommand(command.subTable, params[0], params.slice(1), content, msg, path)
}
else {
this.help(msg, command.subTable);
- return true;
}
+ return true;
}
if (command && command.func) {
- const result = await command.func(content, msg, params);
- if (result == false) {
- RdDCommands._chatAnswer(msg, command.descr);
- }
+ new Promise(async () => {
+ const result = await command.func(content, msg, params);
+ if (result == false) {
+ RdDCommands._chatAnswer(msg, command.descr);
+ }
+ });
return true;
}
return false;
@@ -240,7 +259,7 @@ export class RdDCommands {
}
async help(msg, table) {
let commands = []
- this._buildSubTableHelp(commands, table ?? this.getCommands());
+ this._buildSubTableHelp(commands, table ?? this.commandsTable);
let html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/settings/dialog-aide-commands.html", { commands: commands });
let d = new Dialog(
@@ -366,7 +385,7 @@ export class RdDCommands {
}
return false;
}
-
+
async tableRencontres(msg, params) {
if (params && params.length > 0) {
const search = Misc.join(params, ' ');
@@ -382,15 +401,20 @@ export class RdDCommands {
async tableMilieu(msg, params, toChat) {
if (params && params.length > 0) {
const search = Misc.join(params, ' ');
- const searches = game.system.rdd.environnement.findEnvironnementsLike(search);
- if (searches.length == 0) {
+ const milieux = await game.system.rdd.environnement.findEnvironnementsLike(search);
+ if (milieux.length == 0) {
return RdDCommands._chatAnswer(msg, 'Aucun milieu correspondant à ' + search);
}
+ if (milieux.length > 1) {
+ ui.notifications.warn(`Plusieurs milieux correspondent à '${search}':
+