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 !"