From 99ed077da8f5b859ba732795b9526c22bdd00caf Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 12 Feb 2021 12:50:17 +0100 Subject: [PATCH 1/5] =?UTF-8?q?Gestion=20des=20pr=C3=A9sents=20des=20cit?= =?UTF-8?q?=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit + fix bug sur conquête cité (pour supprimer la casetmr) + svg couleur plus lisibles --- icons/svg/gift.svg | 118 ---------- icons/tmr/gift.svg | 130 +++++++++++ icons/tmr/scroll.svg | 58 +++++ icons/tmr/treasure-chest.svg | 62 ++++++ icons/{svg => tmr}/wave.svg | 0 module/rdd-resolution-table.js | 10 +- module/rdd-tmr-dialog.js | 66 ++++-- module/rdd-utility.js | 368 +++++++++++++++---------------- module/tmr-rencontres.js | 22 +- module/tmr-utility.js | 2 +- module/tmr/debordement.js | 4 +- module/tmr/demi-reve.js | 2 +- module/tmr/fermeture-cites.js | 2 +- module/tmr/pixi-tmr.js | 4 +- module/tmr/pont-impraticable.js | 2 +- module/tmr/present-cites.js | 23 +- module/tmr/reserve-extensible.js | 4 +- module/tmr/sort-reserve.js | 6 +- 18 files changed, 527 insertions(+), 356 deletions(-) delete mode 100644 icons/svg/gift.svg create mode 100644 icons/tmr/gift.svg create mode 100644 icons/tmr/scroll.svg create mode 100644 icons/tmr/treasure-chest.svg rename icons/{svg => tmr}/wave.svg (100%) 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/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/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..af838ce3 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -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 = 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,39 @@ 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) { + const rencontre = TMRRencontres.getRencontre(typeRencontre); + let rencontreData = { + actor: this.actor, + alias: this.actor.name, + reveDepart: this.actor.getReveActuel(), + competence: this.actor.getBestDraconic(), + rencontre: rencontre, + tmr: tmr + }; + await TMRRencontres.evaluerForceRencontre(rencontre); + await EffetsDraconiques.presentCites.ouvrirLePresent(this.actor, presentCite); + this.removeToken(tmr, presentCite); + await this._tentativeMaitrise(rencontreData, presentCite); + 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 +449,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 +482,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); } } @@ -541,7 +573,7 @@ export class RdDTMRDialog extends Dialog { difficulte: -7, action: 'Conquérir', onConqueteReussie: r => EffetsDraconiques.conquete.onConquete(r.actor, tmr.coord, (casetmr) => this.removeToken(tmr, casetmr)), - onConqueteEchec: r => {}, + onConqueteEchec: r => { }, canClose: false }); } @@ -605,7 +637,7 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ async declencheSortEnReserve(coord) { - + let sortReserveList = TMRUtility.getSortReserveList(this.sortsReserves, coord); if (sortReserveList.length > 0) { if (EffetsDraconiques.isConquete(this.actor)) { 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..9cc13785 100644 --- a/module/tmr-utility.js +++ b/module/tmr-utility.js @@ -339,7 +339,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/debordement.js b/module/tmr/debordement.js index 432f4b7f..0ed9cec7 100644 --- a/module/tmr/debordement.js +++ b/module/tmr/debordement.js @@ -14,12 +14,12 @@ export class Debordement extends Draconique { 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 + color: tmrColors.casehumide, taille: tmrConstants.twoThird, decallage: tmrConstants.bottom }); } diff --git a/module/tmr/demi-reve.js b/module/tmr/demi-reve.js index e84c7d88..06174dca 100644 --- a/module/tmr/demi-reve.js +++ b/module/tmr/demi-reve.js @@ -13,7 +13,7 @@ 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) { diff --git a/module/tmr/fermeture-cites.js b/module/tmr/fermeture-cites.js index 29c0ef92..84516a85 100644 --- a/module/tmr/fermeture-cites.js +++ b/module/tmr/fermeture-cites.js @@ -33,7 +33,7 @@ export class FermetureCites extends Draconique { async onConquete(actor, coord) { const citeFermee = actor.data.items.find(it => this.isCase(it, coord)); - await this.actor.deleteOwnedItem(citeFermee._id); + await actor.deleteOwnedItem(citeFermee._id); } } diff --git a/module/tmr/pixi-tmr.js b/module/tmr/pixi-tmr.js index 40cdbe67..acc4abea 100644 --- a/module/tmr/pixi-tmr.js +++ b/module/tmr/pixi-tmr.js @@ -76,7 +76,9 @@ 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.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..04487df1 100644 --- a/module/tmr/pont-impraticable.js +++ b/module/tmr/pont-impraticable.js @@ -15,7 +15,7 @@ export class PontImpraticable extends Draconique { 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) { return pixiTMR.sprite(this.code(), diff --git a/module/tmr/present-cites.js b/module/tmr/present-cites.js index 84d13ba7..dfba8842 100644 --- a/module/tmr/present-cites.js +++ b/module/tmr/present-cites.js @@ -15,12 +15,12 @@ export class PresentCites extends Draconique { 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) { return pixiTMR.sprite(this.code(), { - color: tmrColors.tetes, alpha: 0.7, taille: tmrConstants.third, decallage: tmrConstants.topRight + color: 0xFEFEFE, alpha: 0.8, taille: tmrConstants.third, decallage: tmrConstants.topRight }); } @@ -39,19 +39,22 @@ export class PresentCites extends Draconique { } } } - 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/reserve-extensible.js b/module/tmr/reserve-extensible.js index 47df6181..3aac024d 100644 --- a/module/tmr/reserve-extensible.js +++ b/module/tmr/reserve-extensible.js @@ -13,10 +13,10 @@ export class ReserveExtensible extends Draconique { 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}); + return pixiTMR.sprite(this.code(), { alpha: 0.9, decallage: tmrConstants.left}); } async _creerCaseTmr(actor) { diff --git a/module/tmr/sort-reserve.js b/module/tmr/sort-reserve.js index 4b1ee48b..b974e852 100644 --- a/module/tmr/sort-reserve.js +++ b/module/tmr/sort-reserve.js @@ -13,10 +13,10 @@ 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 }); + return pixiTMR.sprite(this.code(), { alpha: 0.5, decallage: tmrConstants.right }); } } From d700fc7b6c198fbd3fbf610dc16c3ff9656715fe Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 12 Feb 2021 13:05:09 +0100 Subject: [PATCH 2/5] =?UTF-8?q?Gestion=20des=20pr=C3=A9sents=20des=20cit?= =?UTF-8?q?=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix present des cités passeur/messager * suppression des tokens de conquête --- module/rdd-tmr-dialog.js | 24 ++++++++++++++---------- module/tmr/conquete.js | 5 +++-- module/tmr/fermeture-cites.js | 5 +++-- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index af838ce3..2b09c6b6 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -321,7 +321,7 @@ export class RdDTMRDialog extends Dialog { RollDataAjustements.calcul(rencontreData, this.actor); - rencontreData.rolled = presentCite + rencontreData.rolled = rencontreData.presentCite ? this._rollPresentCite(rencontreData) : await RdDResolutionTable.roll(rencontreData.reve, RollDataAjustements.sum(rencontreData.ajustements)); @@ -419,19 +419,23 @@ export class RdDTMRDialog extends Dialog { } async _utiliserPresentCite(presentCite, typeRencontre, tmr, postRencontre) { - const rencontre = TMRRencontres.getRencontre(typeRencontre); + 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: rencontre, - tmr: tmr + rencontre: this.currentRencontre, + tmr: tmr, + presentCite: presentCite }; - await TMRRencontres.evaluerForceRencontre(rencontre); - await EffetsDraconiques.presentCites.ouvrirLePresent(this.actor, presentCite); - this.removeToken(tmr, presentCite); - await this._tentativeMaitrise(rencontreData, presentCite); + await this._tentativeMaitrise(rencontreData); + this.maximize(); postRencontre(); } @@ -554,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 }); @@ -572,7 +576,7 @@ 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)), + onConqueteReussie: r => EffetsDraconiques.conquete.onConquete(r.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)), onConqueteEchec: r => { }, canClose: false }); diff --git a/module/tmr/conquete.js b/module/tmr/conquete.js index fc3579b2..d4b3b6bf 100644 --- a/module/tmr/conquete.js +++ b/module/tmr/conquete.js @@ -31,11 +31,12 @@ 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/fermeture-cites.js b/module/tmr/fermeture-cites.js index 84516a85..0a8c94b5 100644 --- a/module/tmr/fermeture-cites.js +++ b/module/tmr/fermeture-cites.js @@ -31,9 +31,10 @@ export class FermetureCites extends Draconique { } } - async onConquete(actor, coord) { - const citeFermee = actor.data.items.find(it => this.isCase(it, coord)); + 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); } } From b469461cf693600670889625afd2cf33ba950d02 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 12 Feb 2021 15:01:10 +0100 Subject: [PATCH 3/5] =?UTF-8?q?Ajout=20de=20zIndex=20pour=20afficher=20le?= =?UTF-8?q?=20demi-r=C3=AAve=20devant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/tmr-utility.js | 10 +++++++++- module/tmr/conquete.js | 7 +++++-- module/tmr/debordement.js | 7 +++++-- module/tmr/demi-reve.js | 3 ++- module/tmr/desorientation.js | 8 ++++++-- module/tmr/fermeture-cites.js | 8 ++++++-- module/tmr/pixi-tmr.js | 4 +++- module/tmr/pont-impraticable.js | 8 ++++++-- module/tmr/present-cites.js | 8 ++++++-- module/tmr/quete-eaux.js | 10 +++++++--- module/tmr/rencontre.js | 9 +++++++-- module/tmr/reserve-extensible.js | 8 ++++++-- module/tmr/sort-reserve.js | 8 ++++++-- module/tmr/terre-attache.js | 10 +++++++--- module/tmr/trou-noir.js | 8 ++++++-- 15 files changed, 87 insertions(+), 29 deletions(-) diff --git a/module/tmr-utility.js b/module/tmr-utility.js index 9cc13785..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, +} /* -------------------------------------------- */ diff --git a/module/tmr/conquete.js b/module/tmr/conquete.js index d4b3b6bf..812c8095 100644 --- a/module/tmr/conquete.js +++ b/module/tmr/conquete.js @@ -1,5 +1,5 @@ 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 { @@ -20,7 +20,10 @@ export class Conquete extends Draconique { _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 } }); } diff --git a/module/tmr/debordement.js b/module/tmr/debordement.js index 0ed9cec7..c07e6f86 100644 --- a/module/tmr/debordement.js +++ b/module/tmr/debordement.js @@ -1,4 +1,4 @@ -import { tmrColors, tmrConstants, TMRUtility } from "../tmr-utility.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class Debordement extends Draconique { @@ -19,7 +19,10 @@ export class Debordement extends Draconique { _createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { - color: tmrColors.casehumide, taille: tmrConstants.twoThird, decallage: tmrConstants.bottom + color: tmrColors.casehumide, + zIndex: tmrTokenZIndex.casehumide, + taille: tmrConstants.twoThird, + decallage: tmrConstants.bottom, }); } diff --git a/module/tmr/demi-reve.js b/module/tmr/demi-reve.js index 06174dca..3d02c60a 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 { @@ -19,6 +19,7 @@ export class DemiReve extends Draconique { _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..7cd57ff9 100644 --- a/module/tmr/desorientation.js +++ b/module/tmr/desorientation.js @@ -1,6 +1,6 @@ import { Misc } from "../misc.js"; import { RollDataAjustements } from "../rolldata-ajustements.js"; -import { tmrColors, tmrConstants, TMRType, TMRUtility } from "../tmr-utility.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex, TMRType, TMRUtility } from "../tmr-utility.js"; import { Debordement } from "./debordement.js"; import { Draconique } from "./draconique.js"; @@ -36,7 +36,11 @@ export class Desorientation extends Draconique { _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/fermeture-cites.js b/module/tmr/fermeture-cites.js index 0a8c94b5..36055bdd 100644 --- a/module/tmr/fermeture-cites.js +++ b/module/tmr/fermeture-cites.js @@ -1,4 +1,4 @@ -import { tmrColors, tmrConstants, TMRUtility } from "../tmr-utility.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class FermetureCites extends Draconique { @@ -19,7 +19,11 @@ export class FermetureCites extends Draconique { _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 } }); } diff --git a/module/tmr/pixi-tmr.js b/module/tmr/pixi-tmr.js index acc4abea..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 = []; } @@ -79,6 +80,7 @@ export class PixiTMR { 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 04487df1..862b6d49 100644 --- a/module/tmr/pont-impraticable.js +++ b/module/tmr/pont-impraticable.js @@ -1,4 +1,4 @@ -import { tmrColors, tmrConstants, TMRUtility } from "../tmr-utility.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class PontImpraticable extends Draconique { @@ -20,7 +20,11 @@ export class PontImpraticable extends Draconique { _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 }); } diff --git a/module/tmr/present-cites.js b/module/tmr/present-cites.js index dfba8842..045eb225 100644 --- a/module/tmr/present-cites.js +++ b/module/tmr/present-cites.js @@ -1,5 +1,5 @@ import { ChatUtility } from "../chat-utility.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 PresentCites extends Draconique { @@ -20,7 +20,11 @@ export class PresentCites extends Draconique { _createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { - color: 0xFEFEFE, alpha: 0.8, taille: tmrConstants.third, decallage: tmrConstants.topRight + zIndex: tmrTokenZIndex.tetes, + color: 0xFEFEFE, + alpha: 0.8, + taille: tmrConstants.third, + decallage: tmrConstants.topRight }); } diff --git a/module/tmr/quete-eaux.js b/module/tmr/quete-eaux.js index c0a67c79..9bd1a607 100644 --- a/module/tmr/quete-eaux.js +++ b/module/tmr/quete-eaux.js @@ -1,4 +1,4 @@ -import { tmrColors, tmrConstants, TMRUtility } from "../tmr-utility.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class QueteEaux extends Draconique { @@ -16,10 +16,14 @@ export class QueteEaux extends Draconique { img() { return 'icons/svg/bridge.svg' } _createSprite(pixiTMR) { - return pixiTMR.sprite(this.code(), { color: tmrColors.tetes, decallage: tmrConstants.topRight }); + return pixiTMR.sprite(this.code(), { + zIndex: tmrTokenZIndex.casehumide + 1, + color: tmrColors.tetes, + decallage: tmrConstants.topRight + }); } async _creerCaseTmr(actor) { - await this.createCaseTmr(actor, "Quête des eaux à déterminer", {coord:'A0'}); + await this.createCaseTmr(actor, "Quête des eaux à déterminer", { coord: 'A0' }); } } diff --git a/module/tmr/rencontre.js b/module/tmr/rencontre.js index 3c6c4ab8..651752a7 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 { @@ -17,6 +17,11 @@ export class Rencontre extends Draconique { 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 } }); + 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 3aac024d..9202c911 100644 --- a/module/tmr/reserve-extensible.js +++ b/module/tmr/reserve-extensible.js @@ -1,4 +1,4 @@ -import { tmrColors, tmrConstants, TMRUtility } from "../tmr-utility.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class ReserveExtensible extends Draconique { @@ -16,7 +16,11 @@ export class ReserveExtensible extends Draconique { img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/treasure-chest.svg' } _createSprite(pixiTMR) { - return pixiTMR.sprite(this.code(), { alpha: 0.9, decallage: tmrConstants.left}); + return pixiTMR.sprite(this.code(), { + zIndex: tmrTokenZIndex.tetes, + alpha: 0.9, + decallage: tmrConstants.left + }); } async _creerCaseTmr(actor) { diff --git a/module/tmr/sort-reserve.js b/module/tmr/sort-reserve.js index b974e852..b15991b5 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 { @@ -17,6 +17,10 @@ export class SortReserve extends Draconique { img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/scroll.svg' } _createSprite(pixiTMR) { - return pixiTMR.sprite(this.code(), { alpha: 0.5, decallage: tmrConstants.right }); + 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..c19f93a2 100644 --- a/module/tmr/terre-attache.js +++ b/module/tmr/terre-attache.js @@ -1,4 +1,4 @@ -import { tmrColors, tmrConstants, TMRUtility } from "../tmr-utility.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class TerreAttache extends Draconique { @@ -16,10 +16,14 @@ export class TerreAttache extends Draconique { img() { return 'icons/svg/anchor.svg' } _createSprite(pixiTMR) { - return pixiTMR.sprite(this.code(), { color: tmrColors.tetes, decallage: tmrConstants.topLeft }); + 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'}); + 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..d311593d 100644 --- a/module/tmr/trou-noir.js +++ b/module/tmr/trou-noir.js @@ -1,4 +1,4 @@ -import { tmrColors, tmrConstants, TMRUtility } from "../tmr-utility.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class TrouNoir extends Draconique { @@ -18,7 +18,11 @@ export class TrouNoir extends Draconique { _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 }, }); } From 4f35b28aa19869cb2c55d1633a66b80308eaa647 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 12 Feb 2021 18:31:49 +0100 Subject: [PATCH 4/5] pelerinage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit + suppression des cases quand le souffle/queue sont supprimés --- icons/tmr/pelerin.svg | 197 +++++++++++++++++++++++++++++++ module/actor.js | 16 +-- module/rdd-tmr-dialog.js | 22 ++-- module/tmr/carte-tmr.js | 2 +- module/tmr/conquete.js | 6 +- module/tmr/debordement.js | 29 +++-- module/tmr/demi-reve.js | 2 +- module/tmr/desorientation.js | 7 +- module/tmr/draconique.js | 10 +- module/tmr/effets-draconiques.js | 15 ++- module/tmr/fermeture-cites.js | 5 +- module/tmr/pelerinage.js | 43 +++++++ module/tmr/pont-impraticable.js | 23 ++-- module/tmr/present-cites.js | 13 +- module/tmr/quete-eaux.js | 15 ++- module/tmr/rencontre.js | 2 +- module/tmr/reserve-extensible.js | 17 ++- module/tmr/sort-reserve.js | 2 +- module/tmr/terre-attache.js | 15 +-- module/tmr/trou-noir.js | 17 +-- packs/ombres-de-thanatos.db | 49 ++++---- packs/queues-de-dragon.db | 107 ++++++++--------- 22 files changed, 431 insertions(+), 183 deletions(-) create mode 100644 icons/tmr/pelerin.svg create mode 100644 module/tmr/pelerinage.js diff --git a/icons/tmr/pelerin.svg b/icons/tmr/pelerin.svg new file mode 100644 index 00000000..64ec280f --- /dev/null +++ b/icons/tmr/pelerin.svg @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + 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-tmr-dialog.js b/module/rdd-tmr-dialog.js index 2b09c6b6..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(); @@ -639,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)) { @@ -831,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/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 812c8095..92d665c4 100644 --- a/module/tmr/conquete.js +++ b/module/tmr/conquete.js @@ -1,3 +1,4 @@ +import { Grammar } from "../grammar.js"; import { Misc } from "../misc.js"; import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; @@ -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,7 +18,7 @@ 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(), { zIndex: tmrTokenZIndex.conquete, @@ -37,7 +38,6 @@ export class Conquete extends Draconique { 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 c07e6f86..21e5a5fd 100644 --- a/module/tmr/debordement.js +++ b/module/tmr/debordement.js @@ -1,3 +1,4 @@ +import { Grammar } from "../grammar.js"; import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; @@ -8,27 +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/tmr/wave.svg' } - _createSprite(pixiTMR) { - return pixiTMR.sprite(this.code(), - { - color: tmrColors.casehumide, - zIndex: tmrTokenZIndex.casehumide, - 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 3d02c60a..1d05baec 100644 --- a/module/tmr/demi-reve.js +++ b/module/tmr/demi-reve.js @@ -16,7 +16,7 @@ export class DemiReve extends Draconique { 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, diff --git a/module/tmr/desorientation.js b/module/tmr/desorientation.js index 7cd57ff9..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, tmrTokenZIndex, TMRType, TMRUtility } from "../tmr-utility.js"; -import { Debordement } from "./debordement.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,7 +32,7 @@ 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(), { zIndex: tmrTokenZIndex.trounoir, 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 36055bdd..5a7185c6 100644 --- a/module/tmr/fermeture-cites.js +++ b/module/tmr/fermeture-cites.js @@ -1,3 +1,4 @@ +import { Grammar } from "../grammar.js"; import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; @@ -8,7 +9,7 @@ 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); } @@ -16,7 +17,7 @@ export class FermetureCites extends Draconique { 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(), { zIndex: tmrTokenZIndex.conquete, diff --git a/module/tmr/pelerinage.js b/module/tmr/pelerinage.js new file mode 100644 index 00000000..bc4ccfd2 --- /dev/null +++ b/module/tmr/pelerinage.js @@ -0,0 +1,43 @@ +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); + } + + + 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._id); + await actor.deleteOwnedItem(p.data.sourceId); + onRemoveToken(tmr, p); + } + } + +} diff --git a/module/tmr/pont-impraticable.js b/module/tmr/pont-impraticable.js index 862b6d49..8470a939 100644 --- a/module/tmr/pont-impraticable.js +++ b/module/tmr/pont-impraticable.js @@ -1,3 +1,4 @@ +import { Grammar } from "../grammar.js"; import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; @@ -8,16 +9,20 @@ 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/tmr/wave.svg' } - _createSprite(pixiTMR) { + createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { zIndex: tmrTokenZIndex.casehumide, @@ -29,16 +34,6 @@ export class PontImpraticable extends Draconique { } 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 045eb225..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, tmrTokenZIndex, 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,15 +10,15 @@ 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/tmr/gift.svg' } - _createSprite(pixiTMR) { + createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { zIndex: tmrTokenZIndex.tetes, @@ -28,7 +29,7 @@ export class PresentCites extends Draconique { }); } - 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({ @@ -39,7 +40,7 @@ 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); } } } diff --git a/module/tmr/quete-eaux.js b/module/tmr/quete-eaux.js index 9bd1a607..df9866cd 100644 --- a/module/tmr/quete-eaux.js +++ b/module/tmr/quete-eaux.js @@ -1,4 +1,5 @@ -import { tmrColors, tmrConstants, tmrTokenZIndex, 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,23 +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) { + createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { zIndex: tmrTokenZIndex.casehumide + 1, color: tmrColors.tetes, decallage: tmrConstants.topRight }); } - - async _creerCaseTmr(actor) { - await this.createCaseTmr(actor, "Quête des eaux à déterminer", { coord: 'A0' }); - } } diff --git a/module/tmr/rencontre.js b/module/tmr/rencontre.js index 651752a7..6bce1a6e 100644 --- a/module/tmr/rencontre.js +++ b/module/tmr/rencontre.js @@ -16,7 +16,7 @@ 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) { + createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { zIndex: tmrTokenZIndex.rencontre, color: tmrColors.rencontre, diff --git a/module/tmr/reserve-extensible.js b/module/tmr/reserve-extensible.js index 9202c911..cc51420e 100644 --- a/module/tmr/reserve-extensible.js +++ b/module/tmr/reserve-extensible.js @@ -1,3 +1,4 @@ +import { Grammar } from "../grammar.js"; import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; @@ -7,15 +8,19 @@ 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 'systems/foundryvtt-reve-de-dragon/icons/tmr/treasure-chest.svg' } - _createSprite(pixiTMR) { + createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { zIndex: tmrTokenZIndex.tetes, alpha: 0.9, @@ -23,10 +28,4 @@ export class ReserveExtensible extends Draconique { }); } - 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); - } - } diff --git a/module/tmr/sort-reserve.js b/module/tmr/sort-reserve.js index b15991b5..b20cb7c1 100644 --- a/module/tmr/sort-reserve.js +++ b/module/tmr/sort-reserve.js @@ -16,7 +16,7 @@ export class SortReserve extends Draconique { tooltip(sort) { return `${sort.name}, r${sort.data.ptreve_reel}` } img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/scroll.svg' } - _createSprite(pixiTMR) { + createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { zIndex: tmrTokenZIndex.sort, alpha: 0.5, diff --git a/module/tmr/terre-attache.js b/module/tmr/terre-attache.js index c19f93a2..2a6fb686 100644 --- a/module/tmr/terre-attache.js +++ b/module/tmr/terre-attache.js @@ -1,4 +1,5 @@ -import { tmrColors, tmrConstants, tmrTokenZIndex, 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,15 +8,18 @@ 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) { + createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { zIndex: tmrTokenZIndex.tetes, color: tmrColors.tetes, @@ -23,7 +27,4 @@ export class TerreAttache extends Draconique { }); } - 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 d311593d..10b86012 100644 --- a/module/tmr/trou-noir.js +++ b/module/tmr/trou-noir.js @@ -1,3 +1,4 @@ +import { Grammar } from "../grammar.js"; import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; @@ -7,15 +8,20 @@ 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(), { zIndex: tmrTokenZIndex.trounoir, @@ -26,9 +32,4 @@ export class TrouNoir extends Draconique { }); } - 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":[]} From 6708e3eb71f11175b7d84ca11e388addf307c4b1 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Fri, 12 Feb 2021 18:31:49 +0100 Subject: [PATCH 5/5] Fix suppression pelerinage/fermeture-cites MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit et suppression du pèlerinage lorsqu'on est arrivé --- icons/tmr/pelerin.svg | 32 ++++++++++++++++---------------- module/tmr/fermeture-cites.js | 6 +++--- module/tmr/pelerinage.js | 5 ++--- 3 files changed, 21 insertions(+), 22 deletions(-) diff --git a/icons/tmr/pelerin.svg b/icons/tmr/pelerin.svg index 64ec280f..9cdd6b6e 100644 --- a/icons/tmr/pelerin.svg +++ b/icons/tmr/pelerin.svg @@ -13,7 +13,7 @@ version="1.1" id="svg878" inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)" - sodipodi:docname="pelerin2.svg"> + sodipodi:docname="pelerin.svg"> + style="fill:#784421;stroke:#ffffff"> + style="display:inline;fill:#784421;stroke:#ffffff;stroke-width:2.16856"> + style="fill:#784421;stroke:#ffffff;stroke-width:2.16856" /> + style="fill:#784421;stroke:#ffffff" /> + style="display:inline;fill:#784421;fill-opacity:1;stroke:#ffffff;stroke-width:2.71947;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"> + style="fill:#784421;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.71947;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#784421;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.71947;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#784421;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.71947;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + style="fill:#784421;stroke:#ffffff" /> + style="fill:#784421;stroke:#ffffff" /> diff --git a/module/tmr/fermeture-cites.js b/module/tmr/fermeture-cites.js index 5a7185c6..6a8602d3 100644 --- a/module/tmr/fermeture-cites.js +++ b/module/tmr/fermeture-cites.js @@ -11,7 +11,7 @@ export class FermetureCites extends Draconique { type() { return 'souffle' } 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` } @@ -28,11 +28,11 @@ export class FermetureCites extends Draconique { }); } - 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); } } diff --git a/module/tmr/pelerinage.js b/module/tmr/pelerinage.js index bc4ccfd2..76cc2fe9 100644 --- a/module/tmr/pelerinage.js +++ b/module/tmr/pelerinage.js @@ -14,7 +14,7 @@ export class Pelerinage extends Draconique { async onActorCreateOwned(actor, queue) { let tmr = TMRUtility.getTMRAleatoire(); - await this.createCaseTmr(actor, 'Pèlerinage: ' + tmr.label, tmr); + await this.createCaseTmr(actor, 'Pèlerinage: ' + tmr.label, tmr, queue._id); } @@ -34,8 +34,7 @@ export class Pelerinage extends Draconique { 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._id); - await actor.deleteOwnedItem(p.data.sourceId); + await actor.deleteOwnedItem(p.data.sourceid); onRemoveToken(tmr, p); } }