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 { 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;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
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) {
|
||||
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);
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
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