diff --git a/module/environnement.js b/module/environnement.js
index f11b5493..891126d4 100644
--- a/module/environnement.js
+++ b/module/environnement.js
@@ -1,109 +1,78 @@
import { SYSTEM_RDD } from "./constants.js";
import { Grammar } from "./grammar.js";
+import { HtmlUtility } from "./html-utility.js";
import { Misc } from "./misc.js";
-import { CompendiumTableHelpers, CompendiumTable } from "./settings/system-compendiums.js";
+import { CompendiumTableHelpers, CompendiumTable, SystemCompendiums } from "./settings/system-compendiums.js";
import { RdDRaretes } from "./tirage/raretes.js";
-const SETTINGS_LISTE_MILIEUX = "liste-milieux";
-const MILIEUX = [
- "Collines",
- "Cours d'eau",
- "Déserts",
- "Forêts",
- "Marais",
- "Maritimes",
- "Montagnes",
- "Plaines",
- "Sous-sols"
-]
-const ITEM_ENVIRONNEMENT_TYPES = [
- 'herbe', 'plante', 'ingredient', 'faune'
-]
+
+const COMPENDIUMS_RECHERCHE = 'compendiums-recherche';
+const TYPE_ITEMS_NATURELS = ["faune", "herbe", "plante", "ingredient"];
export class Environnement {
-
- static typesEnvironnement() {
- return ITEM_ENVIRONNEMENT_TYPES
- }
-
static init() {
- game.settings.register(SYSTEM_RDD, SETTINGS_LISTE_MILIEUX, {
- name: "Liste des milieux proposés",
- hint: "Liste des milieux proposés pour la faune&flore, séparés par des virgules",
+ game.settings.register(SYSTEM_RDD, COMPENDIUMS_RECHERCHE, {
+ name: COMPENDIUMS_RECHERCHE,
+ default: [
+ SystemCompendiums.getCompendium('faune-flore-mineraux'),
+ SystemCompendiums.getCompendium('equipement')
+ ],
scope: "world",
- config: true,
- default: MILIEUX.reduce(Misc.joining(',')),
- type: String
+ config: false,
+ type: Object
});
+
game.system.rdd.environnement = new Environnement();
+ Hooks.once('ready', () => game.system.rdd.environnement.onReady());
}
constructor() {
- this.table = new CompendiumTable('faune-flore-mineraux', 'Item', ITEM_ENVIRONNEMENT_TYPES)
+ this.compendiums = [];
+ this.compendiumTables = [];
+ this.mapMilieux = {}
+ }
+
+ async onReady() {
+ await this.$prepareCompendiums()
}
async milieux() {
- return Object.values(await this.mapMilieux());
+ return Object.values(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)));
+ async saveCompendiums(compendiumIds) {
+ game.settings.set(SYSTEM_RDD, COMPENDIUMS_RECHERCHE, compendiumIds);
+ await this.$prepareCompendiums();
}
- static listMilieux(items) {
- return Misc.concat(items.map(it => Environnement.$itemToMilieux(it).filter(m => m)));
+ async $prepareCompendiums() {
+ this.compendiums = game.settings.get(SYSTEM_RDD, COMPENDIUMS_RECHERCHE);
+ this.compendiumTables = this.compendiums.map(it => new CompendiumTable(it, 'Item'));
+ const compendiumItems = await this.getElements(it => 1, it => it.isInventaire());
+ const fromCompendiums = Misc.concat(compendiumItems.map(it => it.getMilieux().filter(m => m)));
+ this.mapMilieux = Misc.indexLowercase(fromCompendiums);
}
async autresMilieux(item) {
- const mapMilieux = await this.mapMilieux();
- const milieuxExistants = Environnement.$itemToMilieux(item).map(it => Grammar.toLowerCaseNoAccent(it));
- return Object.keys(mapMilieux)
+ const milieuxExistants = item.getMilieux().map(it => Grammar.toLowerCaseNoAccent(it));
+ return Object.keys(this.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(',').map(it => it.trim()).filter(it => it != '');
- }
-
- async findEnvironnementsLike(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 keys.map(k => milieux[k]);
- }
-
- async searchToChatMessage(milieux, typeName) {
- const table = await this.buildEnvironnementTable(milieux, it => it.isEnvironnement());
- await CompendiumTableHelpers.tableToChatMessage(table, 'Item', ITEM_ENVIRONNEMENT_TYPES, typeName);
- return true
- }
-
- async getRandom(milieux, typeName) {
- const table = await this.buildEnvironnementTable(milieux, it => it.isEnvironnement());
- return await CompendiumTableHelpers.getRandom(table, 'Item', ITEM_ENVIRONNEMENT_TYPES, undefined, typeName);
- }
-
- async buildEnvironnementTable(milieux, filter) {
- if (!milieux) {
- milieux = await this.milieux()
- }
- return await this.table.buildTable(it => it.getFrequence(), filter);
+ .map(it => this.mapMilieux[it]);
}
async getElements(itemFrequence, filter) {
- return await this.table.getContent(itemFrequence, filter);
+ const compendiumsElement = await Promise.all(
+ this.compendiumTables.map(async compTable => await compTable.getContent(itemFrequence, filter))
+ );
+ return compendiumsElement.reduce((a, b) => a.concat(b))
+ }
+
+ async buildTable(itemFrequence, filter = it => true) {
+ if (!itemFrequence) {
+ itemFrequence = it => it.getFrequence()
+ }
+ const elements = await this.getElements(itemFrequence, filter);;
+ return CompendiumTableHelpers.buildTable(elements, itemFrequence);
}
}
@@ -130,6 +99,8 @@ export class EnvironmentSheetHelper {
}
static activateListeners(sheet) {
+ HtmlUtility.showControlWhen(sheet.html.find("div.description-milieu"), TYPE_ITEMS_NATURELS.includes(sheet.item.type));
+
if (!sheet.options.editable) return;
sheet.html.find("input.input-selection-milieu").keypress(event => {
diff --git a/module/item.js b/module/item.js
index 12dc1749..8669ce38 100644
--- a/module/item.js
+++ b/module/item.js
@@ -35,7 +35,7 @@ const typesObjetsConnaissance = ["meditation", "recettealchimique", "sort"]
const typesObjetsEffet = ["possession", "poison", "maladie"]
const typesObjetsCompetence = ["competence", "competencecreature"]
const typesObjetsTemporels = ["poison", "maladie", "queue", "ombre", "souffle", "signedraconique", "rencontre"]
-const typesEnvironnement = Environnement.typesEnvironnement();
+const typesEnvironnement = typesInventaireMateriel;
const encBrin = 0.00005; // un brin = 1 décigramme = 1/10g = 1/10000kg = 1/20000 enc
const encPepin = 0.0007; /* un pépin de gemme = 1/10 cm3 = 1/1000 l = 3.5/1000 kg = 7/2000 kg = 7/1000 enc
densité 3.5 (~2.3 à 4, parfois plus) -- https://www.juwelo.fr/guide-des-pierres/faits-et-chiffres/
@@ -174,31 +174,33 @@ export class RdDItem extends Item {
isConnaissance() { return typesObjetsConnaissance.includes(this.type) }
isInventaire(mode = 'materiel') { return RdDItem.getItemTypesInventaire(mode).includes(this.type); }
+ isBoisson() { return this.isNourritureBoisson() && this.system.boisson; }
isAlcool() { return this.isNourritureBoisson() && this.system.boisson && this.system.alcoolise; }
isHerbeAPotion() { return this.type == 'herbe' && (this.system.categorie == 'Soin' || this.system.categorie == 'Repos'); }
- isEnvironnement() { return RdDItem.getItemTypesEnvironnement().includes(this.type) }
isPresentDansMilieux(milieux) {
- return this.getEnvironnements(milieux).length > 0
- }
- getEnvironnements(milieux = undefined) {
- return this.isEnvironnement()
- ? this.system?.environnement.filter(env => !milieux || milieux.includes(env.milieu))
- : []
+ return this.getEnvironnement(milieux).length > 0
}
+ getEnvironnement(milieux = undefined) {
+ const environnements = this.isInventaire() ? this.system?.environnement ?? [] : [];
+ return environnements.filter(env => !milieux || milieux.includes(env.milieu))
+ }
+
+ getMilieux() {
+ return this.getEnvironnement().map(env => env.milieu);
+ }
+
+
getRarete(milieux = undefined) {
- if (this.isEnvironnement()) {
- return RdDRaretes.rareteEnvironnement(this, milieux)
- }
if (this.isInventaire()) {
- return RdDRaretes.rareteEquipement(this)
+ return RdDRaretes.selonEnvironnement(this, milieux)
}
return RdDRaretes.rareteFrequente();
}
getFrequence(milieux = undefined) {
- return this.getRarete(milieux)?.frequence ?? 0;
+ return this.getRarete(milieux)?.frequence ?? 0;
}
getItemGroup() {
@@ -249,6 +251,7 @@ export class RdDItem extends Item {
console.log(`${this.actor.name}: l'objet ${this.name} a expiré et été supprimé`);
await this.actor?.deleteEmbeddedDocuments('Item', [this.id]);
}
+
getUtilisation() {
switch (this.type) {
case 'nourritureboisson':
@@ -268,6 +271,7 @@ export class RdDItem extends Item {
}
return '';
}
+
getUtilisationCuisine() {
if (this.getUtilisation() == 'cuisine') {
switch (this.type) {
diff --git a/module/misc.js b/module/misc.js
index 185a3933..e9f03f9e 100644
--- a/module/misc.js
+++ b/module/misc.js
@@ -85,6 +85,7 @@ export class Misc {
list.forEach(it => addToObj(obj, it))
return obj;
}
+
static concat(lists) {
return lists.reduce((a, b) => a.concat(b), []);
}
diff --git a/module/rdd-commands.js b/module/rdd-commands.js
index 51b7e12c..49ac180a 100644
--- a/module/rdd-commands.js
+++ b/module/rdd-commands.js
@@ -64,7 +64,6 @@ 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: ["/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" });
@@ -76,7 +75,6 @@ export class RdDCommands {
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")` });
- this.registerCommand({ path: ["/tirer", "milieu"], func: (content, msg, params) => this.tableMilieu(msg, params, 'chat'), descr: "Effectue un tirage dans la table des ressource naturelles pour un milieu donné" });
this.registerCommand({ path: ["/tirage"], func: (content, msg, params) => this.tirage(), descr: "Ouvre la fenêtre de recherche et tirage" });
this.registerCommand({ path: ["/meteo"], func: (content, msg, params) => this.getMeteo(msg, params), descr: "Propose une météo marine" });
@@ -397,32 +395,6 @@ export class RdDCommands {
return false;
}
- async tableMilieu(msg, params, toChat) {
- if (params && params.length > 0) {
- const search = Misc.join(params, ' ');
- const milieux = await game.system.rdd.environnement.findEnvironnementsLike(search);
- if (milieux.length == 0) {
- const tous = Object.values(await game.system.rdd.environnement.milieux());
- return RdDCommands._chatAnswer(msg, `Aucun milieu correspondant à '${search}'.
-
Milieux disponibles:
-