diff --git a/module/environnement.js b/module/environnement.js
index efb8925d..508f4da7 100644
--- a/module/environnement.js
+++ b/module/environnement.js
@@ -1,7 +1,7 @@
import { SYSTEM_RDD } from "./constants.js";
import { Grammar } from "./grammar.js";
import { Misc } from "./misc.js";
-import { CompendiumTableHelpers, SystemCompendiums, CompendiumTable } from "./settings/system-compendiums.js";
+import { CompendiumTableHelpers, CompendiumTable } from "./settings/system-compendiums.js";
const RARETES = [
{ name: 'Commune', frequence: 54, min: 27, max: 108 },
@@ -54,25 +54,45 @@ export class Environnement {
}
async milieux() {
- 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].filter(env => env);
+ return Object.values(await this.mapMilieux());
+ }
+
+ async mapMilieux() {
+ const compendiumItems = await this.getElements(it => 1, it => ITEM_ENVIRONNEMENT_TYPES.includes(it.type));
+ return Misc.indexLowercase(this.getMilieuxSettings().concat(Environnement.listMilieux(compendiumItems)));
+ }
+
+ static listMilieux(items) {
+ return Misc.concat(items.map(it => Environnement.$itemToMilieux(it).filter(m => m)));
+ }
+
+ async autresMilieux(item) {
+ const mapMilieux = await this.mapMilieux();
+ const milieuxExistants = Environnement.$itemToMilieux(item).map(it => Grammar.toLowerCaseNoAccent(it));
+ return Object.keys(mapMilieux)
+ .filter(it => !milieuxExistants.includes(it))
+ .map(it => mapMilieux[it]);
+ }
+
+ static $itemToMilieux(item) {
+ return item.system.environnement.map(env => env.milieu);
}
getMilieuxSettings() {
- return game.settings.get(SYSTEM_RDD, SETTINGS_LISTE_MILIEUX).split(',');
+ return game.settings.get(SYSTEM_RDD, SETTINGS_LISTE_MILIEUX).split(',').map(it => it.trim()).filter(it => it != '');
}
async findEnvironnementsLike(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));
+ const milieux = await this.mapMilieux();
+ const searchLower = Grammar.toLowerCaseNoAccent(search);
+ const keys = Object.keys(milieux).filter(it => it.includes(searchLower));
+ if (keys.length > 1) {
+ const milieuExact = milieux[searchLower];
if (milieuExact) {
return [milieuExact];
}
}
- return milieux;
+ return keys.map(k => milieux[k]);
}
async searchToChatMessage(milieux, typeName) {
@@ -131,10 +151,8 @@ export class EnvironmentSheetHelper {
}
/* -------------------------------------------- */
- static async getData(sheet) {
- const formData = duplicate(sheet.item);
- const milieux = await game.system.rdd.environnement.milieux();
- const milieuxDisponibles = milieux.filter(it => !sheet.item.system.environnement.find(e => e.milieu == it));
+ static async getData(sheet, formData) {
+ const autresMilieux = await game.system.rdd.environnement.autresMilieux(sheet.item);
mergeObject(formData, {
title: formData.name,
isGM: game.user.isGM,
@@ -143,7 +161,7 @@ export class EnvironmentSheetHelper {
actorId: sheet.actor?.id,
editable: sheet.isEditable,
cssClass: sheet.isEditable ? "editable" : "locked",
- milieux: milieuxDisponibles
+ milieux: autresMilieux
});
return formData;
}
@@ -172,9 +190,10 @@ export class EnvironmentSheetHelper {
const name = $(event.currentTarget).val();
const rarete = Environnement.getRarete(name);
updated.rarete = rarete.name;
- updated.frequence = Math.min(
- Math.max(rarete.min, updated.frequence ?? rarete.frequence),
- rarete.max);
+ updated.frequence = rarete.frequence;
+ // updated.frequence = Math.min(
+ // Math.max(rarete.min, updated.frequence ?? rarete.frequence),
+ // rarete.max);
}
static async onAddMilieu(html, sheet, event) {
diff --git a/module/misc.js b/module/misc.js
index 67298074..849c0d52 100644
--- a/module/misc.js
+++ b/module/misc.js
@@ -72,6 +72,19 @@ export class Misc {
}
}
+ static indexLowercase(list) {
+ const obj = {};
+ const addToObj = (map, val) => {
+ const key = Grammar.toLowerCaseNoAccent(val);
+ if (key && !map[key]) map[key] = val
+ }
+ list.forEach(it => addToObj(obj, it))
+ return obj;
+ }
+ static concat(lists) {
+ return lists.reduce((a, b) => a.concat(b), []);
+ }
+
static classify(items, classifier = it => it.type) {
let itemsBy = {}
Misc.classifyInto(itemsBy, items, classifier)
diff --git a/module/rdd-commands.js b/module/rdd-commands.js
index 9b21f0ea..7b3deebe 100644
--- a/module/rdd-commands.js
+++ b/module/rdd-commands.js
@@ -403,11 +403,14 @@ export class RdDCommands {
const search = Misc.join(params, ' ');
const milieux = await game.system.rdd.environnement.findEnvironnementsLike(search);
if (milieux.length == 0) {
- return RdDCommands._chatAnswer(msg, 'Aucun milieu correspondant à ' + search);
+ const tous = Object.values(await game.system.rdd.environnement.milieux());
+ return RdDCommands._chatAnswer(msg, `Aucun milieu correspondant à '${search}'.
+
Milieux disponibles:
+