diff --git a/module/actor.js b/module/actor.js index 0d9cbc42..853cebc8 100644 --- a/module/actor.js +++ b/module/actor.js @@ -22,6 +22,8 @@ import { StatusEffects } from "./status-effects.js"; import { RdDItemCompetenceCreature } from "./item-competencecreature.js"; import { ReglesOptionelles } from "./regles-optionelles.js"; import { RdDItem } from "./item.js"; +import { TMRRencontres } from "./tmr-rencontres.js"; +import { Poetique } from "./poetique.js"; /* -------------------------------------------- */ @@ -580,15 +582,57 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async combattreReveDeDragon(force) { - let draconic = this.getBestDraconic(); - let niveau = Math.max(0, draconic.data.niveau); - let etat = this.getEtatGeneral(); - let difficulte = niveau - etat - force; - let reveActuel = this.getReveActuel(); - let rolled = await RdDResolutionTable.roll(reveActuel, difficulte); - // TODO: xp particulière - console.log("combattreReveDeDragon", rolled); - return await this.appliquerReveDeDragon(rolled, force); + let rollData = { + actor: this, + competence: duplicate(this.getBestDraconic()), + canClose: false, + rencontre: duplicate(TMRRencontres.getRencontre('rdd')), + tmr: true, + use: {libre: false, conditions: false}, + forceCarac: { 'reve-actuel': { label: "Rêve Actuel", value: this.getReveActuel() } } + } + rollData.rencontre.force = force; + rollData.competence.data.defaut_carac = 'reve-actuel'; + + const dialog = await RdDRoll.create(this, rollData, + { + html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-reve-de-dragon.html', + options: { height: 400 } + }, + { + name: 'maitrise', + label: 'Maîtriser le Rêve de Dragon', + callbacks: [ + this.createCallbackExperience(), + { action: r => this.resultCombatReveDeDragon(r) } + ] + } + ); + dialog.render(true); + } + + async resultCombatReveDeDragon(rollData) { + rollData.queues = []; + if (rollData.rolled.isEchec) { + rollData.queues.push(await this.ajouterQueue()); + } + if (rollData.rolled.isETotal) { + rollData.queues.push(await this.ajouterQueue()); + } + if (rollData.rolled.isSuccess) { + await this.updatePointDeSeuil(); + await this.reveActuelIncDec(rollData.rencontre.force); + } + if (rollData.rolled.isPart) { + // TODO: un dialogue pour demander le type de tête? + rollData.tete = true; + } + rollData.poesie = Poetique.getExtrait(); + + ChatMessage.create({ + whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-reve-de-dragon.html`, rollData) + }); } /* -------------------------------------------- */ @@ -1074,7 +1118,7 @@ export class RdDActor extends Actor { content: this.name + " subit une Queue de Dragon : " + queue.name }); } - return queue.name; + return queue; } /* -------------------------------------------- */ diff --git a/module/poetique.js b/module/poetique.js new file mode 100644 index 00000000..dcbb15f1 --- /dev/null +++ b/module/poetique.js @@ -0,0 +1,69 @@ + +const poesieHautReve = [ + { + reference: 'Le Ratier Bretonien', + extrait: `Le courant du Fleuve +
Te domine et te Porte +
Avant que tu te moeuves +
Combat le, ou il t'emporte` + }, + { + reference: 'Incompatibilité, Charles Beaudelaire', + extrait: `Et lorsque par hasard une nuée errante +
Assombrit dans son vol le lac silencieux, +
On croirait voir la robe ou l'ombre transparente +
D'un esprit qui voyage et passe dans les cieux.` + }, + { + reference: 'Au fleuve de Loire, Joachim du Bellay', + extrait: `Ô de qui la vive course +
Prend sa bienheureuse source, +
D’une argentine fontaine, +
Qui d’une fuite lointaine, +
Te rends au sein fluctueux +
De l’Océan monstrueux` + }, + { + reference: 'Denis Gerfaud', + extrait: `Et l'on peut savoir qui est le maître d'Oniros, c'est le Fleuve de l'Oubli. + Et l'on sait qui est le créateur du Fleuve de l'Oubli, c'est Hypnos et Narcos. + Mais l'on ne sait pas qui est le maître du Fleuve de l'Oubli, + sinon peut-être lui-même, ou peut-être Thanatos` }, + { + reference: 'Denis Gerfaud', + extrait: `Narcos est la source du Fleuve de l'Oubli et Hypnos l'embouchure + Remonter le Fleuve est la Voie de la Nuit, la Voie du Souvenir. + Descendre le Fleuve est la Voie du Jour, la Voie de l'Oubli` + }, + { + reference: 'Denis Gerfaud', + extrait: `Narcos engendre le fils dont il est la mère à l'heure du Vaisseau, + car Oniros s'embarque pour redescendre le Fleuve + vers son père Hypnos sur la Voie de l'Oubli` + }, + { + reference: 'Denis Gerfaud', + extrait: `Hypnos engendre le fils dont il est la mère à l'heure du Serpent, car + tel les serpents, Oniros commence à remonter le Fleuve + sur le Voie du Souvenir vers son père Narcos` + }, + { + reference: 'Denis Gerfaud', + extrait: `Ainsi se cuccèdent les Jours et les Ages. Les jours des Dragons sont les Ages des Hommes` + }, + { + reference: 'Denis Gerfaud', + extrait: `Ainsi parlent les sages: + «Les Dragons sont créateurs de leurs rêves, mais ils ne sont pas créateurs d'Oniros + Les Dragons ne sont pas les maîtres de leurs rêvezs, car ils ne sont pas maîtres d'Oniros. + Nul ne sait qui est le créateur des Dragons, ni qui est leur maître. + Mais l'on peut supposer qui est le maître du Rêve des Dragons, c'est Oniros»` + }, +] + +export class Poetique { + static getExtrait(){ + return poesieHautReve[new Roll("1d" + poesieHautReve.length).evaluate().total - 1] + } + +} \ No newline at end of file diff --git a/module/rdd-rolltables.js b/module/rdd-rolltables.js index c0152062..629a180a 100644 --- a/module/rdd-rolltables.js +++ b/module/rdd-rolltables.js @@ -41,9 +41,9 @@ export class RdDRollTables { /* -------------------------------------------- */ static async getQueue(toChat = false) { - let queue = await RdDRollTables.drawItemFromRollTable("Queues de dragon", toChat); + let queue = await RdDRollTables.drawItemFromRollTable("Queues de dragon", toChat); if (queue.name.toLowerCase().includes('lancinant') ) { - queue = await RdDRollTables.drawItemFromRollTable("Désirs lancinants", toChat); + queue = await RdDRollTables.drawItemFromRollTable("Désirs lancinants", toChat); } if (queue.name.toLowerCase().includes('fixe') ) { queue = await RdDRollTables.drawItemFromRollTable("Idées fixes", toChat); diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index a3b1b18e..298a12a5 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -4,13 +4,14 @@ */ import { RollDataAjustements } from "./rolldata-ajustements.js"; import { RdDUtility } from "./rdd-utility.js"; -import { poesieCaseHumide, TMRUtility } from "./tmr-utility.js"; +import { TMRUtility } from "./tmr-utility.js"; import { tmrConstants } from "./tmr-utility.js"; import { RdDResolutionTable } from "./rdd-resolution-table.js"; import { RdDTMRRencontreDialog } from "./rdd-tmr-rencontre-dialog.js"; import { TMRRencontres } from "./tmr-rencontres.js"; import { ChatUtility } from "./chat-utility.js"; import { RdDRoll } from "./rdd-roll.js"; +import { Poetique } from "./poetique.js"; /* -------------------------------------------- */ @@ -373,9 +374,9 @@ export class RdDTMRDialog extends Dialog { tmr: tmr, canClose: false, diffLibre: -7, - forceCarac: { "reveactuel": { label: "Rêve Actuel", value: this.actor.getReveActuel() } } + forceCarac: { 'reve-actuel': { label: "Rêve Actuel", value: this.actor.getReveActuel() } } } - rollData.competence.data.defaut_carac = "reveactuel"; + rollData.competence.data.defaut_carac = 'reve-actuel'; await this._rollMaitriseCaseHumide(rollData); } @@ -437,12 +438,10 @@ export class RdDTMRDialog extends Dialog { return; } } - rollData.poesie = poesieCaseHumide[new Roll("1d" + poesieCaseHumide.length).evaluate().total - 1]; - const whisperTo = ChatUtility.getWhisperRecipientsAndGMs(game.user.name); - const content = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-fleuve-tmr.html`, rollData); + rollData.poesie = Poetique.getExtrait(); ChatMessage.create({ - whisper: whisperTo, - content: content + whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-fleuve-tmr.html`, rollData) }); if (rollData.rolled.isEchec) { this.close(); diff --git a/module/tmr-rencontres.js b/module/tmr-rencontres.js index 6d55b615..b70d49d3 100644 --- a/module/tmr-rencontres.js +++ b/module/tmr-rencontres.js @@ -253,8 +253,8 @@ const mauvaisesRencontres = [ { code: "reflet+4", name: "Reflet d'ancien Rêve", type: "reflet", genre: "m", force: "2d6+4", refoulement: 2, isPersistant: true, isMauvaise: true }, { code: "tbblanc+4", name: "Tourbillon blanc", type: "tbblanc", genre: "m", force: "2d6+4", refoulement: 2, isPersistant: true, isMauvaise: true }, { code: "tbnoir+4", name: "Tourbillon noir", type: "tbnoir", genre: "m", force: "2d8+4", refoulement: 2, isPersistant: true, isMauvaise: true }, - { code: "passfou2d8", name: "Passeur fou", type: "passeurfou", genre: "m", force: "2d8", refoulement: 2, isMauvaise: true }, - { code: "tbrouge2d8", name: "Tourbillon rouge", type: "tbrouge", genre: "m", force: "2d8", refoulement: 3, isPersistant: true, isMauvaise: true } + { code: "passfou", name: "Passeur fou", type: "passeurfou", genre: "m", force: "2d8", refoulement: 2, isMauvaise: true }, + { code: "tbrouge", name: "Tourbillon rouge", type: "tbrouge", genre: "m", force: "2d8", refoulement: 3, isPersistant: true, isMauvaise: true } ] /* -------------------------------------------- */ @@ -472,14 +472,14 @@ export class TMRRencontres { } static async onPostSuccessReveDeDragon(tmrDialog, data) { - await data.actor.appliquerReveDeDragon(data.rolled, data.rencontre.force); if (data.rolled.isPart) { await data.actor.appliquerExperience(data.rolled, 'reve', data.competence); } + await data.actor.resultCombattreReveDeDragon(data.rolled); } - + static async onPostEchecReveDeDragon(tmrDialog, data) { - await data.actor.appliquerReveDeDragon(data.rolled, data.rencontre.force); + await data.actor.resultCombattreReveDeDragon(data.rolled); tmrDialog.close(); } } diff --git a/module/tmr-utility.js b/module/tmr-utility.js index 34c32967..33f5e1da 100644 --- a/module/tmr-utility.js +++ b/module/tmr-utility.js @@ -227,7 +227,7 @@ export const TMRType = { desolation: { name: "désolation", genre: "f" } } -export const poesieCaseHumide = [ +export const poesieHautReve = [ { reference: 'Le Ratier Bretonien', extrait: `Le courant du Fleuve diff --git a/templates/chat-resultat-reve-de-dragon.html b/templates/chat-resultat-reve-de-dragon.html new file mode 100644 index 00000000..f1aa7992 --- /dev/null +++ b/templates/chat-resultat-reve-de-dragon.html @@ -0,0 +1,28 @@ +Rêve de Dragon +

+ {{alias}} tente de maîtriser un Rêve de Dragon! +

+{{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}} +
+ +{{#if rolled.isSuccess}} + Vous maîtrisez le Rêve de Dragon! Vous gagnez ses {{rencontre.force}} points de Rêve. + {{#if tete}} +
Vous devez demander au Gardien des Rêves de faire un tirage sur une des + tables des têtes de dragon (Haut-rêvant ou Tous personnages). + {{/if}} +{{else}} + Vous ne parvenez pas à vaincre le Rêve de Dragon, et prennez un violent coup de queue. + Vous subissez {{#if rolled.isETotal}}deux queues{{else}}une queue{{/if}} de dragon! + {{#each queues as | queue key|}} +
{{queue.name}}: {{{queue.data.data.description}}} + {{/each}} +{{/if}} +
+{{#if poesie}} +
+ + {{{poesie.extrait}}} +

{{poesie.reference}}

+
+{{/if}} diff --git a/templates/dialog-roll-reve-de-dragon.html b/templates/dialog-roll-reve-de-dragon.html new file mode 100644 index 00000000..6b584c51 --- /dev/null +++ b/templates/dialog-roll-reve-de-dragon.html @@ -0,0 +1,12 @@ +
+

Rêve de Dragon de force {{rencontre.force}}!

+
+
+
+
+
+
+ + + \ No newline at end of file