diff --git a/module/actor-sheet.js b/module/actor-sheet.js index 2c8d182c..8889dde5 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -436,6 +436,10 @@ export class RdDActorSheet extends ActorSheet { let fieldName = event.currentTarget.attributes.name.value; this.actor.updateCompteurValue( fieldName, parseInt(event.target.value) ); } ); + + html.find('#ethylisme').change((event) => { + this.actor.setEthylisme(parseInt(event.target.value) ); + } ); // Dialog d'archetype html.find("#affiche-archetype").click((event) => { diff --git a/module/actor.js b/module/actor.js index d3e5178f..93c72f41 100644 --- a/module/actor.js +++ b/module/actor.js @@ -323,8 +323,8 @@ export class RdDActor extends Actor { } await this.update( {"data.blessures": blessures } ); } - await this.update({ "data.compteurs.ethylisme.value": 1 }); - await this.update({ "data.compteurs.ethylisme.nb_doses": 0 }); + await this.setEthylisme(1); + 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); if (this.data.data.sante.fatigue){ @@ -354,15 +354,16 @@ export class RdDActor extends Actor { async _recupererEthylisme(message) { let ethylisme = duplicate(this.data.data.compteurs.ethylisme); + ethylisme.nb_doses = 0; + ethylisme.jet_moral = false; if (ethylisme.value < 1) { ethylisme.value = Math.min(ethylisme.value + 1, 1); - ethylisme.nb_doses = 0; - await this.update({ "data.compteurs.ethylisme": ethylisme }); if (ethylisme.value <= 0) { message.content += `
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) { let jetMoral = new Roll("1d20").roll(); RdDDice.show(jetMoral); - let compteurs = duplicate(this.data.data.compteurs); - compteurs.moral.value = Misc.toInt(compteurs.moral.value); - const difficulte = 10 + compteurs.moral.value; + let moralActuel = Misc.toInt(this.data.data.compteurs.moral.value); + const difficulte = 10 + moralActuel; const succes = jetMoral.total <= difficulte; - let ajustementMoral = this._calculAjustementMoral(succes, compteurs.moral.value, situation); - 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} ); - } + + let ajustementMoral = this._calculAjustementMoral(succes, moralActuel, situation); + + await this.moralIncDec(ajustementMoral); ChatMessage.create({ 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"}` }); + 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; } + 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() { let rollData = { 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) - niveauEthylisme: this.data.data.compteurs.ethylisme.value, - nbDoses: this.data.data.compteurs.ethylisme.nb_doses || 0, + 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) + diffNbDoses: -Number(this.data.data.compteurs.ethylisme.nb_doses || 0), finalLevel: 0, diffConditions: 0, ajustementsConditions: CONFIG.RDD.ajustementsConditions, @@ -1086,11 +1105,12 @@ export class RdDActor extends Actor { let rollEthylisme = await RdDResolutionTable.roll( rollData.vieValue, rollData.finalLevel); let msgText = RdDResolutionTable.explain(rollEthylisme) + "
"; 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.`; } else { ethylisme.value = Math.max(ethylisme.value -1, -7); - + ethylisme.nb_doses = 0; + let enduranceLost = new Roll("1d6").roll().total; await this.santeIncDec("endurance", -enduranceLost); const ajustementEthylique = ethylisme.value; @@ -1101,25 +1121,42 @@ export class RdDActor extends Actor { msgText += "Qui a bu boira : " +(rollVolonte.isSuccess ? "vous êtes libre de continuer à boire ou pas." : "vous avez une envie irrépréssible de reprendre un verre."); + } + ChatMessage.create({ + content: msgText, + whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name) + }); + + if (rollEthylisme.isEchec) { + 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; } - await this.update( { 'data.compteurs.ethylisme': ethylisme} ); - const message = { - content: msgText, - whisper: ChatMessage.getWhisperRecipients(game.user.name).concat(ChatMessage.getWhisperRecipients("GM") ) - }; - ChatMessage.create(message); - - if (rollEthylisme.isEchec && ethylisme.value == 0) { - 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é... + 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() { const message = { content: "", - whisper: ChatMessage.getWhisperRecipients(game.user.name).concat(ChatMessage.getWhisperRecipients("GM") ) + whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name) }; await this.transformerStress(message); diff --git a/module/rdd-roll-ethylisme.js b/module/rdd-roll-ethylisme.js index e0f1ca87..906253ea 100644 --- a/module/rdd-roll-ethylisme.js +++ b/module/rdd-roll-ethylisme.js @@ -11,7 +11,7 @@ export class RdDRollDialogEthylisme extends Dialog { constructor(html, rollData, actor) { 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 @@ -33,13 +33,13 @@ export class RdDRollDialogEthylisme extends Dialog { var rollData = this.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 $("#roll-param").text(rollData.vieValue + " / " + Misc.toSignedString(rollData.finalLevel)); $(".table-resolution").remove(); - $("#resolutionTable").append(RdDResolutionTable.buildHTMLTableExtract(rollData.vieValue, rollLevel)); + $("#resolutionTable").append(RdDResolutionTable.buildHTMLTableExtract(rollData.vieValue, rollData.finalLevel)); } // Setup everything onload diff --git a/template.json b/template.json index 86f7ff96..1b9efb47 100644 --- a/template.json +++ b/template.json @@ -501,7 +501,8 @@ "value": 1, "label": "Ethylisme", "isInput": true, - "nb_doses": 0 + "nb_doses": 0, + "jet_moral": "false" }, "stress": { "value": 0, diff --git a/templates/dialog-roll-ethylisme.html b/templates/dialog-roll-ethylisme.html index 21ddfbe6..baeb1379 100644 --- a/templates/dialog-roll-ethylisme.html +++ b/templates/dialog-roll-ethylisme.html @@ -1,11 +1,11 @@
-

- + +
- +
- +
-     +