Dormir Chateau dormant
Gestion de l'heure de chateau dormant. inclus * récupération blessures * récupération vie * conversion de stress * descente vers seuil de rêve
This commit is contained in:
parent
f77a0bf20b
commit
e82eaa2ad7
@ -250,7 +250,10 @@ export class RdDActorSheet extends ActorSheet {
|
||||
|
||||
html.find('.dormir-une-heure').click((event) => {
|
||||
this.actor.dormir(1);
|
||||
} );
|
||||
});
|
||||
html.find('.dormir-chateau-dormant').click((event) => {
|
||||
this.actor.dormirChateauDormant();
|
||||
});
|
||||
|
||||
// Display info about queue
|
||||
html.find('.queuesouffle-label a').click((event) => {
|
||||
|
132
module/actor.js
132
module/actor.js
@ -331,6 +331,100 @@ export class RdDActor extends Actor {
|
||||
return explications
|
||||
}
|
||||
|
||||
async dormirChateauDormant() {
|
||||
let message = {
|
||||
whisper: ChatUtility.getWhisperRecipientsAndGMs( this.name ),
|
||||
content : ""
|
||||
|
||||
};
|
||||
const blessures = duplicate(this.data.data.blessures);
|
||||
console.log("dormirChateauDormant", blessures)
|
||||
await this._recupererBlessures(message, "legere", blessures.legeres.liste.filter(b => b.active), []);
|
||||
await this._recupererBlessures(message, "grave", blessures.graves.liste.filter(b => b.active), blessures.legeres.liste);
|
||||
await this._recupererBlessures(message,"legere", blessures.critiques.liste.filter(b => b.active), blessures.graves.liste);
|
||||
await this.update( {"data.blessures": blessures } );
|
||||
await this._recupererVie(message);
|
||||
await this.transformerStress(message);
|
||||
await this.retourSeuilDeReve(message);
|
||||
message.content = "A la fin Chateau Dormant, " + message.content +"<br>Un nouveau jour se lève";
|
||||
ChatMessage.create( message );
|
||||
}
|
||||
|
||||
async _recupererBlessures(message, type, liste, moindres) {
|
||||
let count = 0;
|
||||
const definitions = RdDUtility.getDefinitionsBlessures();
|
||||
let definition = definitions.find( d => d.type == type);
|
||||
for (let blessure of liste) {
|
||||
if (blessure.jours >= definition.facteur) {
|
||||
let rolled = await this._jetRecuperationConstitution(Misc.toInt(blessure.soins_complets), message);
|
||||
blessure.soins_complets = 0;
|
||||
if (rolled.isSuccess && this._retrograderBlessure(type, blessure, moindres)) {
|
||||
message.content += " -- une blessure " + type + " cicatrise";
|
||||
count++;
|
||||
}
|
||||
else if (rolled.isETotal) {
|
||||
message.content += " -- une blessure " + type + " s'infecte (temps de guérison augmenté de " + definition.facteur + " jours, perte de vie)";
|
||||
blessure.jours = 0;
|
||||
await this.santeIncDec("vie", -1);
|
||||
}
|
||||
else {
|
||||
message.content += " -- une blessure " + type + " reste stable";
|
||||
}
|
||||
}
|
||||
else {
|
||||
blessure.jours++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_retrograderBlessure(type, blessure, blessuresMoindres)
|
||||
{
|
||||
if (type != "legere") {
|
||||
let retrograde = blessuresMoindres.find(b => !b.active);
|
||||
if (!retrograde) {
|
||||
return false;
|
||||
}
|
||||
mergeObject(retrograde, { "active": true, "premiers_soins": 0, "soins_complets": 0, "jours": 0, "localisation": blessure.localisation });
|
||||
}
|
||||
mergeObject(blessure, { "active": false, "premiers_soins": 0, "soins_complets": 0, "jours": 0, "localisation": "" });
|
||||
return true;
|
||||
}
|
||||
|
||||
async _recupererVie(message) {
|
||||
let blessures = [].concat(this.data.data.blessures.legeres.liste).concat(this.data.data.blessures.graves.liste).concat(this.data.data.blessures.critiques.liste);
|
||||
let nbBlessures = blessures.filter(b => b.active);
|
||||
let vieManquante = this.data.data.sante.vie.max - this.data.data.sante.vie.value;
|
||||
if (nbBlessures == 0 && vieManquante>0) {
|
||||
let bonusSoins = 0;
|
||||
for (let b of blessures)
|
||||
{
|
||||
bonusSoins = Math.max(bonusSoins, Misc.toInt(b.soins_complets));
|
||||
}
|
||||
let rolled = await this._jetRecuperationConstitution(bonusSoins, message)
|
||||
if (rolled.isSuccess) {
|
||||
const gain = Math.min(rolled.isPart ? 2 : 1, vieManquante);
|
||||
message.content += " -- récupération de vie: " + gain;
|
||||
await this.santeIncDec("vie", gain);
|
||||
}
|
||||
else if (rolled.isETotal) {
|
||||
message.content += " -- perte de vie: 1";
|
||||
await this.santeIncDec("vie", -1);
|
||||
}
|
||||
else{
|
||||
message.content +=" -- vie stationnaire ";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async _jetRecuperationConstitution(bonusSoins, message = undefined) {
|
||||
let difficulte = Misc.toInt(bonusSoins) + Math.min(0, this.data.data.sante.vie.value - this.data.data.sante.vie.max);
|
||||
let rolled = await RdDResolutionTable.roll(this.data.data.carac.constitution.value, difficulte);
|
||||
if (message) {
|
||||
message.content += RdDResolutionTable.explain(rolled).replace(/Jet :/, "Constitution :");
|
||||
}
|
||||
return rolled;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async dormir(heures=1) {
|
||||
let message = {
|
||||
@ -415,6 +509,14 @@ export class RdDActor extends Actor {
|
||||
}
|
||||
}
|
||||
}
|
||||
async retourSeuilDeReve(message) {
|
||||
const seuil = this.data.data.reve.seuil.value;
|
||||
const reveActuel = this.getReveActuel();
|
||||
if (reveActuel > seuil) {
|
||||
message.content += "<br>Votre rêve redescend vers son seuil naturel (seuil " + seuil + ", nouveau rêve actuel "+(reveActuel-1)+")";
|
||||
await this.reveActuelIncDec(-1);
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async combattreReveDeDragon(force){
|
||||
@ -901,17 +1003,27 @@ export class RdDActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async stressTest() {
|
||||
let stressRoll = this._stressRoll();
|
||||
let compteurs = duplicate(this.data.data.compteurs);
|
||||
let convertion = Math.floor(compteurs.stress.value * stressRoll.factor);
|
||||
|
||||
compteurs.experience.value += convertion;
|
||||
compteurs.stress.value = Math.max(compteurs.stress.value - convertion - 1, 0);
|
||||
|
||||
ChatMessage.create({
|
||||
content: "Vous avez transformé " + convertion + " points de Stress en Expérience" + stressRoll.comment,
|
||||
const message = {
|
||||
content: "",
|
||||
whisper: ChatMessage.getWhisperRecipients(game.user.name)
|
||||
});
|
||||
};
|
||||
await this.transformerStress(message);
|
||||
|
||||
ChatMessage.create(message);
|
||||
}
|
||||
|
||||
async transformerStress(message) {
|
||||
const stress = Misc.toInt(this.data.data.compteurs.stress.value);
|
||||
if (stress<=0) {
|
||||
return;
|
||||
}
|
||||
let stressRoll = await this._stressRoll();
|
||||
let convertis = Math.floor(stress * stressRoll.factor);
|
||||
|
||||
let compteurs = duplicate(this.data.data.compteurs);
|
||||
compteurs.experience.value += convertis;
|
||||
compteurs.stress.value = Math.max(stress - convertis - 1, 0);
|
||||
message.content += "<br>Vous transformez " + convertis + " points de Stress en Expérience" + stressRoll.comment;
|
||||
await this.update({ "data.compteurs": compteurs });
|
||||
}
|
||||
|
||||
|
@ -75,6 +75,12 @@ const table2func = { "queues": {descr: "queues : Tire une queue de Dragon", fun
|
||||
"souffle": { descr: "souffle: Tire un Souffle de Dragon", func: RdDRollTables.getSouffle},
|
||||
"tarot" : { descr: "tarot: Tire une carte de Tarot Dracnique", func: RdDRollTables.getTarot} };
|
||||
|
||||
const definitionsBlessures = [
|
||||
{ type: "legere", facteur: 2 },
|
||||
{ type: "grave", facteur : 4 },
|
||||
{ type: "critique", facteur : 6 }
|
||||
]
|
||||
|
||||
const definitionsEncaissement = {
|
||||
"mortel": [
|
||||
{ minimum: undefined, maximum: 0, endurance: "0", vie: "0", legeres: 0, graves: 0, critiques: 0 },
|
||||
@ -289,6 +295,9 @@ export class RdDUtility {
|
||||
return ajustementsConditions;
|
||||
}
|
||||
|
||||
static getDefinitionsBlessures() {
|
||||
return definitionsBlessures;
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
static isTronc( compName )
|
||||
{
|
||||
|
@ -60,7 +60,7 @@
|
||||
<div>
|
||||
<span class="encaisser-direct"><a title="Encaisser des dommages"><img class="button-img" src="icons/svg/bones.svg" alt="Encaisser des dommages"/></a></span>
|
||||
<span class="dormir-une-heure"><a title="Dormir une heure"><img class="button-img" src="icons/svg/sleep.svg" alt="Dormir une heure"/></a></span>
|
||||
<span class="chateau-dormant"><a title="Chateau Dormant"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/icons/heures/hd12.svg" alt="Chateau Dormant"/></a></span>
|
||||
<span class="dormir-chateau-dormant"><a title="Chateau Dormant"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/icons/heures/hd12.svg" alt="Chateau Dormant"/></a></span>
|
||||
<span class="monte-tmr"><a title="Montée dans les Terres Médianes !"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-normal.svg" alt="Montée dans les Terres Médianes !"/></a></span>
|
||||
<span class="monte-tmr-rapide"><a title="Montée accélérée dans les Terres Médianes !"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-rapide.svg" alt="Montée accélérée dans les Terres Médianes !"/></a></span>
|
||||
<span class="visu-tmr"><a title="Regarder les Terres Médianes"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-view.svg" alt="Regarder les Terres Médianes"/></a></span>
|
||||
|
Loading…
Reference in New Issue
Block a user