Refactor Ethylisme in multiple steps #448

Merged
marafal merged 1 commits from feature-ethylisme-refactor into v1.4 2021-05-09 16:51:16 +02:00
5 changed files with 89 additions and 57 deletions

View File

@ -1490,12 +1490,14 @@ export class RdDActor extends Actor {
if (name == "endurance" && !this.isEntiteCauchemar()) { if (name == "endurance" && !this.isEntiteCauchemar()) {
if (result.newValue == 0 && inc < 0 && !options.isCritique) { // perte endurance et endurance devient 0 (sauf critique) -> -1 vie if (result.newValue == 0 && inc < 0 && !options.isCritique) { // perte endurance et endurance devient 0 (sauf critique) -> -1 vie
sante.vie.value--; sante.vie.value--;
result.perteVie = true;
} }
result.newValue = Math.max(0, result.newValue); result.newValue = Math.max(0, result.newValue);
if (inc > 0) { // le max d'endurance s'applique seulement à la récupération if (inc > 0) { // le max d'endurance s'applique seulement à la récupération
result.newValue = Math.min(result.newValue, this._computeEnduranceMax()) result.newValue = Math.min(result.newValue, this._computeEnduranceMax())
} }
const perte = compteur.value - result.newValue; const perte = compteur.value - result.newValue;
result.perte = perte;
if (perte > 1 && !options.ethylisme) { if (perte > 1 && !options.ethylisme) {
// Peut-être sonné si 2 points d'endurance perdus d'un coup // Peut-être sonné si 2 points d'endurance perdus d'un coup
const testIsSonne = await this.testSiSonne(sante, result.newValue); const testIsSonne = await this.testSiSonne(sante, result.newValue);
@ -1567,7 +1569,7 @@ export class RdDActor extends Actor {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async jetDeMoral(situation) { async jetDeMoral(situation, messageReussi = undefined, messageManque = undefined) {
let jetMoral = new Roll("1d20").roll(); let jetMoral = new Roll("1d20").roll();
RdDDice.show(jetMoral); RdDDice.show(jetMoral);
let moralActuel = Misc.toInt(Misc.templateData(this).compteurs.moral.value); let moralActuel = Misc.toInt(Misc.templateData(this).compteurs.moral.value);
@ -1575,12 +1577,14 @@ export class RdDActor extends Actor {
const succes = jetMoral.total <= difficulte; const succes = jetMoral.total <= difficulte;
let ajustementMoral = this._calculAjustementMoral(succes, moralActuel, situation); let ajustementMoral = this._calculAjustementMoral(succes, moralActuel, situation);
let defaultMessage = `Vous ${ajustementMoral > 0 ? "gagnez du moral" : ajustementMoral < 0 ? "perdez du moral" : "gardez votre moral"}.`;
await this.moralIncDec(ajustementMoral); 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}`;
ChatMessage.create({ ChatMessage.create({
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
content: `Jet de moral ${succes ? "réussi" : "manqué"} en situation ${situation} (${jetMoral.total}/${difficulte}), vous ${ajustementMoral > 0 ? "gagnez du moral" : ajustementMoral < 0 ? "perdez du moral" : "gardez votre moral"}` content: message
}); });
await this.moralIncDec(ajustementMoral);
return ajustementMoral; return ajustementMoral;
} }
@ -1630,7 +1634,7 @@ export class RdDActor extends Actor {
async jetEthylisme(forceAlcool = 0) { async jetEthylisme(forceAlcool = 0) {
const actorData = Misc.data(this); const actorData = Misc.data(this);
let rollData = { let rollData = {
vieValue: actorData.data.sante.vie.value, vie: actorData.data.sante.vie.max,
forceAlcool: forceAlcool, forceAlcool: forceAlcool,
etat: this.getEtatGeneral({ ethylisme: true }), etat: this.getEtatGeneral({ ethylisme: true }),
diffNbDoses: -Number(actorData.data.compteurs.ethylisme.nb_doses || 0), diffNbDoses: -Number(actorData.data.compteurs.ethylisme.nb_doses || 0),
@ -1648,54 +1652,68 @@ export class RdDActor extends Actor {
let ethylisme = duplicate(actorData.data.compteurs.ethylisme); let ethylisme = duplicate(actorData.data.compteurs.ethylisme);
// Jet d'ethylisme // Jet d'ethylisme
let rollEthylisme = await RdDResolutionTable.roll(rollData.vieValue, rollData.finalLevel); let rollEthylisme = await RdDResolutionTable.roll(rollData.vie, rollData.finalLevel);
let rollDataView = { let jetVieView = {
ethylismeEtape: 'Vie',
vie: rollData.vie,
forceAlcool: rollData.forceAlcool, forceAlcool: rollData.forceAlcool,
rollEthylismeIsSuccess: rollEthylisme.isSuccess, finalLevel: rollData.finalLevel,
rollEthylismeText: RdDResolutionTable.explain(rollEthylisme), jetVieSuccess: rollEthylisme.isSuccess,
jetVieText: RdDResolutionTable.explain(rollEthylisme),
}; };
if (rollEthylisme.isSuccess) { if (rollEthylisme.isSuccess) {
ethylisme.nb_doses++; ethylisme.nb_doses++;
rollDataView.doses = ethylisme.nb_doses; jetVieView.doses = ethylisme.nb_doses;
} else { } else {
ethylisme.value = Math.max(ethylisme.value - 1, -7); ethylisme.value = Math.max(ethylisme.value - 1, -7);
ethylisme.nb_doses = 0; ethylisme.nb_doses = 0;
rollDataView.doses = ethylisme.nb_doses; jetVieView.doses = ethylisme.nb_doses;
rollDataView.ajustementEthylique = ethylisme.value; jetVieView.ajustementEthylique = ethylisme.value;
rollDataView.nomEthylisme = RdDUtility.getNomEthylisme(ethylisme.value); jetVieView.nomEthylisme = RdDUtility.getNomEthylisme(ethylisme.value);
let enduranceLost = new Roll("1d6").roll().total;
rollDataView.enduranceLost = enduranceLost;
await this.santeIncDec("endurance", -enduranceLost, {ethylisme:true});
// 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);
rollDataView.rollVolonteIsSuccess = rollVolonte.isSuccess;
rollDataView.rollVolonteText = RdDResolutionTable.explain(rollVolonte);
} }
RdDResolutionTable.displayRollData(rollDataView, this, 'chat-resultat-ethylisme.html'); RdDResolutionTable.displayRollData(jetVieView, this, 'chat-resultat-ethylisme.html');
if (rollEthylisme.isEchec) { if (rollEthylisme.isEchec) {
await this._jetDeMoralEthylique(ethylisme); let enduranceLostRoll = new Roll("1d6").roll();
} // enduranceLostRoll.showDice = true;
await this.update({ 'data.compteurs.ethylisme': ethylisme }); 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) {
async _jetDeMoralEthylique(ethylisme) { let messageReussi = "L'alcool vous met en joie. Vous gagnez un point de moral";
if (ethylisme.value >= -1 && !ethylisme.jet_moral) { let messageManque = "";
let adjust = await this.jetDeMoral('heureuse'); if (ethylisme.value == -1) {
if (adjust > 0 || ethylisme.value == -1) { messageManque = "Vous avez l'alcool triste. Vous perdez un point de moral.";
ethylisme.jet_moral = true;
} }
if (ethylisme.value == -1 && adjust <= 0) { let adjust = await this.jetDeMoral('heureuse', messageReussi, messageManque);
// alcool triste if (adjust == 1) {
ChatMessage.create({ ethylisme.jet_moral = true;
content: "Décidément, vous avez l'alcool triste, vous perdez finalement un point de moral !", } else if (ethylisme.value == -1) {
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name) ethylisme.jet_moral = true;
});
await this.moralIncDec(-1); 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});
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@ -55,7 +55,7 @@ export class RdDRollDialogEthylisme extends Dialog {
this.rollData.finalLevel = Number(this.rollData.etat) + Number(this.rollData.forceAlcool) + this.rollData.diffNbDoses; this.rollData.finalLevel = Number(this.rollData.etat) + Number(this.rollData.forceAlcool) + this.rollData.diffNbDoses;
// Mise à jour valeurs // Mise à jour valeurs
$("#roll-param").text(this.rollData.vieValue + " / " + Misc.toSignedString(this.rollData.finalLevel)); $("#roll-param").text(this.rollData.vie + " / " + Misc.toSignedString(this.rollData.finalLevel));
$(".table-resolution").remove(); $(".table-resolution").remove();
} }

View File

@ -213,6 +213,7 @@ export class RdDUtility {
Handlebars.registerHelper('buildConteneur', (objet) => { return RdDUtility.buildConteneur(objet); }); Handlebars.registerHelper('buildConteneur', (objet) => { return RdDUtility.buildConteneur(objet); });
Handlebars.registerHelper('caseTmr-label', coord => TMRUtility.getTMRLabel(coord)); Handlebars.registerHelper('caseTmr-label', coord => TMRUtility.getTMRLabel(coord));
Handlebars.registerHelper('caseTmr-type', coord => TMRUtility.getTMRType(coord)); Handlebars.registerHelper('caseTmr-type', coord => TMRUtility.getTMRType(coord));
Handlebars.registerHelper('equals', (a, b) => a == b);
return loadTemplates(templatePaths); return loadTemplates(templatePaths);
} }

View File

@ -1,26 +1,39 @@
{{#if (equals ethylismeEtape 'Vie')}}
<h4> <h4>
{{alias}} bois un verre d'alcool de force {{forceAlcool}} {{alias}} bois un verre d'alcool de force {{forceAlcool}}
</h4> </h4>
<hr> <hr/>
<div> <div>
<span> <span>
{{{rollEthylismeText}}} {{{jetVieText}}}
<br/> <br/>
{{#if rollEthylismeIsSuccess}} {{#if jetVieSuccess}}
Vous avez réussi votre jet d'éthylisme, vous avez consommé {{doses}} doses sans effet. Vous avez réussi votre jet d'éthylisme, vous avez consommé {{doses}} doses sans effet.
{{else}} {{else}}
Vous avez échoué à votre jet d'éthylisme, vous êtes maintenant {{nomEthylisme}} ({{ajustementEthylique}}). Vous avez échoué à votre jet d'éthylisme, vous êtes maintenant {{nomEthylisme}} ({{ajustementEthylique}}).
<br/>
Vous perdez {{enduranceLost}} points d'endurance.
<br/>
Qui a bu boira :
{{{rollVolonteText}}}
<br/>
{{#if rollVolonteIsSuccess}}
Vous êtes libre de continuer à boire ou pas.
{{else}}
Vous avez une envie irrépréssible de reprendre un verre
{{/if}}
{{/if}} {{/if}}
</span> </span>
</div> </div>
{{/if}}
{{#if (equals ethylismeEtape 'Endurance')}}
<div>
<span>
Vous perdez {{enduranceLost}} points d'endurance.
{{#if perteVie}}<br/>Vous tombez inconscient et perdez un point de vie{{/if}}
</span>
</div>
{{/if}}
{{#if (equals ethylismeEtape 'Volonte')}}
<div>
<span>
Qui a bu boira :
{{{jetVolonteText}}}
<br/>
{{#if jetVolonteSuccess}}
Vous êtes libre de continuer à boire ou pas.
{{else}}
Vous avez une envie irrépressible de reprendre un verre.
{{/if}}
</span>
</div>
{{/if}}

View File

@ -2,7 +2,7 @@
<h2>Boire</h2> <h2>Boire</h2>
<img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/objets/chope_gres.webp" alt="Chope d'alcool"/> <img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/objets/chope_gres.webp" alt="Chope d'alcool"/>
<div class="grid grid-2col"> <div class="grid grid-2col">
<label>Vie</label><label class="flexrow"> {{vieValue}}</label> <label>Vie</label><label class="flexrow"> {{vie}}</label>
<label>Etat général</label><label class="flexrow">{{etat}}</label> <label>Etat général</label><label class="flexrow">{{etat}}</label>
<label>Déjà bu</label><label class="flexrow">{{diffNbDoses}}</label> <label>Déjà bu</label><label class="flexrow">{{diffNbDoses}}</label>
<label>Force du breuvage</label> <label>Force du breuvage</label>