|
|
|
@ -27,8 +27,9 @@ 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 { DialogConsommer } from "./dialog-consommer.js";
|
|
|
|
|
import { DialogConsommer } from "./dialog-item-consommer.js";
|
|
|
|
|
import { DialogFabriquerPotion } from "./dialog-fabriquer-potion.js";
|
|
|
|
|
import { RollDataAjustements } from "./rolldata-ajustements.js";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
@ -1592,21 +1593,33 @@ export class RdDActor extends Actor {
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
|
async jetDeMoral(situation, messageReussi = undefined, messageManque = undefined) {
|
|
|
|
|
let jetMoral = await RdDDice.roll("1d20", { showDice: true });
|
|
|
|
|
let moralActuel = Misc.toInt(Misc.templateData(this).compteurs.moral.value);
|
|
|
|
|
const difficulte = 10 + moralActuel;
|
|
|
|
|
const succes = jetMoral.total <= difficulte;
|
|
|
|
|
let jetMoral = await this._jetMoral(situation)
|
|
|
|
|
|
|
|
|
|
let ajustementMoral = this._calculAjustementMoral(succes, moralActuel, situation);
|
|
|
|
|
let defaultMessage = `Vous ${ajustementMoral > 0 ? "gagnez du moral" : ajustementMoral < 0 ? "perdez du moral" : "gardez votre moral"}.`;
|
|
|
|
|
let finMessage = succes ? (messageReussi != undefined ? messageReussi : defaultMessage) : (messageManque != undefined ? messageManque : defaultMessage);
|
|
|
|
|
let message = `Jet de moral ${succes ? "réussi" : "manqué"} en situation ${situation} (${jetMoral.total}/${difficulte}). <br/>${finMessage}`;
|
|
|
|
|
let defaultMessage = `Vous ${jetMoral.ajustement > 0 ? "gagnez du moral" : jetMoral.ajustement < 0 ? "perdez du moral" : "gardez votre moral"}.`;
|
|
|
|
|
let finMessage = jetMoral.succes ? (messageReussi != undefined ? messageReussi : defaultMessage) : (messageManque != undefined ? messageManque : defaultMessage);
|
|
|
|
|
let message = `Jet de moral ${jetMoral.succes ? "réussi" : "manqué"} en situation ${situation} (${jetMoral.jet}/${jetMoral.difficulte}). <br/>${finMessage}`;
|
|
|
|
|
ChatMessage.create({
|
|
|
|
|
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
|
|
|
|
|
content: message
|
|
|
|
|
});
|
|
|
|
|
await this.moralIncDec(ajustementMoral);
|
|
|
|
|
return ajustementMoral;
|
|
|
|
|
return jetMoral.ajustement;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async _jetMoral(situation) {
|
|
|
|
|
const moralActuel = Misc.toInt(Misc.templateData(this).compteurs.moral.value);
|
|
|
|
|
const jet = await RdDDice.rollTotal("1d20", { showDice: true });
|
|
|
|
|
const difficulte = 10 + moralActuel;
|
|
|
|
|
const succes = jet <= difficulte;
|
|
|
|
|
const jetMoral = {
|
|
|
|
|
actuel: moralActuel,
|
|
|
|
|
jet: jet,
|
|
|
|
|
situation: situation,
|
|
|
|
|
difficulte: difficulte,
|
|
|
|
|
succes: succes,
|
|
|
|
|
ajustement: this._calculAjustementMoral(succes, moralActuel, situation)
|
|
|
|
|
};
|
|
|
|
|
await this.moralIncDec(jetMoral.ajustement);
|
|
|
|
|
return jetMoral;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
@ -1652,11 +1665,11 @@ export class RdDActor extends Actor {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
|
async jetEthylisme(forceAlcool = 0) {
|
|
|
|
|
async jetEthylisme() {
|
|
|
|
|
const actorData = Misc.data(this);
|
|
|
|
|
let rollData = {
|
|
|
|
|
vie: actorData.data.sante.vie.max,
|
|
|
|
|
forceAlcool: forceAlcool,
|
|
|
|
|
forceAlcool: 0,
|
|
|
|
|
etat: this.getEtatGeneral({ ethylisme: true }),
|
|
|
|
|
diffNbDoses: -Number(actorData.data.compteurs.ethylisme.nb_doses || 0),
|
|
|
|
|
finalLevel: 0,
|
|
|
|
@ -1664,77 +1677,7 @@ export class RdDActor extends Actor {
|
|
|
|
|
ajustementsForce: CONFIG.RDD.difficultesLibres,
|
|
|
|
|
}
|
|
|
|
|
let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-roll-ethylisme.html', rollData);
|
|
|
|
|
new RdDRollDialogEthylisme(html, rollData, this, r => this.performEthylisme(r)).render(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
|
async performEthylisme(rollData) {
|
|
|
|
|
const actorData = Misc.data(this);
|
|
|
|
|
let ethylisme = duplicate(actorData.data.compteurs.ethylisme);
|
|
|
|
|
|
|
|
|
|
// Jet d'ethylisme
|
|
|
|
|
let rollEthylisme = await RdDResolutionTable.roll(rollData.vie, rollData.finalLevel);
|
|
|
|
|
let jetVieView = {
|
|
|
|
|
ethylismeEtape: 'Vie',
|
|
|
|
|
vie: rollData.vie,
|
|
|
|
|
forceAlcool: rollData.forceAlcool,
|
|
|
|
|
finalLevel: rollData.finalLevel,
|
|
|
|
|
jetVieSuccess: rollEthylisme.isSuccess,
|
|
|
|
|
jetVieText: RdDResolutionTable.explain(rollEthylisme),
|
|
|
|
|
};
|
|
|
|
|
if (rollEthylisme.isSuccess) {
|
|
|
|
|
ethylisme.nb_doses++;
|
|
|
|
|
jetVieView.doses = ethylisme.nb_doses;
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
ethylisme.value = Math.max(ethylisme.value - 1, -7);
|
|
|
|
|
ethylisme.nb_doses = 0;
|
|
|
|
|
jetVieView.doses = ethylisme.nb_doses;
|
|
|
|
|
jetVieView.ajustementEthylique = ethylisme.value;
|
|
|
|
|
jetVieView.nomEthylisme = RdDUtility.getNomEthylisme(ethylisme.value);
|
|
|
|
|
}
|
|
|
|
|
RdDResolutionTable.displayRollData(jetVieView, this, 'chat-resultat-ethylisme.html');
|
|
|
|
|
|
|
|
|
|
if (rollEthylisme.isEchec) {
|
|
|
|
|
let enduranceLostRoll = await RdDDice.roll("1d6");
|
|
|
|
|
// enduranceLostRoll.showDice = true;
|
|
|
|
|
RdDDice.show(enduranceLostRoll);
|
|
|
|
|
let enduranceLost = enduranceLostRoll.total;
|
|
|
|
|
let perteEndurance = await this.santeIncDec("endurance", -enduranceLost, { ethylisme: true });
|
|
|
|
|
let jetEnduranceView = {
|
|
|
|
|
ethylismeEtape: 'Endurance',
|
|
|
|
|
enduranceLost: perteEndurance.perte,
|
|
|
|
|
perteVie: perteEndurance.perteVie,
|
|
|
|
|
};
|
|
|
|
|
RdDResolutionTable.displayRollData(jetEnduranceView, this, 'chat-resultat-ethylisme.html');
|
|
|
|
|
|
|
|
|
|
if (!ethylisme.jet_moral) {
|
|
|
|
|
let messageReussi = "L'alcool vous met en joie. Vous gagnez un point de moral";
|
|
|
|
|
let messageManque = "";
|
|
|
|
|
if (ethylisme.value == -1) {
|
|
|
|
|
messageManque = "Vous avez l'alcool triste. Vous perdez un point de moral.";
|
|
|
|
|
}
|
|
|
|
|
let adjust = await this.jetDeMoral('heureuse', messageReussi, messageManque);
|
|
|
|
|
if (adjust == 1) {
|
|
|
|
|
ethylisme.jet_moral = true;
|
|
|
|
|
} else if (ethylisme.value == -1) {
|
|
|
|
|
ethylisme.jet_moral = true;
|
|
|
|
|
await this.moralIncDec(-1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Qui a bu boira (p 164)
|
|
|
|
|
let rollVolonte = await RdDResolutionTable.roll(actorData.data.carac.volonte.value,
|
|
|
|
|
Math.min(ethylisme.value, 0) + actorData.data.compteurs.moral.value);
|
|
|
|
|
let jetVolonteView = {
|
|
|
|
|
ethylismeEtape: 'Volonte',
|
|
|
|
|
jetVolonteSuccess: rollVolonte.isSuccess,
|
|
|
|
|
jetVolonteText: RdDResolutionTable.explain(rollVolonte),
|
|
|
|
|
};
|
|
|
|
|
RdDResolutionTable.displayRollData(jetVolonteView, this, 'chat-resultat-ethylisme.html');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await this.update({ 'data.compteurs.ethylisme': ethylisme });
|
|
|
|
|
new RdDRollDialogEthylisme(html, rollData, this, r => this.saouler(r.forceAlcool)).render(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
@ -1806,33 +1749,84 @@ export class RdDActor extends Actor {
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
|
async boire(item, doses, options = { diminuerQuantite: true }) {
|
|
|
|
|
if (!item.getActionPrincipale()) return;
|
|
|
|
|
const tplData = Misc.templateData(item);
|
|
|
|
|
const desaltere = tplData.desaltere;
|
|
|
|
|
const itemData = Misc.data(item);
|
|
|
|
|
const desaltere = itemData.data.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 this.saouler(itemData.data.force, item);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
await item.diminuerQuantite(doses, options);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
|
async saouler(forceAlcool) {
|
|
|
|
|
const actorTplData = Misc.templateData(this);
|
|
|
|
|
const etatGeneral = this.getEtatGeneral({ ethylisme: true });
|
|
|
|
|
const nbDoses = -Number(actorTplData.compteurs.ethylisme.nb_doses || 0);
|
|
|
|
|
let rollData = {
|
|
|
|
|
vieValue: actorTplData.sante.vie.value,
|
|
|
|
|
forceAlcool: forceAlcool,
|
|
|
|
|
etat: etatGeneral,
|
|
|
|
|
diffNbDoses: nbDoses,
|
|
|
|
|
finalLevel: nbDoses + forceAlcool + etatGeneral,
|
|
|
|
|
diffConditions: 0,
|
|
|
|
|
};
|
|
|
|
|
await this.performEthylisme(rollData);
|
|
|
|
|
async saouler(forceAlcool, alcool = undefined) {
|
|
|
|
|
const actorData = Misc.data(this);
|
|
|
|
|
let ethylisme = duplicate(actorData.data.compteurs.ethylisme);
|
|
|
|
|
|
|
|
|
|
const etat = this.getEtatGeneral({ ethylisme: true });
|
|
|
|
|
const nbDoses = Number(actorData.data.compteurs.ethylisme.nb_doses || 0);
|
|
|
|
|
const ethylismeData = {
|
|
|
|
|
alias: actorData.name,
|
|
|
|
|
actor: actorData,
|
|
|
|
|
vie: actorData.data.sante.vie.max,
|
|
|
|
|
alcool: Misc.data(alcool),
|
|
|
|
|
jetVie: {
|
|
|
|
|
forceAlcool: forceAlcool,
|
|
|
|
|
nbDoses: nbDoses,
|
|
|
|
|
selectedCarac: actorData.data.carac.constitution,
|
|
|
|
|
carac: actorData.data.carac,
|
|
|
|
|
caracValue: actorData.data.sante.vie.max,
|
|
|
|
|
finalLevel: etat + forceAlcool - nbDoses,
|
|
|
|
|
showDice: true
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await RdDResolutionTable.rollData(ethylismeData.jetVie);
|
|
|
|
|
RollDataAjustements.calcul(ethylismeData.jetVie, this);
|
|
|
|
|
if (ethylismeData.jetVie.rolled.isSuccess) {
|
|
|
|
|
ethylisme.nb_doses++;
|
|
|
|
|
} else {
|
|
|
|
|
ethylisme.value = Math.max(ethylisme.value - 1, -7);
|
|
|
|
|
ethylisme.nb_doses = 0;
|
|
|
|
|
|
|
|
|
|
let perte = await RdDDice.rollTotal("1d6", {showDice:true});
|
|
|
|
|
ethylismeData.perteEndurance = await this.santeIncDec("endurance", -perte, { ethylisme: true });
|
|
|
|
|
|
|
|
|
|
if (!ethylisme.jet_moral) {
|
|
|
|
|
ethylismeData.jetMoral = await this._jetMoral('heureuse');
|
|
|
|
|
if (ethylismeData.jetMoral.ajustement == 1) {
|
|
|
|
|
ethylismeData.moralAlcool ='heureux';
|
|
|
|
|
ethylisme.jet_moral = true;
|
|
|
|
|
} else if (ethylisme.value == -1) {
|
|
|
|
|
ethylismeData.jetMoral.ajustement = -1;
|
|
|
|
|
ethylismeData.moralAlcool ='triste';
|
|
|
|
|
ethylisme.jet_moral = true;
|
|
|
|
|
await this.moralIncDec(-1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (ethylisme.value<0) {
|
|
|
|
|
// Qui a bu boira (p 164)
|
|
|
|
|
ethylismeData.jetVolonte = {
|
|
|
|
|
selectedCarac: actorData.data.carac.volonte,
|
|
|
|
|
caracValue: actorData.data.carac.volonte.value,
|
|
|
|
|
ethylisme: ethylisme.value,
|
|
|
|
|
finalLevel: ethylisme.value + actorData.data.compteurs.moral.value,
|
|
|
|
|
showDice: true
|
|
|
|
|
}
|
|
|
|
|
await RdDResolutionTable.rollData(ethylismeData.jetVolonte);
|
|
|
|
|
RollDataAjustements.calcul(ethylismeData.jetVolonte, this);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
ethylismeData.ajustementEthylique = ethylisme.value;
|
|
|
|
|
ethylismeData.nomEthylisme = RdDUtility.getNomEthylisme(ethylisme.value);
|
|
|
|
|
ethylismeData.doses = ethylisme.nb_doses;
|
|
|
|
|
|
|
|
|
|
await this.update({ 'data.compteurs.ethylisme': ethylisme });
|
|
|
|
|
await RdDResolutionTable.displayRollData(ethylismeData, this, 'chat-resultat-ethylisme.html');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
|