Alcool triste #74

Remise de jet_moral=false quand l'éthylisme
disparait

En cas de deux échecs successifs au jet de moral
d'éthylisme, le personnage a l'alcool triste, et perd
un point de moral

p162: Le nombre de doses revient à 0 en
cas de nouveau degré d'éthylisme.

fix: Aucyn ethylisme = 1 ne modifie pas les jets

Affichage du nombre de dose sans effet
This commit is contained in:
Vincent Vandemeulebrouck 2020-12-29 01:34:15 +01:00
parent a53e53bcbb
commit d4968eaddb
5 changed files with 90 additions and 48 deletions

View File

@ -437,6 +437,10 @@ export class RdDActorSheet extends ActorSheet {
this.actor.updateCompteurValue( fieldName, parseInt(event.target.value) ); this.actor.updateCompteurValue( fieldName, parseInt(event.target.value) );
} ); } );
html.find('#ethylisme').change((event) => {
this.actor.setEthylisme(parseInt(event.target.value) );
} );
// Dialog d'archetype // Dialog d'archetype
html.find("#affiche-archetype").click((event) => { html.find("#affiche-archetype").click((event) => {
this.afficheResumeArchetype() this.afficheResumeArchetype()

View File

@ -323,8 +323,8 @@ export class RdDActor extends Actor {
} }
await this.update( {"data.blessures": blessures } ); await this.update( {"data.blessures": blessures } );
} }
await this.update({ "data.compteurs.ethylisme.value": 1 }); await this.setEthylisme(1);
await this.update({ "data.compteurs.ethylisme.nb_doses": 0 });
await this.santeIncDec("vie", this.data.data.sante.vie.max - this.data.data.sante.vie.value); await this.santeIncDec("vie", this.data.data.sante.vie.max - this.data.data.sante.vie.value);
await this.santeIncDec("endurance", this.data.data.sante.endurance.max - this.data.data.sante.endurance.value); await this.santeIncDec("endurance", this.data.data.sante.endurance.max - this.data.data.sante.endurance.value);
if (this.data.data.sante.fatigue){ if (this.data.data.sante.fatigue){
@ -354,15 +354,16 @@ export class RdDActor extends Actor {
async _recupererEthylisme(message) { async _recupererEthylisme(message) {
let ethylisme = duplicate(this.data.data.compteurs.ethylisme); let ethylisme = duplicate(this.data.data.compteurs.ethylisme);
ethylisme.nb_doses = 0;
ethylisme.jet_moral = false;
if (ethylisme.value < 1) if (ethylisme.value < 1)
{ {
ethylisme.value = Math.min(ethylisme.value + 1, 1); ethylisme.value = Math.min(ethylisme.value + 1, 1);
ethylisme.nb_doses = 0;
await this.update({ "data.compteurs.ethylisme": ethylisme });
if (ethylisme.value <= 0) { if (ethylisme.value <= 0) {
message.content += `<br>Vous dégrisez un peu (${RdDUtility.getNomEthylisme(ethylisme.value)})`; message.content += `<br>Vous dégrisez un peu (${RdDUtility.getNomEthylisme(ethylisme.value)})`;
} }
} }
await this.update({ "data.compteurs.ethylisme": ethylisme });
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -1025,29 +1026,38 @@ export class RdDActor extends Actor {
async jetDeMoral(situation) { async jetDeMoral(situation) {
let jetMoral = new Roll("1d20").roll(); let jetMoral = new Roll("1d20").roll();
RdDDice.show(jetMoral); RdDDice.show(jetMoral);
let compteurs = duplicate(this.data.data.compteurs); let moralActuel = Misc.toInt(this.data.data.compteurs.moral.value);
compteurs.moral.value = Misc.toInt(compteurs.moral.value); const difficulte = 10 + moralActuel;
const difficulte = 10 + compteurs.moral.value;
const succes = jetMoral.total <= difficulte; const succes = jetMoral.total <= difficulte;
let ajustementMoral = this._calculAjustementMoral(succes, compteurs.moral.value, situation);
if (ajustementMoral != 0) { let ajustementMoral = this._calculAjustementMoral(succes, moralActuel, situation);
compteurs.moral.value += ajustementMoral;
if (compteurs.moral.value>3) { await this.moralIncDec(ajustementMoral);
// exaltation
compteurs.moral.value --;
compteurs.exaltation.value = Misc.toInt(compteurs.exaltation.value) + 1;
}
if (compteurs.moral.value<-3) {
// dissolution
compteurs.moral.value ++;
compteurs.dissolution.value = Misc.toInt(compteurs.dissolution.value) + 1;
}
await this.update( { 'data.compteurs': compteurs} );
}
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: `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"}`
}); });
return ajustementMoral;
}
async moralIncDec(ajustementMoral) {
let compteurs = duplicate(this.data.data.compteurs);
compteurs.moral.value = Misc.toInt(compteurs.moral.value);;
if (ajustementMoral != 0) {
compteurs.moral.value += ajustementMoral;
if (compteurs.moral.value > 3) {
// exaltation
compteurs.moral.value--;
compteurs.exaltation.value = Misc.toInt(compteurs.exaltation.value) + 1;
}
if (compteurs.moral.value < -3) {
// dissolution
compteurs.moral.value++;
compteurs.dissolution.value = Misc.toInt(compteurs.dissolution.value) + 1;
}
await this.update({ 'data.compteurs': compteurs });
}
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -1062,13 +1072,22 @@ export class RdDActor extends Actor {
return 0; return 0;
} }
async setEthylisme(degre) {
let ethylisme = duplicate(this.data.data.compteurs.ethylisme);
ethylisme.value = degre;
ethylisme.nb_doses = 0;
if (degre == 1) {
ethylisme.jet_moral = false;
}
await this.update({ "data.compteurs.ethylisme": ethylisme});
}
/* -------------------------------------------- */ /* -------------------------------------------- */
async ethylismeTest() { async ethylismeTest() {
let rollData = { let rollData = {
vieValue: this.data.data.sante.vie.value, vieValue: this.data.data.sante.vie.value,
etat: this.data.data.compteurs.etat.value - this.data.data.compteurs.etat.value, // Pour les jets d'Ethylisme, on ignore le degré d'éthylisme (p.162) etat: this.data.data.compteurs.etat.value - Math.min(0, this.data.data.compteurs.ethylisme.value), // Pour les jets d'Ethylisme, on ignore le degré d'éthylisme (p.162)
niveauEthylisme: this.data.data.compteurs.ethylisme.value, diffNbDoses: -Number(this.data.data.compteurs.ethylisme.nb_doses || 0),
nbDoses: this.data.data.compteurs.ethylisme.nb_doses || 0,
finalLevel: 0, finalLevel: 0,
diffConditions: 0, diffConditions: 0,
ajustementsConditions: CONFIG.RDD.ajustementsConditions, ajustementsConditions: CONFIG.RDD.ajustementsConditions,
@ -1086,10 +1105,11 @@ export class RdDActor extends Actor {
let rollEthylisme = await RdDResolutionTable.roll( rollData.vieValue, rollData.finalLevel); let rollEthylisme = await RdDResolutionTable.roll( rollData.vieValue, rollData.finalLevel);
let msgText = RdDResolutionTable.explain(rollEthylisme) + "<br>"; let msgText = RdDResolutionTable.explain(rollEthylisme) + "<br>";
if (rollEthylisme.isSuccess ) { if (rollEthylisme.isSuccess ) {
ethylisme.nb_doses = ethylisme.nb_doses + 1; ethylisme.nb_doses ++;
msgText += `Vous avez réussi votre jet d'éthylisme, vous avez consommé ${ethylisme.nb_doses} doses sans effet.`; msgText += `Vous avez réussi votre jet d'éthylisme, vous avez consommé ${ethylisme.nb_doses} doses sans effet.`;
} else { } else {
ethylisme.value = Math.max(ethylisme.value -1, -7); ethylisme.value = Math.max(ethylisme.value -1, -7);
ethylisme.nb_doses = 0;
let enduranceLost = new Roll("1d6").roll().total; let enduranceLost = new Roll("1d6").roll().total;
await this.santeIncDec("endurance", -enduranceLost); await this.santeIncDec("endurance", -enduranceLost);
@ -1101,25 +1121,42 @@ export class RdDActor extends Actor {
msgText += "Qui a bu boira : " +(rollVolonte.isSuccess msgText += "Qui a bu boira : " +(rollVolonte.isSuccess
? "vous êtes libre de continuer à boire ou pas." ? "vous êtes libre de continuer à boire ou pas."
: "vous avez une envie irrépréssible de reprendre un verre."); : "vous avez une envie irrépréssible de reprendre un verre.");
}
} ChatMessage.create({
await this.update( { 'data.compteurs.ethylisme': ethylisme} ); content: msgText,
const message = { whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name)
content: msgText, });
whisper: ChatMessage.getWhisperRecipients(game.user.name).concat(ChatMessage.getWhisperRecipients("GM") )
};
ChatMessage.create(message);
if (rollEthylisme.isEchec && ethylisme.value == 0) { if (rollEthylisme.isEchec) {
await this.jetDeMoral('heureuse'); // note: en, théorie, un deuxième jet de moral peut avoir lieu le même jour si lme premier est manqué, qui fait perdre du moral si raté... await this._jetDeMoralEthylique(ethylisme);
}
await this.update( { 'data.compteurs.ethylisme': ethylisme} );
}
/* -------------------------------------------- */
async _jetDeMoralEthylique(ethylisme) {
if (ethylisme.value >= -1 && !ethylisme.jet_moral) {
let adjust = await this.jetDeMoral('heureuse');
if (adjust > 0 || ethylisme.value == -1) {
ethylisme.jet_moral = true;
} }
if (ethylisme.value == -1 && adjust <= 0) {
// alcool triste
ChatMessage.create({
content: "Décidément, vous avez l'alcool triste, vous perdez finalement un point de moral!",
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name)
});
this.moralIncDec(-1);
}
}
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async stressTest() { async stressTest() {
const message = { const message = {
content: "", content: "",
whisper: ChatMessage.getWhisperRecipients(game.user.name).concat(ChatMessage.getWhisperRecipients("GM") ) whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name)
}; };
await this.transformerStress(message); await this.transformerStress(message);

View File

@ -11,7 +11,7 @@ export class RdDRollDialogEthylisme extends Dialog {
constructor(html, rollData, actor) { constructor(html, rollData, actor) {
let myButtons = { let myButtons = {
rollButton: { label: "Lancer", callback: html => this.actor.performEthylisme(this.rollData) } rollButton: { label: "Test d'éthylisme", callback: html => this.actor.performEthylisme(this.rollData) }
}; };
// Common conf // Common conf
@ -33,13 +33,13 @@ export class RdDRollDialogEthylisme extends Dialog {
var rollData = this.rollData; var rollData = this.rollData;
function updateRollResult(rollData) { function updateRollResult(rollData) {
let rollLevel = Number(rollData.etat) + Number(rollData.forceAlcool) + Number(rollData.niveauEthylisme) - Number(rollData.nbDoses);
rollData.finalLevel = rollLevel; rollData.finalLevel = Number(rollData.etat) + Number(rollData.forceAlcool) + rollData.diffNbDoses;
// Mise à jour valeurs // Mise à jour valeurs
$("#roll-param").text(rollData.vieValue + " / " + Misc.toSignedString(rollData.finalLevel)); $("#roll-param").text(rollData.vieValue + " / " + Misc.toSignedString(rollData.finalLevel));
$(".table-resolution").remove(); $(".table-resolution").remove();
$("#resolutionTable").append(RdDResolutionTable.buildHTMLTableExtract(rollData.vieValue, rollLevel)); $("#resolutionTable").append(RdDResolutionTable.buildHTMLTableExtract(rollData.vieValue, rollData.finalLevel));
} }
// Setup everything onload // Setup everything onload

View File

@ -501,7 +501,8 @@
"value": 1, "value": 1,
"label": "Ethylisme", "label": "Ethylisme",
"isInput": true, "isInput": true,
"nb_doses": 0 "nb_doses": 0,
"jet_moral": "false"
}, },
"stress": { "stress": {
"value": 0, "value": 0,

View File

@ -1,9 +1,9 @@
<form class="dialog-roll-sort"> <form class="dialog-roll-sort">
<h2 class="compdialog" id="ethylisme-dialog"></h2>
<div class="form-group"> <div class="form-group">
<label for="categorie">Vie : {{vieValue}}</label> <label for="categorie">Vie : {{vieValue}}</label>
<label for="categorie">Etat Général : {{etat}}</label> <label for="categorie">Etat général : {{etat}}</label>
<label for="categorie">Déjà bu : {{diffNbDoses}}</label>
</div> </div>
<div class="form-group" id="div-sort-difficulte"> <div class="form-group" id="div-sort-difficulte">
@ -13,12 +13,12 @@
{{#each ajustementsConditions as |key|}} {{#each ajustementsConditions as |key|}}
<option value={{key}}>{{numberFormat key decimals=0 sign=true}}</option> <option value={{key}}>{{numberFormat key decimals=0 sign=true}}</option>
{{/each}} {{/each}}
{{/select}} {{/select}}
</select> </select>
</div> </div>
<div class="form-group"> <div class="form-group">
<label>Ajustement final : </label><label id="roll-param">10 / 0</label>&nbsp;&nbsp;&nbsp;<label name="addon-message" id="addon-message"></label> <label>Ajustement final : <label id="roll-param">10 / 0</label>&nbsp;&nbsp;&nbsp;<label name="addon-message" id="addon-message"></label></label>
</div> </div>
<div id="resolutionTable"> <div id="resolutionTable">