173 lines
6.5 KiB
JavaScript
173 lines
6.5 KiB
JavaScript
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, SystemCompendiums } from "./settings/system-compendiums.js";
|
|
import { RdDRaretes } from "./tirage/raretes.js";
|
|
|
|
|
|
const COMPENDIUMS_RECHERCHE = 'compendiums-recherche';
|
|
const TYPE_ITEMS_NATURELS = ["faune", "herbe", "plante", "ingredient"];
|
|
|
|
export class Environnement {
|
|
static init() {
|
|
game.settings.register(SYSTEM_RDD, COMPENDIUMS_RECHERCHE, {
|
|
name: COMPENDIUMS_RECHERCHE,
|
|
default: [
|
|
SystemCompendiums.getCompendium('faune-flore-mineraux'),
|
|
SystemCompendiums.getCompendium('equipement')
|
|
],
|
|
scope: "world",
|
|
config: false,
|
|
type: Object
|
|
});
|
|
|
|
game.system.rdd.environnement = new Environnement();
|
|
Hooks.once('ready', () => game.system.rdd.environnement.onReady());
|
|
}
|
|
|
|
constructor() {
|
|
this.compendiums = [];
|
|
this.compendiumTables = [];
|
|
this.mapMilieux = {}
|
|
}
|
|
|
|
async onReady() {
|
|
await this.$prepareCompendiums()
|
|
}
|
|
|
|
async milieux() {
|
|
return Object.values(this.mapMilieux);
|
|
}
|
|
|
|
async saveCompendiums(compendiumIds) {
|
|
game.settings.set(SYSTEM_RDD, COMPENDIUMS_RECHERCHE, compendiumIds);
|
|
await this.$prepareCompendiums();
|
|
}
|
|
|
|
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 milieuxExistants = item.getMilieux().map(it => Grammar.toLowerCaseNoAccent(it));
|
|
return Object.keys(this.mapMilieux)
|
|
.filter(it => !milieuxExistants.includes(it))
|
|
.map(it => this.mapMilieux[it]);
|
|
}
|
|
|
|
async getElements(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);
|
|
}
|
|
}
|
|
|
|
export class EnvironmentSheetHelper {
|
|
static defaultOptions(defaultOptions) {
|
|
return mergeObject(defaultOptions, {
|
|
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "informations" }]
|
|
});
|
|
}
|
|
|
|
static setPosition(sheet, superPosition) {
|
|
const position = superPosition;
|
|
const sheetHeader = sheet.element.find(".sheet-header");
|
|
const sheetBody = sheet.element.find(".sheet-body");
|
|
sheetBody.css("height", position.height - sheetHeader[0].clientHeight)
|
|
return position;
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static async getData(sheet, formData) {
|
|
return mergeObject(formData, {
|
|
milieux: await game.system.rdd.environnement.autresMilieux(sheet.item)
|
|
});
|
|
}
|
|
|
|
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 => {
|
|
if (event.keyCode == '13') {
|
|
EnvironmentSheetHelper.onAddMilieu(sheet, event);
|
|
}
|
|
event.stopPropagation();
|
|
})
|
|
sheet.html.find("a.milieu-add").click(event => EnvironmentSheetHelper.onAddMilieu(sheet, event));
|
|
sheet.html.find("div.environnement-milieu a.milieu-delete").click(event => EnvironmentSheetHelper.onDeleteMilieu(sheet, event));
|
|
sheet.html.find("div.environnement-milieu select.environnement-rarete").change(event => EnvironmentSheetHelper.onChange(sheet, event,
|
|
updated => EnvironmentSheetHelper.$changeRarete(sheet, event, updated)));
|
|
sheet.html.find("div.environnement-milieu input[name='environnement-frequence']").change(event => EnvironmentSheetHelper.onChange(sheet, event,
|
|
updated => EnvironmentSheetHelper.$changeFrequence(sheet, event, updated)));
|
|
}
|
|
|
|
static $changeFrequence(sheet, event, updated) {
|
|
updated.frequence = Number(sheet.html.find(event.currentTarget).val());
|
|
}
|
|
|
|
static $changeRarete(sheet, event, updated) {
|
|
const name = sheet.html.find(event.currentTarget).val();
|
|
const rarete = RdDRaretes.getRarete(name);
|
|
updated.rarete = rarete.code;
|
|
updated.frequence = rarete.frequence;
|
|
}
|
|
|
|
static async onAddMilieu(sheet, event) {
|
|
const milieu = sheet.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
|
|
}
|
|
const list = sheet.item.system.environnement;
|
|
const exists = list.find(it => it.milieu == milieu);
|
|
if (exists) {
|
|
ui.notifications.warn(`${sheet.item.name} a déjà une rareté ${exists.rarete} en ${milieu} (fréquence: ${exists.frequence})`);
|
|
return
|
|
}
|
|
const rarete = RdDRaretes.getRarete();
|
|
const newList = [...list, { milieu, rarete: rarete.code, frequence: rarete.frequence }].sort(Misc.ascending(it => it.milieu))
|
|
await sheet.item.update({ 'system.environnement': newList })
|
|
}
|
|
|
|
static async onDeleteMilieu(sheet, event) {
|
|
const milieu = EnvironmentSheetHelper.$getEventMilieu(sheet, event);
|
|
if (milieu != undefined) {
|
|
const newList = sheet.item.system.environnement.filter(it => it.milieu != milieu)
|
|
.sort(Misc.ascending(it => it.milieu));
|
|
await sheet.item.update({ 'system.environnement': newList });
|
|
}
|
|
}
|
|
|
|
static async onChange(sheet, event, doMutation) {
|
|
const list = sheet.item.system.environnement;
|
|
const milieu = EnvironmentSheetHelper.$getEventMilieu(sheet, event);
|
|
const updated = list.find(it => it.milieu == milieu);
|
|
if (updated) {
|
|
doMutation(updated);
|
|
const newList = [...list.filter(it => it.milieu != milieu), updated]
|
|
.sort(Misc.ascending(it => it.milieu));
|
|
await sheet.item.update({ 'system.environnement': newList });
|
|
}
|
|
}
|
|
|
|
static $getEventMilieu(sheet, event) {
|
|
return sheet.html.find(event.currentTarget)?.parents("div.environnement-milieu").data("milieu");
|
|
}
|
|
|
|
} |