#24 Ajout d'action pour dormir 1h

This commit is contained in:
Vincent Vandemeulebrouck 2020-11-16 04:32:42 +01:00
parent d3e48d6e5b
commit 351e848496
5 changed files with 124 additions and 12 deletions

View File

@ -299,6 +299,10 @@ export class RdDActorSheet extends ActorSheet {
this.actor.displayTMR( "rapide" );
});
html.find('.dormir-une-heure').click((event) => {
this.actor.dormir(1);
} );
// Display info about queue
html.find('.queuesouffle-label a').click((event) => {
let myID = event.currentTarget.attributes['data-item-id'].value;

View File

@ -10,6 +10,8 @@ import { RdDTMRDialog } from "./rdd-tmr-dialog.js";
import { Misc } from "./misc.js";
import { RdDResolutionTable } from "./rdd-resolution-table.js";
import { RdDDice } from "./rdd-dice.js";
import { RdDRollTables } from "./rdd-rolltables.js";
export class RdDActor extends Actor {
@ -120,11 +122,10 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */
async performRoll(rollData) {
// Perform the roll
let rolled = await RdDResolutionTable.rollChances(rollData.rollTarget);
let rolled = await RdDResolutionTable.roll(rollData.carac, rollData.finalLevel);
//rolled.isPart = true; // Pour tester le particulières
rollData.rolled = rolled; // garder le résultat
console.log("performRoll", rollData, rolled)
this.currentRollData = rollData;
if (rolled.isPart && rollData.arme && !rollData.attackerRoll) { // Réussite particulière avec attaque -> choix !
let message = "<strong>Réussite particulière en attaque</strong>";
@ -221,7 +222,7 @@ export class RdDActor extends Actor {
let chatOptions = {
content: "<strong>Test : " + rollData.selectedCarac.label + " / " + resumeCompetence + "</strong>"
+ "<br>Difficultés <strong>libre : " + rollData.diffLibre + "</strong> / conditions : " + Misc.toSignedString(rollData.diffConditions) +" / état : " + rollData.etat
+ "<br>Jet : " + rolled.roll + " sur "+ rolled.score + "% (" + rollData.selectedCarac.value + " à " +Misc.toSignedString(rollData.finalLevel) + ")"
+ RdDResolutionTable.explain(rolled)
+ "<br><strong>" + quality + "</strong>"
+ explications + xpmsg,
user: game.user._id,
@ -319,6 +320,76 @@ export class RdDActor extends Actor {
return explications
}
async dormir(heures=1) {
for (let i=0; i<heures; i++) {
console.log("recuperationReve", this.data.data);
/**
* TODO: récupérer les segment de fatigue
*/
this.recuperationReve();
}
}
async recuperationReve() {
const seuil = this.data.data.reve.seuil.value;
const reve = this.getReveActuel();
console.log("recuperationReve", this.data.data);
let message = { title : "Récupération" }
if (reve > seuil) {
message.content = "Vous avez déjà récupéré suffisament (seuil " + seuil + ", rêve actuel "+reve+")";
}
else {
let deRecuperation = await RdDDice.deDraconique();
console.log("recuperationReve", deRecuperation);
if (deRecuperation>=7)
{
// Rêve de Dragon !
message.content = "Vous faites un <strong>Rêve de Dragon</strong> de " + deRecuperation + " Points de rêve";
message.content += await this.combattreReveDeDragon(deRecuperation);
}
else{
message.content = "Vous récupérez " + deRecuperation + " Points de rêve";
await this.updatePointsDeReve(deRecuperation);
}
}
ChatMessage.create( message );
}
async combattreReveDeDragon(force){
let draconic = this.getBestDraconic();
let niveau = Math.max(0, draconic.data.niveau);
let etat = this.data.data.compteurs.etat.value;
let difficulte = niveau - etat - force;
let reveActuel = this.getReveActuel();
let roll = await RdDResolutionTable.roll(reveActuel, difficulte);
let message = ""
const resultatRdD = await this.appliquerReveDeDragon(roll, force);
return resultatRdD;
}
async appliquerReveDeDragon(roll, force) {
let message = "";
if (roll.isSuccess) {
message += "<br>Vous gagnez " + force + " points de Rêve";
this.updatePointDeSeuil();
await this.updatePointsDeReve(force);
}
if (roll.isPart) {
// TODO: Dialog pour choix entre HR opu général?
let tete = "à déterminer";
message += "<br>Vous gagnez une Tête de dragon: " + tete;
}
if (roll.isEchec) {
message += "<br>Vous subissez une Queue de Dragon";
this.ajouterQueue();
}
if (roll.isETotal) {
message += "<br>A cause de votre échec total, vous subissez une deuxième Queue de Dragon !"
this.ajouterQueue();
}
return message;
}
/* -------------------------------------------- */
async sortMisEnReserve(rollData, sort) {
let reserve = duplicate(this.data.data.reve.reserve);
@ -331,6 +402,11 @@ export class RdDActor extends Actor {
updateCarac( caracName, caracValue )
{
let caracpath = "data.carac." + caracName + ".value"
if (caracName == reve) {
if (caracValue > Misc.toInt(this.data.data.reve.seuil.value)) {
this.setPointDeSeuil(caracValue);
}
}
this.update( { caracpath: caracValue } );
}
@ -499,18 +575,47 @@ export class RdDActor extends Actor {
let total = new Roll("d20").roll().total;
if ( total <= refoulement.value ) {
refoulement.value = 0;
let souffle = RdDRollTables.getSouffle();
ChatMessage.create( { title : "Souffle de Dragon",
content: game.user.name + " subit un Souffle de Dragon : " + souffle.name } );
this.actor.createOwnedItem(souffle);
this.ajouterSouffle();
ret = "souffle";
}
await this.update( {"data.reve.refoulement": refoulement } );
return ret;
}
ajouterSouffle() {
let souffle = RdDRollTables.getSouffle();
// ChatMessage.create({
// title: "Souffle de Dragon",
// content: this.name + " subit un Souffle de Dragon : " + souffle.name
// });
// this.actor.createOwnedItem(souffle);
}
async ajouterQueue() {
// TODO: Déterminer si Thanatos a été utilisé? => laisser le joueur ne pas choisir Thanatos => choisir sa voie?
let utiliseThanatos = false;
let queue;
if (utiliseThanatos) {
queue = await RdDRollTables.getOmbre();
// mettre à jour: plus d'ombre en vue
}
else {
queue = await RdDRollTables.getQueue();
}
/*
// TODO: convertir la queue obtenue en nouvel item ...
// ou bien l'ajouter à la liste spécifique => this.data.data.reve.queues
this.createOwnedItem(queue);
ChatMessage.create({
title: "Queue de Dragon",
content: this.name + " subit un Queue de Dragon : " + queue.name
});
return queue.name;
*/
}
/* -------------------------------------------- */
async deleteTMRRencontreAtPosition( ) {

View File

@ -66,7 +66,7 @@ export class RdDRollDialog extends Dialog {
let rollLevel = RdDRollDialog._computeFinalLevel(rollData);
rollData.finalLevel = rollLevel;
rollData.rollTarget = RdDResolutionTable.computeChances(rollData.selectedCarac.value, rollData.finalLevel);
rollData.carac = rollData.selectedCarac.value
// Sort management
if ( rollData.selectedSort ) {

View File

@ -222,7 +222,7 @@ export class RdDTMRDialog extends Dialog {
explication += "Vous êtes entré sur une case humide, et vous avez <strong>réussi</strong> votre maîtrise !"
}
explication += "<br><strong>Test : Rêve actuel / " + draconic.name + " / " + cellDescr.type + "</strong>"
+ "<br>Jet : " + carac + " / " + difficulte + " -> " + rolled.score + "%<br><strong>Résutat : </strong>" + rolled.roll;
+ RdDResolutionTable.explain(rolled);
if (rolled.isETotal) {
let souffle = RdDRollTables.getSouffle();

View File

@ -394,6 +394,9 @@
<div>
<span class="monte-tmr-rapide"><strong><a>Monter en Accéléré dans les Terres Medianes !</a></strong></span>
</div>
<div>
<span class="dormir-une-heure"><strong><a>Dormir une heure</a></strong></span>
</div>
<div>
<ol class="item-list">
<li class="item flexrow">