diff --git a/icons/svg/gift.svg b/icons/svg/gift.svg deleted file mode 100644 index d62ef934..00000000 --- a/icons/svg/gift.svg +++ /dev/null @@ -1,118 +0,0 @@ - -image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/icons/tmr/gift.svg b/icons/tmr/gift.svg new file mode 100644 index 00000000..6a06c684 --- /dev/null +++ b/icons/tmr/gift.svg @@ -0,0 +1,130 @@ + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/tmr/pelerin.svg b/icons/tmr/pelerin.svg new file mode 100644 index 00000000..9cdd6b6e --- /dev/null +++ b/icons/tmr/pelerin.svg @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/tmr/scroll.svg b/icons/tmr/scroll.svg new file mode 100644 index 00000000..8d3b19cf --- /dev/null +++ b/icons/tmr/scroll.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/tmr/treasure-chest.svg b/icons/tmr/treasure-chest.svg new file mode 100644 index 00000000..9b6838c2 --- /dev/null +++ b/icons/tmr/treasure-chest.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/svg/wave.svg b/icons/tmr/wave.svg similarity index 100% rename from icons/svg/wave.svg rename to icons/tmr/wave.svg diff --git a/module/actor.js b/module/actor.js index 6e993730..1f749910 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1143,12 +1143,6 @@ export class RdDActor extends Actor { displayTMRQueueSouffleInformation() { let messages = []; for (let item of this.data.items) { - if (EffetsDraconiques.isConquete(item)) { - messages.push("Vous souffrez d'une Conquête : " + item.data.description); - } - if (EffetsDraconiques.isPelerinage(item)) { - messages.push("Vous souffrez d'un Pélerinage : " + item.data.description); - } if (EffetsDraconiques.isUrgenceDraconique(item)) { messages.push("Vous souffrez d'une Urgence Draconique : " + item.data.description); } @@ -1811,8 +1805,8 @@ export class RdDActor extends Actor { ui.notifications.info("Aucun sort disponible pour cette case !"); return; } - if (EffetsDraconiques.isConquete(this)) { - ui.notifications.error("Vous ne pouvez pas lancer de sort sous l'effet d'une conquête!"); + if (EffetsDraconiques.isSortImpossible(this)) { + ui.notifications.error("Une queue ou un souffle vous empèche de lancer de sort!"); return; } if (this.currentTMR) this.currentTMR.minimize(); // Hide @@ -1880,7 +1874,7 @@ export class RdDActor extends Actor { let countInertieDraconique = EffetsDraconiques.countInertieDraconique(this); if (countInertieDraconique > 0) { ChatMessage.create({ - content: `Vous êtes sous le coup d'une Inertie Draconique : vous perdez ${countInertieDraconique + 1} cases de Fatigue par déplacement au lieu d'une.`, + content: `Vous êtes sous le coup d'Inertie Draconique : vous perdrez ${countInertieDraconique + 1} cases de Fatigue par déplacement au lieu d'une.`, whisper: ChatMessage.getWhisperRecipients(game.user.name) }); } @@ -1888,9 +1882,9 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - async checkSoufflePeage(cellDescr) { + async checkSoufflePeage(tmr) { let peage = this.data.items.find(item => EffetsDraconiques.isPeage(item)); - if (peage && (cellDescr.type == 'pont' || cellDescr.type == 'cite')) { + if (peage && (tmr.type == 'pont' || tmr.type == 'cite')) { await this.reveActuelIncDec(-1); ChatMessage.create({ content: "Vous êtes sous le coup d'un Péage : l'entrée sur cette case vous a coûté 1 Point de Rêve (déduit automatiquement).", diff --git a/module/rdd-resolution-table.js b/module/rdd-resolution-table.js index 8c05bcee..e020deaf 100644 --- a/module/rdd-resolution-table.js +++ b/module/rdd-resolution-table.js @@ -138,18 +138,24 @@ export class RdDResolutionTable { mergeObject(chances, this._computeCell(null, newScore), { overwrite: true }); } } + static significativeRequise(chances) { chances.roll = Math.floor(chances.score / 2); mergeObject(chances, reussites.find(x => x.code == 'sign'), { overwrite: true }); } + static succesRequis(chances) { + chances.roll = chances.score; + mergeObject(chances, reussites.find(x => x.code == 'norm'), { overwrite: true }); + } + /* -------------------------------------------- */ static async rollChances(chances) { let myRoll = new Roll("1d100").roll(); myRoll.showDice = chances.showDice; await RdDDice.show(myRoll); chances.roll = myRoll.total; - mergeObject(chances, this._computeReussite(chances, chances.roll), { overwrite: true }); + mergeObject(chances, this.computeReussite(chances, chances.roll), { overwrite: true }); return chances; } @@ -210,7 +216,7 @@ export class RdDResolutionTable { } /* -------------------------------------------- */ - static _computeReussite(chances, roll) { + static computeReussite(chances, roll) { return reussites.find(x => x.condition(chances, roll)); } diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index 823e8679..400c330f 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -81,7 +81,7 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ createPixiSprites() { - EffetsDraconiques.carteTmr._createSprite(this.pixiTMR); + EffetsDraconiques.carteTmr.createSprite(this.pixiTMR); this.updateTokens(); @@ -123,9 +123,9 @@ export class RdDTMRDialog extends Dialog { _tokenRencontre(rencontre) { return EffetsDraconiques.rencontre.token(this.pixiTMR, rencontre, () => rencontre.coord); } - _tokenCaseSpeciale(caseSpeciale) { - const draconique = Draconique.get(caseSpeciale.data.specific); - return draconique?.token(this.pixiTMR, caseSpeciale, () => caseSpeciale.data.coord); + _tokenCaseSpeciale(casetmr) { + const draconique = Draconique.get(casetmr.data.specific); + return draconique?.token(this.pixiTMR, casetmr, () => casetmr.data.coord); } _tokenSortEnReserve(sortEnReserve) { return EffetsDraconiques.sortReserve.token(this.pixiTMR, sortEnReserve.sort, () => sortEnReserve.coord); @@ -313,7 +313,7 @@ export class RdDTMRDialog extends Dialog { } /* -------------------------------------------- */ - async _tentativeMaitrise(rencontreData) { + async _tentativeMaitrise(rencontreData, presentCite) { console.log("-> matriser", rencontreData); rencontreData.reve = this.actor.getReveActuel(); @@ -321,7 +321,10 @@ export class RdDTMRDialog extends Dialog { RollDataAjustements.calcul(rencontreData, this.actor); - rencontreData.rolled = await RdDResolutionTable.roll(rencontreData.reve, RollDataAjustements.sum(rencontreData.ajustements)); + rencontreData.rolled = rencontreData.presentCite + ? this._rollPresentCite(rencontreData) + : await RdDResolutionTable.roll(rencontreData.reve, RollDataAjustements.sum(rencontreData.ajustements)); + let postProcess = await TMRRencontres.gererRencontre(this, rencontreData); ChatMessage.create({ @@ -351,6 +354,13 @@ export class RdDTMRDialog extends Dialog { } } + _rollPresentCite(rencontreData) { + let rolled = RdDResolutionTable.computeChances(rencontreData.reve, 0); + mergeObject(rolled, { caracValue: rencontreData.reve, finalLevel: 0, roll: rolled.score }); + RdDResolutionTable.succesRequis(rolled); + return rolled; + } + /* -------------------------------------------- */ _deleteTmrMessages(actor, nbRounds = -1) { setTimeout(() => { @@ -381,6 +391,9 @@ export class RdDTMRDialog extends Dialog { return; } this.currentRencontre = undefined; + if (this._presentCite(tmr, postRencontre)) { + return; + } let rencontre = await this._jetDeRencontre(tmr); if (rencontre) { // Manages it @@ -396,19 +409,43 @@ export class RdDTMRDialog extends Dialog { } } + _presentCite(tmr, postRencontre) { + const presentCite = this.casesSpeciales.find(c => EffetsDraconiques.presentCites.isCase(c, tmr.coord)); + if (presentCite) { + this.minimize(); + EffetsDraconiques.presentCites.choisirUnPresent(presentCite, (type => this._utiliserPresentCite(presentCite, type, tmr, postRencontre))); + } + return presentCite; + } + + async _utiliserPresentCite(presentCite, typeRencontre, tmr, postRencontre) { + this.currentRencontre = TMRRencontres.getRencontre(typeRencontre); + await TMRRencontres.evaluerForceRencontre(this.currentRencontre); + await EffetsDraconiques.presentCites.ouvrirLePresent(this.actor, presentCite); + this.removeToken(tmr, presentCite); + + // simuler une rencontre + let rencontreData = { + actor: this.actor, + alias: this.actor.name, + reveDepart: this.actor.getReveActuel(), + competence: this.actor.getBestDraconic(), + rencontre: this.currentRencontre, + tmr: tmr, + presentCite: presentCite + }; + await this._tentativeMaitrise(rencontreData); + + this.maximize(); + postRencontre(); + } + /* -------------------------------------------- */ async _jetDeRencontre(tmr) { let rencontre = this.rencontresExistantes.find(prev => prev.coord == tmr.coord); if (rencontre) { return rencontre; } - if (this.casesSpeciales.find(c => EffetsDraconiques.isPresentCite(c, tmr.coord))) { - - // TODO: dialog pour remplacer la rencontre par un présent - - } - - let myRoll = new Roll("1d7").evaluate().total; if (TMRUtility.isForceRencontre() || myRoll == 7) { return await this.rencontreTMRRoll(tmr, this.actor.isRencontreSpeciale()); @@ -416,7 +453,6 @@ export class RdDTMRDialog extends Dialog { this._tellToUser(myRoll + ": Pas de rencontre en " + tmr.label + " (" + tmr.coord + ")"); } - /* -------------------------------------------- */ async rencontreTMRRoll(tmr, isMauvaise = false) { let rencontre = TMRUtility.utiliseForceRencontre() ?? @@ -450,8 +486,8 @@ export class RdDTMRDialog extends Dialog { forceCarac: { 'reve-actuel': { label: "Rêve Actuel", value: this.actor.getReveActuel() } }, maitrise: { verbe: 'maîtriser', action: 'Maîtriser le fleuve' } } - rollData.double = EffetsDraconiques.isDoubleResistanceFleuve(this.actor) ? true: undefined, - rollData.competence.data.defaut_carac = 'reve-actuel'; + rollData.double = EffetsDraconiques.isDoubleResistanceFleuve(this.actor) ? true : undefined, + rollData.competence.data.defaut_carac = 'reve-actuel'; await this._rollMaitriseCaseHumide(rollData); } } @@ -522,7 +558,7 @@ export class RdDTMRDialog extends Dialog { await this._conquerir(tmr, { difficulte: -9, action: 'Conquérir la cité', - onConqueteReussie: r => EffetsDraconiques.fermetureCites.onConquete(r.actor, tmr.coord), + onConqueteReussie: r => EffetsDraconiques.fermetureCites.onConquete(r.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)), onConqueteEchec: r => this.close(), canClose: false }); @@ -540,8 +576,8 @@ export class RdDTMRDialog extends Dialog { await this._conquerir(tmr, { difficulte: -7, action: 'Conquérir', - onConqueteReussie: r => EffetsDraconiques.conquete.onConquete(r.actor, tmr.coord, (casetmr) => this.removeToken(tmr, casetmr)), - onConqueteEchec: r => {}, + onConqueteReussie: r => EffetsDraconiques.conquete.onConquete(r.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)), + onConqueteEchec: r => { }, canClose: false }); } @@ -603,13 +639,18 @@ export class RdDTMRDialog extends Dialog { dialog.render(true); } + async validerPelerinage(tmr) { + await EffetsDraconiques.pelerinage.onFinPelerinage(this.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)); + } + + /* -------------------------------------------- */ async declencheSortEnReserve(coord) { - + let sortReserveList = TMRUtility.getSortReserveList(this.sortsReserves, coord); if (sortReserveList.length > 0) { - if (EffetsDraconiques.isConquete(this.actor)) { - ui.notifications.error("Vous ne pouvez pas déclencher de sort sous l'effet d'une conquête!"); + if (EffetsDraconiques.isSortImpossible(this.actor)) { + ui.notifications.error("Une queue ou un souffle vous empèche de déclencher de sort!"); return; } if (EffetsDraconiques.isReserveEnSecurite(this.actor) || this.isReserveExtensible(coord)) { @@ -795,26 +836,23 @@ export class RdDTMRDialog extends Dialog { await this.manageCaseHumide(tmr); await this.conquerirCiteFermee(tmr); await this.conquerirTMR(tmr); + await this.validerPelerinage(tmr); await this.declencheSortEnReserve(tmr.coord); await this.actor.checkSoufflePeage(tmr); } } - + /* -------------------------------------------- */ async forceDemiRevePositionView() { this._updateDemiReve(); } - + /* -------------------------------------------- */ async forceDemiRevePosition(coord) { await this.actor.updateCoordTMR(coord); this._updateDemiReve(); let tmr = TMRUtility.getTMR(coord); - if (!(this.viewOnly || this.currentRencontre)) { - await this.manageCaseHumide(tmr); - await this.conquerirCiteFermee(tmr); - await this.declencheSortEnReserve(tmr.coord); - } + await this.postRencontre(tmr); return tmr; } diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 01b8fc3c..14069a3c 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -31,60 +31,60 @@ const ajustementsEncaissement = [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, +1, const tableCaracDerivee = { // xp: coût pour passer du niveau inférieur à ce niveau - 1: { xp: 3, poids: "moins de 1kg", plusdom:-5, sconst: 0.5, sust: 0.1 }, - 2: { xp: 3, poids: "1-5", plusdom:-4, sconst: 0.5, sust: 0.3 }, - 3: { xp: 4, poids: "6-10", plusdom:-3, sconst: 1, sust: 0.5 , beaute:'hideux'}, - 4: { xp: 4, poids: "11-20", plusdom:-3, sconst: 1, sust: 1 , beaute:'repoussant'}, - 5: { xp: 5, poids: "21-30", plusdom:-2, sconst: 1, sust: 1 , beaute:'franchement très laid'}, - 6: { xp: 5, poids: "31-40", plusdom:-1, sconst: 2, sust: 2 , beaute:'laid'}, - 7: { xp: 6, poids: "41-50", plusdom:-1, sconst: 2, sust: 2 , beaute:'très désavantagé'}, - 8: { xp: 6, poids: "51-60", plusdom:0, sconst: 2, sust: 2 , beaute:'désavantagé'}, - 9: { xp: 7, poids: "61-65", plusdom:0, sconst: 3, sust: 2 , beaute:'pas terrible'}, - 10: { xp: 7, poids: "66-70", plusdom:0, sconst: 3, sust: 3 , beaute:'commun'}, - 11: { xp: 8, poids: "71-75", plusdom:0, sconst: 3, sust: 3 , beaute:'pas mal'}, - 12: { xp: 8, poids: "76-80", plusdom:+1, sconst: 4, sust: 3 , beaute:'avantagé'}, - 13: { xp: 9, poids: "81-90", plusdom:+1, sconst: 4, sust: 3 , beaute:'mignon'}, - 14: { xp: 9, poids: "91-100", plusdom:+2, sconst: 4, sust: 4 , beaute:'beau'}, - 15: { xp: 10, poids: "101-110", plusdom:+2, sconst: 5, sust: 4 , beaute:'très beau'}, - 16: { xp: 20, poids: "111-120", plusdom:+3, sconst: 5, sust: 4 , beaute:'éblouissant'}, - 17: { xp: 30, poids: "121-131", plusdom:+3, sconst: 5, sust: 5 }, - 18: { xp: 40, poids: "131-141", plusdom:+4, sconst: 6, sust: 5 }, - 19: { xp: 50, poids: "141-150", plusdom:+4, sconst: 6, sust: 5 }, - 20: { xp: 60, poids: "151-160", plusdom:+4, sconst: 6, sust: 6 }, - 21: { xp: 70, poids: "161-180", plusdom:+5, sconst: 7, sust: 6 }, - 22: { xp: 80, poids: "181-200", plusdom:+5, sconst: 7, sust: 7 }, - 23: { xp: 90, poids: "201-300", plusdom:+6, sconst: 7, sust: 8 }, - 24: { xp: 100, poids: "301-400", plusdom:+6, sconst: 8, sust: 9 }, - 25: { xp: 110, poids: "401-500", plusdom:+7, sconst: 8, sust: 10 }, - 26: { xp: 120, poids: "501-600", plusdom:+7, sconst: 8, sust: 11 }, - 27: { xp: 130, poids: "601-700", plusdom:+8, sconst: 9, sust: 12 }, - 28: { xp: 140, poids: "701-800", plusdom:+8, sconst: 9, sust: 13 }, - 29: { xp: 150, poids: "801-900", plusdom:+9, sconst: 9, sust: 14 }, - 30: { xp: 160, poids: "901-1000", plusdom:+9, sconst: 10, sust: 15 }, - 31: { xp: 170, poids: "1001-1500", plusdom:+10, sconst: 10, sust: 16 }, - 32: { xp: 180, poids: "1501-2000", plusdom:+11, sconst: 10, sust: 17 } + 1: { xp: 3, poids: "moins de 1kg", plusdom: -5, sconst: 0.5, sust: 0.1 }, + 2: { xp: 3, poids: "1-5", plusdom: -4, sconst: 0.5, sust: 0.3 }, + 3: { xp: 4, poids: "6-10", plusdom: -3, sconst: 1, sust: 0.5, beaute: 'hideux' }, + 4: { xp: 4, poids: "11-20", plusdom: -3, sconst: 1, sust: 1, beaute: 'repoussant' }, + 5: { xp: 5, poids: "21-30", plusdom: -2, sconst: 1, sust: 1, beaute: 'franchement très laid' }, + 6: { xp: 5, poids: "31-40", plusdom: -1, sconst: 2, sust: 2, beaute: 'laid' }, + 7: { xp: 6, poids: "41-50", plusdom: -1, sconst: 2, sust: 2, beaute: 'très désavantagé' }, + 8: { xp: 6, poids: "51-60", plusdom: 0, sconst: 2, sust: 2, beaute: 'désavantagé' }, + 9: { xp: 7, poids: "61-65", plusdom: 0, sconst: 3, sust: 2, beaute: 'pas terrible' }, + 10: { xp: 7, poids: "66-70", plusdom: 0, sconst: 3, sust: 3, beaute: 'commun' }, + 11: { xp: 8, poids: "71-75", plusdom: 0, sconst: 3, sust: 3, beaute: 'pas mal' }, + 12: { xp: 8, poids: "76-80", plusdom: +1, sconst: 4, sust: 3, beaute: 'avantagé' }, + 13: { xp: 9, poids: "81-90", plusdom: +1, sconst: 4, sust: 3, beaute: 'mignon' }, + 14: { xp: 9, poids: "91-100", plusdom: +2, sconst: 4, sust: 4, beaute: 'beau' }, + 15: { xp: 10, poids: "101-110", plusdom: +2, sconst: 5, sust: 4, beaute: 'très beau' }, + 16: { xp: 20, poids: "111-120", plusdom: +3, sconst: 5, sust: 4, beaute: 'éblouissant' }, + 17: { xp: 30, poids: "121-131", plusdom: +3, sconst: 5, sust: 5 }, + 18: { xp: 40, poids: "131-141", plusdom: +4, sconst: 6, sust: 5 }, + 19: { xp: 50, poids: "141-150", plusdom: +4, sconst: 6, sust: 5 }, + 20: { xp: 60, poids: "151-160", plusdom: +4, sconst: 6, sust: 6 }, + 21: { xp: 70, poids: "161-180", plusdom: +5, sconst: 7, sust: 6 }, + 22: { xp: 80, poids: "181-200", plusdom: +5, sconst: 7, sust: 7 }, + 23: { xp: 90, poids: "201-300", plusdom: +6, sconst: 7, sust: 8 }, + 24: { xp: 100, poids: "301-400", plusdom: +6, sconst: 8, sust: 9 }, + 25: { xp: 110, poids: "401-500", plusdom: +7, sconst: 8, sust: 10 }, + 26: { xp: 120, poids: "501-600", plusdom: +7, sconst: 8, sust: 11 }, + 27: { xp: 130, poids: "601-700", plusdom: +8, sconst: 9, sust: 12 }, + 28: { xp: 140, poids: "701-800", plusdom: +8, sconst: 9, sust: 13 }, + 29: { xp: 150, poids: "801-900", plusdom: +9, sconst: 9, sust: 14 }, + 30: { xp: 160, poids: "901-1000", plusdom: +9, sconst: 10, sust: 15 }, + 31: { xp: 170, poids: "1001-1500", plusdom: +10, sconst: 10, sust: 16 }, + 32: { xp: 180, poids: "1501-2000", plusdom: +11, sconst: 10, sust: 17 } } - /* -------------------------------------------- */ - const premierRoundInit = [ - { pattern: 'hast', init: 3.90}, - { pattern: 'lance', init: 3.85}, - { pattern: 'baton', init: 3.80}, - { pattern: 'doubledragonne', init: 3.75}, - { pattern: 'esparlongue', init: 3.70}, - { pattern: 'epeedragonne', init: 3.65}, - { pattern: 'epeebatarde', init: 3.60}, - { pattern: 'epeecyane', init: 3.55}, - { pattern: 'epeesorde', init: 3.50}, - { pattern: 'grandehache', init: 3.45}, - { pattern: 'bataille', init: 3.40}, - { pattern: 'epeegnome', init: 3.35}, - { pattern: 'masse', init: 3.30}, - { pattern: 'gourdin', init: 3.25}, - { pattern: 'fléau', init: 3.20}, - { pattern: 'dague', init: 3.15}, - { pattern: 'autre', init: 3.10}, - ]; +/* -------------------------------------------- */ +const premierRoundInit = [ + { pattern: 'hast', init: 3.90 }, + { pattern: 'lance', init: 3.85 }, + { pattern: 'baton', init: 3.80 }, + { pattern: 'doubledragonne', init: 3.75 }, + { pattern: 'esparlongue', init: 3.70 }, + { pattern: 'epeedragonne', init: 3.65 }, + { pattern: 'epeebatarde', init: 3.60 }, + { pattern: 'epeecyane', init: 3.55 }, + { pattern: 'epeesorde', init: 3.50 }, + { pattern: 'grandehache', init: 3.45 }, + { pattern: 'bataille', init: 3.40 }, + { pattern: 'epeegnome', init: 3.35 }, + { pattern: 'masse', init: 3.30 }, + { pattern: 'gourdin', init: 3.25 }, + { pattern: 'fléau', init: 3.20 }, + { pattern: 'dague', init: 3.15 }, + { pattern: 'autre', init: 3.10 }, +]; /* -------------------------------------------- */ function _buildAllSegmentsFatigue(max) { @@ -235,7 +235,7 @@ export class RdDUtility { 'systems/foundryvtt-reve-de-dragon/templates/hud-actor-attaque.html', // messages tchat 'systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html', - 'systems/foundryvtt-reve-de-dragon/templates/chat-info-appel-au-moral.html', + 'systems/foundryvtt-reve-de-dragon/templates/chat-info-appel-au-moral.html', 'systems/foundryvtt-reve-de-dragon/templates/chat-demande-defense.html', 'systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-particuliere.html', 'systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-etotal.html', @@ -254,10 +254,10 @@ export class RdDUtility { 'systems/foundryvtt-reve-de-dragon/templates/chat-actor-carac-xp.html' ]; - Handlebars.registerHelper('upperFirst', str=> Misc.upperFirst(str ?? 'Null')); - Handlebars.registerHelper('upper', str => str?.toUpperCase() ?? 'NULL' ); - Handlebars.registerHelper('le', str => Grammar.articleDetermine(str) ); - Handlebars.registerHelper('un', str => Grammar.articleIndetermine(str) ); + Handlebars.registerHelper('upperFirst', str => Misc.upperFirst(str ?? 'Null')); + Handlebars.registerHelper('upper', str => str?.toUpperCase() ?? 'NULL'); + Handlebars.registerHelper('le', str => Grammar.articleDetermine(str)); + Handlebars.registerHelper('un', str => Grammar.articleIndetermine(str)); return loadTemplates(templatePaths); } @@ -287,7 +287,7 @@ export class RdDUtility { } /* -------------------------------------------- */ static getAfficheContenu(conteneurId) { - if ( conteneurId ) + if (conteneurId) return this.afficheContenu[conteneurId]; return undefined; } @@ -327,8 +327,8 @@ export class RdDUtility { console.log(dragData, actorSheet.actor._id); let dropID = $(event.target).parents(".item").attr("data-item-id"); // Only relevant if container drop let objetId = dragData.id || dragData.data._id; - if ( dragData.type == 'Item') { - if ( dropID ) { // Dropped over an item !!! + if (dragData.type == 'Item') { + if (dropID) { // Dropped over an item !!! if (actorSheet.objetVersConteneur[objetId] != dropID && objetId != dropID) { if (actorSheet.actor.validateConteneur(objetId, dropID) && actorSheet.actor.testConteneurCapacite(objetId, dropID)) { await actorSheet.actor.enleverDeConteneur(objetId, actorSheet.objetVersConteneur[objetId]); @@ -336,14 +336,14 @@ export class RdDUtility { } } } - if (dragData.actorId && dragData.actorId != actorSheet.actor._id ) { // Un acteur est à l'origine de l'item -> deplacement + if (dragData.actorId && dragData.actorId != actorSheet.actor._id) { // Un acteur est à l'origine de l'item -> deplacement console.log("Moving objects"); - actorSheet.actor.moveItemsBetweenActors( objetId, dragData.actorId); + actorSheet.actor.moveItemsBetweenActors(objetId, dragData.actorId); return false; } actorSheet.actor.computeEncombrementTotalEtMalusArmure(); - } else if ( dragData.type == "Actor" ) { - actorSheet.actor.addSubacteur( objetId ); + } else if (dragData.type == "Actor") { + actorSheet.actor.addSubacteur(objetId); } return true; } @@ -434,7 +434,7 @@ export class RdDUtility { } static getCaracXp(targetValue) { - return tableCaracDerivee[targetValue]?.xp ?? 200 ; + return tableCaracDerivee[targetValue]?.xp ?? 200; } /* -------------------------------------------- */ @@ -487,13 +487,13 @@ export class RdDUtility { data.carac.derobee.value = Math.floor(parseInt(((21 - data.carac.taille.value)) + parseInt(data.carac.agilite.value)) / 2); let bonusDomKey = Math.floor((parseInt(data.carac.force.value) + parseInt(data.carac.taille.value)) / 2); - bonusDomKey = Math.min( Math.max(bonusDomKey, 0), 32); // Clamp de securite + bonusDomKey = Math.min(Math.max(bonusDomKey, 0), 32); // Clamp de securite let tailleData = tableCaracDerivee[bonusDomKey]; data.attributs.plusdom.value = tailleData.plusdom; - data.attributs.sconst.value = RdDUtility.calculSConst(data.carac.constitution.value); - data.attributs.sust.value = tableCaracDerivee[Number(data.carac.taille.value)].sust; + data.attributs.sconst.value = RdDUtility.calculSConst(data.carac.constitution.value); + data.attributs.sust.value = tableCaracDerivee[Number(data.carac.taille.value)].sust; data.attributs.encombrement.value = (parseInt(data.carac.force.value) + parseInt(data.carac.taille.value)) / 2; data.carac.melee.value = Math.floor((parseInt(data.carac.force.value) + parseInt(data.carac.agilite.value)) / 2); @@ -579,10 +579,10 @@ export class RdDUtility { } /* -------------------------------------------- */ - static getLocalisation( type = 'personnage' ) { + static getLocalisation(type = 'personnage') { let result = new Roll("1d20").roll().total; let txt = "" - if ( type == 'personnage') { + if (type == 'personnage') { if (result <= 3) txt = "Jambe, genou, pied, jarret"; else if (result <= 7) txt = "Hanche, cuisse, fesse"; else if (result <= 9) txt = "Ventre, reins"; @@ -594,7 +594,7 @@ export class RdDUtility { } else { if (result <= 7) txt = "Jambes/Pattes"; else if (result <= 18) txt = "Corps"; - else if (result <= 20) txt = "Tête"; + else if (result <= 20) txt = "Tête"; } return { result: result, label: txt }; @@ -680,36 +680,36 @@ export class RdDUtility { return game.system.rdd.calendrier.requestNombreAstral(sockmsg.data); case "msg_response_nombre_astral": return RdDUtility.responseNombreAstral(sockmsg.data); - case "msg_tmr_move": - if ( game.user.isGM ) { - let actor = game.actors.get( sockmsg.data.actorId); - actor.refreshTMRView( sockmsg.data.tmrPos ); - } + case "msg_tmr_move": + if (game.user.isGM) { + let actor = game.actors.get(sockmsg.data.actorId); + actor.refreshTMRView(sockmsg.data.tmrPos); + } } } /* -------------------------------------------- */ static processPremierRoundInit() { // Check if we have the whole init ! - if ( game.user.isGM) { + if (game.user.isGM) { let initDone = true; - for( let combatant of game.combat.data.combatants) { - if ( !combatant.initiative ) initDone = false; + for (let combatant of game.combat.data.combatants) { + if (!combatant.initiative) initDone = false; } if (initDone && game.combat.current.round == 1) { // Premier round ! - for( let combatant of game.combat.data.combatants) { + for (let combatant of game.combat.data.combatants) { let arme = combatant.initiativeData.arme; //console.log("Parsed !!!", combatant, initDone, game.combat.current, arme); - if ( arme && arme.type == "arme" ) { + if (arme && arme.type == "arme") { for (let initData of premierRoundInit) { - if ( arme.data.initpremierround.toLowerCase().includes(initData.pattern) ) { + if (arme.data.initpremierround.toLowerCase().includes(initData.pattern)) { let msg = `

L'initiative de ${combatant.actor.name} a été modifiée !


Etant donné son ${arme.name}, son initative pour ce premier round est désormais de ${initData.init}.
` - ChatMessage.create( { content: msg } ); - game.combat.setInitiative(combatant._id, initData.init); + ChatMessage.create({ content: msg }); + game.combat.setInitiative(combatant._id, initData.init); } } } @@ -717,18 +717,18 @@ export class RdDUtility { } } } - + /* -------------------------------------------- */ static rollInitiativeCompetence(combatantId, arme) { const combatant = game.combat.getCombatant(combatantId); const actor = combatant.actor; - - let initOffset = 0; + + let initOffset = 0; let caracForInit = 0; - let compNiveau = 0; - if ( actor.getSurprise() == "totale") { + let compNiveau = 0; + if (actor.getSurprise() == "totale") { initOffset = -1; // To force 0 - } else if ( actor.getSurprise() == "demi") { + } else if (actor.getSurprise() == "demi") { initOffset = 0; } else if (arme.name == "Autre action") { initOffset = 2; @@ -738,10 +738,10 @@ export class RdDUtility { initOffset = 3; // Melée = 3.XX let competence = RdDItemCompetence.findCompetence(combatant.actor.data.items, arme.data.competence); compNiveau = competence.data.niveau; - + if (actor.data.type == 'creature' || actor.data.type == 'entite') { caracForInit = competence.data.carac_value; - if ( competence.data.categorie == "lancer") { + if (competence.data.categorie == "lancer") { initOffset = 5; } } else { @@ -759,7 +759,7 @@ export class RdDUtility { } let malus = actor.getEtatGeneral(); // Prise en compte état général // Cas des créatures et entités vs personnages - let rollFormula = initOffset + "+ ( (" + RdDUtility.calculInitiative(compNiveau, caracForInit) + " + " + malus + ") /100)"; + let rollFormula = initOffset + "+ ( (" + RdDUtility.calculInitiative(compNiveau, caracForInit) + " + " + malus + ") /100)"; // Garder la trace de l'arme/compétence utilisée pour l'iniative combatant.initiativeData = { arme: arme } // pour reclasser l'init au round 0 game.combat.rollInitiative(combatantId, rollFormula); @@ -812,41 +812,41 @@ export class RdDUtility { } /* -------------------------------------------- */ - static incDecInit(combatantId, incDecValue ) { + static incDecInit(combatantId, incDecValue) { const combatant = game.combat.getCombatant(combatantId); let initValue = combatant.initiative + incDecValue; - game.combat.setInitiative( combatantId, initValue ); + game.combat.setInitiative(combatantId, initValue); } /* -------------------------------------------- */ static pushInitiativeOptions(html, options) { - for (let i =0; i { + option.condition = true; + option.icon = ''; + option.callback = target => { RdDUtility.displayInitiativeMenu(html, target.data('combatant-id')); } } } - options.push( { + options.push({ name: "Incrémenter initiative", - condition: true, - icon: '', - callback: target => { + condition: true, + icon: '', + callback: target => { RdDUtility.incDecInit(target.data('combatant-id'), +0.01); } - } ); - options.push( { + }); + options.push({ name: "Décrémenter initiative", - condition: true, - icon: '', - callback: target => { + condition: true, + icon: '', + callback: target => { RdDUtility.incDecInit(target.data('combatant-id'), -0.01); } - } ); + }); } /* -------------------------------------------- */ @@ -938,96 +938,96 @@ export class RdDUtility { chatData["whisper"] = ChatMessage.getWhisperRecipients(forceWhisper); } - return chatData; + return chatData; } - /* -------------------------------------------- */ - static confirmerSuppressionSubacteur(actorSheet, li ) { - let actorId = li.data("actor-id"); - let actor = game.actors.get( actorId ); - let msgTxt = "

Etes vous certain de vouloir supprimer le lien vers ce véhicule/monture/suivant : " + actor.data.name +" ?

"; - let buttons = { + /* -------------------------------------------- */ + static confirmerSuppressionSubacteur(actorSheet, li) { + let actorId = li.data("actor-id"); + let actor = game.actors.get(actorId); + let msgTxt = "

Etes vous certain de vouloir supprimer le lien vers ce véhicule/monture/suivant : " + actor.data.name + " ?

"; + let d = new Dialog({ + title: "Confirmer la suppression du lien", + content: msgTxt, + buttons: { delete: { - icon: '', - label: "Supprimer le lien", - callback: () => { - console.log("Delete : ", actorId); - actorSheet.actor.removeSubacteur( actorId ); - li.slideUp(200, () => actorSheet.render(false)); - } - }, - cancel: { - icon: '', - label: "Annuler" - } - } - let d = new Dialog({ - title: "Confirmer la suppression du lien", - content: msgTxt, - buttons: buttons, - default: "cancel" - }); - d.render(true); - } - + icon: '', + label: "Supprimer le lien", + callback: () => { + console.log("Delete : ", actorId); + actorSheet.actor.removeSubacteur(actorId); + li.slideUp(200, () => actorSheet.render(false)); + } + }, + cancel: { + icon: '', + label: "Annuler" + } + }, + default: "cancel" + }); + d.render(true); + } + /* -------------------------------------------- */ static async confirmerSuppression(actorSheet, li) { - let itemId = li.data("item-id"); - let objet = actorSheet.actor.items.find( item => item._id == itemId ); - let msgTxt = "

Etes vous certain de vouloir supprimer cet objet ?"; - let buttons = { delete: { - icon: '', - label: "Supprimer l'objet", - callback: () => { - console.log("Delete : ", itemId); - actorSheet.actor.deleteOwnedItem( itemId ); - li.slideUp(200, () => actorSheet.render(false)); - } - }, - cancel: { - icon: '', - label: "Annuler" - } - } - if ( objet.data.type == 'conteneur' && objet.data.data.contenu.length > 0) { - msgTxt += "
Cet objet est aussi un conteneur avec du contenu : choisissez l'option de suppression"; - buttons['deleteall'] = { - icon: '', - label: "Supprimer le conteneur et tout son contenu", - callback: () => { - console.log("Delete : ", itemId); - actorSheet.actor.deleteAllConteneur( itemId ); - li.slideUp(200, () => actorSheet.render(false)); - } - } + let itemId = li.data("item-id"); + let objet = actorSheet.actor.items.find(item => item._id == itemId); + let msgTxt = "

Etes vous certain de vouloir supprimer cet objet ?"; + let buttons = { + delete: { + icon: '', + label: "Supprimer l'objet", + callback: () => { + console.log("Delete : ", itemId); + actorSheet.actor.deleteOwnedItem(itemId); + li.slideUp(200, () => actorSheet.render(false)); + } + }, + cancel: { + icon: '', + label: "Annuler" } - msgTxt += "

"; - let d = new Dialog({ - title: "Confirmer la suppression", - content: msgTxt, - buttons: buttons, - default: "cancel" - }); - d.render(true); + } + if (objet.data.type == 'conteneur' && objet.data.data.contenu.length > 0) { + msgTxt += "
Cet objet est aussi un conteneur avec du contenu : choisissez l'option de suppression"; + buttons['deleteall'] = { + icon: '', + label: "Supprimer le conteneur et tout son contenu", + callback: () => { + console.log("Delete : ", itemId); + actorSheet.actor.deleteAllConteneur(itemId); + li.slideUp(200, () => actorSheet.render(false)); + } + } + } + msgTxt += "

"; + let d = new Dialog({ + title: "Confirmer la suppression", + content: msgTxt, + buttons: buttons, + default: "cancel" + }); + d.render(true); } - + /* -------------------------------------------- */ - static afficherHeuresChanceMalchance( heureNaissance ) { + static afficherHeuresChanceMalchance(heureNaissance) { if (heureNaissance) { let ajustement = game.system.rdd.calendrier.getAjustementAstrologique(heureNaissance); - ChatMessage.create( { - content: `A l'heure ${game.system.rdd.calendrier.getCurrentHeure()}, le modificateur de Chance/Malchance pour l'heure de naissance ${heureNaissance} est de : ${ajustement}.`, + ChatMessage.create({ + content: `A l'heure ${game.system.rdd.calendrier.getCurrentHeure()}, le modificateur de Chance/Malchance pour l'heure de naissance ${heureNaissance} est de : ${ajustement}.`, whisper: ChatMessage.getWhisperRecipients("MJ") - } ); + }); } - else{ + else { ui.notifications.warn("Pas d'heure de naissance selectionnée") } } - + /*-------------------------------------------- */ static checkThanatosXP(compName) { - if ( compName.includes('Thanatos') ) { + if (compName.includes('Thanatos')) { let message = "Vous avez mis des points d'Expérience dans la Voie de Thanatos !
Vous devez réduire manuellement d'un même montant d'XP une autre compétence Draconique."; ChatMessage.create({ whisper: ChatMessage.getWhisperRecipients(game.user.name), @@ -1037,7 +1037,7 @@ export class RdDUtility { } /*-------------------------------------------- */ - static async onRenderChatMessage( app, html, msg ) { + static async onRenderChatMessage(app, html, msg) { // TODO //console.log(app, html, msg); } diff --git a/module/tmr-rencontres.js b/module/tmr-rencontres.js index e22489c8..01fc81a7 100644 --- a/module/tmr-rencontres.js +++ b/module/tmr-rencontres.js @@ -272,11 +272,12 @@ const rencontresStandard = [ { code: "rdd", name: "Rêve de Dragon", type: "rdd", genre: "m", force: "1ddr + 7", refoulement: 2, quitterTMR: true } ]; -const presentsCite = [ +const rencontresPresentCite = [ { code: "messager2d6", name: "Messager des Rêves", type: "messager", genre: "m", force: "2d6", ignorer: true }, { code: "passeur2d6", name: "Passeur des Rêves", type: "passeur", genre: "m", force: "2d6", ignorer: true }, { code: "fleur2d6", name: "Fleur des Rêves", type: "fleur", genre: "f", force: "2d6", ignorer: true } ] +const rencontresAll = [].concat(rencontresStandard).concat(mauvaisesRencontres).concat(rencontresPresentCite); const tableRencontres = { cite: [{ code: 'messager', range: [1, 25] }, { code: 'passeur', range: [26, 50] }, { code: 'fleur', range: [51, 65] }, { code: 'mangeur', range: [66, 70] }, { code: 'changeur', range: [71, 80] }, { code: 'briseur', range: [81, 85] }, { code: 'reflet', range: [86, 90] }, { code: 'tbblanc', range: [91, 94] }, { code: 'tbnoir', range: [95, 97] }, { code: 'rdd', range: [98, 100] }], @@ -339,22 +340,17 @@ export class TMRRencontres { static getRencontre(index) { let rencontre; if (isNaN(index)) { - rencontre = rencontresStandard.find(r => r.type == index) - if (!rencontre) { - rencontre = mauvaisesRencontres.find(r => r.type == index) - } + rencontre = rencontresAll.find(r => r.type == index) ?? rencontresAll.find(r => r.code == index) } - else { - if (0 <= index && index < rencontresStandard.length) { - rencontre = rencontresStandard[index]; - } - else if (rencontresStandard.length <= index && index < rencontresStandard.length + mauvaisesRencontres.length) { - rencontre = mauvaisesRencontres[index - rencontresStandard.length]; - } + else if (0 <= index && index < rencontresAll.length) { + rencontre = rencontresAll[index]; } if (rencontre) { return duplicate(rencontre); } + else { + ui.notifications.info(`Pas de rencontre pour ${index}, seulement ${rencontresAll.length} rencontres sont connues.
Vous pouvez aussi essayer par type (ie: mangeur, fleur, fleur2d6, ...)`) + } return undefined; } @@ -375,7 +371,7 @@ export class TMRRencontres { /* -------------------------------------------- */ static async getMauvaiseRencontre(index = undefined) { const rencontre = duplicate( - (index && index>=0 && index < mauvaisesRencontres.length) + (index && index >= 0 && index < mauvaisesRencontres.length) ? mauvaisesRencontres[index] : Misc.rollOneOf(mauvaisesRencontres)); await TMRRencontres.evaluerForceRencontre(rencontre); diff --git a/module/tmr-utility.js b/module/tmr-utility.js index 0da70a62..3aa49a99 100644 --- a/module/tmr-utility.js +++ b/module/tmr-utility.js @@ -274,7 +274,15 @@ export const tmrColors = { rencontre: 0xFF0000, casehumide: 0x1050F0, } - +export const tmrTokenZIndex = { + sort: 40, + tetes: 20, + casehumide: 10, + conquete: 30, + rencontre: 50, + trounoir: 60, + demireve: 70, +} /* -------------------------------------------- */ @@ -339,7 +347,7 @@ export class TMRUtility { this.prochaineRencontre.force = force; } else { - await TMRRencontres.evaluerForceRencontre(this.prochaineRencontre) + await TMRRencontres.evaluerForceRencontre(this.prochaineRencontre); } console.log("La prochaine rencontre sera:", this.prochaineRencontre.name, " force:", this.prochaineRencontre.force); } diff --git a/module/tmr/carte-tmr.js b/module/tmr/carte-tmr.js index 7b2d10d9..f8510da0 100644 --- a/module/tmr/carte-tmr.js +++ b/module/tmr/carte-tmr.js @@ -14,7 +14,7 @@ export class CarteTmr extends Draconique { code() { return 'tmr' } img() { return 'systems/foundryvtt-reve-de-dragon/styles/img/ui/tmp_main_r1.webp' } - _createSprite(pixiTMR) { + createSprite(pixiTMR) { return pixiTMR.carteTmr(this.code()); } } diff --git a/module/tmr/conquete.js b/module/tmr/conquete.js index fc3579b2..92d665c4 100644 --- a/module/tmr/conquete.js +++ b/module/tmr/conquete.js @@ -1,5 +1,6 @@ +import { Grammar } from "../grammar.js"; import { Misc } from "../misc.js"; -import { tmrColors, tmrConstants, TMRUtility } from "../tmr-utility.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class Conquete extends Draconique { @@ -9,7 +10,7 @@ export class Conquete extends Draconique { } type() { return 'queue' } - match(item) { return Draconique.isQueueDragon(item) && item.name.toLowerCase() == 'conquête'; } + match(item) { return Draconique.isQueueDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('conquete'); } manualMessage() { return false } async onActorCreateOwned(actor, item) { await this._creerConquete(actor, item); } @@ -17,10 +18,13 @@ export class Conquete extends Draconique { tooltip(linkData) { return `La ${this.tmrLabel(linkData)} doit être conquise` } img() { return 'icons/svg/combat.svg' } - _createSprite(pixiTMR) { + createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { - color: tmrColors.queues, taille: tmrConstants.full, decallage: { x: 2, y: 0 } + zIndex: tmrTokenZIndex.conquete, + color: tmrColors.queues, + taille: tmrConstants.full, + decallage: { x: 2, y: 0 } }); } @@ -31,11 +35,11 @@ export class Conquete extends Draconique { await this.createCaseTmr(actor, 'Conquête: ' + conquete.label, conquete, queue._id); } - async onConquete(actor, coord) { - let existants = actor.data.items.filter(it => this.isCase(it, coord)); + async onConquete(actor, tmr, onRemoveToken) { + let existants = actor.data.items.filter(it => this.isCase(it, tmr.coord)); for (let casetmr of existants) { - await actor.deleteOwnedItem(casetmr._id); await actor.deleteOwnedItem(casetmr.data.sourceid); + onRemoveToken(tmr, casetmr); } } } diff --git a/module/tmr/debordement.js b/module/tmr/debordement.js index 432f4b7f..21e5a5fd 100644 --- a/module/tmr/debordement.js +++ b/module/tmr/debordement.js @@ -1,4 +1,5 @@ -import { tmrColors, tmrConstants, TMRUtility } from "../tmr-utility.js"; +import { Grammar } from "../grammar.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class Debordement extends Draconique { @@ -8,24 +9,25 @@ export class Debordement extends Draconique { } type() { return 'souffle' } - match(item) { return Draconique.isSouffleDragon(item) && item.name.toLowerCase().includes('trou noir'); } + match(item) { return Draconique.isSouffleDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('debordement'); } manualMessage() { return false } - async onActorCreateOwned(actor, item) { await this._creerCaseTmr(actor); } + async onActorCreateOwned(actor, souffle) { + const existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord); + const tmr = TMRUtility.getTMRAleatoire(it => !(TMRUtility.isCaseHumide(it) || existants.includes(it.coord))); + await this.createCaseTmr(actor, 'Debordement: ' + tmr.label, tmr, souffle._id); + } code() { return 'debordement' } tooltip(linkData) { return `Débordement en ${this.tmrLabel(linkData)}` } - img() { return 'systems/foundryvtt-reve-de-dragon/icons/svg/wave.svg' } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/wave.svg' } - _createSprite(pixiTMR) { - return pixiTMR.sprite(this.code(), - { - color: tmrColors.casehumide, alpha: 0.5, taille: tmrConstants.twoThird, decallage: tmrConstants.bottom - }); + createSprite(pixiTMR) { + return pixiTMR.sprite(this.code(), { + color: tmrColors.casehumide, + zIndex: tmrTokenZIndex.casehumide, + taille: tmrConstants.twoThird, + decallage: tmrConstants.bottom + }); } - async _creerCaseTmr(actor) { - const existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord); - const tmr = TMRUtility.getTMRAleatoire(it => !(TMRUtility.isCaseHumide(it) || existants.includes(it.coord))); - await this.createCaseTmr(actor, 'Debordement: ' + tmr.label, tmr); - } } diff --git a/module/tmr/demi-reve.js b/module/tmr/demi-reve.js index e84c7d88..1d05baec 100644 --- a/module/tmr/demi-reve.js +++ b/module/tmr/demi-reve.js @@ -1,4 +1,4 @@ -import { tmrColors, tmrConstants } from "../tmr-utility.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class DemiReve extends Draconique { @@ -13,12 +13,13 @@ export class DemiReve extends Draconique { async onActorCreateOwned(actor, item) { } code() { return 'demi-reve' } - tooltip(linkData) { return `Demi-rêve` } + tooltip(actor) { return `Demi-rêve ${actor.name}` } img() { return 'icons/svg/sun.svg' } - _createSprite(pixiTMR) { + createSprite(pixiTMR) { const sprite = pixiTMR.sprite(this.code(), { color: tmrColors.demireve, + zIndex: tmrTokenZIndex.demireve, taille: (tmrConstants.full * 0.7) }); pixiTMR.animate(pixiApp => pixiApp.ticker.add((delta) => sprite.rotation -= 0.01 * delta)); diff --git a/module/tmr/desorientation.js b/module/tmr/desorientation.js index 43fedf32..f2dad665 100644 --- a/module/tmr/desorientation.js +++ b/module/tmr/desorientation.js @@ -1,7 +1,6 @@ +import { Grammar } from "../grammar.js"; import { Misc } from "../misc.js"; -import { RollDataAjustements } from "../rolldata-ajustements.js"; -import { tmrColors, tmrConstants, TMRType, TMRUtility } from "../tmr-utility.js"; -import { Debordement } from "./debordement.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex, TMRType, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class Desorientation extends Draconique { @@ -10,7 +9,7 @@ export class Desorientation extends Draconique { } type() { return 'souffle' } - match(item) { return Draconique.isSouffleDragon(item) && item.name.toLowerCase().includes('désorientation'); } + match(item) { return Draconique.isSouffleDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('desorientation'); } manualMessage() { return false } async onActorCreateOwned(actor, souffle) { @@ -33,10 +32,14 @@ export class Desorientation extends Draconique { tooltip(linkData) { return `Désorientation, cette case n'existe plus !` } img() { return 'icons/svg/explosion.svg' } - _createSprite(pixiTMR) { + createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { - color: tmrColors.trounoir, alpha: 1, taille: tmrConstants.full, decallage: { x: 2, y: 2 }, + zIndex: tmrTokenZIndex.trounoir, + color: tmrColors.trounoir, + alpha: 1, + taille: tmrConstants.full, + decallage: { x: 2, y: 2 }, }); } diff --git a/module/tmr/draconique.js b/module/tmr/draconique.js index aa566371..9af391ec 100644 --- a/module/tmr/draconique.js +++ b/module/tmr/draconique.js @@ -54,7 +54,12 @@ export class Draconique async onActorCreateOwned(actor, item) { return false; } + async onActorDeleteOwned(actor, item) { + let caseTmrs = actor.data.items.filter(it => this.isCase(it) && it.data.sourceid == item._id); + for (let casetmr of caseTmrs) { + await actor.deleteOwnedItem(casetmr._id); + } return false; } /** @@ -80,7 +85,7 @@ export class Draconique */ token(pixiTMR, linkData, coordTMR, type = undefined) { const token = { - sprite: this._createSprite(pixiTMR), + sprite: this.createSprite(pixiTMR), coordTMR: coordTMR }; token[type ?? this.code()] = linkData; @@ -93,7 +98,7 @@ export class Draconique * factory d'élément graphique PIXI correpsondant à l'objet draconique * @param {*} pixiTMR instance de PixiTMR qui gère les tooltips, les méthodes de création de sprite standard, les clicks. */ - _createSprite(pixiTMR) { + createSprite(pixiTMR) { if (this.img()) { return pixiTMR.sprite(this.code()); } @@ -115,7 +120,6 @@ export class Draconique return list.find(c => this.isCase(c, coord)); } - async createCaseTmr(actor, label, tmr, sourceId=undefined) { await actor.createOwnedItem({ name: label, type: 'casetmr', img: this.img(), _id: randomID(16), diff --git a/module/tmr/effets-draconiques.js b/module/tmr/effets-draconiques.js index 656b0491..ab8bdc3d 100644 --- a/module/tmr/effets-draconiques.js +++ b/module/tmr/effets-draconiques.js @@ -13,7 +13,7 @@ import { Draconique } from "./draconique.js"; import { PresentCites } from "./present-cites.js"; import { Desorientation } from "./desorientation.js"; import { Conquete } from "./conquete.js"; - +import { Pelerinage } from "./pelerinage.js"; export class EffetsDraconiques { @@ -31,6 +31,7 @@ export class EffetsDraconiques { static pontImpraticable = new PontImpraticable(); static desorientation = new Desorientation(); static conquete = new Conquete(); + static pelerinage = new Pelerinage(); static init() { Draconique.register(EffetsDraconiques.carteTmr); @@ -47,6 +48,7 @@ export class EffetsDraconiques { Draconique.register(EffetsDraconiques.presentCites); Draconique.register(EffetsDraconiques.desorientation); Draconique.register(EffetsDraconiques.conquete); + Draconique.register(EffetsDraconiques.pelerinage); } /* -------------------------------------------- */ @@ -59,10 +61,15 @@ export class EffetsDraconiques { return EffetsDraconiques.trouNoir.isCase(caseTMR, coord) || EffetsDraconiques.desorientation.isCase(caseTMR, coord); } + static isCaseTrouNoir(caseTMR, coord) { return EffetsDraconiques.trouNoir.isCase(caseTMR, coord); } + static isCasePelerinage(caseTMR, coord) { + return EffetsDraconiques.pelerinage.isCase(caseTMR, coord); + } + static isReserveExtensible(caseTMR, coord) { return EffetsDraconiques.reserveExtensible.isCase(caseTMR, coord); } @@ -114,12 +121,16 @@ export class EffetsDraconiques { } /* -------------------------------------------- */ + static isSortImpossible(element) { + return EffetsDraconiques.isMatching(element, it => EffetsDraconiques.conquete.match(it) || EffetsDraconiques.pelerinage.match(it)); + } + static isConquete(element) { return EffetsDraconiques.isMatching(element, it => EffetsDraconiques.conquete.match(it)); } static isPelerinage(element) { - return EffetsDraconiques.isMatching(element, it => Draconique.isQueueDragon(it) && it.name.toLowerCase() == 'pélerinage'); + return EffetsDraconiques.isMatching(element, it => EffetsDraconiques.pelerinage.match(it)); } static countInertieDraconique(element) { diff --git a/module/tmr/fermeture-cites.js b/module/tmr/fermeture-cites.js index 29c0ef92..6a8602d3 100644 --- a/module/tmr/fermeture-cites.js +++ b/module/tmr/fermeture-cites.js @@ -1,4 +1,5 @@ -import { tmrColors, tmrConstants, TMRUtility } from "../tmr-utility.js"; +import { Grammar } from "../grammar.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class FermetureCites extends Draconique { @@ -8,32 +9,37 @@ export class FermetureCites extends Draconique { } type() { return 'souffle' } - match(item) { return Draconique.isSouffleDragon(item) && item.name.toLowerCase() == 'fermeture des cités'; } + match(item) { return Draconique.isSouffleDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('fermeture des cites'); } manualMessage() { return false } - async onActorCreateOwned(actor, item) { await this._fermerLesCites(actor); } + async onActorCreateOwned(actor, souffle) { await this._fermerLesCites(actor, souffle); } code() { return 'fermeture' } tooltip(linkData) { return `La ${this.tmrLabel(linkData)} est fermée` } img() { return 'icons/svg/door-closed.svg' } - _createSprite(pixiTMR) { + createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { - color: tmrColors.souffle, alpha: 0.9, taille: tmrConstants.full, decallage: { x: 2, y: 0 } + zIndex: tmrTokenZIndex.conquete, + color: tmrColors.souffle, + alpha: 0.9, + taille: tmrConstants.full, + decallage: { x: 2, y: 0 } }); } - async _fermerLesCites(actor) { + async _fermerLesCites(actor, souffle) { let existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord); let ouvertes = TMRUtility.filterTMR(it => it.type == 'cite' && !existants.includes(it.coord)); for (let tmr of ouvertes) { - await this.createCaseTmr(actor, 'Fermeture: ' + tmr.label, tmr); + await this.createCaseTmr(actor, 'Fermeture: ' + tmr.label, tmr, souffle._id); } } - async onConquete(actor, coord) { - const citeFermee = actor.data.items.find(it => this.isCase(it, coord)); - await this.actor.deleteOwnedItem(citeFermee._id); + async onConquete(actor, tmr, onRemoveToken) { + const citeFermee = actor.data.items.find(it => this.isCase(it, tmr.coord)); + await actor.deleteOwnedItem(citeFermee._id); + onRemoveToken(tmr, citeFermee); } } diff --git a/module/tmr/pelerinage.js b/module/tmr/pelerinage.js new file mode 100644 index 00000000..76cc2fe9 --- /dev/null +++ b/module/tmr/pelerinage.js @@ -0,0 +1,42 @@ +import { Grammar } from "../grammar.js"; +import { tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; +import { Draconique } from "./draconique.js"; + +export class Pelerinage extends Draconique { + + constructor() { + super(); + } + + type() { return 'queue' } + match(item) { return Draconique.isQueueDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('pelerinage'); } + manualMessage() { return false } + + async onActorCreateOwned(actor, queue) { + let tmr = TMRUtility.getTMRAleatoire(); + await this.createCaseTmr(actor, 'Pèlerinage: ' + tmr.label, tmr, queue._id); + } + + + code() { return 'pelerinage' } + tooltip(linkData) { return `Votre pèlerinage en ${this.tmrLabel(linkData)}` } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/pelerin.svg' } + + createSprite(pixiTMR) { + return pixiTMR.sprite(this.code(), { + zIndex: tmrTokenZIndex.conquete, + alpha: 1, + taille: tmrConstants.twoThird, + decallage: tmrConstants.right + }); + } + + async onFinPelerinage(actor, tmr, onRemoveToken) { + const pelerinages = actor.data.items.filter(it => this.isCase(it, tmr.coord)); + for (let p of pelerinages){ + await actor.deleteOwnedItem(p.data.sourceid); + onRemoveToken(tmr, p); + } + } + +} diff --git a/module/tmr/pixi-tmr.js b/module/tmr/pixi-tmr.js index 40cdbe67..505f1574 100644 --- a/module/tmr/pixi-tmr.js +++ b/module/tmr/pixi-tmr.js @@ -1,4 +1,4 @@ -import { tmrConstants } from "../tmr-utility.js"; +import { tmrConstants, tmrTokenZIndex } from "../tmr-utility.js"; const tooltipStyle = new PIXI.TextStyle({ fontFamily: 'CaslonAntique', @@ -16,6 +16,7 @@ export class PixiTMR { constructor(tmrObject, pixiApp) { this.tmrObject = tmrObject; this.pixiApp = pixiApp ?? tmrObject.pixiApp; + this.pixiApp.stage.sortableChildren = true; this.callbacksOnAnimate = []; } @@ -76,7 +77,10 @@ export class PixiTMR { sprite.width = options.taille ?? tmrConstants.half; sprite.height = options.taille ?? tmrConstants.half; sprite.anchor.set(0.5); - sprite.tint = options.color ?? 0x000000; + if (options.color) { + sprite.tint = options.color; + } + sprite.zIndex = options.zIndex ?? tmrTokenZIndex.casehumide+1; sprite.alpha = options.alpha ?? 0.75; sprite.decallage = options.decallage ?? tmrConstants.center; this.pixiApp.stage.addChild(sprite); diff --git a/module/tmr/pont-impraticable.js b/module/tmr/pont-impraticable.js index 1bd6ea94..8470a939 100644 --- a/module/tmr/pont-impraticable.js +++ b/module/tmr/pont-impraticable.js @@ -1,4 +1,5 @@ -import { tmrColors, tmrConstants, TMRUtility } from "../tmr-utility.js"; +import { Grammar } from "../grammar.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class PontImpraticable extends Draconique { @@ -8,33 +9,31 @@ export class PontImpraticable extends Draconique { } type() { return 'souffle' } - match(item) { return Draconique.isSouffleDragon(item) && item.name.toLowerCase().includes('impraticabilité des ponts'); } + match(item) { return Draconique.isSouffleDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('impraticabilite des ponts'); } - async onActorCreateOwned(actor, item) { await this._creerCaseTmr(actor); } - async onActorDeleteOwned(actor, item) { await this._supprimerCaseTmr(actor); } + async onActorCreateOwned(actor, souffle) { + const ponts = TMRUtility.getListTMR('pont'); + for (let tmr of ponts) { + await this.createCaseTmr(actor, 'Pont impraticable: ' + tmr.label, tmr, souffle._id); + } + } code() { return 'pont-impraticable' } tooltip(linkData) { return `${this.tmrLabel(linkData)} impraticable` } - img() { return 'systems/foundryvtt-reve-de-dragon/icons/svg/wave.svg' } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/wave.svg' } - _createSprite(pixiTMR) { + createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { - color: tmrColors.casehumide, alpha: 0.5, taille: tmrConstants.twoThird, decallage: tmrConstants.bottom + zIndex: tmrTokenZIndex.casehumide, + color: tmrColors.casehumide, + alpha: 0.5, + taille: tmrConstants.twoThird, + decallage: tmrConstants.bottom }); } async _creerCaseTmr(actor) { - const ponts = TMRUtility.getListTMR('pont'); - for (let tmr of ponts) { - await this.createCaseTmr(actor, 'Pont impraticable: ' + tmr.label, tmr); - } } - async _supprimerCaseTmr(actor) { - const existants = actor.data.items.filter(it => this.isCase(it)); - for (let caseTMR of existants) { - await actor.deleteOwnedItem(caseTMR._id); - } - } } diff --git a/module/tmr/present-cites.js b/module/tmr/present-cites.js index 84d13ba7..c6967b94 100644 --- a/module/tmr/present-cites.js +++ b/module/tmr/present-cites.js @@ -1,5 +1,6 @@ import { ChatUtility } from "../chat-utility.js"; -import { tmrColors, tmrConstants, TMRUtility } from "../tmr-utility.js"; +import { Grammar } from "../grammar.js"; +import { tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class PresentCites extends Draconique { @@ -9,22 +10,26 @@ export class PresentCites extends Draconique { } type() { return 'tete' } - match(item) { return Draconique.isTeteDragon(item) && item.name.toLowerCase() == 'présent des cités'; } + match(item) { return Draconique.isTeteDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('present des cites'); } manualMessage() { return false } - async onActorCreateOwned(actor, item) { await this._ajouterPresents(actor); } + async onActorCreateOwned(actor, tete) { await this._ajouterPresents(actor, tete); } code() { return 'present-cites' } tooltip(linkData) { return `La ${this.tmrLabel(linkData)} a un présent` } - img() { return 'systems/foundryvtt-reve-de-dragon/icons/svg/gift.svg' } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/gift.svg' } - _createSprite(pixiTMR) { + createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { - color: tmrColors.tetes, alpha: 0.7, taille: tmrConstants.third, decallage: tmrConstants.topRight + zIndex: tmrTokenZIndex.tetes, + color: 0xFEFEFE, + alpha: 0.8, + taille: tmrConstants.third, + decallage: tmrConstants.topRight }); } - async _ajouterPresents(actor) { + async _ajouterPresents(actor, tete) { let existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord); if (existants.length > 0) { ChatMessage.create({ @@ -35,23 +40,26 @@ export class PresentCites extends Draconique { else { let cites = TMRUtility.filterTMR(it => it.type == 'cite'); for (let tmr of cites) { - await this.createCaseTmr(actor, 'Présent: ' + tmr.label, tmr); + await this.createCaseTmr(actor, 'Présent: ' + tmr.label, tmr, tete._id); } } } - async choisirUnPresent(casetmr) { + + async choisirUnPresent(casetmr, onChoixPresent) { let d = new Dialog({ title: "Présent des cités", - content: `La ${casetmr.data.coord} vous offre un présent`, + content: `La ${this.tmrLabel(casetmr)} vous offre un présent, faite votre choix`, buttons: { - fleur: { - icon: '', - label: "Fleur des rêves 2d6", - callback: () => this.creerObjet() - } - } + messager: { icon: '', label: "Un Messager des rêves", callback: () => onChoixPresent('messager2d6') }, + passeur: { icon: '', label: "Un Passeur des rêves", callback: () => onChoixPresent('passeur2d6') }, + fleur: { icon: '', label: "Une Fleur des rêves", callback: () => onChoixPresent('fleur2d6') }, + }, + default: "fleur" }); d.render(true); } + async ouvrirLePresent(actor, casetmr) { + await actor.deleteOwnedItem(casetmr._id); + } } diff --git a/module/tmr/quete-eaux.js b/module/tmr/quete-eaux.js index c0a67c79..df9866cd 100644 --- a/module/tmr/quete-eaux.js +++ b/module/tmr/quete-eaux.js @@ -1,4 +1,5 @@ -import { tmrColors, tmrConstants, TMRUtility } from "../tmr-utility.js"; +import { Grammar } from "../grammar.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class QueteEaux extends Draconique { @@ -7,19 +8,21 @@ export class QueteEaux extends Draconique { } type() { return 'tete' } - match(item) { return Draconique.isTeteDragon(item) && item.name.toLowerCase().includes("quête des eaux"); } + match(item) { return Draconique.isTeteDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes("quete des eaux"); } manualMessage() { return "Vous devrez re-configurer votre Quête des Eaux une fois un lac ou marais vaincu" } - async onActorCreateOwned(actor, item) { await this._creerCaseTmr(actor); } + async onActorCreateOwned(actor, tete) { + await this.createCaseTmr(actor, "Quête des eaux à déterminer", { coord: 'A0' }, tete._id); + } code() { return 'maitrisee' } tooltip(linkData) { return `Quête des eaux, le ${this.tmrLabel(linkData)} est maîtrisé` } img() { return 'icons/svg/bridge.svg' } - _createSprite(pixiTMR) { - return pixiTMR.sprite(this.code(), { color: tmrColors.tetes, decallage: tmrConstants.topRight }); - } - - async _creerCaseTmr(actor) { - await this.createCaseTmr(actor, "Quête des eaux à déterminer", {coord:'A0'}); + createSprite(pixiTMR) { + return pixiTMR.sprite(this.code(), { + zIndex: tmrTokenZIndex.casehumide + 1, + color: tmrColors.tetes, + decallage: tmrConstants.topRight + }); } } diff --git a/module/tmr/rencontre.js b/module/tmr/rencontre.js index 3c6c4ab8..6bce1a6e 100644 --- a/module/tmr/rencontre.js +++ b/module/tmr/rencontre.js @@ -1,4 +1,4 @@ -import { tmrColors, tmrConstants } from "../tmr-utility.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class Rencontre extends Draconique { @@ -16,7 +16,12 @@ export class Rencontre extends Draconique { tooltip(linkData) { return `${linkData.name} de force ${linkData.force}` } img() { return 'systems/foundryvtt-reve-de-dragon/icons/heures/hd06.svg' } - _createSprite(pixiTMR) { - return pixiTMR.sprite(this.code(), { color: tmrColors.rencontre, taille: tmrConstants.full, decallage: { x: 2, y: 2 } }); + createSprite(pixiTMR) { + return pixiTMR.sprite(this.code(), { + zIndex: tmrTokenZIndex.rencontre, + color: tmrColors.rencontre, + taille: tmrConstants.full, + decallage: { x: 2, y: 2 } + }); } } diff --git a/module/tmr/reserve-extensible.js b/module/tmr/reserve-extensible.js index 47df6181..cc51420e 100644 --- a/module/tmr/reserve-extensible.js +++ b/module/tmr/reserve-extensible.js @@ -1,4 +1,5 @@ -import { tmrColors, tmrConstants, TMRUtility } from "../tmr-utility.js"; +import { Grammar } from "../grammar.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class ReserveExtensible extends Draconique { @@ -7,22 +8,24 @@ export class ReserveExtensible extends Draconique { } type() { return 'tete' } - match(item) { return Draconique.isTeteDragon(item) && item.name.toLowerCase().includes("réserve extensible"); } + match(item) { return Draconique.isTeteDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes("reserve extensible"); } manualMessage() { return "Vous pouvez re-configurer votre Réserve extensible" } - async onActorCreateOwned(actor, item) { await this._creerCaseTmr(actor); } + async onActorCreateOwned(actor, tete) { + const existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord); + const tmr = TMRUtility.getTMRAleatoire(it => !(it.type == 'fleuve' || existants.includes(it.coord))); + await this.createCaseTmr(actor, "Nouvelle Réserve extensible", tmr, tete._id); + } code() { return 'reserve_extensible' } tooltip(linkData) { return `Réserve extensible en ${this.tmrLabel(linkData)} !` } - img() { return 'icons/svg/chest.svg' } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/treasure-chest.svg' } - _createSprite(pixiTMR) { - return pixiTMR.sprite(this.code(), { color: tmrColors.tetes, decallage: tmrConstants.left}); - } - - async _creerCaseTmr(actor) { - const existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord); - const tmr = TMRUtility.getTMRAleatoire(it => !(it.type == 'fleuve' || existants.includes(it.coord))); - await this.createCaseTmr(actor, "Nouvelle Réserve extensible", tmr); + createSprite(pixiTMR) { + return pixiTMR.sprite(this.code(), { + zIndex: tmrTokenZIndex.tetes, + alpha: 0.9, + decallage: tmrConstants.left + }); } } diff --git a/module/tmr/sort-reserve.js b/module/tmr/sort-reserve.js index 4b1ee48b..b20cb7c1 100644 --- a/module/tmr/sort-reserve.js +++ b/module/tmr/sort-reserve.js @@ -1,4 +1,4 @@ -import { tmrColors, tmrConstants } from "../tmr-utility.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class SortReserve extends Draconique { @@ -13,10 +13,14 @@ export class SortReserve extends Draconique { async onActorCreateOwned(actor, item) { } code() { return 'sort' } - tooltip(linkData) { return `${linkData.name}, r${linkData.data.ptreve_reel}` } - img() { return 'icons/svg/book.svg' } + tooltip(sort) { return `${sort.name}, r${sort.data.ptreve_reel}` } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/scroll.svg' } - _createSprite(pixiTMR) { - return pixiTMR.sprite(this.code(), { color: tmrColors.sort, decallage: tmrConstants.right }); + createSprite(pixiTMR) { + return pixiTMR.sprite(this.code(), { + zIndex: tmrTokenZIndex.sort, + alpha: 0.5, + decallage: tmrConstants.right + }); } } diff --git a/module/tmr/terre-attache.js b/module/tmr/terre-attache.js index e5f913b1..2a6fb686 100644 --- a/module/tmr/terre-attache.js +++ b/module/tmr/terre-attache.js @@ -1,4 +1,5 @@ -import { tmrColors, tmrConstants, TMRUtility } from "../tmr-utility.js"; +import { Grammar } from "../grammar.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class TerreAttache extends Draconique { @@ -7,19 +8,23 @@ export class TerreAttache extends Draconique { } type() { return 'tete' } - match(item) { return Draconique.isTeteDragon(item) && item.name.toLowerCase().includes("terre d'attache"); } + match(item) { return Draconique.isTeteDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes("terre d'attache"); } manualMessage() { return "Vous pouvez re-configurer votre Terre d'Attache" } - async onActorCreateOwned(actor, item) { await this._creerCaseTmr(actor); } + + async onActorCreateOwned(actor, tete) { + await this.createCaseTmr(actor, "Terre d'attache à déterminer", { coord: 'A0' }, tete._id); + } code() { return 'attache' } tooltip(linkData) { return `Terre d'attache en ${this.tmrLabel(linkData)} !` } img() { return 'icons/svg/anchor.svg' } - _createSprite(pixiTMR) { - return pixiTMR.sprite(this.code(), { color: tmrColors.tetes, decallage: tmrConstants.topLeft }); + createSprite(pixiTMR) { + return pixiTMR.sprite(this.code(), { + zIndex: tmrTokenZIndex.tetes, + color: tmrColors.tetes, + decallage: tmrConstants.topLeft + }); } - async _creerCaseTmr(actor) { - await this.createCaseTmr(actor, "Terre d'attache à déterminer", {coord:'A0'}); - } } diff --git a/module/tmr/trou-noir.js b/module/tmr/trou-noir.js index 79c97830..10b86012 100644 --- a/module/tmr/trou-noir.js +++ b/module/tmr/trou-noir.js @@ -1,4 +1,5 @@ -import { tmrColors, tmrConstants, TMRUtility } from "../tmr-utility.js"; +import { Grammar } from "../grammar.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class TrouNoir extends Draconique { @@ -7,24 +8,28 @@ export class TrouNoir extends Draconique { } type() { return 'souffle' } - match(item) { return Draconique.isSouffleDragon(item) && item.name.toLowerCase().includes('trou noir'); } + match(item) { return Draconique.isSouffleDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('trou noir'); } manualMessage() { return false } - async onActorCreateOwned(actor, item) { await this._creerCaseTmr(actor); } + + async onActorCreateOwned(actor, souffle) { + const existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord); + const tmr = TMRUtility.getTMRAleatoire(it => !(TMRUtility.isCaseHumide(it) || existants.includes(it.coord))); + await this.createCaseTmr(actor, 'Trou noir: ' + tmr.label, tmr, souffle._id); + } code() { return 'trounoir' } tooltip(linkData) { return `Trou noir en ${this.tmrLabel(linkData)} !` } img() { return 'icons/svg/explosion.svg' } - _createSprite(pixiTMR) { + createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { - color: tmrColors.trounoir, alpha: 1, taille: tmrConstants.full, decallage: { x: 2, y: 2 }, + zIndex: tmrTokenZIndex.trounoir, + color: tmrColors.trounoir, + alpha: 1, taille: + tmrConstants.full, + decallage: { x: 2, y: 2 }, }); } - async _creerCaseTmr(actor) { - const existants = actor.data.items.filter(it => this.isCase(it)).map(it => it.data.coord); - const tmr = TMRUtility.getTMRAleatoire(it => !(TMRUtility.isCaseHumide(it) || existants.includes(it.coord))); - await this.createCaseTmr(actor, 'Trou noir: ' + tmr.label, tmr); - } } diff --git a/packs/ombres-de-thanatos.db b/packs/ombres-de-thanatos.db index be4b8f48..19f01dd5 100644 --- a/packs/ombres-de-thanatos.db +++ b/packs/ombres-de-thanatos.db @@ -1,25 +1,26 @@ -{"name":"Désir d'escalade difficile","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Désir thanataire. Hauteur à grimper : 4d6 m, difficulté de l’escalade : 1d4-4.

","refoulement":1},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"2KM1yiEOE0ZdT2oL"} -{"name":"Désir de blesser un enfant","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Désir thanataire. Causer au minimum une blessure légère.

","refoulement":1},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"2KbzOC2aj98CiQbW"} -{"name":"Urgence draconique","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Le haut-rêvant est pris du besoin irrésistible de déclencher immédiatement son plus proche sort en réserve. À équidistance, prendre dans le sens des aiguilles d’une montre en commençant par le haut. En cas de rencontre dans les TMR, se dérober équivaut à refouler la queue de Dragon. Si aucun sort n’est en réserve, ou si il y a impossibilité de pratiquer la magie à cause d’une autre queue ou d’un souffle, tirer à la place une idée fixe.

","refoulement":4},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"3dnmi4Fyh5eUQcyP"} -{"name":"Insomnie","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Impossibilité totale de dormir, et donc de rêver, pendant un jour.

","refoulement":1},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"6MUcjYfxfi45STvo"} -{"name":"Désir de boire du sang chaud","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Désir thanataire. Il s’agit de sang encore chaud de la chaleur naturelle de la victime.

","refoulement":1},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"DnhuuGUEbOF95JlN"} -{"name":"Conquête","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Avant de pouvoir à nouveau faire usage du haut-rêve, y compris déclencher volontairement un sort mis en réserve, le haut-rêvant doit se rendre dans une certaine case des TMR déterminée aléatoirement et la maîtriser, difficulté -7. Ce peut être n’importe quelle case, sauf une case humide. En cas d’échec, la concentration est rompue ; il n’y a pas de souffle de Dragon en cas d’échec total.

","refoulement":1},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"N9j8K6x89BdS7ZKN"} -{"name":"Coup de barre","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Prise immédiate de 3d6 points de fatigue.

","refoulement":1},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"PMz7SaB6sRxhwrWw"} +{"_id":"2KM1yiEOE0ZdT2oL","name":"Désir d'escalade difficile","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Désir thanataire. Hauteur à grimper : 4d6 m, difficulté de l’escalade : 1d4-4.

","refoulement":1,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"2KbzOC2aj98CiQbW","name":"Désir de blesser un enfant","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Désir thanataire. Causer au minimum une blessure légère.

","refoulement":1,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"3dnmi4Fyh5eUQcyP","name":"Urgence draconique","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Le haut-rêvant est pris du besoin irrésistible de déclencher immédiatement son plus proche sort en réserve. À équidistance, prendre dans le sens des aiguilles d’une montre en commençant par le haut. En cas de rencontre dans les TMR, se dérober équivaut à refouler la queue de Dragon. Si aucun sort n’est en réserve, ou si il y a impossibilité de pratiquer la magie à cause d’une autre queue ou d’un souffle, tirer à la place une idée fixe.

","refoulement":4,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"6MUcjYfxfi45STvo","name":"Insomnie","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Impossibilité totale de dormir, et donc de rêver, pendant un jour.

","refoulement":1,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"DnhuuGUEbOF95JlN","name":"Désir de boire du sang chaud","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Désir thanataire. Il s’agit de sang encore chaud de la chaleur naturelle de la victime.

","refoulement":1,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"N9j8K6x89BdS7ZKN","name":"Conquête","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Avant de pouvoir à nouveau faire usage du haut-rêve, y compris déclencher volontairement un sort mis en réserve, le haut-rêvant doit se rendre dans une certaine case des TMR déterminée aléatoirement et la maîtriser, difficulté -7. Ce peut être n’importe quelle case, sauf une case humide. En cas d’échec, la concentration est rompue ; il n’y a pas de souffle de Dragon en cas d’échec total.

","refoulement":1,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"PMz7SaB6sRxhwrWw","name":"Coup de barre","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Prise immédiate de 3d6 points de fatigue.

","refoulement":1,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} {"name":"Pélerinage","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Avant de pouvoir à nouveau faire usage du haut-rêve, y compris déclencher volontairement un sort mis en réserve, le haut-rêvant doit se rendre dans une certaine case des TMR déterminée aléatoirement. Un Passeur peut l’y téléporter, mais un Messager ne peut s’y rendre à sa place. Dès que la case est atteinte, le pèlerinage est accompli.

","refoulement":1},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"PYDb8gvRWeCAdPEZ"} -{"name":"Inertie draconique","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Pendant un jour, la fatigue en TMR est doublée. Chaque case ou round coûte 2 points au lieu d’un.

","refoulement":1},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"PmEjVox3Q6SPF730"} -{"name":"Souvenir morbide de l'archétype","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Les prochains points d’expérience dus au stress doivent être mis en Thanatos.

","refoulement":1},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"RrPMV2HW2Rg8POK1"} -{"name":"Mauvaise rencontre en perspective","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Tirer la prochaine rencontre dans les TMR sur la @RollTable[52ymSWISvXPUhRyQ]{Table spéciale de rencontres}

","refoulement":1},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"S7se7qPnL6WDg5U5"} -{"name":"Dépouillement","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Faire don de toute la monnaie actuellement possédée à la première personne inconnue rencontrée. En attendant, se garder d’aucune dépense.

","refoulement":4},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"UmvGxA4cFSoRE82Z"} -{"name":"Amnésie sélective","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Pendant un jour, perte totale d’une compétence, à l’exclusion du Draconic. Déterminer aléatoirement la compétence visée qui, pratiquement, retourne au niveau de base. Si elle est déjà au niveau de base, en choisir une autre.

","refoulement":1},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"aZWuRmi8lplZQcdM"} -{"name":"Couardise irraisonnée","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

la prochaine occasion de combat, obligation de fuir, de se cacher ou de se rendre. Impossibilité d’utiliser aucune magie, ni sur l’ennemi, ni sur soi-même.

","refoulement":4},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"cUkRSRz5DJYb3WM8"} -{"name":"Haine fatale","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

On devient immédiatement haineux et jaloux envers la première personne inconnue de même sexe et de même espèce rencontrée. Traiter comme le Coup de foudre fatal. La satisfaction s’obtient en blessant gravement ou en infligeant une cuisante humiliation publique.

","refoulement":4},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"dFf8jaC0RvidC1ZC"} -{"name":"Infarctus","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Perte immédiate de 4 points de vie (et 8 points d’endurance). Ces points pourront commencer à être regagnés au bout d’un jour complet.

","refoulement":0},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"e67rXcuO236ioYAr"} -{"name":"Désir de dormir dans un cercueil","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Désir thanataire.

","refoulement":1},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"fO1jjVlOb6faLv3T"} -{"name":"Injurier la première personne inconnue rencontrée","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Désir d'injurier la première personne inconnue rencontrée

","refoulement":4},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"fUKNZ0uEG2y2PkOk"} -{"name":"Désir de blesser une femme","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Désir thanataire. Causer au minimum une blessure légère.

","refoulement":1},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"gT0PQAxlYrtITyut"} -{"name":"Désir de parler à un crâne (humain)","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Désir thanataire. La \"conversation\" doit durer un minimum de 15 minutes.

","refoulement":1},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"lz3ghhJzkPRWJ2jz"} -{"name":"Héroïsme forcené","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

À la prochaine occasion de combat, obligation de foncer en tête en corps à corps ou avec une arme de mêlée. Impossibilité d’utiliser aucune magie, ni sur l’ennemi, ni sur soi-même.

","refoulement":4},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"spYuiInqbCoDsKvd"} -{"name":"Désir d'entendre hurler de terreur","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Désir thanataire. Il doit s’agir d’un hurlement humain.

","refoulement":1},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"twUoR8ALYiabkfoE"} -{"name":"Montée laborieuse","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Pendant un jour, monter en TMR coûte 2 points de rêve au lieu d’un, et 3 points en déplacement accéléré.

","refoulement":1},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"uQ4PwcwplvZarfn1"} -{"name":"Désir d'assister à une pendaison","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Désir thanataire.

","refoulement":1},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"wqWkQQsAPVlFw4ft"} -{"name":"Réinsertion aléatoire","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Comme après une sortie de la carte, le gardien des rêves réintroduit secrètement le demi-rêve du haut-rêvant dans les TMR.

","refoulement":1},"flags":{},"img":"icons/svg/mystery-man.svg","_id":"yEHdCabJYx0qvoL5"} +{"_id":"PmEjVox3Q6SPF730","name":"Inertie draconique","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Pendant un jour, la fatigue en TMR est doublée. Chaque case ou round coûte 2 points au lieu d’un.

","refoulement":1,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"RrPMV2HW2Rg8POK1","name":"Souvenir morbide de l'archétype","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Les prochains points d’expérience dus au stress doivent être mis en Thanatos.

","refoulement":1,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"S7se7qPnL6WDg5U5","name":"Mauvaise rencontre en perspective","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Tirer la prochaine rencontre dans les TMR sur la @RollTable[52ymSWISvXPUhRyQ]{Table spéciale de rencontres}

","refoulement":1,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"UmvGxA4cFSoRE82Z","name":"Dépouillement","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Faire don de toute la monnaie actuellement possédée à la première personne inconnue rencontrée. En attendant, se garder d’aucune dépense.

","refoulement":4,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"aZWuRmi8lplZQcdM","name":"Amnésie sélective","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Pendant un jour, perte totale d’une compétence, à l’exclusion du Draconic. Déterminer aléatoirement la compétence visée qui, pratiquement, retourne au niveau de base. Si elle est déjà au niveau de base, en choisir une autre.

","refoulement":1,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"cUkRSRz5DJYb3WM8","name":"Couardise irraisonnée","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

la prochaine occasion de combat, obligation de fuir, de se cacher ou de se rendre. Impossibilité d’utiliser aucune magie, ni sur l’ennemi, ni sur soi-même.

","refoulement":4,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"dFf8jaC0RvidC1ZC","name":"Haine fatale","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

On devient immédiatement haineux et jaloux envers la première personne inconnue de même sexe et de même espèce rencontrée. Traiter comme le Coup de foudre fatal. La satisfaction s’obtient en blessant gravement ou en infligeant une cuisante humiliation publique.

","refoulement":4,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"e67rXcuO236ioYAr","name":"Infarctus","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Perte immédiate de 4 points de vie (et 8 points d’endurance). Ces points pourront commencer à être regagnés au bout d’un jour complet.

","refoulement":0,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"fO1jjVlOb6faLv3T","name":"Désir de dormir dans un cercueil","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Désir thanataire.

","refoulement":1,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"fUKNZ0uEG2y2PkOk","name":"Injurier la première personne inconnue rencontrée","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Désir d'injurier la première personne inconnue rencontrée

","refoulement":4,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"gT0PQAxlYrtITyut","name":"Désir de blesser une femme","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Désir thanataire. Causer au minimum une blessure légère.

","refoulement":1,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"lz3ghhJzkPRWJ2jz","name":"Désir de parler à un crâne (humain)","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Désir thanataire. La \"conversation\" doit durer un minimum de 15 minutes.

","refoulement":1,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"spYuiInqbCoDsKvd","name":"Héroïsme forcené","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

À la prochaine occasion de combat, obligation de foncer en tête en corps à corps ou avec une arme de mêlée. Impossibilité d’utiliser aucune magie, ni sur l’ennemi, ni sur soi-même.

","refoulement":4,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"twUoR8ALYiabkfoE","name":"Désir d'entendre hurler de terreur","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Désir thanataire. Il doit s’agir d’un hurlement humain.

","refoulement":1,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"uQ4PwcwplvZarfn1","name":"Montée laborieuse","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Pendant un jour, monter en TMR coûte 2 points de rêve au lieu d’un, et 3 points en déplacement accéléré.

","refoulement":1,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"wqWkQQsAPVlFw4ft","name":"Désir d'assister à une pendaison","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Désir thanataire.

","refoulement":1,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"_id":"yEHdCabJYx0qvoL5","name":"Réinsertion aléatoire","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"ombre","data":{"description":"

Comme après une sortie de la carte, le gardien des rêves réintroduit secrètement le demi-rêve du haut-rêvant dans les TMR.

","refoulement":1,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[]} +{"name":"Pèlerinage","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"ombre","data":{"description":"

Avant de pouvoir à nouveau faire usage du haut-rêve, y compris déclencher volontairement un sort mis en réserve, le haut-rêvant doit se rendre dans une certaine case des TMR déterminée aléatoirement. Un Passeur peut l’y téléporter, mais un Messager ne peut s’y rendre à sa place. Dès que la case est atteinte, le pèlerinage est accompli.

","refoulement":1,"duree":"","restant":0},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"zIXgRwfB83DMaNX8"} diff --git a/packs/queues-de-dragon.db b/packs/queues-de-dragon.db index 01c40be6..32da0f72 100644 --- a/packs/queues-de-dragon.db +++ b/packs/queues-de-dragon.db @@ -1,56 +1,57 @@ -{"_id":"0jrEZ62Q2Jz4kBGf","name":"Mauvaise rencontre en perspective","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Tirer la prochaine rencontre dans les TMR sur la @Compendium[foundryvtt-reve-de-dragon.tables-diverses.66ye0OOxBO9LEjdd]{Table spéciale de rencontres}

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp"} -{"name":"Idée fixe : Anorexie. Ne rien avaler, ni solide, ni liquide, pas même une potion","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"anorexie.png","effects":[],"_id":"0uc2pMIGL03Hq2Hn"} -{"_id":"1gGVlZM0UyifL6RK","name":"Souvenir obsessionnel de l'archétype","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Les prochains points d’expérience dus au stress doivent être mis dans une compétence déterminée aléatoirement par la table de @Compendium[foundryvtt-reve-de-dragon.tables-diverses.E0WLgjn6LA9WsvKJ]{Détermination aléatoire de compétence}.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp"} -{"name":"Désir lancinant : Briser un objet de verre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"briser_verre.png","effects":[],"_id":"1l59lWbtvYp74OTb"} -{"name":"Idée fixe : Cracher dans toute nourriture ou boisson aperçue","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"cracher_nourriture.png","effects":[],"_id":"22EQLBJfHVYs96iC"} -{"name":"Idée fixe : Éteindre tout feu rencontré (feu de camp, torche, lanterne, etc.)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"eteindre_feu.png","effects":[],"_id":"2Rtm78bMKPy8eG4q"} -{"name":"Désir lancinant : Danser avec un(e) partenaire inconnu(e) (Beauté 13 minimum)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"danser_inconnu.png","effects":[],"_id":"2i3PndTKG1n3hEUU"} -{"name":"Idée fixe : Traîner son épée en laisse (ou sa meilleure arme)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"trainer_laisse.png","effects":[],"_id":"2j1q9e07ZLlIQDYl"} -{"_id":"32LbwxxokC9Tn370","name":"Coup de foudre fatal","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

On devient immédiatement amoureux fou de la première personne inconnue de sexe opposé et de même espèce rencontrée. Tant que satisfaction n’est pas obtenue, traiter comme un désir lancinant. 

","refoulement":2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp"} -{"name":"Désir lancinant : Gagner de l’argent (minimum 10 deniers)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"gagner_argent.png","effects":[],"_id":"3BcC8lSsP5WIyva7"} -{"name":"Désir lancinant : Mégalomanie. Être acclamé par un minimum de 10 personnes","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"megalomanie.png","effects":[],"_id":"3ZjwYyQRatCMnBCi"} -{"_id":"5knw1NcnBsLIjHpr","name":"Montée laborieuse","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Pendant un jour, monter en TMR coûte 2 points de rêve au lieu d’un, et 3 points en déplacement accéléré.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp"} -{"name":"Idée fixe : Avoir le visage noirci à la cendre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"avoir_visage.png","effects":[],"_id":"6G0lF06jSryTduAt"} -{"name":"Idée fixe : Ne marcher qu’à quatre pattes","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"marcher_quatre_pattes.png","effects":[],"_id":"7TKsit2Mv9mWGq3C"} -{"name":"Désir lancinant : Acquérir une chèvre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"acqu%C3%A9rir_chevre.png","effects":[],"_id":"8sLXQBqo8XwjAFG0"} -{"name":"Idée fixe : Garder les yeux bandés","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"garder_yeux.png","effects":[],"_id":"E902EEYZHg3zFKq6"} -{"_id":"EUrxQGd7FuW628NS","name":"Inertie draconique","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Pendant un jour, la fatigue en TMR est doublée. Chaque case ou round coûte 2 points au lieu d’un.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp"} -{"name":"Désir lancinant : Danser nu sous la pluie","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"danser_pluie.png","effects":[],"_id":"F6qL4d4g3qjh045R"} -{"name":"Idée fixe : Garder sur soi 3d6 kilos de cailloux","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"garder_cailloux.png","effects":[],"_id":"F8G3rdU1nfJzYwYR"} -{"name":"Désir lancinant : Se faire raser la tête","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"raser_tete.png","effects":[],"_id":"HSNOvBR890dsEDw2"} -{"name":"Idée fixe : Aller tout nu, sans porter le moindre paquet ni objet","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"aller_nu.png","effects":[],"_id":"I0CtQ05xFW6ghcdP"} +{"_id":"0jrEZ62Q2Jz4kBGf","name":"Mauvaise rencontre en perspective","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Tirer la prochaine rencontre dans les TMR sur la @Compendium[foundryvtt-reve-de-dragon.tables-diverses.66ye0OOxBO9LEjdd]{Table spéciale de rencontres}

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} +{"_id":"0uc2pMIGL03Hq2Hn","name":"Idée fixe : Anorexie. Ne rien avaler, ni solide, ni liquide, pas même une potion","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"anorexie.png","effects":[]} +{"_id":"1gGVlZM0UyifL6RK","name":"Souvenir obsessionnel de l'archétype","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Les prochains points d’expérience dus au stress doivent être mis dans une compétence déterminée aléatoirement par la table de @Compendium[foundryvtt-reve-de-dragon.tables-diverses.E0WLgjn6LA9WsvKJ]{Détermination aléatoire de compétence}.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} +{"_id":"1l59lWbtvYp74OTb","name":"Désir lancinant : Briser un objet de verre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} +{"_id":"22EQLBJfHVYs96iC","name":"Idée fixe : Cracher dans toute nourriture ou boisson aperçue","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"cracher_nourriture.png","effects":[]} +{"_id":"2Rtm78bMKPy8eG4q","name":"Idée fixe : Éteindre tout feu rencontré (feu de camp, torche, lanterne, etc.)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"eteindre_feu.png","effects":[]} +{"_id":"2i3PndTKG1n3hEUU","name":"Désir lancinant : Danser avec un(e) partenaire inconnu(e) (Beauté 13 minimum)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} +{"_id":"2j1q9e07ZLlIQDYl","name":"Idée fixe : Traîner son épée en laisse (ou sa meilleure arme)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"trainer_laisse.png","effects":[]} +{"_id":"32LbwxxokC9Tn370","name":"Coup de foudre fatal","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

On devient immédiatement amoureux fou de la première personne inconnue de sexe opposé et de même espèce rencontrée. Tant que satisfaction n’est pas obtenue, traiter comme un désir lancinant. 

","refoulement":2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} +{"_id":"3BcC8lSsP5WIyva7","name":"Désir lancinant : Gagner de l’argent (minimum 10 deniers)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"gagner_argent.png","effects":[]} +{"_id":"3ZjwYyQRatCMnBCi","name":"Désir lancinant : Mégalomanie. Être acclamé par un minimum de 10 personnes","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"megalomanie.png","effects":[]} +{"_id":"5knw1NcnBsLIjHpr","name":"Montée laborieuse","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Pendant un jour, monter en TMR coûte 2 points de rêve au lieu d’un, et 3 points en déplacement accéléré.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} +{"_id":"6G0lF06jSryTduAt","name":"Idée fixe : Avoir le visage noirci à la cendre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"avoir_visage.png","effects":[]} +{"_id":"7TKsit2Mv9mWGq3C","name":"Idée fixe : Ne marcher qu’à quatre pattes","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"marcher_quatre_pattes.png","effects":[]} +{"_id":"8sLXQBqo8XwjAFG0","name":"Désir lancinant : Acquérir une chèvre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} +{"_id":"E902EEYZHg3zFKq6","name":"Idée fixe : Garder les yeux bandés","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"garder_yeux.png","effects":[]} +{"_id":"EUrxQGd7FuW628NS","name":"Inertie draconique","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Pendant un jour, la fatigue en TMR est doublée. Chaque case ou round coûte 2 points au lieu d’un.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} +{"_id":"F6qL4d4g3qjh045R","name":"Désir lancinant : Danser nu sous la pluie","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} +{"_id":"F8G3rdU1nfJzYwYR","name":"Idée fixe : Garder sur soi 3d6 kilos de cailloux","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"garder_cailloux.png","effects":[]} +{"_id":"HSNOvBR890dsEDw2","name":"Désir lancinant : Se faire raser la tête","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"raser_tete.png","effects":[]} +{"_id":"I0CtQ05xFW6ghcdP","name":"Idée fixe : Aller tout nu, sans porter le moindre paquet ni objet","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"aller_nu.png","effects":[]} {"_id":"J3XtcVuQo846U1OT","name":"Idée fixe","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Tirer [[/r 1d20]] sur la table des @Compendium[foundryvtt-reve-de-dragon.tables-diverses.nbH4v630P7ARaAHk]{Idées fixes}. Les idées fixes prennent effet immédiatement et durent jusqu’à l’extrême fin de l’heure du Château Dormant du lendemain. Si passé ce délai, l’occasion de les manifester ne s’est pas présentée, la queue prend fin néanmoins. Si elles entrent en contradiction avec une autre queue de Dragon, retirer.

\n

 

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} -{"name":"Idée fixe : Boulimie. Manger au moins un point de sust. par heure","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"boulimie.png","effects":[],"_id":"JcTX8qMS0z8bmdVt"} -{"name":"Désir lancinant : Passer une nuit sur une échelle","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"nuit_echelle.png","effects":[],"_id":"LlELEB0FhymLx6VM"} +{"_id":"JcTX8qMS0z8bmdVt","name":"Idée fixe : Boulimie. Manger au moins un point de sust. par heure","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"boulimie.png","effects":[]} +{"_id":"LlELEB0FhymLx6VM","name":"Désir lancinant : Passer une nuit sur une échelle","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"nuit_echelle.png","effects":[]} {"_id":"Ltgqj86rYQr8D8LW","name":"Désir lancinant","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Tirer [[/r 1d20]] sur la table des @Compendium[foundryvtt-reve-de-dragon.tables-diverses.sVWhyr4wPnieuPP8]{Désirs lancinants}. Les désirs lancinants durent jusqu’à ce qu’ils soient satisfaits ou refoulés. Tant que satisfaction n’est pas obtenue, aucun point d’expérience ne peut plus être gagné par l’exercice en cas de particulière et d’ajustement final négatif. Les points d’expérience dus au stress ne sont pas affectés.

\n

 

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} {"_id":"NF4E7jTty1QGjaNj","name":"Pélerinage","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Avant de pouvoir à nouveau faire usage du haut-rêve, y compris déclencher volontairement un sort mis en réserve, le haut-rêvant doit se rendre dans une certaine case des TMR déterminée aléatoirement. Un Passeur peut l’y téléporter, mais un Messager ne peut s’y rendre à sa place. Dès que la case est atteinte, le pèlerinage est accompli.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp"} -{"name":"Idée fixe : Refuser de monter dans les TMR","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"refuser_tmr.png","effects":[],"_id":"NpTDqICR7ZuToQrg"} -{"name":"Désir lancinant : Masochisme. Perdre 3 points d’endurance minimum en 1 round","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"masochisme.png","effects":[],"_id":"NzJJNK0YMAbobu0p"} -{"_id":"OSV2b7bVWv2SCfUY","name":"Urgence draconique","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Le haut-rêvant est pris du besoin irrésistible de déclencher immédiatement son plus proche sort en réserve. À équidistance, prendre dans le sens des aiguilles d’une montre en commençant par le haut. En cas de rencontre dans les TMR, se dérober équivaut à refouler la queue de Dragon. Si aucun sort n’est en réserve, ou si il y a impossibilité de pratiquer la magie à cause d’une autre queue ou d’un souffle, tirer à la place une idée fixe.

","refoulement":2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp"} -{"name":"Désir lancinant : Casser 3d6 oeufs en les jetant à terre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"casser_oeufs.png","effects":[],"_id":"OjG8XRbeYtq2jcgB"} -{"name":"Désir lancinant : Traire une vache","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"traire_vache.png","effects":[],"_id":"QHUOwjMR6AvepGPm"} -{"_id":"Qgj5eSMpQ0IDHwZX","name":"Coup de barre","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Prise immédiate de 3d6 points de fatigue.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp"} -{"name":"Désir lancinant : Pisser dans un violon (luth, mandoline, etc.)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"pisser_violon.png","effects":[],"_id":"S8PVNgxb7TcFXq9g"} -{"name":"Désir lancinant : Manger du poisson","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"manger_poisson.png","effects":[],"_id":"SY0SsWtZdxSodMcl"} -{"_id":"TmEeikWOQt6NZGVY","name":"Masque de Narcos","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Pendant 1d7 jours à compter du lendemain, la caractéristique APPARENCE baisse de 1d6 points, de même que la Beauté.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp"} -{"name":"Idée fixe : Ne pas franchir de porte. (On peut franchir une fenêtre)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"pas-franchir.png","effects":[],"_id":"UUTbsktTcxsIe5L5"} -{"name":"Idée fixe : Refuser de se délester du moindre objet, ni donner ni prêter","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"refuser_delester.png","effects":[],"_id":"VChJbtGFtWoiFNky"} -{"name":"Idée fixe : Ne s’exprimer que par des cris d’animaux (meuh ! coin-coin ! etc.)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"exprimer_cris.png","effects":[],"_id":"YCHBbRLiMzTH7IBj"} -{"name":"Idée fixe : Vider sur sa tête toute fiole ou flacon aperçu","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"verser_flacon.png","effects":[],"_id":"afGp9CewfyJKecEE"} -{"name":"Désir lancinant : Faire des bulles de savon","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"bulles_savon.png","effects":[],"_id":"df5oN8Ub3dWTVxNj"} -{"name":"Désir lancinant : Entendre braire un âne","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"entendre_ane.png","effects":[],"_id":"diCCimukdNM6bPub"} -{"name":"Désir lancinant : Se rouler dans la boue","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"se_rouler_boue.png","effects":[],"_id":"el4lofhhSucMv5xv"} -{"name":"Idée fixe : Ne dire que «non» ou négation analogue","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"dire_non.png","effects":[],"_id":"gMmqdJ9I7Mt8Tg3f"} -{"name":"Désir lancinant : Manger des champignons","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"manger_champignons.png","effects":[],"_id":"gadh6aI5iCM82qpP"} -{"name":"Idée fixe : Refuser de se déplacer autrement que porté","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"refuser_deplacer.png","effects":[],"_id":"hghw6Cldrad1CIiJ"} -{"_id":"iHuLw0I1Gc5mIucG","name":"Réinsertion aléatoire","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Comme après une sortie de la carte, le gardien des rêves réintroduit secrètement le demi-rêve du haut-rêvant dans les TMR.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp"} -{"_id":"iJw6j7kuP1eAHIck","name":"Amnésie sélective","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Pendant un jour, perte totale d’une compétence, à l’exclusion du Draconic. Déterminer aléatoirement la compétence visée qui, pratiquement, retourne au niveau de base. Si elle est déjà au niveau de base, en choisir une autre.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp"} -{"name":"Idée fixe : Garder une main sur la tête","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"garder_main.png","effects":[],"_id":"iPYPgxL2uUnphStc"} -{"name":"Idée fixe : Appeler les hommes «madame» et les femmes «messire»","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"appeler_hommes_femmes.png","effects":[],"_id":"j2xIrFWYqhDM4TcN"} -{"name":"Désir lancinant : Se soûler (minimum pas frais)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"se_souler.png","effects":[],"_id":"jShpKV8mVcqWmYvp"} -{"_id":"kHWwwxA0alcpDYpf","name":"Insomnie","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Impossibilité totale de dormir, et donc de rêver, pendant un jour.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp"} -{"_id":"lBkO8FvFqXoKNhvk","name":"Conquête","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Avant de pouvoir à nouveau faire usage du haut-rêve, y compris déclencher volontairement un sort mis en réserve, le haut-rêvant doit se rendre dans une certaine case des TMR déterminée aléatoirement et la maîtriser, difficulté -7. Ce peut être n’importe quelle case, sauf une case humide. En cas d’échec, la concentration est rompue ; il n’y a pas de souffle de Dragon en cas d’échec total.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp"} -{"name":"Désir lancinant : Construire une cabane","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"construire_cabane.png","effects":[],"_id":"mN0yghXkFfj2YctJ"} -{"name":"Désir lancinant : Embrasser un cochon sur le groin","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"embrasser_cochon.png","effects":[],"_id":"sjXBBr85OBk4Yg4t"} -{"_id":"vft88ioHpGxMzdML","name":"Dépouillement","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Faire don de toute la monnaie actuellement possédée à la première personne inconnue rencontrée. En attendant, se garder d’aucune dépense.

","refoulement":2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp"} -{"name":"Idée fixe : Faire le mort","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"faire_mort.png","effects":[],"_id":"xa4t9Lbt6uLEjap6"} +{"_id":"NpTDqICR7ZuToQrg","name":"Idée fixe : Refuser de monter dans les TMR","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"refuser_tmr.png","effects":[]} +{"_id":"NzJJNK0YMAbobu0p","name":"Désir lancinant : Masochisme. Perdre 3 points d’endurance minimum en 1 round","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"masochisme.png","effects":[]} +{"_id":"OSV2b7bVWv2SCfUY","name":"Urgence draconique","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Le haut-rêvant est pris du besoin irrésistible de déclencher immédiatement son plus proche sort en réserve. À équidistance, prendre dans le sens des aiguilles d’une montre en commençant par le haut. En cas de rencontre dans les TMR, se dérober équivaut à refouler la queue de Dragon. Si aucun sort n’est en réserve, ou si il y a impossibilité de pratiquer la magie à cause d’une autre queue ou d’un souffle, tirer à la place une idée fixe.

","refoulement":2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} +{"_id":"OjG8XRbeYtq2jcgB","name":"Désir lancinant : Casser 3d6 oeufs en les jetant à terre","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} +{"_id":"QHUOwjMR6AvepGPm","name":"Désir lancinant : Traire une vache","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"traire_vache.png","effects":[]} +{"_id":"Qgj5eSMpQ0IDHwZX","name":"Coup de barre","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Prise immédiate de 3d6 points de fatigue.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} +{"name":"Pèlerinage","permission":{"default":0,"Q2G6GTdrotKzYGUC":3},"type":"queue","data":{"description":"

Avant de pouvoir à nouveau faire usage du haut-rêve, y compris déclencher volontairement un sort mis en réserve, le haut-rêvant doit se rendre dans une certaine case des TMR déterminée aléatoirement. Un Passeur peut l’y téléporter, mais un Messager ne peut s’y rendre à sa place. Dès que la case est atteinte, le pèlerinage est accompli.

","refoulement":1,"duree":"","restant":0},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[],"_id":"RVslW735GbPbXCpP"} +{"_id":"S8PVNgxb7TcFXq9g","name":"Désir lancinant : Pisser dans un violon (luth, mandoline, etc.)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"pisser_violon.png","effects":[]} +{"_id":"SY0SsWtZdxSodMcl","name":"Désir lancinant : Manger du poisson","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"manger_poisson.png","effects":[]} +{"_id":"TmEeikWOQt6NZGVY","name":"Masque de Narcos","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Pendant 1d7 jours à compter du lendemain, la caractéristique APPARENCE baisse de 1d6 points, de même que la Beauté.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} +{"_id":"UUTbsktTcxsIe5L5","name":"Idée fixe : Ne pas franchir de porte. (On peut franchir une fenêtre)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"pas-franchir.png","effects":[]} +{"_id":"VChJbtGFtWoiFNky","name":"Idée fixe : Refuser de se délester du moindre objet, ni donner ni prêter","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"refuser_delester.png","effects":[]} +{"_id":"YCHBbRLiMzTH7IBj","name":"Idée fixe : Ne s’exprimer que par des cris d’animaux (meuh ! coin-coin ! etc.)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"exprimer_cris.png","effects":[]} +{"_id":"afGp9CewfyJKecEE","name":"Idée fixe : Vider sur sa tête toute fiole ou flacon aperçu","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"verser_flacon.png","effects":[]} +{"_id":"df5oN8Ub3dWTVxNj","name":"Désir lancinant : Faire des bulles de savon","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"bulles_savon.png","effects":[]} +{"_id":"diCCimukdNM6bPub","name":"Désir lancinant : Entendre braire un âne","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"entendre_ane.png","effects":[]} +{"_id":"el4lofhhSucMv5xv","name":"Désir lancinant : Se rouler dans la boue","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"se_rouler_boue.png","effects":[]} +{"_id":"gMmqdJ9I7Mt8Tg3f","name":"Idée fixe : Ne dire que «non» ou négation analogue","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"dire_non.png","effects":[]} +{"_id":"gadh6aI5iCM82qpP","name":"Désir lancinant : Manger des champignons","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"manger_champignons.png","effects":[]} +{"_id":"hghw6Cldrad1CIiJ","name":"Idée fixe : Refuser de se déplacer autrement que porté","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"refuser_deplacer.png","effects":[]} +{"_id":"iHuLw0I1Gc5mIucG","name":"Réinsertion aléatoire","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Comme après une sortie de la carte, le gardien des rêves réintroduit secrètement le demi-rêve du haut-rêvant dans les TMR.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} +{"_id":"iJw6j7kuP1eAHIck","name":"Amnésie sélective","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Pendant un jour, perte totale d’une compétence, à l’exclusion du Draconic. Déterminer aléatoirement la compétence visée qui, pratiquement, retourne au niveau de base. Si elle est déjà au niveau de base, en choisir une autre.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} +{"_id":"iPYPgxL2uUnphStc","name":"Idée fixe : Garder une main sur la tête","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"garder_main.png","effects":[]} +{"_id":"j2xIrFWYqhDM4TcN","name":"Idée fixe : Appeler les hommes «madame» et les femmes «messire»","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"appeler_hommes_femmes.png","effects":[]} +{"_id":"jShpKV8mVcqWmYvp","name":"Désir lancinant : Se soûler (minimum pas frais)","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"se_souler.png","effects":[]} +{"_id":"kHWwwxA0alcpDYpf","name":"Insomnie","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Impossibilité totale de dormir, et donc de rêver, pendant un jour.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} +{"_id":"lBkO8FvFqXoKNhvk","name":"Conquête","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Avant de pouvoir à nouveau faire usage du haut-rêve, y compris déclencher volontairement un sort mis en réserve, le haut-rêvant doit se rendre dans une certaine case des TMR déterminée aléatoirement et la maîtriser, difficulté -7. Ce peut être n’importe quelle case, sauf une case humide. En cas d’échec, la concentration est rompue ; il n’y a pas de souffle de Dragon en cas d’échec total.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} +{"_id":"mN0yghXkFfj2YctJ","name":"Désir lancinant : Construire une cabane","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} +{"_id":"sjXBBr85OBk4Yg4t","name":"Désir lancinant : Embrasser un cochon sur le groin","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Tant que satisfaction n'est pas obtenue, aucun point d'expérience ne peut plus être gagné par l'exercice en cas de particulière et d'ajustement final négatif.
Les points d'expérience dus au stress ne sont pas affectés.

","refoulement":1},"flags":{},"img":"embrasser_cochon.png","effects":[]} +{"_id":"vft88ioHpGxMzdML","name":"Dépouillement","permission":{"default":0,"jOzRscDxoXZWpGS6":3},"type":"queue","data":{"description":"

Faire don de toute la monnaie actuellement possédée à la première personne inconnue rencontrée. En attendant, se garder d’aucune dépense.

","refoulement":2},"flags":{},"img":"systems/foundryvtt-reve-de-dragon/icons/queue_dragon.webp","effects":[]} +{"_id":"xa4t9Lbt6uLEjap6","name":"Idée fixe : Faire le mort","permission":{"default":0,"rYShh2P1DNavdoBD":3},"type":"queue","data":{"description":"

Prend effet immédiatement et dure jusqu'à la fin de l'heure du Château Dormant du lendemain.
Si passé ce délai, l'occasion de la manifester ne s'est pas présentée, la queue prend fin.

\n

Si elle entre en contradiction avec une autre queue, retirer.

","refoulement":1},"flags":{},"img":"faire_mort.png","effects":[]}