Merge branch 'v1.4-consommer' into 'v1.4'

Continuer la nourriture

See merge request LeRatierBretonnien/foundryvtt-reve-de-dragon!197
This commit is contained in:
Leratier Bretonnien 2021-04-12 06:03:35 +00:00
commit 870ca61d7d
20 changed files with 528 additions and 450 deletions

View File

@ -117,7 +117,7 @@ export class RdDActorEntiteSheet extends ActorSheet {
this.render(true); this.render(true);
}); });
html.find('#encaisser-direct').click(ev => { html.find('.encaisser-direct').click(ev => {
this.actor.encaisser(); this.actor.encaisser();
}); });

View File

@ -257,18 +257,18 @@ export class RdDActorSheet extends ActorSheet {
const li = $(ev.currentTarget).parents(".item"); const li = $(ev.currentTarget).parents(".item");
RdDUtility.confirmerSuppression(this, li); RdDUtility.confirmerSuppression(this, li);
}); });
html.find('.item-consommer').click(ev => { html.find('.item-action').click(ev => {
const li = $(ev.currentTarget).parents(".item"); const li = $(ev.currentTarget).parents(".item");
const itemId = li.data("item-id"); const itemId = li.data("item-id");
const item = this.actor.getObjet(itemId); const item = this.actor.getObjet(itemId);
this.actor.consommer(item); this.actor.actionItem(item);
}); });
html.find('.subacteur-delete').click(ev => { html.find('.subacteur-delete').click(ev => {
const li = $(ev.currentTarget).parents(".item"); const li = $(ev.currentTarget).parents(".item");
RdDUtility.confirmerSuppressionSubacteur(this, li); RdDUtility.confirmerSuppressionSubacteur(this, li);
}); });
html.find('#encaisser-direct').click(ev => { html.find('.encaisser-direct').click(ev => {
this.actor.encaisser(); this.actor.encaisser();
}); });
@ -416,27 +416,27 @@ export class RdDActorSheet extends ActorSheet {
} }
}); });
// Display TMR, visuualisation // Display TMR, visuualisation
html.find('#visu-tmr').click((event) => { html.find('.visu-tmr').click((event) => {
this.actor.displayTMR("visu"); this.actor.displayTMR("visu");
}); });
// Display TMR, normal // Display TMR, normal
html.find('#monte-tmr').click((event) => { html.find('.monte-tmr').click((event) => {
this.actor.displayTMR("normal"); this.actor.displayTMR("normal");
}); });
// Display TMR, fast // Display TMR, fast
html.find('#monte-tmr-rapide').click((event) => { html.find('.monte-tmr-rapide').click((event) => {
this.actor.displayTMR("rapide"); this.actor.displayTMR("rapide");
}); });
html.find('#dormir-une-heure').click((event) => { html.find('.dormir-une-heure').click((event) => {
this.actor.dormir(1); this.actor.dormir(1);
}); });
html.find('#dormir-chateau-dormant').click((event) => { html.find('.dormir-chateau-dormant').click((event) => {
this.actor.dormirChateauDormant(); this.actor.dormirChateauDormant();
}); });
html.find('#enlever-tous-effets').click((event) => { html.find('.enlever-tous-effets').click((event) => {
this.actor.enleverTousLesEffets(); this.actor.enleverTousLesEffets();
}); });
// Display info about queue // Display info about queue

View File

@ -27,7 +27,6 @@ import { EffetsDraconiques } from "./tmr/effets-draconiques.js";
import { Draconique } from "./tmr/draconique.js"; import { Draconique } from "./tmr/draconique.js";
import { RdDCarac } from "./rdd-carac.js"; import { RdDCarac } from "./rdd-carac.js";
import { Monnaie } from "./item-monnaie.js"; import { Monnaie } from "./item-monnaie.js";
import { RdDHerbes } from "./rdd-herbes.js";
import { DialogConsommer } from "./dialog-consommer.js"; import { DialogConsommer } from "./dialog-consommer.js";
import { DialogFabriquerPotion } from "./dialog-fabriquer-potion.js"; import { DialogFabriquerPotion } from "./dialog-fabriquer-potion.js";
@ -313,7 +312,7 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
async verifierPotionsEnchantees() { async verifierPotionsEnchantees() {
let potionsEnchantees = this.filterItemsData( it => it.type == 'potion' && it.data.categorie.toLowerCase().includes('enchante')); let potionsEnchantees = this.filterItemsData(it => it.type == 'potion' && it.data.isEnchante);
for (let potion of potionsEnchantees) { for (let potion of potionsEnchantees) {
if (!potion.prpermanent) { if (!potion.prpermanent) {
console.log(potion); console.log(potion);
@ -743,7 +742,6 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
async updateCreatureCompetence(compName, fieldName, compValue) { async updateCreatureCompetence(compName, fieldName, compValue) {
let comp = this.getCompetence(compName); let comp = this.getCompetence(compName);
//console.log(comp);
if (comp) { if (comp) {
const update = { _id: comp.id } const update = { _id: comp.id }
if (fieldName == "niveau") if (fieldName == "niveau")
@ -752,7 +750,6 @@ export class RdDActor extends Actor {
update['data.dommages'] = compValue; update['data.dommages'] = compValue;
else else
update['data.carac_value'] = compValue; update['data.carac_value'] = compValue;
//console.log(update);
const updated = await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity const updated = await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
} }
} }
@ -1610,25 +1607,80 @@ export class RdDActor extends Actor {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async consommer(item) { async actionItem(item) {
DialogConsommer.create(this, item, { if (!item.getActionPrincipale()) return;
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-consommer-nourriture.html', switch (Misc.data(item).type) {
}, []); case 'nourritureboisson': return await this.actionNourritureboisson(item);
case 'potion': return await this.actionPotion(item);
}
} }
async manger(sust) { async actionNourritureboisson(item) {
const dialog = await DialogConsommer.create(this, item);
dialog.render(true);
}
async actionPotion(item) {
return await this.consommerPotion(item)
}
/* -------------------------------------------- */
async consommer(item, choix) {
switch (Misc.data(item).type) {
case 'nourritureboisson':
return await this.consommerNourritureboisson(item, choix);
case 'potion':
return await this.consommerPotion(item)
}
}
/* -------------------------------------------- */
async consommerNourritureboisson(item, choix = { doses: 1, seForcer: false }) {
const itemData = Misc.data(item);
if (itemData.type != 'nourritureboisson') {
return;
}
if (choix.doses > itemData.data.quantite) {
ui.notifications.warn(`Il n'y a pas assez de ${itemData.name} poour manger ${choix.doses}`)
return;
}
const surmonteExotisme = await this.surmonterExotisme(item, choix);
if (!surmonteExotisme) {
ui.notifications.warn(`Vous n'arrivez pas à manger de ${itemData.name}`)
return;
}
await this.manger(item, choix.doses, { diminuerQuantite: false });
await this.boire(item, choix.doses, { diminuerQuantite: false });
await item.diminuerQuantite(choix.doses);
}
/* -------------------------------------------- */
async manger(item, doses, options = { diminuerQuantite: true }) {
if (!item.getActionPrincipale()) return;
await this.apprecierCuisine(item);
const sust = Misc.templateData(item).sust;
if (sust > 0) { if (sust > 0) {
await this.updateCompteurValue('sust', Misc.templateData(this).compteurs.sust.value + sust); await this.updateCompteurValue('sust', Misc.keepDecimals(Misc.templateData(this).compteurs.sust.value + sust * doses, 2));
} }
await item.diminuerQuantite(doses, options);
} }
async boire(eau) { /* -------------------------------------------- */
if (eau > 0) { async boire(item, doses, options = { diminuerQuantite: true }) {
await this.actor.updateCompteurValue('eau', Misc.templateData(this).eau.value + this.consommerData.data.desaltere); if (!item.getActionPrincipale()) return;
const tplData = Misc.templateData(item);
const desaltere = tplData.desaltere;
if (desaltere > 0) {
await this.updateCompteurValue('eau', Misc.keepDecimals(Misc.templateData(this).compteurs.eau.value + desaltere * doses, 2));
} }
if (item.isAlcool()) {
for (let i = 0; i < doses; i++) {
await this.saouler(tplData.force);
}
}
await item.diminuerQuantite(doses, options);
} }
async alcool(forceAlcool) { async saouler(forceAlcool) {
const actorTplData = Misc.templateData(this); const actorTplData = Misc.templateData(this);
const etatGeneral = this.getEtatGeneral({ ethylisme: true }); const etatGeneral = this.getEtatGeneral({ ethylisme: true });
const nbDoses = -Number(actorTplData.compteurs.ethylisme.nb_doses || 0); const nbDoses = -Number(actorTplData.compteurs.ethylisme.nb_doses || 0);
@ -1643,26 +1695,28 @@ export class RdDActor extends Actor {
await this.performEthylisme(rollData); await this.performEthylisme(rollData);
} }
async apprecierCuisine(consommerData) { async apprecierCuisine(item) {
const cuisine = Misc.data(this.getCompetence('cuisine')); const cuisine = Misc.data(this.getCompetence('cuisine'));
const qualite = consommerData.data.qualite; const itemData = Misc.data(item);
const qualite = itemData.data.qualite;
if (cuisine && qualite > 0 && qualite > cuisine.data.niveau) { if (cuisine && qualite > 0 && qualite > cuisine.data.niveau) {
const rolled = await this.rollCaracCompetence('gout', 'cuisine', qualite, { title: consommerData.data.boisson ? "apprécie la boisson" : "apprécie le plat" }); const rolled = await this.rollCaracCompetence('gout', 'cuisine', qualite, { title: itemData.data.boisson ? "apprécie la boisson" : "apprécie le plat" });
if (rolled.isSuccess) { if (rolled.isSuccess) {
await this.jetDeMoral('heureux'); await this.jetDeMoral('heureux');
} }
} }
} }
async surmonterExotisme(consommerData) { async surmonterExotisme(item, choix = {}) {
const qualite = consommerData.data.qualite; const itemData = Misc.data(item);
const qualite = itemData.data.qualite;
if (qualite < 0) { if (qualite < 0) {
const rolled = await this.rollCaracCompetence('volonte', 'cuisine', qualite, { title: "tente de surmonter l'exotisme" }); const rolled = await this.rollCaracCompetence('volonte', 'cuisine', qualite, { title: `surmonte l'exotisme de ${itemData.name}` });
if (rolled.isEchec) { if (rolled.isEchec) {
if (!consommerData.data.seForcer) { if (!choix.seForcer) {
return false; return false;
} }
await this.actor.jetDeMoral('malheureux'); await this.jetDeMoral('malheureux');
} }
} }
return true; return true;
@ -2102,7 +2156,7 @@ export class RdDActor extends Actor {
caracValue: Number(carac.value), caracValue: Number(carac.value),
selectedCarac: carac, selectedCarac: carac,
competence: competence, competence: competence,
finalLevel: (competence?.data.niveau ?? 0) + diff, finalLevel: (Misc.templateData(competence)?.niveau ?? 0) + diff,
diffLibre: diff, diffLibre: diff,
showDice: true, showDice: true,
show: { title: options?.title ?? '' } show: { title: options?.title ?? '' }
@ -3230,11 +3284,9 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
async consommerPotionSoin(potionData) { async consommerPotionSoin(potionData) {
potionData.alias = this.name; potionData.alias = this.name;
potionData.supprimer = true;
if (potionData.data.categorie.includes('Enchante')) { if (potionData.data.isEnchante) {
potionData.pointsGuerison = RdDHerbes.calculePointsGuerison( potionData.data);
potionData.enchanteTexte = "enchantée";
potionData.isEnchante = true;
ChatMessage.create({ ChatMessage.create({
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-soin.html`, potionData) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-soin.html`, potionData)
@ -3244,7 +3296,7 @@ export class RdDActor extends Actor {
potionData.reussiteReve = false; potionData.reussiteReve = false;
if (!rolled.isSuccess) { if (!rolled.isSuccess) {
await this.reveActuelIncDec(-1); await this.reveActuelIncDec(-1);
potionData.guerisonData = await this.buildPotionGuerisonList(potionData.pointsGuerison); potionData.guerisonData = await this.buildPotionGuerisonList(potionData.data.puissance);
potionData.guerisonMinutes = potionData.guerisonData.pointsConsommes * 5; potionData.guerisonMinutes = potionData.guerisonData.pointsConsommes * 5;
potionData.reussiteReve = true; potionData.reussiteReve = true;
} }
@ -3253,8 +3305,6 @@ export class RdDActor extends Actor {
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-appliquer-potion-soin.html`, potionData) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-appliquer-potion-soin.html`, potionData)
}); });
} else { } else {
potionData.enchanteTexte = "";
potionData.isEnchante = false;
ChatMessage.create({ ChatMessage.create({
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-appliquer-potion-soin.html`, potionData) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-appliquer-potion-soin.html`, potionData)
@ -3266,11 +3316,9 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
async consommerPotionRepos(potionData) { async consommerPotionRepos(potionData) {
potionData.alias = this.name; potionData.alias = this.name;
potionData.supprimer = true;
if (potionData.data.categorie.includes('Enchante')) { if (potionData.data.isEnchante) {
potionData.casesRepos = RdDHerbes.calculePointsRepos( potionData.data);
potionData.enchanteTexte = "enchantée";
potionData.isEnchante = true;
ChatMessage.create({ ChatMessage.create({
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-repos.html`, potionData) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-repos.html`, potionData)
@ -3281,7 +3329,7 @@ export class RdDActor extends Actor {
if (!rolled.isSuccess) { if (!rolled.isSuccess) {
await this.reveActuelIncDec(-1); await this.reveActuelIncDec(-1);
let fatigueActuelle = this.getFatigueActuelle(); let fatigueActuelle = this.getFatigueActuelle();
potionData.caseFatigueReel = (fatigueActuelle >= potionData.casesRepos) ? potionData.casesRepos : fatigueActuelle; potionData.caseFatigueReel = Math.min(fatigueActuelle, potionData.data.puissance);
potionData.guerisonDureeUnite = (potionData.data.reposalchimique) ? "rounds" : "minutes"; potionData.guerisonDureeUnite = (potionData.data.reposalchimique) ? "rounds" : "minutes";
potionData.guerisonDureeValue = (potionData.data.reposalchimique) ? potionData.caseFatigueReel : potionData.caseFatigueReel * 5; potionData.guerisonDureeValue = (potionData.data.reposalchimique) ? potionData.caseFatigueReel : potionData.caseFatigueReel * 5;
potionData.reussiteReve = true; potionData.reussiteReve = true;
@ -3299,8 +3347,6 @@ export class RdDActor extends Actor {
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-appliquer-potion-repos.html`, potionData) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-appliquer-potion-repos.html`, potionData)
}); });
} else { } else {
potionData.enchanteTexte = "";
potionData.isEnchante = false;
ChatMessage.create({ ChatMessage.create({
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-appliquer-potion-repos.html`, potionData) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-appliquer-potion-repos.html`, potionData)
@ -3316,33 +3362,31 @@ export class RdDActor extends Actor {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async fabriquerPotion( potionData ) { async fabriquerPotion(herbeData) {
let newPotion = { let newPotion = {
name: `Potion de ${potionData.data.categorie} (${potionData.name})`, type: 'potion', name: `Potion de ${herbeData.data.categorie} (${herbeData.name})`, type: 'potion',
img: "systems/foundryvtt-reve-de-dragon/icons/objets/fiole_verre.webp", img: "systems/foundryvtt-reve-de-dragon/icons/objets/fiole_verre.webp",
data: { quantite: 1, valeur_deniers: 1, encombrement: 0.01, data: {
categorie: potionData.data.categorie, quantite: 1, valeur_deniers: 1, encombrement: 0.01,
herbe: potionData.name, categorie: herbeData.data.categorie,
rarete: potionData.data.rarete, herbe: herbeData.name,
herbebrins: potionData.nbBrins, rarete: herbeData.data.rarete,
description: "" } herbebrins: herbeData.nbBrins,
description: ""
}
} }
await this.createEmbeddedDocuments('Item', [newPotion], { renderSheet: true }); await this.createEmbeddedDocuments('Item', [newPotion], { renderSheet: true });
let newQuantite = potionData.data.quantite - potionData.nbBrins; let newQuantite = herbeData.data.quantite - herbeData.nbBrins;
let messageData = { let messageData = {
alias: this.name, alias: this.name,
categorie: potionData.data.categorie, categorie: herbeData.data.categorie,
herbe: potionData.name, herbe: herbeData.name,
nbBrinsPotion: potionData.nbBrins, nbBrinsPotion: herbeData.nbBrins,
nbBrinsReste: newQuantite nbBrinsReste: newQuantite
} }
if (newQuantite == 0 ) { this.diminuerQuantiteObjet(herbeData._id, herbeData.nbBrins);
await this.deleteEmbeddedDocuments('Item', [ potionData._id ] );
} else {
let update = { _id: potionData._id, 'data.quantite': newQuantite};
await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
}
ChatMessage.create({ ChatMessage.create({
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-fabriquer-potion-base.html`, messageData) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-fabriquer-potion-base.html`, messageData)
@ -3350,17 +3394,17 @@ export class RdDActor extends Actor {
} }
async diminuerQuantiteObjet(id, nb, options = { supprimerSiZero: false }) {
const item = this.getObjet(id);
if (item){
await item.diminuerQuantite(nb, options);
}
}
/* -------------------------------------------- */ /* -------------------------------------------- */
async consommerPotionGenerique(potionData) { async consommerPotionGenerique(potionData) {
potionData.alias = this.name; potionData.alias = this.name;
if (potionData.data.categorie.includes('Enchante')) {
potionData.enchanteTexte = "enchantée";
potionData.isEnchante = true;
} else {
potionData.enchanteTexte = "";
potionData.isEnchante = false;
}
ChatMessage.create({ ChatMessage.create({
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-generique.html`, potionData) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-generique.html`, potionData)
@ -3378,7 +3422,7 @@ export class RdDActor extends Actor {
} else { } else {
this.consommerPotionGenerique(potionData); this.consommerPotionGenerique(potionData);
} }
await this.deleteEmbeddedDocuments('Item', [ potion.id ] ); this.diminuerQuantiteObjet(potion.id, 1, { supprimerSiZero: potionData.supprimer });
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -3453,8 +3497,10 @@ export class RdDActor extends Actor {
const ids = Array.from(this.effects?.values()) const ids = Array.from(this.effects?.values())
.filter(it => it.data.flags.core?.statusId == id) .filter(it => it.data.flags.core?.statusId == id)
.map(it => it.id); .map(it => it.id);
if (ids.length > 0) {
this.deleteEmbeddedDocuments('ActiveEffect', ids); this.deleteEmbeddedDocuments('ActiveEffect', ids);
} }
}
/* -------------------------------------------- */ /* -------------------------------------------- */
deleteStatusEffect(effect) { deleteStatusEffect(effect) {
@ -3472,8 +3518,9 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
async addStatusEffect(statusEffect) { async addStatusEffect(statusEffect) {
const effet = duplicate(statusEffect); const effet = Misc.data(statusEffect);
this.deleteStatusEffectById(effet.id); this.deleteStatusEffectById(effet.id);
effet.flags = effet.flags ?? { core: {} };
effet.flags.core.statusId = effet.id; effet.flags.core.statusId = effet.id;
await this.createEmbeddedDocuments('ActiveEffect', [effet]); await this.createEmbeddedDocuments('ActiveEffect', [effet]);
} }

View File

@ -3,56 +3,24 @@ import { Misc } from "./misc.js";
export class DialogConsommer extends Dialog { export class DialogConsommer extends Dialog {
static async create(actor, item, dialogConfig) { static async create(actor, item, template = undefined, options = {}) {
let consommerData = DialogConsommer.prepareData(actor, item); const consommerData = DialogConsommer.prepareData(actor, item, options);
if (!consommerData) { const html = await renderTemplate(template ?? `systems/foundryvtt-reve-de-dragon/templates/consommer/dialog-${Misc.data(item).type}.html`, consommerData);
ui.notifications.warn(`Impossible de consommer un ${consommerData.name}, ce n'est pas de la nourriture, une boisson ou une potion`); return new DialogConsommer(actor, item, consommerData, html, options)
return;
} }
constructor(actor, item, consommerData, html, options = {}) {
mergeObject(options, { classes: ["dialogconsommer"], width: 600, height: 500, 'z-index': 99999 }, { overwrite: false })
let conf = { let conf = {
title: consommerData.title, title: consommerData.title,
content: await renderTemplate(dialogConfig.html, consommerData), content: html,
default: consommerData.buttonName, default: consommerData.buttonName,
}; buttons: {
let options = { classes: ["dialogconsommer"], width: 600, height: 500, 'z-index': 99999 };
mergeObject(options, dialogConfig.options ?? {}, { overwrite: true })
console.log('consommer', actor, consommerData, conf, options);
const dialog = new DialogConsommer(actor, consommerData, conf, options);
dialog.render(true);
return dialog;
}
static prepareData(actor, item) {
let consommerData = duplicate(Misc.data(item));
switch (consommerData.type) {
default:
return undefined;
case 'nourritureboisson':
consommerData.doses = 1;
consommerData.title = consommerData.data.boisson ? `${consommerData.name}: boire une dose` : `${consommerData.name}: manger une portion`;
consommerData.buttonName = consommerData.data.boisson ? "Boire" : "Manger";
break;
case 'potion':
buttonName.title = `${consommerData.name}: boire la potion`;
consommerData.buttonName = "Boire";
consommerData.alchimie = Misc.data(actor.getCompetence('alchimie'));
break;
}
consommerData.cuisine = Misc.data(actor.getCompetence('cuisine'));
consommerData.seForcer = false;
return consommerData;
}
constructor(actor, consommerData, conf, options) {
conf.buttons = {
[consommerData.buttonName]: { [consommerData.buttonName]: {
label: consommerData.buttonName, callback: it => { label: consommerData.buttonName, callback: it => {
this.consommer(); this.actor.consommer(this.item, this.consommerData.choix);
}
} }
} }
}; };
@ -60,66 +28,55 @@ export class DialogConsommer extends Dialog {
super(conf, options); super(conf, options);
this.actor = actor; this.actor = actor;
this.item = item;
this.consommerData = consommerData; this.consommerData = consommerData;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
activateListeners(html) { static prepareData(actor, item, options) {
super.activateListeners(html); const itemData = duplicate(Misc.data(item));
let consommerData = {
function updateConsommerData(rollData) { item: itemData,
choix: {
rollData.finalLevel = Number(rollData.etat) + Number(rollData.forceAlcool) + rollData.diffNbDoses; doses: options.doses ?? 1,
seForcer: options.seForcer ?? false,
// Mise à jour valeurs }
$("#roll-param").text(rollData.vieValue + " / " + Misc.toSignedString(rollData.finalLevel)); }
$(".table-resolution").remove(); switch (itemData.type) {
$("#resolutionTable").append(RdDResolutionTable.buildHTMLTableExtract(rollData.vieValue, rollData.finalLevel)); case 'nourritureboisson':
consommerData.title = itemData.data.boisson ? `${itemData.name}: boire une dose` : `${itemData.name}: manger une portion`;
consommerData.buttonName = itemData.data.boisson ? "Boire" : "Manger";
break;
case 'potion':
consommerData.title = `${itemData.name}: boire la potion`;
consommerData.buttonName = "Boire";
break;
}
DialogConsommer.calculDoses(consommerData, consommerData.choix.doses)
return consommerData;
} }
static calculDoses(consommerData) {
const doses = consommerData.choix.doses;
consommerData.totalSust = Misc.keepDecimals(doses * (consommerData.item.data.sust ?? 0), 2);
consommerData.totalDesaltere = consommerData.item.data.boisson
? Misc.keepDecimals(doses * (consommerData.item.data.desaltere ?? 0), 2)
: 0;
}
/* -------------------------------------------- */
activateListeners(html) {
super.activateListeners(html);
html.find(".se-forcer").change(event => {
this.consommerData.choix.seForcer = event.currentTarget.checked;
});
html.find(".consommer-doses").change(event => { html.find(".consommer-doses").change(event => {
this.u this.consommerData.choix.doses = Number(event.currentTarget.value);
DialogConsommer.calculDoses(this.consommerData);
$(".total-sust").text(this.consommerData.totalSust)
$(".total-desaltere").text(this.consommerData.totalDesaltere)
}); });
} }
/* -------------------------------------------- */
async consommer() {
switch (this.consommerData.type) {
default:
return undefined;
case 'nourritureboisson':
return await this.consommerNourritureBoisson();
case 'potion':
return await this.consommerPotion();
}
}
async consommerNourritureBoisson() {
const surmonteExotisme = await this.actor.surmonterExotisme(this.consommerData);
if (!surmonteExotisme) {
return;
}
await this.actor.apprecierCuisine(this.consommerData);
if (this.isAlcool()) {
await this.actor.alcool(this.consommerData.data.force);
}
await this.actor.manger(this.consommerData.data.sust);
await this.actor.boire(this.consommerData.data.desaltere);
}
isAlcool() {
return this.consommerData.data.boisson && this.consommerData.data.alcoolise;
}
async apprecierCuisine(qualite) {
const jetGoutCuisine = await this.jetGoutCuisine();
if (jetGoutCuisine) {
await this.actor.jetDeMoral('heureux');
}
}
async consommerPotion() {
}
} }

View File

@ -32,7 +32,7 @@ export class RdDItemSheet extends ItemSheet {
{ {
class: "post", class: "post",
icon: "fas fa-comment", icon: "fas fa-comment",
onclick: ev => new RdDItem(Misc.data(this.item)).postItem() onclick: ev => this.item.postItem()
}) })
return buttons return buttons
} }

View File

@ -1,42 +1,115 @@
import { Grammar } from "./grammar.js";
import { Misc } from "./misc.js"; import { Misc } from "./misc.js";
import { RdDUtility } from "./rdd-utility.js"; import { RdDUtility } from "./rdd-utility.js";
const typesObjetsEquipement = ["objet", "arme", "armure", "conteneur", "herbe", "ingredient", "livre", "potion", "munition", "nourritureboisson", "monnaie"]; const typesObjetsEquipement = ["objet", "arme", "armure", "conteneur", "herbe", "ingredient", "livre", "potion", "munition", "nourritureboisson", "monnaie"];
const typesObjetsOeuvres = ["oeuvre", "recettecuisine", "musique", "chant", "danse", "jeu"]; const typesObjetsOeuvres = ["oeuvre", "recettecuisine", "musique", "chant", "danse", "jeu"];
const encBrin = 0.00005;
/* -------------------------------------------- */ /* -------------------------------------------- */
export class RdDItem extends Item { export class RdDItem extends Item {
static getTypeObjetsEquipement() { static getTypeObjetsEquipement() {
return typesObjetsEquipement; return typesObjetsEquipement;
} }
static getTypesOeuvres() { static getTypesOeuvres() {
return typesObjetsOeuvres; return typesObjetsOeuvres;
} }
prepareDerivedData() { prepareDerivedData() {
super.prepareDerivedData(); super.prepareDerivedData();
const itemData = this.data; const itemData = Misc.data(this);
if (RdDItem.getTypeObjetsEquipement().includes(itemData.type)) { if (RdDItem.getTypeObjetsEquipement().includes(itemData.type)) {
this._calculsEquipement(itemData); this._calculsEquipement();
}
if (itemData.type == 'potion') {
this.prepareDataPotion()
}
itemData.data.actionPrincipale = this.getActionPrincipale({ warnIfNot: false });
}
prepareDataPotion() {
const tplData = Misc.templateData(this);
const categorie = Grammar.toLowerCaseNoAccent(tplData.categorie);
tplData.isEnchante = categorie.includes('enchante');
if (tplData.isEnchante) {
if (categorie.includes('soin') || categorie.includes('repos')) {
tplData.puissance = tplData.herbebonus * tplData.pr;
}
} }
} }
_calculsEquipement(itemData) { _calculsEquipement() {
const tplData = itemData.data; const tplData = Misc.templateData(this);
const quantite = itemData.type == 'conteneur' ? 1 : (tplData.quantite ?? 0); const quantite = Misc.data(this).type == 'conteneur' ? 1 : (tplData.quantite ?? 0);
if (tplData.encombrement != undefined) { const enc = this.getEnc();
tplData.encTotal = Math.max(tplData.encombrement, 0) * quantite; if (enc != undefined) {
tplData.encTotal = Math.max(enc, 0) * quantite;
} }
if (tplData.cout != undefined) { if (tplData.cout != undefined) {
tplData.prixTotal = Math.max(tplData.cout, 0) * quantite; tplData.prixTotal = Math.max(tplData.cout, 0) * quantite;
} }
} }
getEnc() {
const itemData = Misc.data(this);
switch (itemData.type) {
case 'herbe':
return encBrin;
}
return itemData.data.encombrement
}
getActionPrincipale(options = { warnIfNot: true }) {
const itemData = Misc.data(this);
if ((itemData.data.quantite ?? 0) <= 0) {
if (options.warnIfNot) {
ui.notifications.warn(`Vous n'avez plus de ${itemData.name}.`);
}
return undefined;
}
switch (itemData.type) {
case 'nourritureboisson': return itemData.data.boisson ? 'Boire' : 'Manger';
case 'potion': return 'Boire';
}
if (options.warnIfNot) {
ui.notifications.warn(`Impossible d'utilise un ${itemData.name}, aucune action associée définie.`);
}
return undefined;
}
isAlcool() {
const itemData = Misc.data(this);
return itemData.type == 'nourritureboisson' && itemData.data.boisson && itemData.data.alcoolise;
}
async diminuerQuantite(nombre, options = { diminuerQuantite: true, supprimerSiZero: false }) {
if (options.diminuerQuantite == false) return;
const itemData = Misc.data(this);
const quantite = itemData.data.quantite;
if (quantite != undefined) {
const reste = Math.max(quantite - nombre, 0);
if (options.supprimerSiZero && reste == 0) {
ui.notifications.notify(`${itemData.name} supprimé de votre équipement`);
await this.delete();
}
else {
ui.notifications.notify(`Quantité de ${itemData.name} réduite de ${nombre}.${reste == 0
? "Il ne vous en reste plus, vous pouvez le supprimer de votre équipement, ou trouver un moyen de vous en procurer."
: ""}`);
await this.update({ "data.quantite": reste });
}
}
}
/* -------------------------------------------- */ /* -------------------------------------------- */
async postItem() { async postItem() {
console.log(this); console.log(this);
const properties = this[`_${this.data.type}ChatData`](); let chatData = duplicate(Misc.data(this));
const itemData = Misc.data(this); const properties = this[`_${chatData.type}ChatData`]();
let chatData = duplicate(itemData);
chatData["properties"] = properties chatData["properties"] = properties
//Check if the posted item should have availability/pay buttons //Check if the posted item should have availability/pay buttons
@ -45,8 +118,7 @@ export class RdDItem extends Item {
let dialogResult = [-1, -1]; // dialogResult[0] = quantité, dialogResult[1] = prix let dialogResult = [-1, -1]; // dialogResult[0] = quantité, dialogResult[1] = prix
if (chatData.hasPrice) { if (chatData.hasPrice) {
let sols = chatData.data.cout; chatData.data.cout_deniers = Math.floor(chatData.data.cout * 100);
chatData.data.cout_deniers = Math.floor(sols * 100);
dialogResult = await new Promise((resolve, reject) => { dialogResult = await new Promise((resolve, reject) => {
new Dialog({ new Dialog({
content: content:
@ -66,7 +138,7 @@ export class RdDItem extends Item {
post: { post: {
label: "Soumettre", label: "Soumettre",
callback: (dlg) => { callback: (dlg) => {
resolve([dlg.find('[name="quantity"]').val(), dlg.find('[name="price"]').val()]) resolve([Number(dlg.find('[name="quantity"]').val()), Number(dlg.find('[name="price"]').val())])
} }
}, },
} }
@ -74,28 +146,29 @@ export class RdDItem extends Item {
}) })
} }
if (dialogResult[0] > 0) { let quantiteEnvoi = Math.min(dialogResult[0], chatData.data.quantite);
const prixTotal = dialogResult[1];
if (quantiteEnvoi > 0) {
if (this.isOwned) { if (this.isOwned) {
if (itemData.data.quantite == 0) if (chatData.data.quantite == 0) {
dialogResult[0] = -1 quantiteEnvoi = -1
else if (itemData.data.quantite < dialogResult[0]) {
dialogResult[0] = itemData.data.quantite;
ui.notifications.notify(`Impossible de poster plus que ce que vous avez. La quantité à été réduite à ${dialogResult[0]}.`)
this.update({ "data.quantite": 0 })
} }
else { else if (quantiteEnvoi > chatData.data.quantite) {
ui.notifications.notify(`Quantité réduite par ${dialogResult[0]}.`) quantiteEnvoi = chatData.data.quantite;
this.update({ "data.quantite": itemData.data.quantite - dialogResult[0] }) ui.notifications.notify(`Impossible de poster plus que ce que vous avez. La quantité à été réduite à ${quantiteEnvoi}.`)
}
if (quantiteEnvoi > 0) {
this.diminuerQuantite(quantiteEnvoi);
} }
} }
} }
if (chatData.hasPrice) { if (chatData.hasPrice) {
if (dialogResult[0] > 0) if (quantiteEnvoi > 0)
chatData.postQuantity = Number(dialogResult[0]); chatData.postQuantity = Number(quantiteEnvoi);
if (dialogResult[1] > 0) { if (prixTotal > 0) {
chatData.postPrice = dialogResult[1]; chatData.postPrice = prixTotal;
chatData.data.cout_deniers = Math.floor(dialogResult[1] * 100); // Mise à jour cout en deniers chatData.data.cout_deniers = Math.floor(prixTotal * 100); // Mise à jour cout en deniers
} }
chatData.finalPrice = Number(chatData.postPrice) * Number(chatData.postQuantity); chatData.finalPrice = Number(chatData.postPrice) * Number(chatData.postQuantity);
chatData.data.cout_deniers_total = chatData.data.cout_deniers * Number(chatData.postQuantity); chatData.data.cout_deniers_total = chatData.data.cout_deniers * Number(chatData.postQuantity);
@ -110,7 +183,7 @@ export class RdDItem extends Item {
chatData.jsondata = JSON.stringify( chatData.jsondata = JSON.stringify(
{ {
compendium: "postedItem", compendium: "postedItem",
payload: itemData, payload: chatData,
}); });
renderTemplate('systems/foundryvtt-reve-de-dragon/templates/post-item.html', chatData).then(html => { renderTemplate('systems/foundryvtt-reve-de-dragon/templates/post-item.html', chatData).then(html => {
@ -119,219 +192,237 @@ export class RdDItem extends Item {
}); });
} }
static propertyIfDefined(name, val, condition) {
return condition ? [`<b>${name}</b>: ${val}`] : [];
}
/* -------------------------------------------- */ /* -------------------------------------------- */
_objetChatData() { _objetChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = [ let properties = [
`<b>Encombrement</b>: ${rddData.encombrement}` `<b>Encombrement</b>: ${tplData.encombrement}`
] ]
return properties; return properties;
} }
/* -------------------------------------------- */
_nourritureboissonChatData() {
const tplData = Misc.templateData(this);
let properties = [].concat(
RdDItem.propertyIfDefined('Sustentation', tplData.sust, tplData.sust > 0),
RdDItem.propertyIfDefined('Désaltère', tplData.desaltere, tplData.boisson),
RdDItem.propertyIfDefined('Force alcool', tplData.force, tplData.boisson && tplData.alcoolise),
RdDItem.propertyIfDefined('Exotisme', tplData.qualite, tplData.qualite < 0),
RdDItem.propertyIfDefined('Qualité', tplData.qualite, tplData.qualite > 0),
[`<b>Encombrement</b>: ${tplData.encombrement}`],
);
return properties;
}
/* -------------------------------------------- */ /* -------------------------------------------- */
_armeChatData() { _armeChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = [ let properties = [
`<b>Compétence</b>: ${rddData.competence}`, `<b>Compétence</b>: ${tplData.competence}`,
`<b>Dommages</b>: ${rddData.dommages}`, `<b>Dommages</b>: ${tplData.dommages}`,
`<b>Force minimum</b>: ${rddData.force}`, `<b>Force minimum</b>: ${tplData.force}`,
`<b>Resistance</b>: ${rddData.resistance}`, `<b>Resistance</b>: ${tplData.resistance}`,
`<b>Encombrement</b>: ${rddData.encombrement}` `<b>Encombrement</b>: ${tplData.encombrement}`
] ]
return properties; return properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_conteneurChatData() { _conteneurChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = [ let properties = [
`<b>Capacité</b>: ${rddData.capacite} Enc.`, `<b>Capacité</b>: ${tplData.capacite} Enc.`,
`<b>Encombrement</b>: ${rddData.encombrement}` `<b>Encombrement</b>: ${tplData.encombrement}`
] ]
return properties; return properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_munitionChatData() { _munitionChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = [ let properties = [
`<b>Encombrement</b>: ${rddData.encombrement}` `<b>Encombrement</b>: ${tplData.encombrement}`
] ]
return properties; return properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_armureChatData() { _armureChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = [ let properties = [
`<b>Protection</b>: ${rddData.protection}`, `<b>Protection</b>: ${tplData.protection}`,
`<b>Détérioration</b>: ${rddData.deterioration}`, `<b>Détérioration</b>: ${tplData.deterioration}`,
`<b>Malus armure</b>: ${rddData.malus}`, `<b>Malus armure</b>: ${tplData.malus}`,
`<b>Encombrement</b>: ${rddData.encombrement}` `<b>Encombrement</b>: ${tplData.encombrement}`
] ]
return properties; return properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_competenceChatData() { _competenceChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = [ let properties = [
`<b>Catégorie</b>: ${rddData.categorie}`, `<b>Catégorie</b>: ${tplData.categorie}`,
`<b>Niveau</b>: ${rddData.niveau}`, `<b>Niveau</b>: ${tplData.niveau}`,
`<b>Caractéristique par défaut</b>: ${rddData.carac_defaut}`, `<b>Caractéristique par défaut</b>: ${tplData.carac_defaut}`,
`<b>XP</b>: ${rddData.xp}` `<b>XP</b>: ${tplData.xp}`
] ]
return properties; return properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_competencecreatureChatData() { _competencecreatureChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = [ let properties = [
`<b>Catégorie</b>: ${rddData.categorie}`, `<b>Catégorie</b>: ${tplData.categorie}`,
`<b>Niveau</b>: ${rddData.niveau}`, `<b>Niveau</b>: ${tplData.niveau}`,
`<b>Caractéristique</b>: ${rddData.carac_value}`, `<b>Caractéristique</b>: ${tplData.carac_value}`,
`<b>XP</b>: ${rddData.xp}` `<b>XP</b>: ${tplData.xp}`
] ]
return properties; return properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_sortChatData() { _sortChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = [ let properties = [
`<b>Draconic</b>: ${rddData.draconic}`, `<b>Draconic</b>: ${tplData.draconic}`,
`<b>Difficulté</b>: ${rddData.difficulte}`, `<b>Difficulté</b>: ${tplData.difficulte}`,
`<b>Case TMR</b>: ${rddData.caseTMR}`, `<b>Case TMR</b>: ${tplData.caseTMR}`,
`<b>Points de Rêve</b>: ${rddData.ptreve}` `<b>Points de Rêve</b>: ${tplData.ptreve}`
] ]
return properties; return properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_herbeChatData() { _herbeChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = [ let properties = [
`<b>Milieu</b>: ${rddData.milieu}`, `<b>Milieu</b>: ${tplData.milieu}`,
`<b>Rareté</b>: ${rddData.rarete}`, `<b>Rareté</b>: ${tplData.rarete}`,
`<b>Catégorie</b>: ${rddData.categorie}`, `<b>Catégorie</b>: ${tplData.categorie}`,
] ]
return properties; return properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_ingredientChatData() { _ingredientChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = [ let properties = [
`<b>Milieu</b>: ${rddData.milieu}`, `<b>Milieu</b>: ${tplData.milieu}`,
`<b>Rareté</b>: ${rddData.rarete}`, `<b>Rareté</b>: ${tplData.rarete}`,
`<b>Catégorie</b>: ${rddData.categorie}`, `<b>Catégorie</b>: ${tplData.categorie}`,
] ]
return properties; return properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_tacheChatData() { _tacheChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = [ let properties = [
`<b>Caractéristique</b>: ${rddData.carac}`, `<b>Caractéristique</b>: ${tplData.carac}`,
`<b>Compétence</b>: ${rddData.competence}`, `<b>Compétence</b>: ${tplData.competence}`,
`<b>Périodicité</b>: ${rddData.periodicite}`, `<b>Périodicité</b>: ${tplData.periodicite}`,
`<b>Fatigue</b>: ${rddData.fatigue}`, `<b>Fatigue</b>: ${tplData.fatigue}`,
`<b>Difficulté</b>: ${rddData.difficulte}`, `<b>Difficulté</b>: ${tplData.difficulte}`,
`<b>Points de Tâche</b>: ${rddData.points_de_tache}`, `<b>Points de Tâche</b>: ${tplData.points_de_tache}`,
`<b>Points de Tâche atteints</b>: ${rddData.points_de_tache_courant}` `<b>Points de Tâche atteints</b>: ${tplData.points_de_tache_courant}`
] ]
return properties; return properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_livreChatData() { _livreChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = [ let properties = [
`<b>Compétence</b>: ${rddData.competence}`, `<b>Compétence</b>: ${tplData.competence}`,
`<b>Auteur</b>: ${rddData.auteur}`, `<b>Auteur</b>: ${tplData.auteur}`,
`<b>Difficulté</b>: ${rddData.difficulte}`, `<b>Difficulté</b>: ${tplData.difficulte}`,
`<b>Points de Tâche</b>: ${rddData.points_de_tache}`, `<b>Points de Tâche</b>: ${tplData.points_de_tache}`,
`<b>Encombrement</b>: ${rddData.encombrement}` `<b>Encombrement</b>: ${tplData.encombrement}`
] ]
return properties; return properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_potionChatData() { _potionChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = [ let properties = [
`<b>Rareté</b>: ${rddData.rarete}`, `<b>Rareté</b>: ${tplData.rarete}`,
`<b>Catégorie</b>: ${rddData.categorie}`, `<b>Catégorie</b>: ${tplData.categorie}`,
`<b>Encombrement</b>: ${rddData.encombrement}`, `<b>Encombrement</b>: ${tplData.encombrement}`,
] ]
return properties; return properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_queueChatData() { _queueChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = [ let properties = [
`<b>Refoulement</b>: ${rddData.refoulement}` `<b>Refoulement</b>: ${tplData.refoulement}`
] ]
return properties; return properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_ombreChatData() { _ombreChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = [ let properties = [
`<b>Refoulement</b>: ${rddData.refoulement}` `<b>Refoulement</b>: ${tplData.refoulement}`
] ]
return properties; return properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_souffleChatData() { _souffleChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = []; let properties = [];
return properties; return properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_teteChatData() { _teteChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = []; let properties = [];
return properties; return properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_tarotChatData() { _tarotChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = [ let properties = [
`<b>Concept</b>: ${rddData.concept}`, `<b>Concept</b>: ${tplData.concept}`,
`<b>Aspect</b>: ${rddData.aspect}`, `<b>Aspect</b>: ${tplData.aspect}`,
] ]
return properties; return properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_nombreastralChatData() { _nombreastralChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = [ let properties = [
`<b>Valeur</b>: ${rddData.value}`, `<b>Valeur</b>: ${tplData.value}`,
`<b>Jour</b>: ${rddData.jourlabel}`, `<b>Jour</b>: ${tplData.jourlabel}`,
] ]
return properties; return properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_monnaieChatData() { _monnaieChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = [ let properties = [
`<b>Valeur en Deniers</b>: ${rddData.valeur_deniers}`, `<b>Valeur en Deniers</b>: ${tplData.valeur_deniers}`,
`<b>Encombrement</b>: ${rddData.encombrement}` `<b>Encombrement</b>: ${tplData.encombrement}`
] ]
return properties; return properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_meditationChatData() { _meditationChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = [ let properties = [
`<b>Thème</b>: ${rddData.theme}`, `<b>Thème</b>: ${tplData.theme}`,
`<b>Compétence</b>: ${rddData.competence}`, `<b>Compétence</b>: ${tplData.competence}`,
`<b>Support</b>: ${rddData.support}`, `<b>Support</b>: ${tplData.support}`,
`<b>Heure</b>: ${rddData.heure}`, `<b>Heure</b>: ${tplData.heure}`,
`<b>Purification</b>: ${rddData.purification}`, `<b>Purification</b>: ${tplData.purification}`,
`<b>Vêture</b>: ${rddData.veture}`, `<b>Vêture</b>: ${tplData.veture}`,
`<b>Comportement</b>: ${rddData.comportement}`, `<b>Comportement</b>: ${tplData.comportement}`,
`<b>Case TMR</b>: ${rddData.tmr}` `<b>Case TMR</b>: ${tplData.tmr}`
] ]
return properties; return properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_casetmrChatData() { _casetmrChatData() {
const rddData = Misc.data(this).data; const tplData = Misc.templateData(this);
let properties = [ let properties = [
`<b>Coordonnée</b>: ${rddData.coord}`, `<b>Coordonnée</b>: ${tplData.coord}`,
`<b>Spécificité</b>: ${rddData.specific}` `<b>Spécificité</b>: ${tplData.specific}`
] ]
return properties; return properties;
} }

View File

@ -47,7 +47,11 @@ export class Misc {
const parsed = parseInt(value); const parsed = parseInt(value);
return isNaN(parsed) ? 0 : parsed; return isNaN(parsed) ? 0 : parsed;
} }
static keepDecimals(num, decimals) {
if (decimals<=0 || decimals>6) return num;
const decimal = Math.pow(10, parseInt(decimals));
return Math.round(num * decimal) / decimal;
}
static getFractionHtml(diviseur) { static getFractionHtml(diviseur) {
if (!diviseur || diviseur <= 1) return undefined; if (!diviseur || diviseur <= 1) return undefined;
switch (diviseur || 1) { switch (diviseur || 1) {

View File

@ -48,16 +48,6 @@ export class RdDHerbes extends Item {
formData.isRepos = true; formData.isRepos = true;
this.computeHerbeBonus(formData, this.herbesRepos, 7); this.computeHerbeBonus(formData, this.herbesRepos, 7);
} }
if (formData.data.categorie.includes('Enchante') ) {
formData.isEnchante = true;
if ( formData.isHerbe) {
formData.pointsGuerison = this.calculePointsGuerison( formData.data );
}
if ( formData.isRepos) {
formData.caseRepos = formData.data.herbebonus * formData.data.pr;
}
}
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@ -935,7 +935,7 @@ ul, li {
background: rgba(220,220,210,0.75); background: rgba(220,220,210,0.75);
border: 2px solid #545469; border: 2px solid #545469;
} }
.chat-message .chat-icon { .chat-icon {
border: 0; border: 0;
padding: 2px 6px 2px 2px; padding: 2px 6px 2px 2px;
float: left; float: left;

View File

@ -9,7 +9,7 @@
</div> </div>
<div class="flexrow flex-group-center flex-actions-bar"> <div class="flexrow flex-group-center flex-actions-bar">
<div> <div>
<span id="encaisser-direct"><a title="Encaisser des dommages"><img class="button-img" src="icons/svg/bones.svg" alt="Encaisser des dommages"/></a></span> <span class="encaisser-direct"><a title="Encaisser des dommages"><img class="button-img" src="icons/svg/bones.svg" alt="Encaisser des dommages"/></a></span>
<span class="gm-only remise-a-neuf"><a title="Remise à neuf"><img class="button-img" src="icons/svg/regen.svg" alt="Remise à neuf"/></a></span> <span class="gm-only remise-a-neuf"><a title="Remise à neuf"><img class="button-img" src="icons/svg/regen.svg" alt="Remise à neuf"/></a></span>
</div> </div>
</div> </div>

View File

@ -9,7 +9,7 @@
</div> </div>
<div class="flexrow flex-group-center flex-actions-bar"> <div class="flexrow flex-group-center flex-actions-bar">
<div> <div>
<span id="encaisser-direct"><a title="Encaisser des dommages"><img class="button-img" src="icons/svg/bones.svg" alt="Encaisser des dommages"/></a></span> <span class="encaisser-direct"><a title="Encaisser des dommages"><img class="button-img" src="icons/svg/bones.svg" alt="Encaisser des dommages"/></a></span>
<span class="gm-only remise-a-neuf"><a title="Remise à neuf"><img class="button-img" src="icons/svg/regen.svg" alt="Remise à neuf"/></a></span> <span class="gm-only remise-a-neuf"><a title="Remise à neuf"><img class="button-img" src="icons/svg/regen.svg" alt="Remise à neuf"/></a></span>
</div> </div>
</div> </div>

View File

@ -9,10 +9,13 @@
<span class="item-quantite">{{item.data.quantite}}</span> <span class="item-quantite">{{item.data.quantite}}</span>
<span class="item-quantite">{{numberFormat item.data.encTotal decimals=2}}</span> <span class="item-quantite">{{numberFormat item.data.encTotal decimals=2}}</span>
<div class="item-controls flex-grow"> <div class="item-controls flex-grow">
{{#unless item.estContenu}}
<a class="item-control item-equip" title="Equiper">{{#if item.data.equipe}}<i class="fas fa-circle"></i>{{else}}<i class="fas fa-genderless"></i>{{/if}}</a>
{{/unless}}
<a class="item-control item-edit" title="Editer"><i class="fas fa-edit"></i></a> <a class="item-control item-edit" title="Editer"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
{{#if (eq item.type 'nourritureboisson')}} {{#if item.data.actionPrincipale}}
<a class="item-name item-consommer">Consommer</a> <a class="item-name item-action">{{item.data.actionPrincipale}}</a>
{{/if}} {{/if}}
</div> </div>
</li> </li>

View File

@ -55,14 +55,14 @@
</ul> </ul>
<div class="flex-group-center flex-actions-bar"> <div class="flex-group-center flex-actions-bar">
<div> <div>
<span id="encaisser-direct"><a title="Encaisser des dommages"><img class="button-img" src="icons/svg/bones.svg" alt="Encaisser des dommages"/></a></span> <span class="encaisser-direct"><a title="Encaisser des dommages"><img class="button-img" src="icons/svg/bones.svg" alt="Encaisser des dommages"/></a></span>
<span class="gm-only remise-a-neuf"><a title="Remise à neuf"><img class="button-img" src="icons/svg/regen.svg" alt="Remise à neuf"/></a></span> <span class="gm-only remise-a-neuf"><a title="Remise à neuf"><img class="button-img" src="icons/svg/regen.svg" alt="Remise à neuf"/></a></span>
<span id="dormir-une-heure"><a title="Dormir une heure"><img class="button-img" src="icons/svg/sleep.svg" alt="Dormir une heure"/></a></span> <span class="dormir-une-heure"><a title="Dormir une heure"><img class="button-img" src="icons/svg/sleep.svg" alt="Dormir une heure"/></a></span>
<span id="dormir-chateau-dormant"><a title="Chateau Dormant"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/icons/heures/hd12.svg" alt="Chateau Dormant"/></a></span> <span class="dormir-chateau-dormant"><a title="Chateau Dormant"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/icons/heures/hd12.svg" alt="Chateau Dormant"/></a></span>
{{#if data.attributs.hautrevant.value}} {{#if data.attributs.hautrevant.value}}
<span id="monte-tmr"><a title="Montée dans les Terres M&eacute;dianes !"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-normal.svg" alt="Montée dans les Terres M&eacute;dianes !"/></a></span> <span class="monte-tmr"><a title="Montée dans les Terres M&eacute;dianes !"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-normal.svg" alt="Montée dans les Terres M&eacute;dianes !"/></a></span>
<span id="monte-tmr-rapide"><a title="Montée accélérée dans les Terres M&eacute;dianes !"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-rapide.svg" alt="Montée accélérée dans les Terres M&eacute;dianes !"/></a></span> <span class="monte-tmr-rapide"><a title="Montée accélérée dans les Terres M&eacute;dianes !"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-rapide.svg" alt="Montée accélérée dans les Terres M&eacute;dianes !"/></a></span>
<span id="visu-tmr"><a title="Regarder les Terres M&eacute;dianes"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-view.svg" alt="Regarder les Terres M&eacute;dianes"/></a></span> <span class="visu-tmr"><a title="Regarder les Terres M&eacute;dianes"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-view.svg" alt="Regarder les Terres M&eacute;dianes"/></a></span>
{{/if}} {{/if}}
</div> </div>
<div class="flexrow"> <div class="flexrow">
@ -84,7 +84,7 @@
</span> </span>
{{/each}} {{/each}}
{{#if options.isGM}} {{#if options.isGM}}
<span id="enlever-tous-effets"><a>(enlever tout)</a></span> <span class="enlever-tous-effets"><a>(enlever tout)</a></span>
{{/if}} {{/if}}
{{else}} {{else}}
Aucun effet actif Aucun effet actif
@ -754,20 +754,7 @@
{{#each objets as |item id|}} {{#each objets as |item id|}}
{{#unless item.estContenu}} {{#unless item.estContenu}}
{{#if (ne item.type 'conteneur')}} {{#if (ne item.type 'conteneur')}}
<li class="item flexrow list-item" data-item-id="{{item._id}}"> {{> "systems/foundryvtt-reve-de-dragon/templates/actor-inventaire-conteneur.html" item=item }}
<img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/>
<span class="item-name flex-grow">{{item.name}}</span>
<span class="item-quantite">{{item.data.quantite}}</span>
<span class="item-quantite">{{numberFormat item.data.encTotal decimals=2}}</span>
<span class="item-controls flex-grow">
<a class="item-control item-equip" title="Equiper">{{#if item.data.equipe}}<i class="fas fa-circle"></i>{{else}}<i class="fas fa-genderless"></i>{{/if}}</a>
<a class="item-control item-edit" title="Editer"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
{{#if (and (eq item.type 'nourritureboisson') item.data.quantite)}}
<a class="item-name item-consommer">Consommer</a>
{{/if}}
</span>
</li>
{{/if}} {{/if}}
{{/unless}} {{/unless}}
{{/each}} {{/each}}

View File

@ -1,9 +1,9 @@
<img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/competence_botanique.png" alt="potion de repos" /> <img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/competence_botanique.png" alt="potion de repos" />
<h4> <h4>
{{alias}} consomme sa Potion {{enchanteTexte}} de {{name}}. {{alias}} consomme sa <b>Potion {{#if data.isEnchante}}enchantée{{/if}}</b> de {{name}}.
</h4> </h4>
<hr> <hr>
<div> <div>
Les effets de la potions sont à gérer manuellement, en fonction de sa nature{{#if isEnchante}} et de son enchantement ({{data.pr}} Points de Rêve){{/if}}. Les effets de la potions sont à gérer manuellement, en fonction de sa nature{{#if data.isEnchante}} et de son enchantement ({{data.pr}} Points de Rêve){{/if}}.
<br>La potion a été supprimée de l'équipement. <br>La potion a été supprimée de l'équipement.
</div> </div>

View File

@ -1,11 +1,11 @@
<img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/competence_botanique.png" alt="potion de repos" /> <img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/competence_botanique.png" alt="potion de repos" />
<h4> <h4>
{{alias}} consomme sa Potion de Repos {{enchanteTexte}} de {{name}} ({{data.herbe}}, {{data.herbebrins}} brins). {{alias}} consomme sa <b>Potion de Repos {{#if data.isEnchante}}enchantée{{/if}}</b> de {{name}} ({{data.herbe}}, {{data.herbebrins}} brins).
</h4> </h4>
<hr> <hr>
<div> <div>
{{#if casesRepos}} {{#if data.isEnchante}}
Elle permet de récupérer jusqu'à {{casesRepos}} cases de repos. Elle permet de récupérer jusqu'à {{data.puissance}} cases de repos.
{{else}} {{else}}
Une fois consommée vers fin Lyre, elle vous octroie un bonus de {{data.herbebonus}} segments de fatigue récupérés en plus à la fin de Chateau Dormant (à gérer manuellement). Une fois consommée vers fin Lyre, elle vous octroie un bonus de {{data.herbebonus}} segments de fatigue récupérés en plus à la fin de Chateau Dormant (à gérer manuellement).
<br>La potion a également été supprimée de l'équipement. <br>La potion a également été supprimée de l'équipement.

View File

@ -1,11 +1,11 @@
<img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/competence_botanique.png" alt="potion de soin" /> <img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/competence_botanique.png" alt="potion de soin" />
<h4> <h4>
{{alias}} consomme sa Potion de Soins {{enchanteTexte}} de {{name}} ({{data.herbe}}, {{data.herbebrins}} brins). {{alias}} consomme sa <b>Potion de soins {{#if data.isEnchante}}enchantée{{/if}}</b> de {{name}} ({{data.herbe}}, {{data.herbebrins}} brins).
</h4> </h4>
<hr> <hr>
<div> <div>
{{#if pointsGuerison}} {{#if data.isEnchante}}
Elle permet de guérir {{pointsGuerison}} Points de Guérison. Elle permet de guérir {{data.puissance}} Points de Guérison.
{{else}} {{else}}
Lors de votre prochain jet de récupération à Chateau Dormant, vous bénéficierez d'un bonus de {{data.herbebonus}} (appliqué automatiquement). Lors de votre prochain jet de récupération à Chateau Dormant, vous bénéficierez d'un bonus de {{data.herbebonus}} (appliqué automatiquement).
<br>La potion a également été supprimée de l'équipement. <br>La potion a également été supprimée de l'équipement.

View File

@ -0,0 +1,36 @@
<form class="rdddialog">
<div class="flexrow">
<label>Quantité de {{item.name}} à {{#if item.data.boisson}}boire{{else}}manger{{/if}}</label>
<input class="attribute-value consommer-doses" type="text" name="doses" value="{{choix.doses}}"
size="3" min="0" max="{{item.data.quantite}}"
data-dtype="Number" />
</div>
{{#if item.data.sust}}
<p>Cette {{#if item.data.boisson}}boisson{{else}}nourriture{{/if}} vous apportera <span
class="total-sust">{{totalSust}}</span> de sustantation.</p>
{{/if}}
{{#if item.data.boisson}}
<p>{{#if item.data.alcoolise}}
C'est une boisson alcoolisée de force {{item.data.force}}, vous effectuerez un jet d'éthylisme.
{{/if}}
Cette boisson vous apportera <span class="total-desaltere">{{totalDesaltere}}</span> unités d'eau.
</p>
{{/if}}
{{#if (gt item.data.qualite cuisine.data.niveau)}}
<p>La qualité du plat est telle qu'un jet de Goût/Cuisine à {{numberFormat item.data.qualite decimals=0 sign=true}}
vous permettra un jet de moral heureux.</p>
{{/if}}
{{#if (lt item.data.qualite 0)}}
<p>
Pour surmonter l'exotisme, vous devez effectuer un jet de Volonté/Cuisine à
{{numberFormat item.data.qualite decimals=0 sign=true}}.
</p>
<p>
<label>En cas d'échec, voulez-vous vous forcer à manger (et subir un jet de moral en situation
malheureuse)?</label>
<input class="attribute-value se-forcer" type="checkbox" name="se-forcer" {{#if choix.seForcer}}checked{{/if}} />
</p>
{{/if}}
</form>

View File

@ -1,39 +0,0 @@
<form class="rdddialog">
<div class="form-group">
<label>Quantité de {{name}} à {{#if data.boisson}}boire{{else}}manger{{/if}}</label>
<input class="attribute-value consommer-doses" type="text" name="doses" value="{{doses}}" data-dtype="Number" />
</div>
<div>
{{#if data.sust}}
<p>
Cette {{#if data.boisson}}boisson{{else}}nourriture{{/if}} vous apportera {{data.sust}} de
sustantation.
</p>
{{/if}}
{{#if data.boisson}}
<p>{{#if data.alcoolise}}
C'est une boisson alcoolisée de force {{data.force}}, vous effectuerez un jet d'éthylisme.
{{/if}}
Cette boisson vous apportera {{data.desaltere}} unités d'eau.
</p>
{{/if}}
{{#if (gt data.qualite cuisine.data.niveau)}}
<p>La qualité du plat est telle qu'un jet de Goût/Cuisine à {{numberFormat data.qualite decimals=0 sign=true}}
vous permettra un jet de moral heureux.</p>
{{/if}}
</div>
{{#if (lt data.qualite 0)}}
<div>
<p>
Pour surmonter l'exotisme, vous devez effectuer un jet de Volonté/Cuisine à {{numberFormat data.qualite decimals=0 sign=true}}.
</p>
<p>
<label>En cas d'échec, voulez-vous vous forcer à manger (et subir un jet de moral en situation
malheureuse)?</label>
<input class="attribute-value" type="checkbox" name="se-forcer" />
</p>
</div>
{{/if}}
</form>

View File

@ -5,7 +5,7 @@
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1> <h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1>
{{#if isOwned}} {{#if isOwned}}
<div class="form-group"> <div class="form-group">
<span for="xp"><a class="fabriquer-potion chat-card-button" data-actor-id="{{actorId}}">Consommer cette potion et appliquer ses effets</a></span> <span for="xp"><a class="consommer-potion chat-card-button" data-actor-id="{{actorId}}">Consommer cette potion et appliquer ses effets</a></span>
</div> </div>
{{/if}} {{/if}}
</div> </div>
@ -77,7 +77,7 @@
<input class="attribute-value" type="checkbox" name="data.reposalchimique" {{#if data.reposalchimique}}checked{{/if}}/> <input class="attribute-value" type="checkbox" name="data.reposalchimique" {{#if data.reposalchimique}}checked{{/if}}/>
</div> </div>
{{/if}} {{/if}}
{{#if isEnchante}} {{#if data.isEnchante}}
<div class="form-group"> <div class="form-group">
<label>Points de rêve</label> <label>Points de rêve</label>
<input class="attribute-value" type="text" name="data.pr" value="{{data.pr}}" data-dtype="Number" /> <input class="attribute-value" type="text" name="data.pr" value="{{data.pr}}" data-dtype="Number" />

View File

@ -4,25 +4,27 @@
<img src="{{img}}" title="{{name}}" /> <img src="{{img}}" title="{{name}}" />
{{/if}} {{/if}}
<div class="card-content">{{{data.description}}}</div> <p class="card-content">{{{data.description}}}</p>
<p>
{{#each properties as |property p|}} {{#each properties as |property p|}}
<span>{{{property}}}</span><br> <span>{{{property}}}</span><br>
{{/each}} {{/each}}
<div> {{#if (or postQuantity postPrice)}}
{{#if postPrice}} <span>
<b>Prix: </b> <span class="postPrice">{{postPrice}} Sols</span>
{{/if}}
{{#if postQuantity}} {{#if postQuantity}}
<b>Quantité: </b> <span class="postQuantity">{{postQuantity}}</span> <b>Quantité: </b> <span class="postQuantity">{{postQuantity}}</span>
{{/if}} {{/if}}
</div> {{#if postPrice}}
<b>Prix: </b> <span class="postPrice">{{postPrice}} Sols</span><br>
{{#if finalPrice}}
<div>
<b>Prix Total: </b> <span class="postPrice">{{finalPrice}} Sols</span>
</div>
{{/if}} {{/if}}
</span>
{{/if}}
{{#if finalPrice}}
<span>
<b>Prix Total: </b> <span class="postPrice">{{finalPrice}} Sols</span><br>
</span>
{{/if}}
</p>
{{#if hasPrice}} {{#if hasPrice}}
<span class="chat-card-button-area"> <span class="chat-card-button-area">