Gestion des signes draconiques #455

Closed
vincent.vandeme wants to merge 233 commits from v1.4-signes-draconiques into master
20 changed files with 528 additions and 450 deletions
Showing only changes of commit 870ca61d7d - Show all commits

View File

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

View File

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

View File

@ -27,7 +27,6 @@ import { EffetsDraconiques } from "./tmr/effets-draconiques.js";
import { Draconique } from "./tmr/draconique.js";
import { RdDCarac } from "./rdd-carac.js";
import { Monnaie } from "./item-monnaie.js";
import { RdDHerbes } from "./rdd-herbes.js";
import { DialogConsommer } from "./dialog-consommer.js";
import { DialogFabriquerPotion } from "./dialog-fabriquer-potion.js";
@ -310,22 +309,22 @@ export class RdDActor extends Actor {
getDemiReve() {
return Misc.templateData(this).reve.tmrpos.coord;
}
/* -------------------------------------------- */
async verifierPotionsEnchantees() {
let potionsEnchantees = this.filterItemsData( it => it.type == 'potion' && it.data.categorie.toLowerCase().includes('enchante'));
for ( let potion of potionsEnchantees) {
if ( !potion.prpermanent) {
let potionsEnchantees = this.filterItemsData(it => it.type == 'potion' && it.data.isEnchante);
for (let potion of potionsEnchantees) {
if (!potion.prpermanent) {
console.log(potion);
let newPr = (potion.data.pr > 0) ? potion.data.pr - 1 : 0;
let update = { _id: potion._id, 'data.pr': newPr};
let update = { _id: potion._id, 'data.pr': newPr };
const updated = await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
let messageData = {
pr : newPr,
alias : this.name,
potionName : potion.name,
potionImg : potion.img
pr: newPr,
alias: this.name,
potionName: potion.name,
potionImg: potion.img
}
ChatMessage.create({
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
@ -380,7 +379,7 @@ export class RdDActor extends Actor {
await this._recupereChance();
await this.transformerStress();
await this.retourSeuilDeReve(message);
this.bonusRecuperationPotion= 0; // Reset potion
this.bonusRecuperationPotion = 0; // Reset potion
await this.retourSust(message);
await this.verifierPotionsEnchantees();
message.content = `A la fin Chateau Dormant, ${message.content}<br>Un nouveau jour se lève`;
@ -404,7 +403,7 @@ export class RdDActor extends Actor {
let definition = definitions.find(d => d.type == type);
for (let blessure of liste) {
if (blessure.jours >= definition.facteur) {
let rolled = await this._jetRecuperationConstitution(Misc.toInt(blessure.soins_complets)+this.bonusRecuperationPotion, message);
let rolled = await this._jetRecuperationConstitution(Misc.toInt(blessure.soins_complets) + this.bonusRecuperationPotion, message);
blessure.soins_complets = 0;
if (rolled.isSuccess && this._retrograderBlessure(type, blessure, moindres)) {
message.content += ` -- une blessure ${type} cicatrise`;
@ -743,7 +742,6 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */
async updateCreatureCompetence(compName, fieldName, compValue) {
let comp = this.getCompetence(compName);
//console.log(comp);
if (comp) {
const update = { _id: comp.id }
if (fieldName == "niveau")
@ -752,7 +750,6 @@ export class RdDActor extends Actor {
update['data.dommages'] = compValue;
else
update['data.carac_value'] = compValue;
//console.log(update);
const updated = await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
}
}
@ -1610,25 +1607,80 @@ export class RdDActor extends Actor {
}
/* -------------------------------------------- */
async consommer(item) {
DialogConsommer.create(this, item, {
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-consommer-nourriture.html',
}, []);
async actionItem(item) {
if (!item.getActionPrincipale()) return;
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) {
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) {
await this.actor.updateCompteurValue('eau', Misc.templateData(this).eau.value + this.consommerData.data.desaltere);
/* -------------------------------------------- */
async boire(item, doses, options = { diminuerQuantite: true }) {
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 etatGeneral = this.getEtatGeneral({ ethylisme: true });
const nbDoses = -Number(actorTplData.compteurs.ethylisme.nb_doses || 0);
@ -1643,26 +1695,28 @@ export class RdDActor extends Actor {
await this.performEthylisme(rollData);
}
async apprecierCuisine(consommerData) {
async apprecierCuisine(item) {
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) {
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) {
await this.jetDeMoral('heureux');
}
}
}
async surmonterExotisme(consommerData) {
const qualite = consommerData.data.qualite;
async surmonterExotisme(item, choix = {}) {
const itemData = Misc.data(item);
const qualite = itemData.data.qualite;
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 (!consommerData.data.seForcer) {
if (!choix.seForcer) {
return false;
}
await this.actor.jetDeMoral('malheureux');
await this.jetDeMoral('malheureux');
}
}
return true;
@ -2102,7 +2156,7 @@ export class RdDActor extends Actor {
caracValue: Number(carac.value),
selectedCarac: carac,
competence: competence,
finalLevel: (competence?.data.niveau ?? 0) + diff,
finalLevel: (Misc.templateData(competence)?.niveau ?? 0) + diff,
diffLibre: diff,
showDice: true,
show: { title: options?.title ?? '' }
@ -2320,7 +2374,7 @@ export class RdDActor extends Actor {
"cout": artData.exotismeFinal < 0 ? 0 : artData.qualiteFinale * 0.01
}
};
if (artData.ajouterEquipement){
if (artData.ajouterEquipement) {
await this.createEmbeddedDocuments('Item', [platCuisine]);
ui.notifications.info(`${platCuisine.data.quantite} rations de ${platCuisine.name} ont été ajoutés à votre équipement`);
}
@ -3187,7 +3241,7 @@ export class RdDActor extends Actor {
}
/* -------------------------------------------- */
async buildPotionGuerisonList( pointsGuerison) {
async buildPotionGuerisonList(pointsGuerison) {
let pointsGuerisonInitial = pointsGuerison;
let myData = Misc.templateData(this);
const blessures = duplicate(myData.blessures);
@ -3195,70 +3249,66 @@ export class RdDActor extends Actor {
console.log(blessures);
for (let critique of blessures.critiques.liste) {
if (critique.active && pointsGuerison >= 6 ) {
if (critique.active && pointsGuerison >= 6) {
pointsGuerison -= 6;
critique.active = false;
guerisonData.list.push( "1 Blessure Critique (6 points)");
guerisonData.list.push("1 Blessure Critique (6 points)");
}
}
for (let grave of blessures.graves.liste) {
if (grave.active && pointsGuerison >= 4 ) {
if (grave.active && pointsGuerison >= 4) {
pointsGuerison -= 4;
grave.active = false;
guerisonData.list.push( "1 Blessure Grave (4 points)");
guerisonData.list.push("1 Blessure Grave (4 points)");
}
}
for (let legere of blessures.legeres.liste) {
if (legere.active && pointsGuerison >= 2 ) {
if (legere.active && pointsGuerison >= 2) {
pointsGuerison -= 2;
legere.active = false;
guerisonData.list.push( "1 Blessure Légère (2 points)");
guerisonData.list.push("1 Blessure Légère (2 points)");
}
}
await this.update({ "data.blessures": blessures });
let pvManquants = myData.sante.vie.max - myData.sante.vie.value;
let pvSoignees = Math.min(pvManquants, Math.floor(pointsGuerison / 2 ));
pointsGuerison -= pvSoignees*2;
guerisonData.list.push( pvSoignees + " Points de Vie soignés");
let pvSoignees = Math.min(pvManquants, Math.floor(pointsGuerison / 2));
pointsGuerison -= pvSoignees * 2;
guerisonData.list.push(pvSoignees + " Points de Vie soignés");
await this.santeIncDec('vie', +pvSoignees, false);
guerisonData.pointsConsommes = pointsGuerisonInitial - pointsGuerison;
return guerisonData;
}
}
/* -------------------------------------------- */
async consommerPotionSoin(potionData) {
potionData.alias = this.name;
potionData.supprimer = true;
if (potionData.data.categorie.includes('Enchante')) {
potionData.pointsGuerison = RdDHerbes.calculePointsGuerison( potionData.data);
potionData.enchanteTexte = "enchantée";
potionData.isEnchante = true;
if (potionData.data.isEnchante) {
ChatMessage.create({
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)
});
// Gestion de la résistance:
let rolled = await RdDResolutionTable.roll(this.getReveActuel(), -8 );
let rolled = await RdDResolutionTable.roll(this.getReveActuel(), -8);
potionData.reussiteReve = false;
if (!rolled.isSuccess) {
await this.reveActuelIncDec(-1);
potionData.guerisonData = await this.buildPotionGuerisonList(potionData.pointsGuerison);
potionData.guerisonMinutes = potionData.guerisonData.pointsConsommes * 5;
potionData.guerisonData = await this.buildPotionGuerisonList(potionData.data.puissance);
potionData.guerisonMinutes = potionData.guerisonData.pointsConsommes * 5;
potionData.reussiteReve = true;
}
ChatMessage.create({
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)
});
} else {
potionData.enchanteTexte = "";
potionData.isEnchante = false;
ChatMessage.create({
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)
});
this.bonusRecuperationPotion = potionData.data.herbeBonus;
}
}
@ -3266,29 +3316,27 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */
async consommerPotionRepos(potionData) {
potionData.alias = this.name;
potionData.supprimer = true;
if (potionData.data.categorie.includes('Enchante')) {
potionData.casesRepos = RdDHerbes.calculePointsRepos( potionData.data);
potionData.enchanteTexte = "enchantée";
potionData.isEnchante = true;
if (potionData.data.isEnchante) {
ChatMessage.create({
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)
});
// Gestion de la résistance:
let rolled = await RdDResolutionTable.roll(this.getReveActuel(), -8 );
let rolled = await RdDResolutionTable.roll(this.getReveActuel(), -8);
potionData.reussiteReve = false;
if (!rolled.isSuccess) {
await this.reveActuelIncDec(-1);
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.guerisonDureeValue = (potionData.data.reposalchimique) ? potionData.caseFatigueReel : potionData.caseFatigueReel*5;
potionData.guerisonDureeValue = (potionData.data.reposalchimique) ? potionData.caseFatigueReel : potionData.caseFatigueReel * 5;
potionData.reussiteReve = true;
potionData.aphasiePermanente = false;
if ( potionData.data.reposalchimique ) {
let chanceAphasie = new Roll("1d100").evaluate({async : false} ).total;
if ( chanceAphasie <= potionData.data.pr ) {
if (potionData.data.reposalchimique) {
let chanceAphasie = new Roll("1d100").evaluate({ async: false }).total;
if (chanceAphasie <= potionData.data.pr) {
potionData.aphasiePermanente = true;
}
}
@ -3296,89 +3344,85 @@ export class RdDActor extends Actor {
}
ChatMessage.create({
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)
});
} else {
potionData.enchanteTexte = "";
potionData.isEnchante = false;
ChatMessage.create({
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)
});
this.bonusRepos = potionData.data.herbeBonus;
}
}
/* -------------------------------------------- */
dialogFabriquerPotion( herbe ) {
dialogFabriquerPotion(herbe) {
DialogFabriquerPotion.create(this, herbe, {
html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-fabriquer-potion-base.html',
}, []);
}
/* -------------------------------------------- */
async fabriquerPotion( potionData ) {
async fabriquerPotion(herbeData) {
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",
data: { quantite: 1, valeur_deniers: 1, encombrement: 0.01,
categorie: potionData.data.categorie,
herbe: potionData.name,
rarete: potionData.data.rarete,
herbebrins: potionData.nbBrins,
description: "" }
data: {
quantite: 1, valeur_deniers: 1, encombrement: 0.01,
categorie: herbeData.data.categorie,
herbe: herbeData.name,
rarete: herbeData.data.rarete,
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 = {
alias: this.name,
categorie: potionData.data.categorie,
herbe: potionData.name,
nbBrinsPotion: potionData.nbBrins,
categorie: herbeData.data.categorie,
herbe: herbeData.name,
nbBrinsPotion: herbeData.nbBrins,
nbBrinsReste: newQuantite
}
if (newQuantite == 0 ) {
await this.deleteEmbeddedDocuments('Item', [ potionData._id ] );
} else {
let update = { _id: potionData._id, 'data.quantite': newQuantite};
await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
}
this.diminuerQuantiteObjet(herbeData._id, herbeData.nbBrins);
ChatMessage.create({
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)
});
}
}
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;
if (potionData.data.categorie.includes('Enchante')) {
potionData.enchanteTexte = "enchantée";
potionData.isEnchante = true;
} else {
potionData.enchanteTexte = "";
potionData.isEnchante = false;
}
ChatMessage.create({
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)
});
}
}
/* -------------------------------------------- */
async consommerPotion( potion ) {
async consommerPotion(potion) {
const potionData = Misc.data(potion);
if ( potionData.data.categorie.includes('Soin')) {
this.consommerPotionSoin( potionData);
} else if( potionData.data.categorie.includes('Repos')) {
if (potionData.data.categorie.includes('Soin')) {
this.consommerPotionSoin(potionData);
} else if (potionData.data.categorie.includes('Repos')) {
this.consommerPotionRepos(potionData);
} else {
this.consommerPotionGenerique(potionData);
this.consommerPotionGenerique(potionData);
}
await this.deleteEmbeddedDocuments('Item', [ potion.id ] );
this.diminuerQuantiteObjet(potion.id, 1, { supprimerSiZero: potionData.supprimer });
}
/* -------------------------------------------- */
@ -3453,7 +3497,9 @@ export class RdDActor extends Actor {
const ids = Array.from(this.effects?.values())
.filter(it => it.data.flags.core?.statusId == id)
.map(it => it.id);
this.deleteEmbeddedDocuments('ActiveEffect', ids);
if (ids.length > 0) {
this.deleteEmbeddedDocuments('ActiveEffect', ids);
}
}
/* -------------------------------------------- */
@ -3472,8 +3518,9 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */
async addStatusEffect(statusEffect) {
const effet = duplicate(statusEffect);
const effet = Misc.data(statusEffect);
this.deleteStatusEffectById(effet.id);
effet.flags = effet.flags ?? { core: {} };
effet.flags.core.statusId = effet.id;
await this.createEmbeddedDocuments('ActiveEffect', [effet]);
}

View File

@ -3,56 +3,24 @@ import { Misc } from "./misc.js";
export class DialogConsommer extends Dialog {
static async create(actor, item, dialogConfig) {
let consommerData = DialogConsommer.prepareData(actor, item);
if (!consommerData) {
ui.notifications.warn(`Impossible de consommer un ${consommerData.name}, ce n'est pas de la nourriture, une boisson ou une potion`);
return;
}
static async create(actor, item, template = undefined, options = {}) {
const consommerData = DialogConsommer.prepareData(actor, item, options);
const html = await renderTemplate(template ?? `systems/foundryvtt-reve-de-dragon/templates/consommer/dialog-${Misc.data(item).type}.html`, consommerData);
return new DialogConsommer(actor, item, consommerData, html, options)
}
constructor(actor, item, consommerData, html, options = {}) {
mergeObject(options, { classes: ["dialogconsommer"], width: 600, height: 500, 'z-index': 99999 }, { overwrite: false })
let conf = {
title: consommerData.title,
content: await renderTemplate(dialogConfig.html, consommerData),
content: html,
default: consommerData.buttonName,
};
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]: {
label: consommerData.buttonName, callback: it => {
this.consommer();
buttons: {
[consommerData.buttonName]: {
label: consommerData.buttonName, callback: it => {
this.actor.consommer(this.item, this.consommerData.choix);
}
}
}
};
@ -60,66 +28,55 @@ export class DialogConsommer extends Dialog {
super(conf, options);
this.actor = actor;
this.item = item;
this.consommerData = consommerData;
}
/* -------------------------------------------- */
static prepareData(actor, item, options) {
const itemData = duplicate(Misc.data(item));
let consommerData = {
item: itemData,
choix: {
doses: options.doses ?? 1,
seForcer: options.seForcer ?? false,
}
}
switch (itemData.type) {
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);
function updateConsommerData(rollData) {
rollData.finalLevel = Number(rollData.etat) + Number(rollData.forceAlcool) + rollData.diffNbDoses;
// Mise à jour valeurs
$("#roll-param").text(rollData.vieValue + " / " + Misc.toSignedString(rollData.finalLevel));
$(".table-resolution").remove();
$("#resolutionTable").append(RdDResolutionTable.buildHTMLTableExtract(rollData.vieValue, rollData.finalLevel));
}
html.find(".se-forcer").change(event => {
this.consommerData.choix.seForcer = event.currentTarget.checked;
});
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",
icon: "fas fa-comment",
onclick: ev => new RdDItem(Misc.data(this.item)).postItem()
onclick: ev => this.item.postItem()
})
return buttons
}

View File

@ -1,42 +1,115 @@
import { Grammar } from "./grammar.js";
import { Misc } from "./misc.js";
import { RdDUtility } from "./rdd-utility.js";
const typesObjetsEquipement = ["objet", "arme", "armure", "conteneur", "herbe", "ingredient", "livre", "potion", "munition", "nourritureboisson", "monnaie"];
const typesObjetsOeuvres = ["oeuvre", "recettecuisine", "musique", "chant", "danse", "jeu"];
const encBrin = 0.00005;
/* -------------------------------------------- */
export class RdDItem extends Item {
static getTypeObjetsEquipement() {
return typesObjetsEquipement;
}
static getTypesOeuvres() {
return typesObjetsOeuvres;
}
prepareDerivedData() {
super.prepareDerivedData();
const itemData = this.data;
const itemData = Misc.data(this);
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) {
const tplData = itemData.data;
const quantite = itemData.type == 'conteneur' ? 1 : (tplData.quantite ?? 0);
if (tplData.encombrement != undefined) {
tplData.encTotal = Math.max(tplData.encombrement, 0) * quantite;
_calculsEquipement() {
const tplData = Misc.templateData(this);
const quantite = Misc.data(this).type == 'conteneur' ? 1 : (tplData.quantite ?? 0);
const enc = this.getEnc();
if (enc != undefined) {
tplData.encTotal = Math.max(enc, 0) * quantite;
}
if (tplData.cout != undefined) {
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() {
console.log(this);
const properties = this[`_${this.data.type}ChatData`]();
const itemData = Misc.data(this);
let chatData = duplicate(itemData);
let chatData = duplicate(Misc.data(this));
const properties = this[`_${chatData.type}ChatData`]();
chatData["properties"] = properties
//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
if (chatData.hasPrice) {
let sols = chatData.data.cout;
chatData.data.cout_deniers = Math.floor(sols * 100);
chatData.data.cout_deniers = Math.floor(chatData.data.cout * 100);
dialogResult = await new Promise((resolve, reject) => {
new Dialog({
content:
@ -66,7 +138,7 @@ export class RdDItem extends Item {
post: {
label: "Soumettre",
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 (itemData.data.quantite == 0)
dialogResult[0] = -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 })
if (chatData.data.quantite == 0) {
quantiteEnvoi = -1
}
else {
ui.notifications.notify(`Quantité réduite par ${dialogResult[0]}.`)
this.update({ "data.quantite": itemData.data.quantite - dialogResult[0] })
else if (quantiteEnvoi > chatData.data.quantite) {
quantiteEnvoi = chatData.data.quantite;
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 (dialogResult[0] > 0)
chatData.postQuantity = Number(dialogResult[0]);
if (dialogResult[1] > 0) {
chatData.postPrice = dialogResult[1];
chatData.data.cout_deniers = Math.floor(dialogResult[1] * 100); // Mise à jour cout en deniers
if (quantiteEnvoi > 0)
chatData.postQuantity = Number(quantiteEnvoi);
if (prixTotal > 0) {
chatData.postPrice = prixTotal;
chatData.data.cout_deniers = Math.floor(prixTotal * 100); // Mise à jour cout en deniers
}
chatData.finalPrice = Number(chatData.postPrice) * 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(
{
compendium: "postedItem",
payload: itemData,
payload: chatData,
});
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() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [
`<b>Encombrement</b>: ${rddData.encombrement}`
`<b>Encombrement</b>: ${tplData.encombrement}`
]
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() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [
`<b>Compétence</b>: ${rddData.competence}`,
`<b>Dommages</b>: ${rddData.dommages}`,
`<b>Force minimum</b>: ${rddData.force}`,
`<b>Resistance</b>: ${rddData.resistance}`,
`<b>Encombrement</b>: ${rddData.encombrement}`
`<b>Compétence</b>: ${tplData.competence}`,
`<b>Dommages</b>: ${tplData.dommages}`,
`<b>Force minimum</b>: ${tplData.force}`,
`<b>Resistance</b>: ${tplData.resistance}`,
`<b>Encombrement</b>: ${tplData.encombrement}`
]
return properties;
}
/* -------------------------------------------- */
_conteneurChatData() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [
`<b>Capacité</b>: ${rddData.capacite} Enc.`,
`<b>Encombrement</b>: ${rddData.encombrement}`
`<b>Capacité</b>: ${tplData.capacite} Enc.`,
`<b>Encombrement</b>: ${tplData.encombrement}`
]
return properties;
}
/* -------------------------------------------- */
_munitionChatData() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [
`<b>Encombrement</b>: ${rddData.encombrement}`
`<b>Encombrement</b>: ${tplData.encombrement}`
]
return properties;
}
/* -------------------------------------------- */
_armureChatData() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [
`<b>Protection</b>: ${rddData.protection}`,
`<b>Détérioration</b>: ${rddData.deterioration}`,
`<b>Malus armure</b>: ${rddData.malus}`,
`<b>Encombrement</b>: ${rddData.encombrement}`
`<b>Protection</b>: ${tplData.protection}`,
`<b>Détérioration</b>: ${tplData.deterioration}`,
`<b>Malus armure</b>: ${tplData.malus}`,
`<b>Encombrement</b>: ${tplData.encombrement}`
]
return properties;
}
/* -------------------------------------------- */
_competenceChatData() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [
`<b>Catégorie</b>: ${rddData.categorie}`,
`<b>Niveau</b>: ${rddData.niveau}`,
`<b>Caractéristique par défaut</b>: ${rddData.carac_defaut}`,
`<b>XP</b>: ${rddData.xp}`
`<b>Catégorie</b>: ${tplData.categorie}`,
`<b>Niveau</b>: ${tplData.niveau}`,
`<b>Caractéristique par défaut</b>: ${tplData.carac_defaut}`,
`<b>XP</b>: ${tplData.xp}`
]
return properties;
}
/* -------------------------------------------- */
_competencecreatureChatData() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [
`<b>Catégorie</b>: ${rddData.categorie}`,
`<b>Niveau</b>: ${rddData.niveau}`,
`<b>Caractéristique</b>: ${rddData.carac_value}`,
`<b>XP</b>: ${rddData.xp}`
`<b>Catégorie</b>: ${tplData.categorie}`,
`<b>Niveau</b>: ${tplData.niveau}`,
`<b>Caractéristique</b>: ${tplData.carac_value}`,
`<b>XP</b>: ${tplData.xp}`
]
return properties;
}
/* -------------------------------------------- */
_sortChatData() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [
`<b>Draconic</b>: ${rddData.draconic}`,
`<b>Difficulté</b>: ${rddData.difficulte}`,
`<b>Case TMR</b>: ${rddData.caseTMR}`,
`<b>Points de Rêve</b>: ${rddData.ptreve}`
`<b>Draconic</b>: ${tplData.draconic}`,
`<b>Difficulté</b>: ${tplData.difficulte}`,
`<b>Case TMR</b>: ${tplData.caseTMR}`,
`<b>Points de Rêve</b>: ${tplData.ptreve}`
]
return properties;
}
/* -------------------------------------------- */
_herbeChatData() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [
`<b>Milieu</b>: ${rddData.milieu}`,
`<b>Rareté</b>: ${rddData.rarete}`,
`<b>Catégorie</b>: ${rddData.categorie}`,
`<b>Milieu</b>: ${tplData.milieu}`,
`<b>Rareté</b>: ${tplData.rarete}`,
`<b>Catégorie</b>: ${tplData.categorie}`,
]
return properties;
}
/* -------------------------------------------- */
_ingredientChatData() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [
`<b>Milieu</b>: ${rddData.milieu}`,
`<b>Rareté</b>: ${rddData.rarete}`,
`<b>Catégorie</b>: ${rddData.categorie}`,
`<b>Milieu</b>: ${tplData.milieu}`,
`<b>Rareté</b>: ${tplData.rarete}`,
`<b>Catégorie</b>: ${tplData.categorie}`,
]
return properties;
}
/* -------------------------------------------- */
_tacheChatData() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [
`<b>Caractéristique</b>: ${rddData.carac}`,
`<b>Compétence</b>: ${rddData.competence}`,
`<b>Périodicité</b>: ${rddData.periodicite}`,
`<b>Fatigue</b>: ${rddData.fatigue}`,
`<b>Difficulté</b>: ${rddData.difficulte}`,
`<b>Points de Tâche</b>: ${rddData.points_de_tache}`,
`<b>Points de Tâche atteints</b>: ${rddData.points_de_tache_courant}`
`<b>Caractéristique</b>: ${tplData.carac}`,
`<b>Compétence</b>: ${tplData.competence}`,
`<b>Périodicité</b>: ${tplData.periodicite}`,
`<b>Fatigue</b>: ${tplData.fatigue}`,
`<b>Difficulté</b>: ${tplData.difficulte}`,
`<b>Points de Tâche</b>: ${tplData.points_de_tache}`,
`<b>Points de Tâche atteints</b>: ${tplData.points_de_tache_courant}`
]
return properties;
}
/* -------------------------------------------- */
_livreChatData() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [
`<b>Compétence</b>: ${rddData.competence}`,
`<b>Auteur</b>: ${rddData.auteur}`,
`<b>Difficulté</b>: ${rddData.difficulte}`,
`<b>Points de Tâche</b>: ${rddData.points_de_tache}`,
`<b>Encombrement</b>: ${rddData.encombrement}`
`<b>Compétence</b>: ${tplData.competence}`,
`<b>Auteur</b>: ${tplData.auteur}`,
`<b>Difficulté</b>: ${tplData.difficulte}`,
`<b>Points de Tâche</b>: ${tplData.points_de_tache}`,
`<b>Encombrement</b>: ${tplData.encombrement}`
]
return properties;
}
/* -------------------------------------------- */
_potionChatData() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [
`<b>Rareté</b>: ${rddData.rarete}`,
`<b>Catégorie</b>: ${rddData.categorie}`,
`<b>Encombrement</b>: ${rddData.encombrement}`,
`<b>Rareté</b>: ${tplData.rarete}`,
`<b>Catégorie</b>: ${tplData.categorie}`,
`<b>Encombrement</b>: ${tplData.encombrement}`,
]
return properties;
}
/* -------------------------------------------- */
_queueChatData() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [
`<b>Refoulement</b>: ${rddData.refoulement}`
`<b>Refoulement</b>: ${tplData.refoulement}`
]
return properties;
}
/* -------------------------------------------- */
_ombreChatData() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [
`<b>Refoulement</b>: ${rddData.refoulement}`
`<b>Refoulement</b>: ${tplData.refoulement}`
]
return properties;
}
/* -------------------------------------------- */
_souffleChatData() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [];
return properties;
}
/* -------------------------------------------- */
_teteChatData() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [];
return properties;
}
/* -------------------------------------------- */
_tarotChatData() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [
`<b>Concept</b>: ${rddData.concept}`,
`<b>Aspect</b>: ${rddData.aspect}`,
`<b>Concept</b>: ${tplData.concept}`,
`<b>Aspect</b>: ${tplData.aspect}`,
]
return properties;
}
/* -------------------------------------------- */
_nombreastralChatData() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [
`<b>Valeur</b>: ${rddData.value}`,
`<b>Jour</b>: ${rddData.jourlabel}`,
`<b>Valeur</b>: ${tplData.value}`,
`<b>Jour</b>: ${tplData.jourlabel}`,
]
return properties;
}
/* -------------------------------------------- */
_monnaieChatData() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [
`<b>Valeur en Deniers</b>: ${rddData.valeur_deniers}`,
`<b>Encombrement</b>: ${rddData.encombrement}`
`<b>Valeur en Deniers</b>: ${tplData.valeur_deniers}`,
`<b>Encombrement</b>: ${tplData.encombrement}`
]
return properties;
}
/* -------------------------------------------- */
_meditationChatData() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [
`<b>Thème</b>: ${rddData.theme}`,
`<b>Compétence</b>: ${rddData.competence}`,
`<b>Support</b>: ${rddData.support}`,
`<b>Heure</b>: ${rddData.heure}`,
`<b>Purification</b>: ${rddData.purification}`,
`<b>Vêture</b>: ${rddData.veture}`,
`<b>Comportement</b>: ${rddData.comportement}`,
`<b>Case TMR</b>: ${rddData.tmr}`
`<b>Thème</b>: ${tplData.theme}`,
`<b>Compétence</b>: ${tplData.competence}`,
`<b>Support</b>: ${tplData.support}`,
`<b>Heure</b>: ${tplData.heure}`,
`<b>Purification</b>: ${tplData.purification}`,
`<b>Vêture</b>: ${tplData.veture}`,
`<b>Comportement</b>: ${tplData.comportement}`,
`<b>Case TMR</b>: ${tplData.tmr}`
]
return properties;
}
/* -------------------------------------------- */
_casetmrChatData() {
const rddData = Misc.data(this).data;
const tplData = Misc.templateData(this);
let properties = [
`<b>Coordonnée</b>: ${rddData.coord}`,
`<b>Spécificité</b>: ${rddData.specific}`
`<b>Coordonnée</b>: ${tplData.coord}`,
`<b>Spécificité</b>: ${tplData.specific}`
]
return properties;
}

View File

@ -47,7 +47,11 @@ export class Misc {
const parsed = parseInt(value);
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) {
if (!diviseur || diviseur <= 1) return undefined;
switch (diviseur || 1) {

View File

@ -48,16 +48,6 @@ export class RdDHerbes extends Item {
formData.isRepos = true;
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);
border: 2px solid #545469;
}
.chat-message .chat-icon {
.chat-icon {
border: 0;
padding: 2px 6px 2px 2px;
float: left;

View File

@ -9,7 +9,7 @@
</div>
<div class="flexrow flex-group-center flex-actions-bar">
<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>
</div>
</div>

View File

@ -9,7 +9,7 @@
</div>
<div class="flexrow flex-group-center flex-actions-bar">
<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>
</div>
</div>

View File

@ -9,10 +9,13 @@
<span class="item-quantite">{{item.data.quantite}}</span>
<span class="item-quantite">{{numberFormat item.data.encTotal decimals=2}}</span>
<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-delete" title="Supprimer"><i class="fas fa-trash"></i></a>
{{#if (eq item.type 'nourritureboisson')}}
<a class="item-name item-consommer">Consommer</a>
{{#if item.data.actionPrincipale}}
<a class="item-name item-action">{{item.data.actionPrincipale}}</a>
{{/if}}
</div>
</li>

View File

@ -55,14 +55,14 @@
</ul>
<div class="flex-group-center flex-actions-bar">
<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 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 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-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-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}}
<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 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 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="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-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="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}}
</div>
<div class="flexrow">
@ -84,7 +84,7 @@
</span>
{{/each}}
{{#if options.isGM}}
<span id="enlever-tous-effets"><a>(enlever tout)</a></span>
<span class="enlever-tous-effets"><a>(enlever tout)</a></span>
{{/if}}
{{else}}
Aucun effet actif
@ -754,26 +754,13 @@
{{#each objets as |item id|}}
{{#unless item.estContenu}}
{{#if (ne item.type 'conteneur')}}
<li class="item flexrow list-item" data-item-id="{{item._id}}">
<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>
{{> "systems/foundryvtt-reve-de-dragon/templates/actor-inventaire-conteneur.html" item=item }}
{{/if}}
{{/unless}}
{{/each}}
{{#each conteneurs as |conteneur id|}}
{{/each}}
{{#each conteneurs as |conteneur id|}}
{{buildConteneur this}}
{{/each}}
{{/each}}
</ul>
<span class="item-name"><h4>Montures</h4></span>

View File

@ -1,9 +1,9 @@
<img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/competence_botanique.png" alt="potion de repos" />
<h4>
{{alias}} consomme sa Potion {{enchanteTexte}} de {{name}}.
{{alias}} consomme sa <b>Potion {{#if data.isEnchante}}enchantée{{/if}}</b> de {{name}}.
</h4>
<hr>
<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.
</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" />
<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>
<hr>
<div>
{{#if casesRepos}}
Elle permet de récupérer jusqu'à {{casesRepos}} cases de repos.
{{#if data.isEnchante}}
Elle permet de récupérer jusqu'à {{data.puissance}} cases de repos.
{{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).
<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" />
<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>
<hr>
<div>
{{#if pointsGuerison}}
Elle permet de guérir {{pointsGuerison}} Points de Guérison.
{{#if data.isEnchante}}
Elle permet de guérir {{data.puissance}} Points de Guérison.
{{else}}
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.

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>
{{#if isOwned}}
<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>
{{/if}}
</div>
@ -77,7 +77,7 @@
<input class="attribute-value" type="checkbox" name="data.reposalchimique" {{#if data.reposalchimique}}checked{{/if}}/>
</div>
{{/if}}
{{#if isEnchante}}
{{#if data.isEnchante}}
<div class="form-group">
<label>Points de rêve</label>
<input class="attribute-value" type="text" name="data.pr" value="{{data.pr}}" data-dtype="Number" />

View File

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