88 lines
3.2 KiB
JavaScript
88 lines
3.2 KiB
JavaScript
import { Grammar } from "./grammar.js";
|
|
import { Misc } from "./misc.js";
|
|
import { RdDUtility } from "./rdd-utility.js";
|
|
|
|
export class DialogFabriquerPotion extends Dialog {
|
|
|
|
/* -------------------------------------------- */
|
|
static async create(actor, item, onActionItem) {
|
|
const min = DialogFabriquerPotion.nombreBrinsMinimum(item);
|
|
if (item.system.quantite < min) {
|
|
ui.notifications.warn(`Vous avez ${item.system.quantite} brins de ${item.name}, il en faut au moins ${min} pour faire une potion!`);
|
|
return;
|
|
}
|
|
let potionData = DialogFabriquerPotion.prepareData(actor, item);
|
|
|
|
const html = await renderTemplate( 'systems/foundryvtt-reve-de-dragon/templates/dialog-fabriquer-potion-base.html', potionData);
|
|
|
|
let options = { classes: ["dialogfabriquerpotion"], width: 600, height: 160, 'z-index': 99999 };
|
|
new DialogFabriquerPotion(actor, potionData, onActionItem, html, options).render(true);
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static prepareData(actor, item) {
|
|
let potionData = foundry.utils.duplicate(item)
|
|
potionData.nbBrinsSelect = RdDUtility.buildListOptions(
|
|
DialogFabriquerPotion.nombreBrinsMinimum(item),
|
|
DialogFabriquerPotion.nombreBrinsOptimal(item));
|
|
potionData.nbBrins = Math.min(potionData.system.quantite, DialogFabriquerPotion.nombreBrinsOptimal(potionData));
|
|
potionData.herbebonus = item.system.niveau;
|
|
potionData.buttonName = "Fabriquer";
|
|
return potionData;
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
constructor(actor, potionData, onActionItem, html, options) {
|
|
const conf = {
|
|
title: `Fabriquer une potion de ${potionData.system.categorie}`,
|
|
content: html,
|
|
default: 'fabriquer',
|
|
buttons: {
|
|
'fabriquer': {
|
|
label: potionData.buttonName, callback: it => this.onFabriquer()
|
|
}
|
|
}
|
|
};
|
|
|
|
super(conf, options);
|
|
|
|
this.actor = actor;
|
|
this.potionData = potionData;
|
|
this.onActionItem = onActionItem;
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
activateListeners(html) {
|
|
super.activateListeners(html);
|
|
this.html = html;
|
|
this.html.find("[name='nbBrins']").change(event => {
|
|
this.potionData.nbBrins = Misc.toInt(event.currentTarget.value);
|
|
const brinsManquants = Math.max(0, DialogFabriquerPotion.nombreBrinsOptimal(this.potionData) - this.potionData.nbBrins);
|
|
this.potionData.herbebonus = Math.max(0, this.potionData.system.niveau - brinsManquants)
|
|
});
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
async onFabriquer() {
|
|
await this.html.find("[name='nbBrins']").change();
|
|
await this.actor.fabriquerPotion(this.potionData);
|
|
this.close();
|
|
await this.onActionItem()
|
|
}
|
|
|
|
static nombreBrinsMinimum(herbeData) {
|
|
switch (herbeData.system.categorie ?? '') {
|
|
case "Soin": return 1 + Math.max(0, 12 - 2 * herbeData.system.niveau);
|
|
case "Repos": return 1 + Math.max(0, 7 - 2 * herbeData.system.niveau);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
static nombreBrinsOptimal(herbeData) {
|
|
switch (herbeData.system.categorie ?? '') {
|
|
case "Soin": return 12 - herbeData.system.niveau;
|
|
case "Repos": return 7 - herbeData.system.niveau;
|
|
}
|
|
return 1;
|
|
}
|
|
} |