La consommation d'alcool

est bonne pour depuis l'équipement

+ bug du à changement de vieValue -> vie
This commit is contained in:
Vincent Vandemeulebrouck
2021-05-18 01:04:27 +02:00
parent a48f76e8eb
commit 88d4c917fc
8 changed files with 144 additions and 129 deletions

View File

@ -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');
}
/* -------------------------------------------- */

View File

@ -4,12 +4,12 @@ export class DialogConsommer extends Dialog {
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);
const html = await renderTemplate(template ?? `systems/foundryvtt-reve-de-dragon/templates/dialog-item-consommer.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 })
mergeObject(options, { classes: ["dialogconsommer"], width: 350, height: 450, 'z-index': 99999 }, { overwrite: false })
let conf = {
title: consommerData.title,

View File

@ -52,10 +52,12 @@ export class RdDCarac {
return selectedCarac?.label?.toLowerCase()?.match(/r(e|ê)ve(( |-)actuel)?/);
}
static isIgnoreEtatGeneral(selectedCarac, competence) {
static isIgnoreEtatGeneral(rollData) {
const selectedCarac = rollData.selectedCarac;
return !selectedCarac ||
rollData.ethylisme ||
RdDCarac.isChance(selectedCarac) ||
(RdDCarac.isReve(selectedCarac) && !competence);
(RdDCarac.isReve(selectedCarac) && !rollData.competence);
}

View File

@ -1,4 +1,3 @@
import { RdDResolutionTable } from "./rdd-resolution-table.js";
import { Misc } from "./misc.js";
/**
@ -52,10 +51,8 @@ export class RdDRollDialogEthylisme extends Dialog {
}
async updateRollResult() {
this.rollData.finalLevel = Number(this.rollData.etat) + Number(this.rollData.forceAlcool) + this.rollData.diffNbDoses;
// Mise à jour valeurs
$("#roll-param").text(this.rollData.vie + " / " + Misc.toSignedString(this.rollData.finalLevel));
$("#roll-param").text(this.rollData.vie + " / " + Misc.toSignedString(Number(this.rollData.etat) + Number(this.rollData.forceAlcool) + this.rollData.diffNbDoses));
$(".table-resolution").remove();
}

View File

@ -5,6 +5,7 @@ import { RdDItemSort } from "./item-sort.js";
import { Misc } from "./misc.js";
import { RdDBonus } from "./rdd-bonus.js";
import { RdDCarac } from "./rdd-carac.js";
import { RdDUtility } from "./rdd-utility.js";
import { ReglesOptionelles } from "./regles-optionelles.js";
/**
@ -50,9 +51,9 @@ export const referenceAjustements = {
getValue: (rollData, actor) => RdDBonus.find(rollData.surpriseDefenseur).attaque,
},
etat: {
isUsed: (rollData, actor) => !RdDCarac.isIgnoreEtatGeneral(rollData.selectedCarac, rollData.competence),
isUsed: (rollData, actor) => !RdDCarac.isIgnoreEtatGeneral(rollData),
getLabel: (rollData, actor) => 'Etat général',
getValue: (rollData, actor) => actor.getEtatGeneral()
getValue: (rollData, actor) => actor.getEtatGeneral({ ethylisme: rollData.forceAlcool != undefined })
},
malusArmure: {
isVisible: (rollData, actor) => RdDCarac.isAgiliteOuDerivee(rollData.selectedCarac),
@ -120,6 +121,24 @@ export const referenceAjustements = {
isUsed: (rollData, actor) => rollData.tmr && rollData.rencontre?.name,
getLabel: (rollData, actor) => rollData.rencontre?.name,
getValue: (rollData, actor) => - (rollData.rencontre?.force ?? 0)
},
ethylismeAlcool: {
isVisible: (rollData, actor) => rollData.nbDoses != undefined,
isUsed: (rollData, actor) => rollData.nbDoses != undefined,
getLabel: (rollData, actor) => "Doses déjà bues: ",
getValue: (rollData, actor) => - rollData.nbDoses,
},
ethylismeDoses: {
isVisible: (rollData, actor) => rollData.nbDoses != undefined,
isUsed: (rollData, actor) => rollData.nbDoses != undefined,
getLabel: (rollData, actor) => "Force de l'alcool: ",
getValue: (rollData, actor) => rollData.forceAlcool,
},
ethylisme:{
isVisible: (rollData, actor) => rollData.ethylisme != undefined,
isUsed: (rollData, actor) => rollData.ethylisme != undefined,
getLabel: (rollData, actor) => "Ethylisme - " + RdDUtility.getNomEthylisme(rollData.ethylisme),
getValue: (rollData, actor) => rollData.ethylisme,
}
}