Rêve de Dragon
This commit is contained in:
parent
2af358b924
commit
ae3766f99b
@ -22,6 +22,8 @@ import { StatusEffects } from "./status-effects.js";
|
|||||||
import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
|
import { RdDItemCompetenceCreature } from "./item-competencecreature.js";
|
||||||
import { ReglesOptionelles } from "./regles-optionelles.js";
|
import { ReglesOptionelles } from "./regles-optionelles.js";
|
||||||
import { RdDItem } from "./item.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) {
|
async combattreReveDeDragon(force) {
|
||||||
let draconic = this.getBestDraconic();
|
let rollData = {
|
||||||
let niveau = Math.max(0, draconic.data.niveau);
|
actor: this,
|
||||||
let etat = this.getEtatGeneral();
|
competence: duplicate(this.getBestDraconic()),
|
||||||
let difficulte = niveau - etat - force;
|
canClose: false,
|
||||||
let reveActuel = this.getReveActuel();
|
rencontre: duplicate(TMRRencontres.getRencontre('rdd')),
|
||||||
let rolled = await RdDResolutionTable.roll(reveActuel, difficulte);
|
tmr: true,
|
||||||
// TODO: xp particulière
|
use: {libre: false, conditions: false},
|
||||||
console.log("combattreReveDeDragon", rolled);
|
forceCarac: { 'reve-actuel': { label: "Rêve Actuel", value: this.getReveActuel() } }
|
||||||
return await this.appliquerReveDeDragon(rolled, force);
|
}
|
||||||
|
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
|
content: this.name + " subit une Queue de Dragon : " + queue.name
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return queue.name;
|
return queue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
69
module/poetique.js
Normal file
69
module/poetique.js
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
|
||||||
|
const poesieHautReve = [
|
||||||
|
{
|
||||||
|
reference: 'Le Ratier Bretonien',
|
||||||
|
extrait: `Le courant du Fleuve
|
||||||
|
<br>Te domine et te Porte
|
||||||
|
<br>Avant que tu te moeuves
|
||||||
|
<br>Combat le, ou il t'emporte`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
reference: 'Incompatibilité, Charles Beaudelaire',
|
||||||
|
extrait: `Et lorsque par hasard une nuée errante
|
||||||
|
<br>Assombrit dans son vol le lac silencieux,
|
||||||
|
<br>On croirait voir la robe ou l'ombre transparente
|
||||||
|
<br>D'un esprit qui voyage et passe dans les cieux.`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
reference: 'Au fleuve de Loire, Joachim du Bellay',
|
||||||
|
extrait: `Ô de qui la vive course
|
||||||
|
<br>Prend sa bienheureuse source,
|
||||||
|
<br>D’une argentine fontaine,
|
||||||
|
<br>Qui d’une fuite lointaine,
|
||||||
|
<br>Te rends au sein fluctueux
|
||||||
|
<br>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]
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -41,9 +41,9 @@ export class RdDRollTables {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async getQueue(toChat = false) {
|
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') ) {
|
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') ) {
|
if (queue.name.toLowerCase().includes('fixe') ) {
|
||||||
queue = await RdDRollTables.drawItemFromRollTable("Idées fixes", toChat);
|
queue = await RdDRollTables.drawItemFromRollTable("Idées fixes", toChat);
|
||||||
|
@ -4,13 +4,14 @@
|
|||||||
*/
|
*/
|
||||||
import { RollDataAjustements } from "./rolldata-ajustements.js";
|
import { RollDataAjustements } from "./rolldata-ajustements.js";
|
||||||
import { RdDUtility } from "./rdd-utility.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 { tmrConstants } from "./tmr-utility.js";
|
||||||
import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
import { RdDResolutionTable } from "./rdd-resolution-table.js";
|
||||||
import { RdDTMRRencontreDialog } from "./rdd-tmr-rencontre-dialog.js";
|
import { RdDTMRRencontreDialog } from "./rdd-tmr-rencontre-dialog.js";
|
||||||
import { TMRRencontres } from "./tmr-rencontres.js";
|
import { TMRRencontres } from "./tmr-rencontres.js";
|
||||||
import { ChatUtility } from "./chat-utility.js";
|
import { ChatUtility } from "./chat-utility.js";
|
||||||
import { RdDRoll } from "./rdd-roll.js";
|
import { RdDRoll } from "./rdd-roll.js";
|
||||||
|
import { Poetique } from "./poetique.js";
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -373,9 +374,9 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
tmr: tmr,
|
tmr: tmr,
|
||||||
canClose: false,
|
canClose: false,
|
||||||
diffLibre: -7,
|
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);
|
await this._rollMaitriseCaseHumide(rollData);
|
||||||
}
|
}
|
||||||
@ -437,12 +438,10 @@ export class RdDTMRDialog extends Dialog {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rollData.poesie = poesieCaseHumide[new Roll("1d" + poesieCaseHumide.length).evaluate().total - 1];
|
rollData.poesie = Poetique.getExtrait();
|
||||||
const whisperTo = ChatUtility.getWhisperRecipientsAndGMs(game.user.name);
|
|
||||||
const content = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-fleuve-tmr.html`, rollData);
|
|
||||||
ChatMessage.create({
|
ChatMessage.create({
|
||||||
whisper: whisperTo,
|
whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name),
|
||||||
content: content
|
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-fleuve-tmr.html`, rollData)
|
||||||
});
|
});
|
||||||
if (rollData.rolled.isEchec) {
|
if (rollData.rolled.isEchec) {
|
||||||
this.close();
|
this.close();
|
||||||
|
@ -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: "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: "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: "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: "passfou", 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: "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) {
|
static async onPostSuccessReveDeDragon(tmrDialog, data) {
|
||||||
await data.actor.appliquerReveDeDragon(data.rolled, data.rencontre.force);
|
|
||||||
if (data.rolled.isPart) {
|
if (data.rolled.isPart) {
|
||||||
await data.actor.appliquerExperience(data.rolled, 'reve', data.competence);
|
await data.actor.appliquerExperience(data.rolled, 'reve', data.competence);
|
||||||
}
|
}
|
||||||
|
await data.actor.resultCombattreReveDeDragon(data.rolled);
|
||||||
}
|
}
|
||||||
|
|
||||||
static async onPostEchecReveDeDragon(tmrDialog, data) {
|
static async onPostEchecReveDeDragon(tmrDialog, data) {
|
||||||
await data.actor.appliquerReveDeDragon(data.rolled, data.rencontre.force);
|
await data.actor.resultCombattreReveDeDragon(data.rolled);
|
||||||
tmrDialog.close();
|
tmrDialog.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -227,7 +227,7 @@ export const TMRType = {
|
|||||||
desolation: { name: "désolation", genre: "f" }
|
desolation: { name: "désolation", genre: "f" }
|
||||||
}
|
}
|
||||||
|
|
||||||
export const poesieCaseHumide = [
|
export const poesieHautReve = [
|
||||||
{
|
{
|
||||||
reference: 'Le Ratier Bretonien',
|
reference: 'Le Ratier Bretonien',
|
||||||
extrait: `Le courant du Fleuve
|
extrait: `Le courant du Fleuve
|
||||||
|
28
templates/chat-resultat-reve-de-dragon.html
Normal file
28
templates/chat-resultat-reve-de-dragon.html
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/icons/competence_legendes.png" alt="Rêve de Dragon"/>
|
||||||
|
<h4 data-categorie="tmr" data-actor-id="{{actor._id}}">
|
||||||
|
{{alias}} tente de maîtriser un Rêve de Dragon!
|
||||||
|
</h4>
|
||||||
|
{{> "systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html"}}
|
||||||
|
<hr>
|
||||||
|
<span>
|
||||||
|
{{#if rolled.isSuccess}}
|
||||||
|
Vous maîtrisez le Rêve de Dragon! Vous gagnez ses {{rencontre.force}} points de Rêve.
|
||||||
|
{{#if tete}}
|
||||||
|
<br>Vous devez <strong>demander au Gardien des Rêves</strong> 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|}}
|
||||||
|
<br>{{queue.name}}: {{{queue.data.data.description}}}
|
||||||
|
{{/each}}
|
||||||
|
{{/if}}
|
||||||
|
</span>
|
||||||
|
{{#if poesie}}
|
||||||
|
<hr>
|
||||||
|
<span class="poesie-extrait">
|
||||||
|
{{{poesie.extrait}}}
|
||||||
|
<p class="poesie-reference">{{poesie.reference}}</p>
|
||||||
|
</span>
|
||||||
|
{{/if}}
|
12
templates/dialog-roll-reve-de-dragon.html
Normal file
12
templates/dialog-roll-reve-de-dragon.html
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<form class="skill-roll-dialog">
|
||||||
|
<h2 class="compdialog">Rêve de Dragon de force {{rencontre.force}}!</h2>
|
||||||
|
<div class="form-group">
|
||||||
|
</div>
|
||||||
|
<div id="tableAjustements"></div>
|
||||||
|
<div id="tableResolution"></div>
|
||||||
|
<div id="tableProbaReussite"></div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
</script>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user