From aea1bca24a5992cb0d4ecf131b4cac5a1701f566 Mon Sep 17 00:00:00 2001 From: sladecraven Date: Wed, 30 Dec 2020 15:18:58 +0100 Subject: [PATCH] #80 Gestion de la queue Mauvaise Rencontre en Perspective --- module/actor.js | 13 ++++++++++ module/rdd-tmr-dialog.js | 51 ++++++++++++++++++++++++++-------------- module/tmr-utility.js | 34 +++++++++++++++++++++++---- 3 files changed, 77 insertions(+), 21 deletions(-) diff --git a/module/actor.js b/module/actor.js index 858733cb..c98d5eff 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1286,6 +1286,19 @@ export class RdDActor extends Actor { dialog.render(true); } + /* -------------------------------------------- */ + isRencontreSpeciale( ) { // Gestion queue 'Mauvaise Rencontre en Perpective' + let rencSpecial = this.data.items.find( item => item.type == 'queue' && item.name.toLowerCase().includes( 'mauvaise rencontre' ) ); + if ( rencSpecial ) { + rencSpecial = duplicate(rencSpecial); // To keep it + this.deleteOwnedItem( rencSpecial._id ); // Suppression dans la liste des queues + ChatUtility.chatWithRollMode( + { content:"Votre rencontre en TMR est spéciale à cause de votre Queue de Dragon : Mauvaise Rencontre en Perspective. La queue a été supprimée de votre état."}, + this.name); + } + return rencSpecial; + } + /* -------------------------------------------- */ async _rollUnSortResult(rollData, isSortReserve = false) { rollData.isSortReserve = isSortReserve; diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index b81f53e3..e0e5f97b 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -100,9 +100,9 @@ export class RdDTMRDialog extends Dialog { } /* -------------------------------------------- */ async refouler(data) { - this._tellToGM(this.actor.name + " a refoulé une rencontre."); + this._tellToGM(this.actor.name + " a refoulé : " + this.currentRencontre.name ); await this.actor.deleteTMRRencontreAtPosition(); // Remove the stored rencontre if necessary - let result = await this.actor.ajouterRefoulement(1); + let result = await this.actor.ajouterRefoulement( this.currentRencontre.data.refoulement ); this.updatePreviousRencontres(); console.log("-> refouler", this.currentRencontre) this.updateValuesDisplay(); @@ -139,6 +139,20 @@ export class RdDTMRDialog extends Dialog { console.log("NEWPOS", tmrPos); } + /* -------------------------------------------- */ + async gererTourbillonRouge( ) { + this.nbFatigue += 4; // 4 cases -> 4 pts de fatigue + await this.actor.reveActuelIncDec( -2 ); // -2 pts de Reve a chaque itération + if ( !this.currentRencontre.tourbillonDirection ) { + this.currentRencontre.tourbillonDirection = TMRUtility.getDirectionPattern(); + } + let tmrPos = this.actor.data.data.reve.tmrpos; + tmrPos.coord = TMRUtility.deplaceTMRSelonPattern( tmrPos.coord, this.currentRencontre.tourbillonDirection, 4 ); // Depl. 4 cases. + await this.actor.update({ "data.reve.tmrpos": tmrPos }); + await this.actor.santeIncDec( "vie", -1); // Et -1 PV + console.log("TOURBILLON ROUGE", tmrPos); + } + /* -------------------------------------------- */ /** Gère les rencontres avec du post-processing graphique (passeur, messagers, tourbillons, ...) */ async rencontrePostProcess( rencontreData) { @@ -149,6 +163,17 @@ export class RdDTMRDialog extends Dialog { if ( this.rencontreState == 'passeur' || this.rencontreState == 'messager' ) { // Récupère la liste des cases à portées locList = TMRUtility.getTMRArea(this.actor.data.data.reve.tmrpos.coord, this.currentRencontre.force, tmrConstants ); + + } else if ( this.rencontreState == 'passeurfou' ) { // Cas spécial du passeur fou + let sortReserve = this.actor.data.data.reve.reserve[0]; + let tmrPos + if ( sortReserve ) { + tmrPos = sortReserve.coord; // Passeur fou positionne sur la case d'un ort en réserve (TODO : Choisir le plus loin) + } else { + let direction = TMRUtility.getDirectionPattern(); // Déplacement aléatoire de la force du Passeur Fou + tmrPos = TMRUtility.deplaceTMRSelonPattern(this.actor.data.data.reve.tmrpos.coord, direction, this.currentRencontre.force ); + } + await this.actor.update({ "data.reve.tmrpos": tmrPos }); } else if ( this.rencontreState == 'changeur' ) { // Liste des cases de même type @@ -163,6 +188,9 @@ export class RdDTMRDialog extends Dialog { } else if ( this.rencontreState == 'tourbillonnoir' ) { await this.gererTourbillon(2); + } else if ( this.rencontreState == 'tourbillonrouge' ) { + await this.gererTourbillonRouge(); + } else { this.currentRencontre = undefined; // Cleanup, not used anymore } @@ -194,7 +222,6 @@ export class RdDTMRDialog extends Dialog { const draconic = this.actor.getBestDraconic(); const carac = this.actor.getReveActuel(); - // TODO: ajouter l'état général? const etatGeneral = this.actor.data.data.compteurs.etat.value; const difficulte = draconic.data.niveau - this.currentRencontre.force + etatGeneral; console.log("Maitriser", carac, draconic.data.niveau, this.currentRencontre.force, etatGeneral); @@ -252,30 +279,20 @@ export class RdDTMRDialog extends Dialog { this.currentRencontre = duplicate(rencontre); let dialog = new RdDTMRRencontreDialog("", this, this.currentRencontre); - /* - let dialog = new Dialog({ - title: "Rencontre en TMR!", - content: "Vous recontrez un " + rencontre.name + " de force " + rencontre.force + "
", - buttons: { - derober: { icon: '', label: "Se dérober", callback: () => this.derober() }, - refouler: { icon: '', label: "Refouler", callback: () => this.refouler() }, - maitiser: { icon: '', label: "Maîtriser", callback: () => this.maitriser() } - }, - default: "derober" - });*/ dialog.render(true); } } + /* -------------------------------------------- */ async _jetDeRencontre(coordTMR, cellDescr) { let rencontre = this.rencontresExistantes.find(prev => prev.coord == coordTMR); if (rencontre == undefined) { let myRoll = new Roll("1d7").roll(); if (myRoll.total == 7) { - rencontre = await TMRUtility.rencontreTMRRoll(coordTMR, cellDescr); - } - else { + let isSpecial = this.actor.isRencontreSpeciale(); + rencontre = await TMRUtility.rencontreTMRRoll(coordTMR, cellDescr, isSpecial ); + } else { this._tellToUser(myRoll.total + ": Pas de rencontre en " + cellDescr.label + " (" + coordTMR + ")"); } } diff --git a/module/tmr-utility.js b/module/tmr-utility.js index 9871df6f..80168a60 100644 --- a/module/tmr-utility.js +++ b/module/tmr-utility.js @@ -207,6 +207,17 @@ const TMRMapping = { M15: { type: "cite", label: "Cité de Klana"} } +/* -------------------------------------------- */ +const rencontresSpeciale = [ + {name:"Mangeur de Rêve", data: { force: "1d6", ignorer: false, derober: true, refoulement: 2, quitterTMR: false } }, + {name:"Mangeur de Rêve", data: { force: "2d6", ignorer: false, derober: true, refoulement: 2, quitterTMR: false } }, + {name:"Reflet d'ancien Rêve", data: { force: "2d6+4", ignorer: false, derober: true, refoulement: 2, quitterTMR: false } }, + {name:"Tourbillon blanc", data: { force: "2d6+4", ignorer: false, derober: true, refoulement: 2, quitterTMR: false } }, + {name:"Tourbillon noir", data: { force: "2d8+4", ignorer: false, derober: true, refoulement: 2, quitterTMR: false } }, + {name:"Passeur fou", data: { force: "2d8", ignorer: false, derober: true, refoulement: 2, quitterTMR: false } }, + {name:"Tourbillon rouge", data: { force: "2d8", ignorer: false, derober: true, refoulement: 3, quitterTMR: false } } +] + /* -------------------------------------------- */ const rencontresTable = [ {name:"Messagers des Rêves", data: { force: "2d4", ignorer: true, derober: true, refoulement: 1, quitterTMR: false, @@ -334,7 +345,7 @@ export class TMRUtility { } /* -------------------------------------------- */ - static async rencontreTMRRoll( coordTMR, cellDescr ) + static async rencontreTMRRoll( coordTMR, cellDescr, isSpecial = false ) { if ( this.forceRencontre ) { // Forced @@ -344,13 +355,20 @@ export class TMRUtility { rencontre.nbCases = 0; // Utilisé pour les Tourbillons return rencontre; } - let rencontre = await this.rencontreTMRTypeCase(cellDescr.type); + let rencontre; + if ( isSpecial ) { + let index = new Roll("1d7").roll().total; + rencontre = rencontresSpeciale[index-1]; + } else { + rencontre = await this.rencontreTMRTypeCase(cellDescr.type); + } //let rencontre = rencontresTable[4]; if (rencontre) { rencontre = duplicate(rencontre); rencontre.force = await this.evaluerForceRencontre(rencontre); rencontre.coord = coordTMR; rencontre.nbCases = 0; // Utilisé pour les Tourbillons + rencontre.isSpecial = isSpecial; // Garder l'information } return rencontre; } @@ -507,17 +525,25 @@ export class TMRUtility { } else if (rencontre.name == "Briseur de Rêve") { message += "Votre Rêve est Brisé, vous quittez les Terres Médianes"; + } else if (rencontre.name == "Passeur fou") { + message += "Vous êtes déplacé sur la case de votre sort en réserve le plus proche, ou sinon aléatoirement dans une direction"; + state = "passeurfou"; + } else if (rencontre.name == "Reflet d'ancien Rêve") { message += "Votre Rêve est figé, vous restez sur cette case tant que ce Reflet n'est pas vaincu!"; state = "reflet"; } else if (rencontre.name == "Tourbillon blanc") { - message += "Votre Rêve est Brisé, vous quittez les Terres Médianes"; + message += "Vous êtes emporté par le Tourbillon..."; state = "tourbillonblanc"; } else if (rencontre.name == "Tourbillon noir") { - message += "Votre Rêve est Brisé, vous quittez les Terres Médianes"; + message += "Vous êtes emporté par le Tourbillon..."; state = "tourbillonnoir"; + + } else if (rencontre.name == "Tourbillon rouge") { + message += "Vous êtes emporté par le Tourbillon..."; + state = "tourbillonrouge"; } else if (rencontre.name == "Rêve de Dragon") { message += "Le Rêve de Dragon tourne au cauchemar !"